diff --git a/project/src/helpers/HideoutHelper.ts b/project/src/helpers/HideoutHelper.ts index f98257e3..ee7e672b 100644 --- a/project/src/helpers/HideoutHelper.ts +++ b/project/src/helpers/HideoutHelper.ts @@ -123,7 +123,7 @@ export class HideoutHelper { sacrificedItems: Item[], ): void { // TODO: hard coded 12 hour craft + no fuel use, where can we get this data - const cultistProduction = this.initProduction(recipeId, 43200, false); + const cultistProduction = this.initProduction(recipeId, 50, false, true); cultistProduction.GivenItemsInStart = sacrificedItems; // Add circle production to profile @@ -134,7 +134,12 @@ export class HideoutHelper { * This convenience function initializes new Production Object * with all the constants. */ - public initProduction(recipeId: string, productionTime: number, needFuelForAllProductionTime: boolean): Production { + public initProduction( + recipeId: string, + productionTime: number, + needFuelForAllProductionTime: boolean, + isCultistCircle = false, + ): Production { return { Progress: 0, inProgress: true, @@ -147,6 +152,7 @@ export class HideoutHelper { NeedFuelForAllProductionTime: needFuelForAllProductionTime, // Used when sending to client needFuelForAllProductionTime: needFuelForAllProductionTime, // used when stored in production.json SkipTime: 0, + sptIsCultistCircle: isCultistCircle, }; } @@ -303,7 +309,14 @@ export class HideoutHelper { continue; } - // Other recipes not covered by above + // cultist circle has no recipe, needs special handling + if (craft.sptIsCultistCircle) { + this.updateCultistCircleCraftProgress(pmcData, prodId); + + return; + } + + // Ensure recipe exists before using it in updateProductionProgress() const recipe = recipes.recipes.find((r) => r._id === prodId); if (!recipe) { this.logger.error(this.localisationService.getText("hideout-missing_recipe_for_area", prodId)); @@ -365,6 +378,20 @@ export class HideoutHelper { } } + protected updateCultistCircleCraftProgress(pmcData: IPmcData, prodId: string) { + // Production is complete, no need to do any calculations + if (this.doesProgressMatchProductionTime(pmcData, prodId)) { + return; + } + + // Get seconds since last hideout update and now + const timeElapsedSeconds = this.timeUtil.getTimestamp() - pmcData.Hideout.sptUpdateLastRunTimestamp; + + // Increment progress by time passed + const production = pmcData.Hideout.Production[prodId]; + production.Progress += timeElapsedSeconds; + } + /** * Check if a productions progress value matches its corresponding recipes production time value * @param pmcData Player profile diff --git a/project/src/models/eft/common/tables/IBotBase.ts b/project/src/models/eft/common/tables/IBotBase.ts index 5ee18fe7..c7c0a6ca 100644 --- a/project/src/models/eft/common/tables/IBotBase.ts +++ b/project/src/models/eft/common/tables/IBotBase.ts @@ -384,6 +384,8 @@ export interface Productive { sptIsContinuous?: boolean; /** Stores a list of tools used in this craft and whether they're FiR, to give back once the craft is done */ sptRequiredTools?: Item[]; + // Craft is cultist circle sacrifice + sptIsCultistCircle?: boolean; } export interface Production extends Productive {