diff --git a/Core/Callbacks/BotCallbacks.cs b/Core/Callbacks/BotCallbacks.cs index c99a47fd..537db7fa 100644 --- a/Core/Callbacks/BotCallbacks.cs +++ b/Core/Callbacks/BotCallbacks.cs @@ -1,4 +1,4 @@ -using Core.Annotations; +using Core.Annotations; using Core.Context; using Core.Controllers; using Core.Models.Eft.Bot; @@ -60,7 +60,7 @@ public class BotCallbacks if (difficulty == "core") return _httpResponseUtil.NoBody(_botController.GetBotCoreDifficulty()); - var raidConfig = (GetRaidConfigurationRequestData)_applicationContext.GetLatestValue(ContextVariableType.RAID_CONFIGURATION)?.Value; + var raidConfig = _applicationContext.GetLatestValue(ContextVariableType.RAID_CONFIGURATION)?.GetValue(); return _httpResponseUtil.NoBody(_botController.GetBotDifficulty(type, difficulty, raidConfig)); } diff --git a/Core/Callbacks/DataCallbacks.cs b/Core/Callbacks/DataCallbacks.cs index 65964443..e92f413a 100644 --- a/Core/Callbacks/DataCallbacks.cs +++ b/Core/Callbacks/DataCallbacks.cs @@ -49,7 +49,8 @@ public class DataCallbacks /// public string GetSettings(string url, EmptyRequestData info, string sessionID) { - return _httpResponseUtil.GetBody(_databaseService.GetSettings()); + var returns = _httpResponseUtil.GetBody(_databaseService.GetSettings()); + return returns; } /// @@ -62,9 +63,10 @@ public class DataCallbacks public string GetGlobals(string url, EmptyRequestData info, string sessionID) { var globals = _databaseService.GetGlobals(); - globals.Time = _timeUtil.GetTimeStamp(); + globals.Time = _timeUtil.GetTimeStamp() / 1000; + var returns = _httpResponseUtil.GetBody(globals); - return _httpResponseUtil.GetBody(globals); + return returns; } /// diff --git a/Core/Callbacks/HideoutCallbacks.cs b/Core/Callbacks/HideoutCallbacks.cs index 81b69248..80dd2449 100644 --- a/Core/Callbacks/HideoutCallbacks.cs +++ b/Core/Callbacks/HideoutCallbacks.cs @@ -2,6 +2,7 @@ using Core.Annotations; using Core.Controllers; using Core.DI; using Core.Models.Eft.Common; +using Core.Models.Eft.Common.Tables; using Core.Models.Eft.Hideout; using Core.Models.Eft.ItemEvent; using Core.Models.Enums; @@ -13,9 +14,9 @@ namespace Core.Callbacks; [Injectable(InjectableTypeOverride = typeof(OnUpdate), TypePriority = OnUpdateOrder.HideoutCallbacks)] public class HideoutCallbacks : OnUpdate { - protected HideoutController _hideoutController; - protected ConfigServer _configServer; - protected HideoutConfig _hideoutConfig; + private readonly HideoutController _hideoutController; + private readonly ConfigServer _configServer; + private readonly HideoutConfig _hideoutConfig; public HideoutCallbacks ( @@ -31,227 +32,144 @@ public class HideoutCallbacks : OnUpdate /// /// Handle HideoutUpgrade event /// - /// - /// - /// - /// - public ItemEventRouterResponse Upgrade(PmcData pmcData, HideoutUpgradeRequestData info, string sessionID, ItemEventRouterResponse output) + public ItemEventRouterResponse Upgrade(PmcData pmcData, HideoutUpgradeRequestData request, string sessionID, ItemEventRouterResponse output) { - // _hideoutController.StartUpgrade(pmcData, info, sessionID, output); - // TODO: HideoutController is not implemented rn + _hideoutController.StartUpgrade(pmcData, request, sessionID, output); + return output; } /// /// Handle HideoutUpgradeComplete event /// - /// - /// - /// - /// - public ItemEventRouterResponse UpgradeComplete(PmcData pmcData, HideoutUpgradeCompleteRequestData info, string sessionID, ItemEventRouterResponse output) + public ItemEventRouterResponse UpgradeComplete(PmcData pmcData, HideoutUpgradeCompleteRequestData request, string sessionID, ItemEventRouterResponse output) { - // _hideoutController.UpgradeComplete(pmcData, info, sessionID, output); - // TODO: HideoutController is not implemented rn + _hideoutController.UpgradeComplete(pmcData, request, sessionID, output); + return output; } /// /// Handle HideoutPutItemsInAreaSlots /// - /// - /// - /// - /// - public ItemEventRouterResponse PutItemsInAreaSlots(PmcData pmcData, HideoutPutItemInRequestData info, string sessionID) + public ItemEventRouterResponse PutItemsInAreaSlots(PmcData pmcData, HideoutPutItemInRequestData request, string sessionID) { - // return _hideoutController.PutItemsInAreaSlots(pmcData, info, sessionID); - // TODO: HideoutController is not implemented rn - throw new NotImplementedException(); + return _hideoutController.PutItemsInAreaSlots(pmcData, request, sessionID); } /// /// Handle HideoutTakeItemsFromAreaSlots event /// - /// - /// - /// - /// - public ItemEventRouterResponse TakeItemsFromAreaSlots(PmcData pmcData, HideoutTakeItemOutRequestData info, string sessionID) + public ItemEventRouterResponse TakeItemsFromAreaSlots(PmcData pmcData, HideoutTakeItemOutRequestData request, string sessionID) { - // return _hideoutController.TakeItemsFromAreaSlots(pmcData, info, sessionID); - // TODO: HideoutController is not implemented rn - throw new NotImplementedException(); + return _hideoutController.TakeItemsFromAreaSlots(pmcData, request, sessionID); } /// /// Handle HideoutToggleArea event /// - /// - /// - /// - /// - public ItemEventRouterResponse ToggleArea(PmcData pmcData, HideoutToggleAreaRequestData info, string sessionID) + public ItemEventRouterResponse ToggleArea(PmcData pmcData, HideoutToggleAreaRequestData request, string sessionID) { - // return _hideoutController.ToggleArea(pmcData, info, sessionID); - // TODO: HideoutController is not implemented rn - throw new NotImplementedException(); + return _hideoutController.ToggleArea(pmcData, request, sessionID); } /// /// Handle HideoutSingleProductionStart event /// - /// - /// - /// - /// - public ItemEventRouterResponse SingleProductionStart(PmcData pmcData, HideoutSingleProductionStartRequestData info, string sessionID) + public ItemEventRouterResponse SingleProductionStart(PmcData pmcData, HideoutSingleProductionStartRequestData request, string sessionID) { - // return _hideoutController.SingleProductionStart(pmcData, info, sessionID); - // TODO: HideoutController is not implemented rn - throw new NotImplementedException(); + return _hideoutController.SingleProductionStart(pmcData, request, sessionID); } /// /// Handle HideoutScavCaseProductionStart event /// - /// - /// - /// - /// - public ItemEventRouterResponse ScavCaseProductionStart(PmcData pmcData, HideoutScavCaseStartRequestData info, string sessionID) + public ItemEventRouterResponse ScavCaseProductionStart(PmcData pmcData, HideoutScavCaseStartRequestData request, string sessionID) { - // return _hideoutController.ScavCaseProductionStart(pmcData, info, sessionID); - // TODO: HideoutController is not implemented rn - throw new NotImplementedException(); + return _hideoutController.ScavCaseProductionStart(pmcData, request, sessionID); } /// /// Handle HideoutContinuousProductionStart /// - /// - /// - /// - /// - public ItemEventRouterResponse ContinuousProductionStart(PmcData pmcData, HideoutContinuousProductionStartRequestData info, string sessionID) + public ItemEventRouterResponse ContinuousProductionStart(PmcData pmcData, HideoutContinuousProductionStartRequestData request, string sessionID) { - // return _hideoutController.ContinuousProductionStart(pmcData, info, sessionID); - // TODO: HideoutController is not implemented rn - throw new NotImplementedException(); + return _hideoutController.ContinuousProductionStart(pmcData, request, sessionID); } /// /// Handle HideoutTakeProduction event /// - /// - /// - /// - /// - public ItemEventRouterResponse TakeProduction(PmcData pmcData, HideoutTakeProductionRequestData info, string sessionID) + public ItemEventRouterResponse TakeProduction(PmcData pmcData, HideoutTakeProductionRequestData request, string sessionID) { - // return _hideoutController.TakeProduction(pmcData, info, sessionID); - // TODO: HideoutController is not implemented rn - throw new NotImplementedException(); + return _hideoutController.TakeProduction(pmcData, request, sessionID); } /// /// Handle HideoutQuickTimeEvent /// - /// - /// - /// - /// - /// - public ItemEventRouterResponse HandleQTEEvent(PmcData pmcData, HandleQTEEventRequestData info, string sessionID, ItemEventRouterResponse output) + public ItemEventRouterResponse HandleQTEEvent(PmcData pmcData, HandleQTEEventRequestData request, string sessionID, ItemEventRouterResponse output) { - // _hideoutController.HandleQTEEventOutcome(sessionID, pmcData, info, output); - // TODO: HideoutController is not implemented rn + _hideoutController.HandleQTEEventOutcome(sessionID, pmcData, request, output); + return output; } /// /// Handle client/game/profile/items/moving - RecordShootingRangePoints /// - /// - /// - /// - /// - /// - public ItemEventRouterResponse RecordShootingRangePoints(PmcData pmcData, RecordShootingRangePoints info, string sessionID, ItemEventRouterResponse output) + public ItemEventRouterResponse RecordShootingRangePoints(PmcData pmcData, RecordShootingRangePoints request, string sessionID, ItemEventRouterResponse output) { - // _hideoutController.RecordShootingRangePoints(sessionID, pmcData, info); - // TODO: HideoutController is not implemented rn + _hideoutController.RecordShootingRangePoints(sessionID, pmcData, request); + return output; } /// /// Handle client/game/profile/items/moving - RecordShootingRangePoints /// - /// - /// - /// - /// - public ItemEventRouterResponse ImproveArea(PmcData pmcData, HideoutImproveAreaRequestData info, string sessionID) + public ItemEventRouterResponse ImproveArea(PmcData pmcData, HideoutImproveAreaRequestData request, string sessionID) { - // return _hideoutController.ImproveArea(sessionID, pmcData, info); - // TODO: HideoutController is not implemented rn - throw new NotImplementedException(); + return _hideoutController.ImproveArea(sessionID, pmcData, request); } /// /// Handle client/game/profile/items/moving - HideoutCancelProductionCommand /// - /// - /// - /// - /// - public ItemEventRouterResponse CancelProduction(PmcData pmcData, HideoutImproveAreaRequestData info, string sessionID) + public ItemEventRouterResponse CancelProduction(PmcData pmcData, HideoutImproveAreaRequestData request, string sessionID) { - // return _hideoutController.CancelProduction(sessionID, pmcData, info); - // TODO: HideoutController is not implemented rn - throw new NotImplementedException(); + return _hideoutController.CancelProduction(sessionID, pmcData, request); } /// /// Handle client/game/profile/items/moving - HideoutCircleOfCultistProductionStart /// - /// - /// - /// - /// - public ItemEventRouterResponse CicleOfCultistProductionStart(PmcData pmcData, HideoutCircleOfCultistProductionStartRequestData info, string sessionID) + public ItemEventRouterResponse CicleOfCultistProductionStart(PmcData pmcData, HideoutCircleOfCultistProductionStartRequestData request, string sessionID) { - // return _hideoutController.CicleOfCultistProductionStart(sessionID, pmcData, info); - // TODO: HideoutController is not implemented rn - throw new NotImplementedException(); + return _hideoutController.CicleOfCultistProductionStart(sessionID, pmcData, request); } /// /// Handle client/game/profile/items/moving - HideoutDeleteProductionCommand /// - /// - /// - /// - /// - public ItemEventRouterResponse HideoutDeleteProductionCommand(PmcData pmcData, HideoutDeleteProductionRequestData info, string sessionID) + public ItemEventRouterResponse HideoutDeleteProductionCommand(PmcData pmcData, HideoutDeleteProductionRequestData request, string sessionID) { - // return _hideoutController.HideoutDeleteProductionCommand(sessionID, pmcData, info); - // TODO: HideoutController is not implemented rn - throw new NotImplementedException(); + return _hideoutController.HideoutDeleteProductionCommand(sessionID, pmcData, request); } /// /// Handle client/game/profile/items/moving - HideoutCustomizationApply /// - /// - /// - /// - /// - public ItemEventRouterResponse HideoutCustomizationApplyCommand(PmcData pmcData, HideoutCustomizationApplyRequestData info, string sessionID) + public ItemEventRouterResponse HideoutCustomizationApplyCommand(PmcData pmcData, HideoutCustomizationApplyRequestData request, string sessionID) { - // return _hideoutController.HideoutCustomizationApply(sessionID, pmcData, info); - // TODO: HideoutController is not implemented rn - throw new NotImplementedException(); + return _hideoutController.HideoutCustomizationApply(sessionID, pmcData, request); + } + + /** + * Handle client/game/profile/items/moving - hideoutCustomizationSetMannequinPose + */ + public ItemEventRouterResponse HideoutCustomizationSetMannequinPose(PmcData pmcData, HideoutCustomizationSetMannequinPoseRequest request, string sessionId) { + return _hideoutController.HideoutCustomizationSetMannequinPose(sessionId, pmcData, request); } public async Task OnUpdate(long timeSinceLastRun) diff --git a/Core/Callbacks/HttpCallbacks.cs b/Core/Callbacks/HttpCallbacks.cs index 6922ce0d..d132035f 100644 --- a/Core/Callbacks/HttpCallbacks.cs +++ b/Core/Callbacks/HttpCallbacks.cs @@ -1,4 +1,4 @@ -using Core.Annotations; +using Core.Annotations; using Core.Context; using Core.DI; using Core.Servers; @@ -18,7 +18,7 @@ public class HttpCallbacks : OnLoad public async Task OnLoad() { - _httpServer.Load((WebApplicationBuilder) _applicationContext.GetLatestValue(ContextVariableType.APP_BUILDER).Value); + _httpServer.Load( _applicationContext.GetLatestValue(ContextVariableType.APP_BUILDER).GetValue()); _applicationContext.ClearValues(ContextVariableType.APP_BUILDER); } diff --git a/Core/Context/ContextVariable.cs b/Core/Context/ContextVariable.cs index 4f5e199b..7c3b9280 100644 --- a/Core/Context/ContextVariable.cs +++ b/Core/Context/ContextVariable.cs @@ -1,8 +1,29 @@ -namespace Core.Context; +namespace Core.Context; -public class ContextVariable(object value, ContextVariableType contextVariableType) +public class ContextVariable { - public object Value { get; } = value; - public DateTime Timestamp { get; } = DateTime.Now; - public ContextVariableType Type { get; } = contextVariableType; -} \ No newline at end of file + private readonly object _value; + private readonly ContextVariableType _internalType; + private readonly DateTime _timestamp; + + public ContextVariable(object value, ContextVariableType contextVariableInternalType) + { + _value = value; + _timestamp = DateTime.Now; + _internalType = contextVariableInternalType; + } + + public T GetValue() { + return (T)_value; + } + + public DateTime GetTimestamp() + { + return _timestamp; + } + + public ContextVariableType GetContextType() + { + return _internalType; + } +} diff --git a/Core/Controllers/BotController.cs b/Core/Controllers/BotController.cs index e2931a3d..c72c0227 100644 --- a/Core/Controllers/BotController.cs +++ b/Core/Controllers/BotController.cs @@ -1,4 +1,4 @@ -using Core.Annotations; +using Core.Annotations; using Core.Context; using Core.Generators; using Core.Helpers; @@ -14,7 +14,6 @@ using Core.Servers; using Core.Services; using Core.Utils; using Core.Utils.Cloners; -using Condition = Core.Models.Spt.Config.Condition; using ILogger = Core.Models.Utils.ILogger; namespace Core.Controllers; @@ -33,6 +32,7 @@ public class BotController protected MatchBotDeatilsCacheService _matchBotDeatilsCacheService; protected LocalisationService _localisationService; protected SeasonalEventService _seasonalEventService; + private readonly MatchBotDetailsCacheService _matchBotDetailsCacheService; protected ProfileHelper _profileHelper; protected ConfigServer _configServer; protected ApplicationContext _applicationContext; @@ -54,6 +54,7 @@ public class BotController MatchBotDeatilsCacheService matchBotDeatilsCacheService, LocalisationService localisationService, SeasonalEventService seasonalEventService, + MatchBotDetailsCacheService matchBotDetailsCacheService, ProfileHelper profileHelper, ConfigServer configServer, ApplicationContext applicationContext, @@ -71,6 +72,7 @@ public class BotController _matchBotDeatilsCacheService = matchBotDeatilsCacheService; _localisationService = localisationService; _seasonalEventService = seasonalEventService; + _matchBotDetailsCacheService = matchBotDetailsCacheService; _profileHelper = profileHelper; _configServer = configServer; _applicationContext = applicationContext; @@ -129,33 +131,264 @@ public class BotController public List Generate(string sessionId, GenerateBotsRequestData info) { - throw new NotImplementedException(); + var pmcProfile = _profileHelper.GetPmcProfile(sessionId); + + // Use this opportunity to create and cache bots for later retrieval + var multipleBotTypesRequested = info.Conditions.Count > 1; + if (multipleBotTypesRequested) + { + return GenerateMultipleBotsAndCache(info, pmcProfile, sessionId); + } + + return ReturnSingleBotFromCache(sessionId, info); } - public async Task> GenerateMultipleBotsAndCache() + public List GenerateMultipleBotsAndCache(GenerateBotsRequestData request, PmcData pmcProfile, string sessionId) { - throw new NotImplementedException(); + var raidSettings = GetMostRecentRaidSettings(); + + var allPmcsHaveSameNameAsPlayer = _randomUtil.GetChance100( + _pmcConfig.AllPMCsHavePlayerNameWithRandomPrefixChance); + + // Map conditions to promises for bot generation + foreach (var condition in request.Conditions) + { + var botGenerationDetails = GetBotGenerationDetailsForWave( + condition, + pmcProfile, + allPmcsHaveSameNameAsPlayer, + raidSettings, + _botConfig.PresetBatch.GetValueOrDefault(condition.Role, 15), + _botHelper.IsBotPmc(condition.Role)); + + // Generate bots for the current condition + GenerateWithBotDetails(condition, botGenerationDetails, sessionId); + } + + return []; + } + + private void GenerateWithBotDetails(GenerateCondition condition, BotGenerationDetails botGenerationDetails, string sessionId) + { + var isEventBot = condition.Role.ToLower().Contains("event"); + if (isEventBot) + { + // Add eventRole data + reassign role property to be base type + botGenerationDetails.EventRole = condition.Role; + botGenerationDetails.Role = _seasonalEventService.GetBaseRoleForEventBot( + botGenerationDetails.EventRole); + } + + // Create a compound key to store bots in cache against + var cacheKey = _botGenerationCacheService.CreateCacheKey( + botGenerationDetails.EventRole ?? botGenerationDetails.Role, + botGenerationDetails.BotDifficulty); + + // Get number of bots we have in cache + var botCacheCount = _botGenerationCacheService.GetCachedBotCount(cacheKey); + + if (botCacheCount >= botGenerationDetails.BotCountToGenerate) + { + _logger.Debug($"Cache already has sufficient bots: { botCacheCount}"); + return; + } + + // We're below desired count, add bots to cache + var botsToGenerate = botGenerationDetails.BotCountToGenerate - botCacheCount; + var progressWriter = new ProgressWriter(botGenerationDetails.BotCountToGenerate.Value); + + _logger.Debug($"Generating { botsToGenerate} bots for cacheKey: {cacheKey}"); + + for (var i = 0; i < botsToGenerate; i++) + { + try + { + var detailsClone = _cloner.Clone(botGenerationDetails); + GenerateSingleBotAndStoreInCache(detailsClone, sessionId, cacheKey); + progressWriter.Increment(); + } + catch (Exception e) + { + _logger.Error($"Failed to generate bot #{i + 1}: {e.Message}"); + } + } + + _logger.Debug($"Generated { botGenerationDetails.BotCountToGenerate} { botGenerationDetails.Role}" + + $"({botGenerationDetails.EventRole ?? botGenerationDetails.Role ?? ""}) { botGenerationDetails.BotDifficulty}bots"); + } + + private List ReturnSingleBotFromCache(string sessionId, GenerateBotsRequestData request) + { + var pmcProfile = _profileHelper.GetPmcProfile(sessionId); + var requestedBot = request.Conditions[0]; + + var raidSettings = GetMostRecentRaidSettings(); + + // Create generation request for when cache is empty + var condition = new GenerateCondition{ + Role = requestedBot.Role, + Limit= 5, + Difficulty= requestedBot.Difficulty, + }; + var botGenerationDetails = GetBotGenerationDetailsForWave( + condition, + pmcProfile, + false, + raidSettings, + _botConfig.PresetBatch[requestedBot.Role], + _botHelper.IsBotPmc(requestedBot.Role) + ); + + // Event bots need special actions to occur, set data up for them + var isEventBot = requestedBot.Role.ToLower().Contains("event"); + if (isEventBot) + { + // Add eventRole data + reassign role property + botGenerationDetails.EventRole = requestedBot.Role; + botGenerationDetails.Role = _seasonalEventService.GetBaseRoleForEventBot( + botGenerationDetails.EventRole); + } + + // Does non pmc bot have a chance of being converted into a pmc + var convertIntoPmcChanceMinMax = GetPmcConversionMinMaxForLocation( + requestedBot.Role, + raidSettings?.Location); + if (convertIntoPmcChanceMinMax is not null && !botGenerationDetails.IsPmc.Value) + { + // Bot has % chance to become pmc and isnt one pmc already + var convertToPmc = _botHelper.RollChanceToBePmc(convertIntoPmcChanceMinMax); + if (convertToPmc) + { + // Update requirements + botGenerationDetails.IsPmc = true; + botGenerationDetails.Role = _botHelper.GetRandomizedPmcRole(); + botGenerationDetails.Side = _botHelper.GetPmcSideByRole(botGenerationDetails.Role); + botGenerationDetails.BotDifficulty = GetPmcDifficulty(requestedBot.Difficulty); + botGenerationDetails.BotCountToGenerate = _botConfig.PresetBatch[botGenerationDetails.Role]; + } + } + // Only convert to boss when not already converted to PMC & Boss Convert is enabled + var bossConvertEnabled = _botConfig.AssaultToBossConversion.BossConvertEnabled; + var bossConvertMinMax = _botConfig.AssaultToBossConversion.BossConvertMinMax; + var bossesToConvertToWeights = _botConfig.AssaultToBossConversion.BossesToConvertToWeights; + if (bossConvertEnabled && !botGenerationDetails.IsPmc.Value) + { + var bossConvertPercent = bossConvertMinMax[requestedBot.Role.ToLower()]; + if (bossConvertPercent is not null) + { + // Roll a percentage check if we should convert scav to boss + if ( + _randomUtil.GetChance100(_randomUtil.GetDouble(bossConvertPercent.Min.Value, bossConvertPercent.Max.Value)) + ) + { + UpdateBotGenerationDetailsToRandomBoss(botGenerationDetails, bossesToConvertToWeights); + } + } + } + + // Create a compound key to store bots in cache against + var cacheKey = _botGenerationCacheService.CreateCacheKey( + botGenerationDetails.EventRole ?? botGenerationDetails.Role, + botGenerationDetails.BotDifficulty); + + // Check cache for bot using above key + if (!_botGenerationCacheService.CacheHasBotWithKey(cacheKey)) + { + // No bot in cache, generate new and store in cache + GenerateSingleBotAndStoreInCache(botGenerationDetails, sessionId, cacheKey); + + _logger.Debug($"Generated { botGenerationDetails.BotCountToGenerate} " + + $"{ botGenerationDetails.Role} ({botGenerationDetails.EventRole ?? ""}) {botGenerationDetails.BotDifficulty} bots"); + } + + var desiredBot = _botGenerationCacheService.GetBot(cacheKey); + _botGenerationCacheService.StoreUsedBot(desiredBot); + + return [desiredBot]; + } + + private void GenerateSingleBotAndStoreInCache(BotGenerationDetails botGenerationDetails, string sessionId, string cacheKey) + { + var botToCache = _botGenerator.PrepareAndGenerateBot(sessionId, botGenerationDetails); + _botGenerationCacheService.StoreBots(cacheKey, [botToCache]); + + // Store bot details in cache so post-raid PMC messages can use data + _matchBotDetailsCacheService.CacheBot(botToCache); + } + + private void UpdateBotGenerationDetailsToRandomBoss(BotGenerationDetails botGenerationDetails, Dictionary bossesToConvertToWeights) + { + // Seems Actual bosses have the same Brain issues like PMC gaining Boss Brains We can't use all bosses + botGenerationDetails.Role = _weightedRandomHelper.GetWeightedValue(bossesToConvertToWeights); + + // Bosses are only ever 'normal' + botGenerationDetails.BotDifficulty = "normal"; + botGenerationDetails.BotCountToGenerate = _botConfig.PresetBatch[botGenerationDetails.Role]; + } + + private string GetPmcDifficulty(string requestedBotDifficulty) + { + var difficulty = _pmcConfig.Difficulty.ToLower(); + return difficulty switch + { + "asonline" => requestedBotDifficulty, + "random" => _botDifficultyHelper.ChooseRandomDifficulty(), + _ => _pmcConfig.Difficulty + }; + } + + private MinMax GetPmcConversionMinMaxForLocation(string requestedBotRole, string location) + { + var mapSpecificConversionValues = _pmcConfig.ConvertIntoPmcChance.GetValueOrDefault(location.ToLower(), null); + if (mapSpecificConversionValues is null) + { + return _pmcConfig.ConvertIntoPmcChance["default"][requestedBotRole]; + } + + return mapSpecificConversionValues[requestedBotRole.ToLower()]; } public GetRaidConfigurationRequestData GetMostRecentRaidSettings() { - throw new NotImplementedException(); + var raidSettings = _applicationContext + .GetLatestValue(ContextVariableType.RAID_CONFIGURATION) + .GetValue(); + + if (raidSettings is null) + { + _logger.Warning(_localisationService.GetText("bot-unable_to_load_raid_settings_from_appcontext")); + } + + return raidSettings; } public MinMax GetPmcLevelRangeForMap(string location) { - throw new NotImplementedException(); + return _pmcConfig.LocationSpecificPmcLevelOverride.GetValueOrDefault(location.ToLower(), null); } - public BotGenerationDetails GetBotGenerationDetailsForWave(Condition condition, PmcData pmcProfile, bool AllPmcsHaveSameNameAsPlayer, - GetRaidConfigurationRequestData raidSettings, int botCountToGenerate, bool generateAsPmc) + public BotGenerationDetails GetBotGenerationDetailsForWave( + GenerateCondition condition, + PmcData pmcProfile, + bool allPmcsHaveSameNameAsPlayer, + GetRaidConfigurationRequestData raidSettings, + int botCountToGenerate, + bool generateAsPmc) { - throw new NotImplementedException(); - } - - public int GetPlayerLevelFromProfile() - { - throw new NotImplementedException(); + return new BotGenerationDetails{ + IsPmc = generateAsPmc, + Side = generateAsPmc ? _botHelper.GetPmcSideByRole(condition.Role) : "Savage", + Role = condition.Role, + PlayerLevel = pmcProfile.Info.Level.Value, + PlayerName = pmcProfile.Info.Nickname, + BotRelativeLevelDeltaMax = _pmcConfig.BotRelativeLevelDeltaMax, + BotRelativeLevelDeltaMin = _pmcConfig.BotRelativeLevelDeltaMin, + BotCountToGenerate = botCountToGenerate, + BotDifficulty = condition.Difficulty, + LocationSpecificPmcLevelOverride = this.GetPmcLevelRangeForMap(raidSettings?.Location), // Min/max levels for PMCs to generate within + IsPlayerScav = false, + AllPmcsHaveSameNameAsPlayer = allPmcsHaveSameNameAsPlayer, + }; } public int GetBotLimit(string type) @@ -181,11 +414,23 @@ public class BotController public int GetBotCap(string location) { - throw new NotImplementedException(); + var botCap = _botConfig.MaxBotCap[location.ToLower()]; + if (location == "default") + { + _logger.Warning( + _localisationService.GetText("bot-no_bot_cap_found_for_location", location.ToLower())); + } + + return botCap; } - public object GetAiBotBrainTypes() // TODO: Returns `any` in the node server + public object GetAiBotBrainTypes() { - throw new NotImplementedException(); + // TODO: Returns `any` in the node server + return new { + pmc = _pmcConfig.PmcType, + assault = _botConfig.AssaultBrainType, + playerScav = _botConfig.PlayerScavBrainType, + }; } } diff --git a/Core/Controllers/DialogueController.cs b/Core/Controllers/DialogueController.cs index b19095f3..db9da360 100644 --- a/Core/Controllers/DialogueController.cs +++ b/Core/Controllers/DialogueController.cs @@ -5,6 +5,7 @@ using Core.Models.Eft.Dialog; using Core.Models.Eft.HttpResponse; using Core.Models.Eft.Profile; using Core.Models.Enums; +using Core.Models.Spt.Config; using Core.Servers; namespace Core.Controllers; @@ -14,17 +15,23 @@ public class DialogueController { private readonly DialogueHelper _dialogueHelper; private readonly ProfileHelper _profileHelper; + private readonly ConfigServer _configServer; private readonly SaveServer _saveServer; private readonly List _dialogueChatBots; + private readonly CoreConfig _coreConfig; public DialogueController( DialogueHelper dialogueHelper, ProfileHelper profileHelper, + ConfigServer configServer, SaveServer saveServer) { _dialogueHelper = dialogueHelper; _profileHelper = profileHelper; + _configServer = configServer; _saveServer = saveServer; + + _coreConfig = _configServer.GetConfig(ConfigTypes.CORE); } /// @@ -54,7 +61,7 @@ public class DialogueController public GetFriendListDataResponse GetFriendList(string sessionId) { // Add all chatbots to the friends list - var friends = _dialogueChatBots.Select((bot) => bot.GetChatBot()).ToList(); + var friends = GetActiveChatBots(); // Add any friends the user has after the chatbots var profile = _profileHelper.GetFullProfile(sessionId); @@ -82,6 +89,22 @@ public class DialogueController }; } + private List GetActiveChatBots() + { + var activeBots = new List(); + + var chatBotConfig = _coreConfig.Features.ChatbotFeatures; + foreach (var bot in _dialogueChatBots) + { + var botData = bot.GetChatBot(); + if (chatBotConfig.EnabledBots.ContainsKey(botData.Id)) { + activeBots.Add(botData); + } + } + + return activeBots; + } + /// /// Handle client/mail/dialog/list /// Create array holding trader dialogs and mail interactions with player diff --git a/Core/Controllers/HideoutController.cs b/Core/Controllers/HideoutController.cs index a62833ee..b53df52c 100644 --- a/Core/Controllers/HideoutController.cs +++ b/Core/Controllers/HideoutController.cs @@ -1,9 +1,192 @@ using Core.Annotations; +using Core.Generators; +using Core.Helpers; +using Core.Models.Eft.Common; +using Core.Models.Eft.Hideout; +using Core.Models.Eft.ItemEvent; +using Core.Models.Enums; +using Core.Models.Spt.Config; +using Core.Routers; +using Core.Servers; +using Core.Services; +using Core.Utils; +using Core.Utils.Cloners; +using ILogger = Core.Models.Utils.ILogger; namespace Core.Controllers; [Injectable] public class HideoutController { - // TODO + private readonly ILogger _logger; + private readonly HashUtil _hashUtil; + private readonly TimeUtil _timeUtil; + private readonly DatabaseService _databaseService; + private readonly RandomUtil _randomUtil; + private readonly InventoryHelper _inventoryHelper; + private readonly ItemHelper _itemHelper; + private readonly SaveServer _saveServer; + private readonly PlayerService _playerService; + private readonly PresetHelper _presetHelper; + private readonly PaymentHelper _paymentHelper; + private readonly EventOutputHolder _eventOutputHolder; + private readonly HttpResponseUtil _httpResponseUtil; + private readonly ProfileHelper _profileHelper; + private readonly HideoutHelper _hideoutHelper; + private readonly ScavCaseRewardGenerator _scavCaseRewardGenerator; + private readonly LocalisationService _localisationService; + private readonly ProfileActivityService _profileActivityService; + private readonly FenceService _fenceService; + private readonly CircleOfCultistService _circleOfCultistService; + private readonly ICloner _cloner; + private readonly ConfigServer _configServer; + private readonly HideoutConfig _hideoutConfig; + + public HideoutController( + ILogger logger, + HashUtil hashUtil, + TimeUtil timeUtil, + DatabaseService databaseService, + RandomUtil randomUtil, + InventoryHelper inventoryHelper, + ItemHelper itemHelper, + SaveServer saveServer, + PlayerService playerService, + PresetHelper presetHelper, + PaymentHelper paymentHelper, + EventOutputHolder eventOutputHolder, + HttpResponseUtil httpResponseUtil, + ProfileHelper profileHelper, + HideoutHelper hideoutHelper, + ScavCaseRewardGenerator scavCaseRewardGenerator, + LocalisationService localisationService, + ProfileActivityService profileActivityService, + FenceService fenceService, + CircleOfCultistService circleOfCultistService, + ICloner cloner, + ConfigServer configServer) + { + _logger = logger; + _hashUtil = hashUtil; + _timeUtil = timeUtil; + _databaseService = databaseService; + _randomUtil = randomUtil; + _inventoryHelper = inventoryHelper; + _itemHelper = itemHelper; + _saveServer = saveServer; + _playerService = playerService; + _presetHelper = presetHelper; + _paymentHelper = paymentHelper; + _eventOutputHolder = eventOutputHolder; + _httpResponseUtil = httpResponseUtil; + _profileHelper = profileHelper; + _hideoutHelper = hideoutHelper; + _scavCaseRewardGenerator = scavCaseRewardGenerator; + _localisationService = localisationService; + _profileActivityService = profileActivityService; + _fenceService = fenceService; + _circleOfCultistService = circleOfCultistService; + _cloner = cloner; + _configServer = configServer; + + _hideoutConfig = _configServer.GetConfig(ConfigTypes.HIDEOUT); + } + + public void StartUpgrade(PmcData pmcData, HideoutUpgradeRequestData info, string sessionId, ItemEventRouterResponse output) + { + throw new NotImplementedException(); + } + + public void UpgradeComplete(PmcData pmcData, HideoutUpgradeCompleteRequestData request, string sessionId, ItemEventRouterResponse output) + { + throw new NotImplementedException(); + } + + public ItemEventRouterResponse PutItemsInAreaSlots(PmcData pmcData, HideoutPutItemInRequestData request, string sessionId) + { + throw new NotImplementedException(); + } + + public ItemEventRouterResponse TakeItemsFromAreaSlots(PmcData pmcData, HideoutTakeItemOutRequestData request, string sessionId) + { + throw new NotImplementedException(); + } + + public ItemEventRouterResponse ToggleArea(PmcData pmcData, HideoutToggleAreaRequestData request, string sessionId) + { + throw new NotImplementedException(); + } + + public ItemEventRouterResponse SingleProductionStart(PmcData pmcData, HideoutSingleProductionStartRequestData request, string sessionId) + { + throw new NotImplementedException(); + } + + public ItemEventRouterResponse ScavCaseProductionStart(PmcData pmcData, HideoutScavCaseStartRequestData request, string sessionId) + { + throw new NotImplementedException(); + } + + public ItemEventRouterResponse ContinuousProductionStart(PmcData pmcData, HideoutContinuousProductionStartRequestData request, string sessionId) + { + throw new NotImplementedException(); + } + + public ItemEventRouterResponse TakeProduction(PmcData pmcData, HideoutTakeProductionRequestData request, string sessionId) + { + throw new NotImplementedException(); + } + + public void HandleQTEEventOutcome(string sessionId, PmcData pmcData, HandleQTEEventRequestData request, ItemEventRouterResponse output) + { + throw new NotImplementedException(); + } + + public void RecordShootingRangePoints(string sessionId, PmcData pmcData, RecordShootingRangePoints request) + { + throw new NotImplementedException(); + } + + public ItemEventRouterResponse ImproveArea(string sessionId, PmcData pmcData, HideoutImproveAreaRequestData request) + { + throw new NotImplementedException(); + } + + public ItemEventRouterResponse CancelProduction(string sessionId, PmcData pmcData, HideoutImproveAreaRequestData request) + { + throw new NotImplementedException(); + } + + public ItemEventRouterResponse CicleOfCultistProductionStart(string sessionId, PmcData pmcData, HideoutCircleOfCultistProductionStartRequestData request) + { + throw new NotImplementedException(); + } + + public ItemEventRouterResponse HideoutDeleteProductionCommand(string sessionId, PmcData pmcData, HideoutDeleteProductionRequestData request) + { + throw new NotImplementedException(); + } + + public ItemEventRouterResponse HideoutCustomizationApply(string sessionId, PmcData pmcData, HideoutCustomizationApplyRequestData request) + { + throw new NotImplementedException(); + } + + + /// + /// Handle HideoutCustomizationSetMannequinPose event + /// + /// Session id + /// Player profile + /// Client request + /// + public ItemEventRouterResponse HideoutCustomizationSetMannequinPose(string sessionId, PmcData pmcData, HideoutCustomizationSetMannequinPoseRequest request) + { + foreach (var poseKvP in request.Poses) + { + pmcData.Hideout.MannequinPoses[poseKvP.Key] = poseKvP.Value; + } + + return _eventOutputHolder.GetOutput(sessionId); + } } diff --git a/Core/Controllers/TraderController.cs b/Core/Controllers/TraderController.cs index a11a501a..30e8fa59 100644 --- a/Core/Controllers/TraderController.cs +++ b/Core/Controllers/TraderController.cs @@ -175,7 +175,7 @@ public class TraderController _traderHelper.LevelUp(trader.Key, pmcData); } - // traders.Sort((a, b) => SortByTraderId(a, b)); + traders.Sort((a, b) => SortByTraderId(a, b)); return traders; } @@ -185,11 +185,9 @@ public class TraderController /// First trader to compare /// Second trader to compare /// 1,-1 or 0 - private int SortByTraderId( - TraderBase traderA, - TraderBase traderB) + private int SortByTraderId(TraderBase traderA, TraderBase traderB) { - throw new NotImplementedException(); + return string.Compare(traderA.Id, traderB.Id); } /// diff --git a/Core/Generators/BotGenerator.cs b/Core/Generators/BotGenerator.cs index e1a7bd56..78da8cf7 100644 --- a/Core/Generators/BotGenerator.cs +++ b/Core/Generators/BotGenerator.cs @@ -1,4 +1,5 @@ using Core.Annotations; +using Core.Helpers; using Core.Models.Common; using Core.Models.Eft.Common; using Core.Models.Eft.Common.Tables; @@ -6,7 +7,9 @@ using Core.Models.Enums; using Core.Models.Enums.RaidSettings; using Core.Models.Spt.Bots; using Core.Models.Spt.Config; +using Core.Servers; using Core.Services; +using Core.Utils; using Core.Utils.Cloners; using BodyPart = Core.Models.Eft.Common.Tables.BodyPart; using ILogger = Core.Models.Utils.ILogger; @@ -17,20 +20,65 @@ namespace Core.Generators; public class BotGenerator { private readonly ILogger _logger; + private readonly HashUtil _hashUtil; + private readonly RandomUtil _randomUtil; + private readonly TimeUtil _timeUtil; + private readonly ProfileHelper _profileHelper; private readonly DatabaseService _databaseService; + private readonly BotInventoryGenerator _botInventoryGenerator; + private readonly BotLevelGenerator _botLevelGenerator; + private readonly BotEquipmentFilterService _botEquipmentFilterService; + private readonly WeightedRandomHelper _weightedRandomHelper; + private readonly BotHelper _botHelper; + private readonly BotGeneratorHelper _botGeneratorHelper; + private readonly SeasonalEventService _seasonalEventService; + private readonly ItemFilterService _itemFilterService; + private readonly BotNameService _botNameService; + private readonly ConfigServer _configServer; private readonly ICloner _cloner; private BotConfig _botConfig; private PmcConfig _pmcConfig; public BotGenerator( ILogger logger, + HashUtil hashUtil, + RandomUtil randomUtil, + TimeUtil timeUtil, + ProfileHelper profileHelper, DatabaseService databaseService, + BotInventoryGenerator botInventoryGenerator, + BotLevelGenerator botLevelGenerator, + BotEquipmentFilterService botEquipmentFilterService, + WeightedRandomHelper weightedRandomHelper, + BotHelper botHelper, + BotGeneratorHelper botGeneratorHelper, + SeasonalEventService seasonalEventService, + ItemFilterService itemFilterService, + BotNameService botNameService, + ConfigServer configServer, ICloner cloner - ) + ) { _logger = logger; + _hashUtil = hashUtil; + _randomUtil = randomUtil; + _timeUtil = timeUtil; + _profileHelper = profileHelper; _databaseService = databaseService; + _botInventoryGenerator = botInventoryGenerator; + _botLevelGenerator = botLevelGenerator; + _botEquipmentFilterService = botEquipmentFilterService; + _weightedRandomHelper = weightedRandomHelper; + _botHelper = botHelper; + _botGeneratorHelper = botGeneratorHelper; + _seasonalEventService = seasonalEventService; + _itemFilterService = itemFilterService; + _botNameService = botNameService; + _configServer = configServer; _cloner = cloner; + + _botConfig = _configServer.GetConfig(ConfigTypes.BOT); + _pmcConfig = _configServer.GetConfig(ConfigTypes.PMC); } /// @@ -49,7 +97,8 @@ public class BotGenerator bot.Info.Settings.Role = role; bot.Info.Side = "Savage"; - var botGenDetails = new BotGenerationDetails{ + var botGenDetails = new BotGenerationDetails + { IsPmc = false, Side = "Savage", Role = role, @@ -108,7 +157,23 @@ public class BotGenerator /// constructed bot public BotBase PrepareAndGenerateBot(string sessionId, BotGenerationDetails botGenerationDetails) { - throw new NotImplementedException(); + var preparedBotBase = GetPreparedBotBase( + botGenerationDetails.EventRole ?? botGenerationDetails.Role, // Use eventRole if provided, + botGenerationDetails.Side, + botGenerationDetails.BotDifficulty + ); + + // Get raw json data for bot (Cloned) + var botRole = botGenerationDetails.IsPmc ?? false + ? preparedBotBase.Info.Side // Use side to get usec.json or bear.json when bot will be PMC + : botGenerationDetails.Role; + var botJsonTemplateClone = _cloner.Clone(_botHelper.GetBotTemplate(botRole)); + if (botJsonTemplateClone is not null) + { + _logger.Error($"Unable to retrieve: {botRole} bot template, cannot generate bot of this type"); + } + + return GenerateBot(sessionId, preparedBotBase, botJsonTemplateClone, botGenerationDetails); } /// @@ -120,7 +185,12 @@ public class BotGenerator /// Cloned bot base public BotBase GetPreparedBotBase(string botRole, string botSide, string difficulty) { - throw new NotImplementedException(); + var botBaseClone = GetCloneOfBotBase(); + botBaseClone.Info.Settings.Role = botRole; + botBaseClone.Info.Side = botSide; + botBaseClone.Info.Settings.BotDifficulty = difficulty; + + return botBaseClone; } /// @@ -140,35 +210,154 @@ public class BotGenerator /// Bot template from db/bots/x.json /// details on how to generate the bot /// BotBase object - public BotBase GenerateBot(string sessionId, BotBase bot, BotType botJsonTemplate, BotGenerationDetails botGenerationDetails) + public BotBase GenerateBot( + string sessionId, + BotBase bot, + BotType botJsonTemplate, + BotGenerationDetails botGenerationDetails) { _logger.Error("NOT IMPLEMENTED BotGenerator.GenerateBot"); - bot.Inventory.Items = []; + var botRoleLowercase = botGenerationDetails.Role.ToLower(); + var botLevel = _botLevelGenerator.GenerateBotLevel( + botJsonTemplate.BotExperience.Level, + botGenerationDetails, + bot); + + // Only filter bot equipment, never players + if (!botGenerationDetails.IsPlayerScav.GetValueOrDefault(false)) + { + _botEquipmentFilterService.FilterBotEquipment( + sessionId, + botJsonTemplate, + botLevel.Level.Value, + botGenerationDetails); + } + + bot.Info.Nickname = _botNameService.GenerateUniqueBotNickname( + botJsonTemplate, + botGenerationDetails, + botRoleLowercase, + _botConfig.BotRolesThatMustHaveUniqueName); + bot.Info.LowerNickname = bot.Info.Nickname.ToLower(); + + // Only run when generating a 'fake' playerscav, not actual player scav + if (!botGenerationDetails.IsPlayerScav.GetValueOrDefault(false) && ShouldSimulatePlayerScav(botRoleLowercase)) + { + _botNameService.AddRandomPmcNameToBotMainProfileNicknameProperty(bot); + SetRandomisedGameVersionAndCategory(bot.Info); + } + + if (!_seasonalEventService.ChristmasEventEnabled()) + { + // Process all bots EXCEPT gifter, he needs christmas items + if (botGenerationDetails.Role != "gifter") + { + _seasonalEventService.RemoveChristmasItemsFromBotInventory( + botJsonTemplate.BotInventory, + botGenerationDetails.Role); + } + } + + RemoveBlacklistedLootFromBotTemplate(botJsonTemplate.BotInventory); + + // Remove hideout data if bot is not a PMC or pscav - match what live sends + if (!(botGenerationDetails.IsPmc.GetValueOrDefault(false) || botGenerationDetails.IsPlayerScav.GetValueOrDefault(false))) + { + bot.Hideout = null; + } + + bot.Info.Experience = botLevel.Exp; + bot.Info.Level = botLevel.Level; + bot.Info.Settings.Experience = GetExperienceRewardForKillByDifficulty( + botJsonTemplate.BotExperience.Reward, + botGenerationDetails.BotDifficulty, + botGenerationDetails.Role); + bot.Info.Settings.StandingForKill = GetStandingChangeForKillByDifficulty( + botJsonTemplate.BotExperience.StandingForKill, + botGenerationDetails.BotDifficulty, + botGenerationDetails.Role); + bot.Info.Settings.AggressorBonus = GetAgressorBonusByDifficulty( + botJsonTemplate.BotExperience.StandingForKill, + botGenerationDetails.BotDifficulty, + botGenerationDetails.Role); + bot.Info.Settings.UseSimpleAnimator = botJsonTemplate.BotExperience.UseSimpleAnimator ?? false; + bot.Info.Voice = _weightedRandomHelper.GetWeightedValue(botJsonTemplate.BotAppearance.Voice); + bot.Health = GenerateHealth(botJsonTemplate.BotHealth, botGenerationDetails.IsPlayerScav.GetValueOrDefault(false)); + bot.Skills = GenerateSkills(botJsonTemplate.BotSkills); // TODO: fix bad type, bot jsons store skills in dict, output needs to be array + + if (botGenerationDetails.IsPmc.GetValueOrDefault(false)) + { + bot.Info.IsStreamerModeAvailable = true; // Set to true so client patches can pick it up later - client sometimes alters botrole to assaultGroup + SetRandomisedGameVersionAndCategory(bot.Info); + if (bot.Info.GameVersion == GameEditions.UNHEARD) + { + AddAdditionalPocketLootWeightsForUnheardBot(botJsonTemplate); + } + } + + // Add drip + SetBotAppearance(bot, botJsonTemplate.BotAppearance, botGenerationDetails); + + // Filter out blacklisted gear from the base template + FilterBlacklistedGear(botJsonTemplate, botGenerationDetails); + + bot.Inventory = _botInventoryGenerator.GenerateInventory( + sessionId, + botJsonTemplate, + botRoleLowercase, + botGenerationDetails.IsPmc.GetValueOrDefault(false), + botLevel.Level.Value, + bot.Info.GameVersion); + + if (_botConfig.BotRolesWithDogTags.Contains(botRoleLowercase)) + { + AddDogtagToBot(bot); + } + + // Generate new bot ID + AddIdsToBot(bot); + + // Generate new inventory ID + GenerateInventoryId(bot); + + // Set role back to originally requested now its been generated + if (botGenerationDetails.EventRole is not null) + { + bot.Info.Settings.Role = botGenerationDetails.EventRole; + } return bot; } /// - /// Should this bot have a name like "name (Pmc Name)" and be alterd by client patch to be hostile to player + /// Should this bot have a name like "name (Pmc Name)" and be altered by client patch to be hostile to player /// /// Role bot has /// True if name should be simulated pscav public bool ShouldSimulatePlayerScav(string botRole) { - throw new NotImplementedException(); + return botRole == "assault" && _randomUtil.GetChance100(_botConfig.ChanceAssaultScavHasPlayerScavName); } /// /// Get exp for kill by bot difficulty /// - /// Dict of difficulties and experience + /// Dict of difficulties and experience /// the killed bots difficulty /// Role of bot (optional, used for error logging) /// Experience for kill - public int GetExperienceRewardForKillByDifficulty(Dictionary experience, string botDifficulty, string role) + public double GetExperienceRewardForKillByDifficulty(Dictionary experiences, string botDifficulty, string role) { - throw new NotImplementedException(); + var result = experiences[botDifficulty.ToLower()]; + if (result is null) + { + _logger.Debug("Unable to find experience for kill value for: ${ role} ${ botDifficulty}, falling back to `normal`"); + + return _randomUtil.GetDouble(experiences["normal"].Min.Value, experiences["normal"].Max.Value); + } + + return _randomUtil.GetDouble(result.Min.Value, result.Max.Value); } /// @@ -178,9 +367,16 @@ public class BotGenerator /// Difficulty of bot to look up /// Role of bot (optional, used for error logging) /// Standing change value - public int GetStandingChangeForKillByDifficulty(Dictionary standingForKill, string botDifficulty, string role) + public double GetStandingChangeForKillByDifficulty(Dictionary standingsForKill, string botDifficulty, string role) { - throw new NotImplementedException(); + if (!standingsForKill.TryGetValue(botDifficulty.ToLower(), out var result)) + { + _logger.Warning($"Unable to find standing for kill value for: {role} {botDifficulty}, falling back to `normal`"); + + return standingsForKill["normal"]; + } + + return result; } /// @@ -190,9 +386,16 @@ public class BotGenerator /// Difficulty of bot to look up /// Role of bot (optional, used for error logging) /// Standing change value - public int GetAgressorBonusByDifficulty(Dictionary aggressorBonus, string botDifficulty, string role) + public double GetAgressorBonusByDifficulty(Dictionary aggressorBonuses, string botDifficulty, string role) { - throw new NotImplementedException(); + if (!aggressorBonuses.TryGetValue(botDifficulty.ToLower(), out var result)) + { + _logger.Warning($"Unable to find aggressor bonus for kill value for: {role} {botDifficulty}, falling back to `normal`"); + + return aggressorBonuses["normal"]; + } + + return result; } /// @@ -202,7 +405,26 @@ public class BotGenerator /// Generation details of bot public void FilterBlacklistedGear(BotType botJsonTemplate, BotGenerationDetails botGenerationDetails) { - throw new NotImplementedException(); + var blacklist = _botEquipmentFilterService.GetBotEquipmentBlacklist( + _botGeneratorHelper.GetBotEquipmentRole(botGenerationDetails.Role), + botGenerationDetails.PlayerLevel.GetValueOrDefault(1)); + + if (blacklist?.Gear is null) + { + // Nothing to filter by + return; + } + + foreach (var equipmentKvP in blacklist.Gear) + { + var equipmentDict = botJsonTemplate.BotInventory.Equipment[equipmentKvP.Key]; + + foreach (var blacklistedTpl in equipmentKvP.Value) + { + // Set weighting to 0, will never be picked + equipmentDict[blacklistedTpl] = 0; + } + } } /// @@ -211,7 +433,10 @@ public class BotGenerator /// Bot data to adjust public void AddAdditionalPocketLootWeightsForUnheardBot(BotType botJsonTemplate) { - throw new NotImplementedException(); + // Adjust pocket loot weights to allow for 5 or 6 items + var pocketWeights = botJsonTemplate.BotGeneration.Items["pocketLoot"].Weights; + pocketWeights["5"] = 1; + pocketWeights["6"] = 1; } /// @@ -220,7 +445,37 @@ public class BotGenerator /// Bot to filter public void RemoveBlacklistedLootFromBotTemplate(BotTypeInventory botInventory) { - throw new NotImplementedException(); + List lootContainersToFilter = ["Backpack", "Pockets", "TacticalVest"]; + var props = botInventory.Items.GetType().GetProperties(); + + // Remove blacklisted loot from loot containers + foreach (var lootContainerKey in lootContainersToFilter) + { + var prop = props.FirstOrDefault(x => x.Name.ToLower() == lootContainerKey.ToLower()); + var propValue = (Dictionary)prop.GetValue(botInventory.Items); + + // No container, skip + if (propValue?.Count == 0) + { + continue; + } + + List tplsToRemove = []; + foreach (var item in propValue) + { + if (_itemFilterService.IsLootableItemBlacklisted(item.Key)) + { + tplsToRemove.Add(item.Key); + } + } + + foreach (var blacklistedTplToRemove in tplsToRemove) + { + propValue.Remove(blacklistedTplToRemove); + } + + prop.SetValue(botInventory.Items, propValue); + } } /// @@ -231,7 +486,19 @@ public class BotGenerator /// Generation details public void SetBotAppearance(BotBase bot, Appearance appearance, BotGenerationDetails botGenerationDetails) { - throw new NotImplementedException(); + // Choose random values by weight + bot.Customization.Head = _weightedRandomHelper.GetWeightedValue(appearance.Head); + bot.Customization.Feet = _weightedRandomHelper.GetWeightedValue(appearance.Feet); + bot.Customization.Body = _weightedRandomHelper.GetWeightedValue(appearance.Body); + + var bodyGlobalDictDb = _databaseService.GetGlobals().Configuration.Customization.Body; + var chosenBodyTemplate = _databaseService.GetCustomization()[bot.Customization.Body]; + + // Some bodies have matching hands, look up body to see if this is the case + var chosenBody = bodyGlobalDictDb[chosenBodyTemplate?.Name.Trim()]; + bot.Customization.Hands = chosenBody?.IsNotRandom ?? false + ? chosenBody.Hands // Has fixed hands for chosen body, update to match + : _weightedRandomHelper.GetWeightedValue(appearance.Hands); // Hands can be random, choose any from weighted dict } /// @@ -240,7 +507,8 @@ public class BotGenerator /// Generated bot array, ready to send to client public void LogPmcGeneratedCount(List output) { - throw new NotImplementedException(); + var pmcCount = output.Aggregate(0, (acc, cur) => { return cur.Info.Side == "Bear" || cur.Info.Side == "Usec" ? acc + 1 : acc; }); + _logger.Debug($"Generated {output.Count} total bots. Replaced ${pmcCount} with PMCs"); } /// @@ -249,9 +517,107 @@ public class BotGenerator /// health object from bot json /// Is a pscav bot being generated /// Health object - public Health GenerateHealth(Health healthObj, bool playerScav = false) + public BotBaseHealth GenerateHealth(BotTypeHealth healthObj, bool playerScav = false) { - throw new NotImplementedException(); + var bodyParts = playerScav + ? GetLowestHpBody(healthObj.BodyParts) + : _randomUtil.GetArrayValue(healthObj.BodyParts); + + BotBaseHealth health = new() + { + Hydration = new() + { + Current = _randomUtil.GetInt((int)healthObj.Hydration.Min, (int)healthObj.Hydration.Max), + Maximum = healthObj.Hydration.Max + }, + Energy = new() + { + Current = _randomUtil.GetInt((int)healthObj.Energy.Min, (int)healthObj.Energy.Max), + Maximum = healthObj.Energy.Max + }, + Temperature = new() + { + Current = _randomUtil.GetInt((int)healthObj.Temperature.Min, (int)healthObj.Temperature.Max), + Maximum = healthObj.Temperature.Max + }, + BodyParts = new Dictionary() + { + { + "Head", new BodyPartHealth + { + Health = new() + { + Current = _randomUtil.GetInt((int)bodyParts.Head.Min, (int)bodyParts.Head.Max), + Maximum = Math.Round(bodyParts.Head.Max ?? 0) + } + } + }, + { + "Chest", new BodyPartHealth + { + Health = new() + { + Current = _randomUtil.GetInt((int)bodyParts.Chest.Min, (int)bodyParts.Chest.Max), + Maximum = Math.Round(bodyParts.Chest.Max ?? 0) + } + } + }, + { + "Stomach", new BodyPartHealth + { + Health = new() + { + Current = _randomUtil.GetInt((int)bodyParts.Stomach.Min, (int)bodyParts.Stomach.Max), + Maximum = Math.Round(bodyParts.Stomach.Max ?? 0) + } + } + }, + { + "LeftArm", new BodyPartHealth + { + Health = new() + { + Current = _randomUtil.GetInt((int)bodyParts.LeftArm.Min, (int)bodyParts.LeftArm.Max), + Maximum = Math.Round(bodyParts.LeftArm.Max ?? 0) + } + } + }, + { + "RightArm", new BodyPartHealth + { + Health = new() + { + Current = _randomUtil.GetInt((int)bodyParts.RightArm.Min, (int)bodyParts.RightArm.Max), + Maximum = Math.Round(bodyParts.RightArm.Max ?? 0) + } + } + }, + { + "LeftLeg", new BodyPartHealth + { + Health = new() + { + Current = _randomUtil.GetInt((int)bodyParts.LeftLeg.Min, (int)bodyParts.LeftLeg.Max), + Maximum = Math.Round(bodyParts.LeftLeg.Max ?? 0) + } + } + }, + { + "RightLeg", new BodyPartHealth + { + Health = new() + { + Current = _randomUtil.GetInt((int)bodyParts.RightLeg.Min, (int)bodyParts.RightLeg.Max), + Maximum = Math.Round(bodyParts.RightLeg.Max ?? 0) + } + } + } + }, + UpdateTime = _timeUtil.GetTimeStamp(), + Immortal = false + }; + + return health; } /// @@ -259,9 +625,33 @@ public class BotGenerator /// /// Body parts to sum up /// Lowest hp collection - public BodyPart? GetLowestHpBody(List bodies) // TODO: there are two types of body parts + public BodyPart? GetLowestHpBody(List bodies) { - throw new NotImplementedException(); + if (bodies.Count == 0) + return null; + + BodyPart result = new(); + var props = result.GetType().GetProperties(); + double? currentHighest = double.MaxValue; + foreach (var bodyPart in bodies) + { + double? hpTotal = 0; + + foreach (var prop in props) + { + var value = (MinMax)prop.GetValue(bodyPart); + hpTotal += value.Max; + } + + if (hpTotal < currentHighest) + { + // Found collection with lower value that previous, use it + currentHighest = hpTotal; + result = bodyPart; + } + } + + return result; } /// @@ -269,9 +659,16 @@ public class BotGenerator /// /// Skills that should have their progress value randomised /// Skills - public Skills GenerateSkills(BaseJsonSkills botSkills) + public Skills GenerateSkills(BotDbSkills botSkills) { - throw new NotImplementedException(); + var skillsToReturn = new Skills + { + Common = GetSkillsWithRandomisedProgressValue(botSkills.Common, true), + Mastering = GetSkillsWithRandomisedProgressValue(botSkills.Mastering, false), + Points = 0 + }; + + return skillsToReturn; } /// @@ -280,19 +677,49 @@ public class BotGenerator /// Skills to randomise /// Are the skills 'common' skills /// Skills with randomised progress values as an array - public List GetSkillsWithRandomisedProgressValue(Dictionary skills, bool isCommonSkills) + public List GetSkillsWithRandomisedProgressValue(Dictionary? skills, bool isCommonSkills) { - throw new NotImplementedException(); + if (skills is null) + return []; + + return skills.Select(kvp => + { + // Get skill from dict, skip if not found + var skill = kvp.Value; + if (skill == null) + { + return null; + } + + // All skills have id and progress props + var skillToAdd = new BaseSkill + { + Id = kvp.Key, + Progress = _randomUtil.GetInt((int)skill.Min, (int)skill.Max) + }; + + // Common skills have additional props + if (isCommonSkills) + { + ((Common)skillToAdd).PointsEarnedDuringSession = 0; + ((Common)skillToAdd).LastAccess = 0; + } + + return skillToAdd; + }).Where(baseSkill => baseSkill != null).ToList(); } /// /// Generate an id+aid for a bot and apply /// /// bot to update - /// updated IBotBase object // TODO: Node server claims this in summary but is void + /// public void AddIdsToBot(BotBase bot) { - throw new NotImplementedException(); + var botId = _hashUtil.Generate(); + + bot.Id = botId; + bot.Aid = _hashUtil.GenerateAccountId(); } /// @@ -302,7 +729,30 @@ public class BotGenerator /// Profile to update public void GenerateInventoryId(BotBase profile) { - throw new NotImplementedException(); + var newInventoryItemId = _hashUtil.Generate(); + + foreach (var item in profile.Inventory.Items) { + // Root item found, update its _id value to newly generated id + if (item.Template == ItemTpl.INVENTORY_DEFAULT) { + item.Id = newInventoryItemId; + + continue; + } + + // Optimisation - skip items without a parentId + // They are never linked to root inventory item + we already handled root item above + if (item.ParentId is null) { + continue; + } + + // Item is a child of root inventory item, update its parentId value to newly generated id + if (item.ParentId == profile.Inventory.Equipment) { + item.ParentId = newInventoryItemId; + } + } + + // Update inventory equipment id to new one we generated + profile.Inventory.Equipment = newInventoryItemId; } /// @@ -312,19 +762,57 @@ public class BotGenerator /// /// bot info object to update /// Chosen game version - public string SetRandomisedGameVersionAndCategory(Info botInfo) // TODO: there are two types of Info + public string SetRandomisedGameVersionAndCategory(Info botInfo) { - throw new NotImplementedException(); + // Special case + if (botInfo.Nickname?.ToLower() == "nikita") { + botInfo.GameVersion = GameEditions.UNHEARD; + botInfo.MemberCategory = MemberCategory.DEVELOPER; + + return botInfo.GameVersion; + } + + // Choose random weighted game version for bot + botInfo.GameVersion = _weightedRandomHelper.GetWeightedValue(_pmcConfig.GameVersionWeight); + + // Choose appropriate member category value + switch (botInfo.GameVersion) { + case GameEditions.EDGE_OF_DARKNESS: + botInfo.MemberCategory = MemberCategory.UNIQUE_ID; + break; + case GameEditions.UNHEARD: + botInfo.MemberCategory = MemberCategory.UNHEARD; + break; + default: + // Everyone else gets a weighted randomised category + botInfo.MemberCategory = _weightedRandomHelper.GetWeightedValue(_pmcConfig.AccountTypeWeight); + break; + } + + // Ensure selected category matches + botInfo.SelectedMemberCategory = botInfo.MemberCategory; + + return botInfo.GameVersion; } /// /// Add a side-specific (usec/bear) dogtag item to a bots inventory /// /// bot to add dogtag to - /// Bot with dogtag added // TODO: Node server claims this in summary but is void + /// public void AddDogtagToBot(BotBase bot) { - throw new NotImplementedException(); + Item inventoryItem = new () { + Id = _hashUtil.Generate(), + Template = GetDogtagTplByGameVersionAndSide(bot.Info.Side, bot.Info.GameVersion), + ParentId = bot.Inventory.Equipment, + SlotId = "Dogtag", + Upd = new () { + SpawnedInSession = true, + }, + }; + + bot.Inventory.Items.Add(inventoryItem); } /// @@ -335,7 +823,25 @@ public class BotGenerator /// item tpl public string GetDogtagTplByGameVersionAndSide(string side, string gameVersion) { - throw new NotImplementedException(); + if (side.ToLower() == "usec") { + switch (gameVersion) { + case GameEditions.EDGE_OF_DARKNESS: + return ItemTpl.BARTER_DOGTAG_USEC_EOD; + case GameEditions.UNHEARD: + return ItemTpl.BARTER_DOGTAG_USEC_TUE; + default: + return ItemTpl.BARTER_DOGTAG_USEC; + } + } + + switch (gameVersion) { + case GameEditions.EDGE_OF_DARKNESS: + return ItemTpl.BARTER_DOGTAG_BEAR_EOD; + case GameEditions.UNHEARD: + return ItemTpl.BARTER_DOGTAG_BEAR_TUE; + default: + return ItemTpl.BARTER_DOGTAG_BEAR; + } } /// @@ -344,6 +850,9 @@ public class BotGenerator /// Pmc object to adjust public void SetPmcPocketsByGameVersion(BotBase bot) { - throw new NotImplementedException(); + if (bot.Info.GameVersion == GameEditions.UNHEARD) { + var pockets = bot.Inventory.Items.FirstOrDefault((item) => item.SlotId == "Pockets"); + pockets.Template = ItemTpl.POCKETS_1X4_TUE; + } } } diff --git a/Core/Generators/BotInventoryGenerator.cs b/Core/Generators/BotInventoryGenerator.cs index 00f387c3..257b8165 100644 --- a/Core/Generators/BotInventoryGenerator.cs +++ b/Core/Generators/BotInventoryGenerator.cs @@ -1,19 +1,55 @@ -using Core.Annotations; +using Core.Annotations; +using Core.Context; +using Core.Helpers; using Core.Models.Eft.Common.Tables; using Core.Models.Eft.Match; +using Core.Models.Enums; using Core.Models.Spt.Bots; using Core.Models.Spt.Config; +using Core.Servers; +using Core.Utils; using Equipment = Core.Models.Eft.Common.Tables.Equipment; +using ILogger = Core.Models.Utils.ILogger; namespace Core.Generators; [Injectable] public class BotInventoryGenerator { + private readonly ILogger _logger; + private readonly HashUtil _hashUtil; + private readonly BotLootGenerator _botLootGenerator; + private readonly BotHelper _botHelper; + private readonly BotGeneratorHelper _botGeneratorHelper; + private readonly WeatherHelper _weatherHelper; + private readonly ProfileHelper _profileHelper; + private readonly ConfigServer _configServer; + private readonly ApplicationContext _applicationContext; private BotConfig _botConfig; - public BotInventoryGenerator() + public BotInventoryGenerator( + ILogger logger, + HashUtil hashUtil, + BotLootGenerator botLootGenerator, + BotHelper botHelper, + BotGeneratorHelper botGeneratorHelper, + WeatherHelper weatherHelper, + ProfileHelper profileHelper, + ConfigServer configServer, + ApplicationContext applicationContext + ) { + _logger = logger; + _hashUtil = hashUtil; + _botLootGenerator = botLootGenerator; + _botHelper = botHelper; + _botGeneratorHelper = botGeneratorHelper; + _weatherHelper = weatherHelper; + _profileHelper = profileHelper; + _configServer = configServer; + _applicationContext = applicationContext; + + _botConfig = _configServer.GetConfig(ConfigTypes.BOT); } /// @@ -26,9 +62,45 @@ public class BotInventoryGenerator /// Level of bot being generated /// Game version for bot, only really applies for PMCs /// PmcInventory object with equipment/weapons/loot - public BotBaseInventory generateInventory(string sessionId, BotType botJsonTemplate, string botRole, bool isPmc, int botLevel, string chosenGameVersion) + public BotBaseInventory GenerateInventory(string sessionId, BotType botJsonTemplate, string botRole, bool isPmc, int botLevel, string chosenGameVersion) { - throw new NotImplementedException(); + var templateInventory = botJsonTemplate.BotInventory; + var wornItemChances = botJsonTemplate.BotChances; + var itemGenerationLimitsMinMax = botJsonTemplate.BotGeneration; + + // Generate base inventory with no items + var botInventory = GenerateInventoryBase(); + + // Get generated raid details bot will be spawned in + var raidConfig = _applicationContext + .GetLatestValue(ContextVariableType.RAID_CONFIGURATION) + ?.GetValue(); + + GenerateAndAddEquipmentToBot( + sessionId, + templateInventory, + wornItemChances, + botRole, + botInventory, + botLevel, + chosenGameVersion, + raidConfig); + + // Roll weapon spawns (primary/secondary/holster) and generate a weapon for each roll that passed + GenerateAndAddWeaponsToBot( + templateInventory, + wornItemChances, + sessionId, + botInventory, + botRole, + isPmc, + itemGenerationLimitsMinMax, + botLevel); + + // Pick loot and add to bots containers (rig/backpack/pockets/secure) + _botLootGenerator.GenerateLoot(sessionId, botJsonTemplate, isPmc, botRole, botInventory, botLevel); + + return botInventory; } /// @@ -37,7 +109,31 @@ public class BotInventoryGenerator /// PmcInventory object public BotBaseInventory GenerateInventoryBase() { - throw new NotImplementedException(); + var equipmentId = _hashUtil.Generate(); + var stashId = _hashUtil.Generate(); + var questRaidItemsId = _hashUtil.Generate(); + var questStashItemsId = _hashUtil.Generate(); + var sortingTableId = _hashUtil.Generate(); + + return new BotBaseInventory{ + Items = + [ + new() { Id = equipmentId, Template = ItemTpl.INVENTORY_DEFAULT }, + new() { Id = stashId, Template = ItemTpl.STASH_STANDARD_STASH_10X30 }, + new() { Id = questRaidItemsId, Template = ItemTpl.STASH_QUESTRAID }, + new() { Id = questStashItemsId, Template = ItemTpl.STASH_QUESTOFFLINE }, + new() { Id = sortingTableId, Template = ItemTpl.SORTINGTABLE_SORTING_TABLE } + ], + Equipment = equipmentId, + Stash = stashId, + QuestRaidItems = questRaidItemsId, + QuestStashItems = questStashItemsId, + SortingTable = sortingTableId, + HideoutAreaStashes = { }, + FastPanel = { }, + FavoriteItems = [], + HideoutCustomizationStashId = "", + }; } /// @@ -51,10 +147,168 @@ public class BotInventoryGenerator /// Level of bot /// Game version for bot, only really applies for PMCs /// RadiConfig - public void GenerateAndAddEquipmentToBot(string sessionId, BotBaseInventory templateInventory, Chances wornItemChances, string botRole, + public void GenerateAndAddEquipmentToBot(string sessionId, BotTypeInventory templateInventory, Chances wornItemChances, string botRole, BotBaseInventory botInventory, int botLevel, string chosenGameVersion, GetRaidConfigurationRequestData raidConfig) { - throw new NotImplementedException(); + // These will be handled later + var excludedSlots = new List(){ + EquipmentSlots.Pockets, + EquipmentSlots.FirstPrimaryWeapon, + EquipmentSlots.SecondPrimaryWeapon, + EquipmentSlots.Holster, + EquipmentSlots.ArmorVest, + EquipmentSlots.TacticalVest, + EquipmentSlots.FaceCover, + EquipmentSlots.Headwear, + EquipmentSlots.Earpiece + }; + + _botConfig.Equipment.TryGetValue(_botGeneratorHelper.GetBotEquipmentRole(botRole), out var botEquipConfig); + var randomistionDetails = _botHelper.GetBotRandomizationDetails(botLevel, botEquipConfig); + + // Apply nighttime changes if its nighttime + there's changes to make + if ( + randomistionDetails?.NighttimeChanges is not null && + raidConfig is not null && + _weatherHelper.IsNightTime(raidConfig.TimeVariant) + ) + { + foreach (var equipmentSlotKvP in (randomistionDetails.NighttimeChanges.EquipmentModsModifiers)) { + // Never let mod chance go outside of 0 - 100 + randomistionDetails.EquipmentMods[equipmentSlotKvP.Key] = Math.Min( + Math.Max( randomistionDetails.EquipmentMods[equipmentSlotKvP.Key] + equipmentSlotKvP.Value, 0), 100); + } + } + + // Get profile of player generating bots, we use their level later on + var pmcProfile = _profileHelper.GetPmcProfile(sessionId); + var botEquipmentRole = _botGeneratorHelper.GetBotEquipmentRole(botRole); + + + // Iterate over all equipment slots of bot, do it in specifc order to reduce conflicts + // e.g. ArmorVest should be generated after TactivalVest + // or FACE_COVER before HEADWEAR + foreach (var equipmentSlotKvP in templateInventory.Equipment) { + // Skip some slots as they need to be done in a specific order + with specific parameter values + // e.g. Weapons + if (excludedSlots.Contains(equipmentSlotKvP.Key)) { + continue; + } + + GenerateEquipment( new GenerateEquipmentProperties + { + RootEquipmentSlot = equipmentSlotKvP.Key, + RootEquipmentPool = equipmentSlotKvP.Value, + ModPool = templateInventory.Mods, + SpawnChances = wornItemChances, + BotData = new BotData { Role = botRole, Level = botLevel, EquipmentRole = botEquipmentRole }, + Inventory = botInventory, + BotEquipmentConfig = botEquipConfig, + RandomisationDetails = randomistionDetails, + GeneratingPlayerLevel = pmcProfile.Info.Level, + }); + } + + // Generate below in specific order + GenerateEquipment( new GenerateEquipmentProperties + { + RootEquipmentSlot = EquipmentSlots.Pockets, + // Unheard profiles have unique sized pockets, TODO - handle this somewhere else in a better way + RootEquipmentPool = + chosenGameVersion == GameEditions.UNHEARD + ? new Dictionary{ [ItemTpl.POCKETS_1X4_TUE] = 1 } + : templateInventory.Equipment[EquipmentSlots.Pockets], + ModPool = templateInventory.Mods, + SpawnChances = wornItemChances, + BotData = new BotData{ Role = botRole, Level = botLevel, EquipmentRole = botEquipmentRole }, + Inventory = botInventory, + BotEquipmentConfig = botEquipConfig, + RandomisationDetails = randomistionDetails, + GenerateModsBlacklist = [ItemTpl.POCKETS_1X4_TUE], + GeneratingPlayerLevel = pmcProfile.Info.Level, + }); + + GenerateEquipment( new GenerateEquipmentProperties + { + RootEquipmentSlot = EquipmentSlots.FaceCover, + RootEquipmentPool = templateInventory.Equipment[EquipmentSlots.FaceCover], + ModPool = templateInventory.Mods, + SpawnChances = wornItemChances, + BotData = new BotData { Role = botRole, Level = botLevel, EquipmentRole = botEquipmentRole }, + Inventory = botInventory, + BotEquipmentConfig = botEquipConfig, + RandomisationDetails = randomistionDetails, + GeneratingPlayerLevel = pmcProfile.Info.Level, + }); + + GenerateEquipment( new GenerateEquipmentProperties + { + RootEquipmentSlot = EquipmentSlots.Headwear, + RootEquipmentPool = templateInventory.Equipment[EquipmentSlots.Headwear], + ModPool = templateInventory.Mods, + SpawnChances = wornItemChances, + BotData = new BotData { Role = botRole, Level = botLevel, EquipmentRole = botEquipmentRole }, + Inventory = botInventory, + BotEquipmentConfig = botEquipConfig, + RandomisationDetails = randomistionDetails, + GeneratingPlayerLevel = pmcProfile.Info.Level, + }); + + GenerateEquipment(new GenerateEquipmentProperties + { + RootEquipmentSlot = EquipmentSlots.Earpiece, + RootEquipmentPool = templateInventory.Equipment[EquipmentSlots.Earpiece], + ModPool = templateInventory.Mods, + SpawnChances = wornItemChances, + BotData = new BotData { Role = botRole, Level = botLevel, EquipmentRole = botEquipmentRole }, + Inventory = botInventory, + BotEquipmentConfig = botEquipConfig, + RandomisationDetails = randomistionDetails, + GeneratingPlayerLevel = pmcProfile.Info.Level, + }); + + var hasArmorVest = GenerateEquipment( new GenerateEquipmentProperties + { + RootEquipmentSlot = EquipmentSlots.ArmorVest, + RootEquipmentPool = templateInventory.Equipment[EquipmentSlots.ArmorVest], + ModPool = templateInventory.Mods, + SpawnChances = wornItemChances, + BotData = new BotData { Role = botRole, Level = botLevel, EquipmentRole = botEquipmentRole }, + Inventory = botInventory, + BotEquipmentConfig = botEquipConfig, + RandomisationDetails = randomistionDetails, + GeneratingPlayerLevel = pmcProfile.Info.Level, + }); + + // Bot has no armor vest and flagged to be forced to wear armored rig in this event + if (botEquipConfig.ForceOnlyArmoredRigWhenNoArmor.GetValueOrDefault(false) && !hasArmorVest) { + // Filter rigs down to only those with armor + FilterRigsToThoseWithProtection(templateInventory.Equipment, botRole); + } + + // Optimisation - Remove armored rigs from pool + if (hasArmorVest) { + // Filter rigs down to only those with armor + FilterRigsToThoseWithoutProtection(templateInventory.Equipment, botRole); + } + + // Bot is flagged as always needing a vest + if (botEquipConfig.ForceRigWhenNoVest.GetValueOrDefault(false) && !hasArmorVest) { + wornItemChances.EquipmentChances["TacticalVest"] = 100; + } + + GenerateEquipment( new GenerateEquipmentProperties + { + RootEquipmentSlot = EquipmentSlots.Earpiece, + RootEquipmentPool = templateInventory.Equipment[EquipmentSlots.Earpiece], + ModPool = templateInventory.Mods, + SpawnChances = wornItemChances, + BotData = new BotData { Role = botRole, Level = botLevel, EquipmentRole = botEquipmentRole }, + Inventory = botInventory, + BotEquipmentConfig = botEquipConfig, + RandomisationDetails = randomistionDetails, + GeneratingPlayerLevel = pmcProfile.Info.Level, + }); } /// @@ -62,7 +316,12 @@ public class BotInventoryGenerator /// /// Equpiment to filter TacticalVest of /// Role of bot vests are being filtered for - public void FilterRigsToThoseWithProtection(Equipment templateEquipment, string botRole) + public void FilterRigsToThoseWithProtection(Dictionary> templateEquipment, string botRole) + { + throw new NotImplementedException(); + } + + public void FilterRigsToThoseWithoutProtection(Dictionary> templateEquipment, string botRole, bool allowEmptyResult = true) { throw new NotImplementedException(); } @@ -85,7 +344,8 @@ public class BotInventoryGenerator /// true when item added public bool GenerateEquipment(GenerateEquipmentProperties settings) { - throw new NotImplementedException(); + _logger.Error("NOT IMPLEMENTED - GenerateEquipment"); + return true; } /// @@ -110,7 +370,7 @@ public class BotInventoryGenerator /// Is the bot being generated as a pmc /// Limits for items the bot can have /// level of bot having weapon generated - public void GenerateAndAddWeaponsToBot(BotBaseInventory templateInventory, Chances equipmentChances, string sessionId, BotBaseInventory botInventory, + public void GenerateAndAddWeaponsToBot(BotTypeInventory templateInventory, Chances equipmentChances, string sessionId, BotBaseInventory botInventory, string botRole, bool isPmc, Generation itemGenerationLimitsMinMax, int botLevel) { diff --git a/Core/Generators/BotLevelGenerator.cs b/Core/Generators/BotLevelGenerator.cs index 810e2ec5..e3efb15f 100644 --- a/Core/Generators/BotLevelGenerator.cs +++ b/Core/Generators/BotLevelGenerator.cs @@ -1,16 +1,32 @@ -using Core.Annotations; +using Core.Annotations; using Core.Models.Common; using Core.Models.Eft.Bot; using Core.Models.Eft.Common.Tables; using Core.Models.Spt.Bots; +using Core.Services; +using Core.Utils; +using ILogger = Core.Models.Utils.ILogger; namespace Core.Generators; [Injectable] public class BotLevelGenerator { - public BotLevelGenerator() + private readonly ILogger _logger; + private readonly RandomUtil _randomUtil; + private readonly MathUtil _mathUtil; + private readonly DatabaseService _databaseService; + + public BotLevelGenerator( + ILogger logger, + RandomUtil randomUtil, + MathUtil mathUtil, + DatabaseService databaseService) { + _logger = logger; + _randomUtil = randomUtil; + _mathUtil = mathUtil; + _databaseService = databaseService; } /// @@ -22,12 +38,30 @@ public class BotLevelGenerator /// IRandomisedBotLevelResult object public RandomisedBotLevelResult GenerateBotLevel(MinMax levelDetails, BotGenerationDetails botGenerationDetails, BotBase bot) { - throw new NotImplementedException(); + var expTable = _databaseService.GetGlobals().Configuration.Exp.Level.ExperienceTable; + var botLevelRange = GetRelativeBotLevelRange(botGenerationDetails, levelDetails, expTable.Length); + + // Get random level based on the exp table. + int exp = 0; + var level = int.Parse(ChooseBotLevel(botLevelRange.Min.Value, botLevelRange.Max.Value, 1, 1.15) + .ToString()); // TODO - nasty double to string to int conversion + for (var i = 0; i < level; i++) + { + exp += expTable[i].Experience.Value; + } + + // Sprinkle in some random exp within the level, unless we are at max level. + if (level < expTable.Length - 1) + { + exp += _randomUtil.GetInt(0, expTable[level].Experience.Value - 1); + } + + return new RandomisedBotLevelResult { Level = level, Exp = exp }; } - public int ChooseBotLevel(int min, int max, int shift, int number) + public double ChooseBotLevel(double min, double max, int shift, double number) { - throw new NotImplementedException(); + return _randomUtil.GetBiasedRandomNumber(min, max, shift, number); } /// @@ -39,6 +73,35 @@ public class BotLevelGenerator /// A MinMax of the lowest and highest level to generate the bots public MinMax GetRelativeBotLevelRange(BotGenerationDetails botGenerationDetails, MinMax levelDetails, int maxAvailableLevel) { - throw new NotImplementedException(); + var isPmc = botGenerationDetails.IsPmc.GetValueOrDefault(false); + var pmcOverride = botGenerationDetails.LocationSpecificPmcLevelOverride; + + var minPossibleLevel = isPmc && pmcOverride is not null + ? Math.Min( + Math.Max(levelDetails.Min.Value, pmcOverride.Min.Value), // Biggest between json min and the botgen min + maxAvailableLevel // Fallback if value above is crazy (default is 79) + ) + : Math.Min(levelDetails.Min.Value, maxAvailableLevel); // Not pmc with override or non-pmc + + var maxPossibleLevel = isPmc && pmcOverride is not null + ? Math.Min(pmcOverride.Max.Value, maxAvailableLevel) // Was a PMC and they have a level override + : Math.Min(levelDetails.Max.Value, maxAvailableLevel); // Not pmc with override or non-pmc + + var minLevel = botGenerationDetails.PlayerLevel.HasValue + ? botGenerationDetails.PlayerLevel.Value + : 0 - botGenerationDetails.BotRelativeLevelDeltaMin.Value; + var maxLevel = botGenerationDetails.PlayerLevel.HasValue + ? botGenerationDetails.PlayerLevel.Value + : 0 + botGenerationDetails.BotRelativeLevelDeltaMin.Value; + + // Bound the level to the min/max possible + maxLevel = Math.Min(Math.Max(maxLevel, minPossibleLevel), maxPossibleLevel); + minLevel = Math.Min(Math.Max(minLevel, minPossibleLevel), maxPossibleLevel); + + return new MinMax + { + Min = minLevel, + Max = maxLevel, + }; } } diff --git a/Core/Generators/WeatherGenerator.cs b/Core/Generators/WeatherGenerator.cs index 454ea05f..24f59c84 100644 --- a/Core/Generators/WeatherGenerator.cs +++ b/Core/Generators/WeatherGenerator.cs @@ -16,19 +16,25 @@ public class WeatherGenerator private readonly SeasonalEventService _seasonalEventService; private readonly WeatherHelper _weatherHelper; private readonly ConfigServer _configServer; - + private readonly WeightedRandomHelper _weightedRandomHelper; + private readonly RandomUtil _randomUtil; private readonly WeatherConfig _weatherConfig; public WeatherGenerator( TimeUtil timeUtil, SeasonalEventService seasonalEventService, WeatherHelper weatherHelper, - ConfigServer configServer) + ConfigServer configServer, + WeightedRandomHelper weightedRandomHelper, + RandomUtil randomUtil + ) { _timeUtil = timeUtil; _seasonalEventService = seasonalEventService; _weatherHelper = weatherHelper; _configServer = configServer; + _weightedRandomHelper = weightedRandomHelper; + _randomUtil = randomUtil; _weatherConfig = _configServer.GetConfig(); } @@ -81,7 +87,36 @@ public class WeatherGenerator */ public Weather GenerateWeather(Season currentSeason, long? timestamp = null) { - throw new NotImplementedException(); + var weatherValues = GetWeatherValuesBySeason(currentSeason); + var clouds = GetWeightedClouds(weatherValues); + + // Force rain to off if no clouds + var rain = clouds <= 0.6 ? 0 : GetWeightedRain(weatherValues); + + // TODO: Ensure Weather settings match Ts Server GetRandomDouble produces a decimal value way higher than ts server + var result = new Weather + { + Pressure = GetRandomDouble(weatherValues.Pressure.Min ?? 0, weatherValues.Pressure.Max ?? 0), + Temperature = 0, + Fog = GetWeightedFog(weatherValues), + RainIntensity = + rain > 1 ? GetRandomDouble(weatherValues.RainIntensity.Min ?? 0, weatherValues.RainIntensity.Max ?? 0) : 0, + Rain = rain, + WindGustiness = GetRandomDouble(weatherValues.WindGustiness.Min ?? 0, weatherValues.WindGustiness.Max ?? 0, 2), + WindDirection = GetWeightedWindDirection(weatherValues), + WindSpeed = GetWeightedWindSpeed(weatherValues), + Cloud = clouds, + Time = "", + Date = "", + Timestamp = 0, + SptInRaidTimestamp = 0 + }; + + SetCurrentDateTime(result, timestamp); + + result.Temperature = GetRaidTemperature(weatherValues, result.SptInRaidTimestamp ?? 0); + + return result; } protected SeasonalValues GetWeatherValuesBySeason(Season currentSeason) @@ -92,7 +127,7 @@ public class WeatherGenerator return this._weatherConfig.Weather.SeasonValues["default"]; } - return value; + return value!; } /** @@ -101,9 +136,15 @@ public class WeatherGenerator * @param inRaidTimestamp What time is the raid running at * @returns Timestamp */ - protected double GetRaidTemperature(SeasonalValues weather, int inRaidTimestamp) + protected double GetRaidTemperature(SeasonalValues weather, long inRaidTimestamp) { - throw new NotImplementedException(); + // Convert timestamp to date so we can get current hour and check if its day or night + var currentRaidTime = new DateTime(inRaidTimestamp); + var minMax = _weatherHelper.IsHourAtNightTime(currentRaidTime.Hour) + ? weather.Temp.Night + : weather.Temp.Day; + + return Math.Round(_randomUtil.GetDouble(minMax.Min ?? 0, minMax.Max ?? 0), 2); } /** @@ -111,38 +152,46 @@ public class WeatherGenerator * @param weather Object to update * @param timestamp OPTIONAL, define timestamp used */ - protected void SetCurrentDateTime(Weather weather, int? timestamp = null) + protected void SetCurrentDateTime(Weather weather, long? timestamp = null) { - throw new NotImplementedException(); + var inRaidTime = _weatherHelper.GetInRaidTime(timestamp); + var normalTime = GetBsgFormattedTime(inRaidTime); + var formattedDate = _timeUtil.FormatDate(timestamp.HasValue ? _timeUtil.GetDateTimeFromTimeStamp(timestamp.Value) : DateTime.UtcNow); + var datetimeBsgFormat = $"{formattedDate} {normalTime}"; + + weather.Timestamp = timestamp ?? _timeUtil.GetTimeStampFromEpoch(inRaidTime); // matches weather.date We use to divide by 1000 + weather.Date = formattedDate; // matches weather.timestamp + weather.Time = datetimeBsgFormat; // matches weather.timestamp + weather.SptInRaidTimestamp = _timeUtil.GetTimeStampFromEpoch(inRaidTime); } protected WindDirection GetWeightedWindDirection(SeasonalValues weather) { - throw new NotImplementedException(); + return _weightedRandomHelper.WeightedRandom(weather.WindDirection.Values, weather.WindDirection.Weights).Item; } protected double GetWeightedClouds(SeasonalValues weather) { - throw new NotImplementedException(); + return _weightedRandomHelper.WeightedRandom(weather.Clouds.Values, weather.Clouds.Weights).Item; } protected double GetWeightedWindSpeed(SeasonalValues weather) { - throw new NotImplementedException(); + return _weightedRandomHelper.WeightedRandom(weather.WindSpeed.Values, weather.WindSpeed.Weights).Item; } protected double GetWeightedFog(SeasonalValues weather) { - throw new NotImplementedException(); + return _weightedRandomHelper.WeightedRandom(weather.Fog.Values, weather.Fog.Weights).Item; } protected double GetWeightedRain(SeasonalValues weather) { - throw new NotImplementedException(); + return _weightedRandomHelper.WeightedRandom(weather.Rain.Values, weather.Rain.Weights).Item; } - protected double GetRandomFloat(double min, double max, int precision = 3) + protected double GetRandomDouble(double min, double max, int precision = 3) { - throw new NotImplementedException(); + return Math.Round(_randomUtil.GetDouble(min, max), precision); } } diff --git a/Core/Helpers/BotGeneratorHelper.cs b/Core/Helpers/BotGeneratorHelper.cs index 8f595563..5e73642d 100644 --- a/Core/Helpers/BotGeneratorHelper.cs +++ b/Core/Helpers/BotGeneratorHelper.cs @@ -1,13 +1,25 @@ -using Core.Annotations; +using Core.Annotations; using Core.Models.Eft.Common.Tables; using Core.Models.Enums; using Core.Models.Spt.Config; +using Core.Servers; namespace Core.Helpers; [Injectable] public class BotGeneratorHelper { + private readonly ConfigServer _configServer; + private readonly PmcConfig _pmcConfig; + + public BotGeneratorHelper( + ConfigServer configServer + ) + { + _configServer = configServer; + _pmcConfig = _configServer.GetConfig(ConfigTypes.PMC); + } + /// /// Adds properties to an item /// e.g. Repairable / HasHinge / Foldable / MaxDurability @@ -84,7 +96,11 @@ public class BotGeneratorHelper /// Equipment role (e.g. pmc / assault / bossTagilla) public string GetBotEquipmentRole(string botRole) { - throw new NotImplementedException(); + string[] pmcs = [_pmcConfig.UsecType.ToLower(), _pmcConfig.BearType.ToLower()]; + return pmcs.Contains( + botRole.ToLower()) + ? "pmc" + : botRole; } /// diff --git a/Core/Helpers/BotHelper.cs b/Core/Helpers/BotHelper.cs index 60cc7871..b0352be9 100644 --- a/Core/Helpers/BotHelper.cs +++ b/Core/Helpers/BotHelper.cs @@ -1,8 +1,12 @@ using Core.Annotations; using Core.Models.Common; using Core.Models.Eft.Common.Tables; +using Core.Models.Eft.Match; +using Core.Models.Enums; using Core.Models.Spt.Config; +using Core.Servers; using Core.Services; +using Core.Utils; using ILogger = Core.Models.Utils.ILogger; namespace Core.Helpers; @@ -12,14 +16,30 @@ public class BotHelper { private readonly ILogger _logger; private readonly DatabaseService _databaseService; + private readonly RandomUtil _randomUtil; + private readonly ConfigServer _configServer; - public BotHelper( + private readonly BotConfig _botConfig; + private readonly PmcConfig _pmcConfig; + + private readonly List _pmcNames = ["usec", "bear", "pmc", "pmcbear", "pmcusec"]; + + public BotHelper + ( ILogger logger, - DatabaseService databaseService) + DatabaseService databaseService, + RandomUtil randomUtil, + ConfigServer configServer + ) { _logger = logger; _databaseService = databaseService; + _randomUtil = randomUtil; + _configServer = configServer; + _botConfig = configServer.GetConfig(ConfigTypes.BOT); + _pmcConfig = configServer.GetConfig(ConfigTypes.PMC); } + /// /// Get a template object for the specified botRole from bots.types db /// @@ -44,17 +64,17 @@ public class BotHelper /// true if is pmc public bool IsBotPmc(string botRole) { - throw new NotImplementedException(); + return _pmcNames.Contains(botRole?.ToLower()); } public bool IsBotBoss(string botRole) { - throw new NotImplementedException(); + return _botConfig.Bosses.Any(x => x.ToLower() == botRole.ToLower()); } public bool IsBotFollower(string botRole) { - throw new NotImplementedException(); + return botRole?.ToLower().StartsWith("follower") ?? false; } /// @@ -64,7 +84,15 @@ public class BotHelper /// bot type to add to friendly list public void AddBotToFriendlyList(DifficultyCategories difficultySettings, string typeToAdd) { - throw new NotImplementedException(); + var friendlyBotTypesKey = "FRIENDLY_BOT_TYPES"; + + // Null guard + if (difficultySettings.Mind[friendlyBotTypesKey] is null) + { + difficultySettings.Mind[friendlyBotTypesKey] = new List(); + } + + ((List)difficultySettings.Mind[friendlyBotTypesKey]).Add(typeToAdd); } /// @@ -74,17 +102,44 @@ public class BotHelper /// bot type to add to revenge list public void AddBotToRevengeList(DifficultyCategories difficultySettings, string[] typesToAdd) { - throw new NotImplementedException(); + var revengePropKey = "REVENGE_BOT_TYPES"; + + // Nothing to add + if (typesToAdd is null) + { + return; + } + + // Null guard + if (difficultySettings.Mind[revengePropKey] is null) + { + difficultySettings.Mind[revengePropKey] = new List(); + } + + var revengeArray = (List)difficultySettings.Mind[revengePropKey]; + foreach (var botTypeToAdd in typesToAdd) + { + if (!revengeArray.Contains(botTypeToAdd)) + { + revengeArray.Add(botTypeToAdd); + } + } } public bool RollChanceToBePmc(MinMax botConvertMinMax) { - throw new NotImplementedException(); + return _randomUtil.GetChance100(_randomUtil.GetInt((int)botConvertMinMax.Min, (int)botConvertMinMax.Max)); } - protected void GetPmcConversionValuesForLocation(string location) + protected Dictionary GetPmcConversionValuesForLocation(string location) { - throw new NotImplementedException(); + var result = _pmcConfig.ConvertIntoPmcChance[location.ToLower()]; + if (result is null) + { + _pmcConfig.ConvertIntoPmcChance = new(); + } + + return result; } /// @@ -94,7 +149,10 @@ public class BotHelper /// True if role is PMC public bool BotRoleIsPmc(string botRole) { - throw new NotImplementedException(); + List ListToCheck = [_pmcConfig.UsecType.ToLower(), _pmcConfig.BearType.ToLower()]; + return ListToCheck.Contains( + botRole.ToLower() + ); } /// @@ -105,7 +163,15 @@ public class BotHelper /// RandomisationDetails public RandomisationDetails GetBotRandomizationDetails(int botLevel, EquipmentFilters botEquipConfig) { - throw new NotImplementedException(); + // No randomisation details found, skip + if (botEquipConfig is null || botEquipConfig.Randomisation is null) + { + return null; + } + + return botEquipConfig.Randomisation.FirstOrDefault( + (randDetails) => botLevel >= randDetails.LevelRange.Min && botLevel <= randDetails.LevelRange.Max + ); } /// @@ -114,7 +180,7 @@ public class BotHelper /// pmc role public string GetRandomizedPmcRole() { - throw new NotImplementedException(); + return _randomUtil.GetChance100(_pmcConfig.IsUsec) ? _pmcConfig.UsecType : _pmcConfig.BearType; } /// @@ -124,7 +190,13 @@ public class BotHelper /// side (usec/bear) public string GetPmcSideByRole(string botRole) { - throw new NotImplementedException(); + if (_pmcConfig.BearType.ToLower() == botRole.ToLower()) + return "Bear"; + + if (_pmcConfig.UsecType.ToLower() == botRole.ToLower()) + return "Usec"; + + return GetRandomizedPmcSide(); } /// @@ -133,7 +205,7 @@ public class BotHelper /// pmc side as string protected string GetRandomizedPmcSide() { - throw new NotImplementedException(); + return _randomUtil.GetChance100(_pmcConfig.IsUsec) ? "Usec" : "Bear"; } /// @@ -144,6 +216,15 @@ public class BotHelper /// name of PMC public string GetPmcNicknameOfMaxLength(int maxLength, string side = null) { - throw new NotImplementedException(); + var randomType = (side is not null) ? side : (_randomUtil.GetInt(0, 1) == 0) ? "usec" : "bear"; + var allNames = _databaseService.GetBots().Types[randomType.ToLower()].FirstNames; + var filteredNames = allNames.Where((name) => name.Length <= maxLength); + if (filteredNames.Count() == 0) { + _logger.Warning($"Unable to filter: {randomType} PMC names to only those under: {maxLength}, none found that match that criteria, selecting from entire name pool instead`,\n"); + + return _randomUtil.GetStringCollectionValue(allNames); + } + + return _randomUtil.GetStringCollectionValue(filteredNames); } } diff --git a/Core/Helpers/DialogueHelper.cs b/Core/Helpers/DialogueHelper.cs index 5d4c2f05..afef1631 100644 --- a/Core/Helpers/DialogueHelper.cs +++ b/Core/Helpers/DialogueHelper.cs @@ -1,12 +1,46 @@ using Core.Annotations; using Core.Models.Eft.Common.Tables; using Core.Models.Eft.Profile; +using Core.Servers; +using Core.Services; +using Core.Utils; +using ILogger = Core.Models.Utils.ILogger; namespace Core.Helpers; [Injectable] public class DialogueHelper { + private readonly ILogger _logger; + private readonly HashUtil _hashUtil; + private readonly SaveServer _saveServer; + private readonly DatabaseServer _databaseServer; + private readonly NotifierHelper _notifierHelper; + private readonly NotificationSendHelper _notificationSendHelper; + private readonly LocalisationService _localisationService; + private readonly ItemHelper _itemHelper; + + public DialogueHelper + ( + ILogger logger, + HashUtil hashUtil, + SaveServer saveServer, + DatabaseServer databaseServer, + NotifierHelper notifierHelper, + NotificationSendHelper notificationSendHelper, + LocalisationService localisationService, + ItemHelper itemHelper + ) + { + _logger = logger; + _hashUtil = hashUtil; + _saveServer = saveServer; + _databaseServer = databaseServer; + _notifierHelper = notifierHelper; + _localisationService = localisationService; + _itemHelper = itemHelper; + } + /// /// Get the preview contents of the last message in a dialogue. /// @@ -14,7 +48,23 @@ public class DialogueHelper /// MessagePreview public MessagePreview GetMessagePreview(Models.Eft.Profile.Dialogue dialogue) { - throw new NotImplementedException(); + // The last message of the dialogue should be shown on the preview. + var message = dialogue.Messages[dialogue.Messages.Count - 1]; + MessagePreview result = new() + { + DateTime = message?.DateTime, + MessageType = message?.MessageType, + TemplateId = message?.TemplateId, + UserId = dialogue?.Id + }; + + if (message?.Text is not null) + result.Text = message.Text; + + if (message?.SystemData is not null) + result.SystemData = message?.SystemData; + + return result; } /// @@ -26,7 +76,36 @@ public class DialogueHelper /// public List GetMessageItemContents(string messageID, string sessionID, string itemId) { - throw new NotImplementedException(); + var dialogueData = _saveServer.GetProfile(sessionID).DialogueRecords; + foreach (var dialogue in dialogueData) + { + var message = dialogueData[dialogue.Key].Messages.FirstOrDefault(x => x.Id == messageID); + if (message is null) + continue; + + if (message.Id == messageID) + { + var attachmentsNew = _saveServer.GetProfile(sessionID).DialogueRecords[dialogue.Key].AttachmentsNew; + if (attachmentsNew > 0) + _saveServer.GetProfile(sessionID).DialogueRecords[dialogue.Key].AttachmentsNew = attachmentsNew - 1; + + // Check reward count when item being moved isn't in reward list + // If count is 0, it means after this move occurs the reward array will be empty and all rewards collected + if (message.Items.Data is null) + message.Items.Data = new(); + + var rewardItems = message.Items.Data?.Where(x => x.Id != itemId); + if (rewardItems.Count() == 0) + { + message.RewardCollected = true; + message.HasRewards = false; + } + + return message.Items.Data; + } + } + + return new List(); } /// @@ -36,6 +115,26 @@ public class DialogueHelper /// Dialog dictionary public Dictionary GetDialogsForProfile(string sessionId) { - throw new NotImplementedException(); + var profile = _saveServer.GetProfile(sessionId); + if (profile.DialogueRecords is null) + profile.DialogueRecords = new(); + + return profile.DialogueRecords; + } + + public Models.Eft.Profile.Dialogue? GetDialogueFromProfile(string profileId, string dialogueId) + { + Models.Eft.Profile.Dialogue? returnDialogue = null; + var dialogues = GetDialogsForProfile(profileId); + + foreach (var dialogue in dialogues.Values) + { + if (dialogue.Id == dialogueId) + returnDialogue = dialogue; + + break; + } + + return returnDialogue; } } diff --git a/Core/Helpers/ItemHelper.cs b/Core/Helpers/ItemHelper.cs index e4aadf99..313af33f 100644 --- a/Core/Helpers/ItemHelper.cs +++ b/Core/Helpers/ItemHelper.cs @@ -1044,9 +1044,9 @@ public class ItemHelper throw new NotImplementedException(); } - public bool IsOfBaseclass(string valueEncyclopedia, string weapon) + public bool IsOfBaseclass(string tpl, List baseClassTpls) { - throw new NotImplementedException(); + return _itemBaseClassService.ItemHasBaseClass(tpl, baseClassTpls); } } diff --git a/Core/Helpers/PresetHelper.cs b/Core/Helpers/PresetHelper.cs index 08bee62d..950eb063 100644 --- a/Core/Helpers/PresetHelper.cs +++ b/Core/Helpers/PresetHelper.cs @@ -57,7 +57,7 @@ public class PresetHelper var tempPresets = _databaseService.GetGlobals().ItemPresets; tempPresets = tempPresets.Where(p => p.Value.Encyclopedia != null && - _itemHelper.IsOfBaseclass(p.Value.Encyclopedia, BaseClasses.WEAPON)).ToDictionary(); + _itemHelper.IsOfBaseclass(p.Value.Encyclopedia, [BaseClasses.WEAPON])).ToDictionary(); } return _defaultWeaponPresets; diff --git a/Core/Helpers/ProfileHelper.cs b/Core/Helpers/ProfileHelper.cs index 0032b4b7..6c0e2dce 100644 --- a/Core/Helpers/ProfileHelper.cs +++ b/Core/Helpers/ProfileHelper.cs @@ -506,7 +506,7 @@ public class ProfileHelper /// Player profile /// Skill to look up and return value from /// Common skill object from desired profile - public Common? GetSkillFromProfile(PmcData pmcData, SkillTypes skill) + public BaseSkill? GetSkillFromProfile(PmcData pmcData, SkillTypes skill) { var skillToReturn = pmcData?.Skills?.Common.FirstOrDefault(s => s.Id == skill.ToString()); if (skillToReturn == null) @@ -662,9 +662,9 @@ public class ProfileHelper } var customisationTemplateDb = _databaseService.GetTemplates().Customization; - var matchingCustomisation = customisationTemplateDb[reward.Target]; + var matchingCustomisation = customisationTemplateDb.GetValueOrDefault(reward.Target, null); - if (matchingCustomisation != null) + if (matchingCustomisation is null) { var rewardToStore = new CustomisationStorage { diff --git a/Core/Helpers/TraderHelper.cs b/Core/Helpers/TraderHelper.cs index a5bded75..79ce6aa6 100644 --- a/Core/Helpers/TraderHelper.cs +++ b/Core/Helpers/TraderHelper.cs @@ -306,9 +306,11 @@ public class TraderHelper /// /// The trader enum value to validate /// The validated trader enum value as a string, or an empty string if invalid - public string GetValidTraderIdByEnumValue(object traderEnumValue) // TODO: param was Traders + public string GetValidTraderIdByEnumValue(string traderEnumValue) // TODO: param was Traders { - throw new NotImplementedException(); + var traderId = _databaseService.GetTraders(); + var id = traderId.FirstOrDefault(x => x.Value.Base.Nickname.ToLower() == traderEnumValue.ToLower()).Key; + return id; } /// diff --git a/Core/Helpers/WeatherHelper.cs b/Core/Helpers/WeatherHelper.cs index d8b1f934..78bef744 100644 --- a/Core/Helpers/WeatherHelper.cs +++ b/Core/Helpers/WeatherHelper.cs @@ -35,16 +35,18 @@ public class WeatherHelper /// /// (new Date()) /// Date object of current in-raid time - public DateTime GetInRaidTime(double? timestamp = null) + public DateTime GetInRaidTime(long? timestamp = null) { // tarkov time = (real time * 7 % 24 hr) + 3 hour var russiaOffsetMilliseconds = _timeUtil.GetHoursAsSeconds(3) * 1000; var twentyFourHoursMilliseconds = _timeUtil.GetHoursAsSeconds(24) * 1000; - var currentTimestampMilliSeconds = (timestamp is not null) ? timestamp : _timeUtil.GetTimeStamp(); + var currentTimestampMilliSeconds = timestamp.HasValue + ? timestamp ?? 0 + : (DateTime.UtcNow - DateTime.UnixEpoch).TotalMilliseconds; - return new DateTime().AddMilliseconds( - (russiaOffsetMilliseconds + russiaOffsetMilliseconds * _weatherConfig.Acceleration) % - twentyFourHoursMilliseconds); + return _timeUtil.GetDateTimeFromTimeStamp((long) + (russiaOffsetMilliseconds + currentTimestampMilliSeconds * _weatherConfig.Acceleration) % + twentyFourHoursMilliseconds); } /// diff --git a/Core/Helpers/WeightedRandomHelper.cs b/Core/Helpers/WeightedRandomHelper.cs index 87127248..11cc012c 100644 --- a/Core/Helpers/WeightedRandomHelper.cs +++ b/Core/Helpers/WeightedRandomHelper.cs @@ -1,4 +1,4 @@ -using Core.Annotations; +using Core.Annotations; using Core.Models.Spt.Helper; using ILogger = Core.Models.Utils.ILogger; @@ -16,13 +16,19 @@ public class WeightedRandomHelper } /// - /// Choos an item from the passed in array based on the weightings of each + /// Choose an item from the passed in array based on the weightings of each /// - /// Items and weights to use + /// Items and weights to use /// Chosen item from array - public T GetWeightedValue(Dictionary itemArray) + public T GetWeightedValue(Dictionary values) where T : notnull { - throw new NotImplementedException(); + var itemKeys = values.Keys.ToList(); + var weights = values.Values.ToList(); + + var chosenItem = WeightedRandom(itemKeys, weights); + + return chosenItem.Item; + // SORRY IF THIS BLEW UP, I DONT SEE A REASON ITS GENERIC - CWX } /// diff --git a/Core/Models/Common/MinMax.cs b/Core/Models/Common/MinMax.cs index 5aa35d40..cc0dd6bb 100644 --- a/Core/Models/Common/MinMax.cs +++ b/Core/Models/Common/MinMax.cs @@ -6,6 +6,7 @@ public class MinMax { [JsonPropertyName("type")] public string? Type { get; set; } + [JsonPropertyName("max")] public double? Max { get; set; } diff --git a/Core/Models/Eft/Bot/RandomisedBotLevelResult.cs b/Core/Models/Eft/Bot/RandomisedBotLevelResult.cs index a64f7b35..82bce567 100644 --- a/Core/Models/Eft/Bot/RandomisedBotLevelResult.cs +++ b/Core/Models/Eft/Bot/RandomisedBotLevelResult.cs @@ -9,4 +9,4 @@ public class RandomisedBotLevelResult [JsonPropertyName("exp")] public int? Exp { get; set; } -} \ No newline at end of file +} diff --git a/Core/Models/Eft/Common/Globals.cs b/Core/Models/Eft/Common/Globals.cs index f1c7609c..e91ee4b6 100644 --- a/Core/Models/Eft/Common/Globals.cs +++ b/Core/Models/Eft/Common/Globals.cs @@ -1,4 +1,4 @@ -using Core.Models.Eft.Common.Tables; +using Core.Models.Eft.Common.Tables; using Core.Models.Eft.Hideout; namespace Core.Models.Eft.Common; @@ -540,7 +540,7 @@ public class Config public BTRSettings? BTRSettings { get; set; } [JsonPropertyName("EventType")] - public string[] EventType { get; set; } + public List EventType { get; set; } [JsonPropertyName("WalkSpeed")] public XYZ? WalkSpeed { get; set; } @@ -1294,13 +1294,13 @@ public class Mastering public class Customization { [JsonPropertyName("SavageHead")] - public Dictionary>? Head { get; set; } + public Dictionary? Head { get; set; } [JsonPropertyName("SavageBody")] - public Dictionary>? Body { get; set; } + public Dictionary? Body { get; set; } [JsonPropertyName("SavageFeet")] - public Dictionary>? Feet { get; set; } + public Dictionary? Feet { get; set; } [JsonPropertyName("CustomizationVoice")] public List? VoiceOptions { get; set; } @@ -1309,6 +1309,41 @@ public class Customization public BodyParts? BodyParts { get; set; } } +public class WildHead +{ + [JsonPropertyName("head")] + public string? Head { get; set; } + + [JsonPropertyName("isNotRandom")] + public bool? IsNotRandom { get; set; } + + [JsonPropertyName("NotRandom")] + public bool? NotRandom { get; set; } +} + +public class WildBody +{ + [JsonPropertyName("body")] + public string? Body { get; set; } + + [JsonPropertyName("hands")] + public string? Hands { get; set; } + + [JsonPropertyName("isNotRandom")] + public bool? IsNotRandom { get; set; } +} +public class WildFeet +{ + [JsonPropertyName("feet")] + public string? Feet { get; set; } + + [JsonPropertyName("isNotRandom")] + public bool? IsNotRandom { get; set; } + + [JsonPropertyName("NotRandom")] + public bool? NotRandom { get; set; } +} + public class CustomizationVoice { [JsonPropertyName("voice")] diff --git a/Core/Models/Eft/Common/LocationBase.cs b/Core/Models/Eft/Common/LocationBase.cs index c6246a55..89a6f3ab 100644 --- a/Core/Models/Eft/Common/LocationBase.cs +++ b/Core/Models/Eft/Common/LocationBase.cs @@ -521,7 +521,7 @@ public class BotLocationModifier public double? AccuracySpeed { get; set; } [JsonPropertyName("AdditionalHostilitySettings")] - public AdditionalHostilitySettings[] AdditionalHostilitySettings { get; set; } + public List AdditionalHostilitySettings { get; set; } [JsonPropertyName("DistToActivate")] public double? DistanceToActivate { get; set; } @@ -939,4 +939,4 @@ public enum WildSpawnType pmcbot, bosskilla, bossknight -} \ No newline at end of file +} diff --git a/Core/Models/Eft/Common/Tables/BotBase.cs b/Core/Models/Eft/Common/Tables/BotBase.cs index a5e36ece..b61ed6e9 100644 --- a/Core/Models/Eft/Common/Tables/BotBase.cs +++ b/Core/Models/Eft/Common/Tables/BotBase.cs @@ -300,15 +300,17 @@ public class BaseJsonSkills public class Skills { - public List? Common { get; set; } + public List? Common { get; set; } - public List? Mastering { get; set; } + public List? Mastering { get; set; } public double? Points { get; set; } } public class BaseSkill { + public int? PointsEarnedDuringSession { get; set; } + public long? LastAccess { get; set; } public string? Id { get; set; } public double? Progress { get; set; } @@ -321,8 +323,7 @@ public class BaseSkill public class Common : BaseSkill { - public int? PointsEarnedDuringSession { get; set; } - public long? LastAccess { get; set; } + } public class Mastering : BaseSkill @@ -511,7 +512,7 @@ public class Hideout public Dictionary? Improvements { get; set; } public HideoutCounters? HideoutCounters { get; set; } public double? Seed { get; set; } - public List? MannequinPoses { get; set; } + public Dictionary? MannequinPoses { get; set; } [JsonPropertyName("sptUpdateLastRunTimestamp")] public long? SptUpdateLastRunTimestamp { get; set; } diff --git a/Core/Models/Eft/Common/Tables/BotType.cs b/Core/Models/Eft/Common/Tables/BotType.cs index 8bc1b3af..180b1487 100644 --- a/Core/Models/Eft/Common/Tables/BotType.cs +++ b/Core/Models/Eft/Common/Tables/BotType.cs @@ -1,5 +1,6 @@ using System.Text.Json.Serialization; using Core.Models.Common; +using Core.Models.Enums; using Core.Utils.Json.Converters; namespace Core.Models.Eft.Common.Tables; @@ -332,7 +333,7 @@ public class BodyPart public class BotTypeInventory { [JsonPropertyName("equipment")] - public Dictionary>? Equipment { get; set; } + public Dictionary>? Equipment { get; set; } public GlobalAmmo? Ammo { get; set; } diff --git a/Core/Models/Eft/Common/Tables/Item.cs b/Core/Models/Eft/Common/Tables/Item.cs index d2eb2967..038dc76e 100644 --- a/Core/Models/Eft/Common/Tables/Item.cs +++ b/Core/Models/Eft/Common/Tables/Item.cs @@ -11,6 +11,7 @@ public class Item public string? Template { get; set; } [JsonPropertyName("parentId")] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] public string? ParentId { get; set; } [JsonPropertyName("slotId")] @@ -108,11 +109,17 @@ public class UpdMap public class MapMarker { + [JsonPropertyName("Type")] + public string? Type { get; set; } + [JsonPropertyName("X")] - public int? X { get; set; } + public double? X { get; set; } [JsonPropertyName("Y")] - public int? Y { get; set; } + public double? Y { get; set; } + + [JsonPropertyName("Note")] + public string? Note { get; set; } } public class UpdTag diff --git a/Core/Models/Eft/Common/Tables/RepeatableQuests.cs b/Core/Models/Eft/Common/Tables/RepeatableQuests.cs index 0fd4078a..add060cc 100644 --- a/Core/Models/Eft/Common/Tables/RepeatableQuests.cs +++ b/Core/Models/Eft/Common/Tables/RepeatableQuests.cs @@ -119,7 +119,7 @@ public class ChangeRequirement public List? ChangeCost { get; set; } [JsonPropertyName("changeStandingCost")] - public int? ChangeStandingCost { get; set; } + public double? ChangeStandingCost { get; set; } } public class ChangeCost diff --git a/Core/Models/Eft/Hideout/HideoutCustomizationSetMannequinPoseRequest.cs b/Core/Models/Eft/Hideout/HideoutCustomizationSetMannequinPoseRequest.cs new file mode 100644 index 00000000..658f0967 --- /dev/null +++ b/Core/Models/Eft/Hideout/HideoutCustomizationSetMannequinPoseRequest.cs @@ -0,0 +1,16 @@ +using System.Text.Json.Serialization; + +namespace Core.Models.Eft.Hideout +{ + public class HideoutCustomizationSetMannequinPoseRequest + { + [JsonPropertyName("Action")] + public string? Action { get; set; } = "HideoutCustomizationSetMannequinPose"; + + [JsonPropertyName("poses")] + public Dictionary Poses { get; set; } + + [JsonPropertyName("timestamp")] + public double Timestamp { get; set; } + } +} diff --git a/Core/Models/Eft/Inventory/InventoryCreateMarkerRequestData.cs b/Core/Models/Eft/Inventory/InventoryCreateMarkerRequestData.cs index efbf4119..d9691a2d 100644 --- a/Core/Models/Eft/Inventory/InventoryCreateMarkerRequestData.cs +++ b/Core/Models/Eft/Inventory/InventoryCreateMarkerRequestData.cs @@ -1,4 +1,5 @@ using System.Text.Json.Serialization; +using Core.Models.Eft.Common.Tables; namespace Core.Models.Eft.Inventory; @@ -13,18 +14,3 @@ public class InventoryCreateMarkerRequestData : InventoryBaseActionRequestData [JsonPropertyName("mapMarker")] public MapMarker? MapMarker { get; set; } } - -public class MapMarker -{ - [JsonPropertyName("Type")] - public string? Type { get; set; } - - [JsonPropertyName("X")] - public double? X { get; set; } - - [JsonPropertyName("Y")] - public double? Y { get; set; } - - [JsonPropertyName("Note")] - public string? Note { get; set; } -} \ No newline at end of file diff --git a/Core/Models/Eft/Inventory/InventoryEditMarkerRequestData.cs b/Core/Models/Eft/Inventory/InventoryEditMarkerRequestData.cs index 62719cbf..1bf4a74b 100644 --- a/Core/Models/Eft/Inventory/InventoryEditMarkerRequestData.cs +++ b/Core/Models/Eft/Inventory/InventoryEditMarkerRequestData.cs @@ -1,4 +1,5 @@ using System.Text.Json.Serialization; +using Core.Models.Eft.Common.Tables; namespace Core.Models.Eft.Inventory; @@ -18,4 +19,4 @@ public class InventoryEditMarkerRequestData : InventoryBaseActionRequestData [JsonPropertyName("mapMarker")] public MapMarker? MapMarker { get; set; } -} \ No newline at end of file +} diff --git a/Core/Models/Eft/Match/RaidSettings.cs b/Core/Models/Eft/Match/RaidSettings.cs index b5ef7e56..0498c075 100644 --- a/Core/Models/Eft/Match/RaidSettings.cs +++ b/Core/Models/Eft/Match/RaidSettings.cs @@ -1,4 +1,4 @@ -using System.Text.Json.Serialization; +using System.Text.Json.Serialization; using Core.Models.Enums; using Core.Models.Enums.RaidSettings; using Core.Models.Enums.RaidSettings.TimeAndWeather; @@ -17,7 +17,7 @@ public class RaidSettings public bool? IsLocationTransition { get; set; } [JsonPropertyName("timeVariant")] - public DateTime? TimeVariant { get; set; } + public DateTimeEnum TimeVariant { get; set; } [JsonPropertyName("metabolismDisabled")] public bool? MetabolismDisabled { get; set; } @@ -93,4 +93,4 @@ public class WavesSettings [JsonPropertyName("isTaggedAndCursed")] public bool? IsTaggedAndCursed { get; set; } -} \ No newline at end of file +} diff --git a/Core/Models/Enums/EquipmentSlots.cs b/Core/Models/Enums/EquipmentSlots.cs index 8d736c11..c8d5d33d 100644 --- a/Core/Models/Enums/EquipmentSlots.cs +++ b/Core/Models/Enums/EquipmentSlots.cs @@ -1,19 +1,19 @@ -namespace Core.Models.Enums; +namespace Core.Models.Enums; public enum EquipmentSlots { - HEADWEAR, - EARPIECE, - FACE_COVER, - ARMOR_VEST, - EYEWEAR, - ARM_BAND, - TACTICAL_VEST, - POCKETS, - BACKPACK, - SECURED_CONTAINER, - FIRST_PRIMARY_WEAPON, - SECOND_PRIMARY_WEAPON, - HOLSTER, - SCABBARD -} \ No newline at end of file + Headwear, + Earpiece, + FaceCover, + ArmorVest, + Eyewear, + ArmBand, + TacticalVest, + Pockets, + Backpack, + SecuredContainer, + FirstPrimaryWeapon, + SecondPrimaryWeapon, + Holster, + Scabbard +} diff --git a/Core/Models/Enums/HideoutEventActions.cs b/Core/Models/Enums/HideoutEventActions.cs index d7d0662e..24f82eeb 100644 --- a/Core/Models/Enums/HideoutEventActions.cs +++ b/Core/Models/Enums/HideoutEventActions.cs @@ -1,4 +1,4 @@ -namespace Core.Models.Enums; +namespace Core.Models.Enums; public class HideoutEventActions { @@ -17,4 +17,5 @@ public class HideoutEventActions public const string HIDEOUT_CIRCLE_OF_CULTIST_PRODUCTION_START = "HideoutCircleOfCultistProductionStart"; public const string HIDEOUT_DELETE_PRODUCTION_COMMAND = "HideoutDeleteProductionCommand"; public const string HIDEOUT_CUSTOMIZATION_APPLY_COMMAND = "HideoutCustomizationApply"; + public const string HIDEOUT_CUSTOMIZATION_SET_MANNEQUIN_POSE = "HideoutCustomizationSetMannequinPose"; } diff --git a/Core/Models/Spt/Bots/BotGenerationDetails.cs b/Core/Models/Spt/Bots/BotGenerationDetails.cs index 4d587ec1..e61d7059 100644 --- a/Core/Models/Spt/Bots/BotGenerationDetails.cs +++ b/Core/Models/Spt/Bots/BotGenerationDetails.cs @@ -43,13 +43,13 @@ public class BotGenerationDetails /// Delta of highest level of bot e.g. 50 means 50 levels above player /// [JsonPropertyName("botRelativeLevelDeltaMax")] - public int? BotRelativeLevelDeltaMax { get; set; } + public double? BotRelativeLevelDeltaMax { get; set; } /// /// Delta of lowest level of bot e.g. 50 means 50 levels below player /// [JsonPropertyName("botRelativeLevelDeltaMin")] - public int? BotRelativeLevelDeltaMin { get; set; } + public double? BotRelativeLevelDeltaMin { get; set; } /// /// How many to create and store diff --git a/Core/Models/Spt/Bots/GenerateEquipmentProperties.cs b/Core/Models/Spt/Bots/GenerateEquipmentProperties.cs index b1dc32b1..f558e841 100644 --- a/Core/Models/Spt/Bots/GenerateEquipmentProperties.cs +++ b/Core/Models/Spt/Bots/GenerateEquipmentProperties.cs @@ -1,5 +1,6 @@ using System.Text.Json.Serialization; using Core.Models.Eft.Common.Tables; +using Core.Models.Enums; using Core.Models.Spt.Config; namespace Core.Models.Spt.Bots; @@ -10,13 +11,13 @@ public class GenerateEquipmentProperties /// Root Slot being generated /// [JsonPropertyName("rootEquipmentSlot")] - public string? RootEquipmentSlot { get; set; } + public EquipmentSlots RootEquipmentSlot { get; set; } /// /// Equipment pool for root slot being generated /// [JsonPropertyName("rootEquipmentPool")] - public Dictionary? RootEquipmentPool { get; set; } + public Dictionary? RootEquipmentPool { get; set; } [JsonPropertyName("modPool")] public GlobalMods? ModPool { get; set; } @@ -53,4 +54,4 @@ public class GenerateEquipmentProperties [JsonPropertyName("generatingPlayerLevel")] public int? GeneratingPlayerLevel { get; set; } -} \ No newline at end of file +} diff --git a/Core/Models/Spt/Config/BotConfig.cs b/Core/Models/Spt/Config/BotConfig.cs index 1ccf7089..b9c15c59 100644 --- a/Core/Models/Spt/Config/BotConfig.cs +++ b/Core/Models/Spt/Config/BotConfig.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; using Core.Models.Common; using Core.Models.Eft.Common.Tables; +using Core.Models.Enums; namespace Core.Models.Spt.Config; @@ -479,7 +480,7 @@ public class EquipmentFilterDetails /// Key: equipment slot name e.g. FirstPrimaryWeapon, value: item tpls /// [JsonPropertyName("gear")] - public Dictionary>? Gear { get; set; } + public Dictionary>? Gear { get; set; } /// /// Key: cartridge type e.g. Caliber23x75, value: item tpls diff --git a/Core/Models/Spt/Config/CoreConfig.cs b/Core/Models/Spt/Config/CoreConfig.cs index bd659571..6cf96d9f 100644 --- a/Core/Models/Spt/Config/CoreConfig.cs +++ b/Core/Models/Spt/Config/CoreConfig.cs @@ -1,4 +1,4 @@ -using System.Text.Json.Serialization; +using System.Text.Json.Serialization; using Core.Models.Eft.Game; namespace Core.Models.Spt.Config; @@ -172,15 +172,9 @@ public class ServerFeatures public class ChatbotFeatures { - [JsonPropertyName("sptFriendEnabled")] - public bool SptFriendEnabled { get; set; } - [JsonPropertyName("sptFriendGiftsEnabled")] public bool SptFriendGiftsEnabled { get; set; } - [JsonPropertyName("commandoEnabled")] - public bool CommandoEnabled { get; set; } - [JsonPropertyName("commandoFeatures")] public CommandoFeatures CommandoFeatures { get; set; } @@ -189,10 +183,13 @@ public class ChatbotFeatures [JsonPropertyName("ids")] public Dictionary Ids { get; set; } + + [JsonPropertyName("enabledBots")] + public Dictionary EnabledBots { get; set; } } public class CommandoFeatures { [JsonPropertyName("giveCommandEnabled")] public bool GiveCommandEnabled { get; set; } -} \ No newline at end of file +} diff --git a/Core/Models/Spt/Config/LocationConfig.cs b/Core/Models/Spt/Config/LocationConfig.cs index 35576369..e6b9ffb0 100644 --- a/Core/Models/Spt/Config/LocationConfig.cs +++ b/Core/Models/Spt/Config/LocationConfig.cs @@ -1,4 +1,4 @@ -using System.Text.Json.Serialization; +using System.Text.Json.Serialization; using Core.Models.Common; using Core.Models.Eft.Common; @@ -132,6 +132,12 @@ public class LocationConfig : BaseConfig [JsonPropertyName("reserveRaiderSpawnChanceOverrides")] public ReserveRaiderSpawnChanceOverrides ReserveRaiderSpawnChanceOverrides { get; set; } + /// + /// Containers to remove all children from when generating static/loose loot + /// + [JsonPropertyName("tplsToStripChildItemsFrom")] + public List TplsToStripChildItemsFrom { get; set; } + /// /// Map ids players cannot visit /// diff --git a/Core/Models/Spt/Config/PlayerScavConfig.cs b/Core/Models/Spt/Config/PlayerScavConfig.cs index 7df449a9..a31fe71e 100644 --- a/Core/Models/Spt/Config/PlayerScavConfig.cs +++ b/Core/Models/Spt/Config/PlayerScavConfig.cs @@ -1,5 +1,6 @@ using System.Text.Json.Serialization; using Core.Models.Eft.Common.Tables; +using Core.Models.Enums; namespace Core.Models.Spt.Config; @@ -24,7 +25,7 @@ public class KarmaLevel public Dictionary ItemLimits { get; set; } [JsonPropertyName("equipmentBlacklist")] - public Dictionary EquipmentBlacklist { get; set; } + public Dictionary EquipmentBlacklist { get; set; } [JsonPropertyName("labsAccessCardChancePercent")] public double? LabsAccessCardChancePercent { get; set; } diff --git a/Core/Models/Spt/Config/PmcConfig.cs b/Core/Models/Spt/Config/PmcConfig.cs index e2ab433b..a3be7e67 100644 --- a/Core/Models/Spt/Config/PmcConfig.cs +++ b/Core/Models/Spt/Config/PmcConfig.cs @@ -12,11 +12,11 @@ public class PmcConfig : BaseConfig /** What game version should the PMC have */ [JsonPropertyName("gameVersionWeight")] - public Dictionary GameVersionWeight { get; set; } + public Dictionary GameVersionWeight { get; set; } /** What account type should the PMC have */ [JsonPropertyName("accountTypeWeight")] - public Dictionary AccountTypeWeight { get; set; } + public Dictionary AccountTypeWeight { get; set; } /** Global whitelist/blacklist of vest loot for PMCs */ [JsonPropertyName("vestLoot")] @@ -76,7 +76,7 @@ public class PmcConfig : BaseConfig public Dictionary>> PmcType { get; set; } [JsonPropertyName("maxBackpackLootTotalRub")] - public List MaxBackpackLootTotalRub { get; set; } + public List MaxBackpackLootTotalRub { get; set; } [JsonPropertyName("maxPocketLootTotalRub")] public double MaxPocketLootTotalRub { get; set; } @@ -115,6 +115,9 @@ public class PmcConfig : BaseConfig [JsonPropertyName("addPrefixToSameNamePMCAsPlayerChance")] public int? AddPrefixToSameNamePMCAsPlayerChance { get; set; } + + [JsonPropertyName("lootItemLimitsRub")] + public List? LootItemLimitsRub { get; set; } } public class HostilitySettings @@ -164,8 +167,17 @@ public class SlotLootSettings public List Blacklist { get; set; } } -public class IMinMaxLootValue : MinMax +public class MinMaxLootValue : MinMax { [JsonPropertyName("value")] public double Value { get; set; } + + [JsonPropertyName("backpack")] + public MinMax Backpack { get; set; } + + [JsonPropertyName("pocket")] + public MinMax Pocket { get; set; } + + [JsonPropertyName("vest")] + public MinMax Vest { get; set; } } diff --git a/Core/Models/Spt/Config/SeasonalEventConfig.cs b/Core/Models/Spt/Config/SeasonalEventConfig.cs index 8a117b3e..4b5b74e4 100644 --- a/Core/Models/Spt/Config/SeasonalEventConfig.cs +++ b/Core/Models/Spt/Config/SeasonalEventConfig.cs @@ -15,11 +15,11 @@ public class SeasonalEventConfig : BaseConfig /** event / botType / equipSlot / itemid */ [JsonPropertyName("eventGear")] - public Dictionary>>> EventGear { get; set; } + public Dictionary>>> EventGear { get; set; } /** event / bot type / equipSlot / itemid */ [JsonPropertyName("eventLoot")] - public Dictionary>>> EventLoot { get; set; } + public Dictionary>>> EventLoot { get; set; } [JsonPropertyName("events")] public List Events { get; set; } @@ -77,38 +77,78 @@ public class SeasonalEvent public int EndMonth { get; set; } [JsonPropertyName("settings")] - public Dictionary Settings { get; set; } // TODO: Type was Record + public SeasonalEventSettings? Settings { get; set; } [JsonPropertyName("setting")] - public Dictionary SettingsDoNOTUse { set => Settings = value; } + public SeasonalEventSettings? SettingsDoNOTUse { set => Settings = value; } } public class SeasonalEventSettings { - [JsonPropertyName("enabled")] - public bool Enabled { get; set; } + [JsonPropertyName("enableSummoning")] + public bool? EnableSummoning { get; set; } + + [JsonPropertyName("enableHalloweenHideout")] + public bool? EnableHalloweenHideout { get; set; } + + [JsonPropertyName("enableChristmasHideout")] + public bool? EnableChristmasHideout { get; set; } + + [JsonPropertyName("enableSanta")] + public bool? EnableSanta { get; set; } + + [JsonPropertyName("adjustBotAppearances")] + public bool? AdjustBotAppearances { get; set; } + + [JsonPropertyName("addEventGearToBots")] + public bool? AddEventGearToBots { get; set; } + + [JsonPropertyName("addEventLootToBots")] + public bool? AddEventLootToBots { get; set; } + + [JsonPropertyName("removeEntryRequirement")] + public List? RemoveEntryRequirement { get; set; } + + [JsonPropertyName("replaceBotHostility")] + public bool? ReplaceBotHostility { get; set; } + + [JsonPropertyName("forceSeason")] + public Season? ForceSeason { get; set; } + + [JsonPropertyName("zombieSettings")] + public ZombieSettings? ZombieSettings { get; set; } + + [JsonPropertyName("disableBosses")] + public List? DisableBosses { get; set; } + + [JsonPropertyName("disableWaves")] + public List? DisableWaves { get; set; } + } -public class ZombieSettings : SeasonalEventSettings +public class ZombieSettings { + [JsonPropertyName("enabled")] + public bool? Enabled { get; set; } + [JsonPropertyName("mapInfectionAmount")] - public Dictionary MapInfectionAmount { get; set; } + public Dictionary? MapInfectionAmount { get; set; } [JsonPropertyName("disableBosses")] - public List DisableBosses { get; set; } + public List? DisableBosses { get; set; } [JsonPropertyName("disableWaves")] - public List DisableWaves { get; set; } + public List? DisableWaves { get; set; } } public class GifterSetting { [JsonPropertyName("map")] - public string Map { get; set; } + public string? Map { get; set; } [JsonPropertyName("zones")] - public string Zones { get; set; } + public string? Zones { get; set; } [JsonPropertyName("spawnChance")] - public int SpawnChance { get; set; } + public int? SpawnChance { get; set; } } diff --git a/Core/Models/Spt/Dialog/SendMessageDetails.cs b/Core/Models/Spt/Dialog/SendMessageDetails.cs index d8e2ebc3..c09793dc 100644 --- a/Core/Models/Spt/Dialog/SendMessageDetails.cs +++ b/Core/Models/Spt/Dialog/SendMessageDetails.cs @@ -53,7 +53,7 @@ public class SendMessageDetails /// Optional - How long items will be stored in mail before expiry /// [JsonPropertyName("itemsMaxStorageLifetimeSeconds")] - public int? ItemsMaxStorageLifetimeSeconds { get; set; } + public long? ItemsMaxStorageLifetimeSeconds { get; set; } /// /// Optional - Used when sending messages from traders who send text from locale json diff --git a/Core/Routers/ItemEvents/HideoutItemEventRouter.cs b/Core/Routers/ItemEvents/HideoutItemEventRouter.cs index 43f50174..43eedc00 100644 --- a/Core/Routers/ItemEvents/HideoutItemEventRouter.cs +++ b/Core/Routers/ItemEvents/HideoutItemEventRouter.cs @@ -1,4 +1,4 @@ -using Core.Annotations; +using Core.Annotations; using Core.Callbacks; using Core.DI; using Core.Models.Eft.Common; @@ -11,7 +11,7 @@ namespace Core.Routers.ItemEvents; [Injectable(InjectableTypeOverride = typeof(ItemEventRouterDefinition))] public class HideoutItemEventRouter : ItemEventRouterDefinition { - protected HideoutCallbacks _hideoutCallbacks; + private readonly HideoutCallbacks _hideoutCallbacks; public HideoutItemEventRouter ( @@ -38,7 +38,8 @@ public class HideoutItemEventRouter : ItemEventRouterDefinition new HandledRoute(HideoutEventActions.HIDEOUT_CANCEL_PRODUCTION_COMMAND, false), new HandledRoute(HideoutEventActions.HIDEOUT_CIRCLE_OF_CULTIST_PRODUCTION_START, false), new HandledRoute(HideoutEventActions.HIDEOUT_DELETE_PRODUCTION_COMMAND, false), - new HandledRoute(HideoutEventActions.HIDEOUT_CUSTOMIZATION_APPLY_COMMAND, false) + new HandledRoute(HideoutEventActions.HIDEOUT_CUSTOMIZATION_APPLY_COMMAND, false), + new HandledRoute(HideoutEventActions.HIDEOUT_CUSTOMIZATION_SET_MANNEQUIN_POSE, false) }; } @@ -75,6 +76,8 @@ public class HideoutItemEventRouter : ItemEventRouterDefinition return _hideoutCallbacks.HideoutDeleteProductionCommand(pmcData, body as HideoutDeleteProductionRequestData, sessionID); case HideoutEventActions.HIDEOUT_CUSTOMIZATION_APPLY_COMMAND: return _hideoutCallbacks.HideoutCustomizationApplyCommand(pmcData, body as HideoutCustomizationApplyRequestData, sessionID); + case HideoutEventActions.HIDEOUT_CUSTOMIZATION_SET_MANNEQUIN_POSE: + return _hideoutCallbacks.HideoutCustomizationSetMannequinPose(pmcData, body as HideoutCustomizationSetMannequinPoseRequest, sessionID); default: throw new Exception($"HideoutItemEventRouter being used when it cant handle route {url}"); } diff --git a/Core/Services/BotEquipmentFilterService.cs b/Core/Services/BotEquipmentFilterService.cs index 1c8ea8a0..260d01ab 100644 --- a/Core/Services/BotEquipmentFilterService.cs +++ b/Core/Services/BotEquipmentFilterService.cs @@ -1,13 +1,26 @@ using Core.Annotations; using Core.Models.Eft.Common.Tables; +using Core.Models.Enums; using Core.Models.Spt.Bots; using Core.Models.Spt.Config; +using Core.Servers; namespace Core.Services; [Injectable(InjectionType.Singleton)] public class BotEquipmentFilterService { + private readonly ConfigServer _configServer; + private readonly BotConfig _botConfig; + + public BotEquipmentFilterService( + ConfigServer configServer) + { + _configServer = configServer; + + _botConfig = _configServer.GetConfig(ConfigTypes.BOT); + } + /// /// Filter a bots data to exclude equipment and cartridges defines in the botConfig /// @@ -74,9 +87,12 @@ public class BotEquipmentFilterService /// Role of the bot we want the blacklist for /// Level of the player /// EquipmentBlacklistDetails object - public EquipmentFilterDetails GetBotEquipmentBlacklist(string botRole, int playerLevel) + public EquipmentFilterDetails? GetBotEquipmentBlacklist(string botRole, double playerLevel) { - throw new NotImplementedException(); + var blacklistDetailsForBot = _botConfig.Equipment.GetValueOrDefault(botRole, null); + + return blacklistDetailsForBot?.Blacklist?.FirstOrDefault( + (equipmentFilter) => playerLevel >= equipmentFilter.LevelRange.Min && playerLevel <= equipmentFilter.LevelRange.Max); } /// diff --git a/Core/Services/BotNameService.cs b/Core/Services/BotNameService.cs index 8e118135..c6b63a7b 100644 --- a/Core/Services/BotNameService.cs +++ b/Core/Services/BotNameService.cs @@ -1,12 +1,47 @@ -using Core.Annotations; +using Core.Annotations; using Core.Models.Eft.Common.Tables; using Core.Models.Spt.Bots; +using Core.Helpers; +using Core.Models.Enums; +using Core.Models.Spt.Config; +using Core.Servers; +using ILogger = Core.Models.Utils.ILogger; +using Core.Utils; namespace Core.Services; [Injectable(InjectionType.Singleton)] public class BotNameService { + private readonly ILogger _logger; + private readonly BotHelper _botHelper; + private readonly RandomUtil _randomUtil; + private readonly LocalisationService _localisationService; + private readonly DatabaseService _databaseService; + private readonly ConfigServer _configServer; + private readonly BotConfig _botConfig; + + private readonly HashSet _usedNameCache; + + public BotNameService( + ILogger logger, + BotHelper botHelper, + RandomUtil randomUtil, + LocalisationService localisationService, + DatabaseService databaseService, + ConfigServer configServer) + { + _logger = logger; + _botHelper = botHelper; + _randomUtil = randomUtil; + _localisationService = localisationService; + _databaseService = databaseService; + _configServer = configServer; + + _botConfig = _configServer.GetConfig(ConfigTypes.BOT); + _usedNameCache = new HashSet(); + } + /// /// Clear out any entries in Name Set /// @@ -22,7 +57,6 @@ public class BotNameService /// /// role of bot e.g. assault /// Lowercase roles to always make unique - /// OPTIONAL: profile session id /// Nickname for bot public string GenerateUniqueBotNickname( BotType botJsonTemplate, @@ -30,7 +64,68 @@ public class BotNameService string botRole, List uniqueRoles = null) { - throw new NotImplementedException(); + var isPmc = botGenerationDetails.IsPmc; + + // Never show for players + var showTypeInNickname = !botGenerationDetails.IsPlayerScav.GetValueOrDefault(false) && _botConfig.ShowTypeInNickname; + var roleShouldBeUnique = uniqueRoles?.Contains(botRole.ToLower()); + + var isUnique = true; + var attempts = 0; + while (attempts <= 5) + { + // Get bot name with leading/trailing whitespace removed + var name = (isPmc.GetValueOrDefault(false)) // Explicit handling of PMCs, all other bots will get "first_name last_name" + ? _botHelper.GetPmcNicknameOfMaxLength(_botConfig.BotNameLengthLimit, botGenerationDetails.Side) + : $"{ _randomUtil.GetArrayValue(botJsonTemplate.FirstNames)} {_randomUtil.GetArrayValue(botJsonTemplate.LastNames)}"; + + name = name.Trim(); + + // Config is set to add role to end of bot name + if (showTypeInNickname) + { + name += $" { botRole}"; + } + + // Replace pmc bot names with player name + prefix + if (botGenerationDetails.IsPmc.GetValueOrDefault(false) && botGenerationDetails.AllPmcsHaveSameNameAsPlayer.GetValueOrDefault(false)) + { + var prefix = _localisationService.GetRandomTextThatMatchesPartialKey("pmc-name_prefix_"); + name = $"{prefix} { name}"; + } + + // Is this a role that must be unique + if (roleShouldBeUnique.GetValueOrDefault(false)) + { + // Check name in cache + isUnique = _usedNameCache.Contains(name); + if (!isUnique) + { + // Not unique + if (attempts >= 5) + { + // 5 attempts to generate a name, pool probably isn't big enough + var genericName = $"{ botGenerationDetails.Side} { _randomUtil.GetInt(100000, 999999)}"; + _logger.Debug($"Failed to find unique name for: { botRole} ${ botGenerationDetails.Side} after 5 attempts, using: ${ genericName}"); + + return genericName; + } + + attempts++; + + // Try again + continue; + } + } + + // Add bot name to cache to prevent being used again + _usedNameCache.Add(name); + + return name; + } + + // Should never reach here + return $"BOT {botRole} {botGenerationDetails.BotDifficulty}"; } /// @@ -39,15 +134,23 @@ public class BotNameService /// Bot to update public void AddRandomPmcNameToBotMainProfileNicknameProperty(BotBase bot) { - throw new NotImplementedException(); + // Simulate bot looking like a player scav with the PMC name in brackets. + // E.g. "ScavName (PMC Name)" + bot.Info.MainProfileNickname = GetRandomPmcName(); } /// /// Choose a random PMC name from bear or usec bot jsons /// /// PMC name as string - protected string GetRandomPMCName() + protected string GetRandomPmcName() { - throw new NotImplementedException(); + var bots = _databaseService.GetBots().Types; + + var pmcNames = new List(); + pmcNames.AddRange(bots["usec"].FirstNames); + pmcNames.AddRange(bots["bear"].FirstNames); + + return _randomUtil.GetArrayValue(pmcNames); } } diff --git a/Core/Services/GiftService.cs b/Core/Services/GiftService.cs index 337a8c5a..70bae763 100644 --- a/Core/Services/GiftService.cs +++ b/Core/Services/GiftService.cs @@ -2,7 +2,9 @@ using Core.Annotations; using Core.Helpers; using Core.Models.Enums; using Core.Models.Spt.Config; +using Core.Models.Spt.Dialog; using Core.Servers; +using Core.Utils; using ILogger = Core.Models.Utils.ILogger; namespace Core.Services; @@ -11,18 +13,34 @@ namespace Core.Services; public class GiftService { private readonly ILogger _logger; - private readonly ConfigServer _configServer; + + private readonly MailSendService _mailSendService; + private readonly LocalisationService _localisationService; + private readonly HashUtil _hashUtil; + private readonly TimeUtil _timeUtil; private readonly ProfileHelper _profileHelper; + private readonly ConfigServer _configServer; + private readonly GiftsConfig _giftConfig; - public GiftService( + public GiftService + ( ILogger logger, - ConfigServer configServer, - ProfileHelper profileHelper) + MailSendService mailSendService, + LocalisationService localisationService, + HashUtil hashUtil, + TimeUtil timeUtil, + ProfileHelper profileHelper, + ConfigServer configServer + ) { _logger = logger; - _configServer = configServer; + _mailSendService = mailSendService; + _localisationService = localisationService; + _hashUtil = hashUtil; + _timeUtil = timeUtil; _profileHelper = profileHelper; + _configServer = configServer; _giftConfig = _configServer.GetConfig(); } @@ -34,7 +52,7 @@ public class GiftService */ public bool GiftExists(string giftId) { - throw new NotImplementedException(); + return _giftConfig.Gifts[giftId] is not null; } public Gift GetGiftById(string giftId) @@ -50,7 +68,7 @@ public class GiftService */ public Dictionary GetGifts() { - throw new NotImplementedException(); + return _giftConfig.Gifts; } /** @@ -59,7 +77,7 @@ public class GiftService */ public List GetGiftIds() { - throw new NotImplementedException(); + return _giftConfig.Gifts.Keys.ToList(); } /** @@ -90,7 +108,96 @@ public class GiftService _logger.Warning($"Gift {giftId} has items but no collection time limit, defaulting to 48 hours"); } - throw new NotImplementedException(); + // Handle system messsages + if (giftData.Sender == GiftSenderType.System) + { + // Has a localisable text id to send to player + if (giftData.LocaleTextId is not null) + { + _mailSendService.SendLocalisedSystemMessageToPlayer( + playerId, + giftData.LocaleTextId, + giftData.Items, + giftData.ProfileChangeEvents, + _timeUtil.GetHoursAsSeconds(giftData.CollectionTimeHours ?? 1)); + } + else + { + _mailSendService.SendSystemMessageToPlayer( + playerId, + giftData.MessageText, + giftData.Items, + _timeUtil.GetHoursAsSeconds(giftData.CollectionTimeHours ?? 1), + giftData.ProfileChangeEvents); + } + } + // Handle user messages + else if (giftData.Sender == GiftSenderType.User) + { + _mailSendService.SendUserMessageToPlayer( + playerId, + giftData.SenderDetails, + giftData.MessageText, + giftData.Items, + _timeUtil.GetHoursAsSeconds(giftData.CollectionTimeHours ?? 1)); + } + else if (giftData.Sender == GiftSenderType.Trader) + { + if (giftData.LocaleTextId is not null) + { + _mailSendService.SendLocalisedNpcMessageToPlayer( + playerId, + giftData.Trader, + MessageType.MESSAGE_WITH_ITEMS, + giftData.LocaleTextId, + giftData.Items, + _timeUtil.GetHoursAsSeconds(giftData.CollectionTimeHours ?? 1), + null, + null + ); + } + else + { + _mailSendService.SendLocalisedNpcMessageToPlayer( + playerId, + giftData.Trader, + MessageType.MESSAGE_WITH_ITEMS, + giftData.MessageText, + giftData.Items, + _timeUtil.GetHoursAsSeconds(giftData.CollectionTimeHours ?? 1), + null, + null + ); + } + } + else + { + // TODO: further split out into different message systems like above SYSTEM method + // Trader / ragfair + SendMessageDetails details = new () { + RecipientId = playerId, + Sender = GetMessageType(giftData), + SenderDetails = new () + { + Id = GetSenderId(giftData), + Aid = 1234567, // TODO - pass proper aid value + Info = null, + }, + MessageText = giftData.MessageText, + Items = giftData.Items, + ItemsMaxStorageLifetimeSeconds = _timeUtil.GetHoursAsSeconds(giftData.CollectionTimeHours ?? 0), + }; + + if (giftData.Trader is not null) { + details.Trader = giftData.Trader; + } + + _mailSendService.SendMessageToPlayer(details); + } + + _profileHelper.FlagGiftReceivedInProfile(playerId, giftId, maxGiftsToSendCount); + + return GiftSentResult.SUCCESS; } /** @@ -98,9 +205,19 @@ public class GiftService * @param giftData Gift to send player * @returns trader/user/system id */ - protected string? GetSenderId(Gift giftData) + private string? GetSenderId(Gift giftData) { - throw new NotImplementedException(); + if (giftData.Sender == GiftSenderType.Trader) + { + return Enum.GetName(typeof(GiftSenderType), giftData.Sender); + } + + if (giftData.Sender == GiftSenderType.User) + { + return giftData.Sender.ToString(); + } + + return null; } /** @@ -110,7 +227,18 @@ public class GiftService */ protected MessageType? GetMessageType(Gift giftData) { - throw new NotImplementedException(); + switch (giftData.Sender) + { + case GiftSenderType.System: + return MessageType.SYSTEM_MESSAGE; + case GiftSenderType.Trader: + return MessageType.NPC_TRADER; + case GiftSenderType.User: + return MessageType.USER_MESSAGE; + default: + _logger.Error(_localisationService.GetText("gift-unable_to_handle_message_type_command", giftData.Sender)); + return null; + } } /** diff --git a/Core/Services/ItemFilterService.cs b/Core/Services/ItemFilterService.cs index ed6a865f..b3f1fbd7 100644 --- a/Core/Services/ItemFilterService.cs +++ b/Core/Services/ItemFilterService.cs @@ -1,10 +1,38 @@ -using Core.Annotations; +using Core.Annotations; +using Core.Models.Enums; +using Core.Models.Spt.Config; +using Core.Servers; +using Core.Utils.Cloners; +using ILogger = Core.Models.Utils.ILogger; namespace Core.Services; [Injectable(InjectionType.Singleton)] public class ItemFilterService { + private readonly ILogger _logger; + private readonly ICloner _cloner; + private readonly DatabaseServer _databaseServer; + private readonly ConfigServer _configServer; + + private readonly HashSet _lootableItemBlacklistCache = []; + private readonly ItemConfig _itemConfig; + + public ItemFilterService( + ILogger logger, + ICloner cloner, + DatabaseServer databaseServer, + ConfigServer configServer + ) + { + _logger = logger; + _cloner = cloner; + _databaseServer = databaseServer; + _configServer = configServer; + + _itemConfig = _configServer.GetConfig(ConfigTypes.ITEM); + } + /** * Check if the provided template id is blacklisted in config/item.json/blacklist * @param tpl template id @@ -89,4 +117,16 @@ public class ItemFilterService { throw new NotImplementedException(); } + + public bool IsLootableItemBlacklisted(string itemKey) + { + if (_lootableItemBlacklistCache.Count == 0) + { + foreach (var item in _itemConfig.LootableItemBlacklist) { + _lootableItemBlacklistCache.Add(item); + } + } + + return _lootableItemBlacklistCache.Contains(itemKey); + } } diff --git a/Core/Services/MailSendService.cs b/Core/Services/MailSendService.cs new file mode 100644 index 00000000..3b9bef99 --- /dev/null +++ b/Core/Services/MailSendService.cs @@ -0,0 +1,565 @@ +using Core.Annotations; +using Core.Helpers; +using Core.Models.Eft.Common.Tables; +using Core.Models.Eft.Profile; +using Core.Models.Enums; +using Core.Models.Spt.Dialog; +using Core.Servers; +using Core.Utils; +using ILogger = Core.Models.Utils.ILogger; + +namespace Core.Services; + +[Injectable] +public class MailSendService +{ + private readonly ILogger _logger; + private readonly HashUtil _hashUtil; + private readonly TimeUtil _timeUtil; + private readonly SaveServer _saveServer; + private readonly DatabaseService _databaseService; + private readonly NotifierHelper _notifierHelper; + private readonly DialogueHelper _dialogueHelper; + private readonly NotificationSendHelper _notificationSendHelper; + private readonly LocalisationService _localisationService; + private readonly ItemHelper _itemHelper; + private readonly TraderHelper _traderHelper; + + private const string _systemSenderId = "59e7125688a45068a6249071"; + private readonly List _messageTypes = [MessageType.NPC_TRADER, MessageType.FLEAMARKET_MESSAGE]; + private readonly List _slotNames = ["hideout", "main"]; + + public MailSendService + ( + ILogger logger, + HashUtil hashUtil, + TimeUtil timeUtil, + SaveServer saveServer, + DatabaseService databaseService, + NotifierHelper notifierHelper, + DialogueHelper dialogueHelper, + NotificationSendHelper notificationSendHelper, + LocalisationService localisationService, + ItemHelper itemHelper, + TraderHelper traderHelper + ) + { + _logger = logger; + _hashUtil = hashUtil; + _timeUtil = timeUtil; + _saveServer = saveServer; + _databaseService = databaseService; + _notifierHelper = notifierHelper; + _dialogueHelper = dialogueHelper; + _localisationService = localisationService; + _itemHelper = itemHelper; + _traderHelper = traderHelper; + } + + /** + * Send a message from an NPC (e.g. prapor) to the player with or without items using direct message text, do not look up any locale + * @param sessionId The session ID to send the message to + * @param trader The trader sending the message + * @param messageType What type the message will assume (e.g. QUEST_SUCCESS) + * @param message Text to send to the player + * @param items Optional items to send to player + * @param maxStorageTimeSeconds Optional time to collect items before they expire + */ + public void SendDirectNpcMessageToPlayer( + string sessionId, + string trader, + MessageType messageType, + string message, + List? items, + long? maxStorageTimeSeconds, + SystemData? systemData, + MessageContentRagfair? ragfair + ) + { + if (trader is null) + { + _logger.Error(_localisationService.GetText("mailsend-missing_trader", new + { + MessageType = messageType, + SessionId = sessionId, + })); + + return; + } + + SendMessageDetails details = new() + { + RecipientId = sessionId, + Sender = messageType, + DialogType = MessageType.NPC_TRADER, + Trader = trader, + MessageText = message, + Items = new () + }; + + // Add items to message + if (items?.Count > 0) + { + details.Items.AddRange(items); + details.ItemsMaxStorageLifetimeSeconds = maxStorageTimeSeconds ?? 172800; + } + + if (systemData is not null) + details.SystemData = systemData; + + if (ragfair is not null) + details.RagfairDetails = ragfair; + + SendMessageToPlayer(details); + } + + /** + * Send a message from an NPC (e.g. prapor) to the player with or without items + * @param sessionId The session ID to send the message to + * @param trader The trader sending the message + * @param messageType What type the message will assume (e.g. QUEST_SUCCESS) + * @param messageLocaleId The localised text to send to player + * @param items Optional items to send to player + * @param maxStorageTimeSeconds Optional time to collect items before they expire + */ + public void SendLocalisedNpcMessageToPlayer( + string sessionId, + string trader, + MessageType messageType, + string messageLocaleId, + List? items, + long? maxStorageTimeSeconds, + SystemData? systemData, + MessageContentRagfair? ragfair + ) + { + if (trader is null) + { + _logger.Error(_localisationService.GetText("mailsend-missing_trader", new + { + MessageType = messageType, + SessionId = sessionId, + })); + + return; + } + + SendMessageDetails details = new() + { + RecipientId = sessionId, + Sender = messageType, + DialogType = MessageType.NPC_TRADER, + Trader = trader, + TemplateId = messageLocaleId, + Items = new() + }; + + // add items to message + + if (items?.Count > 0) + { + details.Items.AddRange(items); + details.ItemsMaxStorageLifetimeSeconds = maxStorageTimeSeconds ?? 172800; + } + + if (systemData is not null) + details.SystemData = systemData; + + if (ragfair is not null) + details.RagfairDetails = ragfair; + + SendMessageToPlayer(details); + } + + /** + * Send a message from SYSTEM to the player with or without items + * @param sessionId The session ID to send the message to + * @param message The text to send to player + * @param items Optional items to send to player + * @param maxStorageTimeSeconds Optional time to collect items before they expire + */ + public void SendSystemMessageToPlayer( + string sessionId, + string message, + List? items, + long? maxStorageTimeSeconds, + List? profileChangeEvents) + { + SendMessageDetails details = new() + { + RecipientId = sessionId, + Sender = MessageType.SYSTEM_MESSAGE, + MessageText = message, + Items = new() + }; + + // add items to message + if (items?.Count > 0) + { + var rootItemParentId = _hashUtil.Generate(); + + details.Items.AddRange(_itemHelper.AdoptOrphanedItems(rootItemParentId, items)); + details.ItemsMaxStorageLifetimeSeconds = maxStorageTimeSeconds ?? 172800; + } + + if ((profileChangeEvents?.Count ?? 0) > 0) + details.ProfileChangeEvents = profileChangeEvents; + + SendMessageToPlayer(details); + } + + public void SendLocalisedSystemMessageToPlayer( + string sessionId, + string messageLocaleId, + List? items, + List? profileChangeEvents, + long? maxStorageTimeSeconds + ) + { + SendMessageDetails details = new() + { + RecipientId = sessionId, + Sender = MessageType.SYSTEM_MESSAGE, + TemplateId = messageLocaleId, + Items = new() + }; + + // add items to message + if (items?.Count > 0) + { + details.Items.AddRange(items); + details.ItemsMaxStorageLifetimeSeconds = maxStorageTimeSeconds ?? 172800; + } + + if ((profileChangeEvents?.Count ?? 0) > 0) + details.ProfileChangeEvents = profileChangeEvents; + + SendMessageToPlayer(details); + } + + /** + * Send a USER message to a player with or without items + * @param sessionId The session ID to send the message to + * @param senderId Who is sending the message + * @param message The text to send to player + * @param items Optional items to send to player + * @param maxStorageTimeSeconds Optional time to collect items before they expire + */ + public void SendUserMessageToPlayer( + string sessionId, + UserDialogInfo senderDetails, + string message, + List? items, + long? maxStorageTimeSeconds + ) + { + SendMessageDetails details = new() + { + RecipientId = sessionId, + Sender = MessageType.USER_MESSAGE, + SenderDetails = senderDetails, + MessageText = message, + Items = new () + }; + + // add items to message + if (items?.Count > 0) + { + details.Items.AddRange(items); + details.ItemsMaxStorageLifetimeSeconds = maxStorageTimeSeconds ?? 172800; + } + + SendMessageToPlayer(details); + } + + /** + * Large function to send messages to players from a variety of sources (SYSTEM/NPC/USER) + * Helper functions in this class are available to simplify common actions + * @param messageDetails Details needed to send a message to the player + */ + public void SendMessageToPlayer(SendMessageDetails messageDetails) + { + // Get dialog, create if doesn't exist + var senderDialog = GetDialog(messageDetails); + + // Flag dialog as containing a new message to player + senderDialog.New++; + + // Craft message + var message = CreateDialogMessage(senderDialog.Id, messageDetails); + + // Create items array + // Generate item stash if we have rewards. + var itemsToSendToPlayer = ProcessItemsBeforeAddingToMail(senderDialog.Type, messageDetails); + + // If there's items to send to player, flag dialog as containing attachments + if ((itemsToSendToPlayer.Data?.Count ?? 0) > 0) + { + senderDialog.AttachmentsNew += 1; + } + + // Store reward items inside message and set appropriate flags inside message + AddRewardItemsToMessage(message, itemsToSendToPlayer, messageDetails.ItemsMaxStorageLifetimeSeconds); + + if (messageDetails.ProfileChangeEvents is not null) + message.ProfileChangeEvents = messageDetails.ProfileChangeEvents; + + // Add message to dialog + senderDialog.Messages.Add(message); + + // TODO: clean up old code here + // Offer Sold notifications are now separate from the main notification + if ( + _messageTypes.Contains(senderDialog.Type ?? MessageType.SYSTEM_MESSAGE) && + messageDetails?.RagfairDetails is not null + ) + { + var offerSoldMessage = _notifierHelper.CreateRagfairOfferSoldNotification( + message, + messageDetails.RagfairDetails + ); + _notificationSendHelper.SendMessage(messageDetails.RecipientId, offerSoldMessage); + message.MessageType = MessageType.MESSAGE_WITH_ITEMS; // Should prevent getting the same notification popup twice + } + + // Send message off to player so they get it in client + var notificationMessage = _notifierHelper.CreateNewMessageNotification(message); + _notificationSendHelper.SendMessage(messageDetails.RecipientId, notificationMessage); + } + + public void SendPlayerMessageToNpc(string sessionId, string targetNpcId, string message) + { + var playerProfile = _saveServer.GetProfile(sessionId); + var dialogWithNpc = playerProfile.DialogueRecords[targetNpcId]; + if (dialogWithNpc is null) + { + _logger.Error(_localisationService.GetText("mailsend-missing_npc_dialog", targetNpcId)); + return; + } + + dialogWithNpc.Messages.Add(new() + { + Id = _hashUtil.Generate(), + DateTime = _timeUtil.GetTimeStamp(), + HasRewards = false, + UserId = playerProfile.CharacterData.PmcData.Id, + MessageType = MessageType.USER_MESSAGE, + RewardCollected = false, + Text = message + }); + } + + private Message CreateDialogMessage(string dialogId, SendMessageDetails messageDetails) + { + Message message = new() + { + Id = _hashUtil.Generate(), + UserId = dialogId, + MessageType = messageDetails.DialogType, + DateTime = _timeUtil.GetTimeStamp(), + Text = (messageDetails.TemplateId is not null) ? "" : messageDetails.MessageText, + TemplateId = messageDetails.TemplateId, + HasRewards = false, + RewardCollected = false, + SystemData = messageDetails.SystemData is not null ? messageDetails.SystemData : null, + ProfileChangeEvents = (messageDetails.ProfileChangeEvents?.Count == 0) ? messageDetails.ProfileChangeEvents : null + }; + + // Clean up empty system data + // if (message.SystemData is null) { + // delete message.SystemData; + // } + + // Clean up empty template id + // if (message.TemplateId is null) + // delete message.templateId; + + return message; + } + + /** + * Add items to message and adjust various properties to reflect the items being added + * @param message Message to add items to + * @param itemsToSendToPlayer Items to add to message + * @param maxStorageTimeSeconds total time items are stored in mail before being deleted + */ + private void AddRewardItemsToMessage(Message message, MessageItems? itemsToSendToPlayer, long? maxStorageTimeSeconds) + { + if ((itemsToSendToPlayer?.Data?.Count ?? 0) > 0) + { + message.Items = itemsToSendToPlayer; + message.HasRewards = true; + message.MaxStorageTime = maxStorageTimeSeconds; + message.RewardCollected = false; + } + } + + private MessageItems ProcessItemsBeforeAddingToMail(MessageType? dialogType, SendMessageDetails messageDetails) + { + var items = _databaseService.GetItems(); + + MessageItems itemsToSendToPlayer = new(); + if ((messageDetails.Items?.Count ?? 0) > 0) + { + // Find base item that should be the 'primary' + have its parent id be used as the dialogs 'stash' value + var parentItem = GetBaseItemFromRewards(messageDetails.Items); + if (parentItem is null) + { + _localisationService.GetText("mailsend-missing_parent", new + { + TraderId = messageDetails.Trader, + Sender = messageDetails.Sender, + }); + + return itemsToSendToPlayer; + } + + // No parent id, generate random id and add (doesn't need to be actual parentId from db, only unique) + if (parentItem?.ParentId is null) + parentItem.ParentId = _hashUtil.Generate(); + + itemsToSendToPlayer = new() + { + Stash = parentItem.ParentId, Data = new() + }; + + // Ensure Ids are unique and cont collide with items in player inventory later + messageDetails.Items = _itemHelper.ReplaceIDs(messageDetails.Items); + + foreach (var reward in messageDetails.Items) + { + // Ensure item exists in items db + var itemTemplate = items[reward.Template]; + if (itemTemplate is null) + { + _logger.Error(_localisationService.GetText("dialog-missing_item_template", new + { + Tpl = reward.Template, + Type = dialogType, + })); + + continue; + } + + // Ensure every 'base/root' item has the same parentId + has a slotid of 'main' + if (!(reward.SlotId is not null) || reward.SlotId == "hideout" || reward.ParentId == parentItem.ParentId) + { + // Reward items NEED a parent id + slotid + reward.ParentId = parentItem.ParentId; + reward.SlotId = "main"; + } + + // Boxes can contain sub-items + if (_itemHelper.IsOfBaseclass(itemTemplate.Id, [BaseClasses.AMMO_BOX])) + { + var boxAndCartridges = new List(); + boxAndCartridges.Add(reward); + _itemHelper.AddCartridgesToAmmoBox(boxAndCartridges, itemTemplate); + + // Push box + cartridge children into array + itemsToSendToPlayer.Data.AddRange(boxAndCartridges); + } + else + { + if (itemTemplate.Properties.StackSlots is not null) + _logger.Error(_localisationService.GetText("mail-unable_to_give_gift_not_handled", itemTemplate.Id)); + + // Item is sanitised and ready to be pushed into holding array + itemsToSendToPlayer.Data.Add(reward); + } + } + + // Remove empty data property if no rewards + // if (itemsToSendToPlayer.Data.Count == 0) + // delete itemsToSendToPlayer.data; + } + + return itemsToSendToPlayer; + } + + /** + * Try to find the most correct item to be the 'primary' item in a reward mail + * @param items Possible items to choose from + * @returns Chosen 'primary' item + */ + private Item GetBaseItemFromRewards(List? items) + { + // Only one item in reward, return it + if (items?.Count == 1) + return items[0]; + + // Find first item with slotId that indicates its a 'base' item + var item = items.FirstOrDefault(x => _slotNames.Contains(x.SlotId ?? "")); + if (item is not null) + return item; + + // Not a singlular item + no items have a hideout/main slotid + // Look for first item without parent id + item = items.FirstOrDefault(x => x.ParentId is null); + if (item is not null) + return item; + + // Just return first item in array + return items[0]; + } + + /** + * Get a dialog with a specified entity (user/trader) + * Create and store empty dialog if none exists in profile + * @param messageDetails Data on what message should do + * @returns Relevant Dialogue + */ + private Dialogue GetDialog(SendMessageDetails messageDetails) + { + var dialogsInProfile = _dialogueHelper.GetDialogsForProfile(messageDetails.RecipientId); + var senderId = GetMessageSenderIdByType(messageDetails); + if (senderId is null) + throw new Exception(_localisationService.GetText("mail-unable_to_find_message_sender_by_id", messageDetails.Sender)); + + // Does dialog exist + var senderDialog = dialogsInProfile.FirstOrDefault(x => x.Key == senderId).Value; + if (senderDialog is null) + { + // create if doesnt + dialogsInProfile[senderId] = senderDialog = new Dialogue() + { + Id = senderId, + Type = (messageDetails.DialogType is not null) ? messageDetails.DialogType : messageDetails.Sender, + Messages = new(), + Pinned = false, + New = 0, + AttachmentsNew = 0 + }; + + senderDialog = dialogsInProfile[senderId]; + } + + return senderDialog; + } + + /** + * Get the appropriate sender id by the sender enum type + * @param messageDetails + * @returns gets an id of the individual sending it + */ + private string? GetMessageSenderIdByType(SendMessageDetails messageDetails) + { + if (messageDetails.Sender == MessageType.SYSTEM_MESSAGE) + return _systemSenderId; + + if (messageDetails.Sender == MessageType.NPC_TRADER || messageDetails.DialogType == MessageType.NPC_TRADER) + return (messageDetails.Trader is not null) ? _traderHelper.GetValidTraderIdByEnumValue(messageDetails.Trader) : null; + + if (messageDetails.Sender == MessageType.USER_MESSAGE) + return messageDetails.SenderDetails?.Id; + + if (messageDetails.SenderDetails?.Id is not null) + return messageDetails.SenderDetails.Id; + + if (messageDetails.Trader is not null) + return _traderHelper.GetValidTraderIdByEnumValue(messageDetails.Trader); + + _logger.Warning($"Unable to handle message of type: {messageDetails.Sender}"); + return null; + } +} diff --git a/Core/Services/MapMarkerService.cs b/Core/Services/MapMarkerService.cs index 00d40e1f..338781eb 100644 --- a/Core/Services/MapMarkerService.cs +++ b/Core/Services/MapMarkerService.cs @@ -1,16 +1,29 @@ -using Core.Annotations; +using System.Text.RegularExpressions; +using Core.Annotations; using Core.Models.Eft.Common; using Core.Models.Eft.Common.Tables; using Core.Models.Eft.Inventory; using Core.Models.Eft.Profile; using Core.Models.Enums; using Core.Models.Spt.Dialog; +using ILogger = Core.Models.Utils.ILogger; +using MapMarker = Core.Models.Eft.Common.Tables.MapMarker; namespace Core.Services; -[Injectable(InjectionType.Singleton)] +[Injectable] public class MapMarkerService { + private readonly ILogger _logger; + + public MapMarkerService + ( + ILogger logger + ) + { + _logger = logger; + } + /// /// Add note to a map item in player inventory /// @@ -19,7 +32,17 @@ public class MapMarkerService /// Item public Item CreateMarkerOnMap(PmcData pmcData, InventoryCreateMarkerRequestData request) { - throw new NotImplementedException(); + // Get map from inventory + var mapItem = pmcData?.Inventory?.Items?.FirstOrDefault((i) => i?.Id == request?.Item); + + // add marker to map item + mapItem.Upd.Map = mapItem?.Upd?.Map ?? new() { Markers = new() }; + + // Update request note with text, then add to maps upd + request.MapMarker.Note = SanitiseMapMarkerText(request.MapMarker.Note); + mapItem?.Upd?.Map?.Markers?.Add(request.MapMarker); + + return mapItem; } /// @@ -30,7 +53,16 @@ public class MapMarkerService /// Item public Item DeleteMarkerFromMap(PmcData pmcData, InventoryDeleteMarkerRequestData request) { - throw new NotImplementedException(); + // Get map from inventory + var mapItem = pmcData.Inventory.Items.FirstOrDefault((item) => item.Id == request.Item); + + // remove marker + var markers = mapItem.Upd.Map.Markers.Where((marker) => { + return marker.X != request.X && marker.Y != request.Y; + }).ToList(); + mapItem.Upd.Map.Markers = markers; + + return mapItem; } /// @@ -41,7 +73,16 @@ public class MapMarkerService /// Item public Item EditMarkerOnMap(PmcData pmcData, InventoryEditMarkerRequestData request) { - throw new NotImplementedException(); + // Get map from inventory + var mapItem = pmcData.Inventory.Items.FirstOrDefault((item) => item.Id == request.Item); + + // edit marker + var indexOfExistingNote = mapItem.Upd.Map.Markers.IndexOf(request.MapMarker); + request.MapMarker.Note = SanitiseMapMarkerText(request.MapMarker.Note); + mapItem.Upd.Map.Markers.RemoveAt(indexOfExistingNote); + mapItem.Upd.Map.Markers.Add(request.MapMarker); + + return mapItem; } /// @@ -51,192 +92,6 @@ public class MapMarkerService /// Sanitised map marker text protected string SanitiseMapMarkerText(string mapNoteText) { - throw new NotImplementedException(); - } - - /// - /// Send a message from an NPC (e.g. prapor) to the player with or without items using direct message text, do not look up any locale - /// - /// The session ID to send the message to - /// The trader sending the message - /// What type the message will assume (e.g. QUEST_SUCCESS) - /// Text to send to the player - /// Optional items to send to player - /// Optional time to collect items before they expire - public void SendDirectNpcMessageToPlayer( - string sessionId, - object trader, - MessageType messageType, - string message, - List items = null, - int? maxStorageTimeSeconds = null, - SystemData systemData = null, - MessageContentRagfair ragfair = null) - { - throw new NotImplementedException(); - } - - /// - /// Send a message from an NPC (e.g. prapor) to the player with or without items - /// - /// The session ID to send the message to - /// The trader sending the message - /// What type the message will assume (e.g. QUEST_SUCCESS) - /// The localised text to send to player - /// Optional items to send to player - /// Optional time to collect items before they expire - public void SendLocalisedNpcMessageToPlayer( - string sessionId, - object trader, - MessageType messageType, - string messageLocaleId, - List items = null, - int? maxStorageTimeSeconds = null, - SystemData systemData = null, - MessageContentRagfair ragfair = null) - { - throw new NotImplementedException(); - } - - /// - /// Send a message from SYSTEM to the player with or without items - /// - /// The session ID to send the message to - /// The text to send to player - /// Optional items to send to player - /// Optional time to collect items before they expire - public void SendSystemMessageToPlayer( - string sessionId, - string message, - List items = null, - int? maxStorageTimeSeconds = null, - List profileChangeEvents = null) - { - throw new NotImplementedException(); - } - - /// - /// Send a message from SYSTEM to the player with or without items with localised text - /// - /// The session ID to send the message to - /// Id of key from locale file to send to player - /// Optional items to send to player - /// Optional time to collect items before they expire - public void SendLocalisedSystemMessageToPlayer( - string sessionId, - string messageLocaleId, - List items = null, - List profileChangeEvents = null, - int? maxStorageTimeSeconds = null) - { - throw new NotImplementedException(); - } - - /// - /// Send a USER message to a player with or without items - /// - /// The session ID to send the message to - /// Who is sending the message - /// The text to send to player - /// Optional items to send to player - /// Optional time to collect items before they expire - public void SendUserMessageToPlayer( - string sessionId, - UserDialogInfo senderDetails, - string message, - List items = null, - int? maxStorageTimeSeconds = null) - { - throw new NotImplementedException(); - } - - /// - /// Large function to send messages to players from a variety of sources (SYSTEM/NPC/USER) - /// Helper functions in this class are available to simplify common actions - /// - /// Details needed to send a message to the player - public void SendMessageToPlayer(SendMessageDetails messageDetails) - { - throw new NotImplementedException(); - } - - /// - /// Send a message from the player to an NPC - /// - /// Player id - /// NPC message is sent to - /// Text to send to NPC - public void SendPlayerMessageToNpc(string sessionId, string targetNpcId, string message) - { - throw new NotImplementedException(); - } - - /// - /// Create a message for storage inside a dialog in the player profile - /// - /// Id of dialog that will hold the message - /// Various details on what the message must contain/do - /// Message - protected Message CreateDialogMessage(string dialogId, SendMessageDetails messageDetails) - { - throw new NotImplementedException(); - } - - /// - /// Add items to message and adjust various properties to reflect the items being added - /// - /// Message to add items to - /// Items to add to message - /// total time items are stored in mail before being deleted - protected void AddRewardItemsToMessage( - Message message, - List itemsToSendToPlayer, - int? maxStorageTimeSeconds) - { - throw new NotImplementedException(); - } - - /// - /// perform various sanitising actions on the items before they're considered ready for insertion into message - /// - /// The type of the dialog that will hold the reward items being processed - /// - /// Sanitised items - protected List ProcessItemsBeforeAddingToMail( - MessageType dialogType, - SendMessageDetails messageDetails) - { - throw new NotImplementedException(); - } - - /// - /// Try to find the most correct item to be the 'primary' item in a reward mail - /// - /// Possible items to choose from - /// Chosen 'primary' item - protected Item GetBaseItemFromRewards(List items) - { - throw new NotImplementedException(); - } - - /// - /// Get a dialog with a specified entity (user/trader) - /// Create and store empty dialog if none exists in profile - /// - /// Data on what message should do - /// Relevant Dialogue - protected Dialogue GetDialog(SendMessageDetails messageDetails) - { - throw new NotImplementedException(); - } - - /// - /// Get the appropriate sender id by the sender enum type - /// - /// - /// gets an id of the individual sending it - protected string GetMessageSenderIdByType(SendMessageDetails messageDetails) - { - throw new NotImplementedException(); + return Regex.Replace(mapNoteText, @"[^\p{L}\d\s]", "", RegexOptions.CultureInvariant); } } diff --git a/Core/Services/MatchBotDetailsCacheService.cs b/Core/Services/MatchBotDetailsCacheService.cs new file mode 100644 index 00000000..e37988cb --- /dev/null +++ b/Core/Services/MatchBotDetailsCacheService.cs @@ -0,0 +1,55 @@ +using Core.Annotations; +using Core.Models.Eft.Common.Tables; +using Core.Models.Spt.Bots; +using System.Text.RegularExpressions; +using ILogger = Core.Models.Utils.ILogger; + +namespace Core.Services +{ + [Injectable(InjectionType.Singleton)] + public class MatchBotDetailsCacheService + { + private readonly ILogger _logger; + private readonly LocalisationService _localisationService; + + private readonly Dictionary _botDetailsCache; + + public MatchBotDetailsCacheService( + ILogger logger, + LocalisationService localisationService) + { + _logger = logger; + _localisationService = localisationService; + + _botDetailsCache = new(); + } + + public void CacheBot(BotBase botToCache) + { + if (botToCache.Info.Nickname is null) + { + _logger.Warning($"Unable to cache: { botToCache.Info.Settings.Role} bot with id: ${ botToCache.Id} as it lacks a nickname"); + return; + } + + var key = $"{botToCache.Info.Nickname.Trim()}{botToCache.Info.Side}"; + _botDetailsCache.TryAdd(key, botToCache); + } + + public void ClearCache() + { + _botDetailsCache.Clear(); + } + + public BotBase GetBotByNameAndSide(string botName, string botSide) + { + var botInCache = _botDetailsCache.GetValueOrDefault($"{botName}{botSide}`", null); + if (botInCache is null) + { + _logger.Warning($"Bot not found in match bot cache: {botName.ToLower()} { botSide}"); + } + + return botInCache; + } + } +} diff --git a/Core/Services/SeasonalEventService.cs b/Core/Services/SeasonalEventService.cs index 43f1d1ce..e2353709 100644 --- a/Core/Services/SeasonalEventService.cs +++ b/Core/Services/SeasonalEventService.cs @@ -1,40 +1,122 @@ -using Core.Annotations; +using Core.Annotations; +using Core.Helpers; using Core.Models.Eft.Common; using Core.Models.Eft.Common.Tables; using Core.Models.Enums; using Core.Models.Spt.Config; +using Core.Servers; +using ILogger = Core.Models.Utils.ILogger; namespace Core.Services; [Injectable(InjectionType.Singleton)] public class SeasonalEventService { + private readonly ILogger _logger; + + private readonly DatabaseService _databaseService; + + //private readonly DatabaseImporter _databaseImporter; + private readonly GiftService _giftService; + private readonly LocalisationService _localisationService; + private readonly BotHelper _botHelper; + private readonly ProfileHelper _profileHelper; + private readonly ConfigServer _configServer; + + private bool _christmasEventActive = false; + private bool _halloweenEventActive = false; + + private readonly SeasonalEventConfig _seasonalEventConfig; + private readonly QuestConfig _questConfig; + private readonly HttpConfig _httpConfig; + private readonly WeatherConfig _weatherConfig; + private readonly LocationConfig _locationConfig; + + private List _currentlyActiveEvents = []; + + private readonly IReadOnlyList _christmasEventItems = + [ + ItemTpl.FACECOVER_FAKE_WHITE_BEARD, + ItemTpl.BARTER_CHRISTMAS_TREE_ORNAMENT_RED, + ItemTpl.BARTER_CHRISTMAS_TREE_ORNAMENT_VIOLET, + ItemTpl.BARTER_CHRISTMAS_TREE_ORNAMENT_SILVER, + ItemTpl.HEADWEAR_DED_MOROZ_HAT, + ItemTpl.HEADWEAR_SANTA_HAT, + ItemTpl.BACKPACK_SANTAS_BAG, + ItemTpl.RANDOMLOOTCONTAINER_NEW_YEAR_GIFT_BIG, + ItemTpl.RANDOMLOOTCONTAINER_NEW_YEAR_GIFT_MEDIUM, + ItemTpl.RANDOMLOOTCONTAINER_NEW_YEAR_GIFT_SMALL + ]; + + private readonly IReadOnlyList _halloweenEventItems = + [ + ItemTpl.FACECOVER_SPOOKY_SKULL_MASK, + ItemTpl.RANDOMLOOTCONTAINER_PUMPKIN_RAND_LOOT_CONTAINER, + ItemTpl.HEADWEAR_JACKOLANTERN_TACTICAL_PUMPKIN_HELMET, + ItemTpl.FACECOVER_FACELESS_MASK, + ItemTpl.FACECOVER_JASON_MASK, + ItemTpl.FACECOVER_MISHA_MAYOROV_MASK, + ItemTpl.FACECOVER_SLENDER_MASK, + ItemTpl.FACECOVER_GHOUL_MASK, + ItemTpl.FACECOVER_HOCKEY_PLAYER_MASK_CAPTAIN, + ItemTpl.FACECOVER_HOCKEY_PLAYER_MASK_BRAWLER, + ItemTpl.FACECOVER_HOCKEY_PLAYER_MASK_QUIET + ]; + + public SeasonalEventService + ( + ILogger logger, + DatabaseService databaseService, + //DatabaseImporter databaseImporter, + GiftService giftService, + LocalisationService localisationService, + BotHelper botHelper, + ProfileHelper profileHelper, + ConfigServer configServer + ) + { + _logger = logger; + _databaseService = databaseService; + //_databaseImporter = databaseImporter; + _giftService = giftService; + _localisationService = localisationService; + _botHelper = botHelper; + _profileHelper = profileHelper; + _configServer = configServer; + + _seasonalEventConfig = _configServer.GetConfig(ConfigTypes.SEASONAL_EVENT); + _questConfig = _configServer.GetConfig(ConfigTypes.QUEST); + _httpConfig = _configServer.GetConfig(ConfigTypes.HTTP); + _weatherConfig = _configServer.GetConfig(ConfigTypes.WEATHER); + _locationConfig = _configServer.GetConfig(ConfigTypes.LOCATION); + } + /// /// Get an array of christmas items found in bots inventories as loot /// /// array - public string[] GetChristmasEventItems() + public IEnumerable GetChristmasEventItems() { - throw new NotImplementedException(); + return _christmasEventItems; } /// /// Get an array of halloween items found in bots inventories as loot /// /// array - public string[] GetHalloweenEventItems() + public IEnumerable GetHalloweenEventItems() { - throw new NotImplementedException(); + return _halloweenEventItems; } public bool ItemIsChristmasRelated(string itemTpl) { - throw new NotImplementedException(); + return _christmasEventItems.Contains(itemTpl); } public bool ItemIsHalloweenRelated(string itemTpl) { - throw new NotImplementedException(); + return _halloweenEventItems.Contains(itemTpl); } /// @@ -44,7 +126,7 @@ public class SeasonalEventService /// public bool ItemIsSeasonalRelated(string itemTpl) { - throw new NotImplementedException(); + return _christmasEventItems.Contains(itemTpl) || _halloweenEventItems.Contains(itemTpl); } /// @@ -53,7 +135,7 @@ public class SeasonalEventService /// Array of active events public List GetActiveEvents() { - throw new NotImplementedException(); + return _currentlyActiveEvents; } /// @@ -62,9 +144,20 @@ public class SeasonalEventService /// or, if halloween and christmas are inactive, return both sets of items /// /// array of tpl strings - public string[] GetInactiveSeasonalEventItems() + public List GetInactiveSeasonalEventItems() { - throw new NotImplementedException(); + var items = new List(); + if (!ChristmasEventEnabled()) + { + items.AddRange(_christmasEventItems); + } + + if (!HalloweenEventEnabled()) + { + items.AddRange(_halloweenEventItems); + } + + return items; } /// @@ -73,7 +166,7 @@ public class SeasonalEventService /// true if event is active public bool SeasonalEventEnabled() { - throw new NotImplementedException(); + return _christmasEventActive || _halloweenEventActive; } /// @@ -82,7 +175,7 @@ public class SeasonalEventService /// true if active public bool ChristmasEventEnabled() { - throw new NotImplementedException(); + return _christmasEventActive; } /// @@ -91,7 +184,7 @@ public class SeasonalEventService /// true if active public bool HalloweenEventEnabled() { - throw new NotImplementedException(); + return _halloweenEventActive; } /// @@ -100,7 +193,7 @@ public class SeasonalEventService /// true if seasonal events should be checked for public bool IsAutomaticEventDetectionEnabled() { - throw new NotImplementedException(); + return _seasonalEventConfig.EnableSeasonalEventDetection; } /// @@ -110,7 +203,7 @@ public class SeasonalEventService /// bots with equipment changes protected Dictionary>> GetEventBotGear(SeasonalEventType eventType) { - throw new NotImplementedException(); + return _seasonalEventConfig.EventGear.GetValueOrDefault(eventType, null); } /// @@ -120,7 +213,7 @@ public class SeasonalEventService /// bots with loot changes protected Dictionary>> GetEventBotLoot(SeasonalEventType eventType) { - throw new NotImplementedException(); + return _seasonalEventConfig.EventLoot.GetValueOrDefault(eventType, null); } /// @@ -129,7 +222,7 @@ public class SeasonalEventService /// Record with event name + start/end date public List GetEventDetails() { - throw new NotImplementedException(); + return _seasonalEventConfig.Events; } /// @@ -140,7 +233,13 @@ public class SeasonalEventService /// true if related public bool IsQuestRelatedToEvent(string questId, SeasonalEventType eventType) { - throw new NotImplementedException(); + var eventQuestData = _questConfig.EventQuests.GetValueOrDefault(questId, null); + if (eventQuestData?.Season == eventType) + { + return true; + } + + return false; } /// @@ -148,7 +247,14 @@ public class SeasonalEventService /// public void EnableSeasonalEvents() { - throw new NotImplementedException(); + if (_currentlyActiveEvents.Count > 0) + { + var globalConfig = _databaseService.GetGlobals().Configuration; + foreach (var activeEvent in _currentlyActiveEvents) + { + UpdateGlobalEvents(globalConfig, activeEvent); + } + } } /// @@ -158,7 +264,17 @@ public class SeasonalEventService /// True if event was successfully force enabled public bool ForceSeasonalEvent(SeasonalEventType eventType) { - throw new NotImplementedException(); + var globalConfig = _databaseService.GetGlobals().Configuration; + var seasonEvent = _seasonalEventConfig.Events.FirstOrDefault((e) => e.Type == eventType); + if (seasonEvent is null) + { + _logger.Warning($"Unable to force event: {eventType} as it cannot be found in events config"); + return false; + } + + UpdateGlobalEvents(globalConfig, seasonEvent); + + return true; } /// @@ -166,7 +282,25 @@ public class SeasonalEventService /// public void CacheActiveEvents() { - throw new NotImplementedException(); + var currentDate = DateTimeOffset.UtcNow.DateTime; + var seasonalEvents = GetEventDetails(); + + // reset existing data + _currentlyActiveEvents = new(); + + // Add active events to array + foreach (var events in seasonalEvents) + { + if (!events.Enabled) + { + continue; + } + + if (DateIsBetweenTwoDates(currentDate, events.StartMonth, events.StartDay, events.EndMonth, events.EndDay)) + { + _currentlyActiveEvents.Add(events); + } + } } /// @@ -175,7 +309,30 @@ public class SeasonalEventService /// Season enum value public Season GetActiveWeatherSeason() { - throw new NotImplementedException(); + if (_weatherConfig.OverrideSeason.HasValue) + { + return _weatherConfig.OverrideSeason.Value; + } + + var currentDate = new DateTime(); + foreach (var seasonRange in _weatherConfig.SeasonDates) + { + if ( + DateIsBetweenTwoDates( + currentDate, + seasonRange.StartMonth, + seasonRange.StartDay, + seasonRange.EndMonth, + seasonRange.EndDay) + ) + { + return seasonRange.SeasonType; + } + } + + _logger.Warning(_localisationService.GetText("season-no_matching_season_found_for_date")); + + return Season.SUMMER; } /// @@ -189,9 +346,12 @@ public class SeasonalEventService /// Upper bound for month /// Upper bound for day /// True when inside date range - protected bool DateIsBetweenTwoDates(DateTime dateToCheck, int startMonth, int startDay, int endMonth, int endDay) + private bool DateIsBetweenTwoDates(DateTime dateToCheck, int startMonth, int startDay, int endMonth, int endDay) { - throw new NotImplementedException(); + var eventStartDate = new DateTime(dateToCheck.Year, startMonth, startDay); + var eventEndDate = new DateTime(dateToCheck.Year, endMonth, endDay, 23, 59, 0); + + return dateToCheck >= eventStartDate && dateToCheck <= eventEndDate; } /// @@ -199,9 +359,78 @@ public class SeasonalEventService /// /// Bots inventory to iterate over /// the role of the bot being processed - public void RemoveChristmasItemsFromBotInventory(BotBaseInventory botInventory, string botRole) + public void RemoveChristmasItemsFromBotInventory(BotTypeInventory botInventory, string botRole) { - throw new NotImplementedException(); + var christmasItems = GetChristmasEventItems(); + List equipmentSlotsToFilter = [EquipmentSlots.FaceCover, EquipmentSlots.Headwear, EquipmentSlots.Backpack, EquipmentSlots.TacticalVest]; + List lootContainersToFilter = ["Backpack", "Pockets", "TacticalVest"]; + + // Remove christmas related equipment + foreach (var equipmentSlotKey in equipmentSlotsToFilter) + { + if (botInventory.Equipment[equipmentSlotKey] is null) + { + _logger.Warning( + _localisationService.GetText("seasonal-missing_equipment_slot_on_bot", new + { + EquipmentSlot = equipmentSlotKey, + BotRole = botRole, + }) + ); + } + + Dictionary equipment = botInventory.Equipment[equipmentSlotKey]; + botInventory.Equipment[equipmentSlotKey] = equipment.Where(i => !_christmasEventItems.Contains(i.Key)).ToDictionary(); + } + + // Remove christmas related loot from loot containers + var props = botInventory.Items.GetType().GetProperties(); + foreach (var lootContainerKey in lootContainersToFilter) + { + var prop = (Dictionary?)props.FirstOrDefault(p => p.Name.ToLower() == lootContainerKey.ToLower()).GetValue(botInventory.Items); + + if (prop is null) + { + _logger.Warning( + _localisationService.GetText("seasonal-missing_loot_container_slot_on_bot", new + { + LootContainer = lootContainerKey, + BotRole = botRole, + }) + ); + } + + List tplsToRemove = []; + foreach (var tplKey in prop) + { + if (christmasItems.Contains(tplKey.Key)) + { + tplsToRemove.Add(tplKey.Key); + } + } + + foreach (var tplToRemove in tplsToRemove) + { + prop.Remove(tplToRemove); + } + + // Get non-christmas items + var nonChristmasTpls = prop.Where(tpl => !christmasItems.Contains(tpl.Key)); + if (nonChristmasTpls.Count() == 0) + { + continue; + } + + Dictionary intermediaryDict = new(); + + foreach (var tpl in nonChristmasTpls) + { + intermediaryDict[tpl.Key] = prop[tpl.Key]; + } + + // Replace the original containerItems with the updated one + prop = intermediaryDict; + } } /// @@ -209,44 +438,229 @@ public class SeasonalEventService /// /// globals.json /// Name of the event to enable. e.g. Christmas - protected void UpdateGlobalEvents(Config globalConfig, SeasonalEvent eventType) + private void UpdateGlobalEvents(Config globalConfig, SeasonalEvent eventType) { - throw new NotImplementedException(); + _logger.Success(_localisationService.GetText("season-event_is_active", eventType.Type)); + _christmasEventActive = false; + _halloweenEventActive = false; + + switch (eventType.Type) + { + case SeasonalEventType.Halloween: + ApplyHalloweenEvent(eventType, globalConfig); + break; + case SeasonalEventType.Christmas: + ApplyChristmasEvent(eventType, globalConfig); + break; + case SeasonalEventType.NewYears: + ApplyNewYearsEvent(eventType, globalConfig); + + break; + case SeasonalEventType.AprilFools: + AddGifterBotToMaps(); + AddLootItemsToGifterDropItemsList(); + AddEventGearToBots(SeasonalEventType.Halloween); + AddEventGearToBots(SeasonalEventType.Christmas); + AddEventLootToBots(SeasonalEventType.Christmas); + AddEventBossesToMaps(SeasonalEventType.Halloween.ToString()); + EnableHalloweenSummonEvent(); + AddPumpkinsToScavBackpacks(); + RenameBitcoin(); + EnableSnow(); + break; + default: + // Likely a mod event + HandleModEvent(eventType, globalConfig); + break; + } } - protected void ApplyHalloweenEvent(SeasonalEvent eventType, Config globalConfig) + private void ApplyHalloweenEvent(SeasonalEvent eventType, Config globalConfig) { - throw new NotImplementedException(); + _halloweenEventActive = true; + + globalConfig.EventType = globalConfig.EventType.Where((x) => x != "None").ToList(); + globalConfig.EventType.Add("Halloween"); + globalConfig.EventType.Add("HalloweenIllumination"); + globalConfig.Health.ProfileHealthSettings.DefaultStimulatorBuff = "Buffs_Halloween"; + AddEventGearToBots(eventType.Type); + AdjustZryachiyMeleeChance(); + if (eventType.Settings?.EnableSummoning ?? false) + { + EnableHalloweenSummonEvent(); + AddEventBossesToMaps("halloweensummon"); + } + + if (eventType.Settings?.ZombieSettings?.Enabled ?? false) + { + ConfigureZombies(eventType.Settings.ZombieSettings); + } + + if (eventType.Settings?.RemoveEntryRequirement is not null) + { + RemoveEntryRequirement(eventType.Settings.RemoveEntryRequirement); + } + + if (eventType.Settings?.ReplaceBotHostility ?? false) + { + ReplaceBotHostility(_seasonalEventConfig.HostilitySettingsForEvent.FirstOrDefault(x => x.Key == "zombies").Value); + } + + if (eventType.Settings?.AdjustBotAppearances ?? false) + { + AdjustBotAppearanceValues(eventType.Type); + } + + AddPumpkinsToScavBackpacks(); + AdjustTraderIcons(eventType.Type); } - protected void ApplyChristmasEvent(SeasonalEvent eventType, Config globalConfig) + private void ApplyChristmasEvent(SeasonalEvent eventType, Config globalConfig) { - throw new NotImplementedException(); + _christmasEventActive = true; + + if (eventType.Settings?.EnableChristmasHideout ?? false) + { + globalConfig.EventType = globalConfig.EventType.Where((x) => x != "None").ToList(); + globalConfig.EventType.Add("Christmas"); + } + + AddEventGearToBots(eventType.Type); + AddEventLootToBots(eventType.Type); + + if (eventType.Settings?.EnableSanta ?? false) + { + AddGifterBotToMaps(); + AddLootItemsToGifterDropItemsList(); + } + + EnableDancingTree(); + if (eventType.Settings?.AdjustBotAppearances ?? false) + { + AdjustBotAppearanceValues(eventType.Type); + } } - protected void ApplyNewYearsEvent(SeasonalEvent eventType, Config globalConfig) + private void ApplyNewYearsEvent(SeasonalEvent eventType, Config globalConfig) { - throw new NotImplementedException(); + _christmasEventActive = true; + + if (eventType.Settings?.EnableChristmasHideout ?? false) + { + globalConfig.EventType = globalConfig.EventType.Where((x) => x != "None").ToList(); + globalConfig.EventType.Add("Christmas"); + } + + AddEventGearToBots(SeasonalEventType.Christmas); + AddEventLootToBots(SeasonalEventType.Christmas); + + if (eventType.Settings?.EnableSanta ?? false) + { + AddGifterBotToMaps(); + AddLootItemsToGifterDropItemsList(); + } + + EnableDancingTree(); + + if (eventType.Settings?.AdjustBotAppearances ?? false) + { + AdjustBotAppearanceValues(SeasonalEventType.Christmas); + } } - protected void AdjustBotAppearanceValues(SeasonalEventType season) + private void AdjustBotAppearanceValues(SeasonalEventType season) { - throw new NotImplementedException(); + var adjustments = _seasonalEventConfig.BotAppearanceChanges[season]; + if (adjustments is null) + { + return; + } + + foreach (var botTypeKey in adjustments) + { + var botDb = _databaseService.GetBots().Types[botTypeKey.Key]; + if (botDb is null) + { + continue; + } + + var botAppearanceAdjustments = botTypeKey.Value; + foreach (var appearanceKey in botAppearanceAdjustments) + { + var weightAdjustments = appearanceKey.Value; + var props = botDb.BotAppearance.GetType().GetProperties(); + foreach (var itemKey in weightAdjustments) + { + var prop = props.FirstOrDefault(x => x.Name.ToLower() == appearanceKey.Key.ToLower()); + var propValue = (Dictionary)prop.GetValue(botDb.BotAppearance); + propValue[itemKey.Key] = weightAdjustments[itemKey.Key]; + prop.SetValue(botDb.BotAppearance, propValue); + } + } + } } - protected void ReplaceBotHostility(Dictionary hostilitySettings) + private void ReplaceBotHostility(Dictionary> hostilitySettings) { - throw new NotImplementedException(); + var locations = _databaseService.GetLocations(); + var ignoreList = _locationConfig.NonMaps; + var useDefault = hostilitySettings is null; + + var props = locations.GetType().GetProperties(); + + foreach (var locationProp in props) + { + if (ignoreList.Contains(locationProp.Name)) + { + continue; + } + + Location location = (Location)locationProp.GetValue(locations); + if (location?.Base?.BotLocationModifier?.AdditionalHostilitySettings is null) + { + continue; + } + + List newHostilitySettings = useDefault ? new() : hostilitySettings[locationProp.Name]; + if (newHostilitySettings is null) + { + continue; + } + + location.Base.BotLocationModifier.AdditionalHostilitySettings = new(); + } } - protected void RemoveEntryRequirement(List locationIds) + private void RemoveEntryRequirement(List locationIds) { - throw new NotImplementedException(); + foreach (var locationId in locationIds) + { + var location = _databaseService.GetLocation(locationId); + location.Base.AccessKeys = []; + location.Base.AccessKeysPvE = []; + } } public void GivePlayerSeasonalGifts(string sessionId) { - throw new NotImplementedException(); + if (_currentlyActiveEvents is null) + { + return; + } + + foreach (var seasonEvent in _currentlyActiveEvents) + { + switch (seasonEvent.Type) + { + case SeasonalEventType.Christmas: + GiveGift(sessionId, "Christmas2022"); + break; + case SeasonalEventType.NewYears: + GiveGift(sessionId, "NewYear2023"); + GiveGift(sessionId, "NewYear2024"); + break; + } + } } /// @@ -254,7 +668,21 @@ public class SeasonalEventService /// protected void AdjustZryachiyMeleeChance() { - throw new NotImplementedException(); + var zyrach = _databaseService.GetBots().Types.FirstOrDefault(x => x.Key.ToLower() == "bosszryachiy"); + var value = new Dictionary(); + + foreach (var chance in zyrach.Value.BotChances.EquipmentChances) + { + if (chance.Key.ToLower() == "Scabbard") + { + value.Add(chance.Key, 100); + continue; + } + + value.Add(chance.Key, chance.Value); + } + + zyrach.Value.BotChances.EquipmentChances = value; } /// @@ -262,7 +690,7 @@ public class SeasonalEventService /// protected void EnableHalloweenSummonEvent() { - throw new NotImplementedException(); + _databaseService.GetGlobals().Configuration.EventSettings.EventActive = true; } protected void ConfigureZombies(ZombieSettings zombieSettings) @@ -319,7 +747,12 @@ public class SeasonalEventService /// protected void AddLootItemsToGifterDropItemsList() { - throw new NotImplementedException(); + var gifterBot = _databaseService.GetBots().Types["gifter"]; + var items = gifterBot.BotInventory.Items.Backpack.Keys.ToList(); + gifterBot.BotDifficulty.Easy.Patrol["ITEMS_TO_DROP"] = items; + gifterBot.BotDifficulty.Normal.Patrol["ITEMS_TO_DROP"] = items; + gifterBot.BotDifficulty.Hard.Patrol["ITEMS_TO_DROP"] = items; + gifterBot.BotDifficulty.Impossible.Patrol["ITEMS_TO_DROP"] = items; } /// @@ -345,12 +778,16 @@ public class SeasonalEventService /// protected void AddPumpkinsToScavBackpacks() { - throw new NotImplementedException(); + _databaseService.GetBots().Types["assault"].BotInventory.Items.Backpack[ + ItemTpl.RANDOMLOOTCONTAINER_PUMPKIN_RAND_LOOT_CONTAINER + ] = 400; } protected void RenameBitcoin() { - throw new NotImplementedException(); + var enLocale = _databaseService.GetLocales().Global["en"]; + enLocale[$"{ItemTpl.BARTER_PHYSICAL_BITCOIN} Name"] = "Physical SPT Coin"; + enLocale[$"{ItemTpl.BARTER_PHYSICAL_BITCOIN} ShortName"] = "0.2SPT"; } /// @@ -381,7 +818,11 @@ public class SeasonalEventService /// Key of gift to give protected void GiveGift(string playerId, string giftKey) { - throw new NotImplementedException(); + var gitftData = _giftService.GetGiftById(giftKey); + if (!_profileHelper.PlayerHasRecievedMaxNumberOfGift(playerId, giftKey, gitftData.MaxToSendPlayer ?? 5)) + { + _giftService.SendGiftToPlayer(playerId, giftKey); + } } /// @@ -391,7 +832,7 @@ public class SeasonalEventService /// Bot role as string public string GetBaseRoleForEventBot(string eventBotRole) { - throw new NotImplementedException(); + return _seasonalEventConfig.EventBotMapping.GetValueOrDefault(eventBotRole, null); } /// @@ -399,6 +840,6 @@ public class SeasonalEventService /// public void EnableSnow() { - throw new NotImplementedException(); + _weatherConfig.OverrideSeason = Season.WINTER; } } diff --git a/Core/Utils/App.cs b/Core/Utils/App.cs index c278c5ea..76072328 100644 --- a/Core/Utils/App.cs +++ b/Core/Utils/App.cs @@ -1,4 +1,3 @@ -using System.Diagnostics; using Core.Annotations; using Core.DI; using Core.Models.Enums; @@ -55,31 +54,21 @@ public class App // execute onLoad callbacks _logger.Info(_localisationService.GetText("executing_startup_callbacks")); - /* - _logger.Debug($"OS: {os.arch()} | {os.version()} | {process.platform}"); - _logger.Debug($"CPU: {os.cpus()[0]?.model} cores: {os.cpus().length}"); - _logger.Debug($"RAM: {(os.totalmem() / 1024 / 1024 / 1024).toFixed(2)}GB"); - _logger.Debug($"PATH: {this.encodingUtil.toBase64(process.argv[0])}"); - _logger.Debug($"PATH: {this.encodingUtil.toBase64(process.execPath)}"); - _logger.Debug($"Server: {ProgramStatics.SPT_VERSION || this.coreConfig.sptVersion}"); + _logger.Debug($"OS: {Environment.OSVersion.Version} | {Environment.OSVersion.Platform}"); + //_logger.Debug($"CPU: {ApplicationId.ProcessorArchitecture} cores: {os.cpus().length}"); + //_logger.Debug($"RAM: {(os.totalmem() / 1024 / 1024 / 1024).toFixed(2)}GB"); + //_logger.Debug($"PATH: {this.encodingUtil.toBase64(process.argv[0])}"); + //_logger.Debug($"PATH: {this.encodingUtil.toBase64(process.execPath)}"); + //_logger.Debug($"Server: {ProgramStatics.SPT_VERSION || _coreConfig.SptVersion}"); - const nodeVersion = process.version.replace(/^v/, ""); - if (ProgramStatics.EXPECTED_NODE && nodeVersion !== ProgramStatics.EXPECTED_NODE) { - this.logger.error( - "Node version mismatch. Required: ${ProgramStatics.EXPECTED_NODE} | Current: ${nodeVersion}", - ); - process.exit(1); - } - _logger.Debug("Node: ${nodeVersion}"); - - if (ProgramStatics.BUILD_TIME) { - _logger.Debug("Date: ${ProgramStatics.BUILD_TIME}"); - } - - if (ProgramStatics.COMMIT) { - _logger.Debug("Commit: ${ProgramStatics.COMMIT}"); - } - */ + //if (ProgramStatics.BUILD_TIME) { + // _logger.Debug($"Date: {ProgramStatics.BUILD_TIME}"); + //} + + //if (ProgramStatics.COMMIT) { + // _logger.Debug($"Commit: {ProgramStatics.COMMIT}"); + //} + foreach (var onLoad in _onLoad) await onLoad.OnLoad(); diff --git a/Core/Utils/DatabaseImporter.cs b/Core/Utils/DatabaseImporter.cs index 4dbd7a64..bf7ccce4 100644 --- a/Core/Utils/DatabaseImporter.cs +++ b/Core/Utils/DatabaseImporter.cs @@ -7,8 +7,8 @@ using Core.Models.Spt.Server; using Core.Routers; using Core.Servers; using Core.Services; -using Core.Utils.Cloners; using ILogger = Core.Models.Utils.ILogger; +using Path = System.IO.Path; namespace Core.Utils; @@ -18,19 +18,19 @@ public class DatabaseImporter : OnLoad private object hashedFile; private ValidationResult valid = ValidationResult.UNDEFINED; private string filepath; - protected HttpConfig httpConfig; + private HttpConfig httpConfig; - protected readonly ILogger _logger; - protected readonly LocalisationService _localisationService; + private readonly ILogger _logger; + private readonly LocalisationService _localisationService; - protected readonly DatabaseServer _databaseServer; + private readonly DatabaseServer _databaseServer; - protected readonly ImageRouter _imageRouter; - protected readonly EncodingUtil _encodingUtil; - protected readonly HashUtil _hashUtil; - protected readonly ImporterUtil _importerUtil; - protected readonly ConfigServer _configServer; - protected readonly FileUtil _fileUtil; + private readonly ImageRouter _imageRouter; + private readonly EncodingUtil _encodingUtil; + private readonly HashUtil _hashUtil; + private readonly ImporterUtil _importerUtil; + private readonly ConfigServer _configServer; + private readonly FileUtil _fileUtil; public DatabaseImporter( ILogger logger, @@ -95,29 +95,43 @@ public class DatabaseImporter : OnLoad await HydrateDatabase(filepath); var imageFilePath = $"{filepath}images/"; - //var directories = this.vfs.getDirs(imageFilePath); - LoadImages(imageFilePath, _fileUtil.GetDirectories(imageFilePath), [ - "/files/achievement/", - "/files/CONTENT/banners/", - "/files/handbook/", - "/files/Hideout/", - "/files/launcher/", - "/files/prestige/", - "/files/quest/icon/", - "/files/trader/avatar/", - ]); + CreateRouteMapping(imageFilePath, "files"); + } + + private void CreateRouteMapping(string directory, string newBasePath) + { + var directoryContent = GetAllFilesInDirectory(directory); + + foreach (var fileNameWithPath in directoryContent) { + var bsgPath = $"/{newBasePath}/{_fileUtil.StripExtension(fileNameWithPath)}"; + var sptPath = $"{directory}{ fileNameWithPath}"; + _imageRouter.AddRoute(bsgPath, sptPath); + } + } + + private List GetAllFilesInDirectory(string directoryPath) + { + List result = []; + result.AddRange(Directory.GetFiles(directoryPath)); + + foreach (var subdirectory in Directory.GetDirectories(directoryPath)) + { + result.AddRange(GetAllFilesInDirectory(subdirectory)); + } + + return result; } /** * Read all json files in database folder and map into a json object * @param filepath path to database folder */ - protected async Task HydrateDatabase(string filepath) + protected async Task HydrateDatabase(string filePath) { _logger.Info(_localisationService.GetText("importing_database")); var dataToImport = (DatabaseTables) await _importerUtil.LoadRecursiveAsync( - $"{filepath}database/", + $"{filePath}database/", typeof(DatabaseTables), OnReadValidate ); @@ -183,9 +197,11 @@ public class DatabaseImporter : OnLoad } /** + * absolute dogshit, do not use * Find and map files with image router inside a designated path * @param filepath Path to find files in */ + [Obsolete] public void LoadImages(string filepath, string[] directories, List routes) { for (var i = 0; i < directories.Length; i++) diff --git a/Core/Utils/HashUtil.cs b/Core/Utils/HashUtil.cs index bd15a005..292fc431 100644 --- a/Core/Utils/HashUtil.cs +++ b/Core/Utils/HashUtil.cs @@ -106,7 +106,7 @@ public class HashUtil var random = new Random(); - return random.Next() * (max - min + 1) + min; + return random.Next(min, max + 1); } } diff --git a/Core/Utils/ImporterUtil.cs b/Core/Utils/ImporterUtil.cs index 023591aa..86111d44 100644 --- a/Core/Utils/ImporterUtil.cs +++ b/Core/Utils/ImporterUtil.cs @@ -36,6 +36,7 @@ public class ImporterUtil ) { var tasks = new List(); + var dictionaryLock = new object(); var result = Activator.CreateInstance(loadedType); // get all filepaths @@ -66,8 +67,11 @@ public class ImporterUtil if (onObjectDeserialized != null) onObjectDeserialized(file, fileDeserialized); - setMethod.Invoke(result, - isDictionary ? [_fileUtil.StripExtension(file), fileDeserialized] : [fileDeserialized]); + lock (dictionaryLock) + { + setMethod.Invoke(result, + isDictionary ? [_fileUtil.StripExtension(file), fileDeserialized] : [fileDeserialized]); + } } catch (Exception e) { @@ -80,7 +84,6 @@ public class ImporterUtil // deep tree search foreach (var directory in directories) { - var dictionaryLock = new object(); tasks.Add( Task.Factory.StartNew(() => { @@ -125,7 +128,8 @@ public class ImporterUtil { var matchedProperty = type.GetProperties() .FirstOrDefault(prop => - prop.Name.ToLower() == _fileUtil.StripExtension(propertyName).ToLower()); + string.Equals(prop.Name.ToLower(), _fileUtil.StripExtension(propertyName).ToLower(), + StringComparison.Ordinal)); if (matchedProperty == null) throw new Exception( $"Unable to find property '{_fileUtil.StripExtension(propertyName)}' for type '{type.Name}'"); diff --git a/Core/Utils/JsonUtil.cs b/Core/Utils/JsonUtil.cs index 96912741..96c1786c 100644 --- a/Core/Utils/JsonUtil.cs +++ b/Core/Utils/JsonUtil.cs @@ -1,5 +1,7 @@ +using System.Text.Encodings.Web; using System.Text.Json; using System.Text.Json.Serialization; +using System.Text.Unicode; using Core.Annotations; using Core.Models.Enums; using Core.Models.Spt.Dialog; @@ -15,6 +17,7 @@ public class JsonUtil WriteIndented = false, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, Converters = { new ListOrTConverterFactory(), @@ -25,7 +28,8 @@ public class JsonUtil new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), - new EftEnumConverter() + new EftEnumConverter(), + new EftEnumConverter() } }; private static readonly JsonSerializerOptions jsonSerializerOptionsIndented = new(jsonSerializerOptionsNoIndent) diff --git a/Core/Utils/ProgressWriter.cs b/Core/Utils/ProgressWriter.cs new file mode 100644 index 00000000..068aaa18 --- /dev/null +++ b/Core/Utils/ProgressWriter.cs @@ -0,0 +1,33 @@ +namespace Core.Utils +{ + public class ProgressWriter + { + private readonly int _total; + private readonly int? _maxBarLength; + private readonly string? _barFillChar; + private readonly string? _barEmptyChar; + + public ProgressWriter(int total, int maxBarLength, string barFillChar, string barEmptyChar) + { + _total = total; + _maxBarLength = maxBarLength; + _barFillChar = barFillChar; + _barEmptyChar = barEmptyChar; + } + + public ProgressWriter(int total) + { + _total = total; + _maxBarLength = 25; + _barFillChar = "\u2593"; + _barEmptyChar = "\u2591"; + } + + public void Increment() + { + // TODO - implement + } + } + + +} diff --git a/Core/Utils/RandomUtil.cs b/Core/Utils/RandomUtil.cs index 2e49e8f4..106c1671 100644 --- a/Core/Utils/RandomUtil.cs +++ b/Core/Utils/RandomUtil.cs @@ -1,5 +1,6 @@ -using System.Security.Cryptography; +using System.Security.Cryptography; using Core.Annotations; +using ILogger = Core.Models.Utils.ILogger; namespace Core.Utils; @@ -7,6 +8,16 @@ namespace Core.Utils; [Injectable(InjectionType.Singleton)] public class RandomUtil { + private readonly ILogger _logger; + + public RandomUtil + ( + ILogger logger + ) + { + _logger = logger; + } + public readonly Random Random = new(); /// @@ -300,7 +311,7 @@ public class RandomUtil /// A biased random number within the specified range. public double GetBiasedRandomNumber(double min, double max, double shift, double n) { - /*** + /** * This function generates a random number based on a gaussian distribution with an option to add a bias via shifting. * * Here's an example graph of how the probabilities can be distributed: @@ -314,8 +325,63 @@ public class RandomUtil * Here's a place where you can play around with the 'n' and 'shift' values to see how the distribution changes: * http://jsfiddle.net/e08cumyx/ */ + if (max < min) + { + _logger.Error($"Invalid argument, Bounded random number generation max is smaller than min({max} < {min}"); + return -1; + } - throw new NotImplementedException("This honestly went over my head..."); + if (n < 1) + { + _logger.Error($"Invalid argument, 'n' must be 1 or greater(received {n})"); + return -1; + } + + if (min == max) + { + return min; + } + + if (shift > max - min) + { + /** + * If a rolled number is out of bounds (due to bias being applied), we roll it again. + * As the shifting increases, the chance of rolling a number within bounds decreases. + * A shift that is equal to the available range only has a 50% chance of rolling correctly, theoretically halving performance. + * Shifting even further drops the success chance very rapidly - so we want to warn against that + **/ + _logger.Warning( + "Bias shift for random number generation is greater than the range of available numbers. This will have a severe performance impact"); + _logger.Warning($"min-> {min}; max-> {max}; shift-> {shift}"); + } + + + var biasedMin = shift >= 0 ? min - shift : min; + var biasedMax = shift < 0 ? max + shift : max; + + double num; + do + { + num = GetBoundedGaussian(biasedMin, biasedMax, n); + } while (num < min || num > max); + + return num; + } + + private double GetBoundedGaussian(double start, double end, double n) + { + return Math.Round(start + GetGaussianRandom(n) * (end - start + 1)); + } + + private double GetGaussianRandom(double n) + { + var rand = 0d; + for (var i = 0; i < n; i += 1) + { + rand += GetSecureRandomNumber(); + } + + return rand / n; } /// @@ -378,4 +444,10 @@ public class RandomUtil ? parts[1].Length : 0; } + + public T GetArrayValue(IEnumerable list) + { + var rand = new Random(); + return list.ElementAt(rand.Next(0, list.Count())); + } } diff --git a/Core/Utils/TimeUtil.cs b/Core/Utils/TimeUtil.cs index af167958..2df541d8 100644 --- a/Core/Utils/TimeUtil.cs +++ b/Core/Utils/TimeUtil.cs @@ -12,7 +12,7 @@ public class TimeUtil /// /// The date to format in UTC. /// The formatted time as 'HH-MM-SS'. - public string FormatTime(DateTime dateTime) + public string FormatTime(DateTimeOffset dateTime) { var hour = Pad(dateTime.ToUniversalTime().Hour); var minute = Pad(dateTime.ToUniversalTime().Minute); @@ -26,7 +26,7 @@ public class TimeUtil /// /// The date to format in UTC. /// The formatted date as 'YYYY-MM-DD'. - public string FormatDate(DateTime dateTime) + public string FormatDate(DateTimeOffset dateTime) { var day = Pad(dateTime.ToUniversalTime().Day); var month = Pad(dateTime.ToUniversalTime().Month); @@ -41,7 +41,7 @@ public class TimeUtil /// The current date as 'YYYY-MM-DD'. public string GetDate() { - return FormatDate(DateTime.Now); + return FormatDate(DateTimeOffset.UtcNow); } /// @@ -50,7 +50,7 @@ public class TimeUtil /// The current time as 'HH-MM-SS'. public string GetTime() { - return FormatTime(DateTime.Now); + return FormatTime(DateTimeOffset.UtcNow); } /// @@ -67,12 +67,14 @@ public class TimeUtil /// /// datetime to get the time stamp for, if null it uses current date. /// Unix epoch for the start of day of the calculated date - public long GetStartOfDayTimeStamp(DateTime? dateTime) + public long GetStartOfDayTimeStamp(long? timestamp) { - var now = dateTime ?? DateTime.Now; - - return new DateTimeOffset(new DateTime(now.Year, now.Month, now.Day, 0, 0, 0)) - .ToUnixTimeSeconds(); + DateTime now = timestamp.HasValue + ? DateTimeOffset.FromUnixTimeMilliseconds(timestamp.Value).DateTime + : DateTime.Now; + + DateTime startOfDay = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0); + return ((DateTimeOffset)startOfDay).ToUnixTimeMilliseconds(); } /// @@ -82,7 +84,7 @@ public class TimeUtil /// public long GetTimeStampFromNowDays(int daysFromNow) { - return DateTimeOffset.Now.AddDays(daysFromNow).ToUnixTimeSeconds(); + return DateTimeOffset.UtcNow.AddDays(daysFromNow).ToUnixTimeSeconds(); } /// @@ -92,16 +94,17 @@ public class TimeUtil /// public long GetTimeStampFromNowHours(int hoursFromNow) { - return DateTimeOffset.Now.AddHours(hoursFromNow).ToUnixTimeSeconds(); + return DateTimeOffset.UtcNow.AddHours(hoursFromNow).ToUnixTimeSeconds(); } /// /// Gets the current time in UTC in a format suitable for mail in EFT. /// /// The current time as 'HH:MM' in UTC. + /// GetTimeMailFormat public string GetTimeMailFormat() { - return DateTime.UtcNow.ToString("HH:mm"); + return DateTimeOffset.UtcNow.ToString("HH:mm"); } /// @@ -110,7 +113,7 @@ public class TimeUtil /// The current date as 'DD.MM.YYYY' in UTC. public string GetDateMailFormat() { - return DateTime.UtcNow.ToString("dd.MM.yyyy"); + return DateTimeOffset.UtcNow.ToString("dd.MM.yyyy"); } /// @@ -129,19 +132,14 @@ public class TimeUtil /// Time stamp of the next hour in unix time seconds public long GetTimeStampOfNextHour() { - var now = DateTime.UtcNow; + DateTime now = DateTime.Now; + TimeSpan timeUntilNextHour = TimeSpan.FromMinutes(60 - now.Minute) + .Subtract(TimeSpan.FromSeconds(now.Second)) + .Subtract(TimeSpan.FromMilliseconds(now.Millisecond)); + + var time = ((DateTimeOffset)now.Add(timeUntilNextHour)).ToUnixTimeSeconds(); - var nextHour = new DateTime( - now.Year, - now.Month, - now.Day, - now.Hour, - 0, - 0, - DateTimeKind.Utc - ).AddHours(1); - - return new DateTimeOffset(nextHour).ToUnixTimeSeconds(); + return time; } /// @@ -151,19 +149,20 @@ public class TimeUtil /// Timestamp public long GetTodayMidnightTimeStamp() { - var now = DateTime.UtcNow; - - var midNight = new DateTime( - now.Year, - now.Month, - now.Day, - 0, - 0, - 0, - DateTimeKind.Utc - ); - - return new DateTimeOffset(midNight).ToUnixTimeSeconds(); + DateTime now = DateTime.Now; + int hours = now.Hour; + int minutes = now.Minute; + + // If minutes greater than 0, subtract 1 hour + if (minutes > 0) + { + hours--; + } + + // Create a new DateTime with the last full hour, 0 minutes, and 0 seconds + DateTime lastFullHour = new DateTime(now.Year, now.Month, now.Day, hours, 0, 0); + + return ((DateTimeOffset)lastFullHour).ToUnixTimeMilliseconds(); } /// @@ -175,4 +174,26 @@ public class TimeUtil { return number.ToString().PadLeft(2, '0'); } + + /// + /// Takes a timestamp and converts to its date with Epoch + /// + /// + /// + public DateTime GetDateTimeFromTimeStamp(long timeStamp) + { + return DateTimeOffset.FromUnixTimeMilliseconds(timeStamp).DateTime; + } + + /// + /// Takes a timestamp and gets difference between Epoch time and time provided resulting in a unixtimestamp (date defaults to utcnow) + /// + /// + /// + public long GetTimeStampFromEpoch(DateTime? date = null) + { + var dateToCompare = date ?? DateTime.UtcNow; + return (long)(dateToCompare - DateTime.UnixEpoch).TotalSeconds; + } + } diff --git a/Core/Utils/TimerUtil.cs b/Core/Utils/TimerUtil.cs new file mode 100644 index 00000000..76ada3bf --- /dev/null +++ b/Core/Utils/TimerUtil.cs @@ -0,0 +1,30 @@ +using System.Diagnostics; +using Core.Annotations; + +namespace Core.Utils +{ + [Injectable] + public class TimerUtil + { + private readonly Stopwatch _stopwatch; + + public TimerUtil() + { + _stopwatch = new Stopwatch(); + _stopwatch.Start(); + } + + public int Stop(string unit = "sec") + { + _stopwatch.Stop(); + var timePassed = _stopwatch.Elapsed; + + return unit switch + { + "ns" => timePassed.Nanoseconds, + "ms" => timePassed.Milliseconds, + _ => timePassed.Seconds + }; + } + } +} diff --git a/Server/Assets/configs/bot.json b/Server/Assets/configs/bot.json index bfaa1ca9..e0e120de 100644 --- a/Server/Assets/configs/bot.json +++ b/Server/Assets/configs/bot.json @@ -1149,7 +1149,7 @@ "backpackLoot": { "weights": { "0": 3, - "1": 5, + "1": 7, "2": 12, "3": 20, "4": 8, diff --git a/Server/Assets/configs/core.json b/Server/Assets/configs/core.json index 896767ce..8e60b15d 100644 --- a/Server/Assets/configs/core.json +++ b/Server/Assets/configs/core.json @@ -179,12 +179,9 @@ } }, "features": { - "autoInstallModDependencies": false, "compressProfile": false, "chatbotFeatures": { - "sptFriendEnabled": true, "sptFriendGiftsEnabled": true, - "commandoEnabled": true, "commandoFeatures": { "giveCommandEnabled": true }, @@ -194,7 +191,11 @@ "ids": { "commando": "6723fd51c5924c57ce0ca01e", "spt": "6723fd51c5924c57ce0ca01f" - } + }, + "enabledBots": { + "6723fd51c5924c57ce0ca01e": true, + "6723fd51c5924c57ce0ca01f": true + } }, "createNewProfileTypesBlacklist": [] }, diff --git a/Server/Assets/configs/gifts.json b/Server/Assets/configs/gifts.json index 8f055300..6d460052 100644 --- a/Server/Assets/configs/gifts.json +++ b/Server/Assets/configs/gifts.json @@ -8522,209 +8522,239 @@ "associatedEvent": "Promo", "maxToSendPlayer": 5 }, - "NewYear2024": { - "items": [{ - "_id": "6773b39ccf4c2fe4e50a7ec3", - "_tpl": "67124dcfa3541f2a1f0e788b", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - }, - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" - }, { - "_id": "6773b39ccf4c2fe4e50a7ec4", - "_tpl": "6719023b612cc94b9008e78c", - "parentId": "6773b39ccf4c2fe4e50a7ec3", - "slotId": "mod_stock" - }, { - "_id": "6773b39ccf4c2fe4e50a7ec5", - "_tpl": "6709133fa532466d5403fb7c", - "parentId": "6773b39ccf4c2fe4e50a7ec3", - "slotId": "mod_magazine" - }, { - "_id": "6773b39ccf4c2fe4e50a7ec6", - "_tpl": "670fd0a8d8d4eae4790c8187", - "parentId": "6773b39ccf4c2fe4e50a7ec3", - "slotId": "mod_barrel" - }, { - "_id": "6773b39ccf4c2fe4e50a7ec7", - "_tpl": "6710cea62bb09af72f0e6bf8", - "parentId": "6773b39ccf4c2fe4e50a7ec6", - "slotId": "mod_mount" - }, { - "_id": "6773b39ccf4c2fe4e50a7ec8", - "_tpl": "57d17c5e2459775a5c57d17d", - "parentId": "6773b39ccf4c2fe4e50a7ec7", - "slotId": "mod_tactical_003" - }, { - "_id": "6773b39ccf4c2fe4e50a7ec9", - "_tpl": "6165ac8c290d254f5e6b2f6c", - "parentId": "6773b39ccf4c2fe4e50a7ec3", - "slotId": "mod_scope" - }, { - "_id": "6773b39ccf4c2fe4e50a7ecb", - "_tpl": "6709133fa532466d5403fb7c", - "upd": { - "StackObjectsCount": 1 - }, - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" - }, { - "_id": "6773b39ccf4c2fe4e50a7ecd", - "_tpl": "6709133fa532466d5403fb7c", - "upd": { - "StackObjectsCount": 1 - }, - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" - }, { - "_id": "6773b39ccf4c2fe4e50a7ecf", - "_tpl": "6709133fa532466d5403fb7c", - "upd": { - "StackObjectsCount": 1 - }, - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" - }, { - "_id": "6773b39ccf4c2fe4e50a7ed1", - "_tpl": "5c0d591486f7744c505b416f", - "upd": { - "StackObjectsCount": 20 - }, - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" - }, { - "_id": "6773b39ccf4c2fe4e50a7ed3", - "_tpl": "5c0d591486f7744c505b416f", - "upd": { - "StackObjectsCount": 20 - }, - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" - }, { - "_id": "6773b39ccf4c2fe4e50a7ed5", - "_tpl": "5c0d591486f7744c505b416f", - "upd": { - "StackObjectsCount": 20 - }, - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" - }, { - "_id": "6773b39ccf4c2fe4e50a7ed6", - "_tpl": "5ab8e79e86f7742d8b372e78", - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" - }, { - "_id": "6773b39ccf4c2fe4e50a7ed7", - "_tpl": "65732688d9d89ff7ac0d9c4c", - "parentId": "6773b39ccf4c2fe4e50a7ed6", - "slotId": "Soft_armor_front" - }, { - "_id": "6773b39ccf4c2fe4e50a7ed8", - "_tpl": "657326978c1cc6dcd9098b56", - "parentId": "6773b39ccf4c2fe4e50a7ed6", - "slotId": "Soft_armor_back" - }, { - "_id": "6773b39ccf4c2fe4e50a7ed9", - "_tpl": "657326a28c1cc6dcd9098b5a", - "parentId": "6773b39ccf4c2fe4e50a7ed6", - "slotId": "Soft_armor_left" - }, { - "_id": "6773b39ccf4c2fe4e50a7eda", - "_tpl": "657326b08c1cc6dcd9098b5e", - "parentId": "6773b39ccf4c2fe4e50a7ed6", - "slotId": "soft_armor_right" - }, { - "_id": "6773b39ccf4c2fe4e50a7edb", - "_tpl": "657326bc5d3a3129fb05f36b", - "parentId": "6773b39ccf4c2fe4e50a7ed6", - "slotId": "Collar" - }, { - "_id": "6773b39ccf4c2fe4e50a7edc", - "_tpl": "656f611f94b480b8a500c0db", - "parentId": "6773b39ccf4c2fe4e50a7ed6", - "slotId": "Front_plate" - }, { - "_id": "6773b39ccf4c2fe4e50a7edd", - "_tpl": "65573fa5655447403702a816", - "parentId": "6773b39ccf4c2fe4e50a7ed6", - "slotId": "Back_plate" - }, { - "_id": "6773b39ccf4c2fe4e50a7ede", - "_tpl": "675956062f6ddfe8ff0e2806", - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" - }, { - "_id": "6773b39ccf4c2fe4e50a7edf", - "_tpl": "676307c004856a0b3c0dfffd", - "parentId": "6773b39ccf4c2fe4e50a7ede", - "slotId": "Helmet_top" - }, { - "_id": "6773b39ccf4c2fe4e50a7ee0", - "_tpl": "676307b4d9ec0af3d9001fa8", - "parentId": "6773b39ccf4c2fe4e50a7ede", - "slotId": "Helmet_back" - }, { - "_id": "6773b39ccf4c2fe4e50a7ee2", - "_tpl": "674589d98dd67746010329e6", - "upd": { - "StackObjectsCount": 1 - }, - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" - }, { - "_id": "6773b39ccf4c2fe4e50a7ee4", - "_tpl": "67458794e21e5d724e066976", - "upd": { - "StackObjectsCount": 1 - }, - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" - }, { - "_id": "6773b39ccf4c2fe4e50a7ee6", - "_tpl": "5d40407c86f774318526545a", - "upd": { - "StackObjectsCount": 1 - }, - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" - }, { - "_id": "6773b39ccf4c2fe4e50a7ee8", - "_tpl": "5d40407c86f774318526545a", - "upd": { - "StackObjectsCount": 1 - }, - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" - }, { - "_id": "6773b39ccf4c2fe4e50a7eea", - "_tpl": "5d403f9186f7743cac3f229b", - "upd": { - "StackObjectsCount": 1 - }, - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" - }, { - "_id": "6773b39ccf4c2fe4e50a7eec", - "_tpl": "5d403f9186f7743cac3f229b", - "upd": { - "StackObjectsCount": 1 - }, - "parentId": "6773b39ccf4c2fe4e50a7ec2", - "slotId": "main" + "NewYear2024": { + "items": [ + { + "_id": "6773b39ccf4c2fe4e50a7ec3", + "_tpl": "67124dcfa3541f2a1f0e788b", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 } - ], - "sender": "System", + }, + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ec4", + "_tpl": "6719023b612cc94b9008e78c", + "parentId": "6773b39ccf4c2fe4e50a7ec3", + "slotId": "mod_stock" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ec5", + "_tpl": "6709133fa532466d5403fb7c", + "parentId": "6773b39ccf4c2fe4e50a7ec3", + "slotId": "mod_magazine" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ec6", + "_tpl": "670fd0a8d8d4eae4790c8187", + "parentId": "6773b39ccf4c2fe4e50a7ec3", + "slotId": "mod_barrel" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ec7", + "_tpl": "6710cea62bb09af72f0e6bf8", + "parentId": "6773b39ccf4c2fe4e50a7ec6", + "slotId": "mod_mount" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ec8", + "_tpl": "57d17c5e2459775a5c57d17d", + "parentId": "6773b39ccf4c2fe4e50a7ec7", + "slotId": "mod_tactical_003" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ec9", + "_tpl": "6165ac8c290d254f5e6b2f6c", + "parentId": "6773b39ccf4c2fe4e50a7ec3", + "slotId": "mod_scope" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ecb", + "_tpl": "6709133fa532466d5403fb7c", + "upd": { + "StackObjectsCount": 1 + }, + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ecd", + "_tpl": "6709133fa532466d5403fb7c", + "upd": { + "StackObjectsCount": 1 + }, + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ecf", + "_tpl": "6709133fa532466d5403fb7c", + "upd": { + "StackObjectsCount": 1 + }, + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ed1", + "_tpl": "5c0d591486f7744c505b416f", + "upd": { + "StackObjectsCount": 20 + }, + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ed3", + "_tpl": "5c0d591486f7744c505b416f", + "upd": { + "StackObjectsCount": 20 + }, + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ed5", + "_tpl": "5c0d591486f7744c505b416f", + "upd": { + "StackObjectsCount": 20 + }, + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ed6", + "_tpl": "5ab8e79e86f7742d8b372e78", + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ed7", + "_tpl": "65732688d9d89ff7ac0d9c4c", + "parentId": "6773b39ccf4c2fe4e50a7ed6", + "slotId": "Soft_armor_front" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ed8", + "_tpl": "657326978c1cc6dcd9098b56", + "parentId": "6773b39ccf4c2fe4e50a7ed6", + "slotId": "Soft_armor_back" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ed9", + "_tpl": "657326a28c1cc6dcd9098b5a", + "parentId": "6773b39ccf4c2fe4e50a7ed6", + "slotId": "Soft_armor_left" + }, + { + "_id": "6773b39ccf4c2fe4e50a7eda", + "_tpl": "657326b08c1cc6dcd9098b5e", + "parentId": "6773b39ccf4c2fe4e50a7ed6", + "slotId": "soft_armor_right" + }, + { + "_id": "6773b39ccf4c2fe4e50a7edb", + "_tpl": "657326bc5d3a3129fb05f36b", + "parentId": "6773b39ccf4c2fe4e50a7ed6", + "slotId": "Collar" + }, + { + "_id": "6773b39ccf4c2fe4e50a7edc", + "_tpl": "656f611f94b480b8a500c0db", + "parentId": "6773b39ccf4c2fe4e50a7ed6", + "slotId": "Front_plate" + }, + { + "_id": "6773b39ccf4c2fe4e50a7edd", + "_tpl": "65573fa5655447403702a816", + "parentId": "6773b39ccf4c2fe4e50a7ed6", + "slotId": "Back_plate" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ede", + "_tpl": "675956062f6ddfe8ff0e2806", + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + }, + { + "_id": "6773b39ccf4c2fe4e50a7edf", + "_tpl": "676307c004856a0b3c0dfffd", + "parentId": "6773b39ccf4c2fe4e50a7ede", + "slotId": "Helmet_top" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ee0", + "_tpl": "676307b4d9ec0af3d9001fa8", + "parentId": "6773b39ccf4c2fe4e50a7ede", + "slotId": "Helmet_back" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ee2", + "_tpl": "674589d98dd67746010329e6", + "upd": { + "StackObjectsCount": 1 + }, + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ee4", + "_tpl": "67458794e21e5d724e066976", + "upd": { + "StackObjectsCount": 1 + }, + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ee6", + "_tpl": "5d40407c86f774318526545a", + "upd": { + "StackObjectsCount": 1 + }, + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + }, + { + "_id": "6773b39ccf4c2fe4e50a7ee8", + "_tpl": "5d40407c86f774318526545a", + "upd": { + "StackObjectsCount": 1 + }, + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + }, + { + "_id": "6773b39ccf4c2fe4e50a7eea", + "_tpl": "5d403f9186f7743cac3f229b", + "upd": { + "StackObjectsCount": 1 + }, + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + }, + { + "_id": "6773b39ccf4c2fe4e50a7eec", + "_tpl": "5d403f9186f7743cac3f229b", + "upd": { + "StackObjectsCount": 1 + }, + "parentId": "6773b39ccf4c2fe4e50a7ec2", + "slotId": "main" + } + ], + "sender": "System", "messageText": "New year present!", "collectionTimeHours": 72, "associatedEvent": "Promo", "maxToSendPlayer": 5 - } + } } } diff --git a/Server/Assets/configs/inventory.json b/Server/Assets/configs/inventory.json index f55bac67..96b67461 100644 --- a/Server/Assets/configs/inventory.json +++ b/Server/Assets/configs/inventory.json @@ -1411,7 +1411,7 @@ "_type": "opened case - walter event quest", "rewardCount": 4, "foundInRaid": true, - "rewardTplPool": {"67409848d0b2f8eb9b034db9": 1} + "rewardTplPool": { "67409848d0b2f8eb9b034db9": 1 } }, "674098588466ebb03408b210": { "_type": "opened box - walter event quest", @@ -1596,5 +1596,5 @@ "skillGainMultiplers": { "Strength": 1 }, - "deprioritisedMoneyContainers": ["590c60fc86f77412b13fddcf", "5d235bb686f77443f4331278"] + "deprioritisedMoneyContainers": ["590c60fc86f77412b13fddcf", "5d235bb686f77443f4331278"] } diff --git a/Server/Assets/configs/item.json b/Server/Assets/configs/item.json index 6d51496b..e70f0a58 100644 --- a/Server/Assets/configs/item.json +++ b/Server/Assets/configs/item.json @@ -52,12 +52,12 @@ "66da1b546916142b3b022777", "670ad7f1ad195290cd00da7a", "66ec2aa6daf127599c0c31f1", - "67654a6759116d347b0bfb86", - "5751916f24597720a27126df", - "57518f7724597720a31c09ab", - "57518fd424597720c85dbaaa", - "5a043f2c86f7741aa57b5145", - "5a0448bc86f774736f14efa8" + "67654a6759116d347b0bfb86", + "5751916f24597720a27126df", + "57518f7724597720a31c09ab", + "57518fd424597720c85dbaaa", + "5a043f2c86f7741aa57b5145", + "5a0448bc86f774736f14efa8" ], "rewardItemTypeBlacklist": ["65649eb40bf0ed77b8044453"], "lootableItemBlacklist": ["660bbc47c38b837877075e47", "660bc341c38b837877075e4c"], @@ -122,21 +122,26 @@ "671d8b38b769f0d88c0950f8", "671d8b8c0959c721a50ca838", "660bc341c38b837877075e4c", - "67409848d0b2f8eb9b034db9", - "67449b6c89d5e1ddc603f504", - "675aab0d6b6addc02a08f097", - "675aaae1dcf102478202c537", - "675aaa9a3107dac100063331", - "675aaae75a3ab8372d0b02a7", - "675aaab74bca0b001d02f356", - "675aaa8f7f3c962069072b27", - "675aaaf674a7619a5304c233", - "675aaa003107dac10006332f", - "6764207f2fa5e32733055c4a", - "6764202ae307804338014c1a", - "6707d13e4e617ec94f0e5631", - "675dc9d37ae1a8792107ca96", - "675dcb0545b1a2d108011b2b" + "67409848d0b2f8eb9b034db9", + "67449b6c89d5e1ddc603f504", + "675aab0d6b6addc02a08f097", + "675aaae1dcf102478202c537", + "675aaa9a3107dac100063331", + "675aaae75a3ab8372d0b02a7", + "675aaab74bca0b001d02f356", + "675aaa8f7f3c962069072b27", + "675aaaf674a7619a5304c233", + "675aaa003107dac10006332f", + "6764207f2fa5e32733055c4a", + "6764202ae307804338014c1a", + "6707d13e4e617ec94f0e5631", + "675dc9d37ae1a8792107ca96", + "675dcb0545b1a2d108011b2b", + "66d9f8744827a77e870ecaf1", + "6707d0804e617ec94f0e562f", + "67449b6c89d5e1ddc603f504", + "6740987b89d5e1ddc603f4f0", + "6707d0bdaab679420007e01a" ], "bossItems": [ "6275303a9f372d6ea97f9ec7", @@ -183,172 +188,242 @@ "63a898a328e385334e0640a5": { "price": 20000, "parentId": "5b5f6fa186f77409407a7eb7" }, "63a897c6b1ff6e29734fcc95": { "price": 40000, "parentId": "5b5f6fa186f77409407a7eb7" } }, - "customItemGlobalPresets": [ - { - "_changeWeaponName": false, - "_encyclopedia": "675956062f6ddfe8ff0e2806", - "_id": "6777b37393a9a6f10ea57501", - "_items": [ - { - "_id": "6777bee3324b2e0cf7b7cfe1", - "_tpl": "675956062f6ddfe8ff0e2806" - }, - { - "_id": "6777c029e3703d1f9dc47d15", - "_tpl": "676307c004856a0b3c0dfffd", - "parentId": "6777bee3324b2e0cf7b7cfe1", - "slotId": "Helmet_top" - }, - { - "_id": "6777c030386bec3cd3c41b6e", - "_tpl": "676307b4d9ec0af3d9001fa8", - "parentId": "6777bee3324b2e0cf7b7cfe1", - "slotId": "Helmet_back" - } - ], - "_name": "MTEK FLUX Ballistic helmet (MultiCam Alpine) Default", - "_parent": "6777bee3324b2e0cf7b7cfe1", - "_type": "Preset" - }, - { - "_changeWeaponName": false, - "_encyclopedia": "6759655674aa5e0825040d62", - "_id": "6777bf37e10ffdb431ff9508", - "_items": [ - { - "_id": "6777bf03ad549e66e7ad06b2", - "_tpl": "6759655674aa5e0825040d62" - }, - { - "_id": "6777c02180ddaee0b54493da", - "_tpl": "676307c004856a0b3c0dfffd", - "parentId": "6777bf03ad549e66e7ad06b2", - "slotId": "Helmet_top" - }, - { - "_id": "6777c00f41b022243abdac99", - "_tpl": "676307b4d9ec0af3d9001fa8", - "parentId": "6777bf03ad549e66e7ad06b2", - "slotId": "Helmet_back" - } - ], - "_name": "MTEK FLUX Ballistic helmet (Olive Drab) Default", - "_parent": "6777bf03ad549e66e7ad06b2", - "_type": "Preset" - }, - { - "_changeWeaponName": false, - "_encyclopedia": "67597ceea35600b4c10cea86", - "_id": "6777bfee0658691ef27d9993", - "_items": [ - { - "_id": "6777bfaaaf1999ce0701bc00", - "_tpl": "67597ceea35600b4c10cea86" - }, - { - "_id": "6777c01b07b5d347d6b99404", - "_tpl": "676307ded8b241b4f703a3e8", - "parentId": "6777bfaaaf1999ce0701bc00", - "slotId": "Helmet_top" - }, - { - "_id": "6777c0033f374912b965ae5a", - "_tpl": "676307d3d9ec0af3d9001fac", - "parentId": "6777bfaaaf1999ce0701bc00", - "slotId": "Helmet_back" - } - ], - "_name": "MTEK FLUX Ballistic helmet (Coyote) Default", - "_parent": "6777bfaaaf1999ce0701bc00", - "_type": "Preset" - }, - { - "_changeWeaponName": false, - "_encyclopedia": "67597d241d5a44f2f605df06", - "_id": "6777c1244557b9b1474da362", - "_items": [ - { - "_id": "6777c10f4989fc544063b5a1", - "_tpl": "67597d241d5a44f2f605df06" - }, - { - "_id": "6777c1293c00b35cd6960536", - "_tpl": "676307ded8b241b4f703a3e8", - "parentId": "6777c10f4989fc544063b5a1", - "slotId": "Helmet_top" - }, - { - "_id": "6777c12f8fc234973af0cf16", - "_tpl": "676307d3d9ec0af3d9001fac", - "parentId": "6777c10f4989fc544063b5a1", - "slotId": "Helmet_back" - } - ], - "_name": "MTEK FLUX Ballistic helmet (Coyote/MultiCam Arid) Default", - "_parent": "6777c10f4989fc544063b5a1", - "_type": "Preset" - }, - { - "_changeWeaponName": false, - "_encyclopedia": "674d91ce6e862d5a95059ed6", - "_id": "67784df15058057382b28f87", - "_items": [ - { - "_id": "67784dfaf57296ecbdbfc87f", - "_tpl": "674d91ce6e862d5a95059ed6" - }, - { - "_id": "67784e27ee352de60dc982a3", - "_tpl": "6575ea3060703324250610da", - "parentId": "67784dfaf57296ecbdbfc87f", - "slotId": "Soft_armor_front" - }, - { - "_id": "67784e32d75f52daffe36de5", - "_tpl": "6575ea4cf6a13a7b7100adc4", - "parentId": "67784dfaf57296ecbdbfc87f", - "slotId": "Soft_armor_back" - }, - { - "_id": "67784e36e778f8aace662e1d", - "_tpl": "6575ea5cf6a13a7b7100adc8", - "parentId": "67784dfaf57296ecbdbfc87f", - "slotId": "Soft_armor_left" - }, - { - "_id": "67784e3c0e4afac4ebdab52d", - "_tpl": "6575ea6760703324250610de", - "parentId": "67784dfaf57296ecbdbfc87f", - "slotId": "soft_armor_right" - }, - { - "_id": "67784e40832d547cb2c986bf", - "_tpl": "6575ea719c7cad336508e418", - "parentId": "67784dfaf57296ecbdbfc87f", - "slotId": "Collar" - }, - { - "_id": "67784e446c92fcb0e0d8fea8", - "_tpl": "6575ea7c60703324250610e2", - "parentId": "67784dfaf57296ecbdbfc87f", - "slotId": "Groin" - }, - { - "_id": "67784e473abf2a39a05dba5a", - "_tpl": "656f611f94b480b8a500c0db", - "parentId": "67784dfaf57296ecbdbfc87f", - "slotId": "Front_plate" - }, - { - "_id": "67784e4b934ace8451681bee", - "_tpl": "656efaf54772930db4031ff5", - "parentId": "67784dfaf57296ecbdbfc87f", - "slotId": "Back_plate" - } - ], - "_name": "Body armor 6B13 M Killa Christmas Standard", - "_parent": "67784dfaf57296ecbdbfc87f", - "_type": "Preset" - } - ] + "customItemGlobalPresets": [ + { + "_changeWeaponName": false, + "_encyclopedia": "675956062f6ddfe8ff0e2806", + "_id": "6777b37393a9a6f10ea57501", + "_items": [ + { + "_id": "6777bee3324b2e0cf7b7cfe1", + "_tpl": "675956062f6ddfe8ff0e2806" + }, + { + "_id": "6777c029e3703d1f9dc47d15", + "_tpl": "676307c004856a0b3c0dfffd", + "parentId": "6777bee3324b2e0cf7b7cfe1", + "slotId": "Helmet_top" + }, + { + "_id": "6777c030386bec3cd3c41b6e", + "_tpl": "676307b4d9ec0af3d9001fa8", + "parentId": "6777bee3324b2e0cf7b7cfe1", + "slotId": "Helmet_back" + } + ], + "_name": "MTEK FLUX Ballistic helmet (MultiCam Alpine) Default", + "_parent": "6777bee3324b2e0cf7b7cfe1", + "_type": "Preset" + }, + { + "_changeWeaponName": false, + "_encyclopedia": "6759655674aa5e0825040d62", + "_id": "6777bf37e10ffdb431ff9508", + "_items": [ + { + "_id": "6777bf03ad549e66e7ad06b2", + "_tpl": "6759655674aa5e0825040d62" + }, + { + "_id": "6777c02180ddaee0b54493da", + "_tpl": "676307c004856a0b3c0dfffd", + "parentId": "6777bf03ad549e66e7ad06b2", + "slotId": "Helmet_top" + }, + { + "_id": "6777c00f41b022243abdac99", + "_tpl": "676307b4d9ec0af3d9001fa8", + "parentId": "6777bf03ad549e66e7ad06b2", + "slotId": "Helmet_back" + } + ], + "_name": "MTEK FLUX Ballistic helmet (Olive Drab) Default", + "_parent": "6777bf03ad549e66e7ad06b2", + "_type": "Preset" + }, + { + "_changeWeaponName": false, + "_encyclopedia": "67597ceea35600b4c10cea86", + "_id": "6777bfee0658691ef27d9993", + "_items": [ + { + "_id": "6777bfaaaf1999ce0701bc00", + "_tpl": "67597ceea35600b4c10cea86" + }, + { + "_id": "6777c01b07b5d347d6b99404", + "_tpl": "676307ded8b241b4f703a3e8", + "parentId": "6777bfaaaf1999ce0701bc00", + "slotId": "Helmet_top" + }, + { + "_id": "6777c0033f374912b965ae5a", + "_tpl": "676307d3d9ec0af3d9001fac", + "parentId": "6777bfaaaf1999ce0701bc00", + "slotId": "Helmet_back" + } + ], + "_name": "MTEK FLUX Ballistic helmet (Coyote) Default", + "_parent": "6777bfaaaf1999ce0701bc00", + "_type": "Preset" + }, + { + "_changeWeaponName": false, + "_encyclopedia": "67597d241d5a44f2f605df06", + "_id": "6777c1244557b9b1474da362", + "_items": [ + { + "_id": "6777c10f4989fc544063b5a1", + "_tpl": "67597d241d5a44f2f605df06" + }, + { + "_id": "6777c1293c00b35cd6960536", + "_tpl": "676307ded8b241b4f703a3e8", + "parentId": "6777c10f4989fc544063b5a1", + "slotId": "Helmet_top" + }, + { + "_id": "6777c12f8fc234973af0cf16", + "_tpl": "676307d3d9ec0af3d9001fac", + "parentId": "6777c10f4989fc544063b5a1", + "slotId": "Helmet_back" + } + ], + "_name": "MTEK FLUX Ballistic helmet (Coyote/MultiCam Arid) Default", + "_parent": "6777c10f4989fc544063b5a1", + "_type": "Preset" + }, + { + "_changeWeaponName": false, + "_encyclopedia": "674d91ce6e862d5a95059ed6", + "_id": "67784df15058057382b28f87", + "_items": [ + { + "_id": "67784dfaf57296ecbdbfc87f", + "_tpl": "674d91ce6e862d5a95059ed6" + }, + { + "_id": "67784e27ee352de60dc982a3", + "_tpl": "6575ea3060703324250610da", + "parentId": "67784dfaf57296ecbdbfc87f", + "slotId": "Soft_armor_front" + }, + { + "_id": "67784e32d75f52daffe36de5", + "_tpl": "6575ea4cf6a13a7b7100adc4", + "parentId": "67784dfaf57296ecbdbfc87f", + "slotId": "Soft_armor_back" + }, + { + "_id": "67784e36e778f8aace662e1d", + "_tpl": "6575ea5cf6a13a7b7100adc8", + "parentId": "67784dfaf57296ecbdbfc87f", + "slotId": "Soft_armor_left" + }, + { + "_id": "67784e3c0e4afac4ebdab52d", + "_tpl": "6575ea6760703324250610de", + "parentId": "67784dfaf57296ecbdbfc87f", + "slotId": "soft_armor_right" + }, + { + "_id": "67784e40832d547cb2c986bf", + "_tpl": "6575ea719c7cad336508e418", + "parentId": "67784dfaf57296ecbdbfc87f", + "slotId": "Collar" + }, + { + "_id": "67784e446c92fcb0e0d8fea8", + "_tpl": "6575ea7c60703324250610e2", + "parentId": "67784dfaf57296ecbdbfc87f", + "slotId": "Groin" + }, + { + "_id": "67784e473abf2a39a05dba5a", + "_tpl": "656f611f94b480b8a500c0db", + "parentId": "67784dfaf57296ecbdbfc87f", + "slotId": "Front_plate" + }, + { + "_id": "67784e4b934ace8451681bee", + "_tpl": "656efaf54772930db4031ff5", + "parentId": "67784dfaf57296ecbdbfc87f", + "slotId": "Back_plate" + } + ], + "_name": "Body armor 6B13 M Killa Christmas Standard", + "_parent": "67784dfaf57296ecbdbfc87f", + "_type": "Preset" + }, + { + "_changeWeaponName": false, + "_encyclopedia": "6745895717824b1ec20570a6", + "_id": "677d14927f8ee8353d85918d", + "_items": [ + { + "_id": "677d14a27757dcc54a3054fb", + "_tpl": "6745895717824b1ec20570a6" + }, + { + "_id": "677d14abef2285ed18ee3e62", + "_tpl": "657baaf0b7e9ca9a02045c02", + "parentId": "677d14a27757dcc54a3054fb", + "slotId": "Helmet_top" + }, + { + "_id": "677d14b0024eda59d1544794", + "_tpl": "657bab6ec6f689d3a205b85f", + "parentId": "677d14a27757dcc54a3054fb", + "slotId": "Helmet_back" + }, + { + "_id": "677d14bb1dfea5b33fa31337", + "_tpl": "657babc6f58ba5a6250107a2", + "parentId": "677d14a27757dcc54a3054fb", + "slotId": "Helmet_ears" + } + ], + "_name": "6B47 Ratnik-BSh helmet (EMR Arctic cover) default", + "_parent": "677d14a27757dcc54a3054fb", + "_type": "Preset" + }, + { + "_changeWeaponName": false, + "_encyclopedia": "6759af0f9c8a538dd70bfae6", + "_id": "677e90e191de7ae4136e3967", + "_items": [ + { + "_id": "677e90d1fc28426ede1448bd", + "_tpl": "6759af0f9c8a538dd70bfae6" + }, + { + "_id": "677e90e71b6c92662b1b5cce", + "_tpl": "6571133d22996eaf11088200", + "parentId": "677e90d1fc28426ede1448bd", + "slotId": "Helmet_top" + }, + { + "_id": "677e90ef6b6b559c36d31485", + "_tpl": "6571138e818110db4600aa71", + "parentId": "677e90d1fc28426ede1448bd", + "slotId": "Helmet_back" + }, + { + "_id": "677e90f2e2de53f5b48dd35d", + "_tpl": "657112fa818110db4600aa6b", + "parentId": "677e90d1fc28426ede1448bd", + "slotId": "Helmet_ears" + }, + { + "_id": "677e90f61cc7ed9f89331cac", + "_tpl": "5c0e842486f77443a74d2976", + "parentId": "677e90d1fc28426ede1448bd", + "slotId": "mod_equipment" + } + ], + "_name": "Maska-1SCh bulletproof helmet (Christmas Edition) default", + "_parent": "677e90d1fc28426ede1448bd", + "_type": "Preset" + } + ] } diff --git a/Server/Assets/configs/location.json b/Server/Assets/configs/location.json index 8f22f8d6..da4a99f6 100644 --- a/Server/Assets/configs/location.json +++ b/Server/Assets/configs/location.json @@ -539,5 +539,11 @@ "nonTriggered": 80, "triggered": 90 }, + "tplsToStripChildItemsFrom": [ + "63a8970d7108f713591149f5", + "63a897c6b1ff6e29734fcc95", + "63a898a328e385334e0640a5", + "634959225289190e5e773b3b" + ], "nonMaps": ["base", "develop", "hideout", "privatearea", "suburbs", "terminal", "town"] } diff --git a/Server/Assets/configs/playerscav.json b/Server/Assets/configs/playerscav.json index cc638f89..742d94a7 100644 --- a/Server/Assets/configs/playerscav.json +++ b/Server/Assets/configs/playerscav.json @@ -123,20 +123,20 @@ "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "drugs": { "weights": { "0": 1, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "stims": { "weights": { "0": 1 }, - "whitelist": {} + "whitelist": [] }, "looseLoot": { "weights": { @@ -146,21 +146,21 @@ "3": 1, "4": 1 }, - "whitelist": {} + "whitelist": [] }, "magazines": { "weights": { "1": 2, "2": 1 }, - "whitelist": {} + "whitelist": [] }, "grenades": { "weights": { "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] } }, "lootItemsToAddChancePercent": {} @@ -208,20 +208,20 @@ "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "drugs": { "weights": { "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "stims": { "weights": { "0": 1 }, - "whitelist": {} + "whitelist": [] }, "looseLoot": { "weights": { @@ -231,21 +231,21 @@ "3": 1, "4": 1 }, - "whitelist": {} + "whitelist": [] }, "magazines": { "weights": { "1": 2, "2": 1 }, - "whitelist": {} + "whitelist": [] }, "grenades": { "weights": { "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] } }, "lootItemsToAddChancePercent": {} @@ -293,20 +293,20 @@ "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "drugs": { "weights": { "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "stims": { "weights": { "0": 1 }, - "whitelist": {} + "whitelist": [] }, "looseLoot": { "weights": { @@ -316,21 +316,21 @@ "3": 1, "4": 1 }, - "whitelist": {} + "whitelist": [] }, "magazines": { "weights": { "1": 2, "2": 1 }, - "whitelist": {} + "whitelist": [] }, "grenades": { "weights": { "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] } }, "lootItemsToAddChancePercent": {} @@ -378,20 +378,20 @@ "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "drugs": { "weights": { "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "stims": { "weights": { "0": 1 }, - "whitelist": {} + "whitelist": [] }, "looseLoot": { "weights": { @@ -401,21 +401,21 @@ "3": 1, "4": 1 }, - "whitelist": {} + "whitelist": [] }, "magazines": { "weights": { "1": 2, "2": 1 }, - "whitelist": {} + "whitelist": [] }, "grenades": { "weights": { "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] } }, "lootItemsToAddChancePercent": {} @@ -463,20 +463,20 @@ "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "drugs": { "weights": { "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "stims": { "weights": { "0": 1 }, - "whitelist": {} + "whitelist": [] }, "looseLoot": { "weights": { @@ -486,21 +486,21 @@ "3": 1, "4": 1 }, - "whitelist": {} + "whitelist": [] }, "magazines": { "weights": { "1": 2, "2": 1 }, - "whitelist": {} + "whitelist": [] }, "grenades": { "weights": { "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] } }, "lootItemsToAddChancePercent": {} @@ -548,20 +548,20 @@ "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "drugs": { "weights": { "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "stims": { "weights": { "0": 1 }, - "whitelist": {} + "whitelist": [] }, "looseLoot": { "weights": { @@ -571,21 +571,21 @@ "3": 1, "4": 1 }, - "whitelist": {} + "whitelist": [] }, "magazines": { "weights": { "1": 2, "2": 1 }, - "whitelist": {} + "whitelist": [] }, "grenades": { "weights": { "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] } }, "lootItemsToAddChancePercent": {} @@ -633,20 +633,20 @@ "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "drugs": { "weights": { "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "stims": { "weights": { "0": 1 }, - "whitelist": {} + "whitelist": [] }, "looseLoot": { "weights": { @@ -656,21 +656,21 @@ "3": 1, "4": 1 }, - "whitelist": {} + "whitelist": [] }, "magazines": { "weights": { "1": 1, "2": 1 }, - "whitelist": {} + "whitelist": [] }, "grenades": { "weights": { "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] } }, "lootItemsToAddChancePercent": {} @@ -718,7 +718,7 @@ "0": 2, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "drugs": { "weights": { @@ -726,13 +726,13 @@ "1": 1, "2": 1 }, - "whitelist": {} + "whitelist": [] }, "stims": { "weights": { "0": 1 }, - "whitelist": {} + "whitelist": [] }, "looseLoot": { "weights": { @@ -741,7 +741,7 @@ "3": 1, "4": 1 }, - "whitelist": {} + "whitelist": [] }, "magazines": { "weights": { @@ -749,7 +749,7 @@ "2": 2, "3": 1 }, - "whitelist": {} + "whitelist": [] }, "grenades": { "weights": { @@ -757,7 +757,7 @@ "1": 1, "2": 1 }, - "whitelist": {} + "whitelist": [] } }, "lootItemsToAddChancePercent": { @@ -808,42 +808,42 @@ "1": 1, "2": 2 }, - "whitelist": {} + "whitelist": [] }, "drugs": { "weights": { "1": 1, "2": 2 }, - "whitelist": {} + "whitelist": [] }, "stims": { "weights": { "0": 1, "1": 1 }, - "whitelist": {} + "whitelist": [] }, "looseLoot": { "weights": { "2": 2, "3": 1 }, - "whitelist": {} + "whitelist": [] }, "magazines": { "weights": { "2": 2, "3": 1 }, - "whitelist": {} + "whitelist": [] }, "grenades": { "weights": { "1": 1, "2": 1 }, - "whitelist": {} + "whitelist": [] } }, "lootItemsToAddChancePercent": { @@ -895,21 +895,21 @@ "1": 1, "2": 2 }, - "whitelist": {} + "whitelist": [] }, "drugs": { "weights": { "1": 1, "2": 2 }, - "whitelist": {} + "whitelist": [] }, "stims": { "weights": { "1": 5, "2": 1 }, - "whitelist": {} + "whitelist": [] }, "looseLoot": { "weights": { @@ -918,7 +918,7 @@ "4": 1, "5": 1 }, - "whitelist": {} + "whitelist": [] }, "magazines": { "weights": { @@ -926,14 +926,14 @@ "3": 2, "4": 1 }, - "whitelist": {} + "whitelist": [] }, "grenades": { "weights": { "1": 1, "2": 2 }, - "whitelist": {} + "whitelist": [] } }, "lootItemsToAddChancePercent": { @@ -984,21 +984,21 @@ "weights": { "2": 1 }, - "whitelist": {} + "whitelist": [] }, "drugs": { "weights": { "2": 1, "3": 2 }, - "whitelist": {} + "whitelist": [] }, "stims": { "weights": { "1": 1, "2": 1 }, - "whitelist": {} + "whitelist": [] }, "looseLoot": { "weights": { @@ -1007,7 +1007,7 @@ "5": 1, "6": 1 }, - "whitelist": {} + "whitelist": [] }, "magazines": { "weights": { @@ -1015,14 +1015,14 @@ "3": 2, "4": 1 }, - "whitelist": {} + "whitelist": [] }, "grenades": { "weights": { "2": 1, "3": 2 }, - "whitelist": {} + "whitelist": [] } }, "lootItemsToAddChancePercent": { @@ -1074,21 +1074,21 @@ "2": 5, "3": 1 }, - "whitelist": {} + "whitelist": [] }, "drugs": { "weights": { "2": 1, "3": 2 }, - "whitelist": {} + "whitelist": [] }, "stims": { "weights": { "1": 1, "2": 1 }, - "whitelist": {} + "whitelist": [] }, "looseLoot": { "weights": { @@ -1097,21 +1097,21 @@ "5": 2, "6": 1 }, - "whitelist": {} + "whitelist": [] }, "magazines": { "weights": { "3": 2, "4": 2 }, - "whitelist": {} + "whitelist": [] }, "grenades": { "weights": { "2": 2, "3": 1 }, - "whitelist": {} + "whitelist": [] } }, "lootItemsToAddChancePercent": { @@ -1180,21 +1180,21 @@ "2": 1, "3": 2 }, - "whitelist": {} + "whitelist": [] }, "drugs": { "weights": { "3": 1, "4": 2 }, - "whitelist": {} + "whitelist": [] }, "stims": { "weights": { "2": 1, "3": 2 }, - "whitelist": {} + "whitelist": [] }, "looseLoot": { "weights": { @@ -1202,21 +1202,21 @@ "6": 2, "7": 1 }, - "whitelist": {} + "whitelist": [] }, "magazines": { "weights": { "3": 1, "4": 4 }, - "whitelist": {} + "whitelist": [] }, "grenades": { "weights": { "3": 1, "4": 2 }, - "whitelist": {} + "whitelist": [] } }, "lootItemsToAddChancePercent": { diff --git a/Server/Assets/configs/pmc.json b/Server/Assets/configs/pmc.json index 65962a79..88ba6773 100644 --- a/Server/Assets/configs/pmc.json +++ b/Server/Assets/configs/pmc.json @@ -151,9 +151,15 @@ "675dc9d37ae1a8792107ca96", "675dcb0545b1a2d108011b2b", "6707d13e4e617ec94f0e5631", - "67408903268737ef6908d432", - "67499b9b909d2013670a5029", - "6638a5474e92f038531e210e" + "67408903268737ef6908d432", + "67499b9b909d2013670a5029", + "6638a5474e92f038531e210e", + "66d9f8744827a77e870ecaf1", + "6707d0804e617ec94f0e562f", + "67449b6c89d5e1ddc603f504", + "6740987b89d5e1ddc603f4f0", + "6707d0bdaab679420007e01a", + "66d9f7e7099cf6adcc07a369" ], "useDifficultyOverride": false, "difficulty": "AsOnline", @@ -717,6 +723,40 @@ "value": 2500000 } ], + "lootItemLimitsRub": [ + { + "min": 46, + "max": 64, + "backpack": { + "min": 5000, + "max": 0 + }, + "pocket": { + "min": 5000, + "max": 0 + }, + "vest": { + "min": 5000, + "max": 0 + } + }, + { + "min": 65, + "max": 100, + "backpack": { + "min": 10000, + "max": 0 + }, + "pocket": { + "min": 10000, + "max": 0 + }, + "vest": { + "min": 10000, + "max": 0 + } + } + ], "maxPocketLootTotalRub": 50000, "maxVestLootTotalRub": 50000, "convertIntoPmcChance": { @@ -726,8 +766,8 @@ "max": 35 }, "cursedassault": { - "min": 15, - "max": 30 + "min": 0, + "max": 0 }, "pmcbot": { "min": 5, @@ -772,8 +812,8 @@ "hostilitySettings": { "pmcusec": { "additionalEnemyTypes": [ - "arenaFighterEvent", - "marksman", + "arenaFighterEvent", + "marksman", "peacemaker", "skier", "ravangeZryachiyEvent", @@ -796,14 +836,16 @@ "followerBigPipe", "followerBirdEye", "followerBully", - "followerBoarClose1", - "followerBoarClose2" + "followerBoarClose1", + "followerBoarClose2" ], "additionalFriendlyTypes": ["gifter", "shooterBTR", "sectactPriestEvent", "peacefullZryachiyEvent"], - "chancedEnemies": [{ + "chancedEnemies": [ + { "EnemyChance": 85, "Role": "pmcUSEC" - }, { + }, + { "EnemyChance": 100, "Role": "pmcBEAR" } @@ -815,8 +857,8 @@ }, "pmcbear": { "additionalEnemyTypes": [ - "arenaFighterEvent", - "marksman", + "arenaFighterEvent", + "marksman", "peacemaker", "skier", "ravangeZryachiyEvent", @@ -839,14 +881,16 @@ "followerBigPipe", "followerBirdEye", "followerBully", - "followerBoarClose1", - "followerBoarClose2" + "followerBoarClose1", + "followerBoarClose2" ], "additionalFriendlyTypes": ["gifter", "shooterBTR", "sectactPriestEvent", "peacefullZryachiyEvent"], - "chancedEnemies": [{ + "chancedEnemies": [ + { "EnemyChance": 85, "Role": "pmcBEAR" - }, { + }, + { "EnemyChance": 100, "Role": "pmcUSEC" } diff --git a/Server/Assets/configs/quest.json b/Server/Assets/configs/quest.json index 10062996..4e0af028 100644 --- a/Server/Assets/configs/quest.json +++ b/Server/Assets/configs/quest.json @@ -16,8 +16,8 @@ "5e381b0286f77420e3417a74", "5e4d4ac186f774264f758336", "639136d68ba6894d155e77cf", - "6613f3007f6666d56807c929", - "6613f307fca4f2f386029409" + "6613f3007f6666d56807c929", + "6613f307fca4f2f386029409" ], "profileBlacklist": { "unheard_edition": ["666314a50aa5c7436c00908a"] diff --git a/Server/Assets/configs/ragfair.json b/Server/Assets/configs/ragfair.json index e7450ca0..999424d8 100644 --- a/Server/Assets/configs/ragfair.json +++ b/Server/Assets/configs/ragfair.json @@ -147,6 +147,18 @@ "max": 1 } }, + "5c164d2286f774194c5e69fa": { + "_name": "KEYCARD", + "conditionChance": 0.04, + "current": { + "min": 0, + "max": 1 + }, + "max": { + "min": 0.25, + "max": 1 + } + }, "5448e5284bdc2dcb718b4567": { "_name": "VEST", "conditionChance": 0.2, @@ -337,13 +349,13 @@ "newPriceHandbookMultiplier": 11 } }, - "itemPriceOverrideRouble":{ - "66bc98a01a47be227a5e956e": 500000, - "63a8970d7108f713591149f5": 50000, - "63a898a328e385334e0640a5": 100000, - "63a897c6b1ff6e29734fcc95": 200000, - "674d91ce6e862d5a95059ed6": 250000 - } + "itemPriceOverrideRouble": { + "66bc98a01a47be227a5e956e": 500000, + "63a8970d7108f713591149f5": 50000, + "63a898a328e385334e0640a5": 100000, + "63a897c6b1ff6e29734fcc95": 200000, + "674d91ce6e862d5a95059ed6": 250000 + } }, "tieredFlea": { "enabled": false, diff --git a/Server/Assets/configs/seasonalevents.json b/Server/Assets/configs/seasonalevents.json index 6981a20b..99e7f5bb 100644 --- a/Server/Assets/configs/seasonalevents.json +++ b/Server/Assets/configs/seasonalevents.json @@ -98,13 +98,13 @@ "5a43957686f7742a2c2f11b0": 150 } }, - "bosskilla": { + "bosskilla": { "ArmorVest": { "674d91ce6e862d5a95059ed6": 200 }, - "Headwear": { - "6759af0f9c8a538dd70bfae6": 200 - } + "Headwear": { + "6759af0f9c8a538dd70bfae6": 200 + } }, "bossknight": { "FaceCover": { @@ -242,7 +242,7 @@ "bear": { "FaceCover": { "5c1a1e3f2e221602b66cc4c2": 30, - "675ac888803644528007b3f6": 30 + "675ac888803644528007b3f6": 30 }, "Headwear": { "5a43957686f7742a2c2f11b0": 80, @@ -252,7 +252,7 @@ "usec": { "FaceCover": { "5c1a1e3f2e221602b66cc4c2": 30, - "675ac888803644528007b3f6": 30 + "675ac888803644528007b3f6": 30 }, "Headwear": { "5a43957686f7742a2c2f11b0": 80, @@ -261,28 +261,28 @@ } } }, - "eventLoot": { - "christmas": { - "assault": { - "Pockets": { - "5df8a6a186f77412640e2e80": 2200, - "5df8a72c86f77412640e2e83": 2200, - "5df8a77486f77412672a1e3f": 2200 - }, - "Backpack": { - "5df8a6a186f77412640e2e80": 2200, - "5df8a72c86f77412640e2e83": 2200, - "5df8a77486f77412672a1e3f": 2200, - "63a8970d7108f713591149f5": 250 - }, - "TacticalVest": { - "5df8a6a186f77412640e2e80": 2200, - "5df8a72c86f77412640e2e83": 2200, - "5df8a77486f77412672a1e3f": 2200 - } - } - } - }, + "eventLoot": { + "christmas": { + "assault": { + "Pockets": { + "5df8a6a186f77412640e2e80": 2200, + "5df8a72c86f77412640e2e83": 2200, + "5df8a77486f77412672a1e3f": 2200 + }, + "Backpack": { + "5df8a6a186f77412640e2e80": 2200, + "5df8a72c86f77412640e2e83": 2200, + "5df8a77486f77412672a1e3f": 2200, + "63a8970d7108f713591149f5": 250 + }, + "TacticalVest": { + "5df8a6a186f77412640e2e80": 2200, + "5df8a72c86f77412640e2e83": 2200, + "5df8a77486f77412672a1e3f": 2200 + } + } + } + }, "eventBotMapping": { "peacefullZryachiyEvent": "bossZryachiy", "sectactPriestEvent": "sectantPriest", @@ -8363,9 +8363,9 @@ "endDay": "31", "endMonth": "12", "settings": { - "enableChristmasHideout": true, + "enableChristmasHideout": true, "enableSanta": true, - "adjustBotAppearances": true + "adjustBotAppearances": true } }, { @@ -8376,24 +8376,24 @@ "startMonth": "1", "endDay": "1", "endMonth": "1", - "settings": { - "enableChristmasHideout": true, + "settings": { + "enableChristmasHideout": true, "enableSanta": true, - "adjustBotAppearances": true + "adjustBotAppearances": true } }, - { + { "enabled": true, "name": "christmas January", "type": "CHRISTMAS", "startDay": "2", "startMonth": "1", - "endDay": "7", + "endDay": "14", "endMonth": "1", "settings": { - "enableChristmasHideout": true, + "enableChristmasHideout": true, "enableSanta": true, - "adjustBotAppearances": true + "adjustBotAppearances": true } }, { @@ -12314,11 +12314,11 @@ ] } }, - "christmasContainerIds": [ - "container_custom_DesignStuff_00427", - "container_Shopping_Mall_DesignStuff_00808", - "container_Lighthouse_DesignStuff_00001", - "container_shoreline_DesignStuff_00418", - "container_woods_design_stuff_00328" - ] + "christmasContainerIds": [ + "container_custom_DesignStuff_00427", + "container_Shopping_Mall_DesignStuff_00808", + "container_Lighthouse_DesignStuff_00001", + "container_shoreline_DesignStuff_00418", + "container_woods_design_stuff_00328" + ] } diff --git a/Server/Assets/configs/trader.json b/Server/Assets/configs/trader.json index 17a93ede..ea8b545e 100644 --- a/Server/Assets/configs/trader.json +++ b/Server/Assets/configs/trader.json @@ -365,7 +365,7 @@ "65ddcc9cfa85b9f17d0dfb07", "660312cc4d6cdfa6f500c703", "6655e35b6bc645cb7b059912", - "6759673c76e93d8eb20b2080" + "6759673c76e93d8eb20b2080" ], "coopExtractGift": { "sendGift": true, diff --git a/Server/Assets/configs/weather.json b/Server/Assets/configs/weather.json index 45c96594..5a77166a 100644 --- a/Server/Assets/configs/weather.json +++ b/Server/Assets/configs/weather.json @@ -97,56 +97,64 @@ "weights": [1, 2] } }, - "seasonDates": [{ + "seasonDates": [ + { "seasonType": 0, "name": "SUMMER", "startDay": "2", "startMonth": "6", "endDay": "15", "endMonth": "10" - }, { + }, + { "seasonType": 1, "name": "AUTUMN", "startDay": "15", "startMonth": "10", "endDay": "1", "endMonth": "11" - }, { + }, + { "seasonType": 4, "name": "AUTUMN_LATE", "startDay": "1", "startMonth": "11", "endDay": "21", "endMonth": "12" - }, { + }, + { "seasonType": 2, "name": "WINTER_START", "startDay": "21", "startMonth": "12", "endDay": "31", "endMonth": "12" - }, { + }, + { "seasonType": 2, "name": "WINTER_END", "startDay": "1", "startMonth": "1", "endDay": "9", "endMonth": "1" - }, { + }, + { "seasonType": 5, "name": "SPRING_EARLY", "startDay": "9", "startMonth": "1", "endDay": "25", "endMonth": "3" - }, { + }, + { "seasonType": 3, "name": "SPRING", "startDay": "25", "startMonth": "3", "endDay": "2", "endMonth": "6" - }, { + }, + { "seasonType": 4, "name": "STORM", "startDay": "24", diff --git a/Server/Assets/database/bots/base.json b/Server/Assets/database/bots/base.json index 9c168991..49fb4a29 100644 --- a/Server/Assets/database/bots/base.json +++ b/Server/Assets/database/bots/base.json @@ -76,9 +76,7 @@ "DamageHistory": { "LethalDamagePart": "Head", "LethalDamage": null, - "BodyParts": { - "Head": [] - } + "BodyParts": [] }, "LastPlayerState": null, "TotalInGameTime": 0, diff --git a/Server/Assets/database/globals.json b/Server/Assets/database/globals.json index 9b3e4c75..22a48c91 100644 --- a/Server/Assets/database/globals.json +++ b/Server/Assets/database/globals.json @@ -34670,6 +34670,41 @@ "MaxInLobby": 0, "MaxInRaid": 0, "TemplateId": "676aa450fe1fc45172014df2" + }, + { + "MaxInLobby": 0, + "MaxInRaid": 5, + "TemplateId": "5b7c710788a4506dec015957" + }, + { + "MaxInLobby": 0, + "MaxInRaid": 5, + "TemplateId": "5c093db286f7740a1b2617e3" + }, + { + "MaxInLobby": 0, + "MaxInRaid": 5, + "TemplateId": "5c0a840b86f7742ffa4f2482" + }, + { + "MaxInLobby": 0, + "MaxInRaid": 5, + "TemplateId": "5aafbcd986f7745e590fff23" + }, + { + "MaxInLobby": 0, + "MaxInRaid": 5, + "TemplateId": "59fb016586f7746d0d4b423a" + }, + { + "MaxInLobby": 0, + "MaxInRaid": 5, + "TemplateId": "59fb042886f7746c5005a7b2" + }, + { + "MaxInLobby": 0, + "MaxInRaid": 5, + "TemplateId": "5b6d9ce188a4501afc1b2b25" } ], "RunddansSettings": { diff --git a/Server/Assets/database/hideout/areas.json b/Server/Assets/database/hideout/areas.json index d9d5c773..6eff2a66 100644 --- a/Server/Assets/database/hideout/areas.json +++ b/Server/Assets/database/hideout/areas.json @@ -3355,7 +3355,7 @@ "count": 1, "isEncoded": false, "isFunctional": false, - "isSpawnedInSession": true, + "isSpawnedInSession": false, "templateId": "6389c7f115805221fb410466", "type": "Item" } @@ -4626,7 +4626,7 @@ "count": 1, "isEncoded": false, "isFunctional": false, - "isSpawnedInSession": true, + "isSpawnedInSession": false, "templateId": "6389c85357baa773a825b356", "type": "Item" } diff --git a/Server/Assets/database/hideout/production.json b/Server/Assets/database/hideout/production.json index fa03f90c..85cd1aea 100644 --- a/Server/Assets/database/hideout/production.json +++ b/Server/Assets/database/hideout/production.json @@ -1,76 +1,127 @@ { + "cultistRecipes": [ + { + "_id": "66827062405f392b203a44cf" + } + ], "recipes": [ { - "_id": "5eda007f658fac5b8c3862a6", - "areaType": 11, + "_id": "5eda07acb6c564225571536c", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5e4abfed86f77406a2713cf7", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2800, "requirements": [ { - "areaType": 11, + "areaType": 2, "requiredLevel": 2, "type": "Area" }, { - "templateId": "5c1265fc86f7743f896a21c2", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5e2af41e86f774755a234b67", "type": "Item" }, { - "templateId": "5af0561e86f7745f5f3ad6ac", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5e2af4a786f7746d3f3c3400", "type": "Item" }, { - "templateId": "5d0376a486f7747d8050965c", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c639286f774151567fa95", + "templateId": "62a0a098de7ac8199358053b", "type": "Tool" }, { - "templateId": "590c2e1186f77425357b6124", + "templateId": "61bf83814088ec1a363d7097", "type": "Tool" - }, - { - "templateId": "6389c7750ef44505c87f5996", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "6389c92d52123d5dd17f8876", - "type": "Tool" - }, - { - "type": "QuestComplete", - "questId": "63966fbeea19ac7ed845db2e" } - ], - "productionTime": 140000, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5c052f6886f7746b1e3db148", + ] + }, + { + "_id": "5e58e0c286f7740ba7486ca3", + "areaType": 11, "continuous": false, "count": 1, - "productionLimitCount": 0, + "endProduct": "5c12613b86f7743bbe2c3f76", + "isCodeProduction": false, "isEncoded": false, - "isCodeProduction": false + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 114000, + "requirements": [ + { + "areaType": 11, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "62a0a16d0b9d3c46de5b6e97", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "577e1c9d2459773cd707c525", + "type": "Item" + } + ] + }, + { + "_id": "5d5589c1f934db045e6c5492", + "areaType": 6, + "continuous": true, + "count": 1, + "endProduct": "5d1b33a686f7742523398398", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 1, + "productionTime": 19500, + "requirements": [ + { + "areaType": 6, + "requiredLevel": 3, + "type": "Area" + }, + { + "resource": 66, + "templateId": "5d1b385e86f774252167b98a", + "type": "Resource" + } + ] }, { "_id": "5dceb6964a98801ba2075d27", "areaType": 10, + "continuous": false, + "count": 80, + "endProduct": "5a6086ea4f39f99cd479502f", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 8256, "requirements": [ { "areaType": 10, @@ -78,19 +129,19 @@ "type": "Area" }, { - "templateId": "5d6fc87386f77449db3db94e", "count": 2, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5d6fc87386f77449db3db94e", "type": "Item" }, { - "templateId": "5d1c774f86f7746d6620f8db", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5d1c774f86f7746d6620f8db", "type": "Item" }, { @@ -98,119 +149,30 @@ "type": "Tool" }, { + "count": 80, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, "templateId": "58dd3ad986f77403051cba8f", - "count": 200, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" }, { - "type": "QuestComplete", - "questId": "5a27bc8586f7741b543d8ea4" + "type": "QuestComplete" } - ], - "productionTime": 6840, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5a608bf24f39f98ffc77720e", - "continuous": false, - "count": 200, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "600aa140090cb63380270290", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5ab8f04f86f774585f4237d8", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "61bf83814088ec1a363d7097", - "type": "Tool" - } - ], - "productionTime": 2900, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5e2af41e86f774755a234b67", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d93b91286f77467310ca15d", - "areaType": 2, - "requirements": [ - { - "templateId": "577e1c9d2459773cd707c525", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 2, - "requiredLevel": 1, - "type": "Area" - } - ], - "productionTime": 1560, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c13cef886f774072e618e82", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d558968f934db006d2d5b32", - "areaType": 10, - "requirements": [ - { - "templateId": "590c5a7286f7747884343aea", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - } - ], - "productionTime": 6200, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "57371aab2459775a77142f22", - "continuous": false, - "count": 140, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { "_id": "5d5c1f5ed582a543983ee82e", "areaType": 7, + "continuous": false, + "count": 3, + "endProduct": "5755356824597772cb798962", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1320, "requirements": [ { "areaType": 7, @@ -218,63 +180,67 @@ "type": "Area" }, { - "templateId": "5d1b3a5d86f774252167ba22", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5d1b3a5d86f774252167ba22", "type": "Item" } - ], - "productionTime": 1320, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5755356824597772cb798962", - "continuous": false, - "count": 3, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "5d8f5e1af3a8f83c8600afb2", - "areaType": 2, + "_id": "5e66408286f7747b2c2d7786", + "areaType": 10, + "continuous": false, + "count": 8, + "endProduct": "5e340dcdcb6d5863cc5e5efb", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 6000, "requirements": [ { - "templateId": "5c13cd2486f774072c757944", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "62a09f32621468534a797acb", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 2, + "areaType": 10, "requiredLevel": 2, "type": "Area" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af51086f7746d3f3c3402", + "type": "Item" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5656eb674bdc2d35148b457c", + "type": "Item" + }, + { + "templateId": "544fb5454bdc2df8738b456a", + "type": "Tool" } - ], - "productionTime": 2100, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d40412b86f7743cb332ac3a", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { "_id": "5d8b8ddd322e8650762f6e3a", "areaType": 2, + "continuous": false, + "count": 5, + "endProduct": "59e3556c86f7741776641ac2", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2310, "requirements": [ { "areaType": 2, @@ -282,439 +248,370 @@ "type": "Area" }, { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, "templateId": "5c13cd2486f774072c757944", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" }, { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, "templateId": "59faf98186f774067b6be103", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" }, { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, "templateId": "59e35abd86f7741778269d82", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" } - ], - "productionTime": 2310, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "59e3556c86f7741776641ac2", - "continuous": false, - "count": 5, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "5ee49f2c6abbcb7ba704abc2", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "590c5a7286f7747884343aea", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5737201124597760fc4431f1", - "count": 200, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 5400, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "573719df2459775a626ccbc2", - "continuous": false, - "count": 200, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d5c1fd4d582a500650132f0", - "areaType": 19, - "requirements": [ - { - "templateId": "59e3577886f774176a362503", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b33a686f7742523398398", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 11000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d1b376e86f774252519444e", + "_id": "5ede01e062155304b6512067", + "areaType": 7, "continuous": false, "count": 1, - "productionLimitCount": 0, + "endProduct": "5b4335ba86f7744d2837a264", + "isCodeProduction": false, "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d5c21aed582a50066024610", - "areaType": 7, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1670, "requirements": [ - { - "templateId": "5d1b3a5d86f774252167ba22", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5751a25924597722c463c472", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, { "areaType": 7, "requiredLevel": 2, "type": "Area" }, { - "templateId": "5e831507ea0a7c419c2f9bd9", "count": 1, - "isFunctional": false, "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 3000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590c678286f77426c9660122", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d8f5ee9de0799001d229ed2", - "areaType": 2, - "requirements": [ - { - "templateId": "56742c2e4bdc2d95058b456d", - "count": 10, "isFunctional": false, - "isEncoded": false, "isSpawnedInSession": false, + "templateId": "5d1b39a386f774252339976f", "type": "Item" }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b3f2d86f774253763b735", + "type": "Item" + } + ] + }, + { + "_id": "600abc08e4022c380a7260a8", + "areaType": 7, + "continuous": false, + "count": 1, + "endProduct": "5c0530ee86f774697952d952", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 120000, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5af0534a86f7743b6f354284", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590a391c86f774385a33c404", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c052fb986f7746b2101e909", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5af0561e86f7745f5f3ad6ac", + "type": "Item" + }, + { + "templateId": "590c2e1186f77425357b6124", + "type": "Tool" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "6389c7750ef44505c87f5996", + "type": "Item" + }, + { + "templateId": "6389c8fb46b54c634724d847", + "type": "Tool" + } + ] + }, + { + "_id": "600aa0d1090cb6338027028c", + "areaType": 2, + "continuous": false, + "count": 2, + "endProduct": "5af0454c86f7746bf20992e8", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3200, + "requirements": [ { "areaType": 2, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5ab8e4ed86f7742d8e50c7fa", + "type": "Item" + }, + { + "templateId": "5d40419286f774318526545f", + "type": "Tool" + } + ] + }, + { + "_id": "655b50e7c023e22044165de5", + "areaType": 10, + "continuous": false, + "count": 180, + "endProduct": "5a3c16fe86f77452b62de32a", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5600, + "requirements": [ + { + "areaType": 10, "requiredLevel": 2, "type": "Area" }, { - "templateId": "56742c284bdc2d98058b456d", - "count": 10, - "isFunctional": false, + "count": 180, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "64b7bbb74b75259c590fa897", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1c774f86f7746d6620f8db", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c06779c86f77426e00dd782", + "type": "Item" + } + ] + }, + { + "_id": "61c77cc6fcc1673f08540e9b", + "areaType": 8, + "continuous": false, + "count": 2, + "endProduct": "60098b1705871270cd5352a1", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4000, + "requirements": [ + { + "areaType": 8, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5448fee04bdc2dbc018b4567", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af29386f7746d4159f077", "type": "Item" }, { "templateId": "5d1b39a386f774252339976f", "type": "Tool" } - ], - "productionTime": 3720, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d1b371186f774253763a656", + ] + }, + { + "_id": "64b6aefe25251516d768542d", + "areaType": 10, "continuous": false, - "count": 1, - "productionLimitCount": 0, + "count": 5, + "endProduct": "5e32f56fcb6d5863cc5e5ee4", + "isCodeProduction": false, "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d5c205bd582a50d042a3c0e", - "areaType": 20, - "requirements": [], - "productionTime": 145000, + "locked": true, "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "59faff1d86f7746c51718c9c", - "continuous": true, - "count": 1, - "productionLimitCount": 3, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5ffcadeff3fdc212a91d5539", - "areaType": 8, + "productionLimitCount": 0, + "productionTime": 4800, "requirements": [ { - "areaType": 8, + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "templateId": "62a0a098de7ac8199358053b", + "type": "Tool" + }, + { + "type": "QuestComplete", + "questId": "5c0d190cd09282029f5390d8" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af51086f7746d3f3c3402", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "60391b0fb847c71012789415", + "type": "Item" + } + ] + }, + { + "_id": "5e0755b97f8ea74cc332bf78", + "areaType": 21, + "continuous": false, + "count": 1, + "endProduct": "6680304edadb7aa61d00cef0", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5210, + "requirements": [ + { + "areaType": 21, "requiredLevel": 1, "type": "Area" }, { - "templateId": "5448fee04bdc2dbc018b4567", - "count": 2, - "isFunctional": false, + "count": 3, "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5751487e245977207e26a315", - "count": 4, "isFunctional": false, - "isEncoded": false, "isSpawnedInSession": false, + "templateId": "5df8a6a186f77412640e2e80", "type": "Item" } - ], - "productionTime": 3800, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5e8f3423fd7471236e6e3b64", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "603cf23a420e7f487e175d7f", - "areaType": 10, - "requirements": [ - { - "templateId": "57347c77245977448d35f6e2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57347c5b245977448d35f6e1", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af37686f774755a234b65", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "590c2b4386f77425357b6123", - "type": "Tool" - } - ], - "productionTime": 7000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590a3c0a86f774385a33c450", + "_id": "5fe338e364adb27bb90594be", + "areaType": 21, "continuous": false, "count": 1, - "productionLimitCount": 0, + "endProduct": "5ed51652f6c34d2cc26336a1", + "isCodeProduction": false, "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "61c77c830f3639492721e99c", - "areaType": 8, - "requirements": [ - { - "areaType": 8, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5448fee04bdc2dbc018b4567", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c595c86f7747884343ad7", - "type": "Tool" - }, - { - "templateId": "5d1b385e86f774252167b98a", - "type": "Tool" - }, - { - "templateId": "62a0a043cf4a99369e2624a5", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 17500, - "needFuelForAllProductionTime": false, "locked": false, - "endProduct": "5c0fa877d174af02a012e1cf", - "continuous": false, - "count": 3, + "needFuelForAllProductionTime": false, "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "61dc03711bdcfa2f253c9b7c", - "areaType": 10, + "productionTime": 4600, "requirements": [ { - "areaType": 10, - "requiredLevel": 2, + "areaType": 21, + "requiredLevel": 1, "type": "Area" }, { - "templateId": "5909e99886f7740c983b9984", "count": 3, - "isFunctional": false, "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590a358486f77429692b2790", - "count": 2, "isFunctional": false, - "isEncoded": false, "isSpawnedInSession": false, + "templateId": "5df8a72c86f77412640e2e83", "type": "Item" - }, - { - "templateId": "5af0561e86f7745f5f3ad6ac", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b31ce86f7742523398394", - "type": "Tool" } - ], - "productionTime": 18000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5e2aedd986f7746d404f3aa4", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "655b48fe065b076eb02c4b46", - "areaType": 10, - "requirements": [ - { - "templateId": "64b7af5a8532cf95ee0a0dbd", - "count": 120, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "590c5a7286f7747884343aea", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "62a09ee4cf4a99369e262453", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" - } - ], - "productionTime": 15480, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5656d7c34bdc2d9d198b4587", - "continuous": false, - "count": 120, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "66140c4a9688754de10dac07", + "_id": "660c2dbaa2a92e70cc074863", "areaType": 11, + "continuous": false, + "count": 1, + "endProduct": "660bbc98c38b837877075e4a", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 900, "requirements": [ { - "templateId": "660bbc47c38b837877075e47", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "660bbc47c38b837877075e47", "type": "Item" }, { @@ -725,448 +622,20 @@ { "type": "QuestComplete" } - ], - "productionTime": 600, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "660bc341c38b837877075e4c", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": true + ] }, { - "_id": "670932d7b564327a0e023fcb", - "areaType": 11, - "requirements": [ - { - "areaType": 11, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "590c621186f774138d11ea29", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "type": "QuestComplete", - "questId": "67040c22cc1f3752720376e9" - } - ], - "productionTime": 900, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "6707d13e4e617ec94f0e5631", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "658975e25c4f0642a502d54e", - "areaType": 21, - "requirements": [ - { - "areaType": 21, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5df8a77486f77412672a1e3f", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 5950, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "668fe5a998b5ad715703ddd6", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d8a13564ac882218d2085b0", - "areaType": 8, - "requirements": [ - { - "templateId": "59e3577886f774176a362503", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "575146b724597720a27126d5", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 8, - "requiredLevel": 2, - "type": "Area" - } - ], - "productionTime": 4900, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5734773724597737fd047c14", - "continuous": false, - "count": 3, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5eeca9bad874f914d2536585", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5c127c4486f7745625356c13", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57347c5b245977448d35f6e1", - "count": 6, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af29386f7746d4159f077", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "61bf7b6302b3924be92fa8c3", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40419286f774318526545f", - "type": "Tool" - } - ], - "productionTime": 18000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5b7c710788a4506dec015957", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5df8fe0deddb880fd56f2d7d", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d40407c86f774318526545a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40412b86f7743cb332ac3a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b39a386f774252339976f", - "type": "Tool" - } - ], - "productionTime": 2450, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "59e358a886f7741776641ac3", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5e13301cc7049d4d9738e1a7", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5755356824597772cb798962", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb25a4bdc2dfb738b4567", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c695186f7741e566b64a2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 2880, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d1b3a5d86f774252167ba22", - "continuous": false, - "count": 3, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5e37f15386f774299f112a2e", + "_id": "66575197464c4b4ba4671004", "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5e2af51086f7746d3f3c3402", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c5a7286f7747884343aea", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5a2a57cfc4a2826c6e06d44a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 4670, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5a0c27731526d80618476ac4", - "continuous": false, - "count": 5, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6012ee7e44a0465ee67a58de", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5c0e533786f7747fa23f4d47", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb3f34bdc2d03748b456a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5751435d24597720a27126d1", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b3a5d86f774252167ba22", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "type": "QuestComplete", - "questId": "60e71c48c1bfa3050473b8e5" - } - ], - "productionTime": 5500, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5ed51652f6c34d2cc26336a1", "continuous": false, "count": 1, - "productionLimitCount": 0, + "endProduct": "665732e7ac60f009f270d1ef", + "isCodeProduction": false, "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "600ab99ce4022c380a726090", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5e8488fa988a8701445df1e4", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b3a5d86f774252167ba22", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 1800, - "needFuelForAllProductionTime": false, "locked": false, - "endProduct": "5e8488fa988a8701445df1e4", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b56eb32b0b1645e6f54c8", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "590c5a7286f7747884343aea", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 5400, "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5a26abfac4a28232980eabff", - "continuous": false, - "count": 150, "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5e0756095a20a05b76027357", - "areaType": 21, - "requirements": [ - { - "areaType": 21, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5df8a72c86f77412640e2e83", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 5550, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "674da107c512807d1a0e7436", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6666d7ea0b734650a91d0a42", - "areaType": 10, + "productionTime": 300, "requirements": [ { "areaType": 10, @@ -1186,27 +655,55 @@ "type": "Tool" }, { - "templateId": "66572bb3ac60f009f270d1df", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "66572b3f6a723f7f005a066c", "type": "Item" } - ], - "productionTime": 300, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "66573310a1657263d816a139", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "655b5fd2975a7f3c734661a8", + "_id": "5d558968f934db006d2d5b32", + "areaType": 10, + "continuous": false, + "count": 140, + "endProduct": "57371aab2459775a77142f22", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 6200, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + }, + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + } + ] + }, + { + "_id": "5dceeaf100b3815535149f5a", "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5c127c4486f7745625356c13", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 12000, "requirements": [ { "areaType": 2, @@ -1214,27 +711,1275 @@ "type": "Area" }, { - "templateId": "5e2af4a786f7746d3f3c3400", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af4d286f7746d4159f07a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af41e86f774755a234b67", "count": 2, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5d1b371186f774253763a656", + "type": "Item" + }, + { + "count": 4, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347c5b245977448d35f6e1", + "type": "Item" + }, + { + "count": 4, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347c77245977448d35f6e2", + "type": "Item" + }, + { + "templateId": "5d40419286f774318526545f", + "type": "Tool" + } + ] + }, + { + "_id": "5ffcab66fd851f4b000d61ef", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5e2af55f86f7746d4159f07c", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 30000, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b36a186f7742523398433", + "type": "Item" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347c77245977448d35f6e2", + "type": "Item" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347c5b245977448d35f6e1", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "61bf7b6302b3924be92fa8c3", + "type": "Item" + }, + { + "templateId": "5d40419286f774318526545f", + "type": "Tool" + } + ] + }, + { + "_id": "5d5c205bd582a50d042a3c0e", + "areaType": 20, + "continuous": true, + "count": 1, + "endProduct": "59faff1d86f7746c51718c9c", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 3, + "productionTime": 145000, + "requirements": [] + }, + { + "_id": "5d78dbfb65aebb016d20b6f3", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "5ac4cd105acfc40016339859", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5000, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1c819a86f774771b0acd6c", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5648b1504bdc2d9d488b4584", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5ac50c185acfc400163398d4", + "type": "Item" + }, + { + "templateId": "590c2e1186f77425357b6124", + "type": "Tool" + } + ] + }, + { + "_id": "5ee49f2c6abbcb7ba704abc2", + "areaType": 10, + "continuous": false, + "count": 200, + "endProduct": "573719df2459775a626ccbc2", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5400, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + }, + { + "count": 200, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5737201124597760fc4431f1", + "type": "Item" + } + ] + }, + { + "_id": "5d78d81757c9b8484a2bcb99", + "areaType": 10, + "continuous": false, + "count": 150, + "endProduct": "60194943740c5d77f6705eea", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 6250, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", + "type": "Item" + }, + { + "templateId": "5af04b6486f774195a3ebb49", + "type": "Tool" + } + ] + }, + { + "_id": "655b4de41f2b6843ec751fd5", + "areaType": 10, + "continuous": false, + "count": 70, + "endProduct": "5887431f2459777e1612938f", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 14400, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 70, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "64b8f7968532cf95ee0a0dbf", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc87386f77449db3db94e", + "type": "Item" + }, + { + "templateId": "544fb5454bdc2df8738b456a", + "type": "Tool" + } + ] + }, + { + "_id": "655b48fe065b076eb02c4b46", + "areaType": 10, + "continuous": false, + "count": 120, + "endProduct": "5656d7c34bdc2d9d198b4587", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 15480, + "requirements": [ + { + "count": 120, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "64b7af5a8532cf95ee0a0dbd", + "type": "Item" + }, + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "62a09ee4cf4a99369e262453", + "type": "Item" + }, + { + "templateId": "544fb5454bdc2df8738b456a", + "type": "Tool" + } + ] + }, + { + "_id": "6666d829a8298779fc40e537", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "665732f4464c4b4ba4670fa9", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 300, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "templateId": "5d1b317c86f7742523398392", + "type": "Tool" + }, + { + "templateId": "5d4042a986f7743185265463", + "type": "Tool" + }, + { + "templateId": "5af04b6486f774195a3ebb49", + "type": "Tool" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "66572b88ac60f009f270d1dc", + "type": "Item" + } + ] + }, + { + "_id": "5d5c1fd4d582a500650132f0", + "areaType": 19, + "continuous": false, + "count": 1, + "endProduct": "5d1b376e86f774252519444e", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 11000, + "requirements": [ + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e3577886f774176a362503", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b33a686f7742523398398", + "type": "Item" + } + ] + }, + { + "_id": "5d5c21aed582a50066024610", + "areaType": 7, + "continuous": false, + "count": 2, + "endProduct": "590c678286f77426c9660122", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3000, + "requirements": [ + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b3a5d86f774252167ba22", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5751a25924597722c463c472", + "type": "Item" + }, + { + "areaType": 7, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e831507ea0a7c419c2f9bd9", + "type": "Item" + } + ] + }, + { + "_id": "5d8f5e1af3a8f83c8600afb2", + "areaType": 2, + "continuous": false, + "count": 2, + "endProduct": "5d40412b86f7743cb332ac3a", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2100, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c13cd2486f774072c757944", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "62a09f32621468534a797acb", + "type": "Item" + }, + { + "areaType": 2, + "requiredLevel": 2, + "type": "Area" + } + ] + }, + { + "_id": "5dd3c5487058311d4b267186", + "areaType": 10, + "continuous": false, + "count": 2, + "endProduct": "590c5a7286f7747884343aea", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5350, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 120, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "56dff216d2720bbd668b4568", + "type": "Item" + }, + { + "templateId": "590c2b4386f77425357b6123", + "type": "Tool" + } + ] + }, + { + "_id": "5de950a845b5d67bad6e9ef7", + "areaType": 10, + "continuous": false, + "count": 2, + "endProduct": "59e36c6f86f774176c10a2a7", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2100, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347cd0245977445a2d6ff1", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c06779c86f77426e00dd782", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5734795124597738002c6176", + "type": "Item" + } + ] + }, + { + "_id": "5ede07163c345121732a10e9", + "areaType": 2, + "continuous": false, + "count": 10, + "endProduct": "5751a25924597722c463c472", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1000, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "544fb25a4bdc2dfb738b4567", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d40407c86f774318526545a", + "type": "Item" + } + ] + }, + { + "_id": "5ee4a093a297eb185236194f", + "areaType": 11, + "continuous": false, + "count": 1, + "endProduct": "5c052fb986f7746b2101e909", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 192000, + "requirements": [ + { + "areaType": 11, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c94bbff86f7747ee735c08f", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c05300686f7746dce784e5d", + "type": "Item" + }, + { + "templateId": "5ac78a9b86f7741cca0bbd8d", + "type": "Tool" + }, + { + "templateId": "6389c92d52123d5dd17f8876", + "type": "Tool" + }, + { + "type": "QuestComplete", + "questId": "63966fccac6f8f3c677b9d89" + } + ] + }, + { + "_id": "5ffcad24f3fdc212a91d5536", + "areaType": 10, + "continuous": false, + "count": 50, + "endProduct": "64b8ee384b75259c590fa89b", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5250, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b36a186f7742523398433", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + }, + { + "templateId": "5d40419286f774318526545f", + "type": "Tool" + }, + { + "templateId": "544fb5454bdc2df8738b456a", + "type": "Tool" + } + ] + }, + { + "_id": "5ffcac4e1285295b7441ee01", + "areaType": 10, + "continuous": false, + "count": 2, + "endProduct": "590a3b0486f7743954552bdb", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2900, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590a3efd86f77437d351a25b", + "type": "Item" + }, + { + "templateId": "590c2d8786f774245b1f03f3", + "type": "Tool" + } + ] + }, + { + "_id": "62a11415c30cfa1d366aeb83", + "areaType": 2, + "continuous": false, + "count": 6, + "endProduct": "5c13cd2486f774072c757944", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3000, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59faf98186f774067b6be103", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "62a09ee4cf4a99369e262453", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "635a758bfefc88a93f021b8a", + "type": "Item" + } + ] + }, + { + "_id": "6002e55595c402039a2747f4", + "areaType": 11, + "continuous": false, + "count": 1, + "endProduct": "5c1e495a86f7743109743dfb", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 476000, + "requirements": [ + { + "areaType": 11, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 10, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c94bbff86f7747ee735c08f", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c1d0d6d86f7744bb2683e1f", + "type": "Item" + }, + { + "count": 4, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c12613b86f7743bbe2c3f76", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "61bf7c024770ee6f9c6b8b53", + "type": "Item" + }, + { + "templateId": "5c052fb986f7746b2101e909", + "type": "Tool" + } + ] + }, + { + "_id": "600a9a34189b226f40059743", + "areaType": 10, + "continuous": false, + "count": 2, + "endProduct": "5d1b2ffd86f77425243e8d17", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 9100, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5b4391a586f7745321235ab2", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e366c186f7741778269d85", + "type": "Item" + }, + { + "templateId": "590c2e1186f77425357b6124", + "type": "Tool" + }, + { + "templateId": "590c639286f774151567fa95", + "type": "Tool" + } + ] + }, + { + "_id": "6012ee7e44a0465ee67a58de", + "areaType": 7, + "continuous": false, + "count": 1, + "endProduct": "5ed51652f6c34d2cc26336a1", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5500, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c0e533786f7747fa23f4d47", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "544fb3f34bdc2d03748b456a", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5751435d24597720a27126d1", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b3a5d86f774252167ba22", + "type": "Item" + }, + { + "type": "QuestComplete", + "questId": "60e71c48c1bfa3050473b8e5" + } + ] + }, + { + "_id": "655b58a49db22d43ab42b709", + "areaType": 10, + "continuous": false, + "count": 60, + "endProduct": "5d6e68c4a4b9361b93413f79", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4200, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 60, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "560d5e524bdc2d25448b4571", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc87386f77449db3db94e", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5bbd86f774785762df04", + "type": "Item" + }, + { + "templateId": "544fb5454bdc2df8738b456a", + "type": "Tool" + } + ] + }, + { + "_id": "61c77c830f3639492721e99c", + "areaType": 8, + "continuous": false, + "count": 3, + "endProduct": "5c0fa877d174af02a012e1cf", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 17500, + "requirements": [ + { + "areaType": 8, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5448fee04bdc2dbc018b4567", + "type": "Item" + }, + { + "templateId": "590c595c86f7747884343ad7", + "type": "Tool" + }, + { + "templateId": "5d1b385e86f774252167b98a", + "type": "Tool" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "62a0a043cf4a99369e2624a5", + "type": "Item" + } + ] + }, + { + "_id": "62a11658650cc35fa94e009a", + "areaType": 8, + "continuous": false, + "count": 10, + "endProduct": "62a09f32621468534a797acb", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 36000, + "requirements": [ + { + "areaType": 8, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347d3d245977448f7b7f61", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e8f3423fd7471236e6e3b64", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b33a686f7742523398398", + "type": "Item" + } + ] + }, + { + "_id": "655b5af31273611d2462ab76", + "areaType": 10, + "continuous": false, + "count": 50, + "endProduct": "5d6e68a8a4b9360b6c0d54e2", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 8400, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", + "type": "Item" + }, + { + "count": 50, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "560d5e524bdc2d25448b4571", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5c9f86f77477c91c36e7", + "type": "Item" + }, + { + "templateId": "5d1b317c86f7742523398392", + "type": "Tool" + }, + { + "type": "QuestComplete", + "questId": "6179ad0a6e9dd54ac275e3f2" + } + ] + }, + { + "_id": "655b5dc8065b076eb02c4b48", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5c0e5edb86f77461f55ed1f7", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4000, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4d286f7746d4159f07a", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4a786f7746d3f3c3400", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "656f57dc27aed95beb08f628", + "type": "Item" + } + ] + }, + { + "_id": "61c4f862324588369162ac8c", + "areaType": 21, + "continuous": false, + "count": 1, + "endProduct": "590a3efd86f77437d351a25b", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 11500, + "requirements": [ + { + "areaType": 21, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a6a186f77412640e2e80", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a72c86f77412640e2e83", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a77486f77412672a1e3f", + "type": "Item" + } + ] + }, + { + "_id": "6617cdb6b24b0ea24505f618", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "63a0b2eabea67a6d93009e52", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1800, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "templateId": "5d4042a986f7743185265463", + "type": "Tool" + }, + { + "templateId": "5d1b31ce86f7742523398394", + "type": "Tool" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d0376a486f7747d8050965c", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "6389c70ca33d8c4cdf4932c6", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590a358486f77429692b2790", + "type": "Item" + }, + { + "type": "QuestComplete" + } + ] + }, + { + "_id": "655b5fd2975a7f3c734661a8", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "61bcc89aef0f505f0c6cd0fc", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 6000, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4a786f7746d3f3c3400", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4d286f7746d4159f07a", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af41e86f774755a234b67", "type": "Item" }, { @@ -1246,34 +1991,545 @@ "questId": "5b478d0f86f7744d190d91b5" }, { - "templateId": "656fb21fa0dce000a2020f7c", "count": 2, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "656fb21fa0dce000a2020f7c", "type": "Item" } - ], - "productionTime": 6000, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "61bcc89aef0f505f0c6cd0fc", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "655b6bc01f2b6843ec751fd7", + "_id": "5ffcafd468c55773943fc71e", "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5e2af47786f7746d404f3aaa", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2600, "requirements": [ { - "templateId": "5e2af4a786f7746d3f3c3400", - "count": 1, - "isFunctional": false, + "areaType": 2, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 2, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5aa2ba46e5b5b000137b758d", + "type": "Item" + }, + { + "templateId": "61bf83814088ec1a363d7097", + "type": "Tool" + } + ] + }, + { + "_id": "5de10c50c607752a1f1262c7", + "areaType": 8, + "continuous": false, + "count": 1, + "endProduct": "59e3577886f774176a362503", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5000, + "requirements": [ + { + "areaType": 8, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57505f6224597709a92585a9", + "type": "Item" + } + ] + }, + { + "_id": "5e1330dca0f0f8773c069c99", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "590c595c86f7747884343ad7", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 120, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "60363c0c92ec1c31037959f5", + "type": "Item" + }, + { + "templateId": "590c2d8786f774245b1f03f3", + "type": "Tool" + } + ] + }, + { + "_id": "5eeca8e327ccd70521107fdc", + "areaType": 7, + "continuous": false, + "count": 1, + "endProduct": "5c052e6986f7746b207bc3c9", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 18900, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590a391c86f774385a33c404", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c06779c86f77426e00dd782", + "type": "Item" + }, + { + "count": 4, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c06782b86f77426df5407d2", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5af0561e86f7745f5f3ad6ac", + "type": "Item" + }, + { + "templateId": "590c2e1186f77425357b6124", + "type": "Tool" + } + ] + }, + { + "_id": "5f240f45f4a9420a8c328ee0", + "areaType": 8, + "continuous": false, + "count": 4, + "endProduct": "5751435d24597720a27126d1", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 6500, + "requirements": [ + { + "areaType": 8, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57514643245977207f2c2d09", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5af0484c86f7740f02001f7f", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5448fee04bdc2dbc018b4567", + "type": "Item" + }, + { + "templateId": "62a09e73af34e73a266d932a", + "type": "Tool" + } + ] + }, + { + "_id": "5ffcadeff3fdc212a91d5539", + "areaType": 8, + "continuous": false, + "count": 2, + "endProduct": "5e8f3423fd7471236e6e3b64", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3800, + "requirements": [ + { + "areaType": 8, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5448fee04bdc2dbc018b4567", + "type": "Item" + }, + { + "count": 4, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5751487e245977207e26a315", + "type": "Item" + } + ] + }, + { + "_id": "6002e26ac6b84d04cc62045e", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "590a391c86f774385a33c404", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2600, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590a386e86f77429692b27ab", + "type": "Item" + }, + { + "templateId": "590c2d8786f774245b1f03f3", + "type": "Tool" + } + ] + }, + { + "_id": "600a98d076fc4b1877509ead", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "5644bd2b4bdc2d3b4c8b4572", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4900, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1c819a86f774771b0acd6c", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5648b0744bdc2d363b8b4578", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5649b1c04bdc2d16268b457c", + "type": "Item" + }, + { + "templateId": "590c2b4386f77425357b6123", + "type": "Tool" + }, + { + "templateId": "590c2d8786f774245b1f03f3", + "type": "Tool" + } + ] + }, + { + "_id": "600aa209f64dfd63ec1293d6", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5648a69d4bdc2ded0b8b457b", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3600, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e4abfed86f77406a2713cf7", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4a786f7746d3f3c3400", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af41e86f774755a234b67", + "type": "Item" + }, + { + "templateId": "61bf83814088ec1a363d7097", + "type": "Tool" + } + ] + }, + { + "_id": "600ab99ce4022c380a726090", + "areaType": 7, + "continuous": false, + "count": 1, + "endProduct": "5e8488fa988a8701445df1e4", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1800, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e8488fa988a8701445df1e4", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b3a5d86f774252167ba22", + "type": "Item" + } + ] + }, + { + "_id": "6558d7894626375d6735670c", + "areaType": 10, + "continuous": false, + "count": 50, + "endProduct": "5fc275cf85fd526b824a571a", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 15000, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 50, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5fc382c1016cce60e8341b20", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc87386f77449db3db94e", + "type": "Item" + }, + { + "templateId": "544fb5454bdc2df8738b456a", + "type": "Tool" + } + ] + }, + { + "_id": "66140c4a9688754de10dac07", + "areaType": 11, + "continuous": false, + "count": 1, + "endProduct": "660bc341c38b837877075e4c", + "isCodeProduction": true, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 600, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "660bbc47c38b837877075e47", + "type": "Item" + }, + { + "areaType": 11, + "requiredLevel": 1, + "type": "Area" + }, + { + "type": "QuestComplete" + } + ] + }, + { + "_id": "6666d7ea0b734650a91d0a42", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "66573310a1657263d816a139", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 300, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "templateId": "5d1b317c86f7742523398392", + "type": "Tool" + }, + { + "templateId": "5d4042a986f7743185265463", + "type": "Tool" + }, + { + "templateId": "5af04b6486f774195a3ebb49", + "type": "Tool" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "66572bb3ac60f009f270d1df", + "type": "Item" + } + ] + }, + { + "_id": "5d8f5ee9de0799001d229ed2", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5d1b371186f774253763a656", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3720, + "requirements": [ + { + "count": 10, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "56742c2e4bdc2d95058b456d", "type": "Item" }, { @@ -1282,19 +2538,1151 @@ "type": "Area" }, { - "templateId": "5e2af41e86f774755a234b67", - "count": 1, - "isFunctional": false, + "count": 10, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "56742c284bdc2d98058b456d", "type": "Item" }, { - "templateId": "5e2af47786f7746d404f3aaa", + "templateId": "5d1b39a386f774252339976f", + "type": "Tool" + } + ] + }, + { + "_id": "5dd1126571e3fd3f634b1c8b", + "areaType": 10, + "continuous": false, + "count": 8, + "endProduct": "5c06779c86f77426e00dd782", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 7100, + "requirements": [ + { "count": 2, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "59e36c6f86f774176c10a2a7", + "type": "Item" + }, + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + } + ] + }, + { + "_id": "5e13301cc7049d4d9738e1a7", + "areaType": 7, + "continuous": false, + "count": 3, + "endProduct": "5d1b3a5d86f774252167ba22", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2880, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5755356824597772cb798962", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "544fb25a4bdc2dfb738b4567", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c695186f7741e566b64a2", + "type": "Item" + } + ] + }, + { + "_id": "5ede0135f7db6021ee400dfe", + "areaType": 7, + "continuous": false, + "count": 2, + "endProduct": "5755383e24597772cb798966", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3300, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c13cd2486f774072c757944", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d40412b86f7743cb332ac3a", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b3a5d86f774252167ba22", + "type": "Item" + } + ] + }, + { + "_id": "63bd4c3964d7e356983c4cf5", + "areaType": 10, + "continuous": false, + "count": 100, + "endProduct": "5cc80f38e4a949001152b560", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 8700, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 100, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5cc80f79e4a949033c7343b2", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", + "type": "Item" + }, + { + "count": 4, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c06782b86f77426df5407d2", + "type": "Item" + }, + { + "templateId": "544fb5454bdc2df8738b456a", + "type": "Tool" + } + ] + }, + { + "_id": "5ffcaa60f3fdc212a91d552b", + "areaType": 2, + "continuous": false, + "count": 2, + "endProduct": "5e2af4d286f7746d4159f07a", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2000, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5648a7494bdc2d9d488b4583", + "type": "Item" + }, + { + "templateId": "544fb5454bdc2df8738b456a", + "type": "Tool" + } + ] + }, + { + "_id": "655b4f57769de97e1d62d116", + "areaType": 10, + "continuous": false, + "count": 50, + "endProduct": "5e023d34e8a400319a28ed44", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 9500, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 50, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e77a2386f7742ee578960a", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "60391a8b3364dc22b04d0ce5", + "type": "Item" + }, + { + "templateId": "62a0a0bb621468534a797ad5", + "type": "Tool" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", + "type": "Item" + }, + { + "type": "QuestComplete", + "questId": "5bc4856986f77454c317bea7" + } + ] + }, + { + "_id": "61b9da10695bdc188002db3a", + "areaType": 21, + "continuous": false, + "count": 1, + "endProduct": "5c0e531286f7747fa54205c2", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5400, + "requirements": [ + { + "areaType": 21, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a6a186f77412640e2e80", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a77486f77412672a1e3f", + "type": "Item" + } + ] + }, + { + "_id": "655b47d1769de97e1d62d115", + "areaType": 10, + "continuous": false, + "count": 200, + "endProduct": "64b7af5a8532cf95ee0a0dbd", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4400, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", + "type": "Item" + }, + { + "templateId": "62a0a098de7ac8199358053b", + "type": "Tool" + } + ] + }, + { + "_id": "615c3d800d3afc358a55405e", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "5d1c819a86f774771b0acd6c", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3100, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "574d967124597745970e7c94", + "type": "Item" + }, + { + "templateId": "5d63d33b86f7746ea9275524", + "type": "Tool" + } + ] + }, + { + "_id": "63a2abbb31772a61500d5336", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "59e366c186f7741778269d85", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1500, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5ac4c50d5acfc40019262e87", + "type": "Item" + } + ] + }, + { + "_id": "61b9d9deef9a1b5d6a798986", + "areaType": 21, + "continuous": false, + "count": 1, + "endProduct": "5d403f9186f7743cac3f229b", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5200, + "requirements": [ + { + "areaType": 21, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a77486f77412672a1e3f", + "type": "Item" + } + ] + }, + { + "_id": "61b9da6a66f37641c8240014", + "areaType": 21, + "continuous": false, + "count": 1, + "endProduct": "5ed5160a87bb8443d10680b5", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 8400, + "requirements": [ + { + "areaType": 21, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a6a186f77412640e2e80", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a72c86f77412640e2e83", + "type": "Item" + } + ] + }, + { + "_id": "6666d899eb78191c502350b2", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "665730fa4de4820934746c48", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 300, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "templateId": "5d1b317c86f7742523398392", + "type": "Tool" + }, + { + "templateId": "5d4042a986f7743185265463", + "type": "Tool" + }, + { + "templateId": "5af04b6486f774195a3ebb49", + "type": "Tool" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "66571bf06a723f7f005a0619", + "type": "Item" + } + ] + }, + { + "_id": "655b60774343a16d2e04766b", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5ab8dced86f774646209ec87", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 7000, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4d286f7746d4159f07a", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4a786f7746d3f3c3400", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e3556c86f7741776641ac2", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59faf98186f774067b6be103", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "656fa25e94b480b8a500c0e0", + "type": "Item" + } + ] + }, + { + "_id": "670932d7b564327a0e023fcb", + "areaType": 11, + "continuous": false, + "count": 1, + "endProduct": "6707d13e4e617ec94f0e5631", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 900, + "requirements": [ + { + "areaType": 11, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c621186f774138d11ea29", + "type": "Item" + }, + { + "type": "QuestComplete", + "questId": "67040c22cc1f3752720376e9" + } + ] + }, + { + "_id": "5de951483c52683d810b4a10", + "areaType": 10, + "continuous": false, + "count": 2, + "endProduct": "590a3b0486f7743954552bdb", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1980, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5734781f24597737e04bf32a", + "type": "Item" + }, + { + "templateId": "5d63d33b86f7746ea9275524", + "type": "Tool" + } + ] + }, + { + "_id": "5e37f15386f774299f112a2e", + "areaType": 10, + "continuous": false, + "count": 5, + "endProduct": "5a0c27731526d80618476ac4", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4670, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af51086f7746d3f3c3402", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5a2a57cfc4a2826c6e06d44a", + "type": "Item" + } + ] + }, + { + "_id": "5f245f875b664e084523a4ce", + "areaType": 10, + "continuous": false, + "count": 100, + "endProduct": "5f0596629e22f464da6bbdd9", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 8470, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 50, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c0d668f86f7747ccb7f13b2", + "type": "Item" + }, + { + "count": 50, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5656d7c34bdc2d9d198b4587", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + }, + { + "templateId": "590c2b4386f77425357b6123", + "type": "Tool" + }, + { + "type": "QuestComplete", + "questId": "5bc47dbf86f7741ee74e93b9" + } + ] + }, + { + "_id": "5eda0247658fac5b8c3862a8", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "55d482194bdc2d1d4e8b456b", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5000, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 4, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "55d480c04bdc2d1d4e8b456a", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af29386f7746d4159f077", + "type": "Item" + }, + { + "templateId": "5d4042a986f7743185265463", + "type": "Tool" + } + ] + }, + { + "_id": "603ce7c5fd70f047f93bee2a", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5aa7cfc0e5b5b00015693143", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2890, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5ea05cf85ad9772e6624305d", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347c1124597737fb1379e3", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4d286f7746d4159f07a", + "type": "Item" + }, + { + "templateId": "61bf83814088ec1a363d7097", + "type": "Tool" + } + ] + }, + { + "_id": "603cf23a420e7f487e175d7f", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "590a3c0a86f774385a33c450", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 7000, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347c77245977448d35f6e2", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347c5b245977448d35f6e1", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af37686f774755a234b65", + "type": "Item" + }, + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "templateId": "590c2b4386f77425357b6123", + "type": "Tool" + } + ] + }, + { + "_id": "615c3d27966c85458e4c49cf", + "areaType": 7, + "continuous": false, + "count": 1, + "endProduct": "60098ad7c2240c0fe85c570a", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3600, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c678286f77426c9660122", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5751a25924597722c463c472", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "60098af40accd37ef2175f27", + "type": "Item" + } + ] + }, + { + "_id": "61c226d91b8c294cd411c881", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "590a3efd86f77437d351a25b", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 61300, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 4, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5672cb124bdc2d1a0f8b4568", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5672cb724bdc2dc2088b456b", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590a391c86f774385a33c404", + "type": "Item" + }, + { + "count": 4, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c06779c86f77426e00dd782", + "type": "Item" + }, + { + "templateId": "5af04b6486f774195a3ebb49", + "type": "Tool" + } + ] + }, + { + "_id": "5e0759e73c392e0367260488", + "areaType": 21, + "continuous": false, + "count": 1, + "endProduct": "674d6121c09f69dfb201a888", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5950, + "requirements": [ + { + "areaType": 21, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a72c86f77412640e2e83", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a6a186f77412640e2e80", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a77486f77412672a1e3f", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "67586c61a0c49554ed0bb4a8", + "type": "Item" + } + ] + }, + { + "_id": "6002eec9cc73cd34ac64188a", + "areaType": 7, + "continuous": false, + "count": 1, + "endProduct": "5fca138c2a7b221b2852a5c6", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4200, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c10c8fd86f7743d7d706df3", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5755356824597772cb798962", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b3a5d86f774252167ba22", + "type": "Item" + }, + { + "type": "QuestComplete", + "questId": "60e71c11d54b755a3b53eb65" + } + ] + }, + { + "_id": "64b6b5c1c3abf20a9660daad", + "areaType": 7, + "continuous": false, + "count": 1, + "endProduct": "5c0e534186f7747fa1419867", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4800, + "requirements": [ + { + "type": "QuestComplete", + "questId": "60e71c48c1bfa3050473b8e5" + }, + { + "areaType": 7, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b3a5d86f774252167ba22", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b3f2d86f774253763b735", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c0e530286f7747fa1419862", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e8f3423fd7471236e6e3b64", + "type": "Item" + } + ] + }, + { + "_id": "655b650ab71eeb7c4168c627", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5ab8e79e86f7742d8b372e78", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 10000, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e3556c86f7741776641ac2", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4d286f7746d4159f07a", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af41e86f774755a234b67", "type": "Item" }, { @@ -1302,264 +3690,175 @@ "type": "Tool" }, { - "templateId": "59e3556c86f7741776641ac2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 2500, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5f5e467b0bc58666c37e7821", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d8a1a7d7a3dfe597c2e459e", - "areaType": 7, - "requirements": [ + "templateId": "591094e086f7747caa7bb2ef", + "type": "Tool" + }, { - "templateId": "590c661e86f7741e566b646a", "count": 2, - "isFunctional": false, "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 7, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5e831507ea0a7c419c2f9bd9", - "count": 2, "isFunctional": false, - "isEncoded": false, "isSpawnedInSession": false, + "templateId": "656f611f94b480b8a500c0db", "type": "Item" } - ], - "productionTime": 2350, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "544fb45d4bdc2dee738b4568", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "5d5589c1f934db045e6c5492", - "areaType": 6, - "requirements": [ - { - "areaType": 6, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5d1b385e86f774252167b98a", - "resource": 66, - "type": "Resource" - } - ], - "productionTime": 19500, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d1b33a686f7742523398398", - "continuous": true, - "count": 1, - "productionLimitCount": 1, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5e1330dca0f0f8773c069c99", + "_id": "655b65fc1273611d2462ab77", "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5b44cad286f77402a54ae7e5", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 14000, "requirements": [ { "areaType": 2, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "60363c0c92ec1c31037959f5", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2d8786f774245b1f03f3", - "type": "Tool" - } - ], - "productionTime": 120, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590c595c86f7747884343ad7", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5ede0502879619077751d00a", - "areaType": 7, - "requirements": [ - { - "areaType": 7, "requiredLevel": 3, "type": "Area" }, { - "templateId": "5c0e531286f7747fa54205c2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b3a5d86f774252167ba22", "count": 2, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "656fae5f7c2d57afe200c0d7", "type": "Item" }, { - "templateId": "59e3606886f77417674759a5", - "count": 1, - "isFunctional": false, + "count": 2, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5e2af4a786f7746d3f3c3400", "type": "Item" }, { - "templateId": "62a0a043cf4a99369e2624a5", - "count": 1, - "isFunctional": false, + "templateId": "5d40419286f774318526545f", + "type": "Tool" + }, + { + "templateId": "61bf83814088ec1a363d7097", + "type": "Tool" + }, + { + "type": "QuestComplete", + "questId": "5ae4497b86f7744cf402ed00" + }, + { + "count": 2, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5e2af4d286f7746d4159f07a", "type": "Item" } - ], - "productionTime": 5100, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c0e531d86f7747fa23f4d42", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "5ffcaa60f3fdc212a91d552b", + "_id": "655b675e1f2b6843ec751fd6", "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "628d0618d1ba6e4fa07ce5a4", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 8000, "requirements": [ { "areaType": 2, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5648a7494bdc2d9d488b4583", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" - } - ], - "productionTime": 2000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5e2af4d286f7746d4159f07a", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "600a9bd0189b226f40059751", - "areaType": 10, - "requirements": [ - { - "areaType": 10, "requiredLevel": 3, "type": "Area" }, { - "templateId": "5d6fc78386f77449d825f9dc", + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "65573fa5655447403702a816", + "type": "Item" + }, + { "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5e2af4d286f7746d4159f07a", "type": "Item" }, { - "templateId": "5e2af37686f774755a234b65", - "count": 5, - "isFunctional": false, + "count": 2, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5e2af4a786f7746d3f3c3400", "type": "Item" }, { - "templateId": "590c5a7286f7747884343aea", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5a0c27731526d80618476ac4", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2e1186f77425357b6124", + "templateId": "63a0b208f444d32d6f03ea1e", "type": "Tool" }, { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "61bf83814088ec1a363d7097", + "type": "Item" + }, + { + "type": "QuestComplete", + "questId": "5c1141f386f77430ff393792" } - ], - "productionTime": 16500, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5e85a9f4add9fe03027d9bf1", - "continuous": false, - "count": 7, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "619e45ea98398d3b104e8419", + "_id": "658976555aa97f488d096ca7", + "areaType": 21, + "continuous": false, + "count": 1, + "endProduct": "66b6296d7994640992013b17", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 10400, + "requirements": [ + { + "areaType": 21, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 8, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a72c86f77412640e2e83", + "type": "Item" + } + ] + }, + { + "_id": "5d5c1f25d582a5479d4ec458", "areaType": 10, + "continuous": false, + "count": 180, + "endProduct": "56dff2ced2720bb4668b4567", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 8500, "requirements": [ { "areaType": 10, @@ -1567,19 +3866,19 @@ "type": "Area" }, { - "templateId": "590c2e1186f77425357b6124", - "count": 1, - "isFunctional": false, + "count": 180, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "56dff3afd2720bba668b4567", "type": "Item" }, { - "templateId": "590c5bbd86f774785762df04", - "count": 2, - "isFunctional": false, + "count": 1, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", "type": "Item" }, { @@ -1587,39 +3886,103 @@ "type": "Tool" }, { - "templateId": "5af04b6486f774195a3ebb49", - "type": "Tool" - }, - { - "templateId": "61bf7b6302b3924be92fa8c3", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d4042a986f7743185265463", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" + "type": "QuestComplete", + "questId": "59c512ad86f7741f0d09de9b" } - ], - "productionTime": 25000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "619cbfeb6b8a1b37a54eebfa", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "63a232f8ab6bb51044344bff", + "_id": "5d78d8a03fe9fc21602e16be", + "areaType": 7, + "continuous": false, + "count": 2, + "endProduct": "590c657e86f77412b013051d", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4500, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 4, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b3a5d86f774252167ba22", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "60098af40accd37ef2175f27", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5af0454c86f7746bf20992e8", + "type": "Item" + } + ] + }, + { + "_id": "5d8a1a7d7a3dfe597c2e459e", + "areaType": 7, + "continuous": false, + "count": 1, + "endProduct": "544fb45d4bdc2dee738b4568", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2350, + "requirements": [ + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c661e86f7741e566b646a", + "type": "Item" + }, + { + "areaType": 7, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e831507ea0a7c419c2f9bd9", + "type": "Item" + } + ] + }, + { + "_id": "5eeca7724a8a9b668f0d89cd", "areaType": 10, + "continuous": false, + "count": 180, + "endProduct": "5c925fa22e221601da359b7b", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 7250, "requirements": [ { "areaType": 10, @@ -1627,20 +3990,492 @@ "type": "Area" }, { - "templateId": "6389c7f115805221fb410466", - "count": 1, - "isFunctional": false, + "count": 150, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "64b7bbb74b75259c590fa897", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + }, + { + "templateId": "590c2e1186f77425357b6124", + "type": "Tool" + } + ] + }, + { + "_id": "5dea63e21ecdbf7668030f24", + "areaType": 10, + "continuous": false, + "count": 5, + "endProduct": "5733279d245977289b77ec24", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 10000, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d03794386f77420415576f5", + "type": "Item" + }, + { + "templateId": "619cbfccbedcde2f5b3f7bdd", + "type": "Tool" + } + ] + }, + { + "_id": "5ed9fd73f6626f08ef0efec6", + "areaType": 7, + "continuous": false, + "count": 1, + "endProduct": "544fb3f34bdc2d03748b456a", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4350, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b3a5d86f774252167ba22", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "544fb37f4bdc2dee738b4567", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b3f2d86f774253763b735", + "type": "Item" + } + ] + }, + { + "_id": "61c77d465a98404dee40a77c", + "areaType": 10, + "continuous": false, + "count": 150, + "endProduct": "5efb0cabfb3e451d70735af5", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 12400, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 150, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5efb0d4f4bc50b58e81710f3", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc87386f77449db3db94e", + "type": "Item" + }, + { + "templateId": "544fb5454bdc2df8738b456a", + "type": "Tool" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c31c586f774245e3141b2", + "type": "Item" + }, + { + "templateId": "62a0a0bb621468534a797ad5", + "type": "Tool" + } + ] + }, + { + "_id": "63baedefe6ebc10fe0201083", + "areaType": 10, + "continuous": false, + "count": 120, + "endProduct": "5ba26835d4351e0035628ff5", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 12400, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 120, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5ba2678ad4351e44f824b344", "type": "Item" }, { "templateId": "5af04b6486f774195a3ebb49", "type": "Tool" }, + { + "templateId": "590a3d9c86f774385926e510", + "type": "Tool" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c06782b86f77426df5407d2", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "61bf7b6302b3924be92fa8c3", + "type": "Item" + }, + { + "type": "QuestComplete", + "questId": "5c0d4e61d09282029f53920e" + } + ] + }, + { + "_id": "600ab8e3e4022c380a726088", + "areaType": 8, + "continuous": false, + "count": 3, + "endProduct": "5d403f9186f7743cac3f229b", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 6400, + "requirements": [ + { + "areaType": 8, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5448fee04bdc2dbc018b4567", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d40407c86f774318526545a", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57505f6224597709a92585a9", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5bc9be8fd4351e00334cae6e", + "type": "Item" + }, + { + "templateId": "5d1b385e86f774252167b98a", + "type": "Tool" + } + ] + }, + { + "_id": "655b34dc1273611d2462ab74", + "areaType": 10, + "continuous": false, + "count": 180, + "endProduct": "5c0d5ae286f7741e46554302", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2770, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 180, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e6927d86f77411da468256", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c31c586f774245e3141b2", + "type": "Item" + }, + { + "templateId": "62a0a0bb621468534a797ad5", + "type": "Tool" + } + ] + }, + { + "_id": "603cf3094bb658618458e010", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "56742c324bdc2d150f8b456d", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 6000, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c1265fc86f7743f896a21c2", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b309586f77425227d1676", + "type": "Item" + }, { "templateId": "5d4042a986f7743185265463", "type": "Tool" + } + ] + }, + { + "_id": "629e1b3a0694b45420210cad", + "areaType": 8, + "continuous": false, + "count": 2, + "endProduct": "5af0484c86f7740f02001f7f", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2700, + "requirements": [ + { + "areaType": 8, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e54f6af86f7742199090bf3", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + } + ] + }, + { + "_id": "6002ed409f2c60461a2d0f5a", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "5d0376a486f7747d8050965c", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 8200, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "templateId": "5d4042a986f7743185265463", + "type": "Tool" + }, + { + "templateId": "590c2d8786f774245b1f03f3", + "type": "Tool" + }, + { + "templateId": "5af04b6486f774195a3ebb49", + "type": "Tool" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c052f6886f7746b1e3db148", + "type": "Item" + } + ] + }, + { + "_id": "60048c82a7903e00382d9593", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "5d1b5e94d7ad1a2b865a96b0", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 32200, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b2ffd86f77425243e8d17", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d0377ce86f774186372f689", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c05308086f7746b2101e90b", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c37d286f77443be3d7827", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5af0561e86f7745f5f3ad6ac", + "type": "Item" + }, + { + "templateId": "590c2e1186f77425357b6124", + "type": "Tool" }, { "templateId": "6389c8fb46b54c634724d847", @@ -1648,54 +4483,433 @@ }, { "type": "QuestComplete", - "questId": "6396700fea19ac7ed845db32" + "questId": "63966ff54c3ef01b6f3ffad8" } - ], - "productionTime": 50400, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "6389c7750ef44505c87f5996", - "continuous": false, - "count": 4, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "62a1123ac30cfa1d366aeb82", - "areaType": 10, + "_id": "661e6c26750e453380391f55", + "areaType": 11, + "continuous": false, + "count": 1, + "endProduct": "660bc341c38b837877075e4c", + "isCodeProduction": true, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 600, "requirements": [ { - "areaType": 10, + "areaType": 11, "requiredLevel": 1, "type": "Area" }, { - "templateId": "57d14d2524597714373db789", "count": 1, - "isFunctional": true, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "660bbc47c38b837877075e47", "type": "Item" }, { - "templateId": "62a0a0bb621468534a797ad5", - "type": "Tool" + "type": "QuestComplete" } - ], - "productionTime": 1800, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "57f4c844245977379d5c14d1", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "655b33429db22d43ab42b704", + "_id": "5d8a13564ac882218d2085b0", + "areaType": 8, + "continuous": false, + "count": 3, + "endProduct": "5734773724597737fd047c14", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4900, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e3577886f774176a362503", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "575146b724597720a27126d5", + "type": "Item" + }, + { + "areaType": 8, + "requiredLevel": 2, + "type": "Area" + } + ] + }, + { + "_id": "600aa140090cb63380270290", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5e2af41e86f774755a234b67", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2900, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5ab8f04f86f774585f4237d8", + "type": "Item" + }, + { + "templateId": "61bf83814088ec1a363d7097", + "type": "Tool" + } + ] + }, + { + "_id": "5d93ba4486f77454bd61d2a9", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5d1b2f3f86f774252167a52c", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 9400, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c595c86f7747884343ad7", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b385e86f774252167b98a", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "61bf7b6302b3924be92fa8c3", + "type": "Item" + }, + { + "templateId": "5d40425986f7743185265461", + "type": "Tool" + }, + { + "templateId": "590c2e1186f77425357b6124", + "type": "Tool" + } + ] + }, + { + "_id": "5df8fe0deddb880fd56f2d7d", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "59e358a886f7741776641ac3", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2450, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d40407c86f774318526545a", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d40412b86f7743cb332ac3a", + "type": "Item" + }, + { + "templateId": "5d1b39a386f774252339976f", + "type": "Tool" + } + ] + }, + { + "_id": "5eda007f658fac5b8c3862a6", + "areaType": 11, + "continuous": false, + "count": 1, + "endProduct": "5c052f6886f7746b1e3db148", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 140000, + "requirements": [ + { + "areaType": 11, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c1265fc86f7743f896a21c2", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5af0561e86f7745f5f3ad6ac", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d0376a486f7747d8050965c", + "type": "Item" + }, + { + "templateId": "590c639286f774151567fa95", + "type": "Tool" + }, + { + "templateId": "590c2e1186f77425357b6124", + "type": "Tool" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "6389c7750ef44505c87f5996", + "type": "Item" + }, + { + "templateId": "6389c92d52123d5dd17f8876", + "type": "Tool" + }, + { + "type": "QuestComplete", + "questId": "63966fbeea19ac7ed845db2e" + } + ] + }, + { + "_id": "5dcfe2582f9b3d566c7af977", + "areaType": 2, + "continuous": false, + "count": 2, + "endProduct": "59e35cbb86f7741778269d83", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 12100, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b39a386f774252339976f", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c06779c86f77426e00dd782", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5734795124597738002c6176", + "type": "Item" + } + ] + }, + { + "_id": "5ede0502879619077751d00a", + "areaType": 7, + "continuous": false, + "count": 2, + "endProduct": "5c0e531d86f7747fa23f4d42", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5100, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c0e531286f7747fa54205c2", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b3a5d86f774252167ba22", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e3606886f77417674759a5", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "62a0a043cf4a99369e2624a5", + "type": "Item" + } + ] + }, + { + "_id": "5eda0ad40699b81bb9142aae", + "areaType": 11, + "continuous": false, + "count": 2, + "endProduct": "5c05300686f7746dce784e5d", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 225000, + "requirements": [ + { + "areaType": 11, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347baf24597738002c6178", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c392f86f77444754deb29", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "56742c324bdc2d150f8b456d", + "type": "Item" + }, + { + "templateId": "590c2e1186f77425357b6124", + "type": "Tool" + }, + { + "templateId": "6389c8fb46b54c634724d847", + "type": "Tool" + }, + { + "type": "QuestComplete", + "questId": "63966fe7ea74a47c2d3fc0e6" + } + ] + }, + { + "_id": "655b4669b71eeb7c4168c625", "areaType": 10, + "continuous": false, + "count": 90, + "endProduct": "5fd20ff893a8961fc660a954", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 13000, "requirements": [ { "areaType": 10, @@ -1703,19 +4917,19 @@ "type": "Area" }, { - "templateId": "56dff3afd2720bba668b4567", - "count": 180, - "isFunctional": false, + "count": 90, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "64b8725c4b75259c590fa899", "type": "Item" }, { - "templateId": "5d6fc78386f77449d825f9dc", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", "type": "Item" }, { @@ -1724,118 +4938,22 @@ }, { "type": "QuestComplete", - "questId": "64e7b9bffd30422ed03dad38" + "questId": "60e71c9ad54b755a3b53eb66" } - ], - "productionTime": 13000, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "56dfef82d2720bbd668b4567", + ] + }, + { + "_id": "655b4489065b076eb02c4b45", + "areaType": 10, "continuous": false, "count": 120, - "productionLimitCount": 0, + "endProduct": "54527ac44bdc2d36668b4567", + "isCodeProduction": false, "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5e0759e73c392e0367260488", - "areaType": 21, - "requirements": [ - { - "areaType": 21, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5df8a72c86f77412640e2e83", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5df8a6a186f77412640e2e80", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5df8a77486f77412672a1e3f", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "67586c61a0c49554ed0bb4a8", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 5950, + "locked": true, "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "674d6121c09f69dfb201a888", - "continuous": false, - "count": 1, "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5fe337e6c646836c3b6fc985", - "areaType": 21, - "requirements": [ - { - "areaType": 21, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5df8a72c86f77412640e2e83", - "count": 30, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5df8a77486f77412672a1e3f", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "67586c61a0c49554ed0bb4a8", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 12500, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c0530ee86f774697952d952", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6558d7894626375d6735670c", - "areaType": 10, + "productionTime": 8400, "requirements": [ { "areaType": 10, @@ -1843,142 +4961,103 @@ "type": "Area" }, { - "templateId": "5fc382c1016cce60e8341b20", - "count": 50, - "isFunctional": false, + "count": 180, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "54527a984bdc2d4e668b4567", "type": "Item" }, { - "templateId": "5d6fc87386f77449db3db94e", - "count": 2, - "isFunctional": false, + "count": 1, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", "type": "Item" }, { "templateId": "544fb5454bdc2df8738b456a", "type": "Tool" + }, + { + "type": "QuestComplete", + "questId": "639135534b15ca31f76bc317" } - ], - "productionTime": 15000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5fc275cf85fd526b824a571a", - "continuous": false, - "count": 50, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "61c4f862324588369162ac8c", - "areaType": 21, - "requirements": [ - { - "areaType": 21, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5df8a6a186f77412640e2e80", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5df8a72c86f77412640e2e83", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5df8a77486f77412672a1e3f", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 11500, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590a3efd86f77437d351a25b", + "_id": "5ede0053879619077751cff1", + "areaType": 7, "continuous": false, "count": 1, - "productionLimitCount": 0, + "endProduct": "5d02797c86f774203f38e30a", + "isCodeProduction": false, "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "66509e8c9398c9c9e10a31bb", - "areaType": 7, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4600, "requirements": [ { "areaType": 7, - "requiredLevel": 2, + "requiredLevel": 3, "type": "Area" }, { - "templateId": "5c10c8fd86f7743d7d706df3", - "count": 1, - "isFunctional": false, + "count": 3, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5d1b3a5d86f774252167ba22", "type": "Item" }, { - "templateId": "62a0a043cf4a99369e2624a5", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, - "type": "Item" - }, - { "templateId": "619cc01e0a7c3a1a2731940c", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" }, { - "templateId": "59e3606886f77417674759a5", - "count": 1, - "isFunctional": false, + "count": 2, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "544fb3364bdc2d34748b456a", "type": "Item" }, { - "gameVersions": [ - "edge_of_darkness", - "eod_tue_edition" - ], - "type": "GameVersion" + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d02797c86f774203f38e30a", + "type": "Item" } - ], - "productionTime": 4800, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "66507eabf5ddb0818b085b68", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "6589756f5c4f0642a502d54d", + "_id": "5e0756095a20a05b76027357", "areaType": 21, + "continuous": false, + "count": 1, + "endProduct": "674da107c512807d1a0e7436", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5550, "requirements": [ { "areaType": 21, @@ -1986,151 +5065,59 @@ "type": "Area" }, { - "templateId": "5df8a72c86f77412640e2e83", - "count": 4, - "isFunctional": false, + "count": 5, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5df8a72c86f77412640e2e83", + "type": "Item" + } + ] + }, + { + "_id": "655b4e591fe356507267b2f5", + "areaType": 10, + "continuous": false, + "count": 50, + "endProduct": "59e77a2386f7742ee578960a", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 8400, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", "type": "Item" }, { - "templateId": "5df8a6a186f77412640e2e80", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" + "templateId": "619cbfccbedcde2f5b3f7bdd", + "type": "Tool" } - ], - "productionTime": 5950, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "6176aca650224f204c1da3fb", + ] + }, + { + "_id": "655b63ac9db22d43ab42b70a", + "areaType": 2, "continuous": false, "count": 1, - "productionLimitCount": 0, + "endProduct": "5d5d87f786f77427997cfaef", + "isCodeProduction": false, "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d8a13fc2d9612419804003c", - "areaType": 8, - "requirements": [ - { - "templateId": "5448ff904bdc2d6f028b456e", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57347d7224597744596b4e72", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57347d8724597744596b4e76", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 8, - "requiredLevel": 1, - "type": "Area" - } - ], - "productionTime": 2900, + "locked": true, "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590c5d4b86f774784e1b9c45", - "continuous": false, - "count": 2, "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5e66408286f7747b2c2d7786", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5e2af51086f7746d3f3c3402", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5656eb674bdc2d35148b457c", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" - } - ], - "productionTime": 6000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5e340dcdcb6d5863cc5e5efb", - "continuous": false, - "count": 8, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5de95f1c9517b140195ab717", - "areaType": 10, - "requirements": [ - { - "templateId": "5af0561e86f7745f5f3ad6ac", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d63d33b86f7746ea9275524", - "type": "Tool" - } - ], - "productionTime": 4400, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590a358486f77429692b2790", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5eda07acb6c564225571536c", - "areaType": 2, + "productionTime": 9000, "requirements": [ { "areaType": 2, @@ -2138,79 +5125,135 @@ "type": "Area" }, { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, "templateId": "5e2af41e86f774755a234b67", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" }, { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4d286f7746d4159f07a", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, "templateId": "5e2af4a786f7746d3f3c3400", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" }, - { - "templateId": "62a0a098de7ac8199358053b", - "type": "Tool" - }, { "templateId": "61bf83814088ec1a363d7097", "type": "Tool" + }, + { + "templateId": "590c2e1186f77425357b6124", + "type": "Tool" + }, + { + "type": "QuestComplete", + "questId": "5b47876e86f7744d1c353205" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "656f9fa0498d1b7e3e071d98", + "type": "Item" } - ], - "productionTime": 2800, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5e4abfed86f77406a2713cf7", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "61b9da93e7304721fe66ab53", - "areaType": 21, + "_id": "67092bbfc45f0546bf097a7e", + "areaType": 7, + "continuous": false, + "count": 1, + "endProduct": "6707d0804e617ec94f0e562f", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 600, "requirements": [ { - "areaType": 21, - "requiredLevel": 1, + "type": "QuestComplete", + "questId": "67040cae4ac6d9c18c0ade2c" + }, + { + "areaType": 7, + "requiredLevel": 2, "type": "Area" }, { - "templateId": "5df8a72c86f77412640e2e83", - "count": 2, - "isFunctional": false, + "count": 5, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5448fee04bdc2dbc018b4567", "type": "Item" }, { - "templateId": "5df8a77486f77412672a1e3f", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "6389c6c7dbfd5e4b95197e68", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e3606886f77417674759a5", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5fca138c2a7b221b2852a5c6", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5ed5166ad380ab312177c100", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c10c8fd86f7743d7d706df3", "type": "Item" } - ], - "productionTime": 10400, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "637b620db7afa97bfc3d7009", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { "_id": "63a2327c151bfb591645c104", "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "5a1eaa87fcdbcb001865f75e", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 86400, "requirements": [ { "areaType": 10, @@ -2218,35 +5261,35 @@ "type": "Area" }, { - "templateId": "5d0377ce86f774186372f689", "count": 4, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5d0377ce86f774186372f689", "type": "Item" }, { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, "templateId": "5d1b2ffd86f77425243e8d17", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" }, { - "templateId": "6389c7750ef44505c87f5996", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "6389c7750ef44505c87f5996", "type": "Item" }, { - "templateId": "5c05308086f7746b2101e90b", "count": 2, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5c05308086f7746b2101e90b", "type": "Item" }, { @@ -2265,27 +5308,205 @@ "type": "QuestComplete", "questId": "6396701b9113f06a7c3b2379" } - ], - "productionTime": 86400, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5a1eaa87fcdbcb001865f75e", + ] + }, + { + "_id": "67093210d514d26f8408612b", + "areaType": 7, "continuous": false, "count": 1, - "productionLimitCount": 0, + "endProduct": "6707d0bdaab679420007e01a", + "isCodeProduction": false, "isEncoded": false, - "isCodeProduction": false + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 600, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 2, + "type": "Area" + }, + { + "type": "QuestComplete" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b33a686f7742523398398", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "6707d0804e617ec94f0e562f", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c695186f7741e566b64a2", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "544fb3f34bdc2d03748b456a", + "type": "Item" + } + ] + }, + { + "_id": "67449c79268737ef6908d636", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "674078c4a9c9adf0450d59f9", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 10, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "6740987b89d5e1ddc603f4f0", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "67449b6c89d5e1ddc603f504", + "type": "Item" + }, + { + "type": "QuestComplete" + } + ] + }, + { + "_id": "6012ea1a01328b2dec3c1a9d", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5c12688486f77426843c7d32", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 15500, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "56e33634d2720bd8058b456b", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57e26fc7245977162a14b800", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c06779c86f77426e00dd782", + "type": "Item" + }, + { + "templateId": "56742c284bdc2d98058b456d", + "type": "Tool" + } + ] + }, + { + "_id": "6589756f5c4f0642a502d54d", + "areaType": 21, + "continuous": false, + "count": 1, + "endProduct": "6176aca650224f204c1da3fb", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5950, + "requirements": [ + { + "areaType": 21, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 4, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a72c86f77412640e2e83", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a6a186f77412640e2e80", + "type": "Item" + } + ] }, { "_id": "6399c421d65735732c6ba765", "areaType": 11, + "continuous": false, + "count": 1, + "endProduct": "62e910aaf957f2915e0a5e36", + "isCodeProduction": false, + "isEncoded": true, + "locked": true, + "needFuelForAllProductionTime": true, + "productionLimitCount": 0, + "productionTime": 43200, "requirements": [ { - "templateId": "62e910aaf957f2915e0a5e36", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "62e910aaf957f2915e0a5e36", "type": "Item" }, { @@ -2306,3546 +5527,299 @@ "type": "Tool" }, { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, "templateId": "6389c70ca33d8c4cdf4932c6", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" } - ], - "productionTime": 43200, - "needFuelForAllProductionTime": true, + ] + }, + { + "_id": "63a232f8ab6bb51044344bff", + "areaType": 10, + "continuous": false, + "count": 4, + "endProduct": "6389c7750ef44505c87f5996", + "isCodeProduction": false, + "isEncoded": false, "locked": true, - "endProduct": "62e910aaf957f2915e0a5e36", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": true, - "isCodeProduction": false - }, - { - "_id": "61c77cc6fcc1673f08540e9b", - "areaType": 8, - "requirements": [ - { - "areaType": 8, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5448fee04bdc2dbc018b4567", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af29386f7746d4159f077", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b39a386f774252339976f", - "type": "Tool" - } - ], - "productionTime": 4000, "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "60098b1705871270cd5352a1", - "continuous": false, - "count": 2, "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "62a115db5c6bbf22c15ac19d", - "areaType": 10, + "productionTime": 50400, "requirements": [ { "areaType": 10, - "requiredLevel": 1, + "requiredLevel": 3, "type": "Area" }, { - "templateId": "62a0a0bb621468534a797ad5", - "type": "Tool" - }, - { - "templateId": "590c2b4386f77425357b6123", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "6389c7f115805221fb410466", "type": "Item" - } - ], - "productionTime": 900, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d1b31ce86f7742523398394", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6617cdb6b24b0ea24505f618", - "areaType": 10, - "requirements": [ + }, { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" + "templateId": "5af04b6486f774195a3ebb49", + "type": "Tool" }, { "templateId": "5d4042a986f7743185265463", "type": "Tool" }, { - "templateId": "5d1b31ce86f7742523398394", - "type": "Tool" - }, - { - "templateId": "5d0376a486f7747d8050965c", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "6389c70ca33d8c4cdf4932c6", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590a358486f77429692b2790", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "type": "QuestComplete" - } - ], - "productionTime": 1800, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "63a0b2eabea67a6d93009e52", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d78f27d115f693ad750d2c6", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "60391b0fb847c71012789415", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af51086f7746d3f3c3402", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 18300, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5448be9a4bdc2dfd2f8b456a", - "continuous": false, - "count": 6, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5ffcafd468c55773943fc71e", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5aa2ba46e5b5b000137b758d", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "61bf83814088ec1a363d7097", - "type": "Tool" - } - ], - "productionTime": 2600, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5e2af47786f7746d404f3aaa", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5eeca7724a8a9b668f0d89cd", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "64b7bbb74b75259c590fa897", - "count": 150, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c5a7286f7747884343aea", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2e1186f77425357b6124", - "type": "Tool" - } - ], - "productionTime": 7250, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c925fa22e221601da359b7b", - "continuous": false, - "count": 180, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5eecaa6327ccd70521107ff5", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "572b7adb24597762ae139821", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "61bf83814088ec1a363d7097", - "type": "Tool" - } - ], - "productionTime": 2200, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5e2af4a786f7746d3f3c3400", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b457c9db22d43ab42b706", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "59e68f6f86f7746c9f75e846", - "count": 120, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590a373286f774287540368b", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af37686f774755a234b65", + "templateId": "6389c8fb46b54c634724d847", "type": "Tool" }, { "type": "QuestComplete", - "questId": "5a27bb8386f7741c770d2d0a" + "questId": "6396700fea19ac7ed845db32" } - ], - "productionTime": 6800, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "619636be6db0f2477964e710", - "continuous": false, - "count": 120, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "655b4669b71eeb7c4168c625", - "areaType": 10, + "_id": "62a112fec1cce91d2c46a06e", + "areaType": 11, + "continuous": false, + "count": 1, + "endProduct": "62a0a124de7ac81993580542", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 43200, "requirements": [ { - "areaType": 10, - "requiredLevel": 3, + "areaType": 11, + "requiredLevel": 2, "type": "Area" }, { - "templateId": "64b8725c4b75259c590fa899", - "count": 90, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d6fc78386f77449d825f9dc", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5a8036fb86f77407252ddc02", "type": "Item" }, { - "templateId": "590c2e1186f77425357b6124", - "type": "Tool" + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "574eb85c245977648157eec3", + "type": "Item" }, { - "type": "QuestComplete", - "questId": "60e71c9ad54b755a3b53eb66" + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5900b89686f7744e704a8747", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5a80a29286f7742b25692012", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5798a2832459774b53341029", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5be4038986f774527d3fae60", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c621186f774138d11ea29", + "type": "Item" } - ], - "productionTime": 13000, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5fd20ff893a8961fc660a954", + ] + }, + { + "_id": "655b4a73975a7f3c734661a5", + "areaType": 10, "continuous": false, "count": 90, - "productionLimitCount": 0, + "endProduct": "59e0d99486f7744a32234762", + "isCodeProduction": false, "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6002e55595c402039a2747f4", - "areaType": 11, - "requirements": [ - { - "areaType": 11, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5c94bbff86f7747ee735c08f", - "count": 10, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c1d0d6d86f7744bb2683e1f", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c12613b86f7743bbe2c3f76", - "count": 4, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "61bf7c024770ee6f9c6b8b53", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c052fb986f7746b2101e909", - "type": "Tool" - } - ], - "productionTime": 476000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c1e495a86f7743109743dfb", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "600a9fb7ba91d953182d6a1c", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5d6fc87386f77449db3db94e", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d6fc78386f77449d825f9dc", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "60391b0fb847c71012789415", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "60391a8b3364dc22b04d0ce5", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5af04b6486f774195a3ebb49", - "type": "Tool" - } - ], - "productionTime": 39000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d0379a886f77420407aa271", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b47d1769de97e1d62d115", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5d6fc78386f77449d825f9dc", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "62a0a098de7ac8199358053b", - "type": "Tool" - } - ], - "productionTime": 4400, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "64b7af5a8532cf95ee0a0dbd", - "continuous": false, - "count": 200, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b58a49db22d43ab42b709", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "560d5e524bdc2d25448b4571", - "count": 60, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d6fc87386f77449db3db94e", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c5bbd86f774785762df04", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" - } - ], - "productionTime": 4200, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d6e68c4a4b9361b93413f79", - "continuous": false, - "count": 60, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "600ab813d19f85018a7489c4", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "590c595c86f7747884343ad7", - "count": 4, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "577e1c9d2459773cd707c525", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40419286f774318526545f", - "type": "Tool" - } - ], - "productionTime": 8000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d1b385e86f774252167b98a", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5dd3c9c8449c0c31795b0f0b", - "areaType": 10, - "requirements": [ - { - "templateId": "590c5a7286f7747884343aea", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d6fc78386f77449d825f9dc", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57347b8b24597737dd42e192", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - } - ], - "productionTime": 2150, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d6fc87386f77449db3db94e", - "continuous": false, - "count": 3, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5df8ffcbaab5f257bd7ff3a8", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "590c5c9f86f77477c91c36e7", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40419286f774318526545f", - "type": "Tool" - } - ], - "productionTime": 9000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590c5bbd86f774785762df04", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5e6cfc53a3e6886b9e6c39a8", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d1b3a5d86f774252167ba22", - "count": 7, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "59e3606886f77417674759a5", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c0e530286f7747fa1419862", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb3f34bdc2d03748b456a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 4990, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c0e531286f7747fa54205c2", - "continuous": false, - "count": 5, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5ed9fd73f6626f08ef0efec6", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d1b3a5d86f774252167ba22", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb37f4bdc2dee738b4567", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b3f2d86f774253763b735", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 4350, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "544fb3f34bdc2d03748b456a", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5eda04a30699b81bb9142aa2", - "areaType": 2, - "requirements": [ - { - "templateId": "5e2af47786f7746d404f3aaa", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 2, - "requiredLevel": 1, - "type": "Area" - } - ], - "productionTime": 1900, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "544fb25a4bdc2dfb738b4567", - "continuous": false, - "count": 6, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5ede07163c345121732a10e9", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "544fb25a4bdc2dfb738b4567", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40407c86f774318526545a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 1000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5751a25924597722c463c472", - "continuous": false, - "count": 10, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "63a571802116d261d2336cd1", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "6389c70ca33d8c4cdf4932c6", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c052f6886f7746b1e3db148", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590a3efd86f77437d351a25b", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "56742c324bdc2d150f8b456d", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2d8786f774245b1f03f3", - "type": "Tool" - }, - { - "templateId": "5af04b6486f774195a3ebb49", - "type": "Tool" - }, - { - "type": "QuestComplete", - "questId": "625d6ffaf7308432be1d44c5" - } - ], - "productionTime": 5400, - "needFuelForAllProductionTime": false, "locked": true, - "endProduct": "63a0b2eabea67a6d93009e52", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b65fc1273611d2462ab77", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "656fae5f7c2d57afe200c0d7", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af4a786f7746d3f3c3400", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40419286f774318526545f", - "type": "Tool" - }, - { - "templateId": "61bf83814088ec1a363d7097", - "type": "Tool" - }, - { - "type": "QuestComplete", - "questId": "5ae4497b86f7744cf402ed00" - }, - { - "templateId": "5e2af4d286f7746d4159f07a", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 14000, "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5b44cad286f77402a54ae7e5", - "continuous": false, - "count": 1, "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5ffcacbf24fa2e741e767234", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "590a3efd86f77437d351a25b", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c06779c86f77426e00dd782", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c06782b86f77426df5407d2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5672cb124bdc2d1a0f8b4568", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2e1186f77425357b6124", - "type": "Tool" - } - ], - "productionTime": 5500, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5672cb724bdc2dc2088b456b", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6002e26ac6b84d04cc62045e", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "590a386e86f77429692b27ab", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2d8786f774245b1f03f3", - "type": "Tool" - } - ], - "productionTime": 2600, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590a391c86f774385a33c404", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b34dc1273611d2462ab74", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "59e6927d86f77411da468256", - "count": 180, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c31c586f774245e3141b2", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "62a0a0bb621468534a797ad5", - "type": "Tool" - } - ], - "productionTime": 2770, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5c0d5ae286f7741e46554302", - "continuous": false, - "count": 180, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "615c3d27966c85458e4c49cf", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "590c678286f77426c9660122", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5751a25924597722c463c472", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "60098af40accd37ef2175f27", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 3600, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "60098ad7c2240c0fe85c570a", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "629e1b3a0694b45420210cad", - "areaType": 8, - "requirements": [ - { - "areaType": 8, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5e54f6af86f7742199090bf3", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c5a7286f7747884343aea", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 2700, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5af0484c86f7740f02001f7f", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "62a116282c5e0c325b62d5ec", - "areaType": 11, - "requirements": [ - { - "areaType": 11, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5c05308086f7746b2101e90b", - "type": "Tool" - }, - { - "templateId": "590c621186f774138d11ea29", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "62a0a124de7ac81993580542", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 36000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "62a0a16d0b9d3c46de5b6e97", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "64b6aefe25251516d768542d", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "62a0a098de7ac8199358053b", - "type": "Tool" - }, - { - "type": "QuestComplete", - "questId": "5c0d190cd09282029f5390d8" - }, - { - "templateId": "5e2af51086f7746d3f3c3402", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "60391b0fb847c71012789415", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 4800, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5e32f56fcb6d5863cc5e5ee4", - "continuous": false, - "count": 5, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5e0758f99694354c4d2bfd47", - "areaType": 21, - "requirements": [ - { - "areaType": 21, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5df8a77486f77412672a1e3f", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 6200, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "651450ce0e00edc794068371", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "61b9d9deef9a1b5d6a798986", - "areaType": 21, - "requirements": [ - { - "areaType": 21, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5df8a77486f77412672a1e3f", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 5200, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d403f9186f7743cac3f229b", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b68b4769de97e1d62d117", - "areaType": 2, - "requirements": [ - { - "templateId": "57347c1124597737fb1379e3", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af4d286f7746d4159f07a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 2, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "61bf83814088ec1a363d7097", - "type": "Tool" - }, - { - "templateId": "62a0a0bb621468534a797ad5", - "type": "Tool" - }, - { - "templateId": "5e2af4a786f7746d3f3c3400", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 4305, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d5e9c74a4b9364855191c40", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6745925da9c9adf0450d5bca", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "67409848d0b2f8eb9b034db9", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" - }, - { - "type": "QuestComplete" - } - ], - "productionTime": 10, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "674098588466ebb03408b210", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5dceeaf100b3815535149f5a", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d1b371186f774253763a656", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57347c5b245977448d35f6e1", - "count": 4, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57347c77245977448d35f6e2", - "count": 4, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40419286f774318526545f", - "type": "Tool" - } - ], - "productionTime": 12000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c127c4486f7745625356c13", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d8f614c9ea122564c316462", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5af0548586f7743a532b7e99", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5751a89d24597722aa0e8db0", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b3a5d86f774252167ba22", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 6900, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c0e530286f7747fa1419862", - "continuous": false, - "count": 7, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5dc1f4d9e078d303d91b44c7", - "areaType": 8, - "requirements": [ - { - "areaType": 8, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5d1b33a686f7742523398398", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b39a386f774252339976f", - "type": "Tool" - } - ], - "productionTime": 6650, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5448fee04bdc2dbc018b4567", - "continuous": false, - "count": 8, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5ede01e062155304b6512067", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d1b39a386f774252339976f", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b3f2d86f774253763b735", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 1670, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5b4335ba86f7744d2837a264", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5eeca812c4c989140245ae0c", - "areaType": 11, - "requirements": [ - { - "areaType": 11, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "590a3b0486f7743954552bdb", - "count": 10, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "573477e124597737dd42e191", - "count": 10, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5734779624597737e04bf329", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c05300686f7746dce784e5d", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "60391afc25aff57af81f7085", - "type": "Tool" - }, - { - "templateId": "590c639286f774151567fa95", - "type": "Tool" - } - ], - "productionTime": 349000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "57347ca924597744596b4e71", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5eeca8e327ccd70521107fdc", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "590a391c86f774385a33c404", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c06779c86f77426e00dd782", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c06782b86f77426df5407d2", - "count": 4, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5af0561e86f7745f5f3ad6ac", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2e1186f77425357b6124", - "type": "Tool" - } - ], - "productionTime": 18900, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c052e6986f7746b207bc3c9", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6012ea1a01328b2dec3c1a9d", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "56e33634d2720bd8058b456b", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57e26fc7245977162a14b800", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c06779c86f77426e00dd782", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "56742c284bdc2d98058b456d", - "type": "Tool" - } - ], - "productionTime": 15500, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c12688486f77426843c7d32", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b675e1f2b6843ec751fd6", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "65573fa5655447403702a816", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af4d286f7746d4159f07a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af4a786f7746d3f3c3400", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "63a0b208f444d32d6f03ea1e", - "type": "Tool" - }, - { - "templateId": "61bf83814088ec1a363d7097", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "type": "QuestComplete", - "questId": "5c1141f386f77430ff393792" - } - ], - "productionTime": 8000, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "628d0618d1ba6e4fa07ce5a4", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "67093210d514d26f8408612b", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 2, - "type": "Area" - }, - { - "type": "QuestComplete" - }, - { - "templateId": "5d1b33a686f7742523398398", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "6707d0804e617ec94f0e562f", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c695186f7741e566b64a2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb3f34bdc2d03748b456a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 600, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "6707d0bdaab679420007e01a", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5ffcab66fd851f4b000d61ef", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d1b36a186f7742523398433", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57347c77245977448d35f6e2", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57347c5b245977448d35f6e1", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "61bf7b6302b3924be92fa8c3", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40419286f774318526545f", - "type": "Tool" - } - ], - "productionTime": 30000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5e2af55f86f7746d4159f07c", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5dd11303b78bb413d5133f79", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "57347c2e24597744902c94a1", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2d8786f774245b1f03f3", - "type": "Tool" - } - ], - "productionTime": 7450, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c06782b86f77426df5407d2", - "continuous": false, - "count": 6, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5de950a845b5d67bad6e9ef7", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "57347cd0245977445a2d6ff1", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c06779c86f77426e00dd782", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5734795124597738002c6176", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 2100, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "59e36c6f86f774176c10a2a7", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5de95c91225b0a76ca0ea0b7", - "areaType": 10, - "requirements": [ - { - "templateId": "59e35de086f7741778269d84", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5734795124597738002c6176", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d63d33b86f7746ea9275524", - "type": "Tool" - }, - { - "templateId": "590c2d8786f774245b1f03f3", - "type": "Tool" - } - ], - "productionTime": 4800, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d1b2fa286f77425227d1674", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5df138986c38ba26da0b3a77", - "areaType": 10, - "requirements": [ - { - "templateId": "5d1b304286f774253763a528", - "count": 4, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "590c2d8786f774245b1f03f3", - "type": "Tool" - } - ], - "productionTime": 1320, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d1b309586f77425227d1676", - "continuous": false, - "count": 4, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5f240f45f4a9420a8c328ee0", - "areaType": 8, - "requirements": [ - { - "areaType": 8, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "57514643245977207f2c2d09", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5af0484c86f7740f02001f7f", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5448fee04bdc2dbc018b4567", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "62a09e73af34e73a266d932a", - "type": "Tool" - } - ], - "productionTime": 6500, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5751435d24597720a27126d1", - "continuous": false, - "count": 4, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b4e591fe356507267b2f5", - "areaType": 10, + "productionTime": 9400, "requirements": [ { "areaType": 10, "requiredLevel": 3, "type": "Area" }, - { - "templateId": "5d6fc78386f77449d825f9dc", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, { "templateId": "619cbfccbedcde2f5b3f7bdd", "type": "Tool" - } - ], - "productionTime": 8400, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "59e77a2386f7742ee578960a", - "continuous": false, - "count": 50, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "61b9da10695bdc188002db3a", - "areaType": 21, - "requirements": [ - { - "areaType": 21, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5df8a6a186f77412640e2e80", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5df8a77486f77412672a1e3f", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 5400, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c0e531286f7747fa54205c2", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b5dc8065b076eb02c4b48", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5e2af4d286f7746d4159f07a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af4a786f7746d3f3c3400", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "656f57dc27aed95beb08f628", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 4000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c0e5edb86f77461f55ed1f7", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b6b641273611d2462ab78", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5e2af41e86f774755a234b67", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5734795124597738002c6176", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 1200, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "56e335e4d2720b6c058b456d", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "660c2dbaa2a92e70cc074863", - "areaType": 11, - "requirements": [ - { - "templateId": "660bbc47c38b837877075e47", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 11, - "requiredLevel": 1, - "type": "Area" - }, - { - "type": "QuestComplete" - } - ], - "productionTime": 900, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "660bbc98c38b837877075e4a", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "657fc79cfd86b9d9680c4a24", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "657b22485f444d6dff0c6c2f", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af22086f7746d3f3c33fa", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57347c1124597737fb1379e3", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "63a0b208f444d32d6f03ea1e", - "type": "Tool" }, { "templateId": "59e35de086f7741778269d84", "type": "Tool" - } - ], - "productionTime": 1600, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "656efd66034e8e01c407f35c", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5de919ec1b25d85cf30ca39a", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" }, { - "templateId": "58d3db5386f77426186285a0", - "count": 2, - "isFunctional": false, + "count": 90, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "64b7af434b75259c590fa893", "type": "Item" }, { - "templateId": "617aa4dd8166f034d57de9c5", "count": 1, - "isFunctional": false, "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2d8786f774245b1f03f3", - "type": "Tool" - } - ], - "productionTime": 5870, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d6fc78386f77449d825f9dc", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5eda0247658fac5b8c3862a8", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "55d480c04bdc2d1d4e8b456a", - "count": 4, "isFunctional": false, - "isEncoded": false, "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af29386f7746d4159f077", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d4042a986f7743185265463", - "type": "Tool" - } - ], - "productionTime": 5000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "55d482194bdc2d1d4e8b456b", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5ede0135f7db6021ee400dfe", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5c13cd2486f774072c757944", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40412b86f7743cb332ac3a", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b3a5d86f774252167ba22", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 3300, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5755383e24597772cb798966", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b4bbe4343a16d2e047668", - "areaType": 10, - "requirements": [ - { - "templateId": "590c5a7286f7747884343aea", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - } - ], - "productionTime": 5900, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5e023e53d4353e3302577c4c", - "continuous": false, - "count": 120, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "600abc08e4022c380a7260a8", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5af0534a86f7743b6f354284", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590a391c86f774385a33c404", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c052fb986f7746b2101e909", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5af0561e86f7745f5f3ad6ac", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2e1186f77425357b6124", - "type": "Tool" - }, - { - "templateId": "6389c7750ef44505c87f5996", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "6389c8fb46b54c634724d847", - "type": "Tool" - } - ], - "productionTime": 120000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c0530ee86f774697952d952", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b4f57769de97e1d62d116", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "59e77a2386f7742ee578960a", - "count": 50, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "60391a8b3364dc22b04d0ce5", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "62a0a0bb621468534a797ad5", - "type": "Tool" - }, - { "templateId": "5d6fc78386f77449d825f9dc", - "count": 2, - "isFunctional": false, + "type": "Item" + }, + { + "count": 1, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5751496424597720a27126da", "type": "Item" }, { "type": "QuestComplete", - "questId": "5bc4856986f77454c317bea7" + "questId": "60e71bb4e456d449cd47ca75" } - ], - "productionTime": 9500, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5e023d34e8a400319a28ed44", - "continuous": false, - "count": 50, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "655b505c32b0b1645e6f54c5", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "573720e02459776143012541", - "count": 150, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c06779c86f77426e00dd782", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 3300, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5737218f245977612125ba51", - "continuous": false, - "count": 150, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "600a98d076fc4b1877509ead", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5d1c819a86f774771b0acd6c", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5648b0744bdc2d363b8b4578", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5649b1c04bdc2d16268b457c", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2b4386f77425357b6123", - "type": "Tool" - }, - { - "templateId": "590c2d8786f774245b1f03f3", - "type": "Tool" - } - ], - "productionTime": 4900, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5644bd2b4bdc2d3b4c8b4572", + "_id": "5fe337e6c646836c3b6fc985", + "areaType": 21, "continuous": false, "count": 1, - "productionLimitCount": 0, + "endProduct": "5c0530ee86f774697952d952", + "isCodeProduction": false, "isEncoded": false, - "isCodeProduction": false + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 12500, + "requirements": [ + { + "areaType": 21, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 30, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a72c86f77412640e2e83", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a77486f77412672a1e3f", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "67586c61a0c49554ed0bb4a8", + "type": "Item" + } + ] }, { - "_id": "600aa209f64dfd63ec1293d6", + "_id": "655b68b4769de97e1d62d117", "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5d5e9c74a4b9364855191c40", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4305, "requirements": [ + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347c1124597737fb1379e3", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4d286f7746d4159f07a", + "type": "Item" + }, { "areaType": 2, "requiredLevel": 2, "type": "Area" }, - { - "templateId": "5e4abfed86f77406a2713cf7", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af4a786f7746d3f3c3400", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af41e86f774755a234b67", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, { "templateId": "61bf83814088ec1a363d7097", "type": "Tool" - } - ], - "productionTime": 3600, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5648a69d4bdc2ded0b8b457b", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "603cf3094bb658618458e010", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5c1265fc86f7743f896a21c2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b309586f77425227d1676", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d4042a986f7743185265463", - "type": "Tool" - } - ], - "productionTime": 6000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "56742c324bdc2d150f8b456d", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "615c3d800d3afc358a55405e", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "574d967124597745970e7c94", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d63d33b86f7746ea9275524", - "type": "Tool" - } - ], - "productionTime": 3100, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d1c819a86f774771b0acd6c", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "619eb0eb56579138ec08fed8", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "619cc01e0a7c3a1a2731940c", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c661e86f7741e566b646a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 2950, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d02778e86f774203e7dedbe", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6666d829a8298779fc40e537", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d1b317c86f7742523398392", - "type": "Tool" - }, - { - "templateId": "5d4042a986f7743185265463", - "type": "Tool" - }, - { - "templateId": "5af04b6486f774195a3ebb49", - "type": "Tool" - }, - { - "templateId": "66572b88ac60f009f270d1dc", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 300, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "665732f4464c4b4ba4670fa9", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "67092bbfc45f0546bf097a7e", - "areaType": 7, - "requirements": [ - { - "type": "QuestComplete", - "questId": "67040cae4ac6d9c18c0ade2c" - }, - { - "areaType": 7, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5448fee04bdc2dbc018b4567", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "6389c6c7dbfd5e4b95197e68", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "59e3606886f77417674759a5", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5fca138c2a7b221b2852a5c6", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5ed5166ad380ab312177c100", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c10c8fd86f7743d7d706df3", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 600, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "6707d0804e617ec94f0e562f", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5dd1126571e3fd3f634b1c8b", - "areaType": 10, - "requirements": [ - { - "templateId": "59e36c6f86f774176c10a2a7", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - } - ], - "productionTime": 7100, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c06779c86f77426e00dd782", - "continuous": false, - "count": 8, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5e58e0c286f7740ba7486ca3", - "areaType": 11, - "requirements": [ - { - "areaType": 11, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "62a0a16d0b9d3c46de5b6e97", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "577e1c9d2459773cd707c525", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 114000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c12613b86f7743bbe2c3f76", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5eda072cf6626f08ef0efed4", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5e2af4d286f7746d4159f07a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af4a786f7746d3f3c3400", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 3250, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "59e7635f86f7742cbf2c1095", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "63bd4c3964d7e356983c4cf5", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5cc80f79e4a949033c7343b2", - "count": 100, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d6fc78386f77449d825f9dc", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c06782b86f77426df5407d2", - "count": 4, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" - } - ], - "productionTime": 8700, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5cc80f38e4a949001152b560", - "continuous": false, - "count": 100, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5ffcad24f3fdc212a91d5536", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5d1b36a186f7742523398433", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c5a7286f7747884343aea", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40419286f774318526545f", - "type": "Tool" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" - } - ], - "productionTime": 5250, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "64b8ee384b75259c590fa89b", - "continuous": false, - "count": 50, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "600a9955ba91d953182d69f0", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "59e6152586f77473dc057aa1", - "count": 1, - "isFunctional": true, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "59d64fc686f774171b243fe2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" - }, - { - "templateId": "62a0a0bb621468534a797ad5", - "type": "Tool" - } - ], - "productionTime": 5100, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "59d6088586f774275f37482f", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b50e7c023e22044165de5", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "64b7bbb74b75259c590fa897", - "count": 180, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1c774f86f7746d6620f8db", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c06779c86f77426e00dd782", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 5600, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5a3c16fe86f77452b62de32a", - "continuous": false, - "count": 180, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "62a11354b552772a0c4ba09e", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5780cf722459777a5108b9a1", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c5a7286f7747884343aea", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "61bf7b6302b3924be92fa8c3", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" }, { "templateId": "62a0a0bb621468534a797ad5", "type": "Tool" }, { - "templateId": "5d40419286f774318526545f", - "type": "Tool" - } - ], - "productionTime": 10000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "60391a8b3364dc22b04d0ce5", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "62a11658650cc35fa94e009a", - "areaType": 8, - "requirements": [ - { - "areaType": 8, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "57347d3d245977448f7b7f61", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e8f3423fd7471236e6e3b64", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b33a686f7742523398398", "count": 1, - "isFunctional": false, "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 36000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "62a09f32621468534a797acb", - "continuous": false, - "count": 10, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "60048c82a7903e00382d9593", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5d1b2ffd86f77425243e8d17", - "count": 3, "isFunctional": false, - "isEncoded": false, "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d0377ce86f774186372f689", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c05308086f7746b2101e90b", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c37d286f77443be3d7827", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5af0561e86f7745f5f3ad6ac", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2e1186f77425357b6124", - "type": "Tool" - }, - { - "templateId": "6389c8fb46b54c634724d847", - "type": "Tool" - }, - { - "type": "QuestComplete", - "questId": "63966ff54c3ef01b6f3ffad8" - } - ], - "productionTime": 32200, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5d1b5e94d7ad1a2b865a96b0", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "66575197464c4b4ba4671004", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d1b317c86f7742523398392", - "type": "Tool" - }, - { - "templateId": "5d4042a986f7743185265463", - "type": "Tool" - }, - { - "templateId": "5af04b6486f774195a3ebb49", - "type": "Tool" - }, - { - "templateId": "66572b3f6a723f7f005a066c", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 300, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "665732e7ac60f009f270d1ef", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b60774343a16d2e04766b", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5e2af4d286f7746d4159f07a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { "templateId": "5e2af4a786f7746d3f3c3400", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "59e3556c86f7741776641ac2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "59faf98186f774067b6be103", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "656fa25e94b480b8a500c0e0", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" } - ], - "productionTime": 7000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5ab8dced86f774646209ec87", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "67449c79268737ef6908d636", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "6740987b89d5e1ddc603f4f0", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "67449b6c89d5e1ddc603f504", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "type": "QuestComplete" - } - ], - "productionTime": 10, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "674078c4a9c9adf0450d59f9", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { "_id": "5d8a1568df9fc649e81b8b1b", "areaType": 8, + "continuous": false, + "count": 5, + "endProduct": "573476f124597737e04bf328", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 6100, "requirements": [ { "areaType": 8, @@ -5853,567 +5827,35 @@ "type": "Area" }, { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, "templateId": "573475fb24597737fb1379e1", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" }, { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, "templateId": "5bc9be8fd4351e00334cae6e", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" } - ], - "productionTime": 6100, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "573476f124597737e04bf328", - "continuous": false, - "count": 5, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d78d81757c9b8484a2bcb99", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "590c5a7286f7747884343aea", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d6fc78386f77449d825f9dc", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5af04b6486f774195a3ebb49", - "type": "Tool" - } - ], - "productionTime": 6250, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "60194943740c5d77f6705eea", - "continuous": false, - "count": 150, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { "_id": "5dc1f7de6058e020335c9d88", "areaType": 8, - "requirements": [ - { - "areaType": 8, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "57505f6224597709a92585a9", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57347d90245977448f7b7f65", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5448ff904bdc2d6f028b456e", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 4300, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "544fb6cc4bdc2d34748b456e", "continuous": false, "count": 7, - "productionLimitCount": 0, + "endProduct": "544fb6cc4bdc2d34748b456e", + "isCodeProduction": false, "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5ede1e0b7690fa313b632e88", - "areaType": 8, - "requirements": [ - { - "areaType": 8, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "57347da92459774491567cf5", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57347d8724597744596b4e76", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57347d3d245977448f7b7f61", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 4710, - "needFuelForAllProductionTime": false, "locked": false, - "endProduct": "57347d7224597744596b4e72", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6002e8fb41d38607bc4198ab", - "areaType": 11, - "requirements": [ - { - "areaType": 11, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "590c621186f774138d11ea29", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e42c83786f7742a021fdf3c", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c052fb986f7746b2101e909", - "type": "Tool" - }, - { - "templateId": "5c05300686f7746dce784e5d", - "type": "Tool" - }, - { - "templateId": "61bf7c024770ee6f9c6b8b53", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 236000, "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5e42c81886f7742a01529f57", - "continuous": false, - "count": 1, "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "600a9b10adfcb94fee6d3e06", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "590c31c586f774245e3141b2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "59e36c6f86f774176c10a2a7", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 3400, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "57347cd0245977445a2d6ff1", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b598db71eeb7c4168c626", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "590c31c586f774245e3141b2", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d6fc78386f77449d825f9dc", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "63a0b208f444d32d6f03ea1e", - "type": "Tool" - }, - { - "type": "QuestComplete", - "questId": "5c0bc91486f7746ab41857a2" - } - ], - "productionTime": 3000, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5d6e6911a4b9361bd5780d52", - "continuous": false, - "count": 60, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6002ed409f2c60461a2d0f5a", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d4042a986f7743185265463", - "type": "Tool" - }, - { - "templateId": "590c2d8786f774245b1f03f3", - "type": "Tool" - }, - { - "templateId": "5af04b6486f774195a3ebb49", - "type": "Tool" - }, - { - "templateId": "5c052f6886f7746b1e3db148", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 8200, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d0376a486f7747d8050965c", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6671d4fef3bee343f5000703", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5c10c8fd86f7743d7d706df3", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "62a0a043cf4a99369e2624a5", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "619cc01e0a7c3a1a2731940c", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "59e3606886f77417674759a5", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "type": "QuestComplete", - "questId": "665eeca92f7aedcc900b0437" - } - ], - "productionTime": 4800, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "66507eabf5ddb0818b085b68", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b6c381fe356507267b2f6", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "590c2c9c86f774245b1f03f2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5f5e45cc5021ce62144be7aa", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5734795124597738002c6176", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "61bf83814088ec1a363d7097", - "type": "Tool" - } - ], - "productionTime": 2500, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "59e763f286f7742ee57895da", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d78d8a03fe9fc21602e16be", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5d1b3a5d86f774252167ba22", - "count": 4, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "60098af40accd37ef2175f27", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5af0454c86f7746bf20992e8", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 4500, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590c657e86f77412b013051d", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d93ba4486f77454bd61d2a9", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "590c595c86f7747884343ad7", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b385e86f774252167b98a", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "61bf7b6302b3924be92fa8c3", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40425986f7743185265461", - "type": "Tool" - }, - { - "templateId": "590c2e1186f77425357b6124", - "type": "Tool" - } - ], - "productionTime": 9400, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d1b2f3f86f774252167a52c", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5de021b30f6d581e965bcde7", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "59e6687d86f77411d949b251", - "count": 1, - "isFunctional": true, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" - } - ], - "productionTime": 4700, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d1c819a86f774771b0acd6c", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5de10c50c607752a1f1262c7", - "areaType": 8, + "productionTime": 4300, "requirements": [ { "areaType": 8, @@ -6421,1225 +5863,50 @@ "type": "Area" }, { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, "templateId": "57505f6224597709a92585a9", - "count": 2, - "isFunctional": false, + "type": "Item" + }, + { + "count": 1, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "57347d90245977448f7b7f65", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5448ff904bdc2d6f028b456e", "type": "Item" } - ], - "productionTime": 5000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "59e3577886f774176a362503", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5f241246232409155b66b809", - "areaType": 8, - "requirements": [ - { - "areaType": 8, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5d1b33a686f7742523398398", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "59e3577886f774176a362503", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5af0484c86f7740f02001f7f", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5bc9be8fd4351e00334cae6e", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b385e86f774252167b98a", - "type": "Tool" - }, - { - "templateId": "62a09e73af34e73a266d932a", - "type": "Tool" - } - ], - "productionTime": 43200, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5751496424597720a27126da", - "continuous": false, - "count": 20, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b54e7065b076eb02c4b47", - "areaType": 10, - "requirements": [ - { - "templateId": "590c5a7286f7747884343aea", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d6fc87386f77449db3db94e", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" - } - ], - "productionTime": 3400, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5cc80f53e4a949000e1ea4f8", - "continuous": false, - "count": 150, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "600ab8e3e4022c380a726088", - "areaType": 8, - "requirements": [ - { - "areaType": 8, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5448fee04bdc2dbc018b4567", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40407c86f774318526545a", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57505f6224597709a92585a9", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5bc9be8fd4351e00334cae6e", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b385e86f774252167b98a", - "type": "Tool" - } - ], - "productionTime": 6400, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d403f9186f7743cac3f229b", - "continuous": false, - "count": 3, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "61b9da6a66f37641c8240014", - "areaType": 21, - "requirements": [ - { - "areaType": 21, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5df8a6a186f77412640e2e80", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5df8a72c86f77412640e2e83", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 8400, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5ed5160a87bb8443d10680b5", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b5ebc32b0b1645e6f54c9", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "656f603f94b480b8a500c0d6", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af41e86f774755a234b67", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "59e3556c86f7741776641ac2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "type": "QuestComplete", - "questId": "5ae4495086f77443c122bc40" - }, - { - "templateId": "5e2af4d286f7746d4159f07a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 7000, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5c0e57ba86f7747fa141986d", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "676a9fe717262755cf0ff52f", - "areaType": 21, - "requirements": [ - { - "templateId": "5d40407c86f774318526545a", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d403f9186f7743cac3f229b", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "67586c61a0c49554ed0bb4a8", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 21, - "requiredLevel": 1, - "type": "Area" - } - ], - "productionTime": 16000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "67586bee39b1b82b0d0f9d06", - "continuous": false, - "count": 4, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d78dbfb65aebb016d20b6f3", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d1c819a86f774771b0acd6c", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5648b1504bdc2d9d488b4584", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5ac50c185acfc400163398d4", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2e1186f77425357b6124", - "type": "Tool" - } - ], - "productionTime": 5000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5ac4cd105acfc40016339859", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5dd3c5487058311d4b267186", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "56dff216d2720bbd668b4568", - "count": 120, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2b4386f77425357b6123", - "type": "Tool" - } - ], - "productionTime": 5350, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590c5a7286f7747884343aea", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5ed9ff023a68ec264e5233c2", - "areaType": 11, - "requirements": [ - { - "areaType": 11, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d0376a486f7747d8050965c", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "573477e124597737dd42e191", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c06782b86f77426df5407d2", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" - }, - { - "templateId": "6389c92d52123d5dd17f8876", - "type": "Tool" - }, - { - "type": "QuestComplete", - "questId": "63966faeea19ac7ed845db2c" - } - ], - "productionTime": 135399, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5c05308086f7746b2101e90b", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "63baedefe6ebc10fe0201083", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5ba2678ad4351e44f824b344", - "count": 120, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5af04b6486f774195a3ebb49", - "type": "Tool" - }, - { - "templateId": "590a3d9c86f774385926e510", - "type": "Tool" - }, - { - "templateId": "5c06782b86f77426df5407d2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "61bf7b6302b3924be92fa8c3", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "type": "QuestComplete", - "questId": "5c0d4e61d09282029f53920e" - } - ], - "productionTime": 12400, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5ba26835d4351e0035628ff5", - "continuous": false, - "count": 120, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5ee4a093a297eb185236194f", - "areaType": 11, - "requirements": [ - { - "areaType": 11, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5c94bbff86f7747ee735c08f", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c05300686f7746dce784e5d", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5ac78a9b86f7741cca0bbd8d", - "type": "Tool" - }, - { - "templateId": "6389c92d52123d5dd17f8876", - "type": "Tool" - }, - { - "type": "QuestComplete", - "questId": "63966fccac6f8f3c677b9d89" - } - ], - "productionTime": 192000, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5c052fb986f7746b2101e909", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b4de41f2b6843ec751fd5", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "64b8f7968532cf95ee0a0dbf", - "count": 70, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d6fc87386f77449db3db94e", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" - } - ], - "productionTime": 14400, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5887431f2459777e1612938f", - "continuous": false, - "count": 70, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6002e68bca41c53bee18813b", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "57347c1124597737fb1379e3", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5734795124597738002c6176", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "59e358a886f7741776641ac3", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "56742c284bdc2d98058b456d", - "type": "Tool" - } - ], - "productionTime": 4800, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5e2af29386f7746d4159f077", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "600a9a34189b226f40059743", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5b4391a586f7745321235ab2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "59e366c186f7741778269d85", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2e1186f77425357b6124", - "type": "Tool" - }, - { - "templateId": "590c639286f774151567fa95", - "type": "Tool" - } - ], - "productionTime": 9100, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d1b2ffd86f77425243e8d17", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "629e19eddb6e1a02066676f1", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "590c2e1186f77425357b6124", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5bc9b355d4351e6d1509862a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1c819a86f774771b0acd6c", - "count": 10, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5734795124597738002c6176", - "count": 5, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "62a0a0bb621468534a797ad5", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 50400, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5910968f86f77425cf569c32", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "66582be04de4820934746cea", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5c07df7f0db834001b73588a", - "type": "Tool" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" - }, - { - "templateId": "665828c44de4820934746ce4", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 300, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "66582972ac60f009f270d2aa", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5dcfe2582f9b3d566c7af977", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5d1b39a386f774252339976f", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c06779c86f77426e00dd782", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5734795124597738002c6176", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 12100, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "59e35cbb86f7741778269d83", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5df914a53ce0f648b833bb37", - "areaType": 11, - "requirements": [ - { - "templateId": "56742c324bdc2d150f8b456d", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c1265fc86f7743f896a21c2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c392f86f77444754deb29", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "areaType": 11, - "requiredLevel": 2, - "type": "Area" - } - ], - "productionTime": 123200, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590c621186f774138d11ea29", - "continuous": false, - "count": 3, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "61c77d465a98404dee40a77c", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5efb0d4f4bc50b58e81710f3", - "count": 150, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d6fc87386f77449db3db94e", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "544fb5454bdc2df8738b456a", - "type": "Tool" - }, - { - "templateId": "5d6fc78386f77449d825f9dc", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c31c586f774245e3141b2", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "62a0a0bb621468534a797ad5", - "type": "Tool" - } - ], - "productionTime": 12400, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5efb0cabfb3e451d70735af5", - "continuous": false, - "count": 150, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5ffcac4e1285295b7441ee01", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "590a3efd86f77437d351a25b", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2d8786f774245b1f03f3", - "type": "Tool" - } - ], - "productionTime": 2900, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590a3b0486f7743954552bdb", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5e075ac73c392e0367260489", - "areaType": 21, - "requirements": [ - { - "areaType": 21, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5df8a77486f77412672a1e3f", - "count": 13, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5df8a72c86f77412640e2e83", - "count": 20, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "67586c61a0c49554ed0bb4a8", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 17510, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "67600929bd0a0549d70993f6", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5fe338e364adb27bb90594be", - "areaType": 21, - "requirements": [ - { - "areaType": 21, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5df8a72c86f77412640e2e83", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 4600, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5ed51652f6c34d2cc26336a1", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5fe3394e8a67d12f5f24c8e0", - "areaType": 21, - "requirements": [ - { - "areaType": 21, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5df8a72c86f77412640e2e83", - "count": 4, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 2100, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590c657e86f77412b013051d", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6002eec9cc73cd34ac64188a", - "areaType": 7, - "requirements": [ - { - "areaType": 7, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5c10c8fd86f7743d7d706df3", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5755356824597772cb798962", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b3a5d86f774252167ba22", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "type": "QuestComplete", - "questId": "60e71c11d54b755a3b53eb65" - } - ], - "productionTime": 4200, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5fca138c2a7b221b2852a5c6", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b6a50b71eeb7c4168c628", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5aa7e276e5b5b000171d0647", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af4a786f7746d3f3c3400", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af4d286f7746d4159f07a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af47786f7746d404f3aaa", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40407c86f774318526545a", - "type": "Tool" - }, - { - "templateId": "63a0b208f444d32d6f03ea1e", - "type": "Tool" - }, - { - "type": "QuestComplete", - "questId": "60e71b62a0beca400d69efc4" - } - ], - "productionTime": 3000, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5f60c74e3b85f6263c145586", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "661e6c26750e453380391f55", - "areaType": 11, - "requirements": [ - { - "areaType": 11, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "660bbc47c38b837877075e47", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "type": "QuestComplete" - } - ], - "productionTime": 600, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "660bc341c38b837877075e4c", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": true + ] }, { "_id": "5dde60e0e2c8f57eb6465327", "areaType": 10, + "continuous": false, + "count": 150, + "endProduct": "61962d879bb3d20b0946d385", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 7350, "requirements": [ { - "templateId": "5d6fc78386f77449d825f9dc", "count": 3, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", "type": "Item" }, { @@ -7655,60 +5922,80 @@ "type": "QuestComplete", "questId": "5c0bd94186f7747a727f09b2" } - ], - "productionTime": 7350, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "61962d879bb3d20b0946d385", - "continuous": false, - "count": 150, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "5dd3c5a67da3785e63275437", + "_id": "5df138986c38ba26da0b3a77", "areaType": 10, + "continuous": false, + "count": 4, + "endProduct": "5d1b309586f77425227d1676", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1320, "requirements": [ { - "templateId": "5d0379a886f77420407aa271", - "count": 1, - "isFunctional": false, + "count": 4, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5d1b304286f774253763a528", "type": "Item" }, { - "templateId": "590c5a7286f7747884343aea", + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "templateId": "590c2d8786f774245b1f03f3", + "type": "Tool" + } + ] + }, + { + "_id": "655b4bbe4343a16d2e047668", + "areaType": 10, + "continuous": false, + "count": 120, + "endProduct": "5e023e53d4353e3302577c4c", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5900, + "requirements": [ + { "count": 2, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", "type": "Item" }, { "areaType": 10, "requiredLevel": 2, "type": "Area" - }, - { - "templateId": "60391afc25aff57af81f7085", - "type": "Tool" } - ], - "productionTime": 6750, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d6fc87386f77449db3db94e", - "continuous": false, - "count": 3, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "5de951483c52683d810b4a10", + "_id": "655b505c32b0b1645e6f54c5", "areaType": 10, + "continuous": false, + "count": 150, + "endProduct": "5737218f245977612125ba51", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3300, "requirements": [ { "areaType": 10, @@ -7716,31 +6003,35 @@ "type": "Area" }, { - "templateId": "5734781f24597737e04bf32a", - "count": 1, - "isFunctional": false, + "count": 150, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "573720e02459776143012541", "type": "Item" }, { - "templateId": "5d63d33b86f7746ea9275524", - "type": "Tool" + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c06779c86f77426e00dd782", + "type": "Item" } - ], - "productionTime": 1980, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590a3b0486f7743954552bdb", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "5dea63e21ecdbf7668030f24", + "_id": "61dc03711bdcfa2f253c9b7c", "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "5e2aedd986f7746d404f3aa4", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 18000, "requirements": [ { "areaType": 10, @@ -7748,31 +6039,47 @@ "type": "Area" }, { - "templateId": "5d03794386f77420415576f5", - "count": 1, - "isFunctional": false, + "count": 3, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5909e99886f7740c983b9984", "type": "Item" }, { - "templateId": "619cbfccbedcde2f5b3f7bdd", + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590a358486f77429692b2790", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5af0561e86f7745f5f3ad6ac", + "type": "Item" + }, + { + "templateId": "5d1b31ce86f7742523398394", "type": "Tool" } - ], - "productionTime": 10000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5733279d245977289b77ec24", - "continuous": false, - "count": 5, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "5f245f875b664e084523a4ce", + "_id": "629e19eddb6e1a02066676f1", "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "5910968f86f77425cf569c32", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 50400, "requirements": [ { "areaType": 10, @@ -7780,107 +6087,307 @@ "type": "Area" }, { - "templateId": "5c0d668f86f7747ccb7f13b2", - "count": 50, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5656d7c34bdc2d9d198b4587", - "count": 50, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c5a7286f7747884343aea", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "590c2e1186f77425357b6124", "type": "Item" }, { - "templateId": "590c2b4386f77425357b6123", + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "544fb5454bdc2df8738b456a", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5bc9b355d4351e6d1509862a", + "type": "Item" + }, + { + "count": 10, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1c819a86f774771b0acd6c", + "type": "Item" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5734795124597738002c6176", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "62a0a0bb621468534a797ad5", + "type": "Item" + } + ] + }, + { + "_id": "655b6a50b71eeb7c4168c628", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5f60c74e3b85f6263c145586", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3000, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5aa7e276e5b5b000171d0647", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4a786f7746d3f3c3400", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4d286f7746d4159f07a", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af47786f7746d404f3aaa", + "type": "Item" + }, + { + "templateId": "5d40407c86f774318526545a", + "type": "Tool" + }, + { + "templateId": "63a0b208f444d32d6f03ea1e", "type": "Tool" }, { "type": "QuestComplete", - "questId": "5bc47dbf86f7741ee74e93b9" + "questId": "60e71b62a0beca400d69efc4" } - ], - "productionTime": 8470, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5f0596629e22f464da6bbdd9", - "continuous": false, - "count": 100, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "5eda0ad40699b81bb9142aae", - "areaType": 11, + "_id": "5d78f27d115f693ad750d2c6", + "areaType": 10, + "continuous": false, + "count": 6, + "endProduct": "5448be9a4bdc2dfd2f8b456a", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 18300, "requirements": [ { - "areaType": 11, + "areaType": 10, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "60391b0fb847c71012789415", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af51086f7746d3f3c3402", + "type": "Item" + } + ] + }, + { + "_id": "5de95c91225b0a76ca0ea0b7", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "5d1b2fa286f77425227d1674", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4800, + "requirements": [ + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e35de086f7741778269d84", + "type": "Item" + }, + { + "areaType": 10, "requiredLevel": 2, "type": "Area" }, { - "templateId": "57347baf24597738002c6178", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c392f86f77444754deb29", "count": 2, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5734795124597738002c6176", "type": "Item" }, { - "templateId": "56742c324bdc2d150f8b456d", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c2e1186f77425357b6124", + "templateId": "5d63d33b86f7746ea9275524", "type": "Tool" }, { - "templateId": "6389c8fb46b54c634724d847", + "templateId": "590c2d8786f774245b1f03f3", "type": "Tool" - }, - { - "type": "QuestComplete", - "questId": "63966fe7ea74a47c2d3fc0e6" } - ], - "productionTime": 225000, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5c05300686f7746dce784e5d", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "5ede0053879619077751cff1", + "_id": "5e6cfc53a3e6886b9e6c39a8", "areaType": 7, + "continuous": false, + "count": 5, + "endProduct": "5c0e531286f7747fa54205c2", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4990, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 7, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b3a5d86f774252167ba22", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e3606886f77417674759a5", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c0e530286f7747fa1419862", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "544fb3f34bdc2d03748b456a", + "type": "Item" + } + ] + }, + { + "_id": "5d8a13fc2d9612419804003c", + "areaType": 8, + "continuous": false, + "count": 2, + "endProduct": "590c5d4b86f774784e1b9c45", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2900, + "requirements": [ + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5448ff904bdc2d6f028b456e", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347d7224597744596b4e72", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347d8724597744596b4e76", + "type": "Item" + }, + { + "areaType": 8, + "requiredLevel": 1, + "type": "Area" + } + ] + }, + { + "_id": "5d8f614c9ea122564c316462", + "areaType": 7, + "continuous": false, + "count": 7, + "endProduct": "5c0e530286f7747fa1419862", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 6900, "requirements": [ { "areaType": 7, @@ -7888,51 +6395,43 @@ "type": "Area" }, { - "templateId": "5d1b3a5d86f774252167ba22", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "619cc01e0a7c3a1a2731940c", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5af0548586f7743a532b7e99", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5751a89d24597722aa0e8db0", "type": "Item" }, { - "templateId": "544fb3364bdc2d34748b456a", "count": 2, - "isFunctional": false, "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d02797c86f774203f38e30a", - "count": 1, "isFunctional": false, - "isEncoded": false, "isSpawnedInSession": false, + "templateId": "5d1b3a5d86f774252167ba22", "type": "Item" } - ], - "productionTime": 4600, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d02797c86f774203f38e30a", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "61c226d91b8c294cd411c881", + "_id": "5de021b30f6d581e965bcde7", "areaType": 10, + "continuous": false, + "count": 2, + "endProduct": "5d1c819a86f774771b0acd6c", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4700, "requirements": [ { "areaType": 10, @@ -7940,55 +6439,31 @@ "type": "Area" }, { - "templateId": "5672cb124bdc2d1a0f8b4568", - "count": 4, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5672cb724bdc2dc2088b456b", "count": 1, - "isFunctional": false, "isEncoded": false, + "isFunctional": true, "isSpawnedInSession": false, + "templateId": "59e6687d86f77411d949b251", "type": "Item" }, { - "templateId": "590a391c86f774385a33c404", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c06779c86f77426e00dd782", - "count": 4, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5af04b6486f774195a3ebb49", + "templateId": "544fb5454bdc2df8738b456a", "type": "Tool" } - ], - "productionTime": 61300, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "590a3efd86f77437d351a25b", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "62a112fec1cce91d2c46a06e", + "_id": "5ed9ff023a68ec264e5233c2", "areaType": 11, + "continuous": false, + "count": 1, + "endProduct": "5c05308086f7746b2101e90b", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 135399, "requirements": [ { "areaType": 11, @@ -7996,559 +6471,443 @@ "type": "Area" }, { - "templateId": "5a8036fb86f77407252ddc02", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "574eb85c245977648157eec3", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5900b89686f7744e704a8747", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5a80a29286f7742b25692012", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5798a2832459774b53341029", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5be4038986f774527d3fae60", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c621186f774138d11ea29", "count": 2, - "isFunctional": false, "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 43200, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "62a0a124de7ac81993580542", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b4a73975a7f3c734661a5", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "619cbfccbedcde2f5b3f7bdd", - "type": "Tool" - }, - { - "templateId": "59e35de086f7741778269d84", - "type": "Tool" - }, - { - "templateId": "64b7af434b75259c590fa893", - "count": 90, "isFunctional": false, - "isEncoded": false, "isSpawnedInSession": false, + "templateId": "5d0376a486f7747d8050965c", "type": "Item" }, { - "templateId": "5d6fc78386f77449d825f9dc", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5751496424597720a27126da", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "type": "QuestComplete", - "questId": "60e71bb4e456d449cd47ca75" - } - ], - "productionTime": 9400, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "59e0d99486f7744a32234762", - "continuous": false, - "count": 90, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b5af31273611d2462ab76", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5d6fc78386f77449d825f9dc", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "560d5e524bdc2d25448b4571", - "count": 50, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c5c9f86f77477c91c36e7", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b317c86f7742523398392", - "type": "Tool" - }, - { - "type": "QuestComplete", - "questId": "6179ad0a6e9dd54ac275e3f2" - } - ], - "productionTime": 8400, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5d6e68a8a4b9360b6c0d54e2", - "continuous": false, - "count": 50, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5e0755b97f8ea74cc332bf78", - "areaType": 21, - "requirements": [ - { - "areaType": 21, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5df8a6a186f77412640e2e80", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 5210, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "6680304edadb7aa61d00cef0", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b63ac9db22d43ab42b70a", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5e2af41e86f774755a234b67", "count": 2, - "isFunctional": false, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "573477e124597737dd42e191", "type": "Item" }, { - "templateId": "5e2af4d286f7746d4159f07a", - "count": 3, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af4a786f7746d3f3c3400", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "61bf83814088ec1a363d7097", - "type": "Tool" - }, - { - "templateId": "590c2e1186f77425357b6124", - "type": "Tool" - }, - { - "type": "QuestComplete", - "questId": "5b47876e86f7744d1c353205" - }, - { - "templateId": "656f9fa0498d1b7e3e071d98", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 9000, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5d5d87f786f77427997cfaef", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5d5c1f25d582a5479d4ec458", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "56dff3afd2720bba668b4567", - "count": 180, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c5a7286f7747884343aea", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40425986f7743185265461", - "type": "Tool" - }, - { - "type": "QuestComplete", - "questId": "59c512ad86f7741f0d09de9b" - } - ], - "productionTime": 8500, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "56dff2ced2720bb4668b4567", - "continuous": false, - "count": 180, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "5dc1f634ee5f2440a9272dc7", - "areaType": 8, - "requirements": [ - { - "areaType": 8, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "5d1b376e86f774252519444e", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5448fee04bdc2dbc018b4567", "count": 5, - "isFunctional": false, "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 5750, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5d40407c86f774318526545a", - "continuous": false, - "count": 10, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "603ce7c5fd70f047f93bee2a", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5ea05cf85ad9772e6624305d", - "count": 1, "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "57347c1124597737fb1379e3", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af4d286f7746d4159f07a", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "61bf83814088ec1a363d7097", - "type": "Tool" - } - ], - "productionTime": 2890, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5aa7cfc0e5b5b00015693143", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "62a11415c30cfa1d366aeb83", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "59faf98186f774067b6be103", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "62a09ee4cf4a99369e262453", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "635a758bfefc88a93f021b8a", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 3000, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5c13cd2486f774072c757944", - "continuous": false, - "count": 6, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "600aa0d1090cb6338027028c", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5ab8e4ed86f7742d8e50c7fa", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d40419286f774318526545f", - "type": "Tool" - } - ], - "productionTime": 3200, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "5af0454c86f7746bf20992e8", - "continuous": false, - "count": 2, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "63a2abbb31772a61500d5336", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 1, - "type": "Area" - }, - { - "templateId": "5ac4c50d5acfc40019262e87", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 1500, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "59e366c186f7741778269d85", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b4489065b076eb02c4b45", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "54527a984bdc2d4e668b4567", - "count": 180, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "590c5a7286f7747884343aea", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d6fc78386f77449d825f9dc", - "count": 1, - "isFunctional": false, - "isEncoded": false, "isSpawnedInSession": false, + "templateId": "5c06782b86f77426df5407d2", "type": "Item" }, { "templateId": "544fb5454bdc2df8738b456a", "type": "Tool" }, + { + "templateId": "6389c92d52123d5dd17f8876", + "type": "Tool" + }, { "type": "QuestComplete", - "questId": "639135534b15ca31f76bc317" + "questId": "63966faeea19ac7ed845db2c" } - ], - "productionTime": 8400, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "54527ac44bdc2d36668b4567", + ] + }, + { + "_id": "5eda072cf6626f08ef0efed4", + "areaType": 2, "continuous": false, - "count": 120, - "productionLimitCount": 0, + "count": 1, + "endProduct": "59e7635f86f7742cbf2c1095", + "isCodeProduction": false, "isEncoded": false, - "isCodeProduction": false + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3250, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4d286f7746d4159f07a", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4a786f7746d3f3c3400", + "type": "Item" + } + ] + }, + { + "_id": "5eecaa6327ccd70521107ff5", + "areaType": 2, + "continuous": false, + "count": 2, + "endProduct": "5e2af4a786f7746d3f3c3400", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2200, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "572b7adb24597762ae139821", + "type": "Item" + }, + { + "templateId": "61bf83814088ec1a363d7097", + "type": "Tool" + } + ] + }, + { + "_id": "600a9b10adfcb94fee6d3e06", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "57347cd0245977445a2d6ff1", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3400, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c31c586f774245e3141b2", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e36c6f86f774176c10a2a7", + "type": "Item" + } + ] + }, + { + "_id": "600a9fb7ba91d953182d6a1c", + "areaType": 10, + "continuous": false, + "count": 2, + "endProduct": "5d0379a886f77420407aa271", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 39000, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc87386f77449db3db94e", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "60391b0fb847c71012789415", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "60391a8b3364dc22b04d0ce5", + "type": "Item" + }, + { + "templateId": "5af04b6486f774195a3ebb49", + "type": "Tool" + } + ] + }, + { + "_id": "5ffcacbf24fa2e741e767234", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "5672cb724bdc2dc2088b456b", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5500, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590a3efd86f77437d351a25b", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c06779c86f77426e00dd782", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c06782b86f77426df5407d2", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5672cb124bdc2d1a0f8b4568", + "type": "Item" + }, + { + "templateId": "590c2e1186f77425357b6124", + "type": "Tool" + } + ] + }, + { + "_id": "6002e8fb41d38607bc4198ab", + "areaType": 11, + "continuous": false, + "count": 1, + "endProduct": "5e42c81886f7742a01529f57", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 236000, + "requirements": [ + { + "areaType": 11, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c621186f774138d11ea29", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e42c83786f7742a021fdf3c", + "type": "Item" + }, + { + "templateId": "5c052fb986f7746b2101e909", + "type": "Tool" + }, + { + "templateId": "5c05300686f7746dce784e5d", + "type": "Tool" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "61bf7c024770ee6f9c6b8b53", + "type": "Item" + } + ] + }, + { + "_id": "600a9bd0189b226f40059751", + "areaType": 10, + "continuous": false, + "count": 7, + "endProduct": "5e85a9f4add9fe03027d9bf1", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 16500, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", + "type": "Item" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af37686f774755a234b65", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5a0c27731526d80618476ac4", + "type": "Item" + }, + { + "templateId": "590c2e1186f77425357b6124", + "type": "Tool" + }, + { + "templateId": "544fb5454bdc2df8738b456a", + "type": "Tool" + } + ] + }, + { + "_id": "62a115db5c6bbf22c15ac19d", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "5d1b31ce86f7742523398394", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 900, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "templateId": "62a0a0bb621468534a797ad5", + "type": "Tool" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c2b4386f77425357b6123", + "type": "Item" + } + ] + }, + { + "_id": "5fe3394e8a67d12f5f24c8e0", + "areaType": 21, + "continuous": false, + "count": 2, + "endProduct": "590c657e86f77412b013051d", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2100, + "requirements": [ + { + "areaType": 21, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 4, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a72c86f77412640e2e83", + "type": "Item" + } + ] }, { "_id": "63a3359eaf870e651d58e61a", "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "55d485be4bdc2d962f8b456f", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1200, "requirements": [ { "areaType": 10, @@ -8564,199 +6923,43 @@ "type": "Tool" }, { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, "templateId": "5ea034f65aad6446a939737e", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" }, { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, "templateId": "5448c12b4bdc2d02308b456f", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" }, { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, "templateId": "5e2af22086f7746d3f3c33fa", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, "type": "Item" } - ], - "productionTime": 1200, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "55d485be4bdc2d962f8b456f", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false + ] }, { - "_id": "64b6b5c1c3abf20a9660daad", - "areaType": 7, - "requirements": [ - { - "type": "QuestComplete", - "questId": "60e71c48c1bfa3050473b8e5" - }, - { - "areaType": 7, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d1b3a5d86f774252167ba22", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5d1b3f2d86f774253763b735", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5c0e530286f7747fa1419862", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e8f3423fd7471236e6e3b64", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 4800, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5c0e534186f7747fa1419867", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "6666d899eb78191c502350b2", - "areaType": 10, - "requirements": [ - { - "areaType": 10, - "requiredLevel": 2, - "type": "Area" - }, - { - "templateId": "5d1b317c86f7742523398392", - "type": "Tool" - }, - { - "templateId": "5d4042a986f7743185265463", - "type": "Tool" - }, - { - "templateId": "5af04b6486f774195a3ebb49", - "type": "Tool" - }, - { - "templateId": "66571bf06a723f7f005a0619", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 300, - "needFuelForAllProductionTime": false, - "locked": false, - "endProduct": "665730fa4de4820934746c48", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "655b650ab71eeb7c4168c627", - "areaType": 2, - "requirements": [ - { - "areaType": 2, - "requiredLevel": 3, - "type": "Area" - }, - { - "templateId": "59e3556c86f7741776641ac2", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af4d286f7746d4159f07a", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "5e2af41e86f774755a234b67", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - }, - { - "templateId": "61bf83814088ec1a363d7097", - "type": "Tool" - }, - { - "templateId": "591094e086f7747caa7bb2ef", - "type": "Tool" - }, - { - "templateId": "656f611f94b480b8a500c0db", - "count": 2, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 10000, - "needFuelForAllProductionTime": false, - "locked": true, - "endProduct": "5ab8e79e86f7742d8b372e78", - "continuous": false, - "count": 1, - "productionLimitCount": 0, - "isEncoded": false, - "isCodeProduction": false - }, - { - "_id": "658976555aa97f488d096ca7", + "_id": "5e075ac73c392e0367260489", "areaType": 21, + "continuous": false, + "count": 1, + "endProduct": "67600929bd0a0549d70993f6", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 17510, "requirements": [ { "areaType": 21, @@ -8764,170 +6967,2082 @@ "type": "Area" }, { - "templateId": "5df8a72c86f77412640e2e83", - "count": 8, - "isFunctional": false, + "count": 13, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5df8a77486f77412672a1e3f", + "type": "Item" + }, + { + "count": 20, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a72c86f77412640e2e83", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "67586c61a0c49554ed0bb4a8", "type": "Item" } - ], - "productionTime": 10400, - "needFuelForAllProductionTime": false, + ] + }, + { + "_id": "5dd3c5a67da3785e63275437", + "areaType": 10, + "continuous": false, + "count": 3, + "endProduct": "5d6fc87386f77449db3db94e", + "isCodeProduction": false, + "isEncoded": false, "locked": false, - "endProduct": "66b6296d7994640992013b17", + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 6750, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d0379a886f77420407aa271", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + }, + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "templateId": "60391afc25aff57af81f7085", + "type": "Tool" + } + ] + }, + { + "_id": "619eb0eb56579138ec08fed8", + "areaType": 7, "continuous": false, "count": 1, - "productionLimitCount": 0, + "endProduct": "5d02778e86f774203e7dedbe", + "isCodeProduction": false, "isEncoded": false, - "isCodeProduction": false + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2950, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "619cc01e0a7c3a1a2731940c", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c661e86f7741e566b646a", + "type": "Item" + } + ] + }, + { + "_id": "655b56eb32b0b1645e6f54c8", + "areaType": 10, + "continuous": false, + "count": 150, + "endProduct": "5a26abfac4a28232980eabff", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5400, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + } + ] + }, + { + "_id": "62a1123ac30cfa1d366aeb82", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "57f4c844245977379d5c14d1", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1800, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": true, + "isSpawnedInSession": false, + "templateId": "57d14d2524597714373db789", + "type": "Item" + }, + { + "templateId": "62a0a0bb621468534a797ad5", + "type": "Tool" + } + ] + }, + { + "_id": "63a571802116d261d2336cd1", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "63a0b2eabea67a6d93009e52", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5400, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "6389c70ca33d8c4cdf4932c6", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c052f6886f7746b1e3db148", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590a3efd86f77437d351a25b", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "56742c324bdc2d150f8b456d", + "type": "Item" + }, + { + "templateId": "590c2d8786f774245b1f03f3", + "type": "Tool" + }, + { + "templateId": "5af04b6486f774195a3ebb49", + "type": "Tool" + }, + { + "type": "QuestComplete", + "questId": "625d6ffaf7308432be1d44c5" + } + ] + }, + { + "_id": "676a9fe717262755cf0ff52f", + "areaType": 21, + "continuous": false, + "count": 4, + "endProduct": "67586bee39b1b82b0d0f9d06", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 16000, + "requirements": [ + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d40407c86f774318526545a", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d403f9186f7743cac3f229b", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "67586c61a0c49554ed0bb4a8", + "type": "Item" + }, + { + "areaType": 21, + "requiredLevel": 1, + "type": "Area" + } + ] + }, + { + "_id": "5dc1f4d9e078d303d91b44c7", + "areaType": 8, + "continuous": false, + "count": 8, + "endProduct": "5448fee04bdc2dbc018b4567", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 6650, + "requirements": [ + { + "areaType": 8, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b33a686f7742523398398", + "type": "Item" + }, + { + "templateId": "5d1b39a386f774252339976f", + "type": "Tool" + } + ] + }, + { + "_id": "5dc1f634ee5f2440a9272dc7", + "areaType": 8, + "continuous": false, + "count": 10, + "endProduct": "5d40407c86f774318526545a", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5750, + "requirements": [ + { + "areaType": 8, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b376e86f774252519444e", + "type": "Item" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5448fee04bdc2dbc018b4567", + "type": "Item" + } + ] + }, + { + "_id": "5dd11303b78bb413d5133f79", + "areaType": 10, + "continuous": false, + "count": 6, + "endProduct": "5c06782b86f77426df5407d2", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 7450, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347c2e24597744902c94a1", + "type": "Item" + }, + { + "templateId": "590c2d8786f774245b1f03f3", + "type": "Tool" + } + ] + }, + { + "_id": "600ab813d19f85018a7489c4", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5d1b385e86f774252167b98a", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 8000, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 4, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c595c86f7747884343ad7", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "577e1c9d2459773cd707c525", + "type": "Item" + }, + { + "templateId": "5d40419286f774318526545f", + "type": "Tool" + } + ] + }, + { + "_id": "5de919ec1b25d85cf30ca39a", + "areaType": 10, + "continuous": false, + "count": 2, + "endProduct": "5d6fc78386f77449d825f9dc", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5870, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "58d3db5386f77426186285a0", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "617aa4dd8166f034d57de9c5", + "type": "Item" + }, + { + "templateId": "590c2d8786f774245b1f03f3", + "type": "Tool" + } + ] + }, + { + "_id": "5de95f1c9517b140195ab717", + "areaType": 10, + "continuous": false, + "count": 2, + "endProduct": "590a358486f77429692b2790", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4400, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5af0561e86f7745f5f3ad6ac", + "type": "Item" + }, + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "templateId": "5d63d33b86f7746ea9275524", + "type": "Tool" + } + ] + }, + { + "_id": "5df8ffcbaab5f257bd7ff3a8", + "areaType": 2, + "continuous": false, + "count": 2, + "endProduct": "590c5bbd86f774785762df04", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 9000, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5c9f86f77477c91c36e7", + "type": "Item" + }, + { + "templateId": "5d40419286f774318526545f", + "type": "Tool" + } + ] + }, + { + "_id": "5ede1e0b7690fa313b632e88", + "areaType": 8, + "continuous": false, + "count": 2, + "endProduct": "57347d7224597744596b4e72", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4710, + "requirements": [ + { + "areaType": 8, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347da92459774491567cf5", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347d8724597744596b4e76", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347d3d245977448f7b7f61", + "type": "Item" + } + ] + }, + { + "_id": "6002e68bca41c53bee18813b", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5e2af29386f7746d4159f077", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4800, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347c1124597737fb1379e3", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5734795124597738002c6176", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e358a886f7741776641ac3", + "type": "Item" + }, + { + "templateId": "56742c284bdc2d98058b456d", + "type": "Tool" + } + ] + }, + { + "_id": "61b9da93e7304721fe66ab53", + "areaType": 21, + "continuous": false, + "count": 1, + "endProduct": "637b620db7afa97bfc3d7009", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 10400, + "requirements": [ + { + "areaType": 21, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a72c86f77412640e2e83", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a77486f77412672a1e3f", + "type": "Item" + } + ] + }, + { + "_id": "600a9955ba91d953182d69f0", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "59d6088586f774275f37482f", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5100, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": true, + "isSpawnedInSession": false, + "templateId": "59e6152586f77473dc057aa1", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59d64fc686f774171b243fe2", + "type": "Item" + }, + { + "templateId": "544fb5454bdc2df8738b456a", + "type": "Tool" + }, + { + "templateId": "62a0a0bb621468534a797ad5", + "type": "Tool" + } + ] + }, + { + "_id": "62a11354b552772a0c4ba09e", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "60391a8b3364dc22b04d0ce5", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 10000, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5780cf722459777a5108b9a1", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "61bf7b6302b3924be92fa8c3", + "type": "Item" + }, + { + "templateId": "62a0a0bb621468534a797ad5", + "type": "Tool" + }, + { + "templateId": "5d40419286f774318526545f", + "type": "Tool" + } + ] + }, + { + "_id": "619e45ea98398d3b104e8419", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "619cbfeb6b8a1b37a54eebfa", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 25000, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c2e1186f77425357b6124", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5bbd86f774785762df04", + "type": "Item" + }, + { + "templateId": "5d40425986f7743185265461", + "type": "Tool" + }, + { + "templateId": "5af04b6486f774195a3ebb49", + "type": "Tool" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "61bf7b6302b3924be92fa8c3", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d4042a986f7743185265463", + "type": "Item" + } + ] + }, + { + "_id": "655b598db71eeb7c4168c626", + "areaType": 10, + "continuous": false, + "count": 60, + "endProduct": "5d6e6911a4b9361bd5780d52", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3000, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c31c586f774245e3141b2", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", + "type": "Item" + }, + { + "templateId": "63a0b208f444d32d6f03ea1e", + "type": "Tool" + }, + { + "type": "QuestComplete", + "questId": "5c0bc91486f7746ab41857a2" + } + ] + }, + { + "_id": "655b33429db22d43ab42b704", + "areaType": 10, + "continuous": false, + "count": 120, + "endProduct": "56dfef82d2720bbd668b4567", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 13000, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 180, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "56dff3afd2720bba668b4567", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", + "type": "Item" + }, + { + "templateId": "590c2e1186f77425357b6124", + "type": "Tool" + }, + { + "type": "QuestComplete", + "questId": "64e7b9bffd30422ed03dad38" + } + ] + }, + { + "_id": "655b6b641273611d2462ab78", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "56e335e4d2720b6c058b456d", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1200, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af41e86f774755a234b67", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5734795124597738002c6176", + "type": "Item" + } + ] + }, + { + "_id": "66509e8c9398c9c9e10a31bb", + "areaType": 7, + "continuous": false, + "count": 1, + "endProduct": "66507eabf5ddb0818b085b68", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4800, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c10c8fd86f7743d7d706df3", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "62a0a043cf4a99369e2624a5", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "619cc01e0a7c3a1a2731940c", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e3606886f77417674759a5", + "type": "Item" + }, + { + "gameVersions": [ + "edge_of_darkness", + "eod_tue_edition" + ], + "type": "GameVersion" + } + ] + }, + { + "_id": "6671d4fef3bee343f5000703", + "areaType": 7, + "continuous": false, + "count": 1, + "endProduct": "66507eabf5ddb0818b085b68", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 4800, + "requirements": [ + { + "areaType": 7, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c10c8fd86f7743d7d706df3", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "62a0a043cf4a99369e2624a5", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "619cc01e0a7c3a1a2731940c", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e3606886f77417674759a5", + "type": "Item" + }, + { + "type": "QuestComplete", + "questId": "665eeca92f7aedcc900b0437" + } + ] + }, + { + "_id": "657fc79cfd86b9d9680c4a24", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "656efd66034e8e01c407f35c", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1600, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "657b22485f444d6dff0c6c2f", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af22086f7746d3f3c33fa", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347c1124597737fb1379e3", + "type": "Item" + }, + { + "templateId": "63a0b208f444d32d6f03ea1e", + "type": "Tool" + }, + { + "templateId": "59e35de086f7741778269d84", + "type": "Tool" + } + ] + }, + { + "_id": "658975e25c4f0642a502d54e", + "areaType": 21, + "continuous": false, + "count": 1, + "endProduct": "668fe5a998b5ad715703ddd6", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 5950, + "requirements": [ + { + "areaType": 21, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a77486f77412672a1e3f", + "type": "Item" + } + ] + }, + { + "_id": "5eda04a30699b81bb9142aa2", + "areaType": 2, + "continuous": false, + "count": 6, + "endProduct": "544fb25a4bdc2dfb738b4567", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1900, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af47786f7746d404f3aaa", + "type": "Item" + }, + { + "areaType": 2, + "requiredLevel": 1, + "type": "Area" + } + ] + }, + { + "_id": "5f241246232409155b66b809", + "areaType": 8, + "continuous": false, + "count": 20, + "endProduct": "5751496424597720a27126da", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 43200, + "requirements": [ + { + "areaType": 8, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b33a686f7742523398398", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e3577886f774176a362503", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5af0484c86f7740f02001f7f", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5bc9be8fd4351e00334cae6e", + "type": "Item" + }, + { + "templateId": "5d1b385e86f774252167b98a", + "type": "Tool" + }, + { + "templateId": "62a09e73af34e73a266d932a", + "type": "Tool" + } + ] + }, + { + "_id": "5e0758f99694354c4d2bfd47", + "areaType": 21, + "continuous": false, + "count": 1, + "endProduct": "651450ce0e00edc794068371", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 6200, + "requirements": [ + { + "areaType": 21, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5df8a77486f77412672a1e3f", + "type": "Item" + } + ] + }, + { + "_id": "66582be04de4820934746cea", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "66582972ac60f009f270d2aa", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 300, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "templateId": "5c07df7f0db834001b73588a", + "type": "Tool" + }, + { + "templateId": "544fb5454bdc2df8738b456a", + "type": "Tool" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "665828c44de4820934746ce4", + "type": "Item" + } + ] + }, + { + "_id": "655b5ebc32b0b1645e6f54c9", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5c0e57ba86f7747fa141986d", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 7000, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "656f603f94b480b8a500c0d6", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af41e86f774755a234b67", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e3556c86f7741776641ac2", + "type": "Item" + }, + { + "type": "QuestComplete", + "questId": "5ae4495086f77443c122bc40" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4d286f7746d4159f07a", + "type": "Item" + } + ] + }, + { + "_id": "655b6bc01f2b6843ec751fd7", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5f5e467b0bc58666c37e7821", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2500, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4a786f7746d3f3c3400", + "type": "Item" + }, + { + "areaType": 2, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af41e86f774755a234b67", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af47786f7746d404f3aaa", + "type": "Item" + }, + { + "templateId": "61bf83814088ec1a363d7097", + "type": "Tool" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e3556c86f7741776641ac2", + "type": "Item" + } + ] + }, + { + "_id": "655b6c381fe356507267b2f6", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "59e763f286f7742ee57895da", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2500, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c2c9c86f774245b1f03f2", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5f5e45cc5021ce62144be7aa", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5734795124597738002c6176", + "type": "Item" + }, + { + "templateId": "61bf83814088ec1a363d7097", + "type": "Tool" + } + ] + }, + { + "_id": "5eeca9bad874f914d2536585", + "areaType": 2, + "continuous": false, + "count": 1, + "endProduct": "5b7c710788a4506dec015957", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 18000, + "requirements": [ + { + "areaType": 2, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c127c4486f7745625356c13", + "type": "Item" + }, + { + "count": 6, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347c5b245977448d35f6e1", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af29386f7746d4159f077", + "type": "Item" + }, + { + "count": 5, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "61bf7b6302b3924be92fa8c3", + "type": "Item" + }, + { + "templateId": "5d40419286f774318526545f", + "type": "Tool" + } + ] + }, + { + "_id": "5d93b91286f77467310ca15d", + "areaType": 2, + "continuous": false, + "count": 2, + "endProduct": "5c13cef886f774072e618e82", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1560, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "577e1c9d2459773cd707c525", + "type": "Item" + }, + { + "areaType": 2, + "requiredLevel": 1, + "type": "Area" + } + ] + }, + { + "_id": "5dd3c9c8449c0c31795b0f0b", + "areaType": 10, + "continuous": false, + "count": 3, + "endProduct": "5d6fc87386f77449db3db94e", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 2150, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc78386f77449d825f9dc", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "57347b8b24597737dd42e192", + "type": "Item" + }, + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + } + ] + }, + { + "_id": "5df914a53ce0f648b833bb37", + "areaType": 11, + "continuous": false, + "count": 3, + "endProduct": "590c621186f774138d11ea29", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 123200, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "56742c324bdc2d150f8b456d", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c1265fc86f7743f896a21c2", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c392f86f77444754deb29", + "type": "Item" + }, + { + "areaType": 11, + "requiredLevel": 2, + "type": "Area" + } + ] + }, + { + "_id": "5eeca812c4c989140245ae0c", + "areaType": 11, + "continuous": false, + "count": 1, + "endProduct": "57347ca924597744596b4e71", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 349000, + "requirements": [ + { + "areaType": 11, + "requiredLevel": 3, + "type": "Area" + }, + { + "count": 10, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590a3b0486f7743954552bdb", + "type": "Item" + }, + { + "count": 10, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "573477e124597737dd42e191", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5734779624597737e04bf329", + "type": "Item" + }, + { + "count": 3, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c05300686f7746dce784e5d", + "type": "Item" + }, + { + "templateId": "60391afc25aff57af81f7085", + "type": "Tool" + }, + { + "templateId": "590c639286f774151567fa95", + "type": "Tool" + } + ] + }, + { + "_id": "655b457c9db22d43ab42b706", + "areaType": 10, + "continuous": false, + "count": 120, + "endProduct": "619636be6db0f2477964e710", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 6800, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 120, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "59e68f6f86f7746c9f75e846", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590a373286f774287540368b", + "type": "Item" + }, + { + "templateId": "5e2af37686f774755a234b65", + "type": "Tool" + }, + { + "type": "QuestComplete", + "questId": "5a27bb8386f7741c770d2d0a" + } + ] + }, + { + "_id": "655b54e7065b076eb02c4b47", + "areaType": 10, + "continuous": false, + "count": 150, + "endProduct": "5cc80f53e4a949000e1ea4f8", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 3400, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c5a7286f7747884343aea", + "type": "Item" + }, + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d6fc87386f77449db3db94e", + "type": "Item" + }, + { + "templateId": "544fb5454bdc2df8738b456a", + "type": "Tool" + } + ] + }, + { + "_id": "62a116282c5e0c325b62d5ec", + "areaType": 11, + "continuous": false, + "count": 1, + "endProduct": "62a0a16d0b9d3c46de5b6e97", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 36000, + "requirements": [ + { + "areaType": 11, + "requiredLevel": 3, + "type": "Area" + }, + { + "templateId": "5c05308086f7746b2101e90b", + "type": "Tool" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c621186f774138d11ea29", + "type": "Item" + }, + { + "count": 2, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "62a0a124de7ac81993580542", + "type": "Item" + } + ] + }, + { + "_id": "6745925da9c9adf0450d5bca", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "674098588466ebb03408b210", + "isCodeProduction": false, + "isEncoded": false, + "locked": true, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 10, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "67409848d0b2f8eb9b034db9", + "type": "Item" + }, + { + "templateId": "544fb5454bdc2df8738b456a", + "type": "Tool" + }, + { + "type": "QuestComplete" + } + ] + }, + { + "_id": "677d4db74ac9193862043ee9", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "590c2e1186f77425357b6124", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 462, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c2b4386f77425357b6123", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c2d8786f774245b1f03f3", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c311186f77424d1667482", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5734795124597738002c6176", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "590c2c9c86f774245b1f03f2", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5e2af4a786f7746d3f3c3400", + "type": "Item" + }, + { + "areaType": 10, + "requiredLevel": 1, + "type": "Area" + } + ] + }, + { + "_id": "677d4fdb42cdfce74006f961", + "areaType": 10, + "continuous": false, + "count": 1, + "endProduct": "5d1b304286f774253763a528", + "isCodeProduction": false, + "isEncoded": false, + "locked": false, + "needFuelForAllProductionTime": false, + "productionLimitCount": 0, + "productionTime": 1887, + "requirements": [ + { + "areaType": 10, + "requiredLevel": 2, + "type": "Area" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b309586f77425227d1676", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c06782b86f77426df5407d2", + "type": "Item" + }, + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "6389c70ca33d8c4cdf4932c6", + "type": "Item" + }, + { + "templateId": "590c2e1186f77425357b6124", + "type": "Tool" + } + ] } ], "scavRecipes": [ { "_id": "62710974e71632321e5afd5f", - "requirements": [ - { - "templateId": "5449016a4bdc2d6f028b456f", - "count": 2500, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" + "endProducts": { + "Common": { + "max": 2, + "min": 1 + }, + "Rare": { + "max": 1, + "min": 0 + }, + "Superrare": { + "max": 0, + "min": 0 } - ], + }, "productionTime": 2500, - "endProducts": { - "Common": { - "min": 1, - "max": 2 - }, - "Rare": { - "min": 0, - "max": 1 - }, - "Superrare": { - "min": 0, - "max": 0 - } - } - }, - { - "_id": "6271093e621b0a76055cd61e", "requirements": [ { - "templateId": "5d1b376e86f774252519444e", - "count": 1, - "isFunctional": false, + "count": 2500, "isEncoded": false, + "isFunctional": false, "isSpawnedInSession": false, + "templateId": "5449016a4bdc2d6f028b456f", "type": "Item" } - ], - "productionTime": 16800, - "endProducts": { - "Common": { - "min": 0, - "max": 0 - }, - "Rare": { - "min": 1, - "max": 1 - }, - "Superrare": { - "min": 3, - "max": 5 - } - } + ] }, { "_id": "62710a8c403346379e3de9be", - "requirements": [ - { - "templateId": "5449016a4bdc2d6f028b456f", - "count": 15000, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 7700, "endProducts": { "Common": { - "min": 1, - "max": 1 + "max": 1, + "min": 1 }, "Rare": { - "min": 1, - "max": 3 + "max": 3, + "min": 1 }, "Superrare": { - "min": 0, - "max": 0 + "max": 0, + "min": 0 } - } + }, + "productionTime": 7700, + "requirements": [ + { + "count": 15000, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5449016a4bdc2d6f028b456f", + "type": "Item" + } + ] }, { - "_id": "62710a69adfbd4354d79c58e", - "requirements": [ - { - "templateId": "5449016a4bdc2d6f028b456f", - "count": 95000, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 8100, + "_id": "6271093e621b0a76055cd61e", "endProducts": { "Common": { - "min": 0, - "max": 0 + "max": 0, + "min": 0 }, "Rare": { - "min": 1, - "max": 3 + "max": 1, + "min": 1 }, "Superrare": { - "min": 1, - "max": 2 + "max": 5, + "min": 3 } - } + }, + "productionTime": 16800, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5d1b376e86f774252519444e", + "type": "Item" + } + ] }, { "_id": "62710a0e436dcc0b9c55f4ec", - "requirements": [ - { - "templateId": "5c12613b86f7743bbe2c3f76", - "count": 1, - "isFunctional": false, - "isEncoded": false, - "isSpawnedInSession": false, - "type": "Item" - } - ], - "productionTime": 19200, "endProducts": { "Common": { - "min": 0, - "max": 0 + "max": 0, + "min": 0 }, "Rare": { - "min": 2, - "max": 4 + "max": 4, + "min": 2 }, "Superrare": { - "min": 2, - "max": 3 + "max": 3, + "min": 2 } - } - } - ], - "cultistRecipes": [ + }, + "productionTime": 19200, + "requirements": [ + { + "count": 1, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5c12613b86f7743bbe2c3f76", + "type": "Item" + } + ] + }, { - "_id": "66827062405f392b203a44cf" + "_id": "62710a69adfbd4354d79c58e", + "endProducts": { + "Common": { + "max": 0, + "min": 0 + }, + "Rare": { + "max": 3, + "min": 1 + }, + "Superrare": { + "max": 2, + "min": 1 + } + }, + "productionTime": 8100, + "requirements": [ + { + "count": 95000, + "isEncoded": false, + "isFunctional": false, + "isSpawnedInSession": false, + "templateId": "5449016a4bdc2d6f028b456f", + "type": "Item" + } + ] } ] } \ No newline at end of file diff --git a/Server/Assets/database/locales/global/ch.json b/Server/Assets/database/locales/global/ch.json index fdc91222..e7f99228 100644 --- a/Server/Assets/database/locales/global/ch.json +++ b/Server/Assets/database/locales/global/ch.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/cz.json b/Server/Assets/database/locales/global/cz.json index 8f44213d..e00d4f12 100644 --- a/Server/Assets/database/locales/global/cz.json +++ b/Server/Assets/database/locales/global/cz.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/en.json b/Server/Assets/database/locales/global/en.json index 8b6abba2..1ac333ef 100644 --- a/Server/Assets/database/locales/global/en.json +++ b/Server/Assets/database/locales/global/en.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/es-mx.json b/Server/Assets/database/locales/global/es-mx.json index 6e5db0a6..119ba01e 100644 --- a/Server/Assets/database/locales/global/es-mx.json +++ b/Server/Assets/database/locales/global/es-mx.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/es.json b/Server/Assets/database/locales/global/es.json index eb056a8e..9e61bef4 100644 --- a/Server/Assets/database/locales/global/es.json +++ b/Server/Assets/database/locales/global/es.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/fr.json b/Server/Assets/database/locales/global/fr.json index 107ec192..4410dc9b 100644 --- a/Server/Assets/database/locales/global/fr.json +++ b/Server/Assets/database/locales/global/fr.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/ge.json b/Server/Assets/database/locales/global/ge.json index 8a673ba6..5fb50e59 100644 --- a/Server/Assets/database/locales/global/ge.json +++ b/Server/Assets/database/locales/global/ge.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/hu.json b/Server/Assets/database/locales/global/hu.json index 04839e2f..67b15977 100644 --- a/Server/Assets/database/locales/global/hu.json +++ b/Server/Assets/database/locales/global/hu.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/it.json b/Server/Assets/database/locales/global/it.json index 94dafdae..35a69f91 100644 --- a/Server/Assets/database/locales/global/it.json +++ b/Server/Assets/database/locales/global/it.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/jp.json b/Server/Assets/database/locales/global/jp.json index 11624224..e7c5c238 100644 --- a/Server/Assets/database/locales/global/jp.json +++ b/Server/Assets/database/locales/global/jp.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/kr.json b/Server/Assets/database/locales/global/kr.json index 388b581b..6b97e8a7 100644 --- a/Server/Assets/database/locales/global/kr.json +++ b/Server/Assets/database/locales/global/kr.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/pl.json b/Server/Assets/database/locales/global/pl.json index d043525d..b9f3b8d4 100644 --- a/Server/Assets/database/locales/global/pl.json +++ b/Server/Assets/database/locales/global/pl.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/po.json b/Server/Assets/database/locales/global/po.json index 9569df47..7a541b1f 100644 --- a/Server/Assets/database/locales/global/po.json +++ b/Server/Assets/database/locales/global/po.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/ro.json b/Server/Assets/database/locales/global/ro.json index 4bb3f95f..8296ecea 100644 --- a/Server/Assets/database/locales/global/ro.json +++ b/Server/Assets/database/locales/global/ro.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/ru.json b/Server/Assets/database/locales/global/ru.json index bb93018c..49df33b3 100644 --- a/Server/Assets/database/locales/global/ru.json +++ b/Server/Assets/database/locales/global/ru.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Награда за прохождение опроса", "676ae11cf444b79e7306745f 0": "Предметы сохраненные при переходе на новый уровень престижа", "676bc75c4859905179061aff 0": "Письмо с наградами за престиж", + "6776e324810eb26b880fb4a5 0": "Говорят, что с инструментами сейчас совсем туго стало, даже OLI не спасает. Правильно я сделал, что оптом тогда эти рулетки заказал. Держи, сейчас я тебе помогу, а сочтёмся как-нибудь потом.", "Arena/UI/Match_leaving_warning_body 0": "Если вы покинете матч, то вы подставляете своих союзников в невыгодное положение./nВы потеряете награду и рейтинг, а также можете получить временный бан.", "Arena/UI/Match_leaving_warning_header 0": "Внимание! Вы покидаете матч.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", @@ -27978,7 +27979,7 @@ "675c044e3691199fe911a641": "Найти и пометить четвертый особый груз TerraGroup Маркером MS2000 на локации Таможня", "675c3fbeb402d4fa5589516f": "Найти и пометить пятый особый груз TerraGroup Маркером MS2000 на локации Таможня", "675c3fd3a2c0bad5f70af01c": "Найти и пометить шестой особый груз TerraGroup Маркером MS2000 на локации Таможня", - "675c3fdd5af984e99db7b4e1": "Найти и пометить седьмрй особый груз TerraGroup Маркером MS2000 на локации Таможня", + "675c3fdd5af984e99db7b4e1": "Найти и пометить седьмой особый груз TerraGroup Маркером MS2000 на локации Таможня", "675c03d1f7da9792a405549a acceptPlayerMessage": "", "675c03d1f7da9792a405549a declinePlayerMessage": "", "675c03d1f7da9792a405549a completePlayerMessage": "", diff --git a/Server/Assets/database/locales/global/sk.json b/Server/Assets/database/locales/global/sk.json index f68fff79..42e97e23 100644 --- a/Server/Assets/database/locales/global/sk.json +++ b/Server/Assets/database/locales/global/sk.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/global/tu.json b/Server/Assets/database/locales/global/tu.json index 1db6eb75..62769e7a 100644 --- a/Server/Assets/database/locales/global/tu.json +++ b/Server/Assets/database/locales/global/tu.json @@ -20273,6 +20273,7 @@ "672dd5b83804f9bc8e0a610e 0": "Survey reward", "676ae11cf444b79e7306745f 0": "Items that were saved when achieving the new level of prestige", "676bc75c4859905179061aff 0": "Prestige rewards", + "6776e324810eb26b880fb4a5 0": "They say tools are in short supply these days, even OLI can't save the day. Good thing I ordered those tape measures in bulk back then. Here, take this — I’ll help you out now, and we’ll settle up later, one way or another.", "Arena/UI/Match_leaving_warning_body 0": "If you leave the match, you'll put your allies at disadvantage./nYou'll lose your reward and rating and could receive a temporary ban.", "Arena/UI/Match_leaving_warning_header 0": "Warning! You are leaving the match.", "5fc615710b735e7b024c76ed Name": "Boss sanitar", diff --git a/Server/Assets/database/locales/server/ar.json b/Server/Assets/database/locales/server/ar.json index 35ef0f08..d128db9f 100644 --- a/Server/Assets/database/locales/server/ar.json +++ b/Server/Assets/database/locales/server/ar.json @@ -131,8 +131,6 @@ "modloader-error_parsing_mod_load_order": "حدث خطأ أثناء تحليل ترتيب المودات.\n\n\n\n\n\n\n", "modloader-incompatibilities_not_string_array": "يجب أن يكون Mod %s package.json الخاصية 'incompatibilities' مصفوفة سلاسل", "modloader-incompatible_mod_found": "المود {{author}}-{{name}} غير متوافق مع {{incompatibleModName}}.\n\n\n\n\n\n\n", - "modloader-installing_external_dependencies": "تثبيت الاعتمادات للإضافة: {{name}} بواسطة: {{author}}", - "modloader-installing_external_dependencies_disabled": "الإضافة: {{name}}: {{author}} تتطلب اعتمادات خارجية ولكن الميزة معطلة حاليًا، اذهب إلى \"{{configPath}}\", اضبط \"{{configOption}}\" إلى \"صحيح\" و أعد تشغيل الخادم.\nبتمكينك هذا فإنك تتحمل كل المسؤولية عن ما سيتم تحميله من قبل {{name}} إلى جهازك.", "modloader-invalid_version_property": "ملف package.json للمود %s يحتوي على سلسلة إصدار غير صالحة.\n\n\n\n\n\n\n", "modloader-is_client_mod": "المود (%s) هو مود خاص بالعميل ويجب وضعه في المجلد التالي: /spt/bepinex/plugins\n\n\n\n\n\n\n", "modloader-load_order_conflict": "{{modOneName}} و {{modTwoName}} لديهما متطلبات تعارض في ترتيب التحميل، لا يمكن للخادم أن يبدأ حتى يتم حل هذا وسيتم إيقاف التشغيل.\n\n\n\n\n\n\n", diff --git a/Server/Assets/database/locales/server/cs.json b/Server/Assets/database/locales/server/cs.json index ddb469a4..d352026f 100644 --- a/Server/Assets/database/locales/server/cs.json +++ b/Server/Assets/database/locales/server/cs.json @@ -143,8 +143,6 @@ "modloader-error_parsing_mod_load_order": "Chyba parsování načítání pořadí módů", "modloader-incompatibilities_not_string_array": "Vlastnost módu %s package.json 'incompatibility' by měla být pole pro řetězec", "modloader-incompatible_mod_found": "Modifikace {{author}}-{{name}} je nekompatibilní s {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Instalace závislostí pro mód: {{name}} od autora: {{author}}", - "modloader-installing_external_dependencies_disabled": "Mód: {{name}} od: {{author}} vyžaduje externí závislosti, ale funkce je momentálně zakázána, přejděte na \"{{configPath}}\", nastavte \"{{configOption}}\" na true a restartujte server.\nPovolením této funkce přijímáte veškerou odpovědnost za to, co {{name}} stáhne do vašeho počítače.", "modloader-invalid_version_property": "Mód %s package.json obsahuje neplatnou verzi řetězce", "modloader-is_client_mod": "Mód (%s) je klientský mód a měl by být umístěn v následující složce: /spt/bepinex/plugins", "modloader-load_order_conflict": "`{{modOneName}}` a `{{modTwoName}}` mají protichůdné požadavky na pořadí načítání, server není schopen spustit, dokud nebude opraven a nebude vypnut", @@ -591,7 +589,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "NENAHLAŠUJ TO", "watermark-free_of_charge": "Tento produkt je zdarma", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "TATO VERZE MÁ ZÁKÁZÁNO MÓDOVÁNÍ SERVERU", "watermark-no_support": "ŽÁDNÁ PODPORA NEBUDE POSKYTNUTA", "watermark-not_an_issue": "TOTO NENÍ CHYBA", diff --git a/Server/Assets/database/locales/server/de.json b/Server/Assets/database/locales/server/de.json index 0c7fb8e8..e8714196 100644 --- a/Server/Assets/database/locales/server/de.json +++ b/Server/Assets/database/locales/server/de.json @@ -199,8 +199,6 @@ "modloader-error_parsing_mod_load_order": "Fehler beim Parsen der Mod-Ladereihenfolge", "modloader-incompatibilities_not_string_array": "Die Mod %s package.json Eigenschaft 'Inkompatibilitäten' sollte ein String-Array sein", "modloader-incompatible_mod_found": "Mod {{author}}-{{name}} ist nicht kompatibel mit {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Abhängigkeiten für Mod: {{name}} von: {{author}} werden installieren", - "modloader-installing_external_dependencies_disabled": "Mod: {{name}} von: {{author}} erfordert externe Abhängigkeiten, aber die Funktion ist derzeit deaktiviert. Gehe zu '{{configPath}}', setze '{{configOption}}' auf 'true' und starte den Server neu.\nWenn du dies aktivierst, übernimmst du die volle Verantwortung dafür, was {{name}} auf deinen Computer herunterlädt.", "modloader-invalid_sptVersion_field": "Mod: %s enthält eine ungültige ´semver´ Zeichenkette im ´sptversions´ Feld. Beispiele für gültige Werte: https://github.com/npm/node-semver#versions", "modloader-invalid_version_property": "Mod %s package.json enthält eine ungültige Versionszeichenfolge", "modloader-is_client_mod": "Mod (%s) ist ein Client-Mod und sollte im folgenden Ordner abgelegt werden: /spt/bepinex/plugins", @@ -708,7 +706,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "MELDEN UNTERSAGT", "watermark-free_of_charge": "Diese Arbeit ist kostenfrei", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "BEI DIESEM BUILD IST DAS SERVER-MODDING DEAKTIVIERT", "watermark-no_support": "ES WIRD KEIN SUPPORT GEWÄHRT", "watermark-not_an_issue": "DAS IST KEIN PROBLEM", diff --git a/Server/Assets/database/locales/server/el.json b/Server/Assets/database/locales/server/el.json index cd735702..8e64db44 100644 --- a/Server/Assets/database/locales/server/el.json +++ b/Server/Assets/database/locales/server/el.json @@ -199,8 +199,6 @@ "modloader-error_parsing_mod_load_order": "Σφάλμα κατά την ανάλυση της σειράς φόρτωσης πρόσθετου (mod)", "modloader-incompatibilities_not_string_array": "Στο πρόσθετο %s package.json η ιδιότητα \"ασυμβατότητες\" θα πρέπει να είναι μία συστοιχία συμβολοσειρών", "modloader-incompatible_mod_found": "Το πρόσθετο {{author}}-{{name}} δεν είναι συμβατό με το {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Εγκατάσταση εξαρτήσεων για το πρόσθετο: {{name}} από: {{author}}", - "modloader-installing_external_dependencies_disabled": "Το πρόσθετο: {{name}} by: {{author}} απαιτεί εξωτερικές εξαρτήσεις, αλλά η λειτουργία αυτή τη στιγμή είναι απενεργοποιημένη, πήγαινε στο \"{{configPath}}\", όρισε \"{{configOption}}\" σε true και επανεκκίνησε τον διακομιστή.\nΕνεργοποιώντας αυτό αποδέχεστε όλη την ευθύνη για τις λήψεις {{name}} στον υπολογιστή σας.", "modloader-invalid_sptVersion_field": "Το πρόσθετο %s περιέχει μία μη έγκυρη semver συμβολοσειρά στο πεδίο sptVersion. Παραδείγματα έγκυρων τιμών: https://github.com/npm/node-semver#versions", "modloader-invalid_version_property": "Το πρόσθετο %s package.json περιέχει μια μη έγκυρη έκδοση συμβολοσειράς", "modloader-is_client_mod": "Το πρόσθετο (%s) είναι ένα πρόσθετο πελάτη και θα πρέπει να τοποθετηθεί στον ακόλουθο φάκελο: /spt/bepinex/plugins", @@ -708,7 +706,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "ΜΗΝ ΤΟ ΑΝΑΦΕΡΕΤΕ", "watermark-free_of_charge": "Αυτή η εργασία είναι χωρίς χρέωση", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "ΑΥΤΗ Η ΕΚΔΟΣΗ ΕΧΕΙ ΑΠΕΝΕΡΓΟΠΟΙΗΜΈΝΕΣ ΤΙΣ ΤΡΟΠΟΠΟΙΗΣΕΙΣ ΑΠΟ ΤΟΝ ΔΙΑΚΟΜΙΣΤΗ", "watermark-no_support": "ΔΕΝ ΘΑ ΔΩΘΕΙ ΥΠΟΣΤΗΡΙΞΗ", "watermark-not_an_issue": "ΑΥΤΟ ΔΕΝ ΕΙΝΑΙ ΠΡΟΒΛΗΜΑ", diff --git a/Server/Assets/database/locales/server/en.json b/Server/Assets/database/locales/server/en.json index da5a5882..f768f2f2 100644 --- a/Server/Assets/database/locales/server/en.json +++ b/Server/Assets/database/locales/server/en.json @@ -199,8 +199,6 @@ "modloader-error_parsing_mod_load_order": "Error parsing mod load order", "modloader-incompatibilities_not_string_array": "Mod %s package.json property 'incompatibilities' should be a string array", "modloader-incompatible_mod_found": "Mod: {{author}}-{{name}} is incompatible with: {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Installing dependencies for Mod: {{name}} by: {{author}}", - "modloader-installing_external_dependencies_disabled": "Mod: {{name}} by: {{author}} requires external dependencies but the feature is currently disabled, go to \"{{configPath}}\", set \"{{configOption}}\" to true and restart the server.\nBy enabling this you accept all responsibility for what {{name}} downloads to your machine.", "modloader-invalid_sptVersion_field": "Mod: %s contains an invalid semver string in the sptVersion field. Examples of valid values: https://github.com/npm/node-semver#versions", "modloader-invalid_version_property": "Mod: %s package.json contains an invalid version string", "modloader-is_client_mod": "Mod (%s) is a client mod and should be placed in the following folder: /spt/bepinex/plugins", @@ -628,7 +626,7 @@ "ragfair-unable_to_remove_offer_doesnt_exist": "Unable to remove offer with id: %s as it cannot be found in flea market", "ragfair-unable_to_remove_offer_not_found_in_profile": "Unable to find offer: {{offerId}} in profile: {{profileId}} as offer is undefined, creating", "ragfair-generating_offers": "Generating flea offers...", - "release-beta-disclaimer": "By pressing OK you agree that no support is offered and that this is for bug testing only. NOT actual gameplay. Mods are disabled. New profiles may be required frequently. Report all bugs in the reports channel in discord, or on the issues page on the website. If you don't press OK by the time specified, the game will close.", + "release-beta-disclaimer": "By pressing OK you agree that no support is offered and that this is for bug testing only. NOT actual gameplay. Mods are disabled. New profiles may be required frequently. Report all bugs in the reports channel in discord, or on the issues page on the website. If you don't press OK by the time specified, the game will close.", "release-beta-disclaimer-accept": "User accepted the beta disclaimer", "release-beta-disclaimer-mods-enabled": "By pressing OK you agree that no support is offered and that this is for bug testing only. NOT actual gameplay. Mods are enabled, do NOT report issues with mods. Do NOT ask mod authors for updated mods. Report all bugs in the reports channel in discord, or on the issues page on the website. If you dont press OK by the time specificed, the game will close.", "release-illegal-plugins-exception": "Client mods detected. Mods are not enabled for BleedingEdge/testing builds of SPT - please remove them before playing!", @@ -660,7 +658,7 @@ "scheduled_event_failed_to_run": "Scheduled event: '%s' failed to run successfully.", "season-no_matching_season_found_for_date": "Unable to find a season using the current date, defaulting to Summer", "season-event_is_active": "Event: %s is active", - "seasonal-missing_equipment_slot_on_bot": "Unable to remove christmas equipment from slot: {{equipmentSlot}} as it cannot be found on bot: {{botRole}}", + "seasonal-missing_equipment_slot_on_bot": "Unable to remove christmas equipment from slot: {{equipmentSlot}} as it cannot be found on bot: {{botRole}}", "seasonal-missing_loot_container_slot_on_bot": "Unable to remove christmas loot from slot: {{lootContainer}} as it cannot be found on bot: {{botRole}}", "server_running": "Server is running, do not close while playing SPT", "server_start_meme_1": "Live laugh love", @@ -711,7 +709,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "DO NOT REPORT IT", "watermark-free_of_charge": "This work is free of charge", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "THIS BUILD HAS SERVER MODDING DISABLED", "watermark-no_support": "NO SUPPORT WILL BE GIVEN", "watermark-not_an_issue": "THIS IS NOT AN ISSUE", @@ -727,9 +725,9 @@ "websocket-received_message": "[WS] Received message from user %s ", "websocket-socket_lost_deleting_handle": "[WS] Socket lost, deleting handle", "websocket-started": "Started websocket at %s", - "chatbot-cannot_accept_any_more_of_gift": "You cannot accept any more of this gift", - "chatbot-forced_event_enabled": "%s event has been enabled, restart your game client before starting a raid", - "chatbot-added_stash_rows_please_restart": "Added 2 rows to stash, please restart your game to see them", - "chatbot-snow_enabled": "Snow is enabled for all subsequent raids until the server is restarted", - "chatbot-summer_enabled": "Summer has been enabled for all subsequent raids until the server is restarted" + "chatbot-cannot_accept_any_more_of_gift": "You cannot accept any more of this gift", + "chatbot-forced_event_enabled": "%s event has been enabled, restart your game client before starting a raid", + "chatbot-added_stash_rows_please_restart": "Added 2 rows to stash, please restart your game to see them", + "chatbot-snow_enabled": "Snow is enabled for all subsequent raids until the server is restarted", + "chatbot-summer_enabled": "Summer has been enabled for all subsequent raids until the server is restarted" } diff --git a/Server/Assets/database/locales/server/es-es.json b/Server/Assets/database/locales/server/es-es.json index e2a1b2e2..6a293868 100644 --- a/Server/Assets/database/locales/server/es-es.json +++ b/Server/Assets/database/locales/server/es-es.json @@ -199,8 +199,6 @@ "modloader-error_parsing_mod_load_order": "Error al traducir el orden de las modificaciones", "modloader-incompatibilities_not_string_array": "La propiedad 'incompatibilities' de la modificacion %s package.json deberia ser un arreglo de string", "modloader-incompatible_mod_found": "La modificación {{author}}-{{name}} no es compatible con {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Instalando dependencias para el Mod: {{name}} por: {{author}}", - "modloader-installing_external_dependencies_disabled": "Mod: {{name}} por: {{author}} requiere dependencias externas pero la función esta actualmente deshabilitada. Vaya a \"{{configPath}}\", establezca \"{{configOption}}\" en 'true' y reinicie el servidor.\nAl habilitar esto, aceptas toda la responsabilidad de lo que {{name}} descargue en tu equipo.", "modloader-invalid_sptVersion_field": "Mod %s contiene una cadena semver inválida en el campo sptVersion. Ejemplos de valores válidos: https://github.com/npm/node-semver#versions", "modloader-invalid_version_property": "La modificacion %s package.json contiene un valor invalido de version", "modloader-is_client_mod": "La modificación (%s) es de cliente, esta debería ponerse en el directorio: /spt/bepinex/plugins", @@ -708,7 +706,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "NO LO REPORTES", "watermark-free_of_charge": "Este trabajo es libre de cargo.", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "ESTA VERSIÓN TIENE LAS MODIFICACIONES DESACTIVADAS", "watermark-no_support": "NO SE DARÁ NINGÚN TIPO DE SOPORTE", "watermark-not_an_issue": "ESTO NO ES UN PROBLEMA", diff --git a/Server/Assets/database/locales/server/fr.json b/Server/Assets/database/locales/server/fr.json index c2f188a7..b13821cb 100644 --- a/Server/Assets/database/locales/server/fr.json +++ b/Server/Assets/database/locales/server/fr.json @@ -199,8 +199,6 @@ "modloader-error_parsing_mod_load_order": "SPT-AKI n'a pas réussi à déterminer l'ordre correct des mods", "modloader-incompatibilities_not_string_array": "la propriété 'incompatibilities' dans le fichier package.json du mod %s doit être un tableau de chaînes de caractères", "modloader-incompatible_mod_found": "Le mod {{author}}-{{name}} est incompatible avec {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Installation des dépendances pour le Mod: {{name}} par: {{author}}", - "modloader-installing_external_dependencies_disabled": "Mod: {{name}} de: {{author}} nécessite des dépendances externes mais cette fonction est actuellement désactivée, allez dans \"{{configPath}}\", changez l'option \"{{configOption}}\" à vrais et relancez le serveur.\nEn activant cette option, vous endossez toute la responsabilité de ce que {{name}} télécharge sur votre machine.", "modloader-invalid_sptVersion_field": "Le mod %s contient une chaîne de caractères semver invalide dans le champ sptVersion. Exemples de chaînes correctes: https://github.com/npm/node-semver#versions", "modloader-invalid_version_property": "Le mod %s package.json contient une chaîne de version invalide", "modloader-is_client_mod": "Le mod (%s) est un mod client et doit être placé dans le dossier suivant : /spt/bepinex/plugins", @@ -708,7 +706,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "NE PAS SIGNALER !", "watermark-free_of_charge": "Ce travail est gratuit", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "CE BUILD A LE MODDING DESACTIVE", "watermark-no_support": "AUCUN SUPPORT NE SERA FOURNI", "watermark-not_an_issue": "CECI N'EST PAS UNE ERREUR", diff --git a/Server/Assets/database/locales/server/hu.json b/Server/Assets/database/locales/server/hu.json index 441e0cb9..3337d7c1 100644 --- a/Server/Assets/database/locales/server/hu.json +++ b/Server/Assets/database/locales/server/hu.json @@ -167,8 +167,6 @@ "modloader-error_parsing_mod_load_order": "Hiba a mod betöltési sorrendjének elemzésekor", "modloader-incompatibilities_not_string_array": "A Mod %s package.json „incompatibilities” tulajdonságának karakterlánc tömbnek kell lennie", "modloader-incompatible_mod_found": "{{author}}-{{name}} mod nem kompatibilis a következővel: {{incompatibleModName}}", - "modloader-installing_external_dependencies": "A segédprogramok telepítése a következőhö modhoz: {{name}}, {{author}} által készítve", - "modloader-installing_external_dependencies_disabled": "A(z) {{name}} mod, melyet {{author}} készített, külső függőségeket igényel, de ez a funkció jelenleg ki van kapcsolva. Lépj a(z) \"{{configPath}}\" helyre, állítsd a(z) \"{{configOption}}\" értékét igazra (true), és indítsd újra a szervert.\nEnnek engedélyezésével elfogadod minden felelősséget amiért a(z) {{name}} letölt a gépedre.", "modloader-invalid_version_property": "A(z) %s mod package.json fájlja érvénytelen verziójú karakterláncot tartalmaz", "modloader-is_client_mod": "A következő mod (%s) egy kliens mod és a következő mappába kell helyezni: /spt/bepinex/plugins", "modloader-load_order_conflict": "`{{modOneName}}` és`{{modTwoName}}` modoknak ellentmondásos betöltési sorrend követelményei vannak, a szerver nem tud elindulni amíg ezt nem javítják, és leáll", diff --git a/Server/Assets/database/locales/server/id.json b/Server/Assets/database/locales/server/id.json index 4cb79e09..c21cdf6b 100644 --- a/Server/Assets/database/locales/server/id.json +++ b/Server/Assets/database/locales/server/id.json @@ -179,8 +179,6 @@ "modloader-error_parsing_mod_load_order": "Permasalahan dalam penguraian urutan pemuatan mod", "modloader-incompatibilities_not_string_array": "Mod %s data package.json 'incompatibilities' harus string array", "modloader-incompatible_mod_found": "Mod {{author}}-{{name}} tidak compatibel dengan {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Menginstal dependensi untuk Mod: {{name}} oleh: {{author}}", - "modloader-installing_external_dependencies_disabled": "Mod: {{name}} oleh: {{author}} memerlukan dependensi eksternal tapi fitur ini sedang dinonaktifkan, pergi ke \"{{configPath}}\", ubah \"{{configOption}}\" menjadi true lalu mulai ulang server. \nDengan mengaktifkan fitur ini anda bertanggung jawab atas apa yang {{name}} unduh ke dalam mesin anda.", "modloader-invalid_version_property": "Mod %s package.json memiliki versi string yang invalid", "modloader-is_client_mod": "Mod (%s) merupakan mod client dan harus dipasang dalam folder: /spt/bepinex/plugins", "modloader-load_order_conflict": "'{{modOneName}}' dan '{{modTwoName}}' memiliki urutan pemuatan yang bertentangan, server tidak bisa mulai hingga masalah ini diperbaiki dan akan dimatikan", diff --git a/Server/Assets/database/locales/server/it.json b/Server/Assets/database/locales/server/it.json index 7b2da0ad..19b7b479 100644 --- a/Server/Assets/database/locales/server/it.json +++ b/Server/Assets/database/locales/server/it.json @@ -199,8 +199,6 @@ "modloader-error_parsing_mod_load_order": "Errore nel processare l'ordine di caricamento della mod", "modloader-incompatibilities_not_string_array": "Le proprietà 'incompatibilities' della mod %s, nel package.json, devono essere uno string array", "modloader-incompatible_mod_found": "La mod {{author}}-{{name}} è incompatibile con {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Sto installando le dipendenze per la Mod: {{name}} by: {{author}}", - "modloader-installing_external_dependencies_disabled": "La mod: {{name}} di: {{author}} richiede dipendenze esterne, ma la funzione è attualmente disabilitata, vai su \"{{configPath}}\", imposta \"{{configOption}}\" a true e riavvia il server.\nAttivando questa opzione ti assumi tutta la responsabilità di ciò che {{name}} scarica sul tuo Pc.", "modloader-invalid_sptVersion_field": "La mod %s contiene una stringa semver non valida nel campo akiVersion. Esempi di valori validi: https://github.com/npm/node-semver#versions", "modloader-invalid_version_property": "Il package.json della Mod %s contiene una stringa 'version' non valida", "modloader-is_client_mod": "La mod (%s) è una mod del client e dovrebbe essere posizionata nella seguente cartella: /spt/bepinex/plugins", @@ -708,7 +706,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "NON SEGNALARLO", "watermark-free_of_charge": "Questo lavoro è gratuito", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "QUESTA BUILD HA LE MOD SERVER DISATTIVATE", "watermark-no_support": "NESSUN SUPPORTO SARA' FORNITO", "watermark-not_an_issue": "QUESTO NON É UN ERRORE", diff --git a/Server/Assets/database/locales/server/ja.json b/Server/Assets/database/locales/server/ja.json index 890ce208..517ab2e2 100644 --- a/Server/Assets/database/locales/server/ja.json +++ b/Server/Assets/database/locales/server/ja.json @@ -131,8 +131,6 @@ "modloader-error_parsing_mod_load_order": "mod ロード順の解析中にエラーが発生しました。", "modloader-incompatibilities_not_string_array": "Mod %s package.json プロパティ '非互換性' は文字列配列でなければなりません。", "modloader-incompatible_mod_found": "Mod {{author}}-{{name}} is incompatible with {{incompatibleModName}}。", - "modloader-installing_external_dependencies": "Mod {{name}} by: {{author}} と依存関係であるModをインストールしています", - "modloader-installing_external_dependencies_disabled": "Mod: {{name}} by: {{author}} が追加の依存関係Modを必要としていますが、設定が無効になっているためダウンロードができません。 \"{{configPath}}\" の \"{{configOption}}\" を true に設定してからサーバーを再起動してください。\n設定を有効にするにあたって、{{name}} があなたのパソコンにダウンロードするデータの責任をあなたが負うものとします", "modloader-invalid_version_property": "モッド %s のpackage.jsonにで不正確なバージョン文字列が使用されています。", "modloader-is_client_mod": "モッド %s はクライアントタイプのモッドです。正しいインストール先はこちら: /spt/bepinex/plugins", "modloader-load_order_conflict": "`{{modOneName}}` と `{{modTwoName}}` のロードの順序の条件が競合しています。 これが修正されるまでサーバーを起動できずシャットダウンします", diff --git a/Server/Assets/database/locales/server/ko.json b/Server/Assets/database/locales/server/ko.json index a9e87f64..c3ba178f 100644 --- a/Server/Assets/database/locales/server/ko.json +++ b/Server/Assets/database/locales/server/ko.json @@ -199,8 +199,6 @@ "modloader-error_parsing_mod_load_order": "모드 순서를 가져오는데 오류가 발생하였습니다", "modloader-incompatibilities_not_string_array": "모드 %s 의 package.json 파일 중 'incompatibilities' 속성은 문자 배열 타입이어야 합니다", "modloader-incompatible_mod_found": "모드 {{author}}-{{name}} 는 {{incompatibleModName}} 모드와 호환되지 않습니다", - "modloader-installing_external_dependencies": "모드: {{name}} by: {{author}} 에 대한 종속성을 설치합니다", - "modloader-installing_external_dependencies_disabled": "모드: {{name}} by: {{author}} 은(는) 외부 종속성이 필요하지만 기능이 꺼져있습니다, \"{{configPath}}\" 파일을 열어, 설정 \"{{configOption}}\" 값을 true 로 변경 후 서버를 재시작하세요.\n이 기능을 활성화하면 {{name}} 을(를) 기기에 다운로드 하면서 발생하는 모든 책임을 가지게 됩니다.", "modloader-invalid_sptVersion_field": "모드 %s 가 sptVersion 필드에 부적합한 semver 스트링 값을 보유하고 있습니다. 올바른 값들의 예시: https://github.com/npm/node-semver#versions", "modloader-invalid_version_property": "모드 %s 의 package.json 은(는) 잘못된 version 문자열을 포함하고 있습니다", "modloader-is_client_mod": "모드 (%s) 는 클라이언트 모드로 '/spt/bepinex/plugins' 폴더에 위치해야 합니다", @@ -708,7 +706,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "리포트 하지마세요", "watermark-free_of_charge": "이 소프트웨어는 무료입니다", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "이 버전은 모드가 비활성화된 빌드입니다", "watermark-no_support": "문의 및 지원은 없습니다", "watermark-not_an_issue": "이 메시지는 오류 또는 문제가 아닙니다", diff --git a/Server/Assets/database/locales/server/nl.json b/Server/Assets/database/locales/server/nl.json index b20aabfa..65dd1d43 100644 --- a/Server/Assets/database/locales/server/nl.json +++ b/Server/Assets/database/locales/server/nl.json @@ -199,8 +199,6 @@ "modloader-error_parsing_mod_load_order": "Fout tijdens het parsen van de mod laadvolgorde", "modloader-incompatibilities_not_string_array": "Mod %s package.json property 'incompatibilities' moet een string array zijn", "modloader-incompatible_mod_found": "Mod {{author}}-{{name}} is niet compatibel met {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Afhankelijkheden installeren voor Mod: {{name}} door: {{author}}", - "modloader-installing_external_dependencies_disabled": "Mod: {{name}} door: {{author}} vereist externe afhankelijkheden, maar de functie is momenteel uitgeschakeld, Ga naar \"{{configPath}}\", stel \"{{configOption}}\" in op true en herstart de server.\nDoor dit aan te zetten neem je alle verantwoordelijkheid voor wat {{name}} naar je machine download.", "modloader-invalid_sptVersion_field": "Mod: %s bevat een ongeldige semver string in het sptVersion veld. Voorbeelden van geldige waarden: https://github.com/npm/node-semver#versions", "modloader-invalid_version_property": "Mod %s package.json bevat een invalide versie string", "modloader-is_client_mod": "Mod (%s) is een client mod en moet in de volgende map geplaatst worden: /spt/bepinex/plugins", @@ -708,7 +706,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "RAPPORTEER HET NIET", "watermark-free_of_charge": "Dit werk is gratis", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "DEZE BUILD HEEFT SERVER MODDEN UITGESCHAKELD", "watermark-no_support": "ER WORDT GEEN SUPPORT GEGEVEN", "watermark-not_an_issue": "DIT IS GEEN PROBLEEM", diff --git a/Server/Assets/database/locales/server/no.json b/Server/Assets/database/locales/server/no.json index bd995439..b87df230 100644 --- a/Server/Assets/database/locales/server/no.json +++ b/Server/Assets/database/locales/server/no.json @@ -129,8 +129,6 @@ "modloader-error_parsing_mod_load_order": "Feil under parsing av mod lastings rekkefølge", "modloader-incompatibilities_not_string_array": "Mod %s package.json egenskaps 'inkompatibiliteter' bør være en streng array", "modloader-incompatible_mod_found": "Mod {{author}}–{{name}} er inkompatibel med {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Installerer avhengigheter for Mod: {{name}} av: {{author}}", - "modloader-installing_external_dependencies_disabled": "Mod: {{name}} av: {{author}} krever eksterne avhengigheter, men funksjonen er for øyeblikket deaktivert. gå til \"{{configPath}}\", sett \"{{configOption}}\" til sant, og start serveren på nytt.\nVed å aktivere dette godtar du alt ansvar for hva {{name}} laster ned til maskinen din.", "modloader-invalid_version_property": "Mod %s pakke.json inneholder en ugyldig versjonstreng", "modloader-is_client_mod": "Mod (%s) er en klientmod og skal plasseres i følgende mappe: /spt/bepinex/plugins", "modloader-load_order_conflict": "`{{modOneName}}` og `{{modTwoName}}` har motstridende krav for innlastingsrekkefølge. serveren kan ikke starte før dette er fikset og vil slå seg av", diff --git a/Server/Assets/database/locales/server/pl.json b/Server/Assets/database/locales/server/pl.json index e1dd1ddf..a9f6ad47 100644 --- a/Server/Assets/database/locales/server/pl.json +++ b/Server/Assets/database/locales/server/pl.json @@ -198,8 +198,6 @@ "modloader-error_parsing_mod_load_order": "Błąd analizowania kolejności ładowania modów", "modloader-incompatibilities_not_string_array": "Mod %s właściwość package.json 'incompatibilities' powinna być tabelą string", "modloader-incompatible_mod_found": "Mod {{author}}-{{name}} jest niezgodny z {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Instalowanie zależności dla Moda: {{name}} stworzonego przez: {{author}}", - "modloader-installing_external_dependencies_disabled": "Mod: {{name}} stworzony przez: {{author}} wymaga zewnętrznych zależności, ale funkcja jest obecnie wyłączona, przejdź do \"{{configPath}}\", ustaw \"{{configOption}}\" na True oraz zrestartuj serwer.\nPoprzez włączenie akceptujesz wszelką odpowiedzialność za to, co {{name}} pobiera na twój komputer.", "modloader-invalid_sptVersion_field": "Mod %s zawiera nieprawidłowy string semver w polu sptVersion. Przykłady prawidłowych wartości: https://github.com/npm/node-semver#versions", "modloader-invalid_version_property": "Mod %s package.json zawiera nieprawidłowy string wersji", "modloader-is_client_mod": "Mod (%s) jest modem klienta i powinien zostać umieszczony w następującym folderze: /spt/bepinex/plugins", @@ -701,7 +699,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "NIE ZGŁASZAJ TEGO", "watermark-free_of_charge": "Ta praca jest darmowa", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "TA WERSJA MA WYŁĄCZONE MODYFIKACJE SERWERA", "watermark-no_support": "NIE UDZIELAMY WSPARCIA", "watermark-not_an_issue": "TO NIE JEST PROBLEM", diff --git a/Server/Assets/database/locales/server/pt-br.json b/Server/Assets/database/locales/server/pt-br.json index 4bd8af76..53b445d8 100644 --- a/Server/Assets/database/locales/server/pt-br.json +++ b/Server/Assets/database/locales/server/pt-br.json @@ -199,8 +199,6 @@ "modloader-error_parsing_mod_load_order": "Erro ao analisar a ordem de carregamento do mod", "modloader-incompatibilities_not_string_array": "A propriedade 'incompatibilities' do arquivo package.json do mod %s deveria ser uma matriz de strings", "modloader-incompatible_mod_found": "Mod {{author}}-{{name}} é incompatível com {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Instalação de dependências para o Mod: {{name}} por: {{author}}", - "modloader-installing_external_dependencies_disabled": "Mod: {{name}} por: {{author}} requer dependências externas, mas a funcionalidade está atualmente desativada. Vá para \"{{configPath}}\", defina \"{{configOption}}\" como true e reinicie o servidor. Ao ativar essa opção, você aceita toda a responsabilidade pelo que {{nome}} baixa em seu computador.", "modloader-invalid_sptVersion_field": "O mod %s contém uma string semver inválida no campo sptVersion. Exemplos de valores válidos: https://github.com/npm/node-semver#versions", "modloader-invalid_version_property": "Mod %s package.json contém uma string de versão inválida", "modloader-is_client_mod": "O mod (%s) é um mod de cliente e deve ser colocado na seguinte pasta: /spt/bepinex/plugins", @@ -708,7 +706,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "NÃO RELATE ISSO", "watermark-free_of_charge": "Esse trabalho é gratuito", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "ESTA VERSÃO TEM OS MODS DO SERVIDOR DESATIVADO", "watermark-no_support": "NÃO SERÁ FORNECIDO NENHUM SUPORTE", "watermark-not_an_issue": "ISSO NÃO É UM PROBLEMA", diff --git a/Server/Assets/database/locales/server/pt-pt.json b/Server/Assets/database/locales/server/pt-pt.json index ac28a92c..4e58682a 100644 --- a/Server/Assets/database/locales/server/pt-pt.json +++ b/Server/Assets/database/locales/server/pt-pt.json @@ -132,8 +132,6 @@ "modloader-error_parsing_mod_load_order": "Erro ao analisar ordem de carregamento de mods", "modloader-incompatibilities_not_string_array": "A propriedade 'incompatibilities' no package.json do mod %s deve ser um array de strings", "modloader-incompatible_mod_found": "Mod {{author}}-{{name}} é incompatível com {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Instalando dependências para o Mod: {{name}} por: {{author}}", - "modloader-installing_external_dependencies_disabled": "Mod: {{name}} por: {{author}} requer dependências externas mas a funcionalidade está desativada no momento. Vai a \"{{configPath}}\", define \"{{configOption}}\" para true e reinicia o servidor.\nAo ativar esta funcionalidade assumes toda a responsabilidade pelo o que o {{name}} faz download para o teu computador.", "modloader-invalid_version_property": "O package.json do Mod %s contém uma string de versão inválida", "modloader-is_client_mod": "Mod (%s) é um mod de cliente e deve ser colocado na seguinte pasta: /spt/bepinex/plugins", "modloader-load_order_conflict": "O '{{modOneName}}' e '{{modTwoName}}' têm requisitos de ordem de carregamento que entram em conflito. O servidor é incapaz de iniciar e será desligado até isto ser corrigido", diff --git a/Server/Assets/database/locales/server/ru.json b/Server/Assets/database/locales/server/ru.json index 59ad807a..0020257b 100644 --- a/Server/Assets/database/locales/server/ru.json +++ b/Server/Assets/database/locales/server/ru.json @@ -199,8 +199,6 @@ "modloader-error_parsing_mod_load_order": "Ошибка парсинга порядка загрузки модов", "modloader-incompatibilities_not_string_array": "В файле package.json мода %s свойство 'incompatibilities' должно быть массивом строк", "modloader-incompatible_mod_found": "Мод {{author}}-{{name}} не совместим с модом {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Установка зависимостей мода: {{name}} от: {{author}}", - "modloader-installing_external_dependencies_disabled": "Мод: {{name}} автор: {{author}} требует внешних зависимостей, но эта функция в настоящее время отключена, перейдите к \"{{configPath}}\", установите для \"{{configOption}}\" значение true и перезапустите сервер.\nВключив эту опцию, вы принимаете на себя всю ответственность за то, что {{name}} загружает на ваш компьютер.", "modloader-invalid_sptVersion_field": "В поле sptVersion мода %s содержится некорректная семвер-строка. См. примеры корректных значений: https://github.com/npm/node-semver#versions", "modloader-invalid_version_property": "В моде %s package.json содержит недопустимую строку версии", "modloader-is_client_mod": "Мод (%s) является модом для клиента и должен находиться в следующей папке: /spt/bepinex/plugins", @@ -708,7 +706,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "НЕ ОТПРАВЛЯЙТЕ БАГ-РЕПОРТ НАСЧЕТ ЭТОГО", "watermark-free_of_charge": "Данный проект является бесплатным", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "В ЭТОЙ СБОРКЕ ОТСУТСТВУЮТ ВОЗМОЖНОСТИ МОДИФИКАЦИИ", "watermark-no_support": "ПОДДЕРЖКА НЕ БУДЕТ ОКАЗЫВАТЬСЯ", "watermark-not_an_issue": "ЭТО НЕ ОШИБКА", diff --git a/Server/Assets/database/locales/server/sv-se.json b/Server/Assets/database/locales/server/sv-se.json index 65eb34ca..9264562d 100644 --- a/Server/Assets/database/locales/server/sv-se.json +++ b/Server/Assets/database/locales/server/sv-se.json @@ -140,8 +140,6 @@ "modloader-error_parsing_mod_load_order": "Fel vid analys av modladdningsordning", "modloader-incompatibilities_not_string_array": "Mod %s package.json-egenskapen 'incompatibilities' bör vara en strängmatris", "modloader-incompatible_mod_found": "Mod {{author}}-{{name}} är inkompatibel med {{incompatibleModName}}", - "modloader-installing_external_dependencies": "Installerar beroenden för Mod: {{name}} av: {{author}}", - "modloader-installing_external_dependencies_disabled": "Mod: {{name}} by: {{author}} kräver externa beroenden men funktionen är för närvarande inaktiverad, gå till \"{{configPath}}\", sätt \"{{configOption}}\" till true och starta om servern.\nGenom att aktivera detta accepterar du allt ansvar för vad {{name}} laddar ner till din dator.", "modloader-invalid_version_property": "Mod %s package.json innehåller en ogiltig versionssträng", "modloader-is_client_mod": "Mod (%s) är en klientmod och bör placeras i följande mapp: /spt/bepinex/plugins", "modloader-load_order_conflict": "`{{modOneName}}` och `{{modTwoName}}` har motstridiga laddordningskrav, servern kan inte starta förrän detta är fixat och kommer att stängas ner", diff --git a/Server/Assets/database/locales/server/tr.json b/Server/Assets/database/locales/server/tr.json index 7e4bf361..dd68dcb6 100644 --- a/Server/Assets/database/locales/server/tr.json +++ b/Server/Assets/database/locales/server/tr.json @@ -199,8 +199,6 @@ "modloader-error_parsing_mod_load_order": "Mod yükleme sırası ayrıştırılırken hata oluştu", "modloader-incompatibilities_not_string_array": "Mod %s package.json özelliği 'incompatibilities' bir dize dizisi olmalıdır", "modloader-incompatible_mod_found": "Mod {{author}}-{{name}}, {{incompatibleModName}} ile uyumsuz", - "modloader-installing_external_dependencies": "Mod için bağımlılıklar yükleniyor: {{name}} tarafından: {{author}}", - "modloader-installing_external_dependencies_disabled": "Mod: {{name}} tarafından: {{author}} dış bağımlılıklar gerektiriyor ancak bu özellik şu anda devre dışı, \"{{configPath}}\"e gidin, \"{{configOption}}\"ı true olarak ayarlayın ve sunucuyu yeniden başlatın.\nBunu etkinleştirerek {{name}}'in makinenize indirdikleriyle ilgili tüm sorumluluğu kabul etmiş olursunuz.", "modloader-invalid_sptVersion_field": "Mod %s, sptVersion alanında geçersiz bir semver dizesi içeriyor. Geçerli değerlere örnekler: https://github.com/npm/node-semver#versions", "modloader-invalid_version_property": "Mod %s package.json geçersiz bir sürüm dizesi içeriyor", "modloader-is_client_mod": "Mod (%s) bir istemci modudur ve aşağıdaki klasöre yerleştirilmelidir: /spt/bepinex/plugins", @@ -708,7 +706,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "SAKIN BİLDİRMEYİN", "watermark-free_of_charge": "Bu çalışma ücretsizdir", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "BU YAPIDA SUNUCU MODLAMASI DEVRE DIŞI BIRAKILMIŞTIR", "watermark-no_support": "HİÇBİR DESTEK VERİLMEYECEK", "watermark-not_an_issue": "BU BİR HATA DEĞİL", diff --git a/Server/Assets/database/locales/server/uk.json b/Server/Assets/database/locales/server/uk.json index aa829144..01c27f78 100644 --- a/Server/Assets/database/locales/server/uk.json +++ b/Server/Assets/database/locales/server/uk.json @@ -163,7 +163,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "НЕ ПОВІДОМЛЯЙТЕ ПРО ЦЕ", "watermark-free_of_charge": "Ця робота бескоштовна ", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "У ЦОМУ БІЛДІ ВИМКНЕНО МОДИНГ СЕРВЕРА", "watermark-no_support": "ЖОДНОЇ ПІДТРИМКИ НЕ БУДЕ НАДАНО", "watermark-not_an_issue": "ЦЕ НЕ ПРОБЛЕМА", diff --git a/Server/Assets/database/locales/server/zh-cn.json b/Server/Assets/database/locales/server/zh-cn.json index b886435d..53e5e434 100644 --- a/Server/Assets/database/locales/server/zh-cn.json +++ b/Server/Assets/database/locales/server/zh-cn.json @@ -199,8 +199,6 @@ "modloader-error_parsing_mod_load_order": "分析模组加载顺序时出错", "modloader-incompatibilities_not_string_array": "模组%s package.json属性“incompatibilities”应该是字符串数组", "modloader-incompatible_mod_found": "模组 {{author}}-{{name}} 不兼容 {{incompatibleModName}}", - "modloader-installing_external_dependencies": "正在安装依赖 模组:{{name}} 作者:{{author}}", - "modloader-installing_external_dependencies_disabled": "作者{{author}} 的模组{{name}} 需要下载外部(非SPT)组件才能正常运行,但目前下载机制是关闭的。需要到这里:\n”{{configPath}}”将“{{configOption}}”设置为 true,然后重启服务器。\n\n允许此下载机制代表用户对所有{{name}} 模组将要下载的文件负全部责任。", "modloader-invalid_sptVersion_field": "模组 %s 在sptVersion字段中包含无效的semver字符串。有效值示例:https://github.com/npm/node-semver#versions", "modloader-invalid_version_property": "模组 %s package.json包含无效的版本字符串", "modloader-is_client_mod": "模组 %s 是一个客户端模组,应该被放置在这个文件夹:/spt/bepinex/plugins", @@ -708,7 +706,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "不 要 报 告", "watermark-free_of_charge": "该软件免费", - "watermark-issue_tracker_url": "https://dev.sp-tarkov.com/SPT/Server/issues", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server/", "watermark-modding_disabled": "该 编 译 不 启 用 服 务 端 模 改", "watermark-no_support": "不 会 提 供 支 持", "watermark-not_an_issue": "这 不 是 个 问 题", diff --git a/Server/Assets/database/templates/customisationStorage.json b/Server/Assets/database/templates/customisationStorage.json index 33f68996..0f086eb0 100644 --- a/Server/Assets/database/templates/customisationStorage.json +++ b/Server/Assets/database/templates/customisationStorage.json @@ -1,342 +1,194 @@ -[ - { - "id": "675468bdb784110b2702fe13", - "source": "achievement", - "type": "ceiling" - }, - { - "id": "675466bcc6e063d76309c609", - "source": "achievement", - "type": "floor" - }, - { - "id": "5d1f623e86f7744bce0ef705", - "source": "unlockedInGame", - "type": "suite" - }, - { - "id": "5df8e75786f7745c67099df4", - "source": "unlockedInGame", - "type": "suite" - }, - { - "id": "5cde9e957d6c8b0474535da7", - "source": "default", - "type": "suite" - }, - { - "id": "5cde9ec17d6c8b04723cf479", - "source": "default", - "type": "suite" - }, - { - "id": "64ef3fa81a5f313cb144bf89", - "source": "unlockedInGame", - "type": "suite" - }, - { - "id": "5d1f648a86f7744bcd135841", - "source": "unlockedInGame", - "type": "suite" - }, - { - "id": "675467728b3797a0e8038bd4", - "source": "achievement", - "type": "wall" - }, - { - "id": "675467e643b934b1a7089ad3", - "source": "achievement", - "type": "wall" - }, - { - "id": "674731d1170146228c0d222a", - "source": "default", - "type": "dogTag" - }, - { - "id": "674731c8bafff850080488bb", - "source": "default", - "type": "dogTag" - }, - { - "id": "6758501933627edb710b058c", - "source": "default", - "type": "environment" - }, - { - "id": "675850678b8204ec0001936c", - "source": "default", - "type": "environment" - }, - { - "id": "67585083ff58ff0e7909e440", - "source": "default", - "type": "environment" - }, - { - "id": "67584eda8b8204ec00019362", - "source": "default", - "type": "environment" - }, - { - "id": "67519b66490b32072c06f1c9", - "source": "default", - "type": "gesture" - }, - { - "id": "67519adaba5968fd800a01f0", - "source": "default", - "type": "gesture" - }, - { - "id": "67519b33490b32072c06f1c4", - "source": "default", - "type": "gesture" - }, - { - "id": "67519afca34a61ba7f053e5c", - "source": "default", - "type": "gesture" - }, - { - "id": "67519b77a34a61ba7f053e67", - "source": "default", - "type": "gesture" - }, - { - "id": "67519b48ba5968fd800a01fa", - "source": "default", - "type": "gesture" - }, - { - "id": "67519b21ba5968fd800a01f5", - "source": "default", - "type": "gesture" - }, - { - "id": "5fdb50bb2b730a787b3f78cf", - "source": "default", - "type": "head" - }, - { - "id": "5cde96047d6c8b20b577f016", - "source": "default", - "type": "head" - }, - { - "id": "62a9e7d15ea3b87d6f642a28", - "source": "default", - "type": "head" - }, - { - "id": "6764194e4dec6d46f106f9f6", - "source": "default", - "type": "head" - }, - { - "id": "6574aabee0423b9ebe0c79cf", - "source": "default", - "type": "head" - }, - { - "id": "5fdb7571e4ed5b5ea251e529", - "source": "default", - "type": "head" - }, - { - "id": "619f9e338858a474c8685cc9", - "source": "default", - "type": "head" - }, - { - "id": "62aca6a1310e67685a2fc2e7", - "source": "default", - "type": "head" - }, - { - "id": "5cc084dd14c02e000b0550a3", - "source": "default", - "type": "head" - }, - { - "id": "5fdb4139e4ed5b5ea251e4ed", - "source": "default", - "type": "head" - }, - { - "id": "619f94f5b90286142b59d45f", - "source": "default", - "type": "head" - }, - { - "id": "5fdb5950f5264a66150d1c6e", - "source": "default", - "type": "head" - }, - { - "id": "60a6aaad42fd2735e4589978", - "source": "default", - "type": "head" - }, - { - "id": "675ac3957908e416a20861e6", - "source": "default", - "type": "head" - }, - { - "id": "60a6aa8fd559ae040d0d951f", - "source": "default", - "type": "head" - }, - { - "id": "6574aa9a1b144de18c0fba45", - "source": "default", - "type": "head" - }, - { - "id": "67604ab20aa8253ebe05fd08", - "source": "default", - "type": "mannequinPose" - }, - { - "id": "67604a9a8491fd0a830f3576", - "source": "default", - "type": "mannequinPose" - }, - { - "id": "67604aa550dfa9253901a546", - "source": "default", - "type": "mannequinPose" - }, - { - "id": "67604a890aa8253ebe05fd06", - "source": "default", - "type": "mannequinPose" - }, - { - "id": "67600aa8e9db590d5601665f", - "source": "default", - "type": "mannequinPose" - }, - { - "id": "5cd945d71388ce000a659dfb", - "source": "default", - "type": "suite" - }, - { - "id": "5cd946231388ce000d572fe3", - "source": "default", - "type": "suite" - }, - { - "id": "6284d6948e4092597733b7a5", - "source": "default", - "type": "voice" - }, - { - "id": "5fc1223595572123ae7384a3", - "source": "default", - "type": "voice" - }, - { - "id": "6284d6ab8e4092597733b7a7", - "source": "default", - "type": "voice" - }, - { - "id": "5fc50bddb4965a7a2f48c5af", - "source": "default", - "type": "voice" - }, - { - "id": "5fc614da00efd824885865c2", - "source": "default", - "type": "voice" - }, - { - "id": "668677330ae95580780867c6", - "source": "default", - "type": "voice" - }, - { - "id": "5fc615110b735e7b024c76ea", - "source": "default", - "type": "voice" - }, - { - "id": "5fc614f40b735e7b024c76e9", - "source": "default", - "type": "voice" - }, - { - "id": "5fc1221a95572123ae7384a2", - "source": "default", - "type": "voice" - }, - { - "id": "6284d67f8e4092597733b7a4", - "source": "default", - "type": "voice" - }, - { - "id": "6284d6a28e4092597733b7a6", - "source": "default", - "type": "voice" - }, - { - "id": "6751af383e9bd9caef89db33", - "source": "unlockedInGame", - "type": "wall" - }, - { - "id": "6757f8138582434245011b0b", - "source": "unlockedInGame", - "type": "shootingRangeMark" - }, - { - "id": "6757f843ef44ccd9cae9b4cd", - "source": "unlockedInGame", - "type": "shootingRangeMark" - }, - { - "id": "6757f86db8c6e4b9a80b3fd2", - "source": "unlockedInGame", - "type": "shootingRangeMark" - }, - { - "id": "6757f88b8455992ca790d75f", - "source": "unlockedInGame", - "type": "shootingRangeMark" - }, - { - "id": "6757f8a88e1a324c7432def2", - "source": "unlockedInGame", - "type": "shootingRangeMark" - }, - { - "id": "675845a78fc07a5b49df8378", - "source": "unlockedInGame", - "type": "wall" - }, - { - "id": "675846870ef524572ad413b5", - "source": "unlockedInGame", - "type": "floor" - }, - { - "id": "67584709106d54460af75877", - "source": "unlockedInGame", - "type": "floor" - }, - { - "id": "6758521199c7b5040d87468d", - "source": "unlockedInGame", - "type": "ceiling" - }, - { - "id": "67585260c0250fb99b3b9113", - "source": "unlockedInGame", - "type": "ceiling" - } -] \ No newline at end of file +[{ + "id": "674731d1170146228c0d222a", + "source": "default", + "type": "dogTag" + }, { + "id": "674731c8bafff850080488bb", + "source": "default", + "type": "dogTag" + }, { + "id": "67584eda8b8204ec00019362", + "source": "default", + "type": "environment" + }, { + "id": "675850678b8204ec0001936c", + "source": "default", + "type": "environment" + }, { + "id": "6758501933627edb710b058c", + "source": "default", + "type": "environment" + }, { + "id": "67585083ff58ff0e7909e440", + "source": "default", + "type": "environment" + }, { + "id": "67519b66490b32072c06f1c9", + "source": "default", + "type": "gesture" + }, { + "id": "67519b77a34a61ba7f053e67", + "source": "default", + "type": "gesture" + }, { + "id": "67519b48ba5968fd800a01fa", + "source": "default", + "type": "gesture" + }, { + "id": "67519b21ba5968fd800a01f5", + "source": "default", + "type": "gesture" + }, { + "id": "67519afca34a61ba7f053e5c", + "source": "default", + "type": "gesture" + }, { + "id": "67519adaba5968fd800a01f0", + "source": "default", + "type": "gesture" + }, { + "id": "67519b33490b32072c06f1c4", + "source": "default", + "type": "gesture" + }, { + "id": "6764194e4dec6d46f106f9f6", + "source": "default", + "type": "head" + }, { + "id": "5fdb50bb2b730a787b3f78cf", + "source": "default", + "type": "head" + }, { + "id": "619f94f5b90286142b59d45f", + "source": "default", + "type": "head" + }, { + "id": "5fdb4139e4ed5b5ea251e4ed", + "source": "default", + "type": "head" + }, { + "id": "62aca6a1310e67685a2fc2e7", + "source": "default", + "type": "head" + }, { + "id": "5cc084dd14c02e000b0550a3", + "source": "default", + "type": "head" + }, { + "id": "5fdb7571e4ed5b5ea251e529", + "source": "default", + "type": "head" + }, { + "id": "62a9e7d15ea3b87d6f642a28", + "source": "default", + "type": "head" + }, { + "id": "60a6aa8fd559ae040d0d951f", + "source": "default", + "type": "head" + }, { + "id": "619f9e338858a474c8685cc9", + "source": "default", + "type": "head" + }, { + "id": "60a6aaad42fd2735e4589978", + "source": "default", + "type": "head" + }, { + "id": "5cde96047d6c8b20b577f016", + "source": "default", + "type": "head" + }, { + "id": "675ac3957908e416a20861e6", + "source": "default", + "type": "head" + }, { + "id": "5fdb5950f5264a66150d1c6e", + "source": "default", + "type": "head" + }, { + "id": "6574aabee0423b9ebe0c79cf", + "source": "default", + "type": "head" + }, { + "id": "67604a890aa8253ebe05fd06", + "source": "default", + "type": "mannequinPose" + }, { + "id": "67604aa550dfa9253901a546", + "source": "default", + "type": "mannequinPose" + }, { + "id": "67604ab20aa8253ebe05fd08", + "source": "default", + "type": "mannequinPose" + }, { + "id": "67604a9a8491fd0a830f3576", + "source": "default", + "type": "mannequinPose" + }, { + "id": "67600aa8e9db590d5601665f", + "source": "default", + "type": "mannequinPose" + }, { + "id": "5cd946231388ce000d572fe3", + "source": "default", + "type": "suite" + }, { + "id": "5cde9e957d6c8b0474535da7", + "source": "default", + "type": "suite" + }, { + "id": "5cd945d71388ce000a659dfb", + "source": "default", + "type": "suite" + }, { + "id": "5cde9ec17d6c8b04723cf479", + "source": "default", + "type": "suite" + }, { + "id": "5fc615110b735e7b024c76ea", + "source": "default", + "type": "voice" + }, { + "id": "6284d6ab8e4092597733b7a7", + "source": "default", + "type": "voice" + }, { + "id": "6284d6948e4092597733b7a5", + "source": "default", + "type": "voice" + }, { + "id": "5fc1223595572123ae7384a3", + "source": "default", + "type": "voice" + }, { + "id": "5fc614f40b735e7b024c76e9", + "source": "default", + "type": "voice" + }, { + "id": "5fc1221a95572123ae7384a2", + "source": "default", + "type": "voice" + }, { + "id": "6284d6a28e4092597733b7a6", + "source": "default", + "type": "voice" + }, { + "id": "5fc50bddb4965a7a2f48c5af", + "source": "default", + "type": "voice" + }, { + "id": "5fc614da00efd824885865c2", + "source": "default", + "type": "voice" + }, { + "id": "668677330ae95580780867c6", + "source": "default", + "type": "voice" + }, { + "id": "6284d67f8e4092597733b7a4", + "source": "default", + "type": "voice" + } +] diff --git a/Server/Assets/database/templates/prestige.json b/Server/Assets/database/templates/prestige.json index 7c3d47a0..e2942701 100644 --- a/Server/Assets/database/templates/prestige.json +++ b/Server/Assets/database/templates/prestige.json @@ -29,21 +29,6 @@ "dispersion": 0, "conditionType": "Quest" }, - { - "id": "6761fe66b41bc1e8222b5b6e", - "index": 2, - "dynamicLocale": false, - "visibilityConditions": [], - "globalQuestCounterId": "", - "parentId": "", - "target": "6761f28a022f60bb320f3e95", - "status": [ - 4 - ], - "availableAfter": 0, - "dispersion": 0, - "conditionType": "Quest" - }, { "id": "675d723b026308c637193c83", "index": 3, diff --git a/Server/Assets/database/templates/profiles.json b/Server/Assets/database/templates/profiles.json index ce3dd6d8..9e9f6f7c 100644 --- a/Server/Assets/database/templates/profiles.json +++ b/Server/Assets/database/templates/profiles.json @@ -414,7 +414,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -3132,7 +3132,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -6031,7 +6031,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -9308,7 +9308,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -12674,7 +12674,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -16421,7 +16421,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -20398,7 +20398,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -24132,7 +24132,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -28152,7 +28152,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -32656,7 +32656,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -37260,7 +37260,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -38249,7 +38249,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -41252,7 +41252,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -44402,7 +44402,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -47540,7 +47540,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -50959,7 +50959,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -52355,7 +52355,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { @@ -53345,7 +53345,7 @@ "Ceiling": "673b3f977038192ee006aa09", "ShootingRangeMark": "67585d416c72998cf60ed85a" }, - "MannequinPoses": [], + "MannequinPoses": {}, "HideoutCounters": null }, "Info": { diff --git a/Server/Assets/database/templates/quests.json b/Server/Assets/database/templates/quests.json index 54666aff..0c12f837 100644 --- a/Server/Assets/database/templates/quests.json +++ b/Server/Assets/database/templates/quests.json @@ -10514,6 +10514,8 @@ "QuestName": "Trust Regain", "_id": "59c9392986f7742f6923add2", "acceptPlayerMessage": "59c9392986f7742f6923add2 acceptPlayerMessage", + "acceptanceAndFinishingSource": "eft", + "arenaLocations": [], "canShowNotificationsInGame": true, "changeQuestMessageText": "59c9392986f7742f6923add2 changeQuestMessageText", "completePlayerMessage": "59c9392986f7742f6923add2 completePlayerMessage", @@ -10714,29 +10716,35 @@ "declinePlayerMessage": "59c9392986f7742f6923add2 declinePlayerMessage", "description": "59c9392986f7742f6923add2 description", "failMessageText": "59c9392986f7742f6923add2 failMessageText", + "gameModes": [], "image": "/files/quest/icon/59c2742286f77475ec568d92.jpg", "instantComplete": false, "isKey": false, "location": "any", "name": "59c9392986f7742f6923add2 name", "note": "59c9392986f7742f6923add2 note", + "progressSource": "eft", + "rankingModes": [], "restartable": false, "rewards": { "Fail": [], "Started": [], "Success": [ { + "availableInGameEditions": [], "id": "60c8bec280b2027f403dd99c", "index": 0, "target": "54cb57776803fa99248b456e", "type": "TraderStanding", - "value": "0.25" + "unknown": false, + "value": 0.25 } ] }, "secretQuest": false, "side": "Pmc", "startedMessageText": "59c9392986f7742f6923add2 startedMessageText", + "status": 0, "successMessageText": "59c9392986f7742f6923add2 successMessageText", "traderId": "54cb57776803fa99248b456e", "type": "PickUp" @@ -18686,14 +18694,14 @@ "index": 0, "items": [ { - "_id": "677576c34ec41f3c710a5fc5", + "_id": "677e8404c035219f591a8d3f", "_tpl": "5696686a4bdc2da3298b456a", "upd": { "StackObjectsCount": 3500 } } ], - "target": "677576c34ec41f3c710a5fc5", + "target": "677e8404c035219f591a8d3f", "type": "Item", "unknown": false, "value": 3500 @@ -18705,50 +18713,50 @@ "index": 0, "items": [ { - "_id": "677576c34ec41f3c710a5fc6", + "_id": "677e8404c035219f591a8d40", "_tpl": "588892092459774ac91d4b11", "upd": { "StackObjectsCount": 1 } }, { - "_id": "677576c34ec41f3c710a5fc7", + "_id": "677e8404c035219f591a8d41", "_tpl": "5888988e24597752fe43a6fa", - "parentId": "677576c34ec41f3c710a5fc6", + "parentId": "677e8404c035219f591a8d40", "slotId": "mod_magazine" }, { - "_id": "677576c34ec41f3c710a5fc8", + "_id": "677e8404c035219f591a8d42", "_tpl": "5888945a2459774bf43ba385", - "parentId": "677576c34ec41f3c710a5fc6", + "parentId": "677e8404c035219f591a8d40", "slotId": "mod_barrel" }, { - "_id": "677576c34ec41f3c710a5fc9", + "_id": "677e8404c035219f591a8d43", "_tpl": "58889c7324597754281f9439", - "parentId": "677576c34ec41f3c710a5fc8", + "parentId": "677e8404c035219f591a8d42", "slotId": "mod_muzzle" }, { - "_id": "677576c34ec41f3c710a5fca", + "_id": "677e8404c035219f591a8d44", "_tpl": "5888961624597754281f93f3", - "parentId": "677576c34ec41f3c710a5fc8", + "parentId": "677e8404c035219f591a8d42", "slotId": "mod_bipod" }, { - "_id": "677576c34ec41f3c710a5fcb", + "_id": "677e8404c035219f591a8d45", "_tpl": "57c55f172459772d27602381", - "parentId": "677576c34ec41f3c710a5fc6", + "parentId": "677e8404c035219f591a8d40", "slotId": "mod_pistol_grip" }, { - "_id": "677576c34ec41f3c710a5fcc", + "_id": "677e8404c035219f591a8d46", "_tpl": "58889d0c2459775bc215d981", - "parentId": "677576c34ec41f3c710a5fc6", + "parentId": "677e8404c035219f591a8d40", "slotId": "mod_stock" } ], - "target": "677576c34ec41f3c710a5fc6", + "target": "677e8404c035219f591a8d40", "type": "Item", "unknown": false, "value": 1 @@ -18760,7 +18768,7 @@ "index": 0, "items": [ { - "_id": "677576c34ec41f3c710a5fcf", + "_id": "677e8404c035219f591a8d49", "_tpl": "6570254fcfc010a0f5006a22", "upd": { "SpawnedInSession": true, @@ -18768,9 +18776,9 @@ } }, { - "_id": "677576c34ec41f3c710a5fd0", + "_id": "677e8404c035219f591a8d4a", "_tpl": "5a6086ea4f39f99cd479502f", - "parentId": "677576c34ec41f3c710a5fcf", + "parentId": "677e8404c035219f591a8d49", "slotId": "cartridges", "upd": { "SpawnedInSession": true, @@ -18778,7 +18786,7 @@ } }, { - "_id": "677576c34ec41f3c710a5fd1", + "_id": "677e8404c035219f591a8d4b", "_tpl": "6570254fcfc010a0f5006a22", "upd": { "SpawnedInSession": true, @@ -18786,9 +18794,9 @@ } }, { - "_id": "677576c34ec41f3c710a5fd2", + "_id": "677e8404c035219f591a8d4c", "_tpl": "5a6086ea4f39f99cd479502f", - "parentId": "677576c34ec41f3c710a5fd1", + "parentId": "677e8404c035219f591a8d4b", "slotId": "cartridges", "upd": { "SpawnedInSession": true, @@ -18796,7 +18804,7 @@ } }, { - "_id": "677576c34ec41f3c710a5fd3", + "_id": "677e8404c035219f591a8d4d", "_tpl": "6570254fcfc010a0f5006a22", "upd": { "SpawnedInSession": true, @@ -18804,9 +18812,9 @@ } }, { - "_id": "677576c34ec41f3c710a5fd4", + "_id": "677e8404c035219f591a8d4e", "_tpl": "5a6086ea4f39f99cd479502f", - "parentId": "677576c34ec41f3c710a5fd3", + "parentId": "677e8404c035219f591a8d4d", "slotId": "cartridges", "upd": { "SpawnedInSession": true, @@ -18814,7 +18822,7 @@ } } ], - "target": "677576c34ec41f3c710a5fd3", + "target": "677e8404c035219f591a8d4d", "type": "Item", "unknown": false, "value": 3 @@ -18825,7 +18833,7 @@ "index": 0, "items": [ { - "_id": "677576c34ec41f3c710a5fd5", + "_id": "677e8404c035219f591a8d4f", "_tpl": "5e81ebcd8e146c7080625e15", "upd": { "FireMode": { @@ -18837,14 +18845,14 @@ } }, { - "_id": "677576c34ec41f3c710a5fd6", + "_id": "677e8404c035219f591a8d50", "_tpl": "571659bb2459771fb2755a12", - "parentId": "677576c34ec41f3c710a5fd5", + "parentId": "677e8404c035219f591a8d4f", "slotId": "mod_pistol_grip" } ], "loyaltyLevel": 4, - "target": "677576c34ec41f3c710a5fd5", + "target": "677e8404c035219f591a8d4f", "traderId": "5935c25fb3acc3127c3d8cd9", "type": "AssortmentUnlock", "unknown": false @@ -18855,40 +18863,16 @@ "index": 0, "items": [ { - "_id": "677576c34ec41f3c710a5fd8", - "_tpl": "5a608bf24f39f98ffc77720e", + "_id": "677e8404c035219f591a8d52", + "_tpl": "5a6086ea4f39f99cd479502f", "upd": { "SpawnedInSession": true, "StackObjectsCount": 40 } }, { - "_id": "677576c34ec41f3c710a5fd9", - "_tpl": "5a608bf24f39f98ffc77720e", - "upd": { - "SpawnedInSession": true, - "StackObjectsCount": 40 - } - }, - { - "_id": "677576c34ec41f3c710a5fda", - "_tpl": "5a608bf24f39f98ffc77720e", - "upd": { - "SpawnedInSession": true, - "StackObjectsCount": 40 - } - }, - { - "_id": "677576c34ec41f3c710a5fdb", - "_tpl": "5a608bf24f39f98ffc77720e", - "upd": { - "SpawnedInSession": true, - "StackObjectsCount": 40 - } - }, - { - "_id": "677576c34ec41f3c710a5fdc", - "_tpl": "5a608bf24f39f98ffc77720e", + "_id": "677e8404c035219f591a8d53", + "_tpl": "5a6086ea4f39f99cd479502f", "upd": { "SpawnedInSession": true, "StackObjectsCount": 40 @@ -18896,7 +18880,7 @@ } ], "loyaltyLevel": 3, - "target": "677576c34ec41f3c710a5fdc", + "target": "677e8404c035219f591a8d53", "traderId": 10, "type": "ProductionScheme", "unknown": false @@ -48307,21 +48291,6 @@ "target": "675c1cf4a757ddd00404f0a3", "visibilityConditions": [] }, - { - "availableAfter": 0, - "conditionType": "Quest", - "dispersion": 0, - "dynamicLocale": false, - "globalQuestCounterId": "", - "id": "676d1fdeb4a25ae18394fdcd", - "index": 132, - "parentId": "", - "status": [ - 4 - ], - "target": "675c15fbf7da9792a4059871", - "visibilityConditions": [] - }, { "availableAfter": 0, "conditionType": "Quest", @@ -76652,6 +76621,8 @@ "QuestName": "Make Amends - Buyout", "_id": "626148251ed3bb5bcc5bd9ed", "acceptPlayerMessage": "626148251ed3bb5bcc5bd9ed acceptPlayerMessage", + "acceptanceAndFinishingSource": "eft", + "arenaLocations": [], "canShowNotificationsInGame": true, "changeQuestMessageText": "626148251ed3bb5bcc5bd9ed changeQuestMessageText", "completePlayerMessage": "626148251ed3bb5bcc5bd9ed completePlayerMessage", @@ -76672,7 +76643,7 @@ "target": [ "5449016a4bdc2d6f028b456f" ], - "value": "1000000", + "value": 1000000, "visibilityConditions": [] } ], @@ -76688,6 +76659,22 @@ "target": "638f541a29ffd1183d187f57", "value": 0, "visibilityConditions": [] + }, + { + "availableAfter": 0, + "conditionType": "Quest", + "dispersion": 0, + "dynamicLocale": false, + "globalQuestCounterId": "", + "id": "639c6708dae1800a3e1359af", + "index": 0, + "parentId": "", + "status": [ + 4, + 5 + ], + "target": "625d700cc48e6c62a440fab5", + "visibilityConditions": [] } ], "Fail": [] @@ -76695,29 +76682,35 @@ "declinePlayerMessage": "626148251ed3bb5bcc5bd9ed declinePlayerMessage", "description": "626148251ed3bb5bcc5bd9ed description", "failMessageText": "626148251ed3bb5bcc5bd9ed failMessageText", + "gameModes": [], "image": "/files/quest/icon/5ac4dbb086f7743e7c61ca09.jpg", "instantComplete": false, "isKey": false, "location": "any", "name": "626148251ed3bb5bcc5bd9ed name", "note": "626148251ed3bb5bcc5bd9ed note", + "progressSource": "eft", + "rankingModes": [], "restartable": false, "rewards": { "Fail": [], "Started": [], "Success": [ { + "availableInGameEditions": [], "id": "63ab697e87413d64ae0ac213", "index": 0, "target": "638f541a29ffd1183d187f57", "type": "TraderStanding", - "value": "0.01" + "unknown": false, + "value": 0.01 } ] }, "secretQuest": false, "side": "Pmc", "startedMessageText": "626148251ed3bb5bcc5bd9ed startedMessageText", + "status": 0, "successMessageText": "626148251ed3bb5bcc5bd9ed successMessageText", "traderId": "5a7c2eca46aef81a7ca2145d", "type": "Loyalty" @@ -76726,6 +76719,8 @@ "QuestName": "Make Amends - Equipment", "_id": "6261482fa4eb80027c4f2e11", "acceptPlayerMessage": "6261482fa4eb80027c4f2e11 acceptPlayerMessage", + "acceptanceAndFinishingSource": "eft", + "arenaLocations": [], "canShowNotificationsInGame": true, "changeQuestMessageText": "6261482fa4eb80027c4f2e11 changeQuestMessageText", "completePlayerMessage": "6261482fa4eb80027c4f2e11 completePlayerMessage", @@ -76746,7 +76741,7 @@ "target": [ "5c46fbd72e2216398b5a8c9c" ], - "value": "4", + "value": 4, "visibilityConditions": [] } ], @@ -76772,29 +76767,35 @@ "declinePlayerMessage": "6261482fa4eb80027c4f2e11 declinePlayerMessage", "description": "6261482fa4eb80027c4f2e11 description", "failMessageText": "6261482fa4eb80027c4f2e11 failMessageText", + "gameModes": [], "image": "/files/quest/icon/5ac4dbb086f7743e7c61ca09.jpg", "instantComplete": false, "isKey": false, "location": "any", "name": "6261482fa4eb80027c4f2e11 name", "note": "6261482fa4eb80027c4f2e11 note", + "progressSource": "eft", + "rankingModes": [], "restartable": false, "rewards": { "Fail": [], "Started": [], "Success": [ { + "availableInGameEditions": [], "id": "63ab698b3606f31cf40e5ae0", "index": 0, "target": "638f541a29ffd1183d187f57", "type": "TraderStanding", - "value": "0.01" + "unknown": false, + "value": 0.01 } ] }, "secretQuest": false, "side": "Pmc", "startedMessageText": "6261482fa4eb80027c4f2e11 startedMessageText", + "status": 0, "successMessageText": "6261482fa4eb80027c4f2e11 successMessageText", "traderId": "5a7c2eca46aef81a7ca2145d", "type": "PickUp" @@ -82928,6 +82929,8 @@ "QuestName": "Make Amends", "_id": "6391d90f4ed9512be67647df", "acceptPlayerMessage": "6391d90f4ed9512be67647df acceptPlayerMessage", + "acceptanceAndFinishingSource": "eft", + "arenaLocations": [], "canShowNotificationsInGame": true, "changeQuestMessageText": "6391d90f4ed9512be67647df changeQuestMessageText", "completePlayerMessage": "6391d90f4ed9512be67647df completePlayerMessage", @@ -82942,14 +82945,14 @@ "id": "6391d9ba4b15ca31f76bc325", "index": 0, "isEncoded": false, - "maxDurability": "100", - "minDurability": "0", + "maxDurability": 100, + "minDurability": 0, "onlyFoundInRaid": false, "parentId": "", "target": [ "6331bb0d1aa9f42b804997a6" ], - "value": "1", + "value": 1, "visibilityConditions": [] }, { @@ -82961,14 +82964,14 @@ "id": "6391d9e7ee79ee703e3012e5", "index": 1, "isEncoded": true, - "maxDurability": "100", - "minDurability": "0", + "maxDurability": 100, + "minDurability": 0, "onlyFoundInRaid": false, "parentId": "", "target": [ "62e910aaf957f2915e0a5e36" ], - "value": "1", + "value": 1, "visibilityConditions": [ { "conditionType": "CompleteCondition", @@ -82992,7 +82995,7 @@ "target": [ "6331bb0d1aa9f42b804997a6" ], - "value": "1", + "value": 1, "visibilityConditions": [ { "conditionType": "CompleteCondition", @@ -83002,6 +83005,7 @@ ] }, { + "completeInSeconds": 0, "conditionType": "CounterCreator", "counter": { "conditions": [ @@ -83010,7 +83014,7 @@ "dynamicLocale": false, "id": "63ab6aa8e842787ad213571b", "target": "meh_50_visit_area_check_1", - "value": "1" + "value": 1 } ], "id": "63ab6a89e842787ad213571a" @@ -83020,10 +83024,12 @@ "globalQuestCounterId": "", "id": "63ab6a89e842787ad2135719", "index": 4, + "isNecessary": false, + "isResetOnConditionFailed": false, "oneSessionOnly": false, "parentId": "", "type": "Exploration", - "value": "1", + "value": 1, "visibilityConditions": [ { "conditionType": "CompleteCondition", @@ -83055,6 +83061,7 @@ "compareMethod": "<=", "conditionType": "TraderStanding", "dynamicLocale": false, + "globalQuestCounterId": "", "id": "63a6c752d4153566a073285a", "index": 0, "parentId": "", @@ -83067,37 +83074,46 @@ "declinePlayerMessage": "6391d90f4ed9512be67647df declinePlayerMessage", "description": "6391d90f4ed9512be67647df description", "failMessageText": "6391d90f4ed9512be67647df failMessageText", + "gameModes": [], "image": "/files/quest/icon/5ac4dbb086f7743e7c61ca09.jpg", "instantComplete": false, "isKey": false, "location": "5704e4dad2720bb55b8b4567", "name": "6391d90f4ed9512be67647df name", "note": "6391d90f4ed9512be67647df note", + "progressSource": "eft", + "rankingModes": [], "restartable": false, "rewards": { "Fail": [ { + "availableInGameEditions": [], "id": "63a6c78d0530a47cb931859a", "index": 0, "target": "5a7c2eca46aef81a7ca2145d", "type": "TraderStanding", - "value": "-0.02" + "unknown": false, + "value": -0.02 } ], "Started": [], "Success": [ { + "availableInGameEditions": [], "id": "63ab69f61287ef0b827d0c94", "index": 0, "target": "5a7c2eca46aef81a7ca2145d", "type": "TraderStanding", - "value": "0.01" + "unknown": false, + "value": 0.01 }, { + "availableInGameEditions": [], "id": "63ab69fbe842787ad2135718", "index": 1, "target": "638f541a29ffd1183d187f57", "type": "TraderStandingRestore", + "unknown": false, "value": 0.01 } ] @@ -83105,6 +83121,7 @@ "secretQuest": false, "side": "Pmc", "startedMessageText": "6391d90f4ed9512be67647df startedMessageText", + "status": 0, "successMessageText": "6391d90f4ed9512be67647df successMessageText", "traderId": "5a7c2eca46aef81a7ca2145d", "type": "Multi" @@ -110836,62 +110853,25 @@ }, { "availableInGameEditions": [ - "tournament_live", - "tournament", - "standard", - "press_edition", - "left_behind", - "prepare_for_escape", - "exhibition", - "edge_of_darkness", - "develop" + "eod_tue_edition", + "unheard_edition" ], "findInRaid": false, - "id": "6682b19d36c4afb83a0ff0d9", + "id": "6682b16a75d2dfc8330a07e7", "index": 0, "items": [ { - "_id": "677576c34ec41f3c710a6bee", + "_id": "677e990da03da7967902c54c", "_tpl": "569668774bdc2da2298b4568", "upd": { - "StackObjectsCount": 2000 + "StackObjectsCount": 6000 } } ], - "target": "677576c34ec41f3c710a6bee", + "target": "677e990da03da7967902c54c", "type": "Item", "unknown": false, - "value": 2000 - }, - { - "availableInGameEditions": [ - "develop", - "edge_of_darkness", - "exhibition", - "left_behind", - "prepare_for_escape", - "press_edition", - "standard", - "tournament_live", - "tournament" - ], - "findInRaid": true, - "id": "66797fc869825e8dc200217c", - "index": 0, - "items": [ - { - "_id": "677576c34ec41f3c710a6bf0", - "_tpl": "65ddcc9cfa85b9f17d0dfb07", - "upd": { - "SpawnedInSession": true, - "StackObjectsCount": 1 - } - } - ], - "target": "677576c34ec41f3c710a6bf0", - "type": "Item", - "unknown": false, - "value": 1 + "value": 6000 } ] }, diff --git a/Server/Program.cs b/Server/Program.cs index d3f74c21..468e87f3 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -1,12 +1,10 @@ -using System.Reflection; +using System.Reflection; using Core.Annotations; using Core.Context; -using Core.Models.Enums; using Core.Models.External; using Core.Models.Spt.Config; using Core.Servers; using Core.Utils; -using Microsoft.Extensions.Logging.Configuration; using Serilog; using Serilog.Events; using Serilog.Exceptions; @@ -27,6 +25,8 @@ public static class Program CreateAndRegisterLogger(builder, out var registeredLogger); + ProgramStatics.Initialize(); + RegisterSptComponents(builder.Services); RegisterModOverrideComponents(builder.Services, assemblies); ILogger logger = new SerilogLoggerProvider(registeredLogger).CreateLogger("Server"); @@ -56,7 +56,7 @@ public static class Program var httpConfig = serviceProvider.GetService().GetConfig(); // When we application gets started by the HttpServer it will add into the AppContext the WebApplication // object, which we can use here to start the webapp. - (appContext.GetLatestValue(ContextVariableType.WEB_APPLICATION).Value as WebApplication).Run($"http://{httpConfig.Ip}:{httpConfig.Port}"); + (appContext.GetLatestValue(ContextVariableType.WEB_APPLICATION).GetValue()).Run($"http://{httpConfig.Ip}:{httpConfig.Port}"); } catch (Exception ex) { diff --git a/Server/ProgramStatics.cs b/Server/ProgramStatics.cs new file mode 100644 index 00000000..720fffd7 --- /dev/null +++ b/Server/ProgramStatics.cs @@ -0,0 +1,103 @@ +namespace Server +{ + public static class ProgramStatics + { + private static EntryType _entryType; + + private static bool _debug; + private static bool _compiled; + private static bool _mods; + + private static string _sptVersion; + private static string _commit; + private static double _buildTime; + + private static BuildInfo buildInfo; // TODO get from buildinfo.json + + public static void Initialize() + { + buildInfo = new BuildInfo(); + ProgramStatics._entryType = buildInfo.entryType.GetValueOrDefault(EntryType.LOCAL); + + switch (ProgramStatics._entryType) + { + case EntryType.RELEASE: + _debug = false; + _compiled = true; + _mods = true; + break; + case EntryType.BLEEDING_EDGE: + _debug = true; + _compiled = true; + _mods = false; + break; + case EntryType.DEBUG: + case EntryType.BLEEDING_EDGE_MODS: + _debug = true; + _compiled = true; + _mods = true; + break; + case EntryType.LOCAL: + default: // EntryType.LOCAL + _debug = true; + _compiled = false; + _mods = true; + break; + } + } + + // Public Static Getters + public static EntryType ENTRY_TYPE() + { + return _entryType; + } + public static bool DEBUG() + { + return ProgramStatics._debug; + } + public static bool COMPILED() + { + return ProgramStatics._compiled; + } + public static bool MODS() + { + return ProgramStatics._mods; + } + public static string SPT_VERSION() + { + return ProgramStatics._sptVersion; + } + public static string COMMIT() + { + return ProgramStatics._commit; + } + public static double BUILD_TIME() + { + return ProgramStatics._buildTime; + } + } + + public enum EntryType + { + LOCAL, + DEBUG, + RELEASE, + BLEEDING_EDGE, + BLEEDING_EDGE_MODS + } + + public class BuildInfo + { + public BuildInfo() + { + sptVersion = ""; + commit = ""; + buildTime = 0; + } + + public EntryType? entryType { get; set; } + public string? sptVersion { get; set; } + public string? commit { get; set; } + public double? buildTime { get; set; } + } +} diff --git a/UnitTests/Tests/Utils/HashUtilTests.cs b/UnitTests/Tests/Utils/HashUtilTests.cs index d6f91006..f6550a5a 100644 --- a/UnitTests/Tests/Utils/HashUtilTests.cs +++ b/UnitTests/Tests/Utils/HashUtilTests.cs @@ -5,52 +5,52 @@ namespace UnitTests.Tests.Utils; [TestClass] public class HashUtilTests { - private readonly HashUtil _hashUtil = new(new RandomUtil()); - - [TestMethod] - public void GenerateTest() - { - // Generate 100 MongoId's - for (var i = 0; i < 100; i++) - { - // Invalid mongoId character - var result = _hashUtil.Generate(); - - // Invalid mongoId length - var test = _hashUtil.IsValidMongoId(result); - - Assert.AreEqual( - true, - test, - $"IsValidMongoId() `{result}` is not a valid MongoId."); - } - } - - [TestMethod] - public void IsValidMongoIdTest() - { - // Invalid mongoId character - var ResultBadChar = _hashUtil.IsValidMongoId("677ddb67406e9918a0264bbz"); - - Assert.AreEqual( - false, - ResultBadChar, - "IsValidMongoId() `677ddb67406e9918a0264bbz` contains invalid char `z`, but result was true"); - - // Invalid mongoId length - var resultBadLength = _hashUtil.IsValidMongoId("677ddb67406e9918a0264bbcc"); - - Assert.AreEqual( - false, - resultBadLength, - "IsValidMongoId() `677ddb67406e9918a0264bbcc` is 25 characters, but result was true"); - - // Valid mongoId - var resultPass = _hashUtil.IsValidMongoId("677ddb67406e9918a0264bbc"); - - Assert.AreEqual( - true, - resultPass, - "IsValidMongoId() `677ddb67406e9918a0264bbc` is a valid mongoId, but result was false"); - } -} \ No newline at end of file + // private readonly HashUtil _hashUtil = new(new RandomUtil()); + // + // [TestMethod] + // public void GenerateTest() + // { + // // Generate 100 MongoId's + // for (var i = 0; i < 100; i++) + // { + // // Invalid mongoId character + // var result = _hashUtil.Generate(); + // + // // Invalid mongoId length + // var test = _hashUtil.IsValidMongoId(result); + // + // Assert.AreEqual( + // true, + // test, + // $"IsValidMongoId() `{result}` is not a valid MongoId."); + // } + // } + // + // [TestMethod] + // public void IsValidMongoIdTest() + // { + // // Invalid mongoId character + // var ResultBadChar = _hashUtil.IsValidMongoId("677ddb67406e9918a0264bbz"); + // + // Assert.AreEqual( + // false, + // ResultBadChar, + // "IsValidMongoId() `677ddb67406e9918a0264bbz` contains invalid char `z`, but result was true"); + // + // // Invalid mongoId length + // var resultBadLength = _hashUtil.IsValidMongoId("677ddb67406e9918a0264bbcc"); + // + // Assert.AreEqual( + // false, + // resultBadLength, + // "IsValidMongoId() `677ddb67406e9918a0264bbcc` is 25 characters, but result was true"); + // + // // Valid mongoId + // var resultPass = _hashUtil.IsValidMongoId("677ddb67406e9918a0264bbc"); + // + // Assert.AreEqual( + // true, + // resultPass, + // "IsValidMongoId() `677ddb67406e9918a0264bbc` is a valid mongoId, but result was false"); + // } +} diff --git a/UnitTests/Tests/Utils/RandomUtilTests.cs b/UnitTests/Tests/Utils/RandomUtilTests.cs index 23a6d95d..9e18760a 100644 --- a/UnitTests/Tests/Utils/RandomUtilTests.cs +++ b/UnitTests/Tests/Utils/RandomUtilTests.cs @@ -5,179 +5,179 @@ namespace UnitTests.Tests.Utils; [TestClass] public sealed class RandomUtilTests { - private readonly RandomUtil _randomUtil = new(); - - [TestMethod] - public void GetIntTest() - { - // Run 100 test cases - for (var i = 0; i < 100; i++) - { - var result = _randomUtil.GetInt(0, 10); - - if (result < 0 || result > 10) - { - Assert.Fail($"GetInt(0, 10) out of range. Expected range [0, 10] but was {result}."); - } - } - } - - [TestMethod] - public void GetIntExTest() - { - // Run 100 test cases - for (var i = 0; i < 100; i++) - { - var result = _randomUtil.GetIntEx(10); - - if (result < 1 || result > 9) - { - Assert.Fail($"GetInt(10) out of range. Expected range [1, 9] but was {result}."); - } - } - } - - [TestMethod] - public void GetFloatTest() - { - // Run 100 test cases - for (var i = 0; i < 100; i++) - { - var result = _randomUtil.GetFloat(0f, 10f); - - if (result < 0f || result >= 9f) - { - Assert.Fail($"GetFloat(0f, 10f) out of range. Expected range [0.0f, 9.999f] but was {result}."); - } - } - } - - [TestMethod] - public void GetPercentOfValueTest() - { - const float expected = 45.5f; - var result = _randomUtil.GetPercentOfValue(45.5f, 100f); - - Assert.AreEqual( - expected, - result, - 0.0001f, - $"GetPercentOfValue(45.5f, 100f) out of range. Expected: {expected}. Actual: {result}."); - } - - [TestMethod] - public void ReduceValueByPercentTest() - { - const float expected = 54.5f; - var result = _randomUtil.ReduceValueByPercent(100f, 45.5f); - - Assert.AreEqual( - expected, - result, - 0.0001f, - $"ReduceValueByPercent(100f, 45.5f) out of range. Expected: {expected}. Actual: {result}."); - } - - [TestMethod] - public void GetChance100Test() - { - for (var i = 0; i < 100; i++) - { - const bool expectedTrue = true; - var resultTrue = _randomUtil.GetChance100(100f); - - Assert.AreEqual( - expectedTrue, - resultTrue, - $"GetChance100(100f) out of range. Expected: {expectedTrue}. Actual: {resultTrue}."); - } - - for (var i = 0; i < 100; i++) - { - const bool expectedFalse = false; - var resultFalse = _randomUtil.GetChance100(0f); - - Assert.AreEqual( - expectedFalse, - resultFalse, - $"GetChance100(0f) out of range. Expected: {expectedFalse}. Actual: {resultFalse}."); - } - } - - // TODO: Missing methods between these two - - [TestMethod] - public void RandIntTest() - { - for (var i = 0; i < 100; i++) - { - var result = _randomUtil.RandInt(0, 10); - - if (result < 0 || result > 9) - { - Assert.Fail($"RandInt(0, 10) out of range. Expected range [0, 9] but was {result}."); - } - } - - for (var i = 0; i < 100; i++) - { - var result = _randomUtil.RandInt(10); - - if (result < 0 || result > 9) - { - Assert.Fail($"RandInt(10, null) out of range. Expected range [0, 9] but was {result}."); - } - } - } - - [TestMethod] - public void RandNumTest() - { - for (var i = 0; i < 100; i++) - { - var result = _randomUtil.RandNum(0, 10); - - if (result < 0 || result > 9) - { - Assert.Fail($"RandNum(0, 10) out of range. Expected range [0, 9.999d] but was {result}."); - } - - if (_randomUtil.GetNumberPrecision(result) > RandomUtil.MaxSignificantDigits) - { - Assert.Fail($"RandNum(0, 10) precision of {result} exceeds the allowable precision ({RandomUtil.MaxSignificantDigits}) for the given values."); - } - } - - for (var i = 0; i < 100; i++) - { - var result = _randomUtil.RandNum(10); - - if (result < 0 || result > 9) - { - Assert.Fail($"RandNum(10) out of range. Expected range [0, 9.999d] but was {result}."); - } - - if (_randomUtil.GetNumberPrecision(result) > RandomUtil.MaxSignificantDigits) - { - Assert.Fail($"RandNum(10) precision of {result} exceeds the allowable precision ({RandomUtil.MaxSignificantDigits}) for the given values."); - } - } - } - - [TestMethod] - public void ShuffleTest() - { - var testList = new List() - { - 1,2,3,4,5,6,7,8,9,10 - }; - - var orig = new List(testList); - - var result = _randomUtil.Shuffle(testList); - - Assert.IsFalse( - result.SequenceEqual(orig), - $"Shuffle test failed. Expected: {string.Join(", ", orig)}, but got {string.Join(", ", result)}"); - } -} \ No newline at end of file + // private readonly RandomUtil _randomUtil = new(); + // + // [TestMethod] + // public void GetIntTest() + // { + // // Run 100 test cases + // for (var i = 0; i < 100; i++) + // { + // var result = _randomUtil.GetInt(0, 10); + // + // if (result < 0 || result > 10) + // { + // Assert.Fail($"GetInt(0, 10) out of range. Expected range [0, 10] but was {result}."); + // } + // } + // } + // + // [TestMethod] + // public void GetIntExTest() + // { + // // Run 100 test cases + // for (var i = 0; i < 100; i++) + // { + // var result = _randomUtil.GetIntEx(10); + // + // if (result < 1 || result > 9) + // { + // Assert.Fail($"GetInt(10) out of range. Expected range [1, 9] but was {result}."); + // } + // } + // } + // + // [TestMethod] + // public void GetFloatTest() + // { + // // Run 100 test cases + // for (var i = 0; i < 100; i++) + // { + // var result = _randomUtil.GetFloat(0f, 10f); + // + // if (result < 0f || result >= 9f) + // { + // Assert.Fail($"GetFloat(0f, 10f) out of range. Expected range [0.0f, 9.999f] but was {result}."); + // } + // } + // } + // + // [TestMethod] + // public void GetPercentOfValueTest() + // { + // const float expected = 45.5f; + // var result = _randomUtil.GetPercentOfValue(45.5f, 100f); + // + // Assert.AreEqual( + // expected, + // result, + // 0.0001f, + // $"GetPercentOfValue(45.5f, 100f) out of range. Expected: {expected}. Actual: {result}."); + // } + // + // [TestMethod] + // public void ReduceValueByPercentTest() + // { + // const float expected = 54.5f; + // var result = _randomUtil.ReduceValueByPercent(100f, 45.5f); + // + // Assert.AreEqual( + // expected, + // result, + // 0.0001f, + // $"ReduceValueByPercent(100f, 45.5f) out of range. Expected: {expected}. Actual: {result}."); + // } + // + // [TestMethod] + // public void GetChance100Test() + // { + // for (var i = 0; i < 100; i++) + // { + // const bool expectedTrue = true; + // var resultTrue = _randomUtil.GetChance100(100f); + // + // Assert.AreEqual( + // expectedTrue, + // resultTrue, + // $"GetChance100(100f) out of range. Expected: {expectedTrue}. Actual: {resultTrue}."); + // } + // + // for (var i = 0; i < 100; i++) + // { + // const bool expectedFalse = false; + // var resultFalse = _randomUtil.GetChance100(0f); + // + // Assert.AreEqual( + // expectedFalse, + // resultFalse, + // $"GetChance100(0f) out of range. Expected: {expectedFalse}. Actual: {resultFalse}."); + // } + // } + // + // // TODO: Missing methods between these two + // + // [TestMethod] + // public void RandIntTest() + // { + // for (var i = 0; i < 100; i++) + // { + // var result = _randomUtil.RandInt(0, 10); + // + // if (result < 0 || result > 9) + // { + // Assert.Fail($"RandInt(0, 10) out of range. Expected range [0, 9] but was {result}."); + // } + // } + // + // for (var i = 0; i < 100; i++) + // { + // var result = _randomUtil.RandInt(10); + // + // if (result < 0 || result > 9) + // { + // Assert.Fail($"RandInt(10, null) out of range. Expected range [0, 9] but was {result}."); + // } + // } + // } + // + // [TestMethod] + // public void RandNumTest() + // { + // for (var i = 0; i < 100; i++) + // { + // var result = _randomUtil.RandNum(0, 10); + // + // if (result < 0 || result > 9) + // { + // Assert.Fail($"RandNum(0, 10) out of range. Expected range [0, 9.999d] but was {result}."); + // } + // + // if (_randomUtil.GetNumberPrecision(result) > RandomUtil.MaxSignificantDigits) + // { + // Assert.Fail($"RandNum(0, 10) precision of {result} exceeds the allowable precision ({RandomUtil.MaxSignificantDigits}) for the given values."); + // } + // } + // + // for (var i = 0; i < 100; i++) + // { + // var result = _randomUtil.RandNum(10); + // + // if (result < 0 || result > 9) + // { + // Assert.Fail($"RandNum(10) out of range. Expected range [0, 9.999d] but was {result}."); + // } + // + // if (_randomUtil.GetNumberPrecision(result) > RandomUtil.MaxSignificantDigits) + // { + // Assert.Fail($"RandNum(10) precision of {result} exceeds the allowable precision ({RandomUtil.MaxSignificantDigits}) for the given values."); + // } + // } + // } + // + // [TestMethod] + // public void ShuffleTest() + // { + // var testList = new List() + // { + // 1,2,3,4,5,6,7,8,9,10 + // }; + // + // var orig = new List(testList); + // + // var result = _randomUtil.Shuffle(testList); + // + // Assert.IsFalse( + // result.SequenceEqual(orig), + // $"Shuffle test failed. Expected: {string.Join(", ", orig)}, but got {string.Join(", ", result)}"); + // } +}