try emitting player disconnects and immediate packet updates immediately (otherwise the server doesn't see the disconnect message and the last player remains online)
This commit is contained in:
parent
275fb27a29
commit
b8c1c57a17
3 changed files with 56 additions and 20 deletions
|
|
@ -1,5 +1,6 @@
|
|||
import KafkatorioSettings from "../settings/KafkatorioSettings";
|
||||
import {KafkatorioKeyedPacketData} from "../types";
|
||||
import packetEmitter from "../PacketEmitter";
|
||||
|
||||
export namespace EventUpdates {
|
||||
|
||||
|
|
@ -71,6 +72,10 @@ export namespace EventUpdates {
|
|||
if (expirationDurationTicks != undefined) {
|
||||
entry.expirationDurationTicks = expirationDurationTicks
|
||||
}
|
||||
|
||||
if (entry.expirationDurationTicks != undefined && entry.expirationDurationTicks <= 0) {
|
||||
this.extractAndEmitExpiredPackets()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -90,8 +95,9 @@ export namespace EventUpdates {
|
|||
}
|
||||
|
||||
|
||||
/** Removes all expired entries from the cache, and return them. */
|
||||
// use in/out v4.7.0 https://github.com/microsoft/TypeScript/pull/48240
|
||||
public extractExpired(): Array<KafkatorioKeyedPacketData> {
|
||||
private extractExpired(): Array<KafkatorioKeyedPacketData> {
|
||||
let countExpired = 0
|
||||
let countTotal = 0
|
||||
const expiredData: Array<KafkatorioKeyedPacketData> = []
|
||||
|
|
@ -114,6 +120,25 @@ export namespace EventUpdates {
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Removes and emits all expired packets.
|
||||
*
|
||||
* @return the number of emitted packets
|
||||
*/
|
||||
public extractAndEmitExpiredPackets() {
|
||||
const cachedEvents: Array<KafkatorioKeyedPacketData> = this.extractExpired()
|
||||
|
||||
if (cachedEvents.length > 0) {
|
||||
log(`[EventDataCache] emitting ${cachedEvents.length} events on tick ${game.tick}`)
|
||||
for (const event of cachedEvents) {
|
||||
packetEmitter.emitKeyedPacket(event)
|
||||
}
|
||||
}
|
||||
|
||||
return cachedEvents.length
|
||||
}
|
||||
|
||||
|
||||
private getCacheEntry<PACKET extends KafkatorioKeyedPacketData>(
|
||||
key: EventUpdates.PacketKey<PACKET>,
|
||||
type: EventUpdates.PacketType<PACKET>,
|
||||
|
|
|
|||
|
|
@ -1,16 +1,10 @@
|
|||
import EventCacheService from "./EventDataCache";
|
||||
import packetEmitter from "../PacketEmitter";
|
||||
import {KafkatorioKeyedPacketData} from "../types";
|
||||
|
||||
|
||||
/** Every 0.1 seconds */
|
||||
script.on_nth_tick(6, (nthTick: NthTickEventData) => {
|
||||
const cachedEvents: Array<KafkatorioKeyedPacketData> = EventCacheService.extractExpired()
|
||||
|
||||
if (cachedEvents.length > 0) {
|
||||
log(`nth tick ${nthTick.tick} has ${cachedEvents.length} events`)
|
||||
|
||||
for (const event of cachedEvents) {
|
||||
packetEmitter.emitKeyedPacket(event)
|
||||
}
|
||||
const emittedCount = EventCacheService.extractAndEmitExpiredPackets()
|
||||
if (emittedCount > 0) {
|
||||
log(`[on_nth_tick:${nthTick.tick}] emitted ${emittedCount} events`)
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,7 +1,11 @@
|
|||
import {Converters} from "./converters";
|
||||
import EventUpdatesManager from "../cache/EventDataCache";
|
||||
import {KafkatorioPacketData} from "../../generated/kafkatorio-schema/kafkatorio-schema";
|
||||
import {
|
||||
KafkatorioPacketData,
|
||||
PlayerUpdateKey
|
||||
} from "../../generated/kafkatorio-schema/kafkatorio-schema";
|
||||
import Type = KafkatorioPacketData.Type;
|
||||
import packetEmitter from "../PacketEmitter";
|
||||
|
||||
|
||||
type PlayerUpdater = (player: LuaPlayer, data: KafkatorioPacketData.PlayerUpdate) => void
|
||||
|
|
@ -44,7 +48,7 @@ function playerUpdateThrottle(
|
|||
data.events[eventName] ??= []
|
||||
data.events[eventName].push(event.tick)
|
||||
},
|
||||
expirationDurationTicks
|
||||
expirationDurationTicks,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -183,13 +187,26 @@ script.on_event(
|
|||
defines.events.on_pre_player_left_game,
|
||||
(event: OnPrePlayerLeftGameEvent) => {
|
||||
log(`on_pre_player_left_game ${event.tick} ${event.name}`)
|
||||
playerUpdateImmediate(
|
||||
event,
|
||||
(player, data) => {
|
||||
data.disconnectReason = disconnectReasons.get(event.reason)
|
||||
playerOnlineInfo(player, data)
|
||||
|
||||
const playerUpdateKey: PlayerUpdateKey = {
|
||||
index: event.player_index
|
||||
}
|
||||
)
|
||||
|
||||
const playerUpdate: KafkatorioPacketData.PlayerUpdate = {
|
||||
type: KafkatorioPacketData.Type.PlayerUpdate,
|
||||
key: playerUpdateKey,
|
||||
disconnectReason: disconnectReasons.get(event.reason)
|
||||
}
|
||||
|
||||
packetEmitter.emitKeyedPacket(playerUpdate)
|
||||
|
||||
// playerUpdateImmediate(
|
||||
// event,
|
||||
// (player, data) => {
|
||||
// data.disconnectReason = disconnectReasons.get(event.reason)
|
||||
// playerOnlineInfo(player, data)
|
||||
// }
|
||||
// )
|
||||
}
|
||||
)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue