F4MP/tiltedcode/Code/client/Services/CharacterService.h

162 lines
6.5 KiB
C
Raw Normal View History

#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<uint32_t, WeaponDrawData> 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;
};