mirror of
https://github.com/Lawin0129/LawinServer.git
synced 2026-01-13 02:42:22 +01:00
Innovative feature: backend sided in-game events!
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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/)
|
||||||
|
|||||||
@@ -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,39 +1188,20 @@ 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"
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
res.json({
|
const stateTemplate = {
|
||||||
"channels": {
|
|
||||||
"client-matchmaking": {
|
|
||||||
"states": [],
|
|
||||||
"cacheExpire": "9999-01-01T22:28:47.830Z"
|
|
||||||
},
|
|
||||||
"client-events": {
|
|
||||||
"states": [{
|
|
||||||
"validFrom": "2020-01-01T20:28:47.830Z",
|
|
||||||
"activeEvents": activeEvents,
|
|
||||||
"state": {
|
|
||||||
"activeStorefronts": [],
|
"activeStorefronts": [],
|
||||||
"eventNamedWeights": {},
|
"eventNamedWeights": {},
|
||||||
"seasonNumber": memory.season,
|
"seasonNumber": memory.season,
|
||||||
@@ -1236,8 +1217,156 @@ express.get("/fortnite/api/calendar/v1/timeline", async (req, res) => {
|
|||||||
"Featured": "9999-01-01T00:00:00.000Z"
|
"Featured": "9999-01-01T00:00:00.000Z"
|
||||||
},
|
},
|
||||||
"dailyStoreEnd": "9999-01-01T00:00:00Z"
|
"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
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
"channels": {
|
||||||
|
"client-matchmaking": {
|
||||||
|
"states": [],
|
||||||
|
"cacheExpire": "9999-01-01T22:28:47.830Z"
|
||||||
|
},
|
||||||
|
"client-events": {
|
||||||
|
"states": states,
|
||||||
"cacheExpire": "9999-01-01T22:28:47.830Z"
|
"cacheExpire": "9999-01-01T22:28:47.830Z"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user