Commit Graph

661 Commits

Author SHA1 Message Date
Aaron Kimbrell
12efcd259c refactor(component): the switch reads its reset time and factions in LoadConfigData
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 08:08:11 -05:00
Aaron Kimbrell
90c7293189 refactor(component): the mission offer loads its missions in LoadDataFromTemplate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 08:08:11 -05:00
Aaron Kimbrell
060517920f refactor(component): the donation vendor reads its goal and activity in LoadConfigData
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 08:08:11 -05:00
Aaron Kimbrell
818ad152ca refactor(component): vendors load their stock in LoadDataFromTemplate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 08:08:11 -05:00
Aaron Kimbrell
8ef3e323fe refactor(component): the property entrance loads its row in LoadDataFromTemplate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 08:06:12 -05:00
Aaron Kimbrell
87f0e730c8 refactor(component): the multi-zone entrance reads its worlds in LoadConfigData
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 08:06:12 -05:00
Aaron Kimbrell
2519748e2c refactor(component): the possessable loads its row in LoadDataFromTemplate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 08:06:12 -05:00
Aaron Kimbrell
7577971f43 refactor(component): the rocket launchpad loads its row in LoadDataFromTemplate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 08:06:12 -05:00
Aaron Kimbrell
47668e623a refactor(component): the rail activator loads its row and level config in the client's phases
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 08:06:12 -05:00
Aaron Kimbrell
7a0dba22a5 refactor(component): use is a RequestUse message handler
Components no longer have a virtual OnUse; each component that reacts to a
use registers a RequestUse handler, like the client's components. The entity
runs the INTERACT trigger and the script, then delivers a RequestUseEvent
(carrying the user) to the handlers. The mission choice of a multi-interact
use goes only to the mission offer, as before. Switches keep a direct
EnterIfResponding for touches and pets.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:55:55 -05:00
Aaron Kimbrell
50bfa623ca refactor(component): the client's component lifecycle
Components get the client's per-component functions: LoadDataFromTemplate,
PrepareConfigData, LoadConfigData, LoadFromSaveData, Startup, Run,
OnEnterScope, OnLeaveScope, Preshutdown and Shutdown, called by the entity in
the client's order. Update is renamed Run, LoadFromXml LoadFromSaveData and
UpdateXml WriteSaveData. Nothing sent changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:45:16 -05:00
Aaron Kimbrell
e8406cc829 feat(entity): the client's property plaque component (113)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:23:03 -05:00
Aaron Kimbrell
0cdf3afe3d feat(entity): the client's roller component (105)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:21:13 -05:00
Aaron Kimbrell
e585a035e0 feat(entity): the client's gate rush component (103)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:19:31 -05:00
Aaron Kimbrell
d1a778a140 feat(entity): the client's faction trigger component (72)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:17:47 -05:00
Aaron Kimbrell
a6381be720 feat(entity): the client's rocket landing component (68)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:15:54 -05:00
Aaron Kimbrell
8c5e7ee0e1 feat(entity): the client's generic activator component (64)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:14:12 -05:00
Aaron Kimbrell
a286bea854 feat(entity): the client's showcase model handler component (62)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:12:31 -05:00
Aaron Kimbrell
4dba9c2aeb feat(entity): the client's custom build assembly component (59)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:10:50 -05:00
Aaron Kimbrell
6628aa2d45 feat(entity): the client's package component (53)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:09:10 -05:00
Aaron Kimbrell
464dd759fa feat(entity): the client's choice build component (52)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:06:54 -05:00
Aaron Kimbrell
bd6e419290 feat(entity): the client's changeling component (51)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:05:18 -05:00
Aaron Kimbrell
912f5998ae feat(entity): the client's spring pad component (41)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:03:00 -05:00
Aaron Kimbrell
b4c25a2512 feat(entity): the client's model builder component (38)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 07:01:24 -05:00
Aaron Kimbrell
6d185b6e2f feat(entity): the client's arcade component (29)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:59:38 -05:00
Aaron Kimbrell
0e37994d6c feat(entity): the client's module (a car or rocket part) component (28)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:57:54 -05:00
Aaron Kimbrell
62c770aa56 feat(entity): the client's blueprint component (24)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:56:19 -05:00
Aaron Kimbrell
e2b2c4c48d feat(entity): the client's chest component (22)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:54:42 -05:00
Aaron Kimbrell
939e30e6a8 feat(entity): the client's rebuild activator component (14)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:53:03 -05:00
Aaron Kimbrell
d4cd459747 feat(entity): the client's build controller component (13)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:51:13 -05:00
Aaron Kimbrell
60aaa9ec3f feat(entity): the client's modular build (rocket and car building) component (12)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:49:28 -05:00
Aaron Kimbrell
b9ad46a52e feat(entity): the client's platform boundary component (27)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:46:20 -05:00
Aaron Kimbrell
a9c4a2fe26 feat(entity): the client's culling plane component (116)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:43:53 -05:00
Aaron Kimbrell
e37f919700 feat(entity): the client's 3D ambient sound component (56)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:41:32 -05:00
Aaron Kimbrell
ba748d17d2 feat(entity): the client's 2D ambient sound component (55)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:39:41 -05:00
Aaron Kimbrell
b971d91a25 feat(entity): the client's sound repeater component (54)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:38:00 -05:00
Aaron Kimbrell
ee86102e97 feat(entity): NPC minifigures have the client's minifig component
The client makes LWOMiniFigComponent (35) from the registry; DLU had nothing for it. It sends nothing (the client reads the MinifigComponent row itself), so constructions are unchanged; 488 LOTs gain it (LoaderSnapshotTest).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:35:45 -05:00
Aaron Kimbrell
cc337a298d fix(entity): models get their item component, as the client makes it
The client makes the registry's item component for models too (only a pet takes it away); DLU skipped it and the model component wrote the item block itself, for the 30 model LOTs without an item row as well, and with the object id as ug_id. Live (Raven Bluff property capture): the item block carries the userModelID for brick built models (LOT 14) and 0 for reward models (LOT 8069). 1,455 LOTs gain the item component; nothing else changes (LoaderSnapshotTest).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:27:36 -05:00
Aaron Kimbrell
b2192e158c refactor(entity): components are made in the client's load order
Entity::Initialize walks ComponentOrderVector::Initialize's list (0x0101f8e0) as ObjectLoader2::DoObjectComponentLoad does; ids a component needs from a later one come from the registry; the trigger is added after the walk. All 15,962 LOTs get the same components as before (LoaderSnapshotTest).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 06:17:06 -05:00
Aaron Kimbrell
6ff42bf312 fix(moving platform): a mover started at a waypoint waits there first (issue 964)
LWOPlatform::ResumeTravelling: not travelling at a waypoint it waits the waypoint's wait; the AG monument elevator rose at once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 04:55:03 -05:00
Aaron Kimbrell
4fcce48397 fix(proximity): a proximity set again replaces the old one; UnsetProximityRadius
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 03:29:42 -05:00
Aaron Kimbrell
e34ae60724 fix(moving platform): a rotater only spins (start/stop), it doesn't run a mover's waypoints
LWOPlatformRotator's HandleStoppedLogic (0x00bdc660) only keeps its angular velocity from rotX/rotY/rotZ and rate; its path never arrives. No live zone sets platformIsRotater.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 03:25:22 -05:00
Aaron Kimbrell
7729d14fa4 feat(ugc): queue_on_property_save: only queued models are made, a property's are queued when it is saved
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 03:16:56 -05:00
Aaron Kimbrell
c6f6aa5d2b fix(scripts): AG elevator, bus door and property platform drive their movers as their live scripts did
StopPathing, StartPathing and GoToWaypoint instead of hand-made resyncs; a built platform starts before the scripts hear of it so a script can stop it; the FV tree platform's resync hack is gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 23:36:00 -05:00
Aaron Kimbrell
83f321bec6 feat(moving platform): the server runs movers as live did and answers resyncs with their state
The client's LWOPlatform logic (ArrivedAtWaypoint 0x00c86c30, ProcessStateChange 0x00cce380, GetNextWaypoint, the waypoint speeds) runs on the server: stopped at a waypoint (25 at an end) for its wait, then travelling (2), serialized on arrival and departure as in the NT mover captures; constructions carry the path and the mover state; RequestPlatformResync gets the current state, percent and position. The LOT 9483 timers are gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 23:36:00 -05:00
Aaron Kimbrell
72efae54eb feat(moving platform): simple movers and rotaters, chosen as the client chooses
The subcomponent comes from the platformIsMover, platformIsSimpleMover and
platformIsRotater settings; with none set, a platform without a registry
component is a mover and one with a registry component a simple mover (also
when it has an attached path, so the registry ID is passed then too). All
flags set false means no subcomponent.

A simple mover reads its MovingPlatforms row and the platformMove* settings,
is always constructed with its starting point and state as live did, and
travels between its start and start + platformMove in platformMoveTime.
A rotater is written as type 6 with a mover's data.

On arrival platforms fire OnWaypointReached, then OnArrivedAtDesiredWaypoint
at the waypoint they were sent to and OnPlatformAtLastWaypoint at an end.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 09:59:55 -05:00
Aaron Kimbrell
c01828a3bb Merge exp/decoder-live-check: replica decoders checked on live captures, moving platform/pet/model wire fixes 2026-09-30 08:40:02 -05:00
Aaron Kimbrell
964e17cd18 fix(model): write behaviors only for property and inventory models
The client makes the mutable model component, which reads the behaviors and
editing info, only when the object's config has propertyObjectID or
inInventory (ObjectLoader2::LoadModelBehaviorsComponent); every other model
gets the plain one, which reads only the model block, as live wrote it. DLU
wrote the behaviors for every model, which the client then read as the next
component's data (the render effects). Tested with the capture decoder.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 08:39:23 -05:00
Aaron Kimbrell
ebc2fd3abf fix(pet): write the names bit on updates too
The client reads the moderation and names bit whenever the pet component is
dirty, on updates as well as on construction (LWOPetComponent::Deserialize),
and live wrote a 0 there on updates. DLU wrote it only on construction, so
on an update the client took the next component's first bit (a combat AI's
dirty bit) for it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 08:39:23 -05:00
Aaron Kimbrell
3956df8877 fix(moving platform): end the subcomponent list with a 0 bit
The client reads a moving platform's subcomponents while a 1 bit comes
before one (LWOMovingPlatformComponent::Deserialize), as live wrote them.
DLU wrote the mover without the closing 0 bit, so the client took the next
component's first bit for it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 08:39:23 -05:00