diff --git a/modules/mod/src/main/typescript/events.ts b/modules/mod/src/main/typescript/events.ts index 5d07a8d..cbc3135 100644 --- a/modules/mod/src/main/typescript/events.ts +++ b/modules/mod/src/main/typescript/events.ts @@ -1,7 +1,3 @@ -// import {Kafka, Producer} from "kafkajs"; - -// const {Kafka} = require("kafkajs") -// import {Kafka, Producer} from "kafkajs/types" // import {Data, Mods} from "typed-factorio/settings/types" // import { events } from "typed-factorio/generated" @@ -17,44 +13,57 @@ import {JsonTable, Serdes} from "./serdes/serdes" // const SERVER_ID: uint = 0 // const EVENT_FILE_DIR: string = "events" -function playerEvent(tick: uint, player_index: uint, eventType: string) { +function createFactorioEvent(tick: uint, object_name: string, eventType: string, data: JsonTable): JsonTable { + return { + tick, + object_name, + eventType, + data, + } + +} + +function handlePlayerUpdate(tick: uint, player_index: uint, eventType: string) { + let player: LuaPlayer = game.players[player_index] + let table = Serdes.Player.playerToTable(player) + let event = createFactorioEvent(tick, player.object_name, eventType, table) + emitEvent(event) + + handleCharactersEvent(tick, player_index, eventType) +} + +function handleCharactersEvent(tick: uint, player_index: uint, eventType: string) { + let player: LuaPlayer = game.players[player_index] - let filename: string = table.concat([player.index, eventType, tick], "_") - let data = Serdes.Player.playerToTable(player) - outputEventFile(player.object_name + "/" + filename, data) - if (player.character != undefined) { - entityEvent(tick, player.character, eventType) + handleEntityUpdate(tick, player.character, eventType) for (const char of player.get_associated_characters()) { if (char != undefined) { - entityEvent(tick, char, eventType) + handleEntityUpdate(tick, char, eventType) } } - } } -function entityEvent(tick: uint, entity: LuaEntity, eventType: string) { - if (entity.unit_number != undefined && entity.unit_number != 0) { - let filename: string = table.concat([entity.unit_number, eventType, tick], "_") - let data = Serdes.Entity.entityToTable(entity) - outputEventFile(entity.object_name + "/" + filename, data) - } +function handleEntityUpdate(tick: uint, entity: LuaEntity, eventType: string) { + let table = Serdes.Entity.entityToTable(entity) + let event = createFactorioEvent(tick, entity.object_name, eventType, table) + emitEvent(event) } function surfaceEvent(tick: uint, surface: LuaSurface, eventType: string) { - let filename: string = - surface.object_name + "/" + table.concat([surface.index, eventType, tick], "_") - let data = Serdes.Surface.surfaceToTable(surface) - outputEventFile(filename, data) + let table = Serdes.Surface.surfaceToTable(surface) + let event = createFactorioEvent(tick, surface.object_name, eventType, table) + emitEvent(event) } -function outputEventFile(filename: string, obj: JsonTable) { - let data = game.table_to_json(obj) +/** Emit a serialised event */ +function emitEvent(event: JsonTable) { + let data = game.table_to_json(event) // game.write_file(EVENT_FILE_DIR + "/" + filename, data, false, SERVER_ID) - localised_print(`!===== ${filename} | ${data} =====!`) + localised_print(`FactorioWebMapJsonEvent: ${data}`) } // script.on_event( @@ -67,21 +76,22 @@ function outputEventFile(filename: string, obj: JsonTable) { script.on_event( defines.events.on_player_mined_entity, (e: OnPlayerMinedEntityEvent) => { - entityEvent(e.tick, e.entity, "on_player_mined_entity") - playerEvent(e.tick, e.player_index, "on_player_mined_entity") + handlePlayerUpdate(e.tick, e.player_index, "on_player_mined_entity") + handleEntityUpdate(e.tick, e.entity, "on_player_mined_entity") } ) script.on_event( defines.events.on_player_joined_game, (e: OnPlayerJoinedGameEvent) => { - playerEvent(e.tick, e.player_index, "on_player_joined_game") + handlePlayerUpdate(e.tick, e.player_index, "on_player_joined_game") } ) script.on_event( defines.events.on_player_changed_position, + // this is actually a character update, not a player update? (e: OnPlayerChangedPositionEvent) => { - playerEvent(e.tick, e.player_index, "on_player_changed_position") + handlePlayerUpdate(e.tick, e.player_index, "on_player_changed_position") } ) @@ -90,8 +100,6 @@ script.on_event( (e: OnTickEvent) => { if (e.tick % 60 == 0) { - game.surfaces - for (const [index,] of pairs(game.surfaces)) { let surface = game.surfaces[index] surfaceEvent(e.tick, surface, "on_tick") diff --git a/modules/mod/src/main/typescript/ext/LuaArray.ts b/modules/mod/src/main/typescript/ext/LuaArray.ts deleted file mode 100644 index e24e759..0000000 --- a/modules/mod/src/main/typescript/ext/LuaArray.ts +++ /dev/null @@ -1,16 +0,0 @@ -// declare interface LuaArray extends LuaTable { -// } - -// = LuaTable; - -// declare type LuaArrayConstructor = (new () => LuaArray) - -// declare const LuaArray: LuaArrayConstructor - -// class LuaArray extends LuaTable { -// add(val: TValue) { -// this.set(this.length(), val) -// } -// } - -// declare type LuaArray & LuaTable \ No newline at end of file diff --git a/modules/mod/src/main/typescript/serdes/serdes.ts b/modules/mod/src/main/typescript/serdes/serdes.ts index 2396228..1728991 100644 --- a/modules/mod/src/main/typescript/serdes/serdes.ts +++ b/modules/mod/src/main/typescript/serdes/serdes.ts @@ -1,25 +1,46 @@ -export type PrimitiveType = number | string | boolean -export type JsonArray = TValue[] -export type JsonTableValueType = - PrimitiveType - | JsonTable - | JsonArray -export type JsonTable = LuaTable // & table -// export type JsonArray = LuaArray // & table +export type JsonPrimitiveType = number | string | boolean | undefined | null | void +// export type JsonArray = TValue[] +// export class JsonArray extends Array { +// } + +// export type JsonArray = Array +// declare type JsonArrayConstructor = (new () => JsonArray) +// declare const JsonArray: JsonArrayConstructor + +export type JsonArray = T[] + +export type JsonTableValueType = + JsonPrimitiveType + | JsonTable + | JsonArray + | undefined + | null + +// export class JsonTable extends LuaTable { +// } +// export type JsonTable = LuaTable +// const JsonTable = () => new LuaTable() +// export type JsonTableConstructor = (new () => JsonTable) +// declare const JsonTable: JsonTableConstructor + + +export interface JsonTable { + [key: string]: JsonTableValueType +} export namespace Serdes { export namespace Player { export function playerToTable(player: LuaPlayer): JsonTable { - let table = new LuaTable() - - table.set("name", player.name) - let charIds: JsonArray = Entity.entitiesToUnitNumbers(player.get_associated_characters()) - table.set("characterIds", charIds) - - return table + let charIds = Entity.entitiesToUnitNumbers(player.get_associated_characters()) + return { + "name": player.name, + "characterId": player.character?.unit_number, + "associatedCharacterIds": charIds, + "position": DataClasses.positionTableToTable(player.position), + } } } @@ -27,34 +48,32 @@ export namespace Serdes { export namespace Entity { export function entityToTable(entity: LuaEntity): JsonTable { - let table = new LuaTable() - if (entity.player?.index != null) { - table.set("playerId", entity.player?.index) + let player: JsonTable = + entity.is_player() ? { + "playerId": entity.player?.index, + } : {} + + return { + player, + "name": entity.name, + "type": entity.type, + "active": entity.active, + "health": entity.health, + "surfaceId": entity.surface.index, + "unit_number": entity.unit_number, + "position": DataClasses.positionTableToTable(entity.position), } - table.set("type", entity.type) - table.set("active", entity.active) - - if (entity.health != null) { - table.set("health", entity.health) - } - - table.set("surfaceId", entity.surface.index) - table.set("position", DataClasses.positionTableToTable(entity.position)) - - return table } export function entitiesToUnitNumbers(entities: LuaEntity[]): JsonArray { - let array: number[] = [] - let j: number = 0 - for (let i = 0; i < entities.length; i++) { - let unitNum = entities[i].unit_number - if (unitNum != null) { - array[j++] = unitNum + let result: (number) [] = [] + for (let entity of entities) { + if (entity.unit_number != null) { + result[result.length] = entity.unit_number } } - return array + return result } } @@ -62,13 +81,11 @@ export namespace Serdes { export namespace Surface { export function surfaceToTable(surface: LuaSurface): JsonTable { - let table = new LuaTable() - - table.set("name", surface.name) - table.set("index", surface.index) - table.set("daytime", surface.daytime) - - return table + return { + "name": surface.name, + "index": surface.index, + "daytime": surface.daytime, + } } } @@ -76,10 +93,10 @@ export namespace Serdes { export namespace DataClasses { export function positionTableToTable(positionTable: PositionTable): JsonTable { - let table = new LuaTable() - table.set("x", positionTable.x) - table.set("y", positionTable.y) - return table + return { + "x": positionTable.x, + "y": positionTable.y, + } } } diff --git a/modules/mod/src/main/typescript/tsconfig.json b/modules/mod/src/main/typescript/tsconfig.json index dbd7f66..4b05c31 100644 --- a/modules/mod/src/main/typescript/tsconfig.json +++ b/modules/mod/src/main/typescript/tsconfig.json @@ -29,7 +29,7 @@ "tstlVerbose": true, "noHeader": true, "noImplicitSelf": true, - "luaLibImport" : "require", + "luaLibImport": "inline" }, "//": { "noResolve": true, @@ -39,7 +39,7 @@ ], "exactOptionalPropertyTypes": true, "luaTarget": "5.2", - "skipLibCheck": true, + "skipLibCheck": true, "skipDefaultLibCheck": true, "types": [ "node", @@ -50,12 +50,10 @@ "node_modules/@types" ], "//": "lua-types/5.2", - "luaLibImport" : "inline", + "luaLibImport": "inline", "noImplicitSelf": true, - "sourceMapTraceback": true, - - "luaBundle " : "bundle.lua", - "luaBundleEntry " : "bundleEntry.lua" + "luaBundle ": "bundle.lua", + "luaBundleEntry ": "bundleEntry.lua" } }