feat(rails): answer RequestRailActivatorState

The client's rail activator sends RequestRailActivatorState (1479, no
payload) when it is added to the world (LWORailActivatorComponent::
SendMessage 0x00c00da0) and live answered with
NotifyRailActivatorStateChange (1478, bActive) to that client; the client
stores rail_activator_active and updates the rail's pick type (usable or
not). Live: 152 requests, 413 answers, every one bActive = true. DLU
dropped the request and never answered.

RailActivatorComponent keeps the level key rail_activator_active
(default true; every rail in the live levels sets it to 1) and the
request is answered with it.

Check in game: in Ninjago Monastery and Nimbus Station, rails (spinjitzu
posts, the Nexus Tower rails) show as usable and work as before when
first loading the world and after zone changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Aaron Kimbrell
2026-09-29 03:23:47 -05:00
parent e9ff5f402d
commit 3672b64dec
6 changed files with 68 additions and 0 deletions

View File

@@ -295,6 +295,24 @@ namespace GameMessages {
}
}
void RequestRailActivatorState::Handle(Entity& entity, const SystemAddress& sysAddr) {
const auto* const rail = entity.GetComponent<RailActivatorComponent>();
if (!rail) return;
NotifyRailActivatorStateChange notify;
notify.target = entity.GetObjectID();
notify.bActive = rail->GetActive();
notify.SendToClient(sysAddr);
}
void NotifyRailActivatorStateChange::Serialize(RakNet::BitStream& bitStream) const {
bitStream.Write(bActive);
}
bool NotifyRailActivatorStateChange::Deserialize(RakNet::BitStream& bitStream) {
VALIDATE_READ(bitStream.Read(bActive));
return true;
}
void PlayerRailArrivedNotification::Serialize(RakNet::BitStream& bitStream) const {
BitStreamUtils::WriteLengthPrefixed<uint32_t>(bitStream, pathName);
bitStream.Write(waypointNumber);