- add tile deconstruction (concrete tiles can be removed)
- add @SerialName to all packets - start implementing Entity prototype - start implementing Entity updates - clean up some old commented out code - refactor how debounced events track the triggering events (now include timestamps per event) - bump tstl
This commit is contained in:
parent
5656acd350
commit
688b2c7bcb
30 changed files with 650 additions and 553 deletions
|
|
@ -1,15 +1,15 @@
|
|||
[mod-setting-name]
|
||||
|
||||
kafkatorio_event-cache_default-expiration-duration-seconds_dev-adamko-kafkatorio-schema-packets-PlayerUpdate=Player update rate (seconds)
|
||||
kafkatorio_event-cache_default-expiration-duration-seconds_dev-adamko-kafkatorio-schema-packets-MapChunkUpdate=Map update rate (seconds)
|
||||
kafkatorio_event-cache_default-expiration-duration-seconds_dev-adamko-kafkatorio-schema-packets-EntityUpdate=Entity update rate (seconds)
|
||||
kafkatorio_event-cache_default-expiration-duration-seconds_kafkatorio-packet-keyed-PlayerUpdate=Player update rate (seconds)
|
||||
kafkatorio_event-cache_default-expiration-duration-seconds_kafkatorio-packet-keyed-MapChunkUpdate=Map update rate (seconds)
|
||||
kafkatorio_event-cache_default-expiration-duration-seconds_kafkatorio-packet-keyed-EntityUpdate=Entity update rate (seconds)
|
||||
|
||||
|
||||
[mod-setting-description]
|
||||
|
||||
kafkatorio_event-cache_default-expiration-duration-seconds_dev-adamko-kafkatorio-schema-packets-PlayerUpdate=How frequently Player updates are sent to the Kafkatorio server, in seconds. Lower means updates are sent more frequently, which may cause network congestion or reduce performance. The default (0.25 seconds) is probably fine!
|
||||
kafkatorio_event-cache_default-expiration-duration-seconds_dev-adamko-kafkatorio-schema-packets-MapChunkUpdate=How frequently Map updates are sent to the Kafkatorio server, in seconds. Lower means updates are sent more frequently, which may cause network congestion or reduce performance. The default (30 seconds) is probably fine!
|
||||
kafkatorio_event-cache_default-expiration-duration-seconds_dev-adamko-kafkatorio-schema-packets-EntityUpdate=How frequently Entity updates are sent to the Kafkatorio server, in seconds. Lower means updates are sent more frequently, which may cause network congestion or reduce performance. The default (5 seconds) is probably fine!
|
||||
kafkatorio_event-cache_default-expiration-duration-seconds_kafkatorio-packet-keyed-PlayerUpdate=How frequently Player updates are sent to the Kafkatorio server, in seconds. Lower means updates are sent more frequently, which may cause network congestion or reduce performance. The default (0.25 seconds) is probably fine!
|
||||
kafkatorio_event-cache_default-expiration-duration-seconds_kafkatorio-packet-keyed-MapChunkUpdate=How frequently Map updates are sent to the Kafkatorio server, in seconds. Lower means updates are sent more frequently, which may cause network congestion or reduce performance. The default (30 seconds) is probably fine!
|
||||
kafkatorio_event-cache_default-expiration-duration-seconds_kafkatorio-packet-keyed-EntityUpdate=How frequently Entity updates are sent to the Kafkatorio server, in seconds. Lower means updates are sent more frequently, which may cause network congestion or reduce performance. The default (5 seconds) is probably fine!
|
||||
|
||||
|
||||
[string-mod-setting]
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import KafkatorioSettings from "./main/settings/KafkatorioSettings";
|
|||
require("./main/events/registerHandlers")
|
||||
require("./main/events/onMapChunkEventListeners")
|
||||
require("./main/events/onPlayerEventListeners")
|
||||
require("./main/events/EntityEvents")
|
||||
require("./main/commands/kafkatorioCommands")
|
||||
require("./main/cache/cacheChecker")
|
||||
|
||||
|
|
|
|||
|
|
@ -20,14 +20,14 @@ export type KafkatorioPacketData =
|
|||
|
||||
export namespace KafkatorioPacketData {
|
||||
export enum Type {
|
||||
ConfigurationUpdate = "dev.adamko.kafkatorio.schema.packets.ConfigurationUpdate",
|
||||
ConsoleChatUpdate = "dev.adamko.kafkatorio.schema.packets.ConsoleChatUpdate",
|
||||
ConsoleCommandUpdate = "dev.adamko.kafkatorio.schema.packets.ConsoleCommandUpdate",
|
||||
PrototypesUpdate = "dev.adamko.kafkatorio.schema.packets.PrototypesUpdate",
|
||||
SurfaceUpdate = "dev.adamko.kafkatorio.schema.packets.SurfaceUpdate",
|
||||
EntityUpdate = "dev.adamko.kafkatorio.schema.packets.EntityUpdate",
|
||||
MapChunkUpdate = "dev.adamko.kafkatorio.schema.packets.MapChunkUpdate",
|
||||
PlayerUpdate = "dev.adamko.kafkatorio.schema.packets.PlayerUpdate",
|
||||
ConfigurationUpdate = "kafkatorio.packet.instant.ConfigurationUpdate",
|
||||
ConsoleChatUpdate = "kafkatorio.packet.instant.ConsoleChatUpdate",
|
||||
ConsoleCommandUpdate = "kafkatorio.packet.instant.ConsoleCommandUpdate",
|
||||
PrototypesUpdate = "kafkatorio.packet.instant.PrototypesUpdate",
|
||||
SurfaceUpdate = "kafkatorio.packet.instant.SurfaceUpdate",
|
||||
EntityUpdate = "kafkatorio.packet.keyed.EntityUpdate",
|
||||
MapChunkUpdate = "kafkatorio.packet.keyed.MapChunkUpdate",
|
||||
PlayerUpdate = "kafkatorio.packet.keyed.PlayerUpdate",
|
||||
}
|
||||
|
||||
export interface ConfigurationUpdate {
|
||||
|
|
@ -66,7 +66,7 @@ export namespace KafkatorioPacketData {
|
|||
export interface EntityUpdate {
|
||||
type: KafkatorioPacketData.Type.EntityUpdate;
|
||||
key: EntityUpdateKey;
|
||||
eventCounts?: { [key: string]: UInt } | null;
|
||||
events?: { [key: EventName]: Tick[] } | null;
|
||||
chunkPosition?: MapChunkPosition | null;
|
||||
graphicsVariation?: UByte | null;
|
||||
health?: Float | null;
|
||||
|
|
@ -81,7 +81,7 @@ export namespace KafkatorioPacketData {
|
|||
export interface MapChunkUpdate {
|
||||
type: KafkatorioPacketData.Type.MapChunkUpdate;
|
||||
key: MapChunkUpdateKey;
|
||||
eventCounts?: { [key: string]: UInt } | null;
|
||||
events?: { [key: EventName]: Tick[] } | null;
|
||||
player?: PlayerIndex | null;
|
||||
robot?: EntityIdentifiersData | null;
|
||||
force?: ForceIndex | null;
|
||||
|
|
@ -92,7 +92,7 @@ export namespace KafkatorioPacketData {
|
|||
export interface PlayerUpdate {
|
||||
type: KafkatorioPacketData.Type.PlayerUpdate;
|
||||
key: PlayerUpdateKey;
|
||||
eventCounts?: { [key: string]: UInt } | null;
|
||||
events?: { [key: EventName]: Tick[] } | null;
|
||||
characterUnitNumber?: UnitNumber | null;
|
||||
chatColour?: Colour | null;
|
||||
colour?: Colour | null;
|
||||
|
|
@ -196,7 +196,7 @@ export type FactorioPrototype =
|
|||
|
||||
export namespace FactorioPrototype {
|
||||
export enum Type {
|
||||
MapTile = "dev.adamko.kafkatorio.schema.prototypes.FactorioPrototype.MapTile",
|
||||
MapTile = "kafkatorio.prototype.MapTile",
|
||||
}
|
||||
|
||||
export interface MapTile {
|
||||
|
|
@ -210,6 +210,8 @@ export namespace FactorioPrototype {
|
|||
}
|
||||
}
|
||||
|
||||
export type EventName = string;
|
||||
|
||||
export type Byte = int8;
|
||||
|
||||
export type List = any;
|
||||
|
|
|
|||
|
|
@ -181,55 +181,13 @@ export namespace EventUpdates {
|
|||
return game.encode_string(game.table_to_json(key))!!
|
||||
}
|
||||
|
||||
|
||||
// function isKeyInstanceOf<TYPE extends FactorioEventUpdateType>(
|
||||
// key: CacheKey<any> | undefined,
|
||||
// updateType: TYPE,
|
||||
// ): key is CacheKey<TYPE> {
|
||||
// return key != undefined && key.updateType == updateType
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
|
||||
// export type KeyedPacketType = Exclude<KafkatorioPacketDataType,
|
||||
// "CONFIG" | "CONSOLE_CHAT" | "CONSOLE_COMMAND" | "PROTOTYPES" | "SURFACE">
|
||||
|
||||
// /** Map a {@link KeyedPacketType} to a {@link KafkatorioPacketData} DTO */
|
||||
// type ConvertToUpdate<TYPE extends KafkatorioKeyedPacketData> =
|
||||
// TYPE extends "PLAYER" ? PlayerUpdate :
|
||||
// TYPE extends "MAP_CHUNK" ? MapChunkUpdate :
|
||||
// TYPE extends "ENTITY" ? EntityUpdate :
|
||||
// never
|
||||
|
||||
|
||||
// /** Map a {@link KeyedPacketType} to a {@link KafkatorioKeyedPacketKey} */
|
||||
// type ConvertToUpdateKey<TYPE extends KafkatorioKeyedPacketData> =
|
||||
// TYPE extends "PLAYER" ? PlayerUpdateKey :
|
||||
// TYPE extends "MAP_CHUNK" ? MapChunkUpdateKey :
|
||||
// TYPE extends "ENTITY" ? EntityUpdateKey :
|
||||
// never
|
||||
|
||||
|
||||
// /** Make `updateType` specific */
|
||||
export type PacketKey<PACKET extends KafkatorioKeyedPacketData> = PACKET["key"]
|
||||
export type PacketType<PACKET extends KafkatorioKeyedPacketData> = PACKET["type"]
|
||||
//
|
||||
//
|
||||
// /** Make `updateType` specific */
|
||||
// export type CacheData<TYPE extends KafkatorioKeyedPacketData> =
|
||||
// CacheTyped<TYPE>
|
||||
// & Omit<ConvertToUpdate<TYPE>, "updateType">
|
||||
//
|
||||
//
|
||||
// export type CacheTyped<TYPE extends KafkatorioKeyedPacketData> = {
|
||||
// readonly updateType: TYPE
|
||||
// }
|
||||
|
||||
|
||||
export type CacheDataMutator<PACKET extends KafkatorioKeyedPacketData> = (packet: PACKET) => void
|
||||
|
||||
|
||||
class CacheEntry<PACKET extends KafkatorioKeyedPacketData> {
|
||||
lastUpdatedTick: uint = game.tick
|
||||
expirationDurationTicks?: uint
|
||||
|
|
@ -245,8 +203,6 @@ export namespace EventUpdates {
|
|||
this.expirationDurationTicks = expirationDurationTicks
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
const EventUpdatesManager = new EventUpdates.Manager()
|
||||
|
|
|
|||
|
|
@ -43,6 +43,24 @@ function getMapTilePrototypes(): FactorioPrototype.MapTile[] {
|
|||
return tiles
|
||||
}
|
||||
|
||||
|
||||
// function getEntityPrototypes(): FactorioPrototype.MapTile[] {
|
||||
// let tiles: FactorioPrototype.MapTile[] = []
|
||||
// for (let [, tile] of game.tile_prototypes) {
|
||||
// tiles.push({
|
||||
// type: FactorioPrototype.Type.MapTile,
|
||||
//
|
||||
// name: tile.name,
|
||||
// order: tile.order,
|
||||
// layer: tile.layer,
|
||||
// collisionMasks: convertCollisionMaskToNames(tile.collision_mask),
|
||||
// mapColour: Converters.mapColour(tile.map_color),
|
||||
// canBeMined: tile.mineable_properties.minable,
|
||||
// })
|
||||
// }
|
||||
// return tiles
|
||||
// }
|
||||
|
||||
function convertCollisionMaskToNames(cm: CollisionMask): string[] {
|
||||
let masks: string[] = []
|
||||
for (let [name] of pairs(cm)) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,97 @@
|
|||
import {Converters} from "./converters";
|
||||
import EventDataCache from "../cache/EventDataCache";
|
||||
import {
|
||||
EntityUpdateKey,
|
||||
KafkatorioPacketData
|
||||
} from "../../generated/kafkatorio-schema/kafkatorio-schema";
|
||||
|
||||
|
||||
script.on_event(defines.events.on_built_entity, (e: OnBuiltEntityEvent) => {
|
||||
log(`on_built_entity ${e.tick}`)
|
||||
handleBuiltEntityEvent(e)
|
||||
})
|
||||
|
||||
|
||||
script.on_event(defines.events.on_robot_built_entity, (e: OnRobotBuiltEntityEvent) => {
|
||||
log(`on_robot_built_entity ${e.tick}`)
|
||||
handleBuiltEntityEvent(e)
|
||||
})
|
||||
|
||||
|
||||
function handleBuiltEntityEvent(event: OnBuiltEntityEvent | OnRobotBuiltEntityEvent) {
|
||||
const eventName = Converters.eventNameString(event.name)
|
||||
|
||||
if (event.created_entity.unit_number == undefined) {
|
||||
return
|
||||
}
|
||||
|
||||
const key: EntityUpdateKey = {
|
||||
name: event.created_entity.name,
|
||||
protoType: event.created_entity.prototype.name,
|
||||
unitNumber: event.created_entity.unit_number
|
||||
}
|
||||
|
||||
EventDataCache.debounce<KafkatorioPacketData.EntityUpdate>(
|
||||
key,
|
||||
KafkatorioPacketData.Type.EntityUpdate,
|
||||
data => {
|
||||
|
||||
data.events ??= {}
|
||||
data.events[eventName] ??= []
|
||||
data.events[eventName].push(event.tick)
|
||||
|
||||
data.chunkPosition = Converters.convertMapTablePosition(event.created_entity.position)
|
||||
data.graphicsVariation = event.created_entity.graphics_variation
|
||||
data.health = event.created_entity.health
|
||||
data.isActive = event.created_entity.active
|
||||
data.isRotatable = event.created_entity.rotatable
|
||||
data.lastUser = event.created_entity.last_user?.index
|
||||
data.prototype = event.created_entity.prototype.name
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
script.on_event(defines.events.on_player_mined_entity, (e: OnPlayerMinedEntityEvent) => {
|
||||
log(`on_player_mined_entity ${e.tick}`)
|
||||
handleMinedEntityEvent(e)
|
||||
})
|
||||
|
||||
|
||||
script.on_event(defines.events.on_robot_mined_entity, (e: OnRobotMinedEntityEvent) => {
|
||||
log(`on_robot_mined_entity ${e.tick}`)
|
||||
handleMinedEntityEvent(e)
|
||||
})
|
||||
|
||||
|
||||
function handleMinedEntityEvent(event: OnPlayerMinedEntityEvent | OnRobotMinedEntityEvent) {
|
||||
const eventName = Converters.eventNameString(event.name)
|
||||
|
||||
if (event.entity.unit_number == undefined) {
|
||||
return
|
||||
}
|
||||
|
||||
const key: EntityUpdateKey = {
|
||||
name: event.entity.name,
|
||||
protoType: event.entity.prototype.name,
|
||||
unitNumber: event.entity.unit_number
|
||||
}
|
||||
|
||||
EventDataCache.debounce<KafkatorioPacketData.EntityUpdate>(
|
||||
key,
|
||||
KafkatorioPacketData.Type.EntityUpdate,
|
||||
data => {
|
||||
|
||||
data.events ??= {}
|
||||
data.events[eventName] ??= []
|
||||
data.events[eventName].push(event.tick)
|
||||
|
||||
data.chunkPosition = Converters.convertMapTablePosition(event.entity.position)
|
||||
data.graphicsVariation = event.entity.graphics_variation
|
||||
data.health = event.entity.health
|
||||
data.isActive = event.entity.active
|
||||
data.isRotatable = event.entity.rotatable
|
||||
data.lastUser = event.entity.last_user?.index
|
||||
data.prototype = event.entity.prototype.name
|
||||
}
|
||||
)
|
||||
}
|
||||
|
|
@ -1,24 +1,8 @@
|
|||
import {EventName} from "../types";
|
||||
import {Colour} from "../../generated/kafkatorio-schema/kafkatorio-schema";
|
||||
import {Colour, MapChunkPosition} from "../../generated/kafkatorio-schema/kafkatorio-schema";
|
||||
|
||||
export namespace Converters {
|
||||
|
||||
// export function playerToTable(player: LuaPlayer): PlayerData {
|
||||
// let charIds = entitiesToUnitNumbers(player.get_associated_characters())
|
||||
// return {
|
||||
// objectName: player.object_name,
|
||||
//
|
||||
// name: player.name,
|
||||
// characterUnitNumber: player.character?.unit_number ?? null,
|
||||
// associatedCharactersUnitNumbers: charIds,
|
||||
// position: mapEntityPosition(player.position),
|
||||
// colour: mapColour(player.color),
|
||||
// chatColour: mapColour(player.chat_color),
|
||||
// lastOnline: player.last_online
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
const mapEventIdToName = new LuaTable<defines.Events, EventName>()
|
||||
for (const [eventName, eventId] of pairs(defines.events)) {
|
||||
mapEventIdToName.set(eventId, eventName)
|
||||
|
|
@ -30,61 +14,6 @@ export namespace Converters {
|
|||
}
|
||||
|
||||
|
||||
// export function entityToTable(entity: LuaEntity): EntityData {
|
||||
//
|
||||
// let player: LuaPlayer | null = entity.is_player() ? entity.player!! : null
|
||||
//
|
||||
// return {
|
||||
// objectName: entity.object_name,
|
||||
//
|
||||
// // entity data
|
||||
// name: entity.name,
|
||||
// type: entity.type,
|
||||
// active: entity.active,
|
||||
// health: entity.health ?? null,
|
||||
// healthRatio: entity.get_health_ratio() ?? null,
|
||||
// surface: entity.surface.index,
|
||||
// unitNumber: entity.unit_number ?? null,
|
||||
// position: mapEntityPosition(entity.position),
|
||||
// force: entity.force.index,
|
||||
//
|
||||
// // player data
|
||||
// playerIndex: player?.index ?? null
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// function entitiesToUnitNumbers(entities: LuaEntity[]): uint[] {
|
||||
// let result: (uint) [] = []
|
||||
// for (let entity of entities) {
|
||||
// if (entity.unit_number != null) {
|
||||
// result[result.length] = entity.unit_number
|
||||
// }
|
||||
// }
|
||||
// return result
|
||||
// }
|
||||
|
||||
|
||||
// export function mapEntityPosition(mapPos: MapPositionTable): MapEntityPosition {
|
||||
// return {
|
||||
// x: mapPos.x,
|
||||
// y: mapPos.y,
|
||||
// }
|
||||
// }
|
||||
|
||||
// export function mapTilePosition(mapPos: MapPositionTable): MapTilePosition {
|
||||
// return {
|
||||
// x: mapPos.x,
|
||||
// y: mapPos.y,
|
||||
// }
|
||||
// }
|
||||
|
||||
// export function mapChunkPosition(mapPos: ChunkPositionTable): MapChunkPosition {
|
||||
// return {
|
||||
// x: mapPos.x,
|
||||
// y: mapPos.y,
|
||||
// }
|
||||
// }
|
||||
|
||||
export function mapColour(color: ColorTable): Colour {
|
||||
return [
|
||||
color.r ?? 0,
|
||||
|
|
@ -95,23 +24,37 @@ export namespace Converters {
|
|||
}
|
||||
|
||||
|
||||
// export function convertTile(tile: LuaTile): MapTile {
|
||||
// return {
|
||||
// x: tile.position.x,
|
||||
// y: tile.position.y,
|
||||
// proto: tile.prototype.name,
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// export function convertTiles(tiles: LuaTile[]): MapTile[] {
|
||||
// return tiles.map((tile: LuaTile) => convertTile(tile))
|
||||
// }
|
||||
export function convertPlacedTiles(
|
||||
placedTile: LuaTilePrototype,
|
||||
oldTiles: OldTileAndPosition[],
|
||||
): TileRead[] {
|
||||
const converted: TileRead[] = []
|
||||
for (const [, tile] of ipairs(oldTiles)) {
|
||||
converted[converted.length] = {
|
||||
position: {x: tile.position.x, y: tile.position.y},
|
||||
name: placedTile.name,
|
||||
}
|
||||
}
|
||||
return converted
|
||||
}
|
||||
|
||||
// export function convertBoundingBox(bb: BoundingBoxRead): MapBoundingBox {
|
||||
// return {
|
||||
// topLeft: mapTilePosition(bb.left_top),
|
||||
// bottomRight: mapTilePosition(bb.right_bottom),
|
||||
// }
|
||||
// }
|
||||
|
||||
export function convertRemovedTiles(
|
||||
surface: LuaSurface,
|
||||
oldTiles: OldTileAndPosition[],
|
||||
): TileRead[] {
|
||||
const converted: TileRead[] = []
|
||||
for (const [, tile] of ipairs(oldTiles)) {
|
||||
converted[converted.length] = surface.get_tile(tile.position.x, tile.position.y)
|
||||
}
|
||||
return converted
|
||||
}
|
||||
|
||||
|
||||
export function convertMapTablePosition(
|
||||
position: MapPositionTable,
|
||||
): MapChunkPosition {
|
||||
return [position.x, position.y]
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,34 +2,6 @@ import PacketEmitter from "../PacketEmitter";
|
|||
import {KafkatorioPacketData} from "../../generated/kafkatorio-schema/kafkatorio-schema";
|
||||
import Type = KafkatorioPacketData.Type;
|
||||
|
||||
// export function handlePlayerUpdate(tick: uint, eventType: string, playerIndex: uint) {
|
||||
// let player: LuaPlayer = game.players[playerIndex]
|
||||
// let table = Converters.playerToTable(player)
|
||||
//
|
||||
// emitEvent(table, tick, eventType)
|
||||
//
|
||||
// handleCharactersEvent(tick, eventType, playerIndex)
|
||||
// }
|
||||
|
||||
// export function handleCharactersEvent(tick: uint, eventType: string, playerIndex: uint) {
|
||||
//
|
||||
// let player: LuaPlayer = game.players[playerIndex]
|
||||
//
|
||||
// if (player.character != undefined) {
|
||||
// handleEntityUpdate(tick, eventType, player.character)
|
||||
// }
|
||||
// for (const character of player.get_associated_characters()) {
|
||||
// if (character != undefined) {
|
||||
// handleEntityUpdate(tick, eventType, character)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// export function handleEntityUpdate(tick: uint, eventType: string, entity: LuaEntity) {
|
||||
// let table = Converters.entityToTable(entity)
|
||||
// emitEvent(table, tick, eventType)
|
||||
// }
|
||||
|
||||
|
||||
export function handleSurfaceUpdate(
|
||||
event: OnTickEvent,
|
||||
|
|
@ -46,71 +18,3 @@ export function handleSurfaceUpdate(
|
|||
|
||||
PacketEmitter.emitInstantPacket(update)
|
||||
}
|
||||
|
||||
|
||||
// export function handleChunkUpdate(
|
||||
// tick: uint,
|
||||
// eventType: string,
|
||||
// surfaceIndex: uint,
|
||||
// position: ChunkPositionTable,
|
||||
// area: BoundingBoxRead,
|
||||
// ) {
|
||||
//
|
||||
// let surface = game.get_surface(surfaceIndex)
|
||||
//
|
||||
// let tiles: LuaTile[] = surface?.find_tiles_filtered({
|
||||
// area: area,
|
||||
// collision_mask: ["ground-tile", "water-tile"]
|
||||
// }
|
||||
// ) ?? []
|
||||
//
|
||||
// let convertedTiles: MapTile[] = tiles.map((tile: LuaTile) => {
|
||||
// return Converters.convertTile(tile)
|
||||
// })
|
||||
//
|
||||
// let mapChunk: MapChunk = {
|
||||
// objectName: "MapChunk",
|
||||
// tiles: createMapTiles(surfaceIndex, convertedTiles),
|
||||
// position: Converters.mapChunkPosition(position),
|
||||
// area: Converters.convertBoundingBox(area),
|
||||
// }
|
||||
//
|
||||
// emitEvent(mapChunk, tick, eventType)
|
||||
// }
|
||||
|
||||
// export function handleTilesUpdate(
|
||||
// tick: uint,
|
||||
// eventType: string,
|
||||
// surfaceIndex: uint,
|
||||
// newTileType: LuaTilePrototype,
|
||||
// updatedTiles: OldTileAndPosition[],
|
||||
// ) {
|
||||
//
|
||||
// if (!newTileType.collision_mask["ground-tile"] && !newTileType.collision_mask["water-tile"]) {
|
||||
// return
|
||||
// } else {
|
||||
//
|
||||
// let convertedTiles: MapTile[] = updatedTiles.map((it) => {
|
||||
// return {
|
||||
// x: it.position.x,
|
||||
// y: it.position.y,
|
||||
// proto: newTileType.name
|
||||
// }
|
||||
// })
|
||||
//
|
||||
// let mapTiles: MapTiles = createMapTiles(surfaceIndex, convertedTiles)
|
||||
//
|
||||
// emitEvent(mapTiles, tick, eventType)
|
||||
// }
|
||||
// }
|
||||
|
||||
// function createMapTiles(
|
||||
// surfaceIndex: uint,
|
||||
// tiles: MapTile[],
|
||||
// ): MapTiles {
|
||||
// return {
|
||||
// objectName: "LuaTiles",
|
||||
// surfaceIndex: surfaceIndex,
|
||||
// tiles: tiles,
|
||||
// }
|
||||
// }
|
||||
|
|
|
|||
|
|
@ -12,11 +12,22 @@ import Type = KafkatorioPacketData.Type;
|
|||
type MapChunkUpdater = (data: KafkatorioPacketData.MapChunkUpdate) => void
|
||||
|
||||
|
||||
type MapTileUpdateEvent =
|
||||
| OnChunkGeneratedEvent
|
||||
| OnPlayerBuiltTileEvent
|
||||
| OnPlayerMinedEntityEvent
|
||||
| OnPlayerMinedTileEvent
|
||||
| OnRobotBuiltTileEvent
|
||||
| OnRobotMinedEntityEvent
|
||||
| OnRobotMinedTileEvent
|
||||
| ScriptRaisedSetTilesEvent
|
||||
|
||||
|
||||
function mapTilesUpdateDebounce(
|
||||
surface: LuaSurface | undefined,
|
||||
chunkPosition: MapChunkPosition,
|
||||
tiles: TileRead[],
|
||||
eventName: string,
|
||||
event: MapTileUpdateEvent,
|
||||
updater?: MapChunkUpdater,
|
||||
expirationDurationTicks?: uint,
|
||||
) {
|
||||
|
|
@ -25,6 +36,8 @@ function mapTilesUpdateDebounce(
|
|||
return
|
||||
}
|
||||
|
||||
const eventName = Converters.eventNameString(event.name)
|
||||
|
||||
const key: KafkatorioPacketData.MapChunkUpdate["key"] = {
|
||||
surfaceIndex: surface.index,
|
||||
chunkPosition: chunkPosition,
|
||||
|
|
@ -60,9 +73,9 @@ function mapTilesUpdateDebounce(
|
|||
}
|
||||
|
||||
// events count update
|
||||
data.eventCounts ??= {}
|
||||
data.eventCounts[eventName] ??= 0
|
||||
data.eventCounts[eventName]++
|
||||
data.events ??= {}
|
||||
data.events[eventName] ??= []
|
||||
data.events[eventName].push(event.tick)
|
||||
|
||||
// apply mutator
|
||||
if (updater != undefined) {
|
||||
|
|
@ -101,15 +114,15 @@ script.on_event(
|
|||
|
||||
|
||||
export function handleChunkGeneratedEvent(
|
||||
e: OnChunkGeneratedEvent,
|
||||
event: OnChunkGeneratedEvent,
|
||||
expirationDurationTicks?: uint,
|
||||
) {
|
||||
let tiles = getTiles(e.surface, e.area)
|
||||
let tiles = getTiles(event.surface, event.area)
|
||||
mapTilesUpdateDebounce(
|
||||
e.surface,
|
||||
[e.position.x, e.position.y],
|
||||
event.surface,
|
||||
Converters.convertMapTablePosition(event.position),
|
||||
tiles,
|
||||
Converters.eventNameString(e.name),
|
||||
event,
|
||||
undefined,
|
||||
expirationDurationTicks,
|
||||
)
|
||||
|
|
@ -136,18 +149,18 @@ export function handleChunkGeneratedEvent(
|
|||
|
||||
script.on_event(
|
||||
defines.events.script_raised_set_tiles,
|
||||
(e: ScriptRaisedSetTilesEvent) => {
|
||||
log(`script_raised_set_tiles ${e.tick}`)
|
||||
(event: ScriptRaisedSetTilesEvent) => {
|
||||
log(`script_raised_set_tiles ${event.tick}`)
|
||||
|
||||
const surface = getSurface(e.surface_index)
|
||||
const surface = getSurface(event.surface_index)
|
||||
if (surface == undefined) {
|
||||
return
|
||||
}
|
||||
|
||||
const groupedTiles = groupTiles(e.tiles)
|
||||
const groupedTiles = groupTiles(event.tiles)
|
||||
|
||||
for (const [chunkPos, tiles] of groupedTiles) {
|
||||
mapTilesUpdateDebounce(surface, chunkPos, tiles, Converters.eventNameString(e.name))
|
||||
mapTilesUpdateDebounce(surface, chunkPos, tiles, event)
|
||||
}
|
||||
}
|
||||
)
|
||||
|
|
@ -165,41 +178,35 @@ function groupTiles(tiles: TileRead[]): Map<MapChunkPosition, TileRead[]> {
|
|||
mapChunkPositionToTiles.set(chunkPosition, [])
|
||||
}
|
||||
// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/1256
|
||||
// mapChunkPositionToTiles.get(chunkPosition)?.push(tile)
|
||||
const tiles = mapChunkPositionToTiles.get(chunkPosition)
|
||||
if (tiles != null) {
|
||||
tiles.push(tile)
|
||||
}
|
||||
mapChunkPositionToTiles.get(chunkPosition)?.push(tile)
|
||||
// const tiles = mapChunkPositionToTiles.get(chunkPosition)
|
||||
// if (tiles != null) {
|
||||
// tiles.push(tile)
|
||||
// }
|
||||
}
|
||||
return mapChunkPositionToTiles
|
||||
}
|
||||
|
||||
|
||||
function convertOldPosition(
|
||||
oldTiles: OldTileAndPosition[],
|
||||
placedTile: LuaTilePrototype,
|
||||
): TileRead[] {
|
||||
|
||||
return oldTiles.map((tile) => {
|
||||
return {
|
||||
position: {x: tile.position.x, y: tile.position.y},
|
||||
name: placedTile.name,
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
script.on_event(defines.events.on_player_built_tile, (e: OnPlayerBuiltTileEvent) => {
|
||||
log(`on_player_built_tile ${e.tick}`)
|
||||
handleBuiltTileEvent(e)
|
||||
})
|
||||
script.on_event(defines.events.on_robot_built_tile, (e: OnRobotBuiltTileEvent) => {
|
||||
log(`on_robot_built_tile ${e.tick}`)
|
||||
handleBuiltTileEvent(e)
|
||||
})
|
||||
|
||||
function handleBuiltTileEvent(event: OnPlayerBuiltTileEvent | OnRobotBuiltTileEvent) {
|
||||
const eventName = Converters.eventNameString(event.name)
|
||||
|
||||
const surface = getSurface(event.surface_index)
|
||||
if (surface == undefined) {
|
||||
const eventName = Converters.eventNameString(event.name)
|
||||
log(`[handleBuiltTileEvent] undefined surface ${eventName}`)
|
||||
return
|
||||
}
|
||||
|
||||
const tiles: TileRead[] = convertOldPosition(event.tiles, event.tile)
|
||||
const tiles: TileRead[] = Converters.convertPlacedTiles(event.tile, event.tiles)
|
||||
const groupedTiles = groupTiles(tiles)
|
||||
|
||||
for (const [chunkPos, tiles] of groupedTiles) {
|
||||
|
|
@ -207,7 +214,7 @@ function handleBuiltTileEvent(event: OnPlayerBuiltTileEvent | OnRobotBuiltTileEv
|
|||
surface,
|
||||
chunkPos,
|
||||
tiles,
|
||||
eventName,
|
||||
event,
|
||||
(data => {
|
||||
if (isEventType(event, defines.events.on_player_built_tile)) {
|
||||
data.player = event.player_index
|
||||
|
|
@ -231,27 +238,54 @@ function handleBuiltTileEvent(event: OnPlayerBuiltTileEvent | OnRobotBuiltTileEv
|
|||
}
|
||||
|
||||
|
||||
script.on_event(defines.events.on_player_built_tile, (e: OnPlayerBuiltTileEvent) => {
|
||||
log(`on_player_built_tile ${e.tick}`)
|
||||
handleBuiltTileEvent(e)
|
||||
})
|
||||
script.on_event(defines.events.on_robot_built_tile, (e: OnRobotBuiltTileEvent) => {
|
||||
log(`on_robot_built_tile ${e.tick}`)
|
||||
handleBuiltTileEvent(e)
|
||||
script.on_event(defines.events.on_player_mined_tile, (e: OnPlayerMinedTileEvent) => {
|
||||
log(`on_player_mined_tile ${e.tick}`)
|
||||
handleMinedTileEvent(e)
|
||||
})
|
||||
|
||||
script.on_event(defines.events.on_robot_mined_tile, (e: OnRobotMinedTileEvent) => {
|
||||
log(`on_robot_mined_tile ${e.tick}`)
|
||||
handleMinedTileEvent(e)
|
||||
})
|
||||
|
||||
// function handleMinedTileEvent(event: OnPlayerMinedTileEvent | OnRobotMinedTileEvent) {
|
||||
// }
|
||||
//
|
||||
// script.on_event(defines.events.on_player_mined_tile, (e: OnPlayerMinedTileEvent) => {
|
||||
// log(`on_player_mined_tile ${e.tick}`)
|
||||
// handleMinedTileEvent(e)
|
||||
// })
|
||||
// script.on_event(defines.events.on_robot_mined_tile, (e: OnRobotMinedTileEvent) => {
|
||||
// log(`on_robot_mined_tile ${e.tick}`)
|
||||
// handleMinedTileEvent(e)
|
||||
// })
|
||||
function handleMinedTileEvent(event: OnPlayerMinedTileEvent | OnRobotMinedTileEvent) {
|
||||
const surface = getSurface(event.surface_index)
|
||||
if (surface == undefined) {
|
||||
const eventName = Converters.eventNameString(event.name)
|
||||
log(`[handleMinedTileEvent] undefined surface ${eventName}`)
|
||||
return
|
||||
}
|
||||
|
||||
const tiles: TileRead[] = Converters.convertRemovedTiles(surface, event.tiles)
|
||||
const groupedTiles = groupTiles(tiles)
|
||||
|
||||
for (const [chunkPos, tiles] of groupedTiles) {
|
||||
mapTilesUpdateDebounce(
|
||||
surface,
|
||||
chunkPos,
|
||||
tiles,
|
||||
event,
|
||||
(data => {
|
||||
if (isEventType(event, defines.events.on_player_mined_tile)) {
|
||||
data.player = event.player_index
|
||||
return
|
||||
}
|
||||
if (isEventType(event, defines.events.on_robot_mined_tile)) {
|
||||
data.robot = {
|
||||
unitNumber: event.robot?.unit_number ?? null,
|
||||
name: event.robot.name,
|
||||
protoType: event.robot.type,
|
||||
}
|
||||
return
|
||||
}
|
||||
// this line will not compile if the previous 'if' statements are not exhaustive
|
||||
// noinspection UnnecessaryLocalVariableJS,JSUnusedLocalSymbols
|
||||
const exhaustiveCheck: never = event
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
script.on_event(
|
||||
|
|
|
|||
|
|
@ -6,11 +6,29 @@ import Type = KafkatorioPacketData.Type;
|
|||
|
||||
type PlayerUpdater = (player: LuaPlayer, data: KafkatorioPacketData.PlayerUpdate) => void
|
||||
|
||||
|
||||
type PlayerUpdateEvent =
|
||||
| OnPlayerJoinedGameEvent
|
||||
| OnPlayerChangedPositionEvent
|
||||
| OnPlayerChangedSurfaceEvent
|
||||
| OnPlayerDiedEvent
|
||||
| OnPlayerBannedEvent
|
||||
| OnPlayerUnbannedEvent
|
||||
| OnPlayerKickedEvent
|
||||
| OnPrePlayerLeftGameEvent
|
||||
| OnPlayerRemovedEvent
|
||||
|
||||
|
||||
function playerUpdateThrottle(
|
||||
playerIndex: uint,
|
||||
eventName: string,
|
||||
event: PlayerUpdateEvent,
|
||||
mutate: PlayerUpdater,
|
||||
) {
|
||||
const playerIndex = event.player_index
|
||||
if (playerIndex == undefined) {
|
||||
return
|
||||
}
|
||||
|
||||
const eventName = Converters.eventNameString(event.name)
|
||||
|
||||
EventUpdatesManager.throttle<KafkatorioPacketData.PlayerUpdate>(
|
||||
{index: playerIndex},
|
||||
|
|
@ -21,10 +39,9 @@ function playerUpdateThrottle(
|
|||
mutate(player, data)
|
||||
}
|
||||
|
||||
if (data.eventCounts == undefined) {
|
||||
data.eventCounts = {}
|
||||
}
|
||||
data.eventCounts[eventName] = ((data.eventCounts ?? {}) [eventName] ?? 0) + 1
|
||||
data.events ??= {}
|
||||
data.events[eventName] ??= []
|
||||
data.events[eventName].push(event.tick)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
|
@ -50,8 +67,7 @@ script.on_event(
|
|||
defines.events.on_player_joined_game,
|
||||
(e: OnPlayerJoinedGameEvent) => {
|
||||
playerUpdateThrottle(
|
||||
e.player_index,
|
||||
Converters.eventNameString(e.name),
|
||||
e,
|
||||
(player, data) => {
|
||||
data.isAdmin = player.admin
|
||||
data.characterUnitNumber = player.character?.unit_number ?? null
|
||||
|
|
@ -69,12 +85,12 @@ script.on_event(
|
|||
}
|
||||
)
|
||||
|
||||
|
||||
script.on_event(
|
||||
defines.events.on_player_changed_position,
|
||||
(e: OnPlayerChangedPositionEvent) => {
|
||||
playerUpdateThrottle(
|
||||
e.player_index,
|
||||
Converters.eventNameString(e.name),
|
||||
e,
|
||||
(player, data) => {
|
||||
data.position = [player.position.x, player.position.y]
|
||||
}
|
||||
|
|
@ -82,12 +98,12 @@ script.on_event(
|
|||
}
|
||||
)
|
||||
|
||||
|
||||
script.on_event(
|
||||
defines.events.on_player_changed_surface,
|
||||
(e: OnPlayerChangedSurfaceEvent) => {
|
||||
playerUpdateThrottle(
|
||||
e.player_index,
|
||||
Converters.eventNameString(e.name),
|
||||
e,
|
||||
(player, data) => {
|
||||
data.position = [player.position.x, player.position.y]
|
||||
data.surfaceIndex = player.surface.index
|
||||
|
|
@ -96,12 +112,12 @@ script.on_event(
|
|||
}
|
||||
)
|
||||
|
||||
|
||||
script.on_event(
|
||||
defines.events.on_player_died,
|
||||
(e: OnPlayerDiedEvent) => {
|
||||
playerUpdateThrottle(
|
||||
e.player_index,
|
||||
Converters.eventNameString(e.name),
|
||||
e,
|
||||
(player, data) => {
|
||||
data.ticksToRespawn = player.ticks_to_respawn ?? null
|
||||
playerOnlineInfo(player, data)
|
||||
|
|
@ -117,31 +133,28 @@ script.on_event(
|
|||
}
|
||||
)
|
||||
|
||||
|
||||
script.on_event(defines.events.on_player_banned, handleBannedEvent)
|
||||
script.on_event(defines.events.on_player_unbanned, handleBannedEvent)
|
||||
|
||||
function handleBannedEvent(e: OnPlayerBannedEvent | OnPlayerUnbannedEvent) {
|
||||
|
||||
if (e.player_index != undefined) {
|
||||
playerUpdateThrottle(
|
||||
e.player_index,
|
||||
Converters.eventNameString(e.name),
|
||||
(player, data) => {
|
||||
data.bannedReason = e.reason ?? null
|
||||
playerOnlineInfo(player, data)
|
||||
}
|
||||
)
|
||||
}
|
||||
function handleBannedEvent(event: OnPlayerBannedEvent | OnPlayerUnbannedEvent) {
|
||||
playerUpdateThrottle(
|
||||
event,
|
||||
(player, data) => {
|
||||
data.bannedReason = event.reason ?? null
|
||||
playerOnlineInfo(player, data)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
script.on_event(
|
||||
defines.events.on_player_kicked,
|
||||
(e: OnPlayerKickedEvent) => {
|
||||
(event: OnPlayerKickedEvent) => {
|
||||
playerUpdateThrottle(
|
||||
e.player_index,
|
||||
Converters.eventNameString(e.name),
|
||||
event,
|
||||
(player, data) => {
|
||||
data.kickedReason = e.reason ?? null
|
||||
data.kickedReason = event.reason ?? null
|
||||
playerOnlineInfo(player, data)
|
||||
}
|
||||
)
|
||||
|
|
@ -156,12 +169,11 @@ for (const [name, disconnectId] of pairs(defines.disconnect_reason)) {
|
|||
|
||||
script.on_event(
|
||||
defines.events.on_pre_player_left_game,
|
||||
(e: OnPrePlayerLeftGameEvent) => {
|
||||
(event: OnPrePlayerLeftGameEvent) => {
|
||||
playerUpdateThrottle(
|
||||
e.player_index,
|
||||
Converters.eventNameString(e.name),
|
||||
event,
|
||||
(player, data) => {
|
||||
data.disconnectReason = disconnectReasons.get(e.reason)
|
||||
data.disconnectReason = disconnectReasons.get(event.reason)
|
||||
playerOnlineInfo(player, data)
|
||||
}
|
||||
)
|
||||
|
|
@ -170,10 +182,9 @@ script.on_event(
|
|||
|
||||
script.on_event(
|
||||
defines.events.on_player_removed,
|
||||
(e: OnPlayerRemovedEvent) => {
|
||||
(event: OnPlayerRemovedEvent) => {
|
||||
playerUpdateThrottle(
|
||||
e.player_index,
|
||||
Converters.eventNameString(e.name),
|
||||
event,
|
||||
(player, data) => {
|
||||
data.isRemoved = true
|
||||
playerOnlineInfo(player, data)
|
||||
|
|
|
|||
|
|
@ -31,25 +31,25 @@ import {handleSurfaceUpdate} from "./handlers";
|
|||
|
||||
script.on_event(
|
||||
defines.events.on_tick,
|
||||
(e: OnTickEvent) => {
|
||||
if (e.tick % 1000 == 0) {
|
||||
(event: OnTickEvent) => {
|
||||
if (event.tick % 1000 == 0) {
|
||||
for (const [, surface] of game.surfaces) {
|
||||
handleSurfaceUpdate(e, Converters.eventNameString(e.name), surface)
|
||||
handleSurfaceUpdate(event, Converters.eventNameString(event.name), surface)
|
||||
}
|
||||
}
|
||||
|
||||
if (e.tick % 7 == 0) {
|
||||
if (event.tick % 7 == 0) {
|
||||
const events: EventData[] = Queue.dequeueValues(1)
|
||||
|
||||
if (events.length > 0) {
|
||||
log(`[${e.tick}] dequed ${events.length} events, current size: ${Queue.size()}`)
|
||||
log(`[${event.tick}] dequed ${events.length} events, current size: ${Queue.size()}`)
|
||||
|
||||
let i = 100
|
||||
for (const event of events) {
|
||||
if (isEventType(event, defines.events.on_chunk_generated)) {
|
||||
let eName = Converters.eventNameString(event.name)
|
||||
|
||||
log(`[${e.tick}] dequed event ${eName}`)
|
||||
log(`[${event.tick}] dequed event ${eName}`)
|
||||
handleChunkGeneratedEvent(event, i)
|
||||
i += 10
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,18 +6,18 @@ export class KafkatorioSettingsConfig {
|
|||
|
||||
|
||||
private static eventCacheExpirationDefaultSeconds: Record<KafkatorioKeyedPacketTypes, double> = {
|
||||
"dev.adamko.kafkatorio.schema.packets.PlayerUpdate": 0.5,
|
||||
"dev.adamko.kafkatorio.schema.packets.MapChunkUpdate": 30,
|
||||
"dev.adamko.kafkatorio.schema.packets.EntityUpdate": 5,
|
||||
"kafkatorio.packet.keyed.PlayerUpdate": 0.5,
|
||||
"kafkatorio.packet.keyed.MapChunkUpdate": 30,
|
||||
"kafkatorio.packet.keyed.EntityUpdate": 5,
|
||||
}
|
||||
|
||||
|
||||
private eventCacheExpirationTicks: Record<KafkatorioKeyedPacketTypes, double> = {
|
||||
"dev.adamko.kafkatorio.schema.packets.PlayerUpdate":
|
||||
"kafkatorio.packet.keyed.PlayerUpdate":
|
||||
KafkatorioSettingsConfig.eventCacheExpirationDefaultSeconds[KafkatorioPacketData.Type.PlayerUpdate],
|
||||
"dev.adamko.kafkatorio.schema.packets.MapChunkUpdate":
|
||||
"kafkatorio.packet.keyed.MapChunkUpdate":
|
||||
KafkatorioSettingsConfig.eventCacheExpirationDefaultSeconds[KafkatorioPacketData.Type.MapChunkUpdate],
|
||||
"dev.adamko.kafkatorio.schema.packets.EntityUpdate":
|
||||
"kafkatorio.packet.keyed.EntityUpdate":
|
||||
KafkatorioSettingsConfig.eventCacheExpirationDefaultSeconds[KafkatorioPacketData.Type.EntityUpdate],
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -24,3 +24,6 @@ type KafkatorioKeyedPacketData = Extract<KafkatorioPacketData, { key: object }>
|
|||
type KafkatorioKeyedPacketTypes = KafkatorioKeyedPacketData["type"];
|
||||
|
||||
type KafkatorioKeyedPacketKeys = KafkatorioKeyedPacketData["key"];
|
||||
|
||||
|
||||
type WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] }
|
||||
|
|
|
|||
|
|
@ -32,9 +32,9 @@
|
|||
}
|
||||
},
|
||||
"is-core-module": {
|
||||
"version": "2.8.1",
|
||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
|
||||
"integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
|
||||
"version": "2.9.0",
|
||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
|
||||
"integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
|
||||
"requires": {
|
||||
"has": "^1.0.3"
|
||||
}
|
||||
|
|
@ -85,9 +85,9 @@
|
|||
"integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw=="
|
||||
},
|
||||
"typescript-to-lua": {
|
||||
"version": "1.4.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript-to-lua/-/typescript-to-lua-1.4.3.tgz",
|
||||
"integrity": "sha512-oGJO1BqXKSxdfwavfOzthelxaQVAc7ykJ4Z/BF96nAWz35nmuLyv9FOSS132TgzLmV02859ndMuTYZtiVnN6jQ==",
|
||||
"version": "1.4.4",
|
||||
"resolved": "https://registry.npmjs.org/typescript-to-lua/-/typescript-to-lua-1.4.4.tgz",
|
||||
"integrity": "sha512-HqXDi0rjYANvVeOJlYAyjwCvLtpXV+RRp9GiknCJrd8+0D9G/2yZ5rO+LsDlY1y09sZ4xmufwsiZ6iNFm+o1GQ==",
|
||||
"requires": {
|
||||
"enhanced-resolve": "^5.8.2",
|
||||
"resolve": "^1.15.1",
|
||||
|
|
|
|||
|
|
@ -9,16 +9,19 @@
|
|||
"engines": {
|
||||
"node": "~14.19.1"
|
||||
},
|
||||
"devDependencies": {},
|
||||
"devDependencies": {
|
||||
},
|
||||
"dependencies": {
|
||||
"lua-types": "^2.11.0",
|
||||
"typescript-to-lua": "1.4.3",
|
||||
"typescript-to-lua": "1.4.4",
|
||||
"typed-factorio": "1.0.0",
|
||||
"typescript": "4.6.3"
|
||||
},
|
||||
"// @types/node": "^12.0.8",
|
||||
"license": "UNLICENSED",
|
||||
"peerDependencies": {},
|
||||
"optionalDependencies": {},
|
||||
"bundledDependencies": []
|
||||
"peerDependencies": {
|
||||
},
|
||||
"optionalDependencies": {
|
||||
},
|
||||
"bundledDependencies": [
|
||||
]
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue