From b8c1c57a17a890fc0ab9e25ca81048c7f65bd61f Mon Sep 17 00:00:00 2001 From: Adam <897017+aSemy@users.noreply.github.com> Date: Sun, 26 Jun 2022 15:30:03 +0200 Subject: [PATCH] try emitting player disconnects and immediate packet updates immediately (otherwise the server doesn't see the disconnect message and the last player remains online) --- .../typescript/main/cache/EventDataCache.ts | 27 +++++++++++++- .../typescript/main/cache/cacheChecker.ts | 14 +++----- .../main/events/onPlayerEventListeners.ts | 35 ++++++++++++++----- 3 files changed, 56 insertions(+), 20 deletions(-) diff --git a/modules/events-mod/src/main/typescript/main/cache/EventDataCache.ts b/modules/events-mod/src/main/typescript/main/cache/EventDataCache.ts index e80a90a..17bcabb 100644 --- a/modules/events-mod/src/main/typescript/main/cache/EventDataCache.ts +++ b/modules/events-mod/src/main/typescript/main/cache/EventDataCache.ts @@ -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 { + private extractExpired(): Array { let countExpired = 0 let countTotal = 0 const expiredData: Array = [] @@ -114,6 +120,25 @@ export namespace EventUpdates { } + /** + * Removes and emits all expired packets. + * + * @return the number of emitted packets + */ + public extractAndEmitExpiredPackets() { + const cachedEvents: Array = 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( key: EventUpdates.PacketKey, type: EventUpdates.PacketType, diff --git a/modules/events-mod/src/main/typescript/main/cache/cacheChecker.ts b/modules/events-mod/src/main/typescript/main/cache/cacheChecker.ts index febd47e..face16a 100644 --- a/modules/events-mod/src/main/typescript/main/cache/cacheChecker.ts +++ b/modules/events-mod/src/main/typescript/main/cache/cacheChecker.ts @@ -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 = 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`) } }) diff --git a/modules/events-mod/src/main/typescript/main/events/onPlayerEventListeners.ts b/modules/events-mod/src/main/typescript/main/events/onPlayerEventListeners.ts index b6583a3..22ad180 100644 --- a/modules/events-mod/src/main/typescript/main/events/onPlayerEventListeners.ts +++ b/modules/events-mod/src/main/typescript/main/events/onPlayerEventListeners.ts @@ -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) + // } + // ) } )