refactoring, standardised naming, shuffling the docker infra around,
This commit is contained in:
parent
f9b93c013d
commit
5e69799136
6 changed files with 91 additions and 64 deletions
|
|
@ -80,6 +80,9 @@ val modPackageTask = tasks.register<Zip>("package") {
|
||||||
|
|
||||||
//tasks.build { dependsOn(tstlTask, modPackageTask) }
|
//tasks.build { dependsOn(tstlTask, modPackageTask) }
|
||||||
|
|
||||||
|
val modInfraDir = layout.projectDirectory.dir("infra")
|
||||||
|
val factorioServerDataDir = modInfraDir.dir("factorio-server")
|
||||||
|
|
||||||
val copyModToServerTask = tasks.register<Copy>("copyModToServer") {
|
val copyModToServerTask = tasks.register<Copy>("copyModToServer") {
|
||||||
description = "Copy the mod to the Factorio Docker server"
|
description = "Copy the mod to the Factorio Docker server"
|
||||||
group = "$projectId.factorioServer"
|
group = "$projectId.factorioServer"
|
||||||
|
|
@ -87,7 +90,11 @@ val copyModToServerTask = tasks.register<Copy>("copyModToServer") {
|
||||||
dependsOn(modPackageTask)
|
dependsOn(modPackageTask)
|
||||||
|
|
||||||
from(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<Exec>("dockerStop") {
|
val serverStopTask = tasks.register<Exec>("dockerStop") {
|
||||||
|
|
@ -95,7 +102,7 @@ val serverStopTask = tasks.register<Exec>("dockerStop") {
|
||||||
|
|
||||||
mustRunAfter(copyModToServerTask)
|
mustRunAfter(copyModToServerTask)
|
||||||
|
|
||||||
workingDir = layout.projectDirectory.dir("infra/factorio-server").asFile
|
workingDir(modInfraDir)
|
||||||
commandLine = parseSpaceSeparatedArgs("docker-compose stop factorio-server")
|
commandLine = parseSpaceSeparatedArgs("docker-compose stop factorio-server")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -105,7 +112,7 @@ val serverUpTask = tasks.register<Exec>("dockerUp") {
|
||||||
mustRunAfter(copyModToServerTask)
|
mustRunAfter(copyModToServerTask)
|
||||||
dependsOn(serverStopTask)
|
dependsOn(serverStopTask)
|
||||||
|
|
||||||
workingDir = layout.projectDirectory.dir("infra/factorio-server").asFile
|
workingDir(modInfraDir)
|
||||||
commandLine = parseSpaceSeparatedArgs("docker-compose up -d factorio-server")
|
commandLine = parseSpaceSeparatedArgs("docker-compose up -d factorio-server")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -124,6 +131,10 @@ val copyModToClientTask = tasks.register<Copy>("copyModToClient") {
|
||||||
|
|
||||||
from(modPackageTask)
|
from(modPackageTask)
|
||||||
into("""D:\Users\Adam\AppData\Roaming\Factorio\mods""")
|
into("""D:\Users\Adam\AppData\Roaming\Factorio\mods""")
|
||||||
|
|
||||||
|
doLast {
|
||||||
|
logger.lifecycle("Copying mod from ${source.files} to $destinationDir")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//val factorioClientLaunch = tasks.register<Exec>("launch") {
|
//val factorioClientLaunch = tasks.register<Exec>("launch") {
|
||||||
|
|
|
||||||
2
modules/mod/infra/.gitignore
vendored
2
modules/mod/infra/.gitignore
vendored
|
|
@ -1 +1 @@
|
||||||
data
|
factorio-server
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,13 @@ services:
|
||||||
image: factoriotools/factorio:1.1.42
|
image: factoriotools/factorio:1.1.42
|
||||||
# logging:
|
# logging:
|
||||||
# driver: "json-file"
|
# driver: "json-file"
|
||||||
container_name: "factorio"
|
container_name: "factorio-server"
|
||||||
restart: "unless-stopped"
|
restart: "unless-stopped"
|
||||||
ports:
|
ports:
|
||||||
- "34197:34197/udp" # factorio
|
- "34197:34197/udp" # factorio
|
||||||
- "27015:27015/tcp" # rcon
|
- "27015:27015/tcp" # rcon
|
||||||
volumes:
|
volumes:
|
||||||
- "./data:/factorio"
|
- "./factorio-server:/factorio"
|
||||||
# logging:
|
# logging:
|
||||||
# driver: "mickyg/kafka-logdriver:latest"
|
# driver: "mickyg/kafka-logdriver:latest"
|
||||||
# options:
|
# options:
|
||||||
|
|
@ -31,7 +31,7 @@ services:
|
||||||
|
|
||||||
kafka-kraft:
|
kafka-kraft:
|
||||||
image: dev-adamko/kafka-kraft
|
image: dev-adamko/kafka-kraft
|
||||||
container_name: "kafka-factorio"
|
container_name: "kafka-kraft"
|
||||||
build:
|
build:
|
||||||
dockerfile: "kafka.Dockerfile"
|
dockerfile: "kafka.Dockerfile"
|
||||||
target: "kafka-kraft"
|
target: "kafka-kraft"
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# stream logs from 'factorio' container
|
# stream logs from 'factorio' container
|
||||||
# follow the logs, and
|
# follow the logs, and
|
||||||
# combine stdout and stderr
|
# combine stdout and stderr
|
||||||
|
|
@ -6,3 +8,6 @@
|
||||||
docker logs --tail 0 -f factorio 2>&1 |
|
docker logs --tail 0 -f factorio 2>&1 |
|
||||||
sed -n -e 's/^FactorioEvent: //p' |
|
sed -n -e 's/^FactorioEvent: //p' |
|
||||||
kafkacat -P -b localhost -t factorio-server-log
|
kafkacat -P -b localhost -t factorio-server-log
|
||||||
|
|
||||||
|
# listen to events
|
||||||
|
# kafkacat -C -b localhost -t factorio-server-log | jq
|
||||||
|
|
|
||||||
|
|
@ -10,54 +10,64 @@
|
||||||
|
|
||||||
import {JsonTable, Serdes} from "./serdes/serdes"
|
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 {
|
interface FactorioEvent extends JsonTable {
|
||||||
return {
|
tick: uint
|
||||||
tick,
|
object_name: string,
|
||||||
object_name,
|
event_type: string,
|
||||||
eventType,
|
data: JsonTable,
|
||||||
data,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function handlePlayerUpdate(tick: uint, player_index: uint, eventType: string) {
|
const FactorioEvent = ((tick: uint, objectName: string, eventType: string, data: JsonTable) => {
|
||||||
let player: LuaPlayer = game.players[player_index]
|
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 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)
|
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) {
|
if (player.character != undefined) {
|
||||||
handleEntityUpdate(tick, player.character, eventType)
|
handleEntityUpdate(tick, player.character, eventType)
|
||||||
|
}
|
||||||
for (const char of player.get_associated_characters()) {
|
for (const character of player.get_associated_characters()) {
|
||||||
if (char != undefined) {
|
if (character != undefined) {
|
||||||
handleEntityUpdate(tick, char, eventType)
|
handleEntityUpdate(tick, character, eventType)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleEntityUpdate(tick: uint, entity: LuaEntity, eventType: string) {
|
function handleEntityUpdate(tick: uint, entity: LuaEntity, eventType: string) {
|
||||||
let table = Serdes.Entity.entityToTable(entity)
|
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)
|
emitEvent(event)
|
||||||
}
|
}
|
||||||
|
|
||||||
function surfaceEvent(tick: uint, surface: LuaSurface, eventType: string) {
|
function surfaceEvent(tick: uint, surface: LuaSurface, eventType: string) {
|
||||||
let table = Serdes.Surface.surfaceToTable(surface)
|
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)
|
emitEvent(event)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// const SERVER_ID: uint = 0
|
||||||
|
// const EVENT_FILE_DIR: string = "events"
|
||||||
/** Emit a serialised event */
|
/** Emit a serialised event */
|
||||||
function emitEvent(event: JsonTable) {
|
function emitEvent(event: JsonTable) {
|
||||||
let data = game.table_to_json(event)
|
let data = game.table_to_json(event)
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,5 @@
|
||||||
export type JsonPrimitiveType = number | string | boolean | undefined | null | void
|
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 JsonArray<T extends JsonPrimitiveType = void> = T[]
|
||||||
|
|
||||||
export type JsonTableValueType =
|
export type JsonTableValueType =
|
||||||
|
|
@ -17,6 +9,18 @@ export type JsonTableValueType =
|
||||||
| undefined
|
| undefined
|
||||||
| null
|
| null
|
||||||
|
|
||||||
|
export interface JsonTable {
|
||||||
|
[key: string]: JsonTableValueType
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 class JsonTable extends LuaTable<string, JsonTableValueType> {
|
// export class JsonTable extends LuaTable<string, JsonTableValueType> {
|
||||||
// }
|
// }
|
||||||
// export type JsonTable = LuaTable<string, JsonTableValueType>
|
// export type JsonTable = LuaTable<string, JsonTableValueType>
|
||||||
|
|
@ -25,10 +29,6 @@ export type JsonTableValueType =
|
||||||
// declare const JsonTable: JsonTableConstructor
|
// declare const JsonTable: JsonTableConstructor
|
||||||
|
|
||||||
|
|
||||||
export interface JsonTable {
|
|
||||||
[key: string]: JsonTableValueType
|
|
||||||
}
|
|
||||||
|
|
||||||
export namespace Serdes {
|
export namespace Serdes {
|
||||||
|
|
||||||
export namespace Player {
|
export namespace Player {
|
||||||
|
|
@ -36,10 +36,10 @@ export namespace Serdes {
|
||||||
export function playerToTable(player: LuaPlayer): JsonTable {
|
export function playerToTable(player: LuaPlayer): JsonTable {
|
||||||
let charIds = Entity.entitiesToUnitNumbers(player.get_associated_characters())
|
let charIds = Entity.entitiesToUnitNumbers(player.get_associated_characters())
|
||||||
return {
|
return {
|
||||||
"name": player.name,
|
name: player.name,
|
||||||
"characterId": player.character?.unit_number,
|
character_unit_number: player.character?.unit_number,
|
||||||
"associatedCharacterIds": charIds,
|
associated_characters_unit_numbers: charIds,
|
||||||
"position": DataClasses.positionTableToTable(player.position),
|
position: DataClasses.positionTableToTable(player.position),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -49,21 +49,22 @@ export namespace Serdes {
|
||||||
|
|
||||||
export function entityToTable(entity: LuaEntity): JsonTable {
|
export function entityToTable(entity: LuaEntity): JsonTable {
|
||||||
|
|
||||||
let player: JsonTable =
|
let data: JsonTable = {
|
||||||
entity.is_player() ? {
|
name: entity.name,
|
||||||
"playerId": entity.player?.index,
|
type: entity.type,
|
||||||
} : {}
|
active: entity.active,
|
||||||
|
health: entity.health,
|
||||||
return {
|
surface_index: entity.surface.index,
|
||||||
player,
|
unit_number: entity.unit_number,
|
||||||
"name": entity.name,
|
position: DataClasses.positionTableToTable(entity.position),
|
||||||
"type": entity.type,
|
|
||||||
"active": entity.active,
|
|
||||||
"health": entity.health,
|
|
||||||
"surfaceId": 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<number> {
|
export function entitiesToUnitNumbers(entities: LuaEntity[]): JsonArray<number> {
|
||||||
|
|
@ -82,9 +83,9 @@ export namespace Serdes {
|
||||||
|
|
||||||
export function surfaceToTable(surface: LuaSurface): JsonTable {
|
export function surfaceToTable(surface: LuaSurface): JsonTable {
|
||||||
return {
|
return {
|
||||||
"name": surface.name,
|
name: surface.name,
|
||||||
"index": surface.index,
|
index: surface.index,
|
||||||
"daytime": surface.daytime,
|
daytime: surface.daytime,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -94,8 +95,8 @@ export namespace Serdes {
|
||||||
|
|
||||||
export function positionTableToTable(positionTable: PositionTable): JsonTable {
|
export function positionTableToTable(positionTable: PositionTable): JsonTable {
|
||||||
return {
|
return {
|
||||||
"x": positionTable.x,
|
x: positionTable.x,
|
||||||
"y": positionTable.y,
|
y: positionTable.y,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue