events -> json export properly working!
This commit is contained in:
parent
a70b2935f3
commit
239951ac48
4 changed files with 108 additions and 101 deletions
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -1,16 +0,0 @@
|
|||
// declare interface LuaArray<TValue = any> extends LuaTable<number, TValue> {
|
||||
// }
|
||||
|
||||
// = LuaTable<number, TValue>;
|
||||
|
||||
// declare type LuaArrayConstructor = (new <TValue = any>() => LuaArray<TValue>)
|
||||
|
||||
// declare const LuaArray: LuaArrayConstructor
|
||||
|
||||
// class LuaArray<TValue = any> extends LuaTable<number, TValue> {
|
||||
// add(val: TValue) {
|
||||
// this.set(this.length(), val)
|
||||
// }
|
||||
// }
|
||||
|
||||
// declare type LuaArray<TKey extends AnyNotNil = AnyNotNil, TValue = any> & LuaTable<TKey, TValue>
|
||||
|
|
@ -1,25 +1,46 @@
|
|||
export type PrimitiveType = number | string | boolean
|
||||
export type JsonArray<TValue extends PrimitiveType> = TValue[]
|
||||
export type JsonTableValueType =
|
||||
PrimitiveType
|
||||
| JsonTable
|
||||
| JsonArray<PrimitiveType>
|
||||
export type JsonTable = LuaTable<string, JsonTableValueType> // & table
|
||||
// export type JsonArray = LuaArray<PrimitiveType> // & table
|
||||
export type JsonPrimitiveType = number | string | boolean | undefined | null | void
|
||||
|
||||
// export type JsonArray<TValue extends JsonPrimitiveType> = TValue[]
|
||||
// export class JsonArray extends Array<JsonPrimitiveTypes> {
|
||||
// }
|
||||
|
||||
// export type JsonArray = Array<JsonPrimitiveTypes>
|
||||
// declare type JsonArrayConstructor = (new () => JsonArray)
|
||||
// declare const JsonArray: JsonArrayConstructor
|
||||
|
||||
export type JsonArray<T extends JsonPrimitiveType = void> = T[]
|
||||
|
||||
export type JsonTableValueType =
|
||||
JsonPrimitiveType
|
||||
| JsonTable
|
||||
| JsonArray<JsonPrimitiveType>
|
||||
| undefined
|
||||
| null
|
||||
|
||||
// export class JsonTable extends LuaTable<string, JsonTableValueType> {
|
||||
// }
|
||||
// export type JsonTable = LuaTable<string, JsonTableValueType>
|
||||
// const JsonTable = () => new LuaTable<string, JsonTableValueType>()
|
||||
// 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<string, JsonTableValueType>()
|
||||
|
||||
table.set("name", player.name)
|
||||
let charIds: JsonArray<number> = 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<string, JsonTableValueType>()
|
||||
|
||||
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<number> {
|
||||
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<string, JsonTableValueType>()
|
||||
|
||||
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<string, JsonTableValueType>()
|
||||
table.set("x", positionTable.x)
|
||||
table.set("y", positionTable.y)
|
||||
return table
|
||||
return {
|
||||
"x": positionTable.x,
|
||||
"y": positionTable.y,
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue