#pragma once #include "Structs/Inventory.h" #include "Structs/ActorData.h" struct ActorAddedEvent; struct ActorRemovedEvent; struct UpdateEvent; struct ConnectedEvent; struct DisconnectedEvent; struct EquipmentChangeEvent; struct FormIdComponent; struct ActionEvent; struct AssignCharacterResponse; struct CharacterSpawnRequest; struct ServerReferencesMoveRequest; struct NotifyInventoryChanges; struct NotifyFactionsChanges; struct NotifyRemoveCharacter; struct NotifySpawnData; struct NotifyOwnershipTransfer; struct SpellCastEvent; struct NotifySpellCast; struct InterruptCastEvent; struct NotifyInterruptCast; struct AddTargetEvent; struct NotifyAddTarget; struct ProjectileLaunchedEvent; struct NotifyProjectileLaunch; struct MountEvent; struct NotifyMount; struct InitPackageEvent; struct NotifyNewPackage; struct NotifyRespawn; struct BeastFormChangeEvent; struct AddExperienceEvent; struct NotifySyncExperience; struct DialogueEvent; struct NotifyDialogue; struct SubtitleEvent; struct NotifySubtitle; struct NotifyActorTeleport; struct NotifyRelinquishControl; struct PartyJoinedEvent; struct Actor; struct World; struct TransportService; /** * @brief Handles actors and players. */ struct CharacterService { CharacterService(World& aWorld, entt::dispatcher& aDispatcher, TransportService& aTransport) noexcept; ~CharacterService() noexcept = default; TP_NOCOPYMOVE(CharacterService); static void DeleteTempActor(const uint32_t aFormId) noexcept; bool TakeOwnership(const uint32_t acFormId, const uint32_t acServerId, const entt::entity acEntity) const noexcept; void OnActorAdded(const ActorAddedEvent& acEvent) noexcept; void OnActorRemoved(const ActorRemovedEvent& acEvent) noexcept; void OnUpdate(const UpdateEvent& acUpdateEvent) noexcept; void OnConnected(const ConnectedEvent& acConnectedEvent) const noexcept; void OnDisconnected(const DisconnectedEvent& acDisconnectedEvent) const noexcept; void OnAssignCharacter(const AssignCharacterResponse& acMessage) noexcept; void OnCharacterSpawn(const CharacterSpawnRequest& acMessage) const noexcept; void OnReferencesMoveRequest(const ServerReferencesMoveRequest& acMessage) const noexcept; void OnActionEvent(const ActionEvent& acActionEvent) const noexcept; void OnFactionsChanges(const NotifyFactionsChanges& acEvent) const noexcept; void OnOwnershipTransfer(const NotifyOwnershipTransfer& acMessage) const noexcept; void OnRemoveCharacter(const NotifyRemoveCharacter& acMessage) const noexcept; void OnRemoteSpawnDataReceived(const NotifySpawnData& acEvent) noexcept; void OnMountEvent(const MountEvent& acEvent) const noexcept; void OnNotifyMount(const NotifyMount& acMessage) const noexcept; void OnInitPackageEvent(const InitPackageEvent& acEvent) const noexcept; void OnNotifyNewPackage(const NotifyNewPackage& acMessage) const noexcept; void OnNotifyRespawn(const NotifyRespawn& acMessage) const noexcept; void OnBeastFormChange(const BeastFormChangeEvent& acEvent) const noexcept; void OnAddExperienceEvent(const AddExperienceEvent& acEvent) noexcept; void OnNotifySyncExperience(const NotifySyncExperience& acMessage) noexcept; void OnDialogueEvent(const DialogueEvent& acEvent) noexcept; void OnNotifyDialogue(const NotifyDialogue& acMessage) noexcept; void OnSubtitleEvent(const SubtitleEvent& acEvent) noexcept; void OnNotifySubtitle(const NotifySubtitle& acMessage) noexcept; void OnNotifyActorTeleport(const NotifyActorTeleport& acMessage) noexcept; void OnNotifyRelinquishControl(const NotifyRelinquishControl& acMessage) noexcept; void OnPartyJoinedEvent(const PartyJoinedEvent& acEvent) noexcept; void ProcessNewEntity(entt::entity aEntity) const noexcept; private: void MoveActor(const Actor* apActor, const GameId& acWorldSpaceId, const GameId& acCellId, const Vector3_NetQuantize& acPosition) const noexcept; void RequestServerAssignment(entt::entity aEntity) const noexcept; void CancelServerAssignment(entt::entity aEntity, uint32_t aFormId) const noexcept; void DeleteRemoteEntityComponents(entt::entity aEntity) const noexcept; Actor* CreateCharacterForEntity(entt::entity aEntity) const noexcept; ActorData BuildActorData(Actor* apActor) const noexcept; void RunLocalUpdates() const noexcept; void RunRemoteUpdates() noexcept; void RunFactionsUpdates() const noexcept; void RunSpawnUpdates() const noexcept; void RunExperienceUpdates() noexcept; void ApplyCachedWeaponDraws(const UpdateEvent& acUpdateEvent) noexcept; World& m_world; entt::dispatcher& m_dispatcher; TransportService& m_transport; float m_cachedExperience = 0.f; // TODO: revamp this, read the local anim var like vampire lord? struct WeaponDrawData { WeaponDrawData() = default; WeaponDrawData(bool aDrawWeapon) : m_drawWeapon(aDrawWeapon) { } double m_timer = 0.0; bool m_drawWeapon = false; bool m_isFirstPass = true; }; Map m_weaponDrawUpdates{}; entt::scoped_connection m_referenceAddedConnection; entt::scoped_connection m_referenceRemovedConnection; entt::scoped_connection m_updateConnection; entt::scoped_connection m_actionConnection; entt::scoped_connection m_factionsConnection; entt::scoped_connection m_ownershipTransferConnection; entt::scoped_connection m_removeCharacterConnection; entt::scoped_connection m_connectedConnection; entt::scoped_connection m_disconnectedConnection; entt::scoped_connection m_assignCharacterConnection; entt::scoped_connection m_characterSpawnConnection; entt::scoped_connection m_referenceMovementSnapshotConnection; entt::scoped_connection m_remoteSpawnDataReceivedConnection; entt::scoped_connection m_mountConnection; entt::scoped_connection m_notifyMountConnection; entt::scoped_connection m_initPackageConnection; entt::scoped_connection m_newPackageConnection; entt::scoped_connection m_notifyRespawnConnection; entt::scoped_connection m_beastFormChangeConnection; entt::scoped_connection m_addExperienceEventConnection; entt::scoped_connection m_syncExperienceConnection; entt::scoped_connection m_dialogueEventConnection; entt::scoped_connection m_dialogueSyncConnection; entt::scoped_connection m_subtitleEventConnection; entt::scoped_connection m_subtitleSyncConnection; entt::scoped_connection m_actorTeleportConnection; entt::scoped_connection m_relinquishConnection; entt::scoped_connection m_partyJoinedConnection; };