0
0
mirror of https://github.com/sp-tarkov/server.git synced 2025-02-13 09:50:43 -05:00

Add 2023 haloween event system

Event bots are generated from their base type, then their role is updated before being sent to the client e.g. peacefullZryachiyEvent becomes bossZryachiy for generation, then back to peacefullZryachiyEvent
This commit is contained in:
Dev 2023-11-02 15:02:18 +00:00
parent 9949d3c7ff
commit 981da646b0
14 changed files with 15343 additions and 8660 deletions

View File

@ -36,6 +36,9 @@
"crazyAssaultEvent": 15,
"bossBoar": 5,
"bossBoarSniper": 5,
"peacefullZryachiyEvent": 5,
"sectactPriestEvent": 20,
"ravangeZryachiyEvent": 25,
"sptUsec": 30,
"sptBear": 30
},

View File

@ -13,7 +13,7 @@
"62a5c333ec21e50cad3b5dc6": 1500,
"62a5c41e8ec41a51b34739c3": 1500,
"635267ab3c89e2112001f826": 1500,
"5e54f79686f7744022011103": 1500
"5e54f79686f7744022011103": 1500
},
"Headwear": {
"59ef13ca86f77445fd0e2483": 1500
@ -24,8 +24,8 @@
"63495c500c297e20065a08b1": 10
}
},
"bear": {
"FaceCover": {
"bear": {
"FaceCover": {
"5bd071d786f7747e707b93a3": 5,
"5bd0716d86f774171822ef4b": 5,
"5bd06f5d86f77427101ad47c": 5,
@ -35,14 +35,14 @@
"62a5c333ec21e50cad3b5dc6": 5,
"62a5c41e8ec41a51b34739c3": 5,
"635267ab3c89e2112001f826": 5,
"5e54f79686f7744022011103": 5
"5e54f79686f7744022011103": 5
},
"Headwear": {
"59ef13ca86f77445fd0e2483": 25
}
},
"usec": {
"FaceCover": {
},
"usec": {
"FaceCover": {
"5bd071d786f7747e707b93a3": 5,
"5bd0716d86f774171822ef4b": 5,
"5bd06f5d86f77427101ad47c": 5,
@ -52,12 +52,12 @@
"62a5c333ec21e50cad3b5dc6": 5,
"62a5c41e8ec41a51b34739c3": 5,
"635267ab3c89e2112001f826": 5,
"5e54f79686f7744022011103": 5
"5e54f79686f7744022011103": 5
},
"Headwear": {
"59ef13ca86f77445fd0e2483": 25
}
}
}
},
"christmas": {
"bossgluhar": {
@ -96,7 +96,7 @@
"5a43957686f7742a2c2f11b0": 3
}
},
"bossboar": {
"bossboar": {
"FaceCover": {
"5c1a1e3f2e221602b66cc4c2": 1
},
@ -132,11 +132,11 @@
"5a43957686f7742a2c2f11b0": 600
}
},
"followerboar": {
"followerboar": {
"FaceCover": {
"5c1a1e3f2e221602b66cc4c2": 250
},
"Headwear": {
"Headwear": {
"5a43943586f77416ad2f06e2": 3,
"5a43957686f7742a2c2f11b0": 3
}
@ -231,6 +231,387 @@
}
}
},
"eventBotMapping": {
"peacefullZryachiyEvent": "bossZryachiy",
"sectactPriestEvent": "sectantPriest",
"ravangeZryachiyEvent": "bossZryachiy",
"arenaFighterEvent": "arenaFighterEvent"
},
"eventBossSpawns": {
"halloween": {
"bigmap": [{
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "0",
"BossEscortDifficult": "normal",
"BossEscortType": "peacefullZryachiyEvent",
"BossName": "peacefullZryachiyEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 0,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": -1,
"TriggerId": "",
"TriggerName": ""
}, {
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "5",
"BossEscortDifficult": "normal",
"BossEscortType": "sectactPriestEvent",
"BossName": "sectactPriestEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 25,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": 999999,
"TriggerId": "ZryachiyPeaceKill",
"TriggerName": "botEvent"
}, {
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "0",
"BossEscortDifficult": "normal",
"BossEscortType": "ravangeZryachiyEvent",
"BossName": "ravangeZryachiyEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 0,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": 99999,
"TriggerId": "SummonComplete",
"TriggerName": "botEvent"
}
],
"interchange": [{
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "0",
"BossEscortDifficult": "normal",
"BossEscortType": "peacefullZryachiyEvent",
"BossName": "peacefullZryachiyEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 0,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": -1,
"TriggerId": "",
"TriggerName": ""
}, {
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "5",
"BossEscortDifficult": "normal",
"BossEscortType": "sectactPriestEvent",
"BossName": "sectactPriestEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 25,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": 999999,
"TriggerId": "ZryachiyPeaceKill",
"TriggerName": "botEvent"
}, {
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "0",
"BossEscortDifficult": "normal",
"BossEscortType": "ravangeZryachiyEvent",
"BossName": "ravangeZryachiyEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 0,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": 99999,
"TriggerId": "SummonComplete",
"TriggerName": "botEvent"
}
],
"lighthouse": [{
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "0",
"BossEscortDifficult": "normal",
"BossEscortType": "peacefullZryachiyEvent",
"BossName": "peacefullZryachiyEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 0,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": -1,
"TriggerId": "",
"TriggerName": ""
}, {
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "5",
"BossEscortDifficult": "normal",
"BossEscortType": "sectactPriestEvent",
"BossName": "sectactPriestEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 25,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": 999999,
"TriggerId": "ZryachiyPeaceKill",
"TriggerName": "botEvent"
}, {
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "0",
"BossEscortDifficult": "normal",
"BossEscortType": "ravangeZryachiyEvent",
"BossName": "ravangeZryachiyEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 0,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": 99999,
"TriggerId": "SummonComplete",
"TriggerName": "botEvent"
}
],
"reservbase": [{
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "0",
"BossEscortDifficult": "normal",
"BossEscortType": "peacefullZryachiyEvent",
"BossName": "peacefullZryachiyEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 0,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": -1,
"TriggerId": "",
"TriggerName": ""
}, {
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "5",
"BossEscortDifficult": "normal",
"BossEscortType": "sectactPriestEvent",
"BossName": "sectactPriestEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 25,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": 999999,
"TriggerId": "ZryachiyPeaceKill",
"TriggerName": "botEvent"
}, {
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "0",
"BossEscortDifficult": "normal",
"BossEscortType": "ravangeZryachiyEvent",
"BossName": "ravangeZryachiyEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 0,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": 99999,
"TriggerId": "SummonComplete",
"TriggerName": "botEvent"
}
],
"shoreline": [{
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "0",
"BossEscortDifficult": "normal",
"BossEscortType": "peacefullZryachiyEvent",
"BossName": "peacefullZryachiyEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 0,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": -1,
"TriggerId": "",
"TriggerName": ""
}, {
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "5",
"BossEscortDifficult": "normal",
"BossEscortType": "sectactPriestEvent",
"BossName": "sectactPriestEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 25,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": 999999,
"TriggerId": "ZryachiyPeaceKill",
"TriggerName": "botEvent"
}, {
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "0",
"BossEscortDifficult": "normal",
"BossEscortType": "ravangeZryachiyEvent",
"BossName": "ravangeZryachiyEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 0,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": 99999,
"TriggerId": "SummonComplete",
"TriggerName": "botEvent"
}
],
"tarkovstreets": [{
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "0",
"BossEscortDifficult": "normal",
"BossEscortType": "peacefullZryachiyEvent",
"BossName": "peacefullZryachiyEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 0,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": -1,
"TriggerId": "",
"TriggerName": ""
}, {
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "5",
"BossEscortDifficult": "normal",
"BossEscortType": "sectactPriestEvent",
"BossName": "sectactPriestEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 25,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": 999999,
"TriggerId": "ZryachiyPeaceKill",
"TriggerName": "botEvent"
}, {
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "0",
"BossEscortDifficult": "normal",
"BossEscortType": "ravangeZryachiyEvent",
"BossName": "ravangeZryachiyEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 0,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": 99999,
"TriggerId": "SummonComplete",
"TriggerName": "botEvent"
}
],
"woods": [{
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "0",
"BossEscortDifficult": "normal",
"BossEscortType": "peacefullZryachiyEvent",
"BossName": "peacefullZryachiyEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 0,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": -1,
"TriggerId": "",
"TriggerName": ""
}, {
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "5",
"BossEscortDifficult": "normal",
"BossEscortType": "sectactPriestEvent",
"BossName": "sectactPriestEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 25,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": 999999,
"TriggerId": "ZryachiyPeaceKill",
"TriggerName": "botEvent"
}, {
"BossChance": 100,
"BossDifficult": "normal",
"BossEscortAmount": "0",
"BossEscortDifficult": "normal",
"BossEscortType": "ravangeZryachiyEvent",
"BossName": "ravangeZryachiyEvent",
"BossPlayer": false,
"BossZone": "",
"Delay": 0,
"ForceSpawn": true,
"IgnoreMaxBots": true,
"RandomTimeSpawn": false,
"Supports": null,
"Time": 99999,
"TriggerId": "SummonComplete",
"TriggerName": "botEvent"
}
]
}
},
"gifterSettings": [{
"map": "bigmap",
"zones": "ZoneDormitory,ZoneGasStation,ZoneScavBase",
@ -271,21 +652,21 @@
],
"events": [{
"name": "halloween",
"type": "HALLOWEEN",
"type": "HALLOWEEN",
"startDay": "24",
"startMonth": "10",
"endDay": "4",
"endMonth": "11"
}, {
"name": "christmas",
"type": "CHRISTMAS",
"type": "CHRISTMAS",
"startDay": "7",
"startMonth": "12",
"endDay": "31",
"endMonth": "12"
}, {
"name": "newyears",
"type": "NEW_YEARS",
"type": "NEW_YEARS",
"startDay": "1",
"startMonth": "1",
"endDay": "7",

View File

@ -2204,7 +2204,9 @@
"Pockets": {
"60c7272c204bc17802313365": 1
},
"Scabbard": {},
"Scabbard": {
"5fc64ea372b0dd78d51159dc": 1
},
"SecondPrimaryWeapon": {
"57dc2fa62459775949412633": 968,
"5ba26383d4351e00334c93d9": 13

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -17388,56 +17388,56 @@
}
},
"DiscardLimitsEnabled": true,
"EventSettings": {
"EventActive": true,
"EventTime": 420,
"EventWeather": {
"Cloudness": 1,
"Hour": 21,
"Minute": 0,
"Rain": 0.1,
"RainRandomness": 0,
"ScaterringFogDensity": 0.02,
"TopWindDirection": {
"x": -1,
"y": 0,
"z": 0
},
"Wind": 4,
"WindDirection": 8
"EventSettings": {
"EventActive": true,
"EventTime": 390,
"EventWeather": {
"Cloudness": 1,
"Hour": 21,
"Minute": 0,
"Rain": 0.1,
"RainRandomness": 0,
"ScaterringFogDensity": 0.02,
"TopWindDirection": {
"x": -1,
"y": 0,
"z": 0
},
"ExitTimeMultiplier": 3,
"StaminaMultiplier": 3,
"SummonFailedWeather": {
"Cloudness": 0,
"Rain": 0,
"RainRandomness": 0,
"ScaterringFogDensity": 0.001,
"TopWindDirection": {
"x": -1,
"y": 0,
"z": 0
},
"Wind": 0,
"WindDirection": 8
},
"SummonSuccessWeather": {
"Cloudness": 0,
"Hour": 6,
"Minute": 10,
"Rain": 0.1,
"RainRandomness": 0,
"ScaterringFogDensity": 0.05,
"TopWindDirection": {
"x": -1,
"y": 0,
"z": 0
},
"Wind": 0.2,
"WindDirection": 8
},
"WeatherChangeTime": 20
"Wind": 4,
"WindDirection": 8
},
"ExitTimeMultiplier": 3,
"StaminaMultiplier": 3,
"SummonFailedWeather": {
"Cloudness": 0,
"Rain": 0,
"RainRandomness": 0,
"ScaterringFogDensity": 0.001,
"TopWindDirection": {
"x": -1,
"y": 0,
"z": 0
},
"Wind": 0,
"WindDirection": 8
},
"SummonSuccessWeather": {
"Cloudness": 0,
"Hour": 6,
"Minute": 10,
"Rain": 0.1,
"RainRandomness": 0,
"ScaterringFogDensity": 0.05,
"TopWindDirection": {
"x": -1,
"y": 0,
"z": 0
},
"Wind": 0.2,
"WindDirection": 8
},
"WeatherChangeTime": 20
},
"EventType": [
"None"
],

File diff suppressed because it is too large Load Diff

View File

@ -21,6 +21,7 @@ import { DatabaseServer } from "@spt-aki/servers/DatabaseServer";
import { BotGenerationCacheService } from "@spt-aki/services/BotGenerationCacheService";
import { LocalisationService } from "@spt-aki/services/LocalisationService";
import { MatchBotDetailsCacheService } from "@spt-aki/services/MatchBotDetailsCacheService";
import { SeasonalEventService } from "@spt-aki/services/SeasonalEventService";
import { JsonUtil } from "@spt-aki/utils/JsonUtil";
@injectable()
@ -38,6 +39,7 @@ export class BotController
@inject("BotGenerationCacheService") protected botGenerationCacheService: BotGenerationCacheService,
@inject("MatchBotDetailsCacheService") protected matchBotDetailsCacheService: MatchBotDetailsCacheService,
@inject("LocalisationService") protected localisationService: LocalisationService,
@inject("SeasonalEventService") protected seasonalEventService: SeasonalEventService,
@inject("ProfileHelper") protected profileHelper: ProfileHelper,
@inject("ConfigServer") protected configServer: ConfigServer,
@inject("ApplicationContext") protected applicationContext: ApplicationContext,
@ -55,9 +57,18 @@ export class BotController
*/
public getBotPresetGenerationLimit(type: string): number
{
return this.botConfig.presetBatch[(type === "assaultGroup")
const value = this.botConfig.presetBatch[(type === "assaultGroup")
? "assault"
: type];
if (!value)
{
this.logger.warning(`No value found for bot type ${type}, defaulting to 30`);
return value;
}
return value;
}
/**
@ -105,8 +116,8 @@ export class BotController
break;
default:
difficultySettings = this.botDifficultyHelper.getBotDifficultySettings(type, difficulty);
// Don't add pmcs to gifter enemy list
if (type.toLowerCase() !== "gifter")
// Don't add pmcs to event enemies
if (!["gifter", "peacefullzryachiyevent"].includes(type.toLowerCase()))
{
this.botHelper.addBotToEnemyList(difficultySettings, [this.pmcConfig.bearType, this.pmcConfig.usecType], lowercasedBotType);
}
@ -141,6 +152,15 @@ export class BotController
isPlayerScav: false
};
// Event bots need special actions to occur, set data up for them
const isEventBot = condition.Role.includes("Event");
if (isEventBot)
{
// Add eventRole data + reassign role property to be base type
botGenerationDetails.eventRole = condition.Role;
botGenerationDetails.role = this.seasonalEventService.getBaseRoleForEventBot(botGenerationDetails.eventRole);
}
// Custom map waves can have spt roles in them
// Is bot type sptusec/sptbear, set is pmc true and set side
if (this.botHelper.botRoleIsPmc(condition.Role))
@ -154,9 +174,10 @@ export class BotController
for (let i = 0; i < botGenerationDetails.botCountToGenerate; i ++)
{
const details = this.jsonUtil.clone(botGenerationDetails);
const botRole = (isEventBot) ? details.eventRole : details.role;
// Roll chance to be pmc if type is allowed to be one
const botConvertRateMinMax = this.pmcConfig.convertIntoPmcChance[details.role.toLowerCase()];
const botConvertRateMinMax = this.pmcConfig.convertIntoPmcChance[botRole.toLowerCase()];
if (botConvertRateMinMax)
{
// Should bot become PMC
@ -170,7 +191,7 @@ export class BotController
}
}
cacheKey = `${details.role}${details.botDifficulty}`;
cacheKey = `${botRole}${details.botDifficulty}`;
// Check for bot in cache, add if not
if (!this.botGenerationCacheService.cacheHasBotOfRole(cacheKey))
{

View File

@ -120,6 +120,8 @@ export class BotGenerator
output.push(bot);
}
this.logger.debug(`Generated ${botGenerationDetails.botCountToGenerate} ${output[0].Info.Settings.Role} (${botGenerationDetails.eventRole}) bots`);
return output;
}
@ -188,6 +190,12 @@ export class BotGenerator
// generate new inventory ID
bot = this.generateInventoryID(bot);
// Set role back to originally requested now its been generated
if (botGenerationDetails.eventRole)
{
bot.Info.Settings.Role = botGenerationDetails.eventRole;
}
return bot;
}

View File

@ -148,6 +148,8 @@ export interface BossLocationSpawn
TriggerId: string
TriggerName: string
Delay?: number
ForceSpawn?: boolean
IgnoreMaxBots?: boolean
Supports?: BossSupport[]
sptId?: string
}

View File

@ -16,4 +16,5 @@ export interface BotGenerationDetails
botDifficulty: string
/** Will the generated bot be a player scav */
isPlayerScav: boolean
eventRole?: string
}

View File

@ -1,3 +1,4 @@
import { BossLocationSpawn } from "@spt-aki/models/eft/common/ILocationBase";
import { SeasonalEventType } from "@spt-aki/models/enums/SeasonalEventType";
import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig";
@ -8,6 +9,8 @@ export interface ISeasonalEventConfig extends IBaseConfig
/** event / botType / equipSlot / itemid */
eventGear: Record<string, Record<string, Record<string, Record<string, number>>>>
events: ISeasonalEvent[]
eventBotMapping: Record<string, string>;
eventBossSpawns: Record<string, Record<string, BossLocationSpawn[]>>
gifterSettings: GifterSetting[]
}

View File

@ -3,6 +3,7 @@ import { inject, injectable } from "tsyringe";
import { BotHelper } from "@spt-aki/helpers/BotHelper";
import { ProfileHelper } from "@spt-aki/helpers/ProfileHelper";
import { IConfig } from "@spt-aki/models/eft/common/IGlobals";
import { BossLocationSpawn } from "@spt-aki/models/eft/common/ILocationBase";
import { Inventory } from "@spt-aki/models/eft/common/tables/IBotType";
import { ConfigTypes } from "@spt-aki/models/enums/ConfigTypes";
import { SeasonalEventType } from "@spt-aki/models/enums/SeasonalEventType";
@ -296,6 +297,8 @@ export class SeasonalEventService
globalConfig.EventType.push("HalloweenIllumination");
globalConfig.Health.ProfileHealthSettings.DefaultStimulatorBuff = "Buffs_Halloween";
this.addEventGearToBots(eventType);
this.adjustZryachiyMeleeChance();
this.addEventBossesToMaps(eventType);
this.addPumpkinsToScavBackpacks();
this.adjustTraderIcons(eventType);
break;
@ -318,6 +321,41 @@ export class SeasonalEventService
}
}
protected adjustZryachiyMeleeChance(): void
{
this.databaseServer.getTables().bots.types.bosszryachiy.chances.equipment.Scabbard = 100;
}
protected addEventBossesToMaps(eventType: SeasonalEventType): void
{
const botsToAddPerMap = this.seasonalEventConfig.eventBossSpawns[eventType.toLowerCase()];
if (!botsToAddPerMap)
{
this.logger.warning(`Unable to add ${eventType} bosses, eventBossSpawns is missing`);
return;
}
const mapKeys = Object.keys(botsToAddPerMap) ?? [];
for (const mapKey of mapKeys)
{
const bossesToAdd = botsToAddPerMap[mapKey];
if (!bossesToAdd)
{
this.logger.warning(`Unable to add ${eventType} bosses to ${mapKey}`);
continue;
}
for (const boss of bossesToAdd)
{
const mapBosses: BossLocationSpawn[] = this.databaseServer.getTables().locations[mapKey].base.BossLocationSpawn;
if (!mapBosses.find(x => x.BossName === boss.BossName))
{
this.databaseServer.getTables().locations.bigmap.base.BossLocationSpawn.push(...bossesToAdd);
}
}
}
}
/**
* Change trader icons to be more event themed (Halloween only so far)
* @param eventType What event is active
@ -470,4 +508,14 @@ export class SeasonalEventService
}
}
/**
* Get the underlying bot type for an event bot e.g. `peacefullZryachiyEvent` will return `bossZryachiy`
* @param eventBotRole Event bot role type
* @returns Bot role as string
*/
public getBaseRoleForEventBot(eventBotRole: string): string
{
return this.seasonalEventConfig.eventBotMapping[eventBotRole];
}
}