diff --git a/modules/mod/build.gradle.kts b/modules/mod/build.gradle.kts index 78ab75e..46bf8fc 100644 --- a/modules/mod/build.gradle.kts +++ b/modules/mod/build.gradle.kts @@ -80,6 +80,9 @@ val modPackageTask = tasks.register("package") { //tasks.build { dependsOn(tstlTask, modPackageTask) } +val modInfraDir = layout.projectDirectory.dir("infra") +val factorioServerDataDir = modInfraDir.dir("factorio-server") + val copyModToServerTask = tasks.register("copyModToServer") { description = "Copy the mod to the Factorio Docker server" group = "$projectId.factorioServer" @@ -87,7 +90,11 @@ val copyModToServerTask = tasks.register("copyModToServer") { dependsOn(modPackageTask) from(modPackageTask) - into(layout.projectDirectory.dir("infra/factorio-server/data/mods").asFile) + into(factorioServerDataDir.dir("mods")) + + doLast { + logger.lifecycle("Copying mod from ${source.files} to $destinationDir") + } } val serverStopTask = tasks.register("dockerStop") { @@ -95,7 +102,7 @@ val serverStopTask = tasks.register("dockerStop") { mustRunAfter(copyModToServerTask) - workingDir = layout.projectDirectory.dir("infra/factorio-server").asFile + workingDir(modInfraDir) commandLine = parseSpaceSeparatedArgs("docker-compose stop factorio-server") } @@ -105,7 +112,7 @@ val serverUpTask = tasks.register("dockerUp") { mustRunAfter(copyModToServerTask) dependsOn(serverStopTask) - workingDir = layout.projectDirectory.dir("infra/factorio-server").asFile + workingDir(modInfraDir) commandLine = parseSpaceSeparatedArgs("docker-compose up -d factorio-server") } @@ -124,6 +131,10 @@ val copyModToClientTask = tasks.register("copyModToClient") { from(modPackageTask) into("""D:\Users\Adam\AppData\Roaming\Factorio\mods""") + + doLast { + logger.lifecycle("Copying mod from ${source.files} to $destinationDir") + } } //val factorioClientLaunch = tasks.register("launch") { diff --git a/modules/mod/infra/.gitignore b/modules/mod/infra/.gitignore index 1269488..b09a6cc 100644 --- a/modules/mod/infra/.gitignore +++ b/modules/mod/infra/.gitignore @@ -1 +1 @@ -data +factorio-server diff --git a/modules/mod/infra/docker-compose.yml b/modules/mod/infra/docker-compose.yml index 98146d7..7ea4ccc 100644 --- a/modules/mod/infra/docker-compose.yml +++ b/modules/mod/infra/docker-compose.yml @@ -6,13 +6,13 @@ services: image: factoriotools/factorio:1.1.42 # logging: # driver: "json-file" - container_name: "factorio" + container_name: "factorio-server" restart: "unless-stopped" ports: - "34197:34197/udp" # factorio - "27015:27015/tcp" # rcon volumes: - - "./data:/factorio" + - "./factorio-server:/factorio" # logging: # driver: "mickyg/kafka-logdriver:latest" # options: @@ -31,7 +31,7 @@ services: kafka-kraft: image: dev-adamko/kafka-kraft - container_name: "kafka-factorio" + container_name: "kafka-kraft" build: dockerfile: "kafka.Dockerfile" target: "kafka-kraft" diff --git a/modules/mod/pipe-logs-to-kafka.sh b/modules/mod/pipe-logs-to-kafka.sh index 2a06458..96fbe5a 100644 --- a/modules/mod/pipe-logs-to-kafka.sh +++ b/modules/mod/pipe-logs-to-kafka.sh @@ -1,3 +1,5 @@ +#!/usr/bin/env bash + # stream logs from 'factorio' container # follow the logs, and # combine stdout and stderr @@ -6,3 +8,6 @@ docker logs --tail 0 -f factorio 2>&1 | sed -n -e 's/^FactorioEvent: //p' | kafkacat -P -b localhost -t factorio-server-log + +# listen to events +# kafkacat -C -b localhost -t factorio-server-log | jq diff --git a/modules/mod/src/main/typescript/events.ts b/modules/mod/src/main/typescript/events.ts index c60255c..50b08ad 100644 --- a/modules/mod/src/main/typescript/events.ts +++ b/modules/mod/src/main/typescript/events.ts @@ -10,54 +10,64 @@ import {JsonTable, Serdes} from "./serdes/serdes" -// const SERVER_ID: uint = 0 -// const EVENT_FILE_DIR: string = "events" -function createFactorioEvent(tick: uint, object_name: string, eventType: string, data: JsonTable): JsonTable { - return { - tick, - object_name, - eventType, - data, - } +interface FactorioEvent extends JsonTable { + tick: uint + object_name: string, + event_type: string, + data: JsonTable, } -function handlePlayerUpdate(tick: uint, player_index: uint, eventType: string) { - let player: LuaPlayer = game.players[player_index] +const FactorioEvent = ((tick: uint, objectName: string, eventType: string, data: JsonTable) => { + return { + tick: tick, + object_name: objectName, + event_type: eventType, + data: data, + } as FactorioEvent + } +) + +// function createFactorioEvent(tick: uint, object_name: string, eventType: string, data: +// JsonTable): FactorioEvent { return { tick, object_name, eventType, data, } } + +function handlePlayerUpdate(tick: uint, playerIndex: uint, eventType: string) { + let player: LuaPlayer = game.players[playerIndex] let table = Serdes.Player.playerToTable(player) - let event = createFactorioEvent(tick, player.object_name, eventType, table) + let event = FactorioEvent(tick, player.object_name, eventType, table) emitEvent(event) - handleCharactersEvent(tick, player_index, eventType) + handleCharactersEvent(tick, playerIndex, eventType) } -function handleCharactersEvent(tick: uint, player_index: uint, eventType: string) { +function handleCharactersEvent(tick: uint, playerIndex: uint, eventType: string) { - let player: LuaPlayer = game.players[player_index] + let player: LuaPlayer = game.players[playerIndex] if (player.character != undefined) { handleEntityUpdate(tick, player.character, eventType) - - for (const char of player.get_associated_characters()) { - if (char != undefined) { - handleEntityUpdate(tick, char, eventType) - } + } + for (const character of player.get_associated_characters()) { + if (character != undefined) { + handleEntityUpdate(tick, character, eventType) } } } function handleEntityUpdate(tick: uint, entity: LuaEntity, eventType: string) { let table = Serdes.Entity.entityToTable(entity) - let event = createFactorioEvent(tick, entity.object_name, eventType, table) + let event = FactorioEvent(tick, entity.object_name, eventType, table) emitEvent(event) } function surfaceEvent(tick: uint, surface: LuaSurface, eventType: string) { let table = Serdes.Surface.surfaceToTable(surface) - let event = createFactorioEvent(tick, surface.object_name, eventType, table) + let event = FactorioEvent(tick, surface.object_name, eventType, table) emitEvent(event) } +// const SERVER_ID: uint = 0 +// const EVENT_FILE_DIR: string = "events" /** Emit a serialised event */ function emitEvent(event: JsonTable) { let data = game.table_to_json(event) diff --git a/modules/mod/src/main/typescript/serdes/serdes.ts b/modules/mod/src/main/typescript/serdes/serdes.ts index 1728991..d2fad48 100644 --- a/modules/mod/src/main/typescript/serdes/serdes.ts +++ b/modules/mod/src/main/typescript/serdes/serdes.ts @@ -1,13 +1,5 @@ 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 = @@ -17,6 +9,18 @@ export type JsonTableValueType = | undefined | null +export interface JsonTable { + [key: string]: JsonTableValueType +} + +// export type JsonArray = TValue[] +// export class JsonArray extends Array { +// } + +// export type JsonArray = Array +// declare type JsonArrayConstructor = (new () => JsonArray) +// declare const JsonArray: JsonArrayConstructor + // export class JsonTable extends LuaTable { // } // export type JsonTable = LuaTable @@ -25,10 +29,6 @@ export type JsonTableValueType = // declare const JsonTable: JsonTableConstructor -export interface JsonTable { - [key: string]: JsonTableValueType -} - export namespace Serdes { export namespace Player { @@ -36,10 +36,10 @@ export namespace Serdes { export function playerToTable(player: LuaPlayer): JsonTable { let charIds = Entity.entitiesToUnitNumbers(player.get_associated_characters()) return { - "name": player.name, - "characterId": player.character?.unit_number, - "associatedCharacterIds": charIds, - "position": DataClasses.positionTableToTable(player.position), + name: player.name, + character_unit_number: player.character?.unit_number, + associated_characters_unit_numbers: charIds, + position: DataClasses.positionTableToTable(player.position), } } @@ -49,21 +49,22 @@ export namespace Serdes { export function entityToTable(entity: LuaEntity): JsonTable { - 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), + let data: JsonTable = { + name: entity.name, + type: entity.type, + active: entity.active, + health: entity.health, + surface_index: entity.surface.index, + unit_number: entity.unit_number, + position: DataClasses.positionTableToTable(entity.position), } + + if (entity.is_player()) { + let player = entity.player!! + data.player_index = player.index + } + + return data } export function entitiesToUnitNumbers(entities: LuaEntity[]): JsonArray { @@ -82,9 +83,9 @@ export namespace Serdes { export function surfaceToTable(surface: LuaSurface): JsonTable { return { - "name": surface.name, - "index": surface.index, - "daytime": surface.daytime, + name: surface.name, + index: surface.index, + daytime: surface.daytime, } } @@ -94,8 +95,8 @@ export namespace Serdes { export function positionTableToTable(positionTable: PositionTable): JsonTable { return { - "x": positionTable.x, - "y": positionTable.y, + x: positionTable.x, + y: positionTable.y, } }