#pragma once #include #include struct UpdateEvent; struct CharacterInteriorCellChangeEvent; struct CharacterSpawnedEvent; struct World; struct AssignCharacterRequest; struct CharacterSpawnRequest; struct ClientReferencesMoveRequest; struct RequestFactionsChanges; struct GridCellCoords; struct RequestOwnershipTransfer; struct CharacterRemoveEvent; struct CharacterExteriorCellChangeEvent; struct RequestOwnershipClaim; struct OwnershipTransferEvent; struct MountRequest; struct NewPackageRequest; struct RequestRespawn; struct SyncExperienceRequest; struct DialogueRequest; struct SubtitleRequest; /** * @brief Manages player and actor state. */ struct CharacterService { CharacterService(World& aWorld, entt::dispatcher& aDispatcher) noexcept; ~CharacterService() noexcept = default; TP_NOCOPYMOVE(CharacterService); static void Serialize(World& aRegistry, entt::entity aEntity, CharacterSpawnRequest* apSpawnRequest) noexcept; protected: void OnUpdate(const UpdateEvent& acEvent) const noexcept; void OnCharacterExteriorCellChange(const CharacterExteriorCellChangeEvent& acEvent) const noexcept; void OnCharacterInteriorCellChange(const CharacterInteriorCellChangeEvent& acEvent) const noexcept; void OnAssignCharacterRequest(const PacketEvent& acMessage) const noexcept; void OnOwnershipTransferRequest(const PacketEvent& acMessage) const noexcept; void OnOwnershipTransferEvent(const OwnershipTransferEvent& acEvent) const noexcept; void OnOwnershipClaimRequest(const PacketEvent& acMessage) const noexcept; void OnCharacterRemoveEvent(const CharacterRemoveEvent& acEvent) const noexcept; void OnCharacterSpawned(const CharacterSpawnedEvent& acEvent) const noexcept; void OnReferencesMoveRequest(const PacketEvent& acMessage) const noexcept; void OnFactionsChanges(const PacketEvent& acMessage) const noexcept; void OnMountRequest(const PacketEvent& acMessage) const noexcept; void OnNewPackageRequest(const PacketEvent& acMessage) const noexcept; void OnRequestRespawn(const PacketEvent& acMessage) const noexcept; void OnSyncExperienceRequest(const PacketEvent& acMessage) const noexcept; void OnDialogueRequest(const PacketEvent& acMessage) const noexcept; void OnSubtitleRequest(const PacketEvent& acMessage) const noexcept; void CreateCharacter(const PacketEvent& acMessage) const noexcept; void TransferOwnership(Player* apPlayer, const uint32_t acServerId, const ActorData& acActorData) const noexcept; ActorData BuildActorData(const entt::entity acEntity) const noexcept; void ApplyActorData(const entt::entity acEntity, const ActorData& acActorData) const noexcept; void BroadcastActorData(Player* apPlayer, const entt::entity acEntity, const ActorData& acActorData) const noexcept; void ProcessFactionsChanges() const noexcept; void ProcessMovementChanges() const noexcept; private: World& m_world; entt::scoped_connection m_updateConnection; entt::scoped_connection m_exteriorCellChangeEventConnection; entt::scoped_connection m_interiorCellChangeEventConnection; entt::scoped_connection m_characterAssignRequestConnection; entt::scoped_connection m_transferOwnershipConnection; entt::scoped_connection m_ownershipTransferEventConnection; entt::scoped_connection m_claimOwnershipConnection; entt::scoped_connection m_removeCharacterConnection; entt::scoped_connection m_characterSpawnedConnection; entt::scoped_connection m_referenceMovementSnapshotConnection; entt::scoped_connection m_factionsChangesConnection; entt::scoped_connection m_mountConnection; entt::scoped_connection m_newPackageConnection; entt::scoped_connection m_requestRespawnConnection; entt::scoped_connection m_syncExperienceConnection; entt::scoped_connection m_dialogueConnection; entt::scoped_connection m_subtitleConnection; };