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 {Data, Mods} from "typed-factorio/settings/types"
|
||||||
// import { events } from "typed-factorio/generated"
|
// import { events } from "typed-factorio/generated"
|
||||||
|
|
||||||
|
|
@ -17,44 +13,57 @@ import {JsonTable, Serdes} from "./serdes/serdes"
|
||||||
// const SERVER_ID: uint = 0
|
// const SERVER_ID: uint = 0
|
||||||
// const EVENT_FILE_DIR: string = "events"
|
// 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 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) {
|
if (player.character != undefined) {
|
||||||
entityEvent(tick, player.character, eventType)
|
handleEntityUpdate(tick, player.character, eventType)
|
||||||
|
|
||||||
for (const char of player.get_associated_characters()) {
|
for (const char of player.get_associated_characters()) {
|
||||||
if (char != undefined) {
|
if (char != undefined) {
|
||||||
entityEvent(tick, char, eventType)
|
handleEntityUpdate(tick, char, eventType)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function entityEvent(tick: uint, entity: LuaEntity, eventType: string) {
|
function handleEntityUpdate(tick: uint, entity: LuaEntity, eventType: string) {
|
||||||
if (entity.unit_number != undefined && entity.unit_number != 0) {
|
let table = Serdes.Entity.entityToTable(entity)
|
||||||
let filename: string = table.concat([entity.unit_number, eventType, tick], "_")
|
let event = createFactorioEvent(tick, entity.object_name, eventType, table)
|
||||||
let data = Serdes.Entity.entityToTable(entity)
|
emitEvent(event)
|
||||||
outputEventFile(entity.object_name + "/" + filename, data)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function surfaceEvent(tick: uint, surface: LuaSurface, eventType: string) {
|
function surfaceEvent(tick: uint, surface: LuaSurface, eventType: string) {
|
||||||
let filename: string =
|
let table = Serdes.Surface.surfaceToTable(surface)
|
||||||
surface.object_name + "/" + table.concat([surface.index, eventType, tick], "_")
|
let event = createFactorioEvent(tick, surface.object_name, eventType, table)
|
||||||
let data = Serdes.Surface.surfaceToTable(surface)
|
emitEvent(event)
|
||||||
outputEventFile(filename, data)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function outputEventFile(filename: string, obj: JsonTable) {
|
/** Emit a serialised event */
|
||||||
let data = game.table_to_json(obj)
|
function emitEvent(event: JsonTable) {
|
||||||
|
let data = game.table_to_json(event)
|
||||||
// game.write_file(EVENT_FILE_DIR + "/" + filename, data, false, SERVER_ID)
|
// game.write_file(EVENT_FILE_DIR + "/" + filename, data, false, SERVER_ID)
|
||||||
localised_print(`!===== ${filename} | ${data} =====!`)
|
localised_print(`FactorioWebMapJsonEvent: ${data}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
// script.on_event(
|
// script.on_event(
|
||||||
|
|
@ -67,21 +76,22 @@ function outputEventFile(filename: string, obj: JsonTable) {
|
||||||
script.on_event(
|
script.on_event(
|
||||||
defines.events.on_player_mined_entity,
|
defines.events.on_player_mined_entity,
|
||||||
(e: OnPlayerMinedEntityEvent) => {
|
(e: OnPlayerMinedEntityEvent) => {
|
||||||
entityEvent(e.tick, e.entity, "on_player_mined_entity")
|
handlePlayerUpdate(e.tick, e.player_index, "on_player_mined_entity")
|
||||||
playerEvent(e.tick, e.player_index, "on_player_mined_entity")
|
handleEntityUpdate(e.tick, e.entity, "on_player_mined_entity")
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
script.on_event(
|
script.on_event(
|
||||||
defines.events.on_player_joined_game,
|
defines.events.on_player_joined_game,
|
||||||
(e: OnPlayerJoinedGameEvent) => {
|
(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(
|
script.on_event(
|
||||||
defines.events.on_player_changed_position,
|
defines.events.on_player_changed_position,
|
||||||
|
// this is actually a character update, not a player update?
|
||||||
(e: OnPlayerChangedPositionEvent) => {
|
(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) => {
|
(e: OnTickEvent) => {
|
||||||
if (e.tick % 60 == 0) {
|
if (e.tick % 60 == 0) {
|
||||||
|
|
||||||
game.surfaces
|
|
||||||
|
|
||||||
for (const [index,] of pairs(game.surfaces)) {
|
for (const [index,] of pairs(game.surfaces)) {
|
||||||
let surface = game.surfaces[index]
|
let surface = game.surfaces[index]
|
||||||
surfaceEvent(e.tick, surface, "on_tick")
|
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 JsonPrimitiveType = number | string | boolean | undefined | null | void
|
||||||
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 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 Serdes {
|
||||||
|
|
||||||
export namespace Player {
|
export namespace Player {
|
||||||
|
|
||||||
export function playerToTable(player: LuaPlayer): JsonTable {
|
export function playerToTable(player: LuaPlayer): JsonTable {
|
||||||
let table = new LuaTable<string, JsonTableValueType>()
|
let charIds = Entity.entitiesToUnitNumbers(player.get_associated_characters())
|
||||||
|
return {
|
||||||
table.set("name", player.name)
|
"name": player.name,
|
||||||
let charIds: JsonArray<number> = Entity.entitiesToUnitNumbers(player.get_associated_characters())
|
"characterId": player.character?.unit_number,
|
||||||
table.set("characterIds", charIds)
|
"associatedCharacterIds": charIds,
|
||||||
|
"position": DataClasses.positionTableToTable(player.position),
|
||||||
return table
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -27,34 +48,32 @@ export namespace Serdes {
|
||||||
export namespace Entity {
|
export namespace Entity {
|
||||||
|
|
||||||
export function entityToTable(entity: LuaEntity): JsonTable {
|
export function entityToTable(entity: LuaEntity): JsonTable {
|
||||||
let table = new LuaTable<string, JsonTableValueType>()
|
|
||||||
|
|
||||||
if (entity.player?.index != null) {
|
let player: JsonTable =
|
||||||
table.set("playerId", entity.player?.index)
|
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> {
|
export function entitiesToUnitNumbers(entities: LuaEntity[]): JsonArray<number> {
|
||||||
let array: number[] = []
|
let result: (number) [] = []
|
||||||
let j: number = 0
|
for (let entity of entities) {
|
||||||
for (let i = 0; i < entities.length; i++) {
|
if (entity.unit_number != null) {
|
||||||
let unitNum = entities[i].unit_number
|
result[result.length] = entity.unit_number
|
||||||
if (unitNum != null) {
|
|
||||||
array[j++] = unitNum
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return array
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -62,13 +81,11 @@ export namespace Serdes {
|
||||||
export namespace Surface {
|
export namespace Surface {
|
||||||
|
|
||||||
export function surfaceToTable(surface: LuaSurface): JsonTable {
|
export function surfaceToTable(surface: LuaSurface): JsonTable {
|
||||||
let table = new LuaTable<string, JsonTableValueType>()
|
return {
|
||||||
|
"name": surface.name,
|
||||||
table.set("name", surface.name)
|
"index": surface.index,
|
||||||
table.set("index", surface.index)
|
"daytime": surface.daytime,
|
||||||
table.set("daytime", surface.daytime)
|
}
|
||||||
|
|
||||||
return table
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -76,10 +93,10 @@ export namespace Serdes {
|
||||||
export namespace DataClasses {
|
export namespace DataClasses {
|
||||||
|
|
||||||
export function positionTableToTable(positionTable: PositionTable): JsonTable {
|
export function positionTableToTable(positionTable: PositionTable): JsonTable {
|
||||||
let table = new LuaTable<string, JsonTableValueType>()
|
return {
|
||||||
table.set("x", positionTable.x)
|
"x": positionTable.x,
|
||||||
table.set("y", positionTable.y)
|
"y": positionTable.y,
|
||||||
return table
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@
|
||||||
"tstlVerbose": true,
|
"tstlVerbose": true,
|
||||||
"noHeader": true,
|
"noHeader": true,
|
||||||
"noImplicitSelf": true,
|
"noImplicitSelf": true,
|
||||||
"luaLibImport" : "require",
|
"luaLibImport": "inline"
|
||||||
},
|
},
|
||||||
"//": {
|
"//": {
|
||||||
"noResolve": true,
|
"noResolve": true,
|
||||||
|
|
@ -39,7 +39,7 @@
|
||||||
],
|
],
|
||||||
"exactOptionalPropertyTypes": true,
|
"exactOptionalPropertyTypes": true,
|
||||||
"luaTarget": "5.2",
|
"luaTarget": "5.2",
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"skipDefaultLibCheck": true,
|
"skipDefaultLibCheck": true,
|
||||||
"types": [
|
"types": [
|
||||||
"node",
|
"node",
|
||||||
|
|
@ -50,12 +50,10 @@
|
||||||
"node_modules/@types"
|
"node_modules/@types"
|
||||||
],
|
],
|
||||||
"//": "lua-types/5.2",
|
"//": "lua-types/5.2",
|
||||||
"luaLibImport" : "inline",
|
"luaLibImport": "inline",
|
||||||
"noImplicitSelf": true,
|
"noImplicitSelf": true,
|
||||||
|
|
||||||
"sourceMapTraceback": true,
|
"sourceMapTraceback": true,
|
||||||
|
"luaBundle ": "bundle.lua",
|
||||||
"luaBundle " : "bundle.lua",
|
"luaBundleEntry ": "bundleEntry.lua"
|
||||||
"luaBundleEntry " : "bundleEntry.lua"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue