Innovative feature: backend sided in-game events!

This commit is contained in:
PRO100KatYT
2023-09-05 17:24:52 +02:00
parent 281b8c221d
commit db31561641
3 changed files with 216 additions and 35 deletions

View File

@@ -19,3 +19,54 @@ bAllSTWEventsActivated=false
ip=127.0.0.1 ip=127.0.0.1
# PORT the matchmaker will use upon join. # PORT the matchmaker will use upon join.
port=7777 port=7777
[Events]
# All dates must be specified using ISO date format only (UTC).
# *Requires a Gameserver connected to this LawinServer backend. Clients can use other backends.
## The Rocket Start event. (v4.5 Only)*
# If this is set to true, the event countdown will appear next to
# the Rocket and the event will start at the date below.
bEnableGeodeEvent=false
geodeEventStartDate=2020-01-01T00:00:00.000Z
# If this is set to true, the Crack will stay in the sky AFTER the event.
# The crack will fully expand after ~13.6 real days after the Rocket event start date.
bEnableCrackInTheSky=false
## Eight mini-events which took the following objects from the map: (v4.5 Only)*
## 1. Lonely Lodge Sign, 2. Motel Sign, 3. Tomatohead Mascot, 4. NOMS Sign, 5. Durr Burger Mascot
## and brought the following objects to the map:
## 6. Ship Anchor, 7. Horse Carriage, 8. Dinosaur Skeleton.
## To see the exact locations, you can check out this video: https://youtu.be/NXL7rkiJVqM
# If this is set to true, the blue rift effects will appear at places mentioned above.
bEnableS4OddityPrecursor=false
# If this is set to true, the mini-events will begin to start. (Adjust the options below)
bEnableS4OddityExecution=false
# Start date for the Season 4 mini-events. If you have the Rocket event enabled as
# well, then set this date to at least 4 minutes after your Rocket start date.
S4OddityEventStartDate=2020-01-01T00:00:00.000Z
# Time (in minutes) after which another mini-event (1-8) will occur.
# If set to 0, all mini-events will happen at once.
S4OddityEventsInterval=0
## Tomatohead Comeback mini-event. (v5.21 Only)*
# When set to true, the blue rift effects will start appearing on
# top of the Tomato Town restaurant at the date specified below.
bEnableS5OddityPrecursor=false
S5OddityPrecursorDate=2020-01-01T00:00:00.000Z
# When set to true, Tomatohead will be rifted back to Tomato Town at the date specified below.
bEnableS5OddityExecution=false
S5OddityExecutionDate=2020-01-01T00:00:00.000Z
## Lightning from the sky Crack and Cube Spawning Event. (v5.30 Only)*
# When set to true, the crack will start shooting lightning bolts destroying
# cacti and eventually spawn the cube on the date specified below.
bEnableCubeLightning=false
cubeSpawnDate=2020-01-01T00:00:00.000Z
## Blockbuster Contest winner video at Risky Reels event. (v5.30 Only)*
bEnableBlockbusterRiskyEvent=false

View File

@@ -59,6 +59,7 @@
- Seasonal Quests from Season 3 up to Season 21 (Can change) - Seasonal Quests from Season 3 up to Season 21 (Can change)
- Purchasable battle pass from Season 2 to Season 10 (Can change) - Purchasable battle pass from Season 2 to Season 10 (Can change)
- Discovery Tab - Discovery Tab
- Configurable backend sided in-game events - check out the Events seciton in config.ini for more details
## How to use? ## How to use?
1) Install [NodeJS](https://nodejs.org/en/) 1) Install [NodeJS](https://nodejs.org/en/)

View File

@@ -1090,7 +1090,7 @@ express.get("/fortnite/api/calendar/v1/timeline", async (req, res) => {
}) })
} }
if (24.3 <= memory.build <= 25) { if (24.3 <= memory.build && memory.build <= 25) {
activeEvents.push( activeEvents.push(
{ {
"eventType": "EventFlag.HordeV3", "eventType": "EventFlag.HordeV3",
@@ -1188,25 +1188,174 @@ express.get("/fortnite/api/calendar/v1/timeline", async (req, res) => {
"EventFlag.YarrrTwo" "EventFlag.YarrrTwo"
] ]
var activeEventsSet = new Set(activeEvents.map(e => e.eventType));
for (var i = 0; i < Events.length; i++) { for (var i = 0; i < Events.length; i++) {
var Event = Events[i]; var Event = Events[i];
var bAlreadyExists = false; if (!activeEventsSet.has(Event)) {
activeEvents.push({
for (var x = 0; x < activeEvents.length; x++) {
var ActiveEvent = activeEvents[x];
if (ActiveEvent.eventType == Event) {
bAlreadyExists = true;
}
}
if (bAlreadyExists == false) {
activeEvents.push(
{
"eventType": Event, "eventType": Event,
"activeUntil": "9999-01-01T00:00:00.000Z", "activeUntil": "9999-01-01T00:00:00.000Z",
"activeSince": "2020-01-01T00:00:00.000Z" "activeSince": "2020-01-01T00:00:00.000Z"
});
}
}
}
const stateTemplate = {
"activeStorefronts": [],
"eventNamedWeights": {},
"seasonNumber": memory.season,
"seasonTemplateId": `AthenaSeason:athenaseason${memory.season}`,
"matchXpBonusPoints": 0,
"seasonBegin": "2020-01-01T13:00:00Z",
"seasonEnd": "9999-01-01T14:00:00Z",
"seasonDisplayedEnd": "9999-01-01T07:30:00Z",
"weeklyStoreEnd": "9999-01-01T00:00:00Z",
"stwEventStoreEnd": "9999-01-01T00:00:00.000Z",
"stwWeeklyStoreEnd": "9999-01-01T00:00:00.000Z",
"sectionStoreEnds": {
"Featured": "9999-01-01T00:00:00.000Z"
},
"dailyStoreEnd": "9999-01-01T00:00:00Z"
};
var states = [{
validFrom: "2020-01-01T00:00:00.000Z",
activeEvents: activeEvents.slice(),
state: stateTemplate
}]
if (memory.build == 4.5) {
if (config.Events.bEnableGeodeEvent == true) {
states[0].activeEvents.push({
"eventType": "EventFlag.BR_S4_Geode_Countdown",
"activeUntil": config.Events.geodeEventStartDate
})
states.push({
validFrom: config.Events.geodeEventStartDate,
activeEvents: activeEvents.slice(),
state: stateTemplate
})
var EventEndDate = new Date(new Date(config.Events.geodeEventStartDate).getTime() + 3 * 60000).toISOString();
states[1].activeEvents.push({
"eventType": "EventFlag.BR_S4_Geode_Begin",
"activeUntil": EventEndDate
})
activeEvents.push({
"eventType": "EventFlag.BR_S4_Geode_Over",
"activeUntil": "9999-01-01T00:00:00.000Z"
})
if (config.Events.bEnableCrackInTheSky == true) {
activeEvents.push({
"eventType": "EventFlag.BR_S4_Rift_Growth",
"activeUntil": new Date(new Date(EventEndDate).getTime() + 13.6 * 24 * 60 * 60 * 1000).toISOString() // It takes 13.6 days for the crack to fully expand.
}) })
} }
states.push({
validFrom: EventEndDate,
activeEvents: activeEvents.slice(),
state: stateTemplate
})
}
if (config.Events.bEnableS4OddityPrecursor == true) {
for (var i = 1; i <= 8; i++) {
var StartDate = new Date(new Date(config.Events.S4OddityEventStartDate).getTime() + config.Events.S4OddityEventsInterval * (i-1) * 60000).toISOString();
activeEvents.push({
"eventType": `EventFlag.BR_S4_Oddity_0${i}_Tell`,
"activeUntil": StartDate
})
}
states[states.length - 1].activeEvents = activeEvents.slice();
}
if (config.Events.bEnableS4OddityExecution == true) {
for (var i = 1; i <= 8; i++) {
var StartDate = new Date(new Date(config.Events.S4OddityEventStartDate).getTime() + config.Events.S4OddityEventsInterval * (i-1) * 60000).toISOString();
activeEvents.push({
"eventType": `EventFlag.BR_S4_Oddity_0${i}_Event`,
"activeUntil": "9999-01-01T00:00:00.000Z"
})
var index = activeEvents.findIndex(item => item.eventType === `EventFlag.BR_S4_Oddity_0${i}_Tell`);
if (index !== -1) {
activeEvents.splice(index, 1);
}
states.push({
validFrom: StartDate,
activeEvents: activeEvents.slice(),
state: stateTemplate
})
}
}
}
if (memory.build == 5.21) {
if (config.Events.bEnableS5OddityPrecursor == true) {
states.push({
validFrom: config.Events.S5OddityPrecursorDate,
activeEvents: activeEvents.slice(),
state: stateTemplate
})
states[1].activeEvents.push(
{
"eventType": "EventFlag.BR_S5_Oddity_Tomato_Tell",
"activeUntil": "9999-01-01T00:00:00.000Z"
})
}
if (config.Events.bEnableS5OddityExecution == true) {
states.push({
validFrom: config.Events.S5OddityExecutionDate,
activeEvents: activeEvents.slice(),
state: stateTemplate
})
states[states.length - 1].activeEvents.push(
{
"eventType": "EventFlag.BR_S5_Oddity_Tomato_Event",
"activeUntil": "9999-01-01T00:00:00.000Z"
})
}
}
if (memory.build == 5.30) {
if (config.Events.bEnableBlockbusterRiskyEvent == true) {
activeEvents.push({
"eventType": "EventFlag.BR_S5_RiskyReels_Event",
"activeUntil": "9999-01-01T00:00:00.000Z"
})
states[0].activeEvents = activeEvents.slice();
}
if (config.Events.bEnableCubeLightning == true) {
states[0].activeEvents.push(
{
"eventType": "EventFlag.BR_S5_Rift_Corrupt",
"activeUntil": config.Events.cubeSpawnDate
},
{
"eventType": "EventFlag.BR_S5_Cube_Lightning",
"activeUntil": config.Events.cubeSpawnDate
})
activeEvents.push({
"eventType": "EventFlag.BR_S5_Cube_TurnOn",
"activeUntil": "9999-01-01T00:00:00.000Z"
})
states.push({
validFrom: config.Events.cubeSpawnDate,
activeEvents: activeEvents.slice(),
state: stateTemplate
})
} }
} }
@@ -1217,27 +1366,7 @@ express.get("/fortnite/api/calendar/v1/timeline", async (req, res) => {
"cacheExpire": "9999-01-01T22:28:47.830Z" "cacheExpire": "9999-01-01T22:28:47.830Z"
}, },
"client-events": { "client-events": {
"states": [{ "states": states,
"validFrom": "2020-01-01T20:28:47.830Z",
"activeEvents": activeEvents,
"state": {
"activeStorefronts": [],
"eventNamedWeights": {},
"seasonNumber": memory.season,
"seasonTemplateId": `AthenaSeason:athenaseason${memory.season}`,
"matchXpBonusPoints": 0,
"seasonBegin": "2020-01-01T13:00:00Z",
"seasonEnd": "9999-01-01T14:00:00Z",
"seasonDisplayedEnd": "9999-01-01T07:30:00Z",
"weeklyStoreEnd": "9999-01-01T00:00:00Z",
"stwEventStoreEnd": "9999-01-01T00:00:00.000Z",
"stwWeeklyStoreEnd": "9999-01-01T00:00:00.000Z",
"sectionStoreEnds": {
"Featured": "9999-01-01T00:00:00.000Z"
},
"dailyStoreEnd": "9999-01-01T00:00:00Z"
}
}],
"cacheExpire": "9999-01-01T22:28:47.830Z" "cacheExpire": "9999-01-01T22:28:47.830Z"
} }
}, },