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:
parent
9949d3c7ff
commit
981da646b0
@ -36,6 +36,9 @@
|
||||
"crazyAssaultEvent": 15,
|
||||
"bossBoar": 5,
|
||||
"bossBoarSniper": 5,
|
||||
"peacefullZryachiyEvent": 5,
|
||||
"sectactPriestEvent": 20,
|
||||
"ravangeZryachiyEvent": 25,
|
||||
"sptUsec": 30,
|
||||
"sptBear": 30
|
||||
},
|
||||
|
@ -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",
|
||||
|
@ -2204,7 +2204,9 @@
|
||||
"Pockets": {
|
||||
"60c7272c204bc17802313365": 1
|
||||
},
|
||||
"Scabbard": {},
|
||||
"Scabbard": {
|
||||
"5fc64ea372b0dd78d51159dc": 1
|
||||
},
|
||||
"SecondPrimaryWeapon": {
|
||||
"57dc2fa62459775949412633": 968,
|
||||
"5ba26383d4351e00334c93d9": 13
|
||||
|
2099
project/assets/database/bots/types/peacefullzryachiyevent.json
Normal file
2099
project/assets/database/bots/types/peacefullzryachiyevent.json
Normal file
File diff suppressed because it is too large
Load Diff
2171
project/assets/database/bots/types/ravangezryachiyevent.json
Normal file
2171
project/assets/database/bots/types/ravangezryachiyevent.json
Normal file
File diff suppressed because it is too large
Load Diff
2187
project/assets/database/bots/types/sectantpriestevent.json
Normal file
2187
project/assets/database/bots/types/sectantpriestevent.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -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
@ -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))
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -148,6 +148,8 @@ export interface BossLocationSpawn
|
||||
TriggerId: string
|
||||
TriggerName: string
|
||||
Delay?: number
|
||||
ForceSpawn?: boolean
|
||||
IgnoreMaxBots?: boolean
|
||||
Supports?: BossSupport[]
|
||||
sptId?: string
|
||||
}
|
||||
|
@ -16,4 +16,5 @@ export interface BotGenerationDetails
|
||||
botDifficulty: string
|
||||
/** Will the generated bot be a player scav */
|
||||
isPlayerScav: boolean
|
||||
eventRole?: string
|
||||
}
|
@ -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[]
|
||||
}
|
||||
|
||||
|
@ -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];
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user