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:
Adam 2022-06-26 15:30:03 +02:00
parent 275fb27a29
commit b8c1c57a17
3 changed files with 56 additions and 20 deletions

View file

@ -1,5 +1,6 @@
import KafkatorioSettings from "../settings/KafkatorioSettings"; import KafkatorioSettings from "../settings/KafkatorioSettings";
import {KafkatorioKeyedPacketData} from "../types"; import {KafkatorioKeyedPacketData} from "../types";
import packetEmitter from "../PacketEmitter";
export namespace EventUpdates { export namespace EventUpdates {
@ -71,6 +72,10 @@ export namespace EventUpdates {
if (expirationDurationTicks != undefined) { if (expirationDurationTicks != undefined) {
entry.expirationDurationTicks = expirationDurationTicks 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 // 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 countExpired = 0
let countTotal = 0 let countTotal = 0
const expiredData: Array<KafkatorioKeyedPacketData> = [] 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>( private getCacheEntry<PACKET extends KafkatorioKeyedPacketData>(
key: EventUpdates.PacketKey<PACKET>, key: EventUpdates.PacketKey<PACKET>,
type: EventUpdates.PacketType<PACKET>, type: EventUpdates.PacketType<PACKET>,

View file

@ -1,16 +1,10 @@
import EventCacheService from "./EventDataCache"; import EventCacheService from "./EventDataCache";
import packetEmitter from "../PacketEmitter";
import {KafkatorioKeyedPacketData} from "../types";
/** Every 0.1 seconds */ /** Every 0.1 seconds */
script.on_nth_tick(6, (nthTick: NthTickEventData) => { script.on_nth_tick(6, (nthTick: NthTickEventData) => {
const cachedEvents: Array<KafkatorioKeyedPacketData> = EventCacheService.extractExpired() const emittedCount = EventCacheService.extractAndEmitExpiredPackets()
if (emittedCount > 0) {
if (cachedEvents.length > 0) { log(`[on_nth_tick:${nthTick.tick}] emitted ${emittedCount} events`)
log(`nth tick ${nthTick.tick} has ${cachedEvents.length} events`)
for (const event of cachedEvents) {
packetEmitter.emitKeyedPacket(event)
}
} }
}) })

View file

@ -1,7 +1,11 @@
import {Converters} from "./converters"; import {Converters} from "./converters";
import EventUpdatesManager from "../cache/EventDataCache"; 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 Type = KafkatorioPacketData.Type;
import packetEmitter from "../PacketEmitter";
type PlayerUpdater = (player: LuaPlayer, data: KafkatorioPacketData.PlayerUpdate) => void type PlayerUpdater = (player: LuaPlayer, data: KafkatorioPacketData.PlayerUpdate) => void
@ -44,7 +48,7 @@ function playerUpdateThrottle(
data.events[eventName] ??= [] data.events[eventName] ??= []
data.events[eventName].push(event.tick) data.events[eventName].push(event.tick)
}, },
expirationDurationTicks expirationDurationTicks,
) )
} }
@ -183,13 +187,26 @@ script.on_event(
defines.events.on_pre_player_left_game, defines.events.on_pre_player_left_game,
(event: OnPrePlayerLeftGameEvent) => { (event: OnPrePlayerLeftGameEvent) => {
log(`on_pre_player_left_game ${event.tick} ${event.name}`) log(`on_pre_player_left_game ${event.tick} ${event.name}`)
playerUpdateImmediate(
event, const playerUpdateKey: PlayerUpdateKey = {
(player, data) => { index: event.player_index
data.disconnectReason = disconnectReasons.get(event.reason)
playerOnlineInfo(player, data)
} }
)
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)
// }
// )
} }
) )