t2-demo-parser 2.2.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +170 -7
  2. package/dist/BitStream.d.ts +14 -3
  3. package/dist/BitStream.d.ts.map +1 -1
  4. package/dist/BitStream.js +28 -6
  5. package/dist/BitStream.js.map +1 -1
  6. package/dist/BitWriter.d.ts +29 -0
  7. package/dist/BitWriter.d.ts.map +1 -0
  8. package/dist/BitWriter.js +76 -0
  9. package/dist/BitWriter.js.map +1 -0
  10. package/dist/ClassRegistry.d.ts +23 -28
  11. package/dist/ClassRegistry.d.ts.map +1 -1
  12. package/dist/ClassRegistry.js +75 -84
  13. package/dist/ClassRegistry.js.map +1 -1
  14. package/dist/DataBlockParsers.d.ts.map +1 -1
  15. package/dist/DataBlockParsers.js +60 -85
  16. package/dist/DataBlockParsers.js.map +1 -1
  17. package/dist/DemoParser.d.ts +23 -22
  18. package/dist/DemoParser.d.ts.map +1 -1
  19. package/dist/DemoParser.js +218 -266
  20. package/dist/DemoParser.js.map +1 -1
  21. package/dist/EventParsers.d.ts.map +1 -1
  22. package/dist/EventParsers.js +87 -58
  23. package/dist/EventParsers.js.map +1 -1
  24. package/dist/GhostManager.d.ts +7 -1
  25. package/dist/GhostManager.d.ts.map +1 -1
  26. package/dist/GhostManager.js +231 -146
  27. package/dist/GhostManager.js.map +1 -1
  28. package/dist/HuffmanProcessor.d.ts +15 -0
  29. package/dist/HuffmanProcessor.d.ts.map +1 -1
  30. package/dist/HuffmanProcessor.js +45 -0
  31. package/dist/HuffmanProcessor.js.map +1 -1
  32. package/dist/LiveParser.d.ts +20 -1
  33. package/dist/LiveParser.d.ts.map +1 -1
  34. package/dist/LiveParser.js +31 -12
  35. package/dist/LiveParser.js.map +1 -1
  36. package/dist/PacketParser.d.ts +22 -2
  37. package/dist/PacketParser.d.ts.map +1 -1
  38. package/dist/PacketParser.js +111 -48
  39. package/dist/PacketParser.js.map +1 -1
  40. package/dist/Timeline.d.ts +5 -2
  41. package/dist/Timeline.d.ts.map +1 -1
  42. package/dist/Timeline.js +25 -12
  43. package/dist/Timeline.js.map +1 -1
  44. package/dist/cli.js +3 -0
  45. package/dist/cli.js.map +1 -1
  46. package/dist/dataBlockDataTypes.d.ts +118 -117
  47. package/dist/dataBlockDataTypes.d.ts.map +1 -1
  48. package/dist/dataBlockDataTypes.js.map +1 -1
  49. package/dist/defaultRegistry.d.ts +9 -0
  50. package/dist/defaultRegistry.d.ts.map +1 -0
  51. package/dist/defaultRegistry.js +43 -0
  52. package/dist/defaultRegistry.js.map +1 -0
  53. package/dist/eventDataTypes.d.ts +74 -72
  54. package/dist/eventDataTypes.d.ts.map +1 -1
  55. package/dist/eventDataTypes.js.map +1 -1
  56. package/dist/ghostDataTypes.d.ts +125 -131
  57. package/dist/ghostDataTypes.d.ts.map +1 -1
  58. package/dist/ghostDataTypes.js.map +1 -1
  59. package/dist/index.d.ts +6 -4
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +4 -2
  62. package/dist/index.js.map +1 -1
  63. package/dist/types.d.ts +51 -2
  64. package/dist/types.d.ts.map +1 -1
  65. package/dist/types.js +6 -0
  66. package/dist/types.js.map +1 -1
  67. package/package.json +4 -1
  68. package/dist/BitStream.test.d.ts +0 -2
  69. package/dist/BitStream.test.d.ts.map +0 -1
  70. package/dist/BitStream.test.js +0 -419
  71. package/dist/BitStream.test.js.map +0 -1
  72. package/dist/ClassRegistry.test.d.ts +0 -2
  73. package/dist/ClassRegistry.test.d.ts.map +0 -1
  74. package/dist/ClassRegistry.test.js +0 -83
  75. package/dist/ClassRegistry.test.js.map +0 -1
  76. package/dist/DataBlockParsers.test.d.ts +0 -2
  77. package/dist/DataBlockParsers.test.d.ts.map +0 -1
  78. package/dist/DataBlockParsers.test.js +0 -294
  79. package/dist/DataBlockParsers.test.js.map +0 -1
  80. package/dist/DemoParser.test.d.ts +0 -2
  81. package/dist/DemoParser.test.d.ts.map +0 -1
  82. package/dist/DemoParser.test.js +0 -472
  83. package/dist/DemoParser.test.js.map +0 -1
  84. package/dist/GhostStateAccumulator.test.d.ts +0 -2
  85. package/dist/GhostStateAccumulator.test.d.ts.map +0 -1
  86. package/dist/GhostStateAccumulator.test.js +0 -201
  87. package/dist/GhostStateAccumulator.test.js.map +0 -1
  88. package/dist/GhostTracker.test.d.ts +0 -2
  89. package/dist/GhostTracker.test.d.ts.map +0 -1
  90. package/dist/GhostTracker.test.js +0 -64
  91. package/dist/GhostTracker.test.js.map +0 -1
  92. package/dist/IncrementalParser.test.d.ts +0 -2
  93. package/dist/IncrementalParser.test.d.ts.map +0 -1
  94. package/dist/IncrementalParser.test.js +0 -226
  95. package/dist/IncrementalParser.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"EventParsers.js","sourceRoot":"","sources":["../src/EventParsers.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BitStream } from \"./BitStream.js\";\nimport type { ClassRegistry, ConnectionContext } from \"./ClassRegistry.js\";\nimport type {\n SimDataBlockEventData,\n NetStringEventData,\n Sim2DAudioEventData,\n Sim3DAudioEventData,\n SetSensorGroupEventData,\n SetServerTargetEventData,\n TargetToEventData,\n SetObjectActiveImageEventData,\n SetMissionCRCEventData,\n RemoteCommandEventData,\n TargetInfoEventData,\n TargetFreeEventData,\n SimTargetAudioEventData,\n SensorGroupColorEventData,\n SensorGroupColorEntry,\n ResetClientTargetsEventData,\n RemoveClientTargetTypeEventData,\n SimVoiceStreamEventData,\n GhostingMessageEventData,\n GhostAlwaysObjectEventData,\n PathManagerEventData,\n PathData,\n PathPoint,\n LightningStrikeEventData,\n FileChunkEventData,\n DownloadMessageEventData,\n FileDownloadRequestEventData,\n SimpleMessageEventData,\n CRCChallengeEventData,\n CRCChallengeResponseEventData,\n GravityEventData,\n FogChallengeEventData,\n} from \"./eventDataTypes.js\";\nimport {\n DataBlockClassFirst,\n SimDBEventObjectIdBits,\n SimDBEventClassIdBits,\n SimDBEventIndexBits,\n SimDBEventTotalBits,\n} from \"./types.js\";\n\n// ============================================================\n// SimDataBlockEvent — DataBlock definition sent during gameplay\n// ============================================================\n\nfunction simDataBlockEventUnpack(\n bs: BitStream,\n conn: ConnectionContext\n): SimDataBlockEventData {\n // Decompiled source of truth:\n // FUN_005ffc90 reads:\n // mProcess flag + readClassId() + readInt(7) + readInt(11) + readInt(12)\n // This matches the on-wire format written by FUN_005ffbc0.\n const mProcess = bs.readFlag();\n if (!mProcess) {\n return {\n type: \"SimDataBlockEvent\",\n mProcess: false,\n };\n }\n\n const id = bs.readInt(SimDBEventObjectIdBits) + 0;\n const classId = bs.readInt(SimDBEventClassIdBits) + DataBlockClassFirst;\n const index = bs.readInt(SimDBEventIndexBits);\n const total = bs.readInt(SimDBEventTotalBits);\n\n const result: SimDataBlockEventData = {\n type: \"SimDataBlockEvent\",\n mProcess: true,\n objectId: id,\n classId,\n index,\n total,\n _payloadBitPos: bs.getCurPos(),\n };\n\n // Try to parse the DataBlock payload if we have a parser.\n // String buffer is already enabled by parsePacket() for the entire packet —\n // do NOT toggle it here, as that would reset accumulated prefix context and\n // then disable string buffer for the rest of the packet's events and ghosts.\n const parser = conn.getDataBlockParser?.(classId);\n if (parser) {\n try {\n result.dataBlockData = parser.unpackData(bs);\n result.dataBlockClassName = parser.name;\n } catch {\n result._needsClassParser = true;\n }\n } else {\n result._needsClassParser = true;\n }\n\n return result;\n}\n\n// ============================================================\n// NetStringEvent — string table update\n// ============================================================\n\nfunction netStringEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): NetStringEventData {\n // Tribes2.exe source of truth (FUN_00589b60):\n // - id: readInt(10)\n // - hasValue: readFlag()\n // - if hasValue: readString() via BitStream::readString(..., 0xff)\n const id = bs.readInt(10);\n const hasValue = bs.readFlag();\n const value = hasValue ? bs.readString() : undefined;\n return { type: \"NetStringEvent\", id, hasValue, value };\n}\n\n// ============================================================\n// Sim2DAudioEvent — 2D audio playback\n// ============================================================\n\nfunction sim2DAudioEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): Sim2DAudioEventData {\n // Binary FUN_005fff40: FUN_00436d10(bs) = readInt(11) for DataBlock object ref.\n // No +3 offset — object IDs here use the same numbering as ghost dataBlockId\n // references and SimDataBlockEvent.objectId (all keyed by raw readInt(11)).\n const id = bs.readInt(11);\n return { type: \"Sim2DAudioEvent\", profileId: id };\n}\n\n// ============================================================\n// Sim3DAudioEvent — 3D positional audio\n// ============================================================\n\nfunction sim3DAudioEventUnpack(\n bs: BitStream,\n conn: ConnectionContext\n): Sim3DAudioEventData {\n // Binary FUN_006000f0: FUN_00436d10(bs) = readInt(11) for DataBlock object ref.\n // No +3 offset — same numbering as ghost dataBlockId and SimDataBlockEvent.\n const id = bs.readInt(11);\n let rotation: Sim3DAudioEventData[\"rotation\"];\n if (bs.readFlag()) {\n // Has cone params — read quaternion\n const qx = bs.readFloat(8);\n const qy = bs.readFloat(8);\n const qz = bs.readFloat(8);\n let qw = Math.sqrt(Math.max(0, 1.0 - (qx * qx + qy * qy + qz * qz)));\n if (bs.readFlag()) qw = -qw;\n rotation = { x: qx, y: qy, z: qz, w: qw };\n }\n // Read compressed position\n const position = bs.readCompressedPoint(conn.compressionPoint, 0.5);\n return { type: \"Sim3DAudioEvent\", profileId: id, rotation, position };\n}\n\n// ============================================================\n// SetSensorGroupEvent\n// ============================================================\n\nfunction setSensorGroupEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): SetSensorGroupEventData {\n return { type: \"SetSensorGroupEvent\", sensorGroup: bs.readInt(5) };\n}\n\n// ============================================================\n// SetServerTargetEvent\n// ============================================================\n\nfunction setServerTargetEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): SetServerTargetEventData {\n const targetId = bs.readFlag() ? bs.readInt(9) : undefined; // TargetIdBitSize=9\n const targetPos = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n const result: SetServerTargetEventData = {\n type: \"SetServerTargetEvent\",\n targetPos,\n };\n if (targetId !== undefined) result.targetId = targetId;\n return result;\n}\n\n// ============================================================\n// TargetToEvent — waypoint/command targeting\n// ============================================================\n\nfunction targetToEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): TargetToEventData {\n const targetId = bs.readFlag() ? bs.readInt(9) : undefined;\n const targetPos = bs.readFlag()\n ? { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() }\n : undefined;\n const result: TargetToEventData = {\n type: \"TargetToEvent\",\n assign: false, // placeholder, overwritten below\n };\n if (targetId !== undefined) result.targetId = targetId;\n if (targetPos) result.targetPos = targetPos;\n result.assign = bs.readFlag();\n return result;\n}\n\n// ============================================================\n// SetObjectActiveImageEvent\n// ============================================================\n\nfunction setObjectActiveImageEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): SetObjectActiveImageEventData {\n const objectId = bs.readRangedU32(0, 1023); // MaxGhostCount-1\n const imageSlot = bs.readRangedU32(0, 8); // MaxMountedImages\n return { type: \"SetObjectActiveImageEvent\", objectId, imageSlot };\n}\n\n// ============================================================\n// SetMissionCRCEvent\n// ============================================================\n\nfunction setMissionCRCEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): SetMissionCRCEventData {\n return { type: \"SetMissionCRCEvent\", crc: bs.readU32() };\n}\n\n// ============================================================\n// RemoteCommandEvent — script console command\n// ============================================================\n\nfunction remoteCommandEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): RemoteCommandEventData {\n // Decompiled Tribes 2 binary source of truth:\n // pack: FUN_005bfd40 writes argc(5 bits), then argc×FUN_00588530\n // unpack: FUN_005bfda0 reads argc(5 bits), then argc×FUN_00588690\n const argc = bs.readInt(5);\n const argv: string[] = [];\n for (let i = 0; i < argc; i++) {\n argv.push(bs.unpackNetString());\n }\n return {\n type: \"RemoteCommandEvent\",\n argc,\n argv,\n funcName: argv[0] ?? \"\",\n args: argv.slice(1),\n };\n}\n\n// ============================================================\n// TargetInfoEvent — target metadata synchronization\n// ============================================================\n\nfunction targetInfoEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): TargetInfoEventData {\n // Decompiled Tribes2.exe source of truth (FUN_006735b0):\n // - targetId: readInt(9)\n // - tag fields: outer presence flag; inner non-empty flag; if non-empty readInt(10), else sentinel 0x400\n // - sensorGroup: optional readInt(5)\n // - dataBlock: outer presence flag; inner valid flag; if valid readInt(11), else sentinel -2\n // - renderFlags: optional readInt(9)\n // - voicePitch: optional readFloat(7) * 1.5 + 0.5\n const result: TargetInfoEventData = {\n type: \"TargetInfoEvent\",\n targetId: bs.readInt(9), // TargetIdBitSize=9\n };\n\n if (bs.readFlag()) {\n result.nameTag = bs.readFlag() ? bs.readInt(10) : 0x400;\n }\n if (bs.readFlag()) {\n result.skinTag = bs.readFlag() ? bs.readInt(10) : 0x400;\n }\n if (bs.readFlag()) {\n result.skinPrefTag = bs.readFlag() ? bs.readInt(10) : 0x400;\n }\n if (bs.readFlag()) {\n result.voiceTag = bs.readFlag() ? bs.readInt(10) : 0x400;\n }\n if (bs.readFlag()) {\n result.typeTag = bs.readFlag() ? bs.readInt(10) : 0x400;\n }\n if (bs.readFlag()) {\n result.sensorGroup = bs.readInt(5);\n }\n if (bs.readFlag()) {\n result.dataBlockId = bs.readFlag() ? bs.readInt(11) : -2;\n }\n if (bs.readFlag()) {\n result.renderFlags = bs.readInt(9); // NumRenderBits=9\n }\n if (bs.readFlag()) {\n const raw = bs.readFloat(7);\n result.voicePitch = raw * 1.5 + 0.5;\n }\n\n return result;\n}\n\n// ============================================================\n// TargetFreeEvent — target cleanup notification\n// ============================================================\n\nfunction targetFreeEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): TargetFreeEventData {\n return { type: \"TargetFreeEvent\", targetId: bs.readInt(9) };\n}\n\n// ============================================================\n// SimTargetAudioEvent — target-specific audio\n// ============================================================\n\nfunction simTargetAudioEventUnpack(\n bs: BitStream,\n conn: ConnectionContext\n): SimTargetAudioEventData {\n const result: SimTargetAudioEventData = {\n type: \"SimTargetAudioEvent\",\n targetId: bs.readInt(9),\n fileTag: bs.readInt(12),\n descriptionId: bs.readRangedU32(3, 1026),\n updateSound: false,\n };\n if (bs.readFlag()) {\n result.position = bs.readCompressedPoint(conn.compressionPoint, 0.5);\n }\n result.updateSound = bs.readFlag();\n return result;\n}\n\n// ============================================================\n// SensorGroupColorEvent — sensor group HUD colors\n// ============================================================\n\nfunction sensorGroupColorEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): SensorGroupColorEventData {\n const sensorGroup = bs.readInt(5);\n const updateMask = bs.readU32();\n const colors: SensorGroupColorEntry[] = [];\n for (let i = 0; i < 32; i++) {\n if ((1 << i) & updateMask) {\n if (bs.readFlag()) {\n colors.push({\n index: i,\n r: bs.readU8(),\n g: bs.readU8(),\n b: bs.readU8(),\n a: bs.readU8(),\n });\n } else {\n colors.push({ index: i, default: true });\n }\n }\n }\n return { type: \"SensorGroupColorEvent\", sensorGroup, updateMask, colors };\n}\n\n// ============================================================\n// ResetClientTargetsEvent — clear all client targets\n// ============================================================\n\nfunction resetClientTargetsEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): ResetClientTargetsEventData {\n return {\n type: \"ResetClientTargetsEvent\",\n clientTargetsOnly: bs.readFlag(),\n };\n}\n\n// ============================================================\n// RemoveClientTargetTypeEvent — remove targets by type\n// ============================================================\n\nfunction removeClientTargetTypeEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): RemoveClientTargetTypeEventData {\n return {\n type: \"RemoveClientTargetTypeEvent\",\n targetType: bs.readRangedU32(0, 3), // NumTypes=3\n };\n}\n\n// ============================================================\n// SimVoiceStreamEvent — voice chat audio streaming\n// ============================================================\n\nfunction simVoiceStreamEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): SimVoiceStreamEventData {\n const streamId = bs.readInt(5);\n const sequence = bs.readInt(6); // SEQUENCE_BITS=6\n const codecId = bs.readInt(2);\n // Server connection (demo is always client-side):\n const clientId = bs.readU8();\n const result: SimVoiceStreamEventData = {\n type: \"SimVoiceStreamEvent\",\n streamId,\n sequence,\n codecId,\n clientId,\n size: 0,\n };\n if (sequence === 0) {\n result.objectId = bs.readInt(10); // GhostIdBitSize=10\n }\n // Size\n const VOICE_PACKET_DATA_SIZE = 16; // typical value\n if (bs.readFlag()) {\n result.size = bs.readInt(5); // SIZE_BITS=5\n } else {\n result.size = VOICE_PACKET_DATA_SIZE;\n }\n // Skip the audio data bytes (mSize bytes, but first byte is lock byte so we read mSize-1)\n if (result.size > 0) {\n result.audioData = bs.readBitsBuffer(result.size * 8);\n }\n return result;\n}\n\n// ============================================================\n// GhostingMessageEvent — ghost synchronization control\n// ============================================================\n\nfunction ghostingMessageEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): GhostingMessageEventData {\n return {\n type: \"GhostingMessageEvent\",\n sequence: bs.readU32(),\n message: bs.readInt(3),\n ghostCount: bs.readInt(11),\n };\n}\n\n// ============================================================\n// GhostAlwaysObjectEvent — scope-always ghost objects\n// ============================================================\n\nfunction ghostAlwaysObjectEventUnpack(\n bs: BitStream,\n conn: ConnectionContext\n): GhostAlwaysObjectEventData {\n const ghostIndex = bs.readInt(10);\n const hasObjectData = bs.readFlag();\n const result: GhostAlwaysObjectEventData = {\n type: \"GhostAlwaysObjectEvent\",\n ghostIndex,\n _hasObjectData: hasObjectData,\n };\n\n if (hasObjectData) {\n const classId = bs.readInt(7); // NetObjectClassBitSize=7\n result.classId = classId;\n\n // Binary FUN_005854e0: classId + full object unpackUpdate payload.\n // We must consume the embedded payload here to keep packet bit alignment.\n const parser = conn.getGhostParser?.(classId);\n if (!parser) {\n throw new Error(`No ghost parser for GhostAlwaysObjectEvent classId=${classId}`);\n }\n result.objectData = parser.unpackUpdate(bs, true, conn);\n }\n return result;\n}\n\n// ============================================================\n// PathManagerEvent — server path/patrol route updates\n// ============================================================\n\nfunction pathManagerEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): PathManagerEventData {\n if (bs.readFlag()) {\n // NewPaths\n const numPaths = bs.readU32();\n const paths: PathData[] = [];\n for (let i = 0; i < numPaths && i < 256; i++) {\n const totalTime = bs.readU32();\n const numPoints = bs.readU32();\n const points: PathPoint[] = [];\n for (let j = 0; j < numPoints && j < 1024; j++) {\n points.push({\n position: bs.readPoint3F(),\n msToNext: bs.readU32(),\n });\n }\n paths.push({ totalTime, points });\n }\n return { type: \"PathManagerEvent\", messageType: \"NewPaths\", paths };\n } else {\n // ModifyPath\n const modifiedPath = bs.readU32();\n const totalTime = bs.readU32();\n const numPoints = bs.readU32();\n const points: PathPoint[] = [];\n for (let j = 0; j < numPoints && j < 1024; j++) {\n points.push({\n position: bs.readPoint3F(),\n msToNext: bs.readU32(),\n });\n }\n return {\n type: \"PathManagerEvent\",\n messageType: \"ModifyPath\",\n modifiedPath,\n path: { totalTime, points },\n };\n }\n}\n\n// ============================================================\n// LightningStrikeEvent — lightning visual effects\n// ============================================================\n\nfunction lightningStrikeEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): LightningStrikeEventData {\n // Binary FUN_00626e40: flag → early return if false → readInt(11) + readFloat(10) + readFloat(10) + flag → readInt(11)\n const result: LightningStrikeEventData = { type: \"LightningStrikeEvent\" };\n if (!bs.readFlag()) {\n return result;\n }\n result.sourceGhost = bs.readInt(11); // resolveGhost: getNextPow2(0x401)=2048 → 11 bits\n result.startX = bs.readFloat(10);\n result.startY = bs.readFloat(10);\n if (bs.readFlag()) {\n result.targetGhost = bs.readInt(11);\n }\n return result;\n}\n\n// ============================================================\n// FileChunkEvent — file transfer data chunks\n// ============================================================\n\nfunction fileChunkEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): FileChunkEventData {\n const chunkLen = bs.readRangedU32(0, 63);\n const chunkData = bs.readBitsBuffer(chunkLen * 8);\n return { type: \"FileChunkEvent\", chunkLen, chunkData };\n}\n\n// ============================================================\n// DownloadMessageEvent — file download control\n// ============================================================\n\nfunction downloadMessageEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): DownloadMessageEventData {\n return {\n type: \"DownloadMessageEvent\",\n value: bs.readU32(),\n message: bs.readInt(3),\n };\n}\n\n// ============================================================\n// FileDownloadRequestEvent — request file transfers\n// ============================================================\n\nfunction fileDownloadRequestEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): FileDownloadRequestEventData {\n const nameCount = bs.readRangedU32(0, 31);\n const fileNames: string[] = [];\n for (let i = 0; i < nameCount; i++) {\n fileNames.push(bs.readString());\n }\n return { type: \"FileDownloadRequestEvent\", fileNames };\n}\n\n// ============================================================\n// SimpleMessageEvent — test/debug messages\n// ============================================================\n\nfunction simpleMessageEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): SimpleMessageEventData {\n return { type: \"SimpleMessageEvent\", message: bs.readString() };\n}\n\n// ============================================================\n// CRCChallengeEvent — CRC validation challenge from server\n// Binary: FUN_006a2c30 reads 3×U32 + readFlag\n// ============================================================\n\nfunction crcChallengeEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): CRCChallengeEventData {\n return {\n type: \"CRCChallengeEvent\",\n crcValue: bs.readU32(),\n field1: bs.readU32(),\n field2: bs.readU32(),\n flag: bs.readFlag(),\n };\n}\n\n// ============================================================\n// CRCChallengeResponseEvent — CRC validation response\n// Binary: FUN_006a2e00 reads 3×U32\n// ============================================================\n\nfunction crcChallengeResponseEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): CRCChallengeResponseEventData {\n return {\n type: \"CRCChallengeResponseEvent\",\n crcValue: bs.readU32(),\n field1: bs.readU32(),\n field2: bs.readU32(),\n };\n}\n\n// ============================================================\n// GravityEvent — gravity value synchronization\n// Binary: FUN_005ff5b0 reads 4 bytes (F32 gravity value)\n// ============================================================\n\nfunction gravityEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): GravityEventData {\n return {\n type: \"GravityEvent\",\n gravity: bs.readF32(),\n };\n}\n\n// ============================================================\n// FogChallengeEvent — fog validation (stub: not found in binary)\n// ============================================================\n\nfunction fogChallengeEventUnpack(\n _bs: BitStream,\n _conn: ConnectionContext\n): FogChallengeEventData {\n return { type: \"FogChallengeEvent\" };\n}\n\n// ============================================================\n// Register all event parsers\n// ============================================================\n\nexport function registerEventParsers(registry: ClassRegistry): void {\n registry.catalogEvent({\n name: \"SimDataBlockEvent\",\n unpack: simDataBlockEventUnpack,\n });\n registry.catalogEvent({\n name: \"NetStringEvent\",\n unpack: netStringEventUnpack,\n });\n registry.catalogEvent({\n name: \"Sim2DAudioEvent\",\n unpack: sim2DAudioEventUnpack,\n });\n registry.catalogEvent({\n name: \"Sim3DAudioEvent\",\n unpack: sim3DAudioEventUnpack,\n });\n registry.catalogEvent({\n name: \"SetSensorGroupEvent\",\n unpack: setSensorGroupEventUnpack,\n });\n registry.catalogEvent({\n name: \"SetServerTargetEvent\",\n unpack: setServerTargetEventUnpack,\n });\n registry.catalogEvent({\n name: \"TargetToEvent\",\n unpack: targetToEventUnpack,\n });\n registry.catalogEvent({\n name: \"SetObjectActiveImageEvent\",\n unpack: setObjectActiveImageEventUnpack,\n });\n registry.catalogEvent({\n name: \"SetMissionCRCEvent\",\n unpack: setMissionCRCEventUnpack,\n });\n registry.catalogEvent({\n name: \"RemoteCommandEvent\",\n unpack: remoteCommandEventUnpack,\n });\n registry.catalogEvent({\n name: \"TargetInfoEvent\",\n unpack: targetInfoEventUnpack,\n });\n registry.catalogEvent({\n name: \"TargetFreeEvent\",\n unpack: targetFreeEventUnpack,\n });\n registry.catalogEvent({\n name: \"SimTargetAudioEvent\",\n unpack: simTargetAudioEventUnpack,\n });\n registry.catalogEvent({\n name: \"SensorGroupColorEvent\",\n unpack: sensorGroupColorEventUnpack,\n });\n registry.catalogEvent({\n name: \"ResetClientTargetsEvent\",\n unpack: resetClientTargetsEventUnpack,\n });\n registry.catalogEvent({\n name: \"RemoveClientTargetTypeEvent\",\n unpack: removeClientTargetTypeEventUnpack,\n });\n registry.catalogEvent({\n name: \"SimVoiceStreamEvent\",\n unpack: simVoiceStreamEventUnpack,\n });\n registry.catalogEvent({\n name: \"GhostingMessageEvent\",\n unpack: ghostingMessageEventUnpack,\n });\n registry.catalogEvent({\n name: \"GhostAlwaysObjectEvent\",\n unpack: ghostAlwaysObjectEventUnpack,\n });\n registry.catalogEvent({\n name: \"PathManagerEvent\",\n unpack: pathManagerEventUnpack,\n });\n registry.catalogEvent({\n name: \"LightningStrikeEvent\",\n unpack: lightningStrikeEventUnpack,\n });\n registry.catalogEvent({\n name: \"FileChunkEvent\",\n unpack: fileChunkEventUnpack,\n });\n registry.catalogEvent({\n name: \"DownloadMessageEvent\",\n unpack: downloadMessageEventUnpack,\n });\n registry.catalogEvent({\n name: \"FileDownloadRequestEvent\",\n unpack: fileDownloadRequestEventUnpack,\n });\n registry.catalogEvent({\n name: \"SimpleMessageEvent\",\n unpack: simpleMessageEventUnpack,\n });\n registry.catalogEvent({\n name: \"CRCChallengeEvent\",\n unpack: crcChallengeEventUnpack,\n });\n registry.catalogEvent({\n name: \"CRCChallengeResponseEvent\",\n unpack: crcChallengeResponseEventUnpack,\n });\n registry.catalogEvent({\n name: \"GravityEvent\",\n unpack: gravityEventUnpack,\n });\n registry.catalogEvent({\n name: \"FogChallengeEvent\",\n unpack: fogChallengeEventUnpack,\n });\n}\n"]}
1
+ {"version":3,"file":"EventParsers.js","sourceRoot":"","sources":["../src/EventParsers.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BitStream } from \"./BitStream.js\";\nimport type { ClassRegistry, ConnectionContext } from \"./ClassRegistry.js\";\nimport type {\n SimDataBlockEventData,\n NetStringEventData,\n Sim2DAudioEventData,\n Sim3DAudioEventData,\n SetSensorGroupEventData,\n SetServerTargetEventData,\n TargetToEventData,\n SetObjectActiveImageEventData,\n SetMissionCRCEventData,\n RemoteCommandEventData,\n TargetInfoEventData,\n TargetFreeEventData,\n SimTargetAudioEventData,\n SensorGroupColorEventData,\n SensorGroupColorEntry,\n ResetClientTargetsEventData,\n RemoveClientTargetTypeEventData,\n SimVoiceStreamEventData,\n GhostingMessageEventData,\n GhostAlwaysObjectEventData,\n PathManagerEventData,\n PathData,\n PathPoint,\n LightningStrikeEventData,\n FileChunkEventData,\n DownloadMessageEventData,\n FileDownloadRequestEventData,\n SimpleMessageEventData,\n CRCChallengeEventData,\n CRCChallengeResponseEventData,\n GravityEventData,\n FogChallengeEventData,\n} from \"./eventDataTypes.js\";\nimport {\n DataBlockClassFirst,\n SimDBEventObjectIdBits,\n SimDBEventClassIdBits,\n SimDBEventIndexBits,\n SimDBEventTotalBits,\n} from \"./types.js\";\n\n// ============================================================\n// SimDataBlockEvent — DataBlock definition sent during gameplay\n// ============================================================\n\nfunction simDataBlockEventUnpack(\n bs: BitStream,\n conn: ConnectionContext\n): SimDataBlockEventData {\n // Decompiled source of truth:\n // FUN_005ffc90 reads:\n // mProcess flag + readClassId() + readInt(7) + readInt(11) + readInt(12)\n // This matches the on-wire format written by FUN_005ffbc0.\n const mProcess = bs.readFlag();\n if (!mProcess) {\n return {\n type: \"SimDataBlockEvent\",\n mProcess: false,\n };\n }\n\n const id = bs.readInt(SimDBEventObjectIdBits);\n const classId = bs.readInt(SimDBEventClassIdBits) + DataBlockClassFirst;\n const index = bs.readInt(SimDBEventIndexBits);\n const total = bs.readInt(SimDBEventTotalBits);\n\n // The payload must be consumed to keep the packet aligned; with no\n // parser (only possible for a corrupt classId — all 54 DataBlock\n // classes are bound) the engine would fail the packet too, so throw\n // and let readEvents mark the event failed. Parser errors propagate\n // for the same reason.\n // String buffer is already enabled by parsePacket() for the entire packet —\n // do NOT toggle it here, as that would reset accumulated prefix context and\n // then disable string buffer for the rest of the packet's events and ghosts.\n const parser = conn.getDataBlockParser?.(classId);\n if (!parser) {\n throw new Error(\n `No DataBlock parser for SimDataBlockEvent classId=${classId}`,\n );\n }\n return {\n type: \"SimDataBlockEvent\",\n mProcess: true,\n objectId: id,\n classId,\n index,\n total,\n dataBlockData: parser.unpackData(bs),\n dataBlockClassName: parser.name,\n };\n}\n\n// ============================================================\n// NetStringEvent — string table update\n// ============================================================\n\nfunction netStringEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): NetStringEventData {\n // Tribes2.exe source of truth (FUN_00589b60):\n // - id: readInt(10)\n // - hasValue: readFlag()\n // - if hasValue: readString() via BitStream::readString(..., 0xff)\n const id = bs.readInt(10);\n const hasValue = bs.readFlag();\n const value = hasValue ? bs.readString() : undefined;\n return { type: \"NetStringEvent\", id, hasValue, value };\n}\n\n// ============================================================\n// Sim2DAudioEvent — 2D audio playback\n// ============================================================\n\nfunction sim2DAudioEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): Sim2DAudioEventData {\n // Binary FUN_005fff40: FUN_00436d10(bs) = readInt(11) for DataBlock object ref.\n // No +3 offset — object IDs here use the same numbering as ghost dataBlockId\n // references and SimDataBlockEvent.objectId (all keyed by raw readInt(11)).\n const id = bs.readInt(11);\n return { type: \"Sim2DAudioEvent\", profileId: id };\n}\n\n// ============================================================\n// Sim3DAudioEvent — 3D positional audio\n// ============================================================\n\nfunction sim3DAudioEventUnpack(\n bs: BitStream,\n conn: ConnectionContext\n): Sim3DAudioEventData {\n // Binary FUN_006000f0: FUN_00436d10(bs) = readInt(11) for DataBlock object ref.\n // No +3 offset — same numbering as ghost dataBlockId and SimDataBlockEvent.\n const id = bs.readInt(11);\n let rotation: Sim3DAudioEventData[\"rotation\"];\n if (bs.readFlag()) {\n // Has cone params — read quaternion\n const qx = bs.readFloat(8);\n const qy = bs.readFloat(8);\n const qz = bs.readFloat(8);\n let qw = Math.sqrt(Math.max(0, 1.0 - (qx * qx + qy * qy + qz * qz)));\n if (bs.readFlag()) qw = -qw;\n rotation = { x: qx, y: qy, z: qz, w: qw };\n }\n // Read compressed position\n const position = bs.readCompressedPoint(conn.compressionPoint, 0.5);\n return { type: \"Sim3DAudioEvent\", profileId: id, rotation, position };\n}\n\n// ============================================================\n// SetSensorGroupEvent\n// ============================================================\n\nfunction setSensorGroupEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): SetSensorGroupEventData {\n return { type: \"SetSensorGroupEvent\", sensorGroup: bs.readInt(5) };\n}\n\n// ============================================================\n// SetServerTargetEvent\n// ============================================================\n\nfunction setServerTargetEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): SetServerTargetEventData {\n const targetId = bs.readFlag() ? bs.readInt(9) : undefined; // TargetIdBitSize=9\n const targetPos = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n const result: SetServerTargetEventData = {\n type: \"SetServerTargetEvent\",\n targetPos,\n };\n if (targetId !== undefined) result.targetId = targetId;\n return result;\n}\n\n// ============================================================\n// TargetToEvent — waypoint/command targeting\n// ============================================================\n\nfunction targetToEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): TargetToEventData {\n const targetId = bs.readFlag() ? bs.readInt(9) : undefined;\n const targetPos = bs.readFlag()\n ? { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() }\n : undefined;\n const result: TargetToEventData = {\n type: \"TargetToEvent\",\n assign: false, // placeholder, overwritten below\n };\n if (targetId !== undefined) result.targetId = targetId;\n if (targetPos) result.targetPos = targetPos;\n result.assign = bs.readFlag();\n return result;\n}\n\n// ============================================================\n// SetObjectActiveImageEvent\n// ============================================================\n\nfunction setObjectActiveImageEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): SetObjectActiveImageEventData {\n const objectId = bs.readRangedU32(0, 1023); // MaxGhostCount-1\n const imageSlot = bs.readRangedU32(0, 8); // MaxMountedImages\n return { type: \"SetObjectActiveImageEvent\", objectId, imageSlot };\n}\n\n// ============================================================\n// SetMissionCRCEvent\n// ============================================================\n\nfunction setMissionCRCEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): SetMissionCRCEventData {\n return { type: \"SetMissionCRCEvent\", crc: bs.readU32() };\n}\n\n// ============================================================\n// RemoteCommandEvent — script console command\n// ============================================================\n\nfunction remoteCommandEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): RemoteCommandEventData {\n // Decompiled Tribes 2 binary source of truth:\n // pack: FUN_005bfd40 writes argc(5 bits), then argc×FUN_00588530\n // unpack: FUN_005bfda0 reads argc(5 bits), then argc×FUN_00588690\n const argc = bs.readInt(5);\n const argv: string[] = [];\n for (let i = 0; i < argc; i++) {\n argv.push(bs.unpackNetString());\n }\n return {\n type: \"RemoteCommandEvent\",\n argc,\n argv,\n funcName: argv[0] ?? \"\",\n args: argv.slice(1),\n };\n}\n\n// ============================================================\n// TargetInfoEvent — target metadata synchronization\n// ============================================================\n\nfunction targetInfoEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): TargetInfoEventData {\n // Decompiled Tribes2.exe source of truth (FUN_006735b0):\n // - targetId: readInt(9)\n // - tag fields: outer presence flag; inner non-empty flag; if non-empty readInt(10), else sentinel 0x400\n // - sensorGroup: optional readInt(5)\n // - dataBlock: outer presence flag; inner valid flag; if valid readInt(11), else sentinel -2\n // - renderFlags: optional readInt(9)\n // - voicePitch: optional readFloat(7) * 1.5 + 0.5\n const result: TargetInfoEventData = {\n type: \"TargetInfoEvent\",\n targetId: bs.readInt(9), // TargetIdBitSize=9\n };\n\n if (bs.readFlag()) {\n result.nameTag = bs.readFlag() ? bs.readInt(10) : 0x400;\n }\n if (bs.readFlag()) {\n result.skinTag = bs.readFlag() ? bs.readInt(10) : 0x400;\n }\n if (bs.readFlag()) {\n result.skinPrefTag = bs.readFlag() ? bs.readInt(10) : 0x400;\n }\n if (bs.readFlag()) {\n result.voiceTag = bs.readFlag() ? bs.readInt(10) : 0x400;\n }\n if (bs.readFlag()) {\n result.typeTag = bs.readFlag() ? bs.readInt(10) : 0x400;\n }\n if (bs.readFlag()) {\n result.sensorGroup = bs.readInt(5);\n }\n if (bs.readFlag()) {\n result.dataBlockId = bs.readFlag() ? bs.readInt(11) : -2;\n }\n if (bs.readFlag()) {\n result.renderFlags = bs.readInt(9); // NumRenderBits=9\n }\n if (bs.readFlag()) {\n const raw = bs.readFloat(7);\n result.voicePitch = raw * 1.5 + 0.5;\n }\n\n return result;\n}\n\n// ============================================================\n// TargetFreeEvent — target cleanup notification\n// ============================================================\n\nfunction targetFreeEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): TargetFreeEventData {\n return { type: \"TargetFreeEvent\", targetId: bs.readInt(9) };\n}\n\n// ============================================================\n// SimTargetAudioEvent — target-specific audio\n// ============================================================\n\nfunction simTargetAudioEventUnpack(\n bs: BitStream,\n conn: ConnectionContext\n): SimTargetAudioEventData {\n const result: SimTargetAudioEventData = {\n type: \"SimTargetAudioEvent\",\n targetId: bs.readInt(9),\n fileTag: bs.readInt(12),\n descriptionId: bs.readRangedU32(3, 1026),\n updateSound: false,\n };\n if (bs.readFlag()) {\n result.position = bs.readCompressedPoint(conn.compressionPoint, 0.5);\n }\n result.updateSound = bs.readFlag();\n return result;\n}\n\n// ============================================================\n// SensorGroupColorEvent — sensor group HUD colors\n// ============================================================\n\nfunction sensorGroupColorEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): SensorGroupColorEventData {\n const sensorGroup = bs.readInt(5);\n const updateMask = bs.readU32();\n const colors: SensorGroupColorEntry[] = [];\n for (let i = 0; i < 32; i++) {\n if ((1 << i) & updateMask) {\n if (bs.readFlag()) {\n colors.push({\n index: i,\n r: bs.readU8(),\n g: bs.readU8(),\n b: bs.readU8(),\n a: bs.readU8(),\n });\n } else {\n colors.push({ index: i, default: true });\n }\n }\n }\n return { type: \"SensorGroupColorEvent\", sensorGroup, updateMask, colors };\n}\n\n// ============================================================\n// ResetClientTargetsEvent — clear all client targets\n// ============================================================\n\nfunction resetClientTargetsEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): ResetClientTargetsEventData {\n return {\n type: \"ResetClientTargetsEvent\",\n clientTargetsOnly: bs.readFlag(),\n };\n}\n\n// ============================================================\n// RemoveClientTargetTypeEvent — remove targets by type\n// ============================================================\n\nfunction removeClientTargetTypeEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): RemoveClientTargetTypeEventData {\n return {\n type: \"RemoveClientTargetTypeEvent\",\n targetType: bs.readRangedU32(0, 3), // NumTypes=3\n };\n}\n\n// ============================================================\n// SimVoiceStreamEvent — voice chat audio streaming\n// ============================================================\n\n/**\n * Voice codec table from the binary (0x0074d6e4, 36-byte entries indexed\n * by the 2-bit codec id). Only the fields the unpacker reads are kept:\n * bytes per frame (+0), frames in a full packet (+4), and whether frames\n * are nibble-packed with a per-frame 4-bit length (+0xc).\n */\nconst VoiceCodecs: readonly {\n frameBytes: number;\n fullPacketFrames: number;\n nibblePacked: boolean;\n}[] = [\n { frameBytes: 6, fullPacketFrames: 6, nibblePacked: true },\n { frameBytes: 7, fullPacketFrames: 5, nibblePacked: false },\n { frameBytes: 9, fullPacketFrames: 4, nibblePacked: false },\n { frameBytes: 33, fullPacketFrames: 1, nibblePacked: false },\n];\n\nfunction simVoiceStreamEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): SimVoiceStreamEventData {\n // Build 25034 (FUN_0040d720, protocol >= 0x23 path — every demo and\n // server this parser supports). This differs from the V12 source:\n // readInt(7) sequence, readInt(2) codecId, readInt(2) streamId,\n // U32 clientId (client side), then codec-dependent payload.\n const sequence = bs.readInt(7);\n const codecId = bs.readInt(2);\n const streamId = bs.readInt(2);\n const clientId = bs.readU32();\n const codec = VoiceCodecs[codecId];\n const result: SimVoiceStreamEventData = {\n type: \"SimVoiceStreamEvent\",\n streamId,\n sequence,\n codecId,\n clientId,\n partial: false,\n frameCount: 0,\n };\n if (codec.nibblePacked) {\n // Flag (stored, unused by the reader), 5-bit frame count, then per\n // frame a 4-bit nibble count and that many nibbles.\n result.partial = bs.readFlag();\n result.frameCount = bs.readInt(5);\n const frames: Uint8Array[] = [];\n for (let i = 0; i < result.frameCount; i++) {\n const nibbles = bs.readInt(4);\n frames.push(bs.readBitsBuffer(nibbles * 4));\n }\n result.frames = frames;\n } else {\n // Flag selects an explicit 5-bit frame count (end-of-stream packets)\n // over the codec's full-packet count; then frameCount × frameBytes.\n result.partial = bs.readFlag();\n result.frameCount = result.partial\n ? bs.readInt(5)\n : codec.fullPacketFrames;\n result.audioData = bs.readBitsBuffer(\n result.frameCount * codec.frameBytes * 8,\n );\n }\n return result;\n}\n\n// ============================================================\n// GhostingMessageEvent — ghost synchronization control\n// ============================================================\n\nfunction ghostingMessageEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): GhostingMessageEventData {\n return {\n type: \"GhostingMessageEvent\",\n sequence: bs.readU32(),\n message: bs.readInt(3),\n ghostCount: bs.readInt(11),\n };\n}\n\n// ============================================================\n// GhostAlwaysObjectEvent — scope-always ghost objects\n// ============================================================\n\nfunction ghostAlwaysObjectEventUnpack(\n bs: BitStream,\n conn: ConnectionContext\n): GhostAlwaysObjectEventData {\n const ghostIndex = bs.readInt(10);\n const hasObjectData = bs.readFlag();\n const result: GhostAlwaysObjectEventData = {\n type: \"GhostAlwaysObjectEvent\",\n ghostIndex,\n hasObjectData,\n };\n\n if (hasObjectData) {\n const classId = bs.readInt(7); // NetObjectClassBitSize=7\n result.classId = classId;\n\n // Binary FUN_005854e0: classId + full object unpackUpdate payload.\n // We must consume the embedded payload here to keep packet bit alignment.\n const parser = conn.getGhostParser?.(classId);\n if (!parser) {\n throw new Error(`No ghost parser for GhostAlwaysObjectEvent classId=${classId}`);\n }\n result.objectData = parser.unpackUpdate(bs, true, conn);\n }\n return result;\n}\n\n// ============================================================\n// PathManagerEvent — server path/patrol route updates\n// ============================================================\n\n/**\n * Read a U32 count and reject it unless `minBitsPerEntry × count` bits\n * remain: exhausted reads return 0 without throwing, so a corrupt count\n * would otherwise spin allocating until memory ran out.\n */\nfunction readCheckedCount(\n bs: BitStream,\n minBitsPerEntry: number,\n what: string,\n): number {\n const count = bs.readU32();\n if (count > bs.getRemainingBits() / minBitsPerEntry) {\n throw new Error(`Invalid ${what}: ${count}`);\n }\n return count;\n}\n\nfunction readPathPoints(bs: BitStream): PathPoint[] {\n const numPoints = readCheckedCount(bs, 128, \"PathManagerEvent numPoints\");\n const points: PathPoint[] = [];\n for (let j = 0; j < numPoints; j++) {\n points.push({\n position: bs.readPoint3F(),\n msToNext: bs.readU32(),\n });\n }\n return points;\n}\n\nfunction pathManagerEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): PathManagerEventData {\n // pathManager.cc: counts are raw U32s with no cap; a path entry is at\n // least 64 bits (totalTime + numPoints) and a point exactly 128, so a\n // count that cannot fit in the remaining stream is corrupt.\n if (bs.readFlag()) {\n // NewPaths\n const numPaths = readCheckedCount(bs, 64, \"PathManagerEvent numPaths\");\n const paths: PathData[] = [];\n for (let i = 0; i < numPaths; i++) {\n const totalTime = bs.readU32();\n paths.push({ totalTime, points: readPathPoints(bs) });\n }\n return { type: \"PathManagerEvent\", messageType: \"NewPaths\", paths };\n } else {\n // ModifyPath\n const modifiedPath = bs.readU32();\n const totalTime = bs.readU32();\n const points = readPathPoints(bs);\n return {\n type: \"PathManagerEvent\",\n messageType: \"ModifyPath\",\n modifiedPath,\n path: { totalTime, points },\n };\n }\n}\n\n// ============================================================\n// LightningStrikeEvent — lightning visual effects\n// ============================================================\n\nfunction lightningStrikeEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): LightningStrikeEventData {\n // Binary FUN_00626e40: flag → early return if false → readInt(11) + readFloat(10) + readFloat(10) + flag → readInt(11)\n const result: LightningStrikeEventData = { type: \"LightningStrikeEvent\" };\n if (!bs.readFlag()) {\n return result;\n }\n result.sourceGhost = bs.readInt(11); // resolveGhost: getNextPow2(0x401)=2048 → 11 bits\n result.startX = bs.readFloat(10);\n result.startY = bs.readFloat(10);\n if (bs.readFlag()) {\n result.targetGhost = bs.readInt(11);\n }\n return result;\n}\n\n// ============================================================\n// FileChunkEvent — file transfer data chunks\n// ============================================================\n\nfunction fileChunkEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): FileChunkEventData {\n const chunkLen = bs.readRangedU32(0, 63);\n const chunkData = bs.readBitsBuffer(chunkLen * 8);\n return { type: \"FileChunkEvent\", chunkLen, chunkData };\n}\n\n// ============================================================\n// DownloadMessageEvent — file download control\n// ============================================================\n\nfunction downloadMessageEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): DownloadMessageEventData {\n return {\n type: \"DownloadMessageEvent\",\n value: bs.readU32(),\n message: bs.readInt(3),\n };\n}\n\n// ============================================================\n// FileDownloadRequestEvent — request file transfers\n// ============================================================\n\nfunction fileDownloadRequestEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): FileDownloadRequestEventData {\n const nameCount = bs.readRangedU32(0, 31);\n const fileNames: string[] = [];\n for (let i = 0; i < nameCount; i++) {\n fileNames.push(bs.readString());\n }\n return { type: \"FileDownloadRequestEvent\", fileNames };\n}\n\n// ============================================================\n// SimpleMessageEvent — test/debug messages\n// ============================================================\n\nfunction simpleMessageEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): SimpleMessageEventData {\n return { type: \"SimpleMessageEvent\", message: bs.readString() };\n}\n\n// ============================================================\n// CRCChallengeEvent — CRC validation challenge from server\n// Binary: FUN_006a2c30 reads 3×U32 + readFlag\n// ============================================================\n\nfunction crcChallengeEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): CRCChallengeEventData {\n return {\n type: \"CRCChallengeEvent\",\n crcValue: bs.readU32(),\n field1: bs.readU32(),\n field2: bs.readU32(),\n flag: bs.readFlag(),\n };\n}\n\n// ============================================================\n// CRCChallengeResponseEvent — CRC validation response\n// Binary: FUN_006a2e00 reads 3×U32\n// ============================================================\n\nfunction crcChallengeResponseEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): CRCChallengeResponseEventData {\n return {\n type: \"CRCChallengeResponseEvent\",\n crcValue: bs.readU32(),\n field1: bs.readU32(),\n field2: bs.readU32(),\n };\n}\n\n// ============================================================\n// GravityEvent — gravity value synchronization\n// Binary: FUN_005ff5b0 reads 4 bytes (F32 gravity value)\n// ============================================================\n\nfunction gravityEventUnpack(\n bs: BitStream,\n _conn: ConnectionContext\n): GravityEventData {\n return {\n type: \"GravityEvent\",\n gravity: bs.readF32(),\n };\n}\n\n// ============================================================\n// FogChallengeEvent — fog validation (stub: not found in binary)\n// ============================================================\n\nfunction fogChallengeEventUnpack(\n _bs: BitStream,\n _conn: ConnectionContext\n): FogChallengeEventData {\n return { type: \"FogChallengeEvent\" };\n}\n\n// ============================================================\n// Register all event parsers\n// ============================================================\n\nexport function registerEventParsers(registry: ClassRegistry): void {\n registry.catalogEvent({\n name: \"SimDataBlockEvent\",\n unpack: simDataBlockEventUnpack,\n });\n registry.catalogEvent({\n name: \"NetStringEvent\",\n unpack: netStringEventUnpack,\n });\n registry.catalogEvent({\n name: \"Sim2DAudioEvent\",\n unpack: sim2DAudioEventUnpack,\n });\n registry.catalogEvent({\n name: \"Sim3DAudioEvent\",\n unpack: sim3DAudioEventUnpack,\n });\n registry.catalogEvent({\n name: \"SetSensorGroupEvent\",\n unpack: setSensorGroupEventUnpack,\n });\n registry.catalogEvent({\n name: \"SetServerTargetEvent\",\n unpack: setServerTargetEventUnpack,\n });\n registry.catalogEvent({\n name: \"TargetToEvent\",\n unpack: targetToEventUnpack,\n });\n registry.catalogEvent({\n name: \"SetObjectActiveImageEvent\",\n unpack: setObjectActiveImageEventUnpack,\n });\n registry.catalogEvent({\n name: \"SetMissionCRCEvent\",\n unpack: setMissionCRCEventUnpack,\n });\n registry.catalogEvent({\n name: \"RemoteCommandEvent\",\n unpack: remoteCommandEventUnpack,\n });\n registry.catalogEvent({\n name: \"TargetInfoEvent\",\n unpack: targetInfoEventUnpack,\n });\n registry.catalogEvent({\n name: \"TargetFreeEvent\",\n unpack: targetFreeEventUnpack,\n });\n registry.catalogEvent({\n name: \"SimTargetAudioEvent\",\n unpack: simTargetAudioEventUnpack,\n });\n registry.catalogEvent({\n name: \"SensorGroupColorEvent\",\n unpack: sensorGroupColorEventUnpack,\n });\n registry.catalogEvent({\n name: \"ResetClientTargetsEvent\",\n unpack: resetClientTargetsEventUnpack,\n });\n registry.catalogEvent({\n name: \"RemoveClientTargetTypeEvent\",\n unpack: removeClientTargetTypeEventUnpack,\n });\n registry.catalogEvent({\n name: \"SimVoiceStreamEvent\",\n unpack: simVoiceStreamEventUnpack,\n });\n registry.catalogEvent({\n name: \"GhostingMessageEvent\",\n unpack: ghostingMessageEventUnpack,\n });\n registry.catalogEvent({\n name: \"GhostAlwaysObjectEvent\",\n unpack: ghostAlwaysObjectEventUnpack,\n });\n registry.catalogEvent({\n name: \"PathManagerEvent\",\n unpack: pathManagerEventUnpack,\n });\n registry.catalogEvent({\n name: \"LightningStrikeEvent\",\n unpack: lightningStrikeEventUnpack,\n });\n registry.catalogEvent({\n name: \"FileChunkEvent\",\n unpack: fileChunkEventUnpack,\n });\n registry.catalogEvent({\n name: \"DownloadMessageEvent\",\n unpack: downloadMessageEventUnpack,\n });\n registry.catalogEvent({\n name: \"FileDownloadRequestEvent\",\n unpack: fileDownloadRequestEventUnpack,\n });\n registry.catalogEvent({\n name: \"SimpleMessageEvent\",\n unpack: simpleMessageEventUnpack,\n });\n registry.catalogEvent({\n name: \"CRCChallengeEvent\",\n unpack: crcChallengeEventUnpack,\n });\n registry.catalogEvent({\n name: \"CRCChallengeResponseEvent\",\n unpack: crcChallengeResponseEventUnpack,\n });\n registry.catalogEvent({\n name: \"GravityEvent\",\n unpack: gravityEventUnpack,\n });\n registry.catalogEvent({\n name: \"FogChallengeEvent\",\n unpack: fogChallengeEventUnpack,\n });\n}\n"]}
@@ -3,9 +3,15 @@ export declare class GhostTracker implements GhostTrackerInterface {
3
3
  private ghosts;
4
4
  getGhost(index: number): GhostEntry | undefined;
5
5
  hasGhost(index: number): boolean;
6
+ /**
7
+ * Record a ghost at `index`. Re-creating an occupied index is normal
8
+ * (the server recycles slots after a delete we may not have seen), but
9
+ * a class change is logged since it is the earliest sign of a tracker
10
+ * that has drifted from the server.
11
+ */
6
12
  createGhost(index: number, classId: number, className: string): GhostEntry;
7
13
  deleteGhost(index: number): void;
8
- getAllGhosts(): Map<number, GhostEntry>;
14
+ getAllGhosts(): ReadonlyMap<number, GhostEntry>;
9
15
  size(): number;
10
16
  clear(): void;
11
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GhostManager.d.ts","sourceRoot":"","sources":["../src/GhostManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EAEb,UAAU,EACV,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAiE5B,qBAAa,YAAa,YAAW,qBAAqB;IACxD,OAAO,CAAC,MAAM,CAAiC;IAE/C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI/C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIhC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU;IAM1E,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIhC,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAIvC,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,IAAI;CAGd;AA4uED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAwRlE"}
1
+ {"version":3,"file":"GhostManager.d.ts","sourceRoot":"","sources":["../src/GhostManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EAEb,UAAU,EACV,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAqE5B,qBAAa,YAAa,YAAW,qBAAqB;IACxD,OAAO,CAAC,MAAM,CAAiC;IAE/C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI/C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIhC;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU;IAiB1E,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIhC,YAAY,IAAI,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC;IAI/C,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,IAAI;CAGd;AAmxED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CA2RlE"}