Skip to content

Commit

Permalink
[client] Use production everywhere
Browse files Browse the repository at this point in the history
Fixes #1080
  • Loading branch information
aymericdelab committed Nov 20, 2024
1 parent 3933d58 commit 6d0779e
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 63 deletions.
10 changes: 5 additions & 5 deletions client/src/dojo/modelManager/ArmyMovementManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import {
import { getComponentValue, type Entity } from "@dojoengine/recs";
import { uuid } from "@latticexyz/utils";
import { configManager, type SetupResult } from "../setup";
import { ProductionManager } from "./ProductionManager";
import { ResourceManager } from "./ResourceManager";
import { StaminaManager } from "./StaminaManager";
import { getRemainingCapacity } from "./utils/ArmyMovementUtils";

Expand Down Expand Up @@ -75,8 +75,8 @@ export class ArmyMovementManager {
private readonly entity: Entity;
private readonly entityId: ID;
private address: ContractAddress;
private readonly fishManager: ProductionManager;
private readonly wheatManager: ProductionManager;
private readonly fishManager: ResourceManager;
private readonly wheatManager: ResourceManager;
private readonly staminaManager: StaminaManager;

constructor(
Expand All @@ -86,8 +86,8 @@ export class ArmyMovementManager {
this.entity = getEntityIdFromKeys([BigInt(entityId)]);
this.entityId = entityId;
const entityOwnerId = getComponentValue(this.setup.components.EntityOwner, this.entity);
this.wheatManager = new ProductionManager(this.setup, entityOwnerId!.entity_owner_id, ResourcesIds.Wheat);
this.fishManager = new ProductionManager(this.setup, entityOwnerId!.entity_owner_id, ResourcesIds.Fish);
this.wheatManager = new ResourceManager(this.setup, entityOwnerId!.entity_owner_id, ResourcesIds.Wheat);
this.fishManager = new ResourceManager(this.setup, entityOwnerId!.entity_owner_id, ResourcesIds.Fish);
this.staminaManager = new StaminaManager(this.setup, entityId);

this.address = BigInt(useAccountStore.getState().account?.address || 0n);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { BuildingType, CapacityConfigCategory, ResourcesIds, type ID } from "@bi
import { getComponentValue } from "@dojoengine/recs";
import { configManager, type SetupResult } from "../setup";

export class ProductionManager {
export class ResourceManager {
entityId: ID;
resourceId: ResourcesIds;

Expand Down
42 changes: 22 additions & 20 deletions client/src/hooks/helpers/useResources.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,27 @@ import {
type Entity,
} from "@dojoengine/recs";
import { useCallback, useEffect, useMemo, useState } from "react";
import { ProductionManager } from "../../dojo/modelManager/ProductionManager";
import { ResourceManager } from "../../dojo/modelManager/ResourceManager";
import { getEntityIdFromKeys } from "../../ui/utils/utils";
import { useDojo } from "../context/DojoContext";
import useUIStore from "../store/useUIStore";

export function getResourcesUtils() {
const {
setup: {
components: { Resource, ResourceCost, Realm, OwnedResourcesTracker },
components: { ResourceCost, Realm, OwnedResourcesTracker },
},
} = useDojo();

const getResourcesFromBalance = (entityId: ID): Resource[] => {
// todo: switch back to items_count when working
const ownedResources = getComponentValue(OwnedResourcesTracker, getEntityIdFromKeys([BigInt(entityId)]));
if (!ownedResources) return [];
// const resourceIds = getResourceIdsFromPackedNumber(ownedResources.resource_types);
const resourceIds = resources.map((r) => r.id);
return resourceIds
.map((id) => {
const resource = getComponentValue(Resource, getEntityIdFromKeys([BigInt(entityId), BigInt(id)]));
return { resourceId: id, amount: Number(resource?.balance) || 0 };
const resourceManager = new ResourceManager(useDojo().setup, entityId, id);
const balance = resourceManager.balance(useUIStore.getState().nextBlockTimestamp!);
return { resourceId: id, amount: balance };
})
.filter((r) => r.amount > 0);
};
Expand All @@ -58,8 +57,11 @@ export function getResourcesUtils() {
const realmsWithResource = allRealms
.map((id: Entity) => {
const realm = getComponentValue(Realm, id);
const resource = realm
? getComponentValue(Resource, getEntityIdFromKeys([BigInt(realm?.entity_id), BigInt(resourceId)]))
const resourceManager = realm ? new ResourceManager(useDojo().setup, realm.entity_id, resourceId) : undefined;
const resource = resourceManager
? {
balance: resourceManager.balance(useUIStore.getState().nextBlockTimestamp!),
}
: undefined;

if (resource && resource.balance > minAmount) {
Expand Down Expand Up @@ -206,8 +208,8 @@ export function getResourceBalance() {

const getFoodResources = (entityId: ID): Resource[] => {
const currentDefaultTick = useUIStore.getState().currentDefaultTick;
const wheatBalance = new ProductionManager(dojo.setup, entityId, ResourcesIds.Wheat).balance(currentDefaultTick);
const fishBalance = new ProductionManager(dojo.setup, entityId, ResourcesIds.Fish).balance(currentDefaultTick);
const wheatBalance = new ResourceManager(dojo.setup, entityId, ResourcesIds.Wheat).balance(currentDefaultTick);
const fishBalance = new ResourceManager(dojo.setup, entityId, ResourcesIds.Fish).balance(currentDefaultTick);

return [
{ resourceId: ResourcesIds.Wheat, amount: wheatBalance },
Expand All @@ -216,14 +218,14 @@ export function getResourceBalance() {
};

const getResourceProductionInfo = (entityId: ID, resourceId: ResourcesIds) => {
const productionManager = new ProductionManager(dojo.setup, entityId, resourceId);
return productionManager.getProduction();
const resourceManager = new ResourceManager(dojo.setup, entityId, resourceId);
return resourceManager.getProduction();
};

const getBalance = (entityId: ID, resourceId: ResourcesIds) => {
const currentDefaultTick = useUIStore.getState().currentDefaultTick;
const productionManager = new ProductionManager(dojo.setup, entityId, resourceId);
return { balance: productionManager.balance(currentDefaultTick), resourceId };
const resourceManager = new ResourceManager(dojo.setup, entityId, resourceId);
return { balance: resourceManager.balance(currentDefaultTick), resourceId };
};

const getResourcesBalance = (entityId: ID) => {
Expand All @@ -241,8 +243,8 @@ export function getResourceBalance() {
const [resourceBalance, setResourceBalance] = useState<Resource>({ amount: 0, resourceId });

useEffect(() => {
const productionManager = new ProductionManager(dojo.setup, entityId, resourceId);
setResourceBalance({ amount: productionManager.balance(currentDefaultTick), resourceId });
const resourceManager = new ResourceManager(dojo.setup, entityId, resourceId);
setResourceBalance({ amount: resourceManager.balance(currentDefaultTick), resourceId });
}, []);

return resourceBalance;
Expand All @@ -257,18 +259,18 @@ export function getResourceBalance() {
};
}

export const useProductionManager = (entityId: ID, resourceId: ResourcesIds) => {
export const useResourceManager = (entityId: ID, resourceId: ResourcesIds) => {
const dojo = useDojo();
const production = useComponentValue(
dojo.setup.components.Production,
getEntityIdFromKeys([BigInt(entityId), BigInt(resourceId)]),
);

const productionManager = useMemo(() => {
return new ProductionManager(dojo.setup, entityId, resourceId);
const resourceManager = useMemo(() => {
return new ResourceManager(dojo.setup, entityId, resourceId);
}, [dojo.setup, entityId, resourceId, production]);

return productionManager;
return resourceManager;
};

export function useOwnedEntitiesOnPosition() {
Expand Down
50 changes: 25 additions & 25 deletions client/src/ui/components/resources/ResourceChip.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { findResourceById, getIconResourceId, ID, TickIds } from "@bibliothecadao/eternum";

import { configManager } from "@/dojo/setup";
import { useProductionManager } from "@/hooks/helpers/useResources";
import { useResourceManager } from "@/hooks/helpers/useResources";
import useUIStore from "@/hooks/store/useUIStore";
import { useCallback, useEffect, useMemo, useState } from "react";
import { ResourceIcon } from "../../elements/ResourceIcon";
Expand All @@ -20,20 +20,20 @@ export const ResourceChip = ({
maxStorehouseCapacityKg: number;
tick: number;
}) => {
const productionManager = useProductionManager(entityId, resourceId);
const resourceManager = useResourceManager(entityId, resourceId);
const setTooltip = useUIStore((state) => state.setTooltip);

const [showPerHour, setShowPerHour] = useState(true);

const [balance, setBalance] = useState(0);

const getBalance = useCallback(() => {
return productionManager.balance(tick);
}, [productionManager, tick]);
return resourceManager.balance(tick);
}, [resourceManager, tick]);

const getProduction = useCallback(() => {
return productionManager.getProduction();
}, [productionManager]);
return resourceManager.getProduction();
}, [resourceManager]);

const production = useMemo(() => {
setBalance(getBalance());
Expand All @@ -45,32 +45,32 @@ export const ResourceChip = ({
}, [maxStorehouseCapacityKg, resourceId]);

const timeUntilValueReached = useMemo(() => {
return productionManager.timeUntilValueReached(useUIStore.getState().currentDefaultTick, 0);
}, [productionManager, production?.production_rate]);
return resourceManager.timeUntilValueReached(useUIStore.getState().currentDefaultTick, 0);
}, [resourceManager, production?.production_rate]);

const netRate = useMemo(() => {
let netRate = productionManager.netRate();
let netRate = resourceManager.netRate();
if (netRate[1] < 0) {
// net rate is negative
if (Math.abs(netRate[1]) > productionManager.balance(useUIStore.getState().currentDefaultTick)) {
if (Math.abs(netRate[1]) > resourceManager.balance(useUIStore.getState().currentDefaultTick)) {
return 0;
}
}
return netRate[1];
}, [productionManager, production]);
}, [resourceManager, production]);

useEffect(() => {
const tickTime = configManager.getTick(TickIds.Default) * 1000;

let realTick = useUIStore.getState().currentDefaultTick;

const resource = productionManager.getResource();
const [sign, rate] = productionManager.netRate();
const resource = resourceManager.getResource();
const [sign, rate] = resourceManager.netRate();

const productionDuration = productionManager.productionDuration(realTick);
const depletionDuration = productionManager.depletionDuration(realTick);
const productionDuration = resourceManager.productionDuration(realTick);
const depletionDuration = resourceManager.depletionDuration(realTick);

const newBalance = productionManager.balanceFromComponents(
const newBalance = resourceManager.balanceFromComponents(
resourceId,
rate,
sign,
Expand All @@ -84,11 +84,11 @@ export const ResourceChip = ({
if (Math.abs(netRate) > 0) {
const interval = setInterval(() => {
realTick += 1;
const localResource = productionManager.getResource();
const localProductionDuration = productionManager.productionDuration(realTick);
const localDepletionDuration = productionManager.depletionDuration(realTick);
const localResource = resourceManager.getResource();
const localProductionDuration = resourceManager.productionDuration(realTick);
const localDepletionDuration = resourceManager.depletionDuration(realTick);

const newBalance = productionManager.balanceFromComponents(
const newBalance = resourceManager.balanceFromComponents(
resourceId,
rate,
netRate > 0,
Expand All @@ -101,12 +101,12 @@ export const ResourceChip = ({
}, tickTime);
return () => clearInterval(interval);
}
}, [setBalance, productionManager, netRate, resourceId, production]);
}, [setBalance, resourceManager, netRate, resourceId, production]);

const isConsumingInputsWithoutOutput = useMemo(() => {
if (!production?.production_rate) return false;
return productionManager.isConsumingInputsWithoutOutput(useUIStore.getState().currentDefaultTick);
}, [productionManager, production, entityId]);
return resourceManager.isConsumingInputsWithoutOutput(useUIStore.getState().currentDefaultTick);
}, [resourceManager, production, entityId]);

const icon = useMemo(
() => (
Expand All @@ -126,8 +126,8 @@ export const ResourceChip = ({
}, [maxAmountStorable, balance, netRate]);

const timeUntilFinishTick = useMemo(() => {
return productionManager.timeUntilFinishTick(useUIStore.getState().currentDefaultTick);
}, [productionManager, production]);
return resourceManager.timeUntilFinishTick(useUIStore.getState().currentDefaultTick);
}, [resourceManager, production]);

const isProducingOrConsuming = useMemo(() => {
if (netRate > 0 && timeUntilFinishTick <= 0) return false;
Expand Down
24 changes: 12 additions & 12 deletions client/src/ui/components/trading/MarketOrderPanel.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { ProductionManager } from "@/dojo/modelManager/ProductionManager";
import { ResourceManager } from "@/dojo/modelManager/ResourceManager";
import { configManager } from "@/dojo/setup";
import { useDojo } from "@/hooks/context/DojoContext";
import { useRealm } from "@/hooks/helpers/useRealm";
import { useProductionManager } from "@/hooks/helpers/useResources";
import { useResourceManager } from "@/hooks/helpers/useResources";
import { useIsResourcesLocked } from "@/hooks/helpers/useStructures";
import { useTravel } from "@/hooks/helpers/useTravel";
import useUIStore from "@/hooks/store/useUIStore";
Expand Down Expand Up @@ -48,15 +48,15 @@ export const MarketResource = ({
ammPrice: number;
}) => {
const currentDefaultTick = useUIStore((state) => state.currentDefaultTick);
const productionManager = useProductionManager(entityId, resourceId);
const resourceManager = useResourceManager(entityId, resourceId);

const production = useMemo(() => {
return productionManager.getProduction();
return resourceManager.getProduction();
}, []);

const balance = useMemo(() => {
return productionManager.balance(currentDefaultTick);
}, [productionManager, production, currentDefaultTick]);
return resourceManager.balance(currentDefaultTick);
}, [resourceManager, production, currentDefaultTick]);

const resource = useMemo(() => {
return findResourceById(resourceId);
Expand Down Expand Up @@ -242,10 +242,10 @@ const OrderRow = ({

const { play: playLordsSound } = useUiSounds(soundSelector.addLords);

const lordsManager = new ProductionManager(dojo.setup, entityId, ResourcesIds.Lords);
const lordsManager = new ResourceManager(dojo.setup, entityId, ResourcesIds.Lords);
const lordsBalance = useMemo(() => Number(lordsManager.getResource()?.balance || 0n), [updateBalance]);

const resourceManager = new ProductionManager(dojo.setup, entityId, offer.makerGets[0].resourceId);
const resourceManager = new ResourceManager(dojo.setup, entityId, offer.makerGets[0].resourceId);
const resourceBalance = useMemo(() => Number(resourceManager.getResource()?.balance || 0n), [updateBalance]);

const { getRealmAddressName } = useRealm();
Expand Down Expand Up @@ -331,7 +331,7 @@ const OrderRow = ({
return calculateDonkeysNeeded(orderWeight);
}, [orderWeight]);

const donkeyProductionManager = useProductionManager(entityId, ResourcesIds.Donkey);
const donkeyProductionManager = useResourceManager(entityId, ResourcesIds.Donkey);

const donkeyProduction = useMemo(() => {
return donkeyProductionManager.getProduction();
Expand Down Expand Up @@ -550,7 +550,7 @@ const OrderCreation = ({
}, [orderWeight]);

const currentDefaultTick = useUIStore((state) => state.currentDefaultTick);
const donkeyProductionManager = useProductionManager(entityId, ResourcesIds.Donkey);
const donkeyProductionManager = useResourceManager(entityId, ResourcesIds.Donkey);

const donkeyProduction = useMemo(() => {
return donkeyProductionManager.getProduction();
Expand All @@ -560,7 +560,7 @@ const OrderCreation = ({
return donkeyProductionManager.balance(currentDefaultTick);
}, [donkeyProductionManager, donkeyProduction, currentDefaultTick]);

const resourceProductionManager = useProductionManager(entityId, resourceId);
const resourceProductionManager = useResourceManager(entityId, resourceId);

const resourceProduction = useMemo(() => {
return resourceProductionManager.getProduction();
Expand All @@ -570,7 +570,7 @@ const OrderCreation = ({
return resourceProductionManager.balance(currentDefaultTick);
}, [resourceProduction, currentDefaultTick, resourceId]);

const lordsProductionManager = useProductionManager(entityId, ResourcesIds.Lords);
const lordsProductionManager = useResourceManager(entityId, ResourcesIds.Lords);

const lordsProduction = useMemo(() => {
return lordsProductionManager.getProduction();
Expand Down

0 comments on commit 6d0779e

Please sign in to comment.