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 {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>,

View file

@ -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`)
}
})

View file

@ -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)
// }
// )
}
)