mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-10 06:43:43 +00:00
refactor: remaining game messages as structs, switch removed
Every game message still written or read by hand is now a NetGameMsg with Serialize and Deserialize, in per-domain files: - MovementMessages: teleport, platforms (resync and its request), orient to angle, node rotation lock, gravity scale, jetpack mode, control scheme, respawn checkpoint, rails (set/start, ready, cancel, arrived), mount inventory ID, dismount complete, possession ack, ghost reference override and position, camera cycling (eCameraTargetCyclingMode moves here). - ZoneMessages: player loaded (the old PLAYER_LOADED case), ready for updates, player ready, restore to post load stats, server done loading, invalid zone transfer list, zone summary display/dismissed, level processing complete, object world state, and the localized announcement WorldMigration wrote by hand. - PlayerMessages: chat mode, GM level, LEGO score, currency, reputation, GM invis, pickup currency, zone and player statistics, chat commands, bug reports, verify ack. - ObjectMessages: fire event client/server side, notify client (zone) object, notify object, script network vars, failed preconditions, terminate interaction, set name, request use, request server object info. - QuickBuildMessages: notify state, enable, cancel. - ActivityMessages gains match response/update/request, leaderboard request and data, shooting gallery score/rotation/fire, activity state change. - MissionMessages gains MissionDialogueCancelled (a no-op, as before). The wire structs left in GameMessages.h move to their domains (tooltip and emote to Effects, loot and item use to Inventory, model build to Building, behavior sound to Property, skill sets to Skill) and gain the missing direction. The dismount logic moves to PossessorComponent::OnDismountComplete. Every inbound message is registered in the GameMessageHandler map; the switch is gone, and GameMessages.cpp only holds the GameMsg/NetGameMsg base code. Call sites build the structs (NotifyClientObject, TerminateInteraction, Teleport, PlatformResync, FireEventClientSide, NotifyObject and NotifyClientZoneObject get convenience constructors like PlayFXEffect). Dead senders are dropped: SendSetShootingGalleryParams (no callers, field order was a guess), SendTeamPickupItem (the struct already existed), SendRequestActivitySummaryLeaderboardData (the struct covers it). Verified with RemainingMessagesTests: every old Send* function is frozen verbatim in Legacy/RemainingMessagesLegacy.h and compared byte for byte (same bits, destination and broadcast flag) over grids of inputs; every old Handle* read sequence is frozen as a Read* oracle and compared with the struct's Deserialize; round trips, truncation and a golden packet. PlayerLoaded (0x00dc36f0), SetGMLevel (0x00dd6230), MissionDialogueCancelled (0x00d9cc10) and LocalizedAnnouncementServerToSingleClient (0x00f23c50) were checked against the client. Behaviour notes: an inbound message that fails to deserialize is dropped, so ParseChatMessage over MAX_MESSAGE_LENGTH is dropped instead of truncated, and PLAYER_LOADED / READY_FOR_UPDATES / MISSION_DIALOGUE_CANCELLED now read their (unused) client fields. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
#include "ChatServerLink.h"
|
||||
#include "ChatPackets.h"
|
||||
#include "GameMessages.h"
|
||||
#include "ActivityMessages.h"
|
||||
#include "CDClientManager.h"
|
||||
#include "MissionComponent.h"
|
||||
#include "Character.h"
|
||||
@@ -124,8 +125,12 @@ void ActivityComponent::PlayerJoin(Entity* player) {
|
||||
}
|
||||
|
||||
void ActivityComponent::PlayerJoinLobby(Entity* player) {
|
||||
if (!m_Parent->HasComponent(eReplicaComponentType::QUICK_BUILD))
|
||||
GameMessages::SendMatchResponse(player, player->GetSystemAddress(), 0); // tell the client they joined a lobby
|
||||
if (!m_Parent->HasComponent(eReplicaComponentType::QUICK_BUILD)) {
|
||||
GameMessages::MatchResponse matchResponse;
|
||||
matchResponse.target = player->GetObjectID();
|
||||
matchResponse.response = 0;
|
||||
matchResponse.SendToClient(player->GetSystemAddress()); // tell the client they joined a lobby
|
||||
}
|
||||
LobbyPlayer newLobbyPlayer{};
|
||||
newLobbyPlayer.entityID = player->GetObjectID();
|
||||
LWOOBJID playerLobbyID = LWOOBJID_EMPTY;
|
||||
@@ -154,9 +159,17 @@ void ActivityComponent::PlayerJoinLobby(Entity* player) {
|
||||
LDFData<LWOOBJID> entityLDF("player", entity->GetObjectID());
|
||||
LDFData<std::string> entityName("playerName", entity->GetCharacter()->GetName());
|
||||
std::string matchUpdate = entityLDF.GetString() + "\n" + entityName.GetString();
|
||||
GameMessages::SendMatchUpdate(player, player->GetSystemAddress(), matchUpdate, eMatchUpdate::PLAYER_ADDED);
|
||||
GameMessages::MatchUpdate existingPlayerUpdate;
|
||||
existingPlayerUpdate.target = player->GetObjectID();
|
||||
existingPlayerUpdate.data = matchUpdate;
|
||||
existingPlayerUpdate.type = eMatchUpdate::PLAYER_ADDED;
|
||||
existingPlayerUpdate.SendToClient(player->GetSystemAddress());
|
||||
PlayerReady(entity, joinedPlayer.ready);
|
||||
GameMessages::SendMatchUpdate(entity, entity->GetSystemAddress(), matchUpdateJoined, eMatchUpdate::PLAYER_ADDED);
|
||||
GameMessages::MatchUpdate joinedPlayerUpdate;
|
||||
joinedPlayerUpdate.target = entity->GetObjectID();
|
||||
joinedPlayerUpdate.data = matchUpdateJoined;
|
||||
joinedPlayerUpdate.type = eMatchUpdate::PLAYER_ADDED;
|
||||
joinedPlayerUpdate.SendToClient(entity->GetSystemAddress());
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -174,7 +187,11 @@ void ActivityComponent::PlayerJoinLobby(Entity* player) {
|
||||
if (m_ActivityInfo.maxTeamSize != 1 && lobby.players.size() >= m_ActivityInfo.minTeamSize || m_ActivityInfo.maxTeamSize == 1 && lobby.players.size() >= m_ActivityInfo.minTeams) {
|
||||
// Update the joining player on the match timer
|
||||
LDFData<float> matchTimer("time", lobby.timer);
|
||||
GameMessages::SendMatchUpdate(player, player->GetSystemAddress(), matchTimer.GetString(), eMatchUpdate::PHASE_WAIT_READY);
|
||||
GameMessages::MatchUpdate matchUpdate;
|
||||
matchUpdate.target = player->GetObjectID();
|
||||
matchUpdate.data = matchTimer.GetString();
|
||||
matchUpdate.type = eMatchUpdate::PHASE_WAIT_READY;
|
||||
matchUpdate.SendToClient(player->GetSystemAddress());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -190,7 +207,11 @@ void ActivityComponent::PlayerLeave(LWOOBJID playerID) {
|
||||
if (entity == nullptr)
|
||||
continue;
|
||||
|
||||
GameMessages::SendMatchUpdate(entity, entity->GetSystemAddress(), matchUpdateLeft.GetString(), eMatchUpdate::PLAYER_REMOVED);
|
||||
GameMessages::MatchUpdate matchUpdate;
|
||||
matchUpdate.target = entity->GetObjectID();
|
||||
matchUpdate.data = matchUpdateLeft.GetString();
|
||||
matchUpdate.type = eMatchUpdate::PLAYER_REMOVED;
|
||||
matchUpdate.SendToClient(entity->GetSystemAddress());
|
||||
}
|
||||
|
||||
lobby.players.erase(lobby.players.begin() + i);
|
||||
@@ -229,7 +250,11 @@ void ActivityComponent::Update(float deltaTime) {
|
||||
continue;
|
||||
|
||||
LDFData<float> matchTimerUpdate("time", lobby.timer);
|
||||
GameMessages::SendMatchUpdate(entity, entity->GetSystemAddress(), matchTimerUpdate.GetString(), eMatchUpdate::PHASE_WAIT_READY);
|
||||
GameMessages::MatchUpdate matchUpdate;
|
||||
matchUpdate.target = entity->GetObjectID();
|
||||
matchUpdate.data = matchTimerUpdate.GetString();
|
||||
matchUpdate.type = eMatchUpdate::PHASE_WAIT_READY;
|
||||
matchUpdate.SendToClient(entity->GetSystemAddress());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -254,7 +279,11 @@ void ActivityComponent::Update(float deltaTime) {
|
||||
if (entity == nullptr)
|
||||
continue;
|
||||
|
||||
GameMessages::SendMatchUpdate(entity, entity->GetSystemAddress(), matchTimerUpdate.GetString(), eMatchUpdate::PHASE_WAIT_START);
|
||||
GameMessages::MatchUpdate matchUpdate;
|
||||
matchUpdate.target = entity->GetObjectID();
|
||||
matchUpdate.data = matchTimerUpdate.GetString();
|
||||
matchUpdate.type = eMatchUpdate::PHASE_WAIT_START;
|
||||
matchUpdate.SendToClient(entity->GetSystemAddress());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -349,7 +378,11 @@ void ActivityComponent::PlayerReady(Entity* player, bool bReady) {
|
||||
if (entity == nullptr)
|
||||
continue;
|
||||
|
||||
GameMessages::SendMatchUpdate(entity, entity->GetSystemAddress(), matchReadyUpdate.GetString(), readyStatus);
|
||||
GameMessages::MatchUpdate matchUpdate;
|
||||
matchUpdate.target = entity->GetObjectID();
|
||||
matchUpdate.data = matchReadyUpdate.GetString();
|
||||
matchUpdate.type = readyStatus;
|
||||
matchUpdate.SendToClient(entity->GetSystemAddress());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include "AmfSerialize.h"
|
||||
#include "GameMessages.h"
|
||||
#include "EffectsMessages.h"
|
||||
#include "PlayerMessages.h"
|
||||
#include "User.h"
|
||||
#include "CDClientManager.h"
|
||||
#include "CDDestructibleComponentTable.h"
|
||||
@@ -47,6 +48,7 @@
|
||||
#include <ranges>
|
||||
|
||||
#include "CDComponentsRegistryTable.h"
|
||||
#include "InventoryMessages.h"
|
||||
|
||||
Implementation<bool, const Entity*> DestroyableComponent::IsEnemyImplentation;
|
||||
Implementation<bool, const Entity*> DestroyableComponent::IsFriendImplentation;
|
||||
@@ -967,7 +969,11 @@ void DestroyableComponent::DoHardcoreModeDrops(const LWOOBJID source) {
|
||||
LOG("Player %llu has lost %llu uscore!", m_Parent->GetObjectID(), uscoreToLose);
|
||||
character->SetUScore(uscore - uscoreToLose, EconomyLedger::HARDCORE_DEATH_SOURCE);
|
||||
|
||||
GameMessages::SendModifyLEGOScore(m_Parent, m_Parent->GetSystemAddress(), -uscoreToLose, eLootSourceType::MISSION);
|
||||
GameMessages::ModifyLEGOScore modifyScore;
|
||||
modifyScore.target = m_Parent->GetObjectID();
|
||||
modifyScore.score = -uscoreToLose;
|
||||
modifyScore.sourceType = eLootSourceType::MISSION;
|
||||
modifyScore.SendToClient(m_Parent->GetSystemAddress());
|
||||
|
||||
if (Game::entityManager->GetHardcoreDropinventoryOnDeath()) {
|
||||
//drop all items from inventory:
|
||||
@@ -1051,7 +1057,11 @@ void DestroyableComponent::DoHardcoreModeDrops(const LWOOBJID source) {
|
||||
int uscore = maxHealth * Game::entityManager->GetHardcoreUscoreEnemiesMultiplier() * uscoreReduction;
|
||||
LOG("Rewarding player %llu with %i uscore for killing enemy %i", player->GetObjectID(), uscore, lot);
|
||||
playerStats->SetUScore(playerStats->GetUScore() + uscore, EconomyLedger::HARDCORE_KILL_SOURCE);
|
||||
GameMessages::SendModifyLEGOScore(player, player->GetSystemAddress(), uscore, eLootSourceType::MISSION);
|
||||
GameMessages::ModifyLEGOScore modifyScore;
|
||||
modifyScore.target = player->GetObjectID();
|
||||
modifyScore.score = uscore;
|
||||
modifyScore.sourceType = eLootSourceType::MISSION;
|
||||
modifyScore.SendToClient(player->GetSystemAddress());
|
||||
|
||||
Game::entityManager->SerializeEntity(m_Parent);
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#include "Amf3.h"
|
||||
#include "GameMessages.h"
|
||||
#include "PlayerMessages.h"
|
||||
|
||||
GhostComponent::GhostComponent(Entity* parent, const int32_t componentID) : Component(parent, componentID) {
|
||||
m_GhostReferencePoint = NiPoint3Constant::ZERO;
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "Component.h"
|
||||
#include "eReplicaComponentType.h"
|
||||
#include <unordered_set>
|
||||
#include "PlayerMessages.h"
|
||||
|
||||
class NiPoint3;
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "InventoryMessages.h"
|
||||
#include "Database.h"
|
||||
#include "SkillMessages.h"
|
||||
#include "MovementMessages.h"
|
||||
#include "SkillComponent.h"
|
||||
#include "Character.h"
|
||||
#include "EntityManager.h"
|
||||
@@ -1105,7 +1106,10 @@ void InventoryComponent::HandlePossession(Item* item) {
|
||||
|
||||
// Set the mount item ID so that we know what we're handling
|
||||
possessorComponent->SetMountItemID(item->GetId());
|
||||
GameMessages::SendSetMountInventoryID(m_Parent, item->GetId(), UNASSIGNED_SYSTEM_ADDRESS);
|
||||
GameMessages::SetMountInventoryID mountInventoryID;
|
||||
mountInventoryID.target = m_Parent->GetObjectID();
|
||||
mountInventoryID.inventoryMountID = item->GetId();
|
||||
mountInventoryID.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
|
||||
// Create the mount entity
|
||||
EntityInfo info{};
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
#include "Database.h"
|
||||
#include "DluAssert.h"
|
||||
#include "ObjectMessages.h"
|
||||
|
||||
ModelComponent::ModelComponent(Entity* parent, const int32_t componentID) : Component(parent, componentID) {
|
||||
m_OriginalPosition = m_Parent->GetDefaultPosition();
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include "PropertyBehavior.h"
|
||||
#include "PropertyBehaviorActions.h"
|
||||
#include "StripUiPosition.h"
|
||||
#include "ObjectMessages.h"
|
||||
|
||||
class AddMessage;
|
||||
class AMFArrayValue;
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "PetMessages.h"
|
||||
#include "InventoryMessages.h"
|
||||
#include "EffectsMessages.h"
|
||||
#include "ObjectMessages.h"
|
||||
#include "BrickDatabase.h"
|
||||
#include "CDClientDatabase.h"
|
||||
#include "CDTamingBuildPuzzleTable.h"
|
||||
@@ -740,7 +741,7 @@ void PetComponent::RequestSetPetName(std::u16string name) {
|
||||
characterComponent->SetCurrentActivity(eGameActivity::NONE);
|
||||
Game::entityManager->SerializeEntity(tamer);
|
||||
}
|
||||
GameMessages::SendTerminateInteraction(m_Tamer, eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID());
|
||||
GameMessages::TerminateInteraction(m_Tamer, eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID()).Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
|
||||
auto* modelEntity = Game::entityManager->GetEntity(m_ModelId);
|
||||
|
||||
@@ -791,7 +792,7 @@ void PetComponent::ClientExitTamingMinigame(bool voluntaryExit) {
|
||||
msg.Send(tamer->GetSystemAddress());
|
||||
}
|
||||
|
||||
GameMessages::SendTerminateInteraction(m_Tamer, eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID());
|
||||
GameMessages::TerminateInteraction(m_Tamer, eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID()).Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
|
||||
currentActivities.erase(m_Tamer);
|
||||
|
||||
@@ -847,7 +848,7 @@ void PetComponent::ClientFailTamingMinigame() {
|
||||
msg.Send(tamer->GetSystemAddress());
|
||||
}
|
||||
|
||||
GameMessages::SendTerminateInteraction(m_Tamer, eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID());
|
||||
GameMessages::TerminateInteraction(m_Tamer, eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID()).Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
|
||||
currentActivities.erase(m_Tamer);
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include "EntityManager.h"
|
||||
#include "ControllablePhysicsComponent.h"
|
||||
#include "GameMessages.h"
|
||||
#include "MovementMessages.h"
|
||||
#include "ePhysicsEffectType.h"
|
||||
|
||||
#include "CDClientManager.h"
|
||||
@@ -157,7 +158,10 @@ void ApplyCollisionEffect(const LWOOBJID& target, const ePhysicsEffectType effec
|
||||
// dont want to apply an effect to nothing.
|
||||
if (!controllablePhysicsComponent) return;
|
||||
controllablePhysicsComponent->SetGravityScale(effectScale);
|
||||
GameMessages::SendSetGravityScale(target, effectScale, targetEntity->GetSystemAddress());
|
||||
GameMessages::SetGravityScale gravityScale;
|
||||
gravityScale.target = target;
|
||||
gravityScale.scale = effectScale;
|
||||
gravityScale.SendToClient(targetEntity->GetSystemAddress());
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -185,7 +189,11 @@ void PhantomPhysicsComponent::Update(float deltaTime) {
|
||||
auto* const entity = Game::entityManager->GetEntity(id);
|
||||
|
||||
if (entity) {
|
||||
GameMessages::SendPlayerReachedRespawnCheckpoint(entity, m_RespawnPos, m_RespawnRot);
|
||||
GameMessages::PlayerReachedRespawnCheckpoint respawnCheckpoint;
|
||||
respawnCheckpoint.target = entity->GetObjectID();
|
||||
respawnCheckpoint.pos = m_RespawnPos;
|
||||
respawnCheckpoint.rot = m_RespawnRot;
|
||||
respawnCheckpoint.SendToClient(entity->GetSystemAddress());
|
||||
entity->SetRespawnPos(m_RespawnPos);
|
||||
entity->SetRespawnRot(m_RespawnRot);
|
||||
}
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
#include "RacingMessages.h"
|
||||
#include "eUnequippableActiveType.h"
|
||||
#include "InventoryMessages.h"
|
||||
#include "MovementMessages.h"
|
||||
#include "ControllablePhysicsComponent.h"
|
||||
#include "SkillMessages.h"
|
||||
|
||||
PossessorComponent::PossessorComponent(Entity* parent, const int32_t componentID) : Component(parent, componentID) {
|
||||
m_Possessable = LWOOBJID_EMPTY;
|
||||
@@ -63,7 +66,10 @@ void PossessorComponent::Mount(Entity* mount) {
|
||||
}
|
||||
|
||||
// GM's to send
|
||||
GameMessages::SendSetJetPackMode(m_Parent, false);
|
||||
GameMessages::SetJetPackMode jetPackMode;
|
||||
jetPackMode.target = m_Parent->GetObjectID();
|
||||
jetPackMode.bUse = false;
|
||||
jetPackMode.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
if (mount->GetComponent<HavokVehiclePhysicsComponent>()) {
|
||||
auto characterComponent = m_Parent->GetComponent<CharacterComponent>();
|
||||
if (characterComponent) characterComponent->SetIsRacing(true);
|
||||
@@ -105,3 +111,39 @@ void PossessorComponent::Dismount(Entity* mount, bool forceDismount) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PossessorComponent::OnDismountComplete(const LWOOBJID mountId) {
|
||||
auto* mount = Game::entityManager->GetEntity(mountId);
|
||||
// make sure we have the things we need and they aren't null
|
||||
if (!mount) return;
|
||||
if (!GetIsDismounting()) return;
|
||||
SetIsDismounting(false);
|
||||
SetPossessable(LWOOBJID_EMPTY);
|
||||
SetPossessableType(ePossessionType::NO_POSSESSION);
|
||||
|
||||
// character related things
|
||||
auto* character = m_Parent->GetComponent<CharacterComponent>();
|
||||
if (character) {
|
||||
// If we had an active item turn it off
|
||||
if (GetMountItemID() != LWOOBJID_EMPTY) {
|
||||
GameMessages::MarkInventoryItemAsActive markActive;
|
||||
markActive.target = m_Parent->GetObjectID();
|
||||
markActive.bActive = false;
|
||||
markActive.iType = eUnequippableActiveType::MOUNT;
|
||||
markActive.itemID = GetMountItemID();
|
||||
markActive.Send(m_Parent->GetSystemAddress());
|
||||
}
|
||||
SetMountItemID(LWOOBJID_EMPTY);
|
||||
}
|
||||
|
||||
// Set that the controllabel phsyics comp is teleporting
|
||||
auto* controllablePhysicsComponent = m_Parent->GetComponent<ControllablePhysicsComponent>();
|
||||
if (controllablePhysicsComponent) controllablePhysicsComponent->SetIsTeleporting(true);
|
||||
|
||||
// Call dismoint on the possessable comp to let it handle killing the possessable
|
||||
auto* possessableComponent = mount->GetComponent<PossessableComponent>();
|
||||
if (possessableComponent) possessableComponent->Dismount();
|
||||
|
||||
// Update the entity that was possessing
|
||||
Game::entityManager->SerializeEntity(m_Parent);
|
||||
}
|
||||
|
||||
@@ -40,6 +40,13 @@ public:
|
||||
*/
|
||||
void Dismount(Entity* mount, bool forceDismount = false);
|
||||
|
||||
/**
|
||||
* @brief Handles the client's DismountComplete: finishes a dismount started by Dismount
|
||||
*
|
||||
* @param mountId The object ID of the mount the client finished dismounting
|
||||
*/
|
||||
void OnDismountComplete(const LWOOBJID mountId);
|
||||
|
||||
/**
|
||||
* Sets the ID that this entity is possessing
|
||||
* @param value The ID that this entity is possessing
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
#include "GameMessages.h"
|
||||
#include "EffectsMessages.h"
|
||||
#include "CombatMessages.h"
|
||||
#include "ObjectMessages.h"
|
||||
#include "QuickBuildMessages.h"
|
||||
#include "EntityManager.h"
|
||||
#include "Game.h"
|
||||
#include "Logger.h"
|
||||
@@ -406,8 +408,21 @@ void QuickBuildComponent::StartQuickBuild(Entity* const user) {
|
||||
|
||||
Game::entityManager->SerializeEntity(user);
|
||||
|
||||
GameMessages::SendQuickBuildNotifyState(m_Parent, m_State, eQuickBuildState::BUILDING, user->GetObjectID());
|
||||
GameMessages::SendEnableQuickBuild(m_Parent, true, false, false, eQuickBuildFailReason::NOT_GIVEN, 0.0f, user->GetObjectID());
|
||||
GameMessages::RebuildNotifyState notifyState;
|
||||
notifyState.target = m_Parent->GetObjectID();
|
||||
notifyState.prevState = m_State;
|
||||
notifyState.state = eQuickBuildState::BUILDING;
|
||||
notifyState.player = user->GetObjectID();
|
||||
notifyState.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
GameMessages::EnableRebuild enableRebuild;
|
||||
enableRebuild.target = m_Parent->GetObjectID();
|
||||
enableRebuild.bEnable = true;
|
||||
enableRebuild.bFail = false;
|
||||
enableRebuild.bSuccess = false;
|
||||
enableRebuild.eFailReason = eQuickBuildFailReason::NOT_GIVEN;
|
||||
enableRebuild.fDuration = 0.0f;
|
||||
enableRebuild.user = user->GetObjectID();
|
||||
enableRebuild.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
|
||||
SetState(eQuickBuildState::BUILDING);
|
||||
Game::entityManager->SerializeEntity(m_Parent);
|
||||
@@ -442,12 +457,25 @@ void QuickBuildComponent::CompleteQuickBuild(Entity* const user) {
|
||||
|
||||
Game::entityManager->SerializeEntity(user);
|
||||
|
||||
GameMessages::SendQuickBuildNotifyState(m_Parent, m_State, eQuickBuildState::COMPLETED, user->GetObjectID());
|
||||
GameMessages::RebuildNotifyState notifyState;
|
||||
notifyState.target = m_Parent->GetObjectID();
|
||||
notifyState.prevState = m_State;
|
||||
notifyState.state = eQuickBuildState::COMPLETED;
|
||||
notifyState.player = user->GetObjectID();
|
||||
notifyState.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
GameMessages::PlayFXEffect fx(m_Parent->GetObjectID(), 507, u"create", "BrickFadeUpVisCompleteEffect");
|
||||
fx.priority = 0.4f;
|
||||
fx.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
GameMessages::SendEnableQuickBuild(m_Parent, false, false, true, eQuickBuildFailReason::NOT_GIVEN, m_ResetTime, user->GetObjectID());
|
||||
GameMessages::SendTerminateInteraction(user->GetObjectID(), eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID());
|
||||
GameMessages::EnableRebuild enableRebuild;
|
||||
enableRebuild.target = m_Parent->GetObjectID();
|
||||
enableRebuild.bEnable = false;
|
||||
enableRebuild.bFail = false;
|
||||
enableRebuild.bSuccess = true;
|
||||
enableRebuild.eFailReason = eQuickBuildFailReason::NOT_GIVEN;
|
||||
enableRebuild.fDuration = m_ResetTime;
|
||||
enableRebuild.user = user->GetObjectID();
|
||||
enableRebuild.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
GameMessages::TerminateInteraction(user->GetObjectID(), eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID()).Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
|
||||
|
||||
SetState(eQuickBuildState::COMPLETED);
|
||||
@@ -522,14 +550,27 @@ void QuickBuildComponent::ResetQuickBuild(const bool failed) {
|
||||
Entity* builder = GetBuilder();
|
||||
|
||||
if (m_State == eQuickBuildState::BUILDING && builder) {
|
||||
GameMessages::SendEnableQuickBuild(m_Parent, false, false, failed, eQuickBuildFailReason::NOT_GIVEN, m_ResetTime, builder->GetObjectID());
|
||||
GameMessages::EnableRebuild enableRebuild;
|
||||
enableRebuild.target = m_Parent->GetObjectID();
|
||||
enableRebuild.bEnable = false;
|
||||
enableRebuild.bFail = false;
|
||||
enableRebuild.bSuccess = failed;
|
||||
enableRebuild.eFailReason = eQuickBuildFailReason::NOT_GIVEN;
|
||||
enableRebuild.fDuration = m_ResetTime;
|
||||
enableRebuild.user = builder->GetObjectID();
|
||||
enableRebuild.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
|
||||
if (failed) {
|
||||
RenderComponent::PlayAnimation(builder, u"rebuild-fail");
|
||||
}
|
||||
}
|
||||
|
||||
GameMessages::SendQuickBuildNotifyState(m_Parent, m_State, eQuickBuildState::RESETTING, LWOOBJID_EMPTY);
|
||||
GameMessages::RebuildNotifyState notifyState;
|
||||
notifyState.target = m_Parent->GetObjectID();
|
||||
notifyState.prevState = m_State;
|
||||
notifyState.state = eQuickBuildState::RESETTING;
|
||||
notifyState.player = LWOOBJID_EMPTY;
|
||||
notifyState.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
|
||||
SetState(eQuickBuildState::RESETTING);
|
||||
SetTimer(0.0f);
|
||||
@@ -559,12 +600,25 @@ void QuickBuildComponent::CancelQuickBuild(Entity* const entity, const eQuickBui
|
||||
const auto entityID = entity != nullptr ? entity->GetObjectID() : LWOOBJID_EMPTY;
|
||||
|
||||
// Notify the client that a state has changed
|
||||
GameMessages::SendQuickBuildNotifyState(m_Parent, m_State, eQuickBuildState::INCOMPLETE, entityID);
|
||||
GameMessages::SendEnableQuickBuild(m_Parent, false, true, false, failReason, m_Timer, entityID);
|
||||
GameMessages::RebuildNotifyState notifyState;
|
||||
notifyState.target = m_Parent->GetObjectID();
|
||||
notifyState.prevState = m_State;
|
||||
notifyState.state = eQuickBuildState::INCOMPLETE;
|
||||
notifyState.player = entityID;
|
||||
notifyState.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
GameMessages::EnableRebuild enableRebuild;
|
||||
enableRebuild.target = m_Parent->GetObjectID();
|
||||
enableRebuild.bEnable = false;
|
||||
enableRebuild.bFail = true;
|
||||
enableRebuild.bSuccess = false;
|
||||
enableRebuild.eFailReason = failReason;
|
||||
enableRebuild.fDuration = m_Timer;
|
||||
enableRebuild.user = entityID;
|
||||
enableRebuild.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
|
||||
// Now terminate any interaction with the rebuild
|
||||
GameMessages::SendTerminateInteraction(entityID, eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID());
|
||||
GameMessages::SendTerminateInteraction(m_Parent->GetObjectID(), eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID());
|
||||
GameMessages::TerminateInteraction(entityID, eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID()).Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
GameMessages::TerminateInteraction(m_Parent->GetObjectID(), eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID()).Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
|
||||
// Now update the component itself
|
||||
SetState(eQuickBuildState::INCOMPLETE);
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "CombatMessages.h"
|
||||
#include "ActivityMessages.h"
|
||||
#include "RacingMessages.h"
|
||||
#include "MovementMessages.h"
|
||||
#include "InventoryComponent.h"
|
||||
#include "Item.h"
|
||||
#include "MissionComponent.h"
|
||||
@@ -152,8 +153,7 @@ void RacingControlComponent::LoadPlayerVehicle(Entity* player,
|
||||
|
||||
// Make sure the player is at the correct position.
|
||||
|
||||
GameMessages::SendTeleport(player->GetObjectID(), startPosition,
|
||||
startRotation, player->GetSystemAddress(), true);
|
||||
GameMessages::Teleport(player->GetObjectID(), startPosition, startRotation, true).SendToClient(player->GetSystemAddress());
|
||||
|
||||
// Spawn the vehicle entity.
|
||||
|
||||
@@ -265,7 +265,10 @@ void RacingControlComponent::LoadPlayerVehicle(Entity* player,
|
||||
resetPlayer.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
});
|
||||
|
||||
GameMessages::SendSetJetPackMode(player, false);
|
||||
GameMessages::SetJetPackMode jetPackMode;
|
||||
jetPackMode.target = player->GetObjectID();
|
||||
jetPackMode.bUse = false;
|
||||
jetPackMode.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
|
||||
// Set the vehicle's state.
|
||||
GameMessages::NotifyVehicleOfRacingObject notifyVehicle;
|
||||
@@ -280,10 +283,8 @@ void RacingControlComponent::LoadPlayerVehicle(Entity* player,
|
||||
wheelLockState.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
|
||||
// Make sure everything has the correct position.
|
||||
GameMessages::SendTeleport(player->GetObjectID(), startPosition,
|
||||
startRotation, player->GetSystemAddress(), true);
|
||||
GameMessages::SendTeleport(carEntity->GetObjectID(), startPosition,
|
||||
startRotation, player->GetSystemAddress(), true);
|
||||
GameMessages::Teleport(player->GetObjectID(), startPosition, startRotation, true).SendToClient(player->GetSystemAddress());
|
||||
GameMessages::Teleport(carEntity->GetObjectID(), startPosition, startRotation, true).SendToClient(player->GetSystemAddress());
|
||||
}
|
||||
|
||||
void RacingControlComponent::OnRacingClientReady(Entity* player) {
|
||||
@@ -691,10 +692,7 @@ void RacingControlComponent::Update(float deltaTime) {
|
||||
Game::entityManager->GetEntity(player.playerID);
|
||||
|
||||
if (vehicle != nullptr && playerEntity != nullptr) {
|
||||
GameMessages::SendTeleport(
|
||||
player.playerID, player.respawnPosition,
|
||||
player.respawnRotation,
|
||||
playerEntity->GetSystemAddress(), true);
|
||||
GameMessages::Teleport(player.playerID, player.respawnPosition, player.respawnRotation, true).SendToClient(playerEntity->GetSystemAddress());
|
||||
|
||||
vehicle->SetPosition(player.respawnPosition);
|
||||
vehicle->SetRotation(player.respawnRotation);
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "GameMessages.h"
|
||||
#include "EffectsMessages.h"
|
||||
#include "CombatMessages.h"
|
||||
#include "MovementMessages.h"
|
||||
#include "QuickBuildComponent.h"
|
||||
#include "Game.h"
|
||||
#include "Logger.h"
|
||||
@@ -74,11 +75,24 @@ void RailActivatorComponent::OnUse(Entity* originator) {
|
||||
return;
|
||||
}
|
||||
|
||||
GameMessages::SendStartRailMovement(originator->GetObjectID(), m_Path, m_StartSound,
|
||||
m_loopSound, m_StopSound, originator->GetSystemAddress(),
|
||||
m_PathStart, m_PathDirection, m_DamageImmune, m_NoAggro, m_NotifyArrived,
|
||||
m_ShowNameBillboard, m_CameraLocked, m_CollisionEnabled, m_UseDB, m_ComponentID,
|
||||
m_Parent->GetObjectID());
|
||||
GameMessages::StartRailMovement startRail;
|
||||
startRail.target = originator->GetObjectID();
|
||||
startRail.pathName = m_Path;
|
||||
startRail.startSound = m_StartSound;
|
||||
startRail.loopSound = m_loopSound;
|
||||
startRail.stopSound = m_StopSound;
|
||||
startRail.pathStart = m_PathStart;
|
||||
startRail.goForward = m_PathDirection;
|
||||
startRail.bDamageImmune = m_DamageImmune;
|
||||
startRail.bNoAggro = m_NoAggro;
|
||||
startRail.bNotifyActor = m_NotifyArrived;
|
||||
startRail.bShowNameBillboard = m_ShowNameBillboard;
|
||||
startRail.bCameraLocked = m_CameraLocked;
|
||||
startRail.bCollisionEnabled = m_CollisionEnabled;
|
||||
startRail.bUseDB = m_UseDB;
|
||||
startRail.railActivatorComponentID = m_ComponentID;
|
||||
startRail.railActivatorObjectID = m_Parent->GetObjectID();
|
||||
startRail.Send(originator->GetSystemAddress());
|
||||
});
|
||||
}
|
||||
|
||||
@@ -111,9 +125,14 @@ void RailActivatorComponent::OnRailMovementReady(Entity* originator) const {
|
||||
RenderComponent::PlayAnimation(originator, m_LoopAnimation);
|
||||
}
|
||||
|
||||
GameMessages::SendSetRailMovement(originator->GetObjectID(), m_PathDirection, m_Path, m_PathStart,
|
||||
originator->GetSystemAddress(), m_ComponentID,
|
||||
m_Parent->GetObjectID());
|
||||
GameMessages::SetRailMovement setRail;
|
||||
setRail.target = originator->GetObjectID();
|
||||
setRail.pathGoForward = m_PathDirection;
|
||||
setRail.pathName = m_Path;
|
||||
setRail.pathStart = m_PathStart;
|
||||
setRail.railActivatorComponentID = m_ComponentID;
|
||||
setRail.railActivatorObjectID = m_Parent->GetObjectID();
|
||||
setRail.Send(originator->GetSystemAddress());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
#include <sstream>
|
||||
|
||||
#include "GameMessages.h"
|
||||
#include "ObjectMessages.h"
|
||||
#include "ZoneMessages.h"
|
||||
#include "CharacterComponent.h"
|
||||
#include "dZoneManager.h"
|
||||
#include "EntityManager.h"
|
||||
@@ -78,9 +80,12 @@ void RocketLaunchpadControlComponent::Launch(Entity* originator, LWOMAPID mapId,
|
||||
|
||||
SetSelectedMapId(originator->GetObjectID(), zone);
|
||||
|
||||
GameMessages::SendFireEventClientSide(m_Parent->GetObjectID(), originator->GetSystemAddress(), u"RocketEquipped", rocket->GetId(), cloneId, -1, originator->GetObjectID());
|
||||
GameMessages::FireEventClientSide(m_Parent->GetObjectID(), u"RocketEquipped", rocket->GetId(), originator->GetObjectID()).SendToClient(originator->GetSystemAddress());
|
||||
|
||||
GameMessages::SendChangeObjectWorldState(rocket->GetId(), eObjectWorldState::ATTACHED, UNASSIGNED_SYSTEM_ADDRESS);
|
||||
GameMessages::ChangeObjectWorldState worldState;
|
||||
worldState.target = rocket->GetId();
|
||||
worldState.newState = eObjectWorldState::ATTACHED;
|
||||
worldState.Send(UNASSIGNED_SYSTEM_ADDRESS);
|
||||
|
||||
Game::entityManager->SerializeEntity(originator);
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#include <glm/gtc/quaternion.hpp>
|
||||
#include "EffectsMessages.h"
|
||||
#include "ZoneMessages.h"
|
||||
|
||||
TriggerComponent::TriggerComponent(Entity* parent, const int32_t componentID, const std::string triggerInfo) : Component(parent, componentID) {
|
||||
m_Parent = parent;
|
||||
@@ -130,9 +131,15 @@ void TriggerComponent::HandleTriggerCommand(LUTriggers::Command* command, Entity
|
||||
case eTriggerCommandType::CAST_SKILL:
|
||||
HandleCastSkill(targetEntity, command->args);
|
||||
break;
|
||||
case eTriggerCommandType::DISPLAY_ZONE_SUMMARY:
|
||||
GameMessages::SendDisplayZoneSummary(targetEntity->GetObjectID(), targetEntity->GetSystemAddress(), false, command->args == "1", m_Parent->GetObjectID());
|
||||
case eTriggerCommandType::DISPLAY_ZONE_SUMMARY: {
|
||||
GameMessages::DisplayZoneSummary zoneSummary;
|
||||
zoneSummary.target = targetEntity->GetObjectID();
|
||||
zoneSummary.isPropertyMap = false;
|
||||
zoneSummary.isZoneStart = command->args == "1";
|
||||
zoneSummary.sender = m_Parent->GetObjectID();
|
||||
zoneSummary.Send(targetEntity->GetSystemAddress());
|
||||
break;
|
||||
}
|
||||
case eTriggerCommandType::SET_PHYSICS_VOLUME_EFFECT:
|
||||
HandleSetPhysicsVolumeEffect(targetEntity, argArray);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user