mirror of
https://github.com/Jous99/F4MP.git
synced 2026-01-12 23:20:53 +01:00
161 lines
6.5 KiB
C++
161 lines
6.5 KiB
C++
#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;
|
|
};
|