Port events-mod to Factorio 2.0.77, declare SE/Krastorio 2 compatibility
Bumps the Factorio engine pin and typed-factorio (1.11.0 -> 3.36.0, targeting 2.0.75) and fixes the resulting breaking API changes: global -> storage, game.*_prototypes -> prototypes.*, game.table_to_json/ encode_string -> helpers.*, OnBuiltEntityEvent.created_entity -> .entity, removed TileRead/ColorTable/MapPositionTable-style write-form aliases, new CollisionMask shape, restructured settings-stage type imports, and new defines.entity_status values (added to the Status enum, generated schema, and EntityStatusRecord mapping). Also declares optional mod dependencies on space-exploration and Krastorio2. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
8281821075
commit
072d1a2845
20 changed files with 183 additions and 73 deletions
|
|
@ -53,7 +53,7 @@ nimbusJoseJwt = "9.25.6" # https://search.maven.org/artifact/com.
|
||||||
|
|
||||||
npm-luaTypes = "2.13.1" # https://www.npmjs.com/package/lua-types
|
npm-luaTypes = "2.13.1" # https://www.npmjs.com/package/lua-types
|
||||||
npm-typescriptToLua = "1.11.1" # https://www.npmjs.com/package/typescript-to-lua
|
npm-typescriptToLua = "1.11.1" # https://www.npmjs.com/package/typescript-to-lua
|
||||||
npm-typedFactorio = "1.11.0" # https://github.com/GlassBricks/typed-factorio/blob/main/Changelog.md https://www.npmjs.com/package/typed-factorio
|
npm-typedFactorio = "3.36.0" # targets Factorio 2.0.75 ("factorio-2.0" dist-tag); https://github.com/GlassBricks/typed-factorio/blob/main/Changelog.md https://www.npmjs.com/package/typed-factorio
|
||||||
npm-typescript = "4.9" # https://github.com/microsoft/TypeScript/releases
|
npm-typescript = "4.9" # https://github.com/microsoft/TypeScript/releases
|
||||||
|
|
||||||
npm-bootswatch = "5.2.2" # https://www.jsdelivr.com/package/npm/bootswatch
|
npm-bootswatch = "5.2.2" # https://www.jsdelivr.com/package/npm/bootswatch
|
||||||
|
|
@ -65,7 +65,7 @@ mockk = "1.13.3" # https://github.com/mockk/mockk/releases/
|
||||||
|
|
||||||
|
|
||||||
## infra ##
|
## infra ##
|
||||||
factorio = "1.1.72" # https://www.factorio.com/download
|
factorio = "2.0.77" # https://www.factorio.com/download
|
||||||
confluent-kafkaConnect = "7.0.1"
|
confluent-kafkaConnect = "7.0.1"
|
||||||
grafana = "8.5.0"
|
grafana = "8.5.0"
|
||||||
prometheus = "v2.34.0"
|
prometheus = "v2.34.0"
|
||||||
|
|
|
||||||
|
|
@ -158,6 +158,57 @@ sealed interface FactorioEntityData {
|
||||||
NOT_CONNECTED_TO_RAIL,
|
NOT_CONNECTED_TO_RAIL,
|
||||||
/** Used by rail signals. */
|
/** Used by rail signals. */
|
||||||
CANT_DIVIDE_SEGMENTS,
|
CANT_DIVIDE_SEGMENTS,
|
||||||
|
|
||||||
|
// Factorio 2.0 additions (Space Age / space platforms, agricultural towers, etc.)
|
||||||
|
|
||||||
|
/** Used by ghosts. */
|
||||||
|
GHOST,
|
||||||
|
/** Only used if set through `ContainerPrototype::default_status`. */
|
||||||
|
BROKEN,
|
||||||
|
/** Used by entities affected by freezing. */
|
||||||
|
FROZEN,
|
||||||
|
/** Used by space platform hubs. */
|
||||||
|
PAUSED,
|
||||||
|
/** Used by cargo bays. */
|
||||||
|
NOT_CONNECTED_TO_HUB_OR_PAD,
|
||||||
|
/** Used by agricultural towers. */
|
||||||
|
NOT_ENOUGH_SPACE_IN_OUTPUT,
|
||||||
|
/** Used by burner energy sources. */
|
||||||
|
FULL_BURNT_RESULT_OUTPUT,
|
||||||
|
/** Used by inserters when wait_for_full_hand is set. */
|
||||||
|
WAITING_FOR_MORE_ITEMS,
|
||||||
|
/** Used by the rocket silo. */
|
||||||
|
WAITING_FOR_SPACE_IN_PLATFORM_HUB,
|
||||||
|
/** Used by thrusters. */
|
||||||
|
THRUST_NOT_REQUIRED,
|
||||||
|
/** Used by space platform hubs. */
|
||||||
|
ON_THE_WAY,
|
||||||
|
/** Used by space platform hubs. */
|
||||||
|
WAITING_IN_ORBIT,
|
||||||
|
/** Used by trains. */
|
||||||
|
WAITING_AT_STOP,
|
||||||
|
/** Used by space platform hubs. */
|
||||||
|
WAITING_FOR_ROCKETS_TO_ARRIVE,
|
||||||
|
/** Used by space platform hubs. */
|
||||||
|
NOT_ENOUGH_THRUST,
|
||||||
|
/** Used by trains. */
|
||||||
|
DESTINATION_STOP_FULL,
|
||||||
|
/** Used by trains and space platform hubs. */
|
||||||
|
NO_PATH,
|
||||||
|
/** Used by filter inserters. */
|
||||||
|
NO_FILTER,
|
||||||
|
/** Used by agricultural towers. */
|
||||||
|
NO_SPOT_SEEDABLE_BY_INPUTS,
|
||||||
|
/** Used by agricultural towers. */
|
||||||
|
WAITING_FOR_PLANTS_TO_GROW,
|
||||||
|
/** Used by asteroid collectors. */
|
||||||
|
COMPUTING_NAVIGATION,
|
||||||
|
/** Used by pipes, pipes to ground, and storage tanks. */
|
||||||
|
PIPELINE_OVEREXTENDED,
|
||||||
|
/** Used by assembling machines. */
|
||||||
|
RECIPE_NOT_RESEARCHED,
|
||||||
|
/** Used by assembling machines. */
|
||||||
|
RECIPE_IS_PARAMETER,
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,10 @@ factorioMod {
|
||||||
modTitle.set("Kafkatorio Events")
|
modTitle.set("Kafkatorio Events")
|
||||||
modAuthor.set("adam@adamko.dev")
|
modAuthor.set("adam@adamko.dev")
|
||||||
factorioCompatibility.set(libs.versions.factorio.map { it.substringBeforeLast(".") })
|
factorioCompatibility.set(libs.versions.factorio.map { it.substringBeforeLast(".") })
|
||||||
|
modDependencies.set(listOf(
|
||||||
|
"? space-exploration >= 0.7.0",
|
||||||
|
"? Krastorio2",
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
val licenseFile: RegularFile by rootProject.extra
|
val licenseFile: RegularFile by rootProject.extra
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"lua-types": "2.13.1",
|
"lua-types": "2.13.1",
|
||||||
"typescript-to-lua": "1.11.1",
|
"typescript-to-lua": "1.11.1",
|
||||||
"typed-factorio": "1.11.0",
|
"typed-factorio": "3.36.0",
|
||||||
"typescript": "4.9"
|
"typescript": "4.9"
|
||||||
},
|
},
|
||||||
"license": "GPL-3.0-only",
|
"license": "GPL-3.0-only",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,9 @@
|
||||||
---------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------
|
||||||
|
Version: 0.1.0
|
||||||
|
Changes:
|
||||||
|
- Updated for Factorio 2.0.77 (storage API, prototypes.entity/prototypes.tile, new entity statuses)
|
||||||
|
- Declared optional compatibility with Space Exploration and Krastorio 2
|
||||||
|
---------------------------------------------------------------------------------------------------
|
||||||
Version: 0.0.1
|
Version: 0.0.1
|
||||||
Features:
|
Features:
|
||||||
- Kafkatorio
|
- Kafkatorio
|
||||||
|
|
|
||||||
|
|
@ -373,4 +373,28 @@ export enum FactorioEntityStatus {
|
||||||
TURNED_OFF_DURING_DAYTIME = "TURNED_OFF_DURING_DAYTIME",
|
TURNED_OFF_DURING_DAYTIME = "TURNED_OFF_DURING_DAYTIME",
|
||||||
NOT_CONNECTED_TO_RAIL = "NOT_CONNECTED_TO_RAIL",
|
NOT_CONNECTED_TO_RAIL = "NOT_CONNECTED_TO_RAIL",
|
||||||
CANT_DIVIDE_SEGMENTS = "CANT_DIVIDE_SEGMENTS",
|
CANT_DIVIDE_SEGMENTS = "CANT_DIVIDE_SEGMENTS",
|
||||||
|
GHOST = "GHOST",
|
||||||
|
BROKEN = "BROKEN",
|
||||||
|
FROZEN = "FROZEN",
|
||||||
|
PAUSED = "PAUSED",
|
||||||
|
NOT_CONNECTED_TO_HUB_OR_PAD = "NOT_CONNECTED_TO_HUB_OR_PAD",
|
||||||
|
NOT_ENOUGH_SPACE_IN_OUTPUT = "NOT_ENOUGH_SPACE_IN_OUTPUT",
|
||||||
|
FULL_BURNT_RESULT_OUTPUT = "FULL_BURNT_RESULT_OUTPUT",
|
||||||
|
WAITING_FOR_MORE_ITEMS = "WAITING_FOR_MORE_ITEMS",
|
||||||
|
WAITING_FOR_SPACE_IN_PLATFORM_HUB = "WAITING_FOR_SPACE_IN_PLATFORM_HUB",
|
||||||
|
THRUST_NOT_REQUIRED = "THRUST_NOT_REQUIRED",
|
||||||
|
ON_THE_WAY = "ON_THE_WAY",
|
||||||
|
WAITING_IN_ORBIT = "WAITING_IN_ORBIT",
|
||||||
|
WAITING_AT_STOP = "WAITING_AT_STOP",
|
||||||
|
WAITING_FOR_ROCKETS_TO_ARRIVE = "WAITING_FOR_ROCKETS_TO_ARRIVE",
|
||||||
|
NOT_ENOUGH_THRUST = "NOT_ENOUGH_THRUST",
|
||||||
|
DESTINATION_STOP_FULL = "DESTINATION_STOP_FULL",
|
||||||
|
NO_PATH = "NO_PATH",
|
||||||
|
NO_FILTER = "NO_FILTER",
|
||||||
|
NO_SPOT_SEEDABLE_BY_INPUTS = "NO_SPOT_SEEDABLE_BY_INPUTS",
|
||||||
|
WAITING_FOR_PLANTS_TO_GROW = "WAITING_FOR_PLANTS_TO_GROW",
|
||||||
|
COMPUTING_NAVIGATION = "COMPUTING_NAVIGATION",
|
||||||
|
PIPELINE_OVEREXTENDED = "PIPELINE_OVEREXTENDED",
|
||||||
|
RECIPE_NOT_RESEARCHED = "RECIPE_NOT_RESEARCHED",
|
||||||
|
RECIPE_IS_PARAMETER = "RECIPE_IS_PARAMETER",
|
||||||
}
|
}
|
||||||
|
|
@ -3,7 +3,7 @@ import {KafkatorioKeyedPacketData} from "../types";
|
||||||
import PacketEmitter from "./PacketEmitter";
|
import PacketEmitter from "./PacketEmitter";
|
||||||
|
|
||||||
|
|
||||||
declare const global: {
|
declare const storage: {
|
||||||
/** Map the hash of the key, as a string, a cache entry */
|
/** Map the hash of the key, as a string, a cache entry */
|
||||||
eventUpdatesManagerCache: LuaTable<string, CacheEntry<KafkatorioKeyedPacketData>>,
|
eventUpdatesManagerCache: LuaTable<string, CacheEntry<KafkatorioKeyedPacketData>>,
|
||||||
}
|
}
|
||||||
|
|
@ -18,13 +18,13 @@ export class EventUpdatesManager {
|
||||||
|
|
||||||
init(force?: boolean) {
|
init(force?: boolean) {
|
||||||
|
|
||||||
const isAnythingUndefined = global.eventUpdatesManagerCache == undefined
|
const isAnythingUndefined = storage.eventUpdatesManagerCache == undefined
|
||||||
|
|
||||||
log(`Initialising EventDataCache (force=${force}, isAnythingUndefined=${isAnythingUndefined})...`)
|
log(`Initialising EventDataCache (force=${force}, isAnythingUndefined=${isAnythingUndefined})...`)
|
||||||
|
|
||||||
if (force == true || isAnythingUndefined) {
|
if (force == true || isAnythingUndefined) {
|
||||||
log("Initialising global.cache")
|
log("Initialising storage.cache")
|
||||||
global.eventUpdatesManagerCache = new LuaTable<string, CacheEntry<KafkatorioKeyedPacketData>>()
|
storage.eventUpdatesManagerCache = new LuaTable<string, CacheEntry<KafkatorioKeyedPacketData>>()
|
||||||
}
|
}
|
||||||
log(`Finished initialising EventDataCache`)
|
log(`Finished initialising EventDataCache`)
|
||||||
}
|
}
|
||||||
|
|
@ -103,12 +103,12 @@ export class EventUpdatesManager {
|
||||||
let countExpired = 0
|
let countExpired = 0
|
||||||
let countTotal = 0
|
let countTotal = 0
|
||||||
const expiredData: Array<KafkatorioKeyedPacketData> = []
|
const expiredData: Array<KafkatorioKeyedPacketData> = []
|
||||||
for (const [key, entry] of global.eventUpdatesManagerCache) {
|
for (const [key, entry] of storage.eventUpdatesManagerCache) {
|
||||||
countTotal++
|
countTotal++
|
||||||
if (this.isExpired(entry)) {
|
if (this.isExpired(entry)) {
|
||||||
countExpired++
|
countExpired++
|
||||||
expiredData.push(entry.packet)
|
expiredData.push(entry.packet)
|
||||||
global.eventUpdatesManagerCache.delete(key)
|
storage.eventUpdatesManagerCache.delete(key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -146,10 +146,10 @@ export class EventUpdatesManager {
|
||||||
type: PacketType<PACKET>,
|
type: PacketType<PACKET>,
|
||||||
): CacheEntry<PACKET> | undefined {
|
): CacheEntry<PACKET> | undefined {
|
||||||
const hash = EventUpdatesManager.hashKey(key)
|
const hash = EventUpdatesManager.hashKey(key)
|
||||||
if (!global.eventUpdatesManagerCache.has(hash)) {
|
if (!storage.eventUpdatesManagerCache.has(hash)) {
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
const value: CacheEntry<any> = global.eventUpdatesManagerCache.get(hash)
|
const value: CacheEntry<any> = storage.eventUpdatesManagerCache.get(hash)
|
||||||
if (this.isEntryInstanceOf(value, type)) {
|
if (this.isEntryInstanceOf(value, type)) {
|
||||||
return value
|
return value
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -169,7 +169,7 @@ export class EventUpdatesManager {
|
||||||
}
|
}
|
||||||
const entry: CacheEntry<PACKET> = new CacheEntry<PACKET>(data)
|
const entry: CacheEntry<PACKET> = new CacheEntry<PACKET>(data)
|
||||||
const hash = EventUpdatesManager.hashKey(key)
|
const hash = EventUpdatesManager.hashKey(key)
|
||||||
global.eventUpdatesManagerCache.set(hash, entry)
|
storage.eventUpdatesManagerCache.set(hash, entry)
|
||||||
return entry
|
return entry
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -206,7 +206,7 @@ export class EventUpdatesManager {
|
||||||
private static hashKey<PACKET extends KafkatorioKeyedPacketData>(
|
private static hashKey<PACKET extends KafkatorioKeyedPacketData>(
|
||||||
key: PacketKey<PACKET>,
|
key: PacketKey<PACKET>,
|
||||||
): string {
|
): string {
|
||||||
return game.encode_string(game.table_to_json(key))!!
|
return helpers.encode_string(helpers.table_to_json(key))!!
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,18 +2,18 @@ export class EventDataQueueManager {
|
||||||
|
|
||||||
static init(force?: boolean) {
|
static init(force?: boolean) {
|
||||||
|
|
||||||
const isAnythingUndefined = global.store == undefined ||
|
const isAnythingUndefined = storage.store == undefined ||
|
||||||
global.size == undefined ||
|
storage.size == undefined ||
|
||||||
global.head == undefined ||
|
storage.head == undefined ||
|
||||||
global.tail == undefined
|
storage.tail == undefined
|
||||||
|
|
||||||
log(`Initialising EventDataQueueManager globals (force=${force}, isAnythingUndefined=${isAnythingUndefined})`)
|
log(`Initialising EventDataQueueManager globals (force=${force}, isAnythingUndefined=${isAnythingUndefined})`)
|
||||||
|
|
||||||
if (force == true || isAnythingUndefined) {
|
if (force == true || isAnythingUndefined) {
|
||||||
global.store = {}
|
storage.store = {}
|
||||||
global.head = null
|
storage.head = null
|
||||||
global.tail = null
|
storage.tail = null
|
||||||
global.size = 0
|
storage.size = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
log(`Finished initialising EventDataQueueManager`)
|
log(`Finished initialising EventDataQueueManager`)
|
||||||
|
|
@ -21,38 +21,38 @@ export class EventDataQueueManager {
|
||||||
|
|
||||||
|
|
||||||
size(): uint | undefined {
|
size(): uint | undefined {
|
||||||
return global.size
|
return storage.size
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
enqueue(key: string, event: EventData, weight: int = 1) {
|
enqueue(key: string, event: EventData, weight: int = 1) {
|
||||||
if (key ! in global.store) {
|
if (key ! in storage.store) {
|
||||||
let node = new Node(key, weight)
|
let node = new Node(key, weight)
|
||||||
if (global.head == null) {
|
if (storage.head == null) {
|
||||||
global.head = node
|
storage.head = node
|
||||||
}
|
}
|
||||||
if (global.tail != null) {
|
if (storage.tail != null) {
|
||||||
global.tail.next = node
|
storage.tail.next = node
|
||||||
}
|
}
|
||||||
global.tail = node
|
storage.tail = node
|
||||||
global.size++
|
storage.size++
|
||||||
}
|
}
|
||||||
|
|
||||||
global.store[key] = event
|
storage.store[key] = event
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
dequeue(): WeightedPacket | null {
|
dequeue(): WeightedPacket | null {
|
||||||
if (global.head == null) {
|
if (storage.head == null) {
|
||||||
return null
|
return null
|
||||||
} else {
|
} else {
|
||||||
let weight = global.head.weight
|
let weight = storage.head.weight
|
||||||
let storeKey = global.head.storeKey
|
let storeKey = storage.head.storeKey
|
||||||
global.head = global.head.next
|
storage.head = storage.head.next
|
||||||
global.size--
|
storage.size--
|
||||||
|
|
||||||
let storedPacket = global.store[storeKey]
|
let storedPacket = storage.store[storeKey]
|
||||||
global.store[storeKey] = null
|
storage.store[storeKey] = null
|
||||||
|
|
||||||
if (storedPacket == null) {
|
if (storedPacket == null) {
|
||||||
return null
|
return null
|
||||||
|
|
@ -93,7 +93,7 @@ const EventDataQueue = new EventDataQueueManager()
|
||||||
export default EventDataQueue
|
export default EventDataQueue
|
||||||
|
|
||||||
|
|
||||||
declare const global: {
|
declare const storage: {
|
||||||
store: EventQueueStore
|
store: EventQueueStore
|
||||||
|
|
||||||
head: Node | null
|
head: Node | null
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ export class KafkatorioPacketEmitter {
|
||||||
) {
|
) {
|
||||||
KafkatorioPacketEmitter.emitPacket<KafkatorioPacket>({
|
KafkatorioPacketEmitter.emitPacket<KafkatorioPacket>({
|
||||||
data: data,
|
data: data,
|
||||||
modVersion: global.MOD_VERSION,
|
modVersion: storage.MOD_VERSION,
|
||||||
tick: game.tick,
|
tick: game.tick,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -19,21 +19,21 @@ export class KafkatorioPacketEmitter {
|
||||||
) {
|
) {
|
||||||
KafkatorioPacketEmitter.emitPacket<KafkatorioPacket>({
|
KafkatorioPacketEmitter.emitPacket<KafkatorioPacket>({
|
||||||
data: data,
|
data: data,
|
||||||
modVersion: global.MOD_VERSION,
|
modVersion: storage.MOD_VERSION,
|
||||||
tick: game.tick,
|
tick: game.tick,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Emit a serialised KafkatorioPacket */
|
/** Emit a serialised KafkatorioPacket */
|
||||||
private static emitPacket<T extends KafkatorioPacket>(packet: T) {
|
private static emitPacket<T extends KafkatorioPacket>(packet: T) {
|
||||||
const data = game.table_to_json(packet)
|
const data = helpers.table_to_json(packet)
|
||||||
|
|
||||||
if (data.trim().length <= 0) {
|
if (data.trim().length <= 0) {
|
||||||
print(`[error] table_to_json returned empty string for packet:${packet}`)
|
print(`[error] table_to_json returned empty string for packet:${packet}`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const encodedData = game.encode_string(data)
|
const encodedData = helpers.encode_string(data)
|
||||||
|
|
||||||
if (encodedData == null || encodedData.trim().length <= 0) {
|
if (encodedData == null || encodedData.trim().length <= 0) {
|
||||||
print(`[error] could not encode packet`)
|
print(`[error] could not encode packet`)
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ export namespace Converters {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function mapColour(color: ColorTable): Colour {
|
export function mapColour(color: Color): Colour {
|
||||||
return [
|
return [
|
||||||
color.r ?? 0,
|
color.r ?? 0,
|
||||||
color.g ?? 0,
|
color.g ?? 0,
|
||||||
|
|
@ -42,8 +42,8 @@ export namespace Converters {
|
||||||
export function convertPlacedTiles(
|
export function convertPlacedTiles(
|
||||||
placedTile: LuaTilePrototype,
|
placedTile: LuaTilePrototype,
|
||||||
oldTiles: OldTileAndPosition[],
|
oldTiles: OldTileAndPosition[],
|
||||||
): TileRead[] {
|
): Tile[] {
|
||||||
const converted: TileRead[] = []
|
const converted: Tile[] = []
|
||||||
for (const [, tile] of ipairs(oldTiles)) {
|
for (const [, tile] of ipairs(oldTiles)) {
|
||||||
converted[converted.length] = {
|
converted[converted.length] = {
|
||||||
position: {x: tile.position.x, y: tile.position.y},
|
position: {x: tile.position.x, y: tile.position.y},
|
||||||
|
|
@ -57,8 +57,8 @@ export namespace Converters {
|
||||||
export function convertRemovedTiles(
|
export function convertRemovedTiles(
|
||||||
surface: LuaSurface,
|
surface: LuaSurface,
|
||||||
oldTiles: OldTileAndPosition[],
|
oldTiles: OldTileAndPosition[],
|
||||||
): TileRead[] {
|
): Tile[] {
|
||||||
const converted: TileRead[] = []
|
const converted: Tile[] = []
|
||||||
for (const [, tile] of ipairs(oldTiles)) {
|
for (const [, tile] of ipairs(oldTiles)) {
|
||||||
converted[converted.length] = surface.get_tile(tile.position.x, tile.position.y)
|
converted[converted.length] = surface.get_tile(tile.position.x, tile.position.y)
|
||||||
}
|
}
|
||||||
|
|
@ -68,7 +68,7 @@ export namespace Converters {
|
||||||
|
|
||||||
export function convertCollisionMaskToNames(cm: CollisionMask): string[] {
|
export function convertCollisionMaskToNames(cm: CollisionMask): string[] {
|
||||||
let masks: string[] = []
|
let masks: string[] = []
|
||||||
for (const [name] of pairs(cm)) {
|
for (const [name] of pairs(cm.layers)) {
|
||||||
masks.push(name)
|
masks.push(name)
|
||||||
}
|
}
|
||||||
return masks
|
return masks
|
||||||
|
|
@ -96,22 +96,22 @@ export namespace Converters {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function tilePositionToChunkPosition(mapPosition: TilePositionTable): MapChunkPosition {
|
export function tilePositionToChunkPosition(mapPosition: TilePosition): MapChunkPosition {
|
||||||
return [floor(mapPosition.x / 32), floor(mapPosition.y / 32), ChunkSize.CHUNK_032]
|
return [floor(mapPosition.x / 32), floor(mapPosition.y / 32), ChunkSize.CHUNK_032]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function mapPositionToChunkPosition(mapPosition: MapPositionTable): MapChunkPosition {
|
export function mapPositionToChunkPosition(mapPosition: MapPosition): MapChunkPosition {
|
||||||
return [floor(mapPosition.x / 32), floor(mapPosition.y / 32), ChunkSize.CHUNK_032]
|
return [floor(mapPosition.x / 32), floor(mapPosition.y / 32), ChunkSize.CHUNK_032]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function entityPosition(position: MapPositionTable): MapEntityPosition {
|
export function entityPosition(position: MapPosition): MapEntityPosition {
|
||||||
return [position.x, position.y];
|
return [position.x, position.y];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function chunkPosition(position: ChunkPositionTable): MapChunkPosition {
|
export function chunkPosition(position: ChunkPosition): MapChunkPosition {
|
||||||
return [position.x, position.y, ChunkSize.CHUNK_032]
|
return [position.x, position.y, ChunkSize.CHUNK_032]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -218,6 +218,32 @@ export namespace Converters {
|
||||||
[ defines.entity_status.waiting_for_train ]: FactorioEntityStatus.WAITING_FOR_TRAIN,
|
[ defines.entity_status.waiting_for_train ]: FactorioEntityStatus.WAITING_FOR_TRAIN,
|
||||||
[ defines.entity_status.waiting_to_launch_rocket ]: FactorioEntityStatus.WAITING_TO_LAUNCH_ROCKET,
|
[ defines.entity_status.waiting_to_launch_rocket ]: FactorioEntityStatus.WAITING_TO_LAUNCH_ROCKET,
|
||||||
[ defines.entity_status.working ]: FactorioEntityStatus.WORKING,
|
[ defines.entity_status.working ]: FactorioEntityStatus.WORKING,
|
||||||
|
|
||||||
|
// Factorio 2.0 additions (Space Age / space platforms, agricultural towers, etc.)
|
||||||
|
[ defines.entity_status.ghost ]: FactorioEntityStatus.GHOST,
|
||||||
|
[ defines.entity_status.broken ]: FactorioEntityStatus.BROKEN,
|
||||||
|
[ defines.entity_status.frozen ]: FactorioEntityStatus.FROZEN,
|
||||||
|
[ defines.entity_status.paused ]: FactorioEntityStatus.PAUSED,
|
||||||
|
[ defines.entity_status.not_connected_to_hub_or_pad ]: FactorioEntityStatus.NOT_CONNECTED_TO_HUB_OR_PAD,
|
||||||
|
[ defines.entity_status.not_enough_space_in_output ]: FactorioEntityStatus.NOT_ENOUGH_SPACE_IN_OUTPUT,
|
||||||
|
[ defines.entity_status.full_burnt_result_output ]: FactorioEntityStatus.FULL_BURNT_RESULT_OUTPUT,
|
||||||
|
[ defines.entity_status.waiting_for_more_items ]: FactorioEntityStatus.WAITING_FOR_MORE_ITEMS,
|
||||||
|
[ defines.entity_status.waiting_for_space_in_platform_hub ]: FactorioEntityStatus.WAITING_FOR_SPACE_IN_PLATFORM_HUB,
|
||||||
|
[ defines.entity_status.thrust_not_required ]: FactorioEntityStatus.THRUST_NOT_REQUIRED,
|
||||||
|
[ defines.entity_status.on_the_way ]: FactorioEntityStatus.ON_THE_WAY,
|
||||||
|
[ defines.entity_status.waiting_in_orbit ]: FactorioEntityStatus.WAITING_IN_ORBIT,
|
||||||
|
[ defines.entity_status.waiting_at_stop ]: FactorioEntityStatus.WAITING_AT_STOP,
|
||||||
|
[ defines.entity_status.waiting_for_rockets_to_arrive ]: FactorioEntityStatus.WAITING_FOR_ROCKETS_TO_ARRIVE,
|
||||||
|
[ defines.entity_status.not_enough_thrust ]: FactorioEntityStatus.NOT_ENOUGH_THRUST,
|
||||||
|
[ defines.entity_status.destination_stop_full ]: FactorioEntityStatus.DESTINATION_STOP_FULL,
|
||||||
|
[ defines.entity_status.no_path ]: FactorioEntityStatus.NO_PATH,
|
||||||
|
[ defines.entity_status.no_filter ]: FactorioEntityStatus.NO_FILTER,
|
||||||
|
[ defines.entity_status.no_spot_seedable_by_inputs ]: FactorioEntityStatus.NO_SPOT_SEEDABLE_BY_INPUTS,
|
||||||
|
[ defines.entity_status.waiting_for_plants_to_grow ]: FactorioEntityStatus.WAITING_FOR_PLANTS_TO_GROW,
|
||||||
|
[ defines.entity_status.computing_navigation ]: FactorioEntityStatus.COMPUTING_NAVIGATION,
|
||||||
|
[ defines.entity_status.pipeline_overextended ]: FactorioEntityStatus.PIPELINE_OVEREXTENDED,
|
||||||
|
[ defines.entity_status.recipe_not_researched ]: FactorioEntityStatus.RECIPE_NOT_RESEARCHED,
|
||||||
|
[ defines.entity_status.recipe_is_parameter ]: FactorioEntityStatus.RECIPE_IS_PARAMETER,
|
||||||
//@formatter:on
|
//@formatter:on
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ export class EntityUpdatesHandler {
|
||||||
handleBuiltEntityEvent(
|
handleBuiltEntityEvent(
|
||||||
event: OnBuiltEntityEvent | OnRobotBuiltEntityEvent,
|
event: OnBuiltEntityEvent | OnRobotBuiltEntityEvent,
|
||||||
) {
|
) {
|
||||||
EntityUpdatesHandler.throttleEntityUpdate(event, event.created_entity)
|
EntityUpdatesHandler.throttleEntityUpdate(event, event.entity)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -191,7 +191,7 @@ export class EntityUpdatesHandler {
|
||||||
/** Get all resources within a map-area */
|
/** Get all resources within a map-area */
|
||||||
private static getAreaResourceEntities(
|
private static getAreaResourceEntities(
|
||||||
surface: LuaSurface,
|
surface: LuaSurface,
|
||||||
area: BoundingBoxTable,
|
area: BoundingBox,
|
||||||
): LuaEntity[] {
|
): LuaEntity[] {
|
||||||
return surface.find_entities_filtered({
|
return surface.find_entities_filtered({
|
||||||
area: area,
|
area: area,
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ class MapChunkUpdateHandler {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const tiles: TileRead[] = Converters.convertPlacedTiles(event.tile, event.tiles)
|
const tiles: Tile[] = Converters.convertPlacedTiles(event.tile, event.tiles)
|
||||||
const groupedTiles = MapChunkUpdateHandler.groupTiles(tiles)
|
const groupedTiles = MapChunkUpdateHandler.groupTiles(tiles)
|
||||||
|
|
||||||
for (const [chunkPos, tiles] of groupedTiles) {
|
for (const [chunkPos, tiles] of groupedTiles) {
|
||||||
|
|
@ -79,7 +79,7 @@ class MapChunkUpdateHandler {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const tiles: TileRead[] = Converters.convertRemovedTiles(surface, event.tiles)
|
const tiles: Tile[] = Converters.convertRemovedTiles(surface, event.tiles)
|
||||||
const groupedTiles = MapChunkUpdateHandler.groupTiles(tiles)
|
const groupedTiles = MapChunkUpdateHandler.groupTiles(tiles)
|
||||||
|
|
||||||
for (const [chunkPos, tiles] of groupedTiles) {
|
for (const [chunkPos, tiles] of groupedTiles) {
|
||||||
|
|
@ -152,7 +152,7 @@ class MapChunkUpdateHandler {
|
||||||
private static mapTilesUpdateDebounce(
|
private static mapTilesUpdateDebounce(
|
||||||
surface: LuaSurface | undefined,
|
surface: LuaSurface | undefined,
|
||||||
chunkPosition: MapChunkPosition,
|
chunkPosition: MapChunkPosition,
|
||||||
tiles: TileRead[],
|
tiles: Tile[],
|
||||||
event: MapChunkUpdateEvent | MapTileChangeEvent,
|
event: MapChunkUpdateEvent | MapTileChangeEvent,
|
||||||
updater?: MapChunkTileUpdater,
|
updater?: MapChunkTileUpdater,
|
||||||
expirationDurationTicks?: uint,
|
expirationDurationTicks?: uint,
|
||||||
|
|
@ -215,9 +215,9 @@ class MapChunkUpdateHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static groupTiles(tiles: TileRead[]): Map<MapChunkPosition, TileRead[]> {
|
private static groupTiles(tiles: Tile[]): Map<MapChunkPosition, Tile[]> {
|
||||||
|
|
||||||
const mapChunkPositionToTiles = new Map<MapChunkPosition, TileRead[]>()
|
const mapChunkPositionToTiles = new Map<MapChunkPosition, Tile[]>()
|
||||||
for (const tile of tiles) {
|
for (const tile of tiles) {
|
||||||
const chunkPosition = Converters.tilePositionToChunkPosition(tile.position)
|
const chunkPosition = Converters.tilePositionToChunkPosition(tile.position)
|
||||||
if (!mapChunkPositionToTiles.has(chunkPosition)) {
|
if (!mapChunkPositionToTiles.has(chunkPosition)) {
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ function emit<T extends FactorioPrototype>(protosByType: PrototypesByType<T>) {
|
||||||
function getMapTilePrototypes(): PrototypesByType<FactorioPrototype.MapTile> {
|
function getMapTilePrototypes(): PrototypesByType<FactorioPrototype.MapTile> {
|
||||||
const tiles: FactorioPrototype.MapTile[] = []
|
const tiles: FactorioPrototype.MapTile[] = []
|
||||||
|
|
||||||
for (const [, tile] of game.tile_prototypes) {
|
for (const [, tile] of prototypes.tile) {
|
||||||
tiles[tiles.length] = {
|
tiles[tiles.length] = {
|
||||||
type: FactorioPrototype.Type.MapTile,
|
type: FactorioPrototype.Type.MapTile,
|
||||||
|
|
||||||
|
|
@ -55,7 +55,7 @@ function getMapTilePrototypes(): PrototypesByType<FactorioPrototype.MapTile> {
|
||||||
function getEntityPrototypes(): PrototypesByType<FactorioPrototype.Entity> {
|
function getEntityPrototypes(): PrototypesByType<FactorioPrototype.Entity> {
|
||||||
const protos: PrototypesByType<FactorioPrototype.Entity> = {}
|
const protos: PrototypesByType<FactorioPrototype.Entity> = {}
|
||||||
|
|
||||||
for (const [, entity] of game.entity_prototypes) {
|
for (const [, entity] of prototypes.entity) {
|
||||||
const key: string = `${entity.group.name}/${entity.subgroup.name}/${entity.type}`
|
const key: string = `${entity.group.name}/${entity.subgroup.name}/${entity.type}`
|
||||||
|
|
||||||
protos[key] ??= []
|
protos[key] ??= []
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
script.on_event(defines.events.on_runtime_mod_setting_changed, (e: OnRuntimeModSettingChangedEvent) => {
|
script.on_event(defines.events.on_runtime_mod_setting_changed, (e: OnRuntimeModSettingChangedEvent) => {
|
||||||
print(`Settings changed ${e.setting_type}, ${e.player_index}, ${e.setting}, ${e.mod_name}`)
|
print(`Settings changed ${e.setting_type}, ${e.player_index}, ${e.setting}`)
|
||||||
// KafkatorioSettings.loadSettings()
|
// KafkatorioSettings.loadSettings()
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@ import {EventDataQueueManager} from "./emitting/EventDataQueue";
|
||||||
export function initGlobal(force: boolean = false) {
|
export function initGlobal(force: boolean = false) {
|
||||||
log(`Initialising Kafkatorio Global variables (force=${force})...`)
|
log(`Initialising Kafkatorio Global variables (force=${force})...`)
|
||||||
|
|
||||||
global.MOD_VERSION = script.active_mods[script.mod_name]
|
storage.MOD_VERSION = script.active_mods[script.mod_name]
|
||||||
global.FACTORIO_VERSION = script.active_mods["base"]
|
storage.FACTORIO_VERSION = script.active_mods["base"]
|
||||||
|
|
||||||
EventDataQueueManager.init(true)
|
EventDataQueueManager.init(true)
|
||||||
EventUpdates.init(true)
|
EventUpdates.init(true)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
declare const global: {
|
declare const storage: {
|
||||||
MOD_VERSION: string
|
MOD_VERSION: string
|
||||||
FACTORIO_VERSION: string
|
FACTORIO_VERSION: string
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import {Data, DoubleSettingDefinition} from "typed-factorio/settings/types"
|
import {SettingsData} from "factorio:common"
|
||||||
|
import {DoubleSettingDefinition} from "factorio:settings"
|
||||||
import {KafkatorioKeyedPacketData, KafkatorioKeyedPacketTypes} from "../types";
|
import {KafkatorioKeyedPacketData, KafkatorioKeyedPacketTypes} from "../types";
|
||||||
|
|
||||||
export class KafkatorioSettingsConfig {
|
export class KafkatorioSettingsConfig {
|
||||||
|
|
@ -20,7 +21,7 @@ export class KafkatorioSettingsConfig {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public initialiseSettings(data: Data): void {
|
public initialiseSettings(data: SettingsData): void {
|
||||||
for (const [type,] of pairs(KafkatorioSettingsConfig.eventCacheExpirationDefaultSeconds)) {
|
for (const [type,] of pairs(KafkatorioSettingsConfig.eventCacheExpirationDefaultSeconds)) {
|
||||||
data.extend(
|
data.extend(
|
||||||
[KafkatorioSettingsConfig.createDefaultCacheDuration(type)]
|
[KafkatorioSettingsConfig.createDefaultCacheDuration(type)]
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import {Data, Mods} from "typed-factorio/settings/types"
|
import {SettingsData, ActiveMods} from "factorio:common"
|
||||||
import KafkatorioSettings from "./main/settings/KafkatorioSettings";
|
import KafkatorioSettings from "./main/settings/KafkatorioSettings";
|
||||||
|
|
||||||
declare const data: Data
|
declare const data: SettingsData
|
||||||
declare const mods: Mods
|
declare const mods: ActiveMods
|
||||||
|
|
||||||
KafkatorioSettings.initialiseSettings(data)
|
KafkatorioSettings.initialiseSettings(data)
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,7 @@
|
||||||
"types": [
|
"types": [
|
||||||
"@typescript-to-lua/language-extensions",
|
"@typescript-to-lua/language-extensions",
|
||||||
"lua-types/5.2",
|
"lua-types/5.2",
|
||||||
"typed-factorio/runtime",
|
"typed-factorio/runtime"
|
||||||
"typed-factorio/strict-index-types"
|
|
||||||
],
|
],
|
||||||
"plugins": [
|
"plugins": [
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# syntax=docker/dockerfile:1
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
ARG factorioVersion=1.1.42
|
ARG factorioVersion=2.0.77
|
||||||
|
|
||||||
|
|
||||||
FROM factoriotools/factorio:$factorioVersion
|
FROM factoriotools/factorio:$factorioVersion
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue