Fix compile errors surfaced by actually building against Factorio 2.0.77

typed-factorio 2.0.0+ stopped declaring types as ambient globals - they
now live in virtual modules ("factorio:runtime", "factorio:common",
"factorio:settings") and must be explicitly imported. Adds those imports
throughout events-mod. Also:

- Bumps typescript-to-lua 1.11.1 -> 1.25.2 and typescript 4.9 -> 5.4.2,
  since tstl pins an exact peer TypeScript version and typed-factorio
  3.x needs a newer one than 4.9 supports (a real compiler bug in
  TS 4.9 against the generated defines.segmented_unit_ai_state enum).
- Bumps the pinned isolated Node (14.19.1 -> 24.21.0), since
  typescript-to-lua 1.25.2 requires Node >=16.10.0.
- Renames bare uint/int -> uint32/int32 (import aliases), since the
  unsized aliases no longer exist.
- Drops OnEntityDestroyedEvent from an unused documentation-only union
  type - that event no longer exists in the 2.0 API.
- LuaEntityPrototype.max_health is now get_max_health() (quality-aware).
- Fixes a branded-type mismatch between our generated schema's
  ForceIndex and typed-factorio's own ForceIndex.

Verified by actually running tstl end-to-end (clean compile, Lua
emitted) after installing a real JDK and Node toolchain.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Lazzexus 2026-10-12 15:27:50 +02:00
parent 072d1a2845
commit e296a9aa90
26 changed files with 285 additions and 79 deletions

View file

@ -1,5 +1,7 @@
// Generated by kxs-ts-gen - do not edit this file manually
import {double, float, int32 as int, int8, PlayerIndex, SurfaceIndex, uint32 as uint, uint8, UnitNumber} from "factorio:runtime"
export interface KafkatorioPacket {
modVersion: string;
tick: Tick;

View file

@ -1,6 +1,7 @@
import {initGlobal} from "../global-init";
import {emitPrototypes} from "../events/prototypeUpdates";
import EventDataQueue from "../emitting/EventDataQueue";
import {ChunkPosition, CustomCommandData, OnChunkGeneratedEvent} from "factorio:runtime"
commands.add_command(

View file

@ -1,6 +1,7 @@
import KafkatorioSettings from "../settings/KafkatorioSettings";
import {KafkatorioKeyedPacketData} from "../types";
import PacketEmitter from "./PacketEmitter";
import {uint32 as uint} from "factorio:runtime"
declare const storage: {

View file

@ -1,3 +1,6 @@
import {EventData, int32 as int, uint32 as uint} from "factorio:runtime"
export class EventDataQueueManager {
static init(force?: boolean) {

View file

@ -1,4 +1,5 @@
import {KafkatorioPacketData} from "../../generated/kafkatorio-schema";
import {int32 as int} from "factorio:runtime"
/**

View file

@ -1,6 +1,7 @@
import {initGlobal} from "../global-init";
import {emitPrototypes} from "./prototypeUpdates";
import ConfigurationUpdates from "./handlers/ConfigurationUpdateHandler";
import {ConfigurationChangedData} from "factorio:runtime"
script.on_configuration_changed((data: ConfigurationChangedData) => {

View file

@ -1,5 +1,6 @@
import {KafkatorioPacketData} from "../../generated/kafkatorio-schema";
import KafkatorioPacketQueue from "../emitting/KafkatorioPacketQueue";
import {OnConsoleChatEvent, OnConsoleCommandEvent} from "factorio:runtime"
script.on_event(defines.events.on_console_chat, (event: OnConsoleChatEvent) => {

View file

@ -12,6 +12,21 @@ import {
MinedProduct,
PrototypeId,
} from "../../generated/kafkatorio-schema";
import {
BoundingBox,
ChunkPosition,
CollisionMask,
Color,
LuaEntity,
LuaEntityPrototype,
LuaPlayer,
LuaSurface,
LuaTilePrototype,
MapPosition,
OldTileAndPosition,
Tile,
TilePosition,
} from "factorio:runtime"
export namespace Converters {

View file

@ -1,4 +1,5 @@
import EntityUpdates from "./handlers/EntityUpdateHandler";
import {OnBuiltEntityEvent, OnPlayerMinedEntityEvent, OnRobotBuiltEntityEvent, OnRobotMinedEntityEvent} from "factorio:runtime"
script.on_event(defines.events.on_built_entity, (e: OnBuiltEntityEvent) => {
log(`on_built_entity ${e.tick}`)

View file

@ -1,3 +1,5 @@
import {CustomInputEvent, EventData, EventId} from "factorio:runtime"
export function isEventType<ED extends EventData | CustomInputEvent>(
eventData: EventData,

View file

@ -6,6 +6,7 @@ import {
import PacketEmitter from "../../emitting/PacketEmitter";
import ConfigurationUpdate = KafkatorioPacketData.ConfigurationUpdate;
import KafkatorioPacketQueue from "../../emitting/KafkatorioPacketQueue";
import {ConfigurationChangedData} from "factorio:runtime"
export class ConfigurationUpdateHandler {

View file

@ -8,6 +8,34 @@ import {
} from "../../../generated/kafkatorio-schema";
import {Converters} from "../converters";
import EventDataCache from "../../emitting/EventDataCache";
import {
BoundingBox,
LuaEntity,
LuaSurface,
MapPosition,
OldTileAndPosition,
OnBuiltEntityEvent,
OnChunkGeneratedEvent,
OnEntityClonedEvent,
OnEntityDamagedEvent,
OnEntityDiedEvent,
OnEntityLogisticSlotChangedEvent,
OnEntityRenamedEvent,
OnEntitySettingsPastedEvent,
OnEntitySpawnedEvent,
OnPlayerMinedEntityEvent,
OnPlayerMinedTileEvent,
OnPlayerRepairedEntityEvent,
OnPlayerRotatedEntityEvent,
OnPostEntityDiedEvent,
OnPreEntitySettingsPastedEvent,
OnRobotBuiltEntityEvent,
OnRobotMinedEntityEvent,
OnRobotMinedTileEvent,
OnSelectedEntityChangedEvent,
OnTriggerCreatedEntityEvent,
SurfaceIndex,
} from "factorio:runtime"
export class EntityUpdatesHandler {
@ -211,7 +239,6 @@ type EntityUpdateEvent =
| OnEntityClonedEvent
| OnEntityDamagedEvent
| OnEntityDestroyedEvent
| OnEntityDiedEvent
| OnEntityLogisticSlotChangedEvent
| OnEntityRenamedEvent

View file

@ -7,6 +7,18 @@ import {
} from "../../../generated/kafkatorio-schema";
import EventUpdates, {PacketKey} from "../../emitting/EventDataCache";
import {MapChunkUpdateEvent, MapTileChangeEvent} from "../mapChunkUpdates";
import {
LuaSurface,
OnChunkGeneratedEvent,
OnPlayerBuiltTileEvent,
OnPlayerMinedTileEvent,
OnPreChunkDeletedEvent,
OnRobotBuiltTileEvent,
OnRobotMinedTileEvent,
ScriptRaisedSetTilesEvent,
Tile,
uint32 as uint,
} from "factorio:runtime"
type MapChunkTileUpdater = (data: KafkatorioPacketData.MapChunkTileUpdate) => void

View file

@ -1,6 +1,19 @@
import {KafkatorioPacketData} from "../../../generated/kafkatorio-schema";
import {Converters} from "../converters";
import EventUpdates from "../../emitting/EventDataCache";
import {
LuaPlayer,
OnPlayerBannedEvent,
OnPlayerChangedPositionEvent,
OnPlayerChangedSurfaceEvent,
OnPlayerDiedEvent,
OnPlayerJoinedGameEvent,
OnPlayerKickedEvent,
OnPlayerRemovedEvent,
OnPlayerUnbannedEvent,
OnPrePlayerLeftGameEvent,
uint32 as uint,
} from "factorio:runtime"
export type PlayerUpdater = (player: LuaPlayer, data: KafkatorioPacketData.PlayerUpdate) => void

View file

@ -1,5 +1,16 @@
import EntityUpdates from "./handlers/EntityUpdateHandler";
import MapChunkUpdate from "./handlers/MapChunkUpdateHandler";
import {
OnChunkChartedEvent,
OnChunkDeletedEvent,
OnChunkGeneratedEvent,
OnPlayerBuiltTileEvent,
OnPlayerMinedTileEvent,
OnPreChunkDeletedEvent,
OnRobotBuiltTileEvent,
OnRobotMinedTileEvent,
ScriptRaisedSetTilesEvent,
} from "factorio:runtime"
export type MapTileChangeEvent =

View file

@ -2,6 +2,16 @@ import {Converters} from "./converters";
import {ForceIndex, KafkatorioPacketData, PlayerUpdateKey} from "../../generated/kafkatorio-schema";
import packetEmitter from "../emitting/PacketEmitter";
import PlayerUpdates from "./handlers/PlayerUpdateHandler";
import {
OnPlayerBannedEvent,
OnPlayerChangedPositionEvent,
OnPlayerChangedSurfaceEvent,
OnPlayerDiedEvent,
OnPlayerJoinedGameEvent,
OnPlayerKickedEvent,
OnPlayerRemovedEvent,
OnPrePlayerLeftGameEvent,
} from "factorio:runtime"
// function playerUpdateDebounce(playerIndex: uint, mutate: PlayerUpdater) {
@ -23,7 +33,7 @@ script.on_event(defines.events.on_player_joined_game, (e: OnPlayerJoinedGameEven
data.characterUnitNumber = player.character?.unit_number ?? null
data.chatColour = Converters.mapColour(player.chat_color)
data.colour = Converters.mapColour(player.color)
data.forceIndex = player.force.index as ForceIndex
data.forceIndex = player.force.index as unknown as ForceIndex
data.name = player.name
data.isShowOnMap = player.show_on_map
data.isSpectator = player.spectator

View file

@ -5,6 +5,7 @@ import {
} from "../../generated/kafkatorio-schema";
import {Converters} from "./converters";
import KafkatorioPacketQueue from "../emitting/KafkatorioPacketQueue";
import {LuaGroup} from "factorio:runtime"
type PrototypesByType<T extends FactorioPrototype> = Record<string, T[]>
@ -70,7 +71,7 @@ function getEntityPrototypes(): PrototypesByType<FactorioPrototype.Entity> {
isBuilding: entity.is_building,
isEntityWithOwner: entity.is_entity_with_owner,
isMilitaryTarget: entity.is_military_target,
maxHealth: entity.max_health,
maxHealth: entity.get_max_health(),
collisionBox: Converters.collisionBox(entity.collision_box),
tileWidth: entity.tile_width,

View file

@ -7,6 +7,7 @@ import KafkatorioPacketQueue from "../emitting/KafkatorioPacketQueue";
import PacketEmitter from "../emitting/PacketEmitter";
import {KafkatorioPacketData} from "../../generated/kafkatorio-schema";
import EventDataQueue from "../emitting/EventDataQueue";
import {EventData, OnTickEvent} from "factorio:runtime"
script.on_event(defines.events.on_tick, (event: OnTickEvent) => {

View file

@ -1,3 +1,6 @@
import {OnRuntimeModSettingChangedEvent} from "factorio:runtime"
script.on_event(defines.events.on_runtime_mod_setting_changed, (e: OnRuntimeModSettingChangedEvent) => {
print(`Settings changed ${e.setting_type}, ${e.player_index}, ${e.setting}`)
// KafkatorioSettings.loadSettings()

View file

@ -1,6 +1,7 @@
import PacketEmitter from "../emitting/PacketEmitter";
import {KafkatorioPacketData} from "../../generated/kafkatorio-schema";
import Type = KafkatorioPacketData.Type;
import {LuaSurface, OnTickEvent} from "factorio:runtime"
export function handleSurfaceUpdate(

View file

@ -5,8 +5,8 @@ import {EventDataQueueManager} from "./emitting/EventDataQueue";
export function initGlobal(force: boolean = false) {
log(`Initialising Kafkatorio Global variables (force=${force})...`)
storage.MOD_VERSION = script.active_mods[script.mod_name]
storage.FACTORIO_VERSION = script.active_mods["base"]
storage.MOD_VERSION = script.active_mods[script.mod_name]!
storage.FACTORIO_VERSION = script.active_mods["base"]!
EventDataQueueManager.init(true)
EventUpdates.init(true)

View file

@ -1,6 +1,7 @@
import {SettingsData} from "factorio:common"
import {DoubleSettingDefinition} from "factorio:settings"
import {KafkatorioKeyedPacketData, KafkatorioKeyedPacketTypes} from "../types";
import {double, uint32 as uint} from "factorio:runtime"
export class KafkatorioSettingsConfig {