mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-02 10:53:44 +00:00
feat(character): keep the rocket build the client reports (SetLastCustomBuild)
The client sends SetLastCustomBuild (890, a u32-length wide string; other references) with its rocket build, e.g. "1:14454;1:4714;1:4715;", when it assembles the rocket the player carries: after EquipInventory at a launchpad and on load when landing (202 live packets). It stores it as lastUsedRocketInfo (LWOCharacterComponent::SendMessage 0x00d34330) and reads it back from char@lcbp on load (0x00ca4910). Live saved lcbp in the same format on every character. DLU dropped the message and only set lcbp when the server equipped the rocket. The handler now keeps the client's build as the rocket config (saved as lcbp). It does not change whether the player lands on the next load: DLU uses an empty config to skip the landing after non-rocket transfers, and that still happens when the server clears it. Check in game: build a new rocket in the rocket builder, launch from a launchpad and land: the rocket shown on landing and the builder's default next time are the new build. Teleport to another world without a rocket (e.g. from a property): no landing animation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -67,3 +67,18 @@ TEST_F(ClientMessagesTests, SetTooltipFlagFollowsTheClient) {
|
||||
characterComponent->SetTooltipFlag(100, false);
|
||||
EXPECT_EQ(characterComponent->GetTooltipFlags(), 0u);
|
||||
}
|
||||
|
||||
// SetLastCustomBuild (890): a u32-length wide string. 202 live packets, sent when the carried rocket is assembled.
|
||||
TEST_F(ClientMessagesTests, SetLastCustomBuildMatchesLiveCapture) {
|
||||
auto msg = FromLiveClientCapture<GameMessages::SetLastCustomBuild>(std::string(PLAYER_HEADER) + "7a03" +
|
||||
"1600000031003a00310034003400350034003b0031003a0034003700310034003b0031003a0034003700310035003b00");
|
||||
EXPECT_EQ(msg.tokenizedLOTList, u"1:14454;1:4714;1:4715;");
|
||||
EXPECT_EQ(RoundTrip(msg).tokenizedLOTList, msg.tokenizedLOTList);
|
||||
ExpectTruncatedFails(msg);
|
||||
|
||||
// Kept as the rocket config (saved as char@lcbp) without turning on the landing
|
||||
auto* const characterComponent = player->GetComponent<CharacterComponent>();
|
||||
msg.Handle(*player, UNASSIGNED_SYSTEM_ADDRESS);
|
||||
EXPECT_EQ(characterComponent->GetLastRocketConfig(), u"1:14454;1:4714;1:4715;");
|
||||
EXPECT_FALSE(characterComponent->GetIsLanding());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user