class IAchievement; class IQuestState; class IQuest; class NPC; class AIZone; class AIZoneListener; class Spawner; class IFastTravel; class Projectile; class IUE4Actor; class ILocalPlayer; class IItem; class IPlayer; class IActor; class Actor; class Player; class GameAPI; class World; class TimerSet; struct LocationAndRotation; struct QuestStateInfo; struct PlayerQuestState; struct ItemAndCount; enum DamageType {PhysicalDamage, FireDamage, ColdDamage, ShockDamage}; enum ItemRarity {ResourceItem, NormalItem, RareItem, LegendaryItem, LeetItem}; enum NPCStateTransitionType {EndConversationTransition, ContinueConversationTransition, ShopTransition}; class TimerSet { public: struct TimerEvent { float timeLeft; float initialTime; bool recurring; bool withContext; std::function callback; std::function contextCallback; }; std::map m_timers; public: void Add(const std::string &, float, const std::function &); void AddWithContext(const std::string &, float, const std::function &); void AddRecurring(const std::string &, float, const std::function &); void AddRecurringWithContext(const std::string &, float, const std::function &); void Cancel(const std::string &); void Clear(); void Tick(Actor *, float); }; struct Vector3 { float x; float y; float z; public: Vector3(); Vector3(float, float, float); Vector3 operator*(float) const; Vector3 & operator*=(float); Vector3 operator+(const Vector3 &) const; Vector3 & operator+=(const Vector3 &); Vector3 operator-(const Vector3 &) const; Vector3 & operator-=(const Vector3 &); float MagnitudeSquared() const; float Magnitude() const; static float DistanceSquared(const Vector3 &, const Vector3 &); static float Distance(const Vector3 &, const Vector3 &); void Normalize(); static Vector3 Normalize(const Vector3 &); }; struct NPCStateTransition { const char* text; NPCStateTransitionType type; const char* nextState; }; struct NPCState { const char* text; std::vector transitions; }; struct ItemCountInfo { uint32_t count; uint32_t loadedAmmo; }; struct Rotation { float pitch; float yaw; float roll; public: Rotation(); Rotation(float, float, float); }; class Socket { public: const char* m_lastErrorMessage; public: virtual ~Socket(); virtual bool Read(void *, size_t); virtual bool Write(const void *, size_t); void ReadChecked(void *, size_t); uint8_t Read8(); uint16_t Read16(); uint32_t Read32(); uint64_t Read64(); const char* ReadString(); float ReadFloat(); Vector3 ReadVector(); Vector3 ReadVector16(); Rotation ReadRotation(); Rotation ReadPrecisionRotation(); float ReadSignedFraction(); const std::string & GetLastErrorMessage() const; }; class WriteStream { public: Socket *m_sock; std::vector m_buffer; public: WriteStream(Socket *); void SetSocket(Socket *); void Write8(uint8_t); void Write16(uint16_t); void Write32(uint32_t); void Write64(uint64_t); void WriteSaturated16(float); void WriteString(const std::string &); void WriteFloat(float); void WriteVector(const Vector3 &); void WriteVector16(const Vector3 &); void WriteRotation(const Rotation &); void WritePrecisionRotation(const Rotation &); void WriteSignedFraction(float); void Write(const WriteStream &); void Write(const void *, size_t); void Flush(); void Clear(); }; class IAchievement { public: virtual const char * GetName(); virtual const char * GetDisplayName(); virtual const char * GetDescription(); }; struct LocationAndRotation { Vector3 location; Rotation rotation; }; class IQuestState { public: virtual const char * GetName(); virtual const char * GetDescription(); virtual void CheckForEarlyCompletion(IPlayer *); virtual void OnItemAcquired(IPlayer *, IItem *); virtual void OnItemPickupUsed(IPlayer *, const char *); }; class IQuest { public: virtual const char * GetName(); virtual const char * GetDescription(); virtual IQuestState * GetStartingState(); virtual IQuestState * GetStateByName(const char *); }; struct QuestStateInfo { const char* state; uint32_t count; }; struct PlayerQuestState { IQuestState *state; uint32_t count; }; template struct ActorRef { T *m_object; ActorRef(); ActorRef(T *); ActorRef(const ActorRef &); ActorRef & operator=(T *); ActorRef & operator=(const ActorRef &); T * operator->() const; T * Get() const; bool operator<(const ActorRef &) const; }; //WriteStream /* template< typename IActor> struct ActorRef { IActor *m_object; }; template< typename IPlayer> struct ActorRef { IPlayer *m_object; }; template< typename NPC> struct ActorRef { NPC *m_object; }; template< typename Bear> struct ActorRef { Bear *m_object; }; template< typename BearChest> struct ActorRef { BearChest *m_object; };*/ class IActor { public: virtual ~IActor(); virtual void * GetUE4Actor(); virtual bool IsNPC(); virtual bool IsPlayer(); virtual IPlayer * GetPlayerInterface(); virtual void AddRef(); virtual void Release(); virtual void OnSpawnActor(IUE4Actor *); virtual void OnDestroyActor(); virtual const char * GetBlueprintName(); virtual bool IsCharacter(); virtual bool CanBeDamaged(IActor *); virtual int32_t GetHealth(); virtual int32_t GetMaxHealth(); virtual void Damage(IActor *, IItem *, int32_t, DamageType); virtual void Tick(float); virtual bool CanUse(IPlayer *); virtual void OnUse(IPlayer *); virtual void OnHit(IActor *, const Vector3 &, const Vector3 &); virtual void OnAIMoveComplete(); virtual const char * GetDisplayName(); virtual bool IsElite(); virtual bool IsPvPEnabled(); virtual IItem ** GetShopItems(size_t &); virtual void FreeShopItems(IItem **); virtual int32_t GetBuyPriceForItem(IItem *); virtual int32_t GetSellPriceForItem(IItem *); virtual Vector3 GetLookPosition(); virtual Rotation GetLookRotation(); virtual IActor * GetOwner(); }; class Actor : public IActor { public: size_t m_refs; uint32_t m_id; IUE4Actor *m_target; TimerSet *m_timers; const char* m_blueprintName; ActorRef m_owner; int32_t m_health; std::map m_states; float m_forwardMovementFraction; float m_strafeMovementFraction; Vector3 m_remotePosition; Vector3 m_remoteVelocity; Rotation m_remoteRotation; float m_remoteLocationBlendFactor; Spawner *m_spawner; virtual void OnKilled(IActor *, IItem *); virtual void OnTargetKilled(IActor *, IItem *); public: Actor(const std::string &); virtual ~Actor(); virtual bool IsValid() const; virtual void * GetUE4Actor(); virtual void AddRef(); virtual void Release(); void RemoveFromWorld(); virtual void OnSpawnActor(IUE4Actor *); virtual void OnDestroyActor(); virtual const char * GetDeathMessage(); virtual const char * GetBlueprintName(); virtual bool IsCharacter(); virtual bool IsNPC(); virtual bool IsProjectile(); virtual bool IsPlayer(); virtual IPlayer * GetPlayerInterface(); virtual bool ShouldSendPositionUpdates(); virtual bool ShouldReceivePositionUpdates(); uint32_t GetId() const; void SetId(uint32_t); Vector3 GetPosition(); Vector3 GetProjectilePosition(); virtual Vector3 GetLookPosition(); Rotation GetRotation(); virtual Rotation GetLookRotation(); Vector3 GetVelocity(); float GetForwardMovementFraction() const; float GetStrafeMovementFraction() const; bool IsOnGround(); void SetPosition(const Vector3 &); void SetRotation(const Rotation &); void SetVelocity(const Vector3 &); void SetForwardAndStrafeMovement(float, float); void SetRemotePositionAndRotation(const Vector3 &, const Rotation &); void InterpolateRemotePosition(float); virtual IActor * GetOwner(); void LocalRespawn(const Vector3 &, const Rotation &); bool MoveToLocation(const Vector3 &); bool MoveToRandomLocationInRadius(float); bool MoveToActor(IActor *); bool GetState(const std::string &); //virtual void UpdateState(const std::string &, bool); //virtual void TriggerEvent(std::__cxx11::basic_string, std::allocator > const&, IActor*, bool); //virtual void TriggerEvent(const std::string &, IActor *, bool); const std::map & GetStates(); IActor * LineTraceTo(const Vector3 &); void FireBullets(IItem *, int32_t, DamageType, float, uint32_t, float); void FireBullets(IItem *, int32_t, DamageType, const Vector3 &, float, uint32_t, float); virtual bool CanBeDamaged(IActor *); virtual float GetMaximumDamageDistance(); virtual int32_t GetHealth(); virtual int32_t GetMaxHealth(); virtual void Damage(IActor *, IItem *, int32_t, DamageType); void PerformSetHealth(int32_t); virtual void Tick(float); virtual bool CanUse(IPlayer *); virtual void OnUse(IPlayer *); virtual void PerformUse(IPlayer *); virtual void OnHit(IActor *, const Vector3 &, const Vector3 &); virtual void OnAIMoveComplete(); virtual const char * GetDisplayName(); virtual bool IsElite(); virtual bool IsPvPEnabled(); virtual IItem ** GetShopItems(size_t &); virtual std::vector > GetShopItems(); virtual void FreeShopItems(IItem **); virtual std::vector > GetValidBuyItems(); virtual float GetShopBuyPriceMultiplier(); virtual float GetShopSellPriceMultiplier(); virtual int32_t GetBuyPriceForItem(IItem *); virtual int32_t GetSellPriceForItem(IItem *); void SetSpawner(Spawner *); void AddTimer(const std::string &, float, const std::function &); void AddTimerWithContext(const std::string &, float, const std::function &); void AddRecurringTimer(const std::string &, float, const std::function &); void AddRecurringTimerWithContext(const std::string &, float, const std::function &); void CancelTimer(const std::string &); void PerformReloadNotification(uint32_t); }; class NPC : public Actor { public: std::map m_states; public: NPC(const std::string &); virtual bool IsNPC(); void AddState(const std::string &, const std::string &); void AddStateTransition(const std::string &, const std::string &, const std::string &); void AddStateTransitionToEnd(const std::string &, const std::string &); void AddStateTransitionToShop(const std::string &, const std::string &); const char* GetTextForState(const std::string &); std::vector GetTransitionsForState(const std::string &); virtual std::string GetInitialState(IPlayer *); virtual void OnTransitionTaken(IPlayer *, const std::string &, const std::string &); virtual bool CanUse(IPlayer *); virtual void PerformUse(IPlayer *); virtual int32_t GetBuyPriceForItem(IItem *); virtual int32_t GetSellPriceForItem(IItem *); }; class IInventory { public: virtual ~IInventory(); virtual size_t GetCount(); virtual IItem * GetItem(size_t); virtual uint32_t GetItemCount(size_t); virtual uint32_t GetItemLoadedAmmo(size_t); virtual void Destroy(); }; struct ItemAndCount { IItem *item; uint32_t count; uint32_t loadedAmmo; }; class AIZone { public: const char* m_name; size_t m_playerCount; std::set, std::allocator > m_listeners; public: AIZone(const std::string &); const std::string & GetName() const; bool IsActive() const; void OnPlayerEntered(); void OnPlayerLeft(); void AddListener(AIZoneListener *); void RemoveListener(AIZoneListener *); }; class AIZoneListener { public: AIZone *m_zone; public: AIZoneListener(); virtual ~AIZoneListener(); void SetAIZone(const std::string &); virtual void OnAIZoneActivated(); virtual void OnAIZoneDeactivated(); bool IsAIZoneActive(); }; class Spawner : public AIZoneListener { public: std::vector m_actors; Vector3 m_position; Rotation m_rotation; size_t m_maxActors; float m_maxSpawnTimer; float m_currentSpawnTimer; public: Spawner(const std::string &, const Vector3 &, const Rotation &, size_t, float); virtual void OnAIZoneActivated(); virtual void OnAIZoneDeactivated(); virtual void Tick(float); virtual Actor * Spawn(); void RemoveActor(Actor *); virtual size_t GetMaxActors(); virtual float GetSpawnTimer(); }; class IFastTravel { public: virtual ~IFastTravel(); virtual size_t GetCount(); virtual const char * GetRegionName(size_t); virtual const char * GetDisplayName(size_t); virtual void Destroy(); }; class Projectile : public Actor { public: IItem *m_item; float m_lifetime; public: Projectile(IActor *, IItem *, const std::string &); virtual bool ShouldSendPositionUpdates(); virtual bool IsProjectile(); virtual int32_t GetDirectDamage(); virtual DamageType GetDamageType(); virtual bool HasSplashDamage(); virtual float GetSplashRadius(); virtual int32_t GetSplashDamage(); virtual bool DamagesOnHit(); IItem * GetItem() const; virtual void OnHit(IActor *, const Vector3 &, const Vector3 &); void DealDamage(IActor *); virtual void Tick(float); virtual void OnLifetimeEnded(); static bool SpawnProjectile(IActor *, Projectile *); }; class IUE4Actor { public: virtual void * GetUE4Actor(); virtual void RemoveFromWorld(); virtual Vector3 GetPosition(); virtual Rotation GetRotation(); virtual Vector3 GetProjectilePosition(); virtual Vector3 GetCharacterVelocity(); virtual void SetPosition(const Vector3 &); virtual void SetRotation(const Rotation &); virtual void SetCharacterVelocity(const Vector3 &); virtual void SetForwardAndStrafeMovement(float, float); virtual void InterpolatePositionAndRotation(const Vector3 &, const Rotation &, float, float); virtual bool MoveToLocation(const Vector3 &); virtual bool MoveToRandomLocationInRadius(float); virtual bool MoveToActor(IActor *); virtual void OnUpdateState(const char *, bool); virtual void OnTriggerEvent(const char *, IActor *); virtual void OnUpdatePvPEnabled(bool); virtual IActor * LineTraceTo(const Vector3 &); virtual void FireBullets(IItem *, int32_t, DamageType, const Vector3 &, uint32_t, float); virtual void LocalRespawn(const Vector3 &, const Rotation &); virtual bool IsOnGround(); virtual void OnReload(uint32_t); }; class ILocalPlayer : public IUE4Actor { public: virtual void SetPlayerInterface(IPlayer *); virtual Vector3 GetLookPosition(); virtual Rotation GetLookRotation(); virtual float GetForwardMovementFraction(); virtual float GetStrafeMovementFraction(); virtual void SetCurrentQuest(IQuest *, IQuestState *, uint32_t); virtual void DisplayMessage(const char *, const char *); virtual void DisplayEvent(const char *, const char *); virtual void OnEquip(size_t, IItem *); virtual void OnChangeSlot(size_t); virtual void OnUpdateCountdown(int32_t); virtual void OnUpdatePvPCountdown(bool, int32_t); virtual void OnNewItem(const char *, uint32_t); virtual void OnNPCConversationState(IActor *, const char *, const char **, const char **, size_t); virtual void OnNPCConversationEnd(); virtual void OnNPCShop(IActor *); virtual void OnChatMessage(const char *, bool, const char *); virtual void OnPlayerKillMessage(const char *, bool, const char *, bool, IItem *); virtual void OnPlayerSuicideMessage(const char *, bool, IItem *); virtual void OnPlayerDeadMessage(const char *, bool, const char *); virtual void OnAchievement(const char *); virtual void OnLocalDeath(IActor *, IItem *); }; class IItem { public: virtual ~IItem(); virtual const char * GetName(); virtual const char * GetDisplayName(); virtual const char * GetItemTypeName(); virtual const char * GetDescription(); virtual const char * GetFlavorText(); virtual bool CanEquip(); virtual uint32_t GetMaximumCount(); virtual bool CanActivate(IPlayer *); virtual bool CanActivateInInventory(); virtual void Activate(IPlayer *); virtual bool ShowInInventory(); virtual bool ShowEventOnPickup(); virtual bool ShowEventOnDuplicatePickup(); virtual bool ShowNotificationOnPickup(); virtual float GetCooldownTime(); virtual ItemRarity GetItemRarity(); virtual IItem * GetAmmoType(); virtual uint32_t GetClipSize(); virtual int32_t GetDamage(); virtual int32_t GetDamagePerSecond(); virtual DamageType GetDamageType(); virtual int32_t GetManaCost(); virtual const char * GetCustomCostDescription(); virtual bool IsAutoFire(); virtual uint32_t GetNumberOfProjectiles(); virtual float GetReloadTime(int32_t); virtual bool HasPartialReload(); virtual float GetRange(); virtual int32_t GetTradeValue(); virtual bool IsDynamic(); virtual bool IsUpdating(); }; class IPlayer { public: int32_t m_mana; virtual IActor * GetActorInterface(); void AddRef(); void Release(); virtual bool IsLocalPlayer() const; virtual ILocalPlayer * GetLocalPlayer() const; virtual const char * GetPlayerName(); virtual const char * GetTeamName(); virtual uint8_t GetAvatarIndex(); virtual const uint32_t * GetColors(); virtual bool IsPvPDesired(); virtual void SetPvPDesired(bool); virtual IInventory * GetInventory(); virtual uint32_t GetItemCount(IItem *); virtual uint32_t GetLoadedAmmo(IItem *); virtual bool AddItem(IItem *, uint32_t, bool); virtual bool RemoveItem(IItem *, uint32_t); virtual bool AddLoadedAmmo(IItem *, IItem *, uint32_t); virtual bool RemoveLoadedAmmo(IItem *, uint32_t); virtual IItem * GetItemForSlot(size_t); virtual void EquipItem(size_t, IItem *); virtual size_t GetCurrentSlot(); virtual void SetCurrentSlot(size_t); virtual IItem * GetCurrentItem(); virtual int32_t GetMana(); virtual bool UseMana(int32_t); virtual void SetItemCooldown(IItem *, float, bool); virtual bool IsItemOnCooldown(IItem *); virtual float GetItemCooldown(IItem *); virtual bool HasPickedUp(const char *); virtual void MarkAsPickedUp(const char *); virtual IQuest ** GetQuestList(size_t *); virtual void FreeQuestList(IQuest **); virtual IQuest * GetCurrentQuest(); virtual void SetCurrentQuest(IQuest *); virtual PlayerQuestState GetStateForQuest(IQuest *); virtual void StartQuest(IQuest *); virtual void AdvanceQuestToState(IQuest *, IQuestState *); virtual void CompleteQuest(IQuest *); virtual bool IsQuestStarted(IQuest *); virtual bool IsQuestCompleted(IQuest *); virtual void EnterAIZone(const char *); virtual void ExitAIZone(const char *); virtual void UpdateCountdown(int32_t); void HideCountdown(); virtual bool CanReload(); virtual void RequestReload(); virtual float GetWalkingSpeed(); virtual float GetSprintMultiplier(); virtual float GetJumpSpeed(); virtual float GetJumpHoldTime(); virtual bool CanJump(); virtual void SetJumpState(bool); virtual void SetSprintState(bool); virtual void SetFireRequestState(bool); virtual void TransitionToNPCState(const char *); virtual void BuyItem(IActor *, IItem *, uint32_t); virtual void SellItem(IActor *, IItem *, uint32_t); virtual void EnterRegion(const char *); virtual void Respawn(); virtual void Teleport(const char *); virtual void Chat(const char *); virtual IFastTravel * GetFastTravelDestinations(const char *); virtual void FastTravel(const char *, const char *); virtual void MarkAsAchieved(IAchievement *); virtual bool HasAchieved(IAchievement *); virtual void SubmitDLCKey(const char *); virtual uint32_t GetCircuitInputs(const char *); virtual void SetCircuitInputs(const char *, uint32_t); virtual void GetCircuitOutputs(const char *, bool *, size_t); }; class Player : public Actor, public IPlayer { public: uint32_t m_characterId; const char* m_playerName; const char* m_teamName; uint8_t m_avatarIndex; uint32_t m_colors[4]; std::map, std::allocator > > m_inventory; std::set,std::less >,std::allocator > > m_pickups; std::map, std::allocator > > m_cooldowns; std::map,unsigned int,std::less >,std::allocator,unsigned int> > > m_circuitInputs; std::map,std::vector >,std::less >,std::allocator,std::vector > > > > m_circuitOutputs; bool m_admin; bool m_pvpEnabled; bool m_pvpDesired; float m_pvpChangeTimer; int32_t m_pvpChangeReportedTimer; bool m_changingServerRegion; const char* m_currentRegion; const char* m_changeRegion; std::set m_aiZones; int32_t m_mana; float m_manaRegenTimer; float m_healthRegenCooldown; float m_healthRegenTimer; int32_t m_countdown; Vector3 m_remoteLookPosition; Rotation m_remoteLookRotation; IItem *m_equipped[10]; size_t m_currentSlot; std::map, std::allocator > > m_questStates; IQuest *m_currentQuest; float m_walkingSpeed; float m_jumpSpeed; float m_jumpHoldTime; ActorRef m_currentNPC; const char* m_currentNPCState; ILocalPlayer *m_localPlayer; WriteStream *m_eventsToSend; bool m_itemsUpdated; float m_itemSyncTimer; uint32_t m_chatMessageCounter; float m_chatFloodDecayTimer; IItem *m_lastHitByItem; float m_lastHitItemTimeLeft; float m_circuitStateCooldownTimer; protected: virtual void OnKilled(IActor *, IItem *); public: Player(bool); virtual ~Player(); virtual bool IsPlayer(); virtual IPlayer * GetPlayerInterface(); virtual IActor * GetActorInterface(); virtual bool CanBeDamaged(IActor *); virtual bool IsCharacter(); virtual bool ShouldSendPositionUpdates(); virtual bool ShouldReceivePositionUpdates(); virtual void Tick(float); virtual void Damage(IActor *, IItem *, int32_t, DamageType); virtual void OnDestroyActor(); void OnKillEvent(IPlayer *, IActor *, IItem *); virtual Vector3 GetLookPosition(); virtual Rotation GetLookRotation(); void SetRemoteLookPosition(const Vector3 &); void SetRemoteLookRotation(const Rotation &); virtual bool CanJump(); virtual bool IsLocalPlayer() const; virtual ILocalPlayer * GetLocalPlayer() const; void InitLocalPlayer(ILocalPlayer *); bool IsAdmin() const; void SetPlayerName(const std::string &); void SetTeamName(const std::string &); void SetAvatarIndex(uint8_t); void SetColors(const uint32_t *); void SetCharacterId(uint32_t); virtual bool IsPvPEnabled(); virtual bool IsPvPDesired(); virtual void SetPvPDesired(bool); void PerformSetPvPEnabled(bool); void PerformSetPvPDesired(bool); void PerformUpdatePvPCountdown(bool, int32_t); virtual void UpdateState(const std::string &, bool); virtual const char * GetPlayerName(); virtual const char * GetTeamName(); virtual uint8_t GetAvatarIndex(); virtual const uint32_t * GetColors(); uint32_t GetCharacterId() const; const std::map, std::allocator > > & GetItemList() const; virtual IInventory * GetInventory(); virtual uint32_t GetItemCount(IItem *); virtual uint32_t GetLoadedAmmo(IItem *); virtual bool AddItem(IItem *, uint32_t, bool); virtual bool RemoveItem(IItem *, uint32_t); bool PerformAddItem(IItem *, uint32_t, bool); bool PerformRemoveItem(IItem *, uint32_t); virtual bool AddLoadedAmmo(IItem *, IItem *, uint32_t); virtual bool RemoveLoadedAmmo(IItem *, uint32_t); void PerformSetLoadedAmmo(IItem *, uint32_t); virtual IItem * GetItemForSlot(size_t); virtual void EquipItem(size_t, IItem *); void PerformEquipItem(size_t, IItem *); virtual size_t GetCurrentSlot(); virtual IItem * GetCurrentItem(); virtual void SetCurrentSlot(size_t); void PerformSetCurrentSlot(size_t); void SetRemoteItem(IItem *); virtual int32_t GetMana(); virtual bool UseMana(int32_t); void PerformSetMana(int32_t); virtual void SetItemCooldown(IItem *, float, bool); virtual bool IsItemOnCooldown(IItem *); virtual float GetItemCooldown(IItem *); virtual bool HasPickedUp(const char *); virtual void MarkAsPickedUp(const char *); void PerformMarkAsPickedUp(const std::string &); virtual IQuest ** GetQuestList(size_t *); virtual void FreeQuestList(IQuest **); virtual IQuest * GetCurrentQuest(); virtual PlayerQuestState GetStateForQuest(IQuest *); virtual bool IsQuestStarted(IQuest *); virtual bool IsQuestCompleted(IQuest *); virtual void SetCurrentQuest(IQuest *); virtual void StartQuest(IQuest *); virtual void AdvanceQuestToState(IQuest *, IQuestState *); virtual void CompleteQuest(IQuest *); void PerformSetCurrentQuest(IQuest *); void PerformStartQuest(IQuest *); void PerformAdvanceQuestToState(IQuest *, IQuestState *); void PerformCompleteQuest(IQuest *); void SetInitialQuestStates(const std::map &, const std::string &); void SetInitialItemState(const std::map &, const std::vector &, uint8_t); void SetInitialPickupState(const std::set &); virtual void EnterAIZone(const char *); virtual void ExitAIZone(const char *); virtual void UpdateCountdown(int32_t); void PerformUpdateCountdown(int32_t); virtual void TriggerEvent(const std::string &, IActor *, bool); virtual bool CanReload(); virtual void RequestReload(); void PerformRequestReload(); virtual float GetWalkingSpeed(); virtual float GetSprintMultiplier(); virtual float GetJumpSpeed(); virtual float GetJumpHoldTime(); virtual void SetJumpState(bool); virtual void SetSprintState(bool); virtual void SetFireRequestState(bool); void SetCurrentNPCState(NPC *, const std::string &); void EndNPCConversation(); void EnterNPCShop(NPC *); NPC * GetCurrentNPC() const; const std::string & GetCurrentNPCState() const; virtual void TransitionToNPCState(const char *); void PerformTransitionToNPCState(const std::string &); virtual void BuyItem(IActor *, IItem *, uint32_t); void PerformBuyItem(IActor *, IItem *, uint32_t); virtual void SellItem(IActor *, IItem *, uint32_t); void PerformSellItem(IActor *, IItem *, uint32_t); virtual void EnterRegion(const char *); bool IsChangingRegion() const; const std::string & GetChangeRegionDestination() const; void PerformEnterRegion(const std::string &); LocationAndRotation GetSpawnLocation(); virtual void Respawn(); void PerformRespawn(); void PerformRespawnAtLocation(const Vector3 &, const Rotation &); virtual void Teleport(const char *); void PerformTeleport(const std::string &); virtual void SendEvent(const WriteStream &); virtual void WriteAllEvents(WriteStream &); void SyncItems(); virtual void Chat(const char *); void PerformChat(const std::string &); void ReceiveChat(Player *, const std::string &); virtual IFastTravel * GetFastTravelDestinations(const char *); virtual void FastTravel(const char *, const char *); void PerformFastTravel(const std::string &, const std::string &); void OnTravelComplete(const std::string &); IItem * GetLastHitByItem() const; void PerformSetLastHitByItem(IItem *); virtual void MarkAsAchieved(IAchievement *); virtual bool HasAchieved(IAchievement *); virtual void SubmitDLCKey(const char *); void PerformSubmitDLCKey(const std::string &); virtual uint32_t GetCircuitInputs(const char *); virtual void SetCircuitInputs(const char *, uint32_t); void PerformSetCircuitInputs(const std::string &, uint32_t); virtual void GetCircuitOutputs(const char *, bool *, size_t); void PerformSetCircuitOutputs(const std::string &, std::vector); void InitCircuitStates(); }; class World { public: std::set> m_players; std::set> m_actors; std::map> m_actorsById; ILocalPlayer *m_localPlayer; uint32_t m_nextId; std::map, std::allocator > > m_aiZones; void AddActorToWorld(Actor *); void AddActorToWorldWithId(uint32_t, Actor *); void SendEventToAllPlayers(const WriteStream &); void SendEventToAllPlayersExcept(Player *, const WriteStream &); public: World(); virtual ~World(); virtual void Tick(float); virtual bool HasLocalPlayer(); ILocalPlayer * GetLocalPlayer(); virtual bool IsAuthority(); virtual void AddLocalPlayer(Player *, ILocalPlayer *); virtual void AddRemotePlayer(Player *); virtual void AddRemotePlayerWithId(uint32_t, Player *); virtual void RemovePlayer(Player *); virtual void Use(Player *, Actor *); virtual void Activate(Player *, IItem *); virtual void Reload(Player *); virtual void Jump(bool); virtual void Sprint(bool); virtual void FireRequest(bool); virtual void TransitionToNPCState(Player *, const std::string &); virtual void BuyItem(Player *, Actor *, IItem *, uint32_t); virtual void SellItem(Player *, Actor *, IItem *, uint32_t); virtual void Respawn(Player *); virtual void Teleport(Player *, const std::string &); virtual void Chat(Player *, const std::string &); virtual void FastTravel(Player *, const std::string &, const std::string &); virtual void SetPvPDesired(Player *, bool); virtual void SubmitDLCKey(Player *, const std::string &); virtual void SetCircuitInputs(Player *, const std::string &, uint32_t); virtual void SendAddItemEvent(Player *, IItem *, uint32_t); virtual void SendRemoveItemEvent(Player *, IItem *, uint32_t); virtual void SendLoadedAmmoEvent(Player *, IItem *, uint32_t); virtual void SendPickedUpEvent(Player *, const std::string &); virtual void EquipItem(Player *, uint8_t, IItem *); virtual void SetCurrentSlot(Player *, uint8_t); virtual void SendEquipItemEvent(Player *, uint8_t, IItem *); virtual void SendCurrentSlotEvent(Player *, uint8_t); virtual void SetCurrentQuest(Player *, IQuest *); virtual void SendSetCurrentQuestEvent(Player *, IQuest *); virtual void SendStartQuestEvent(Player *, IQuest *); virtual void SendAdvanceQuestToStateEvent(Player *, IQuest *, IQuestState *); virtual void SendCompleteQuestEvent(Player *, IQuest *); virtual void SendHealthUpdateEvent(Actor *, int32_t); virtual void SendManaUpdateEvent(Player *, int32_t); virtual void SendCountdownUpdateEvent(Player *, int32_t); virtual void SendPvPCountdownUpdateEvent(Player *, bool, int32_t); virtual void SendPvPEnableEvent(Player *, bool); virtual void SendStateEvent(Actor *, const std::string &, bool); virtual void SendTriggerEvent(Actor *, const std::string &, Actor *, bool); virtual void SendFireBulletsEvent(Actor *, IItem *, const Vector3 &, uint32_t, float); virtual void SendDisplayEvent(Player *, const std::string &, const std::string &); virtual void SendNPCConversationStateEvent(Player *, Actor *, const std::string &); virtual void SendNPCConversationEndEvent(Player *); virtual void SendNPCShopEvent(Player *, Actor *); virtual void SendRespawnEvent(Player *, const Vector3 &, const Rotation &); virtual void SendTeleportEvent(Actor *, const Vector3 &, const Rotation &); virtual void SendRelativeTeleportEvent(Actor *, const Vector3 &); virtual void SendReloadEvent(Player *, IItem *, IItem *, uint32_t); virtual void SendPlayerJoinedEvent(Player *); virtual void SendPlayerLeftEvent(Player *); virtual void SendPlayerItemEvent(Player *); virtual void SendActorSpawnEvent(Actor *); virtual void SendActorDestroyEvent(Actor *); virtual void SendExistingPlayerEvent(Player *, Player *); virtual void SendExistingActorEvent(Player *, Actor *); virtual void SendChatEvent(Player *, const std::string &); virtual void SendKillEvent(Player *, Actor *, IItem *); virtual void SendCircuitOutputEvent(Player *, const std::string &, uint32_t, const std::vector &); virtual void SendActorPositionEvents(Player *); virtual void SendRegionChangeEvent(Player *, const std::string &); virtual void SendLastHitByItemEvent(Player *, IItem *); bool SpawnActor(Actor *, const Vector3 &, const Rotation &); bool SpawnActorAtNamedLocation(Actor *, const char *); void SpawnActorWithId(uint32_t, Actor *, const Vector3 &, const Rotation &); void DestroyActor(Actor *); void SendSpawnEventsForExistingActors(Player *); void AddAIZone(AIZone *); AIZone * GetAIZone(const std::string &); void OnPlayerEnteredAIZone(const std::string &); void OnPlayerLeftAIZone(const std::string &); std::vector > GetPlayersInRadius(const Vector3 &, float); std::vector > GetProjectilesInRadius(const Vector3 &, float); Actor * GetActorById(uint32_t); void RemoveAllActorsExceptPlayer(Player *); void ChangeActorId(Player *, uint32_t); bool IsPlayerAlreadyConnected(uint32_t); }; class ClientWorld : public World { public: ActorRef m_activePlayer; float m_timeUntilNextNetTick; public: ClientWorld(); virtual bool HasLocalPlayer(); virtual bool IsAuthority(); virtual void AddLocalPlayer(Player *, ILocalPlayer *); virtual void Tick(float); virtual void Use(Player *, Actor *); virtual void Activate(Player *, IItem *); virtual void Reload(Player *); virtual void Jump(bool); virtual void Sprint(bool); virtual void FireRequest(bool); virtual void TransitionToNPCState(Player *, const std::string &); virtual void BuyItem(Player *, Actor *, IItem *, uint32_t); virtual void SellItem(Player *, Actor *, IItem *, uint32_t); virtual void Respawn(Player *); virtual void Teleport(Player *, const std::string &); virtual void Chat(Player *, const std::string &); virtual void FastTravel(Player *, const std::string &, const std::string &); virtual void SetPvPDesired(Player *, bool); virtual void SubmitDLCKey(Player *, const std::string &); virtual void SetCircuitInputs(Player *, const std::string &, uint32_t); virtual void SendAddItemEvent(Player *, IItem *, uint32_t); virtual void SendRemoveItemEvent(Player *, IItem *, uint32_t); virtual void SendLoadedAmmoEvent(Player *, IItem *, uint32_t); virtual void SendPickedUpEvent(Player *, const std::string &); virtual void EquipItem(Player *, uint8_t, IItem *); virtual void SetCurrentSlot(Player *, uint8_t); virtual void SendEquipItemEvent(Player *, uint8_t, IItem *); virtual void SendCurrentSlotEvent(Player *, uint8_t); virtual void SetCurrentQuest(Player *, IQuest *); virtual void SendSetCurrentQuestEvent(Player *, IQuest *); virtual void SendStartQuestEvent(Player *, IQuest *); virtual void SendAdvanceQuestToStateEvent(Player *, IQuest *, IQuestState *); virtual void SendCompleteQuestEvent(Player *, IQuest *); virtual void SendHealthUpdateEvent(Actor *, int32_t); virtual void SendManaUpdateEvent(Player *, int32_t); virtual void SendCountdownUpdateEvent(Player *, int32_t); virtual void SendPvPCountdownUpdateEvent(Player *, bool, int32_t); virtual void SendPvPEnableEvent(Player *, bool); virtual void SendStateEvent(Actor *, const std::string &, bool); virtual void SendTriggerEvent(Actor *, const std::string &, Actor *, bool); virtual void SendFireBulletsEvent(Actor *, IItem *, const Vector3 &, uint32_t, float); virtual void SendDisplayEvent(Player *, const std::string &, const std::string &); virtual void SendNPCConversationStateEvent(Player *, Actor *, const std::string &); virtual void SendNPCConversationEndEvent(Player *); virtual void SendNPCShopEvent(Player *, Actor *); virtual void SendRespawnEvent(Player *, const Vector3 &, const Rotation &); virtual void SendTeleportEvent(Actor *, const Vector3 &, const Rotation &); virtual void SendRelativeTeleportEvent(Actor *, const Vector3 &); virtual void SendReloadEvent(Player *, IItem *, IItem *, uint32_t); virtual void SendPlayerJoinedEvent(Player *); virtual void SendPlayerLeftEvent(Player *); virtual void SendPlayerItemEvent(Player *); virtual void SendActorSpawnEvent(Actor *); virtual void SendActorDestroyEvent(Actor *); virtual void SendExistingPlayerEvent(Player *, Player *); virtual void SendExistingActorEvent(Player *, Actor *); virtual void SendChatEvent(Player *, const std::string &); virtual void SendKillEvent(Player *, Actor *, IItem *); virtual void SendCircuitOutputEvent(Player *, const std::string &, uint32_t, const std::vector &); virtual void SendActorPositionEvents(Player *); virtual void SendRegionChangeEvent(Player *, const std::string &); virtual void SendLastHitByItemEvent(Player *, IItem *); }; class Item : public IItem { public: Item(); virtual ~Item(); virtual bool CanEquip(); virtual uint32_t GetMaximumCount(); virtual bool CanActivate(IPlayer *); virtual void Activate(IPlayer *); virtual void PerformActivate(IPlayer *); virtual void LocalActivate(IPlayer *); virtual bool CanActivateInInventory(); virtual bool ShowInInventory(); virtual bool ShowEventOnPickup(); virtual bool ShowEventOnDuplicatePickup(); virtual bool ShowNotificationOnPickup(); virtual float GetCooldownTime(); virtual ItemRarity GetItemRarity(); virtual IItem * GetAmmoType(); virtual uint32_t GetClipSize(); virtual int32_t GetDamage(); virtual int32_t GetDamagePerSecond(); virtual DamageType GetDamageType(); virtual int32_t GetManaCost(); virtual const char * GetCustomCostDescription(); virtual bool IsAutoFire(); virtual uint32_t GetNumberOfProjectiles(); virtual float GetReloadTime(int32_t); virtual bool HasPartialReload(); virtual float GetRange(); virtual int32_t GetTradeValue(); virtual void Reset(); virtual void Update(); virtual bool IsDynamic(); virtual bool IsUpdating(); }; class ItemPickup : public Actor { private: IItem *m_item; std::string m_pickupName; public: ItemPickup(IItem *, const std::string &, const std::string &); IItem * GetItem() const; const std::string & GetPickupName() const; virtual bool CanUse(IPlayer *); virtual void PerformUse(IPlayer *); }; class BallmerPeakPoster : public Actor { public: BallmerPeakPoster(); virtual bool CanBeDamaged(IActor *); virtual void Damage(IActor *, IItem *, int32_t, DamageType); }; class BallmerPeakEgg : public ItemPickup { public: BallmerPeakEgg(); virtual bool CanUse(IPlayer *); }; class GoldenEgg : public Item { public: virtual bool ShowEventOnPickup(); virtual bool ShowEventOnDuplicatePickup(); virtual const char * GetName(); virtual const char * GetDisplayName(); virtual const char * GetItemTypeName(); virtual const char * GetDescription(); virtual const char * GetFlavorText(); virtual ItemRarity GetItemRarity(); }; class Gun : public Item { public: virtual bool CanEquip(); virtual bool ShowEventOnPickup(); virtual bool CanActivate(IPlayer *); virtual void PerformActivate(IPlayer *); virtual void LocalActivate(IPlayer *); virtual DamageType GetDamageType(); virtual float GetRange(); virtual float GetSpreadAngle(); virtual float GetReloadTime(int32_t); float GetMaximumReloadTime(); float GetMinimumReloadTime(); virtual int32_t GetDamagePerSecond(); }; class AKRifle : public Gun { public: virtual const char * GetName(); virtual const char * GetDisplayName(); virtual const char * GetItemTypeName(); virtual const char * GetDescription(); virtual const char * GetFlavorText(); virtual float GetCooldownTime(); virtual int32_t GetDamage(); virtual float GetSpreadAngle(); virtual bool IsAutoFire(); virtual ItemRarity GetItemRarity(); virtual IItem * GetAmmoType(); virtual uint32_t GetClipSize(); virtual int32_t GetTradeValue(); }; class CowboyCoder : public Gun { public: virtual const char * GetName(); virtual const char * GetDisplayName(); virtual const char * GetItemTypeName(); virtual const char * GetDescription(); virtual const char * GetFlavorText(); virtual float GetCooldownTime(); virtual int32_t GetDamage(); virtual float GetSpreadAngle(); virtual float GetReloadTime(int32_t); virtual ItemRarity GetItemRarity(); virtual IItem * GetAmmoType(); virtual uint32_t GetClipSize(); virtual int32_t GetTradeValue(); }; class StaticLink : public Item { public: virtual const char * GetName(); virtual const char * GetDisplayName(); virtual const char * GetItemTypeName(); virtual const char * GetDescription(); virtual const char * GetFlavorText(); virtual uint32_t GetMaximumCount(); virtual bool CanEquip(); virtual bool CanActivate(IPlayer *); virtual void PerformActivate(IPlayer *); virtual bool ShowEventOnPickup(); virtual float GetCooldownTime(); virtual int32_t GetDamage(); virtual DamageType GetDamageType(); virtual int32_t GetManaCost(); virtual float GetRange(); virtual ItemRarity GetItemRarity(); virtual bool IsAutoFire(); }; struct ServerInfo { std::string masterHost; uint16_t masterPort; std::string certPath; std::string username; std::string password; std::string hostname; uint16_t serverPort; }; struct LootEntry { IItem *item; uint32_t minCount; uint32_t maxCount; float weight; }; class LootTier { private: std::vector m_loot; float m_totalWeight; public: LootTier(); void SetEmptyWeight(float); void AddItem(IItem *, uint32_t, uint32_t, float); LootEntry GetItem(); }; class IAchievementList { public: virtual ~IAchievementList(); virtual size_t GetCount(); virtual IAchievement * GetAchievement(size_t); virtual void Destroy(); }; struct FastTravelInfo { std::string region; std::string displayName; }; class FastTravelDestination { private: std::string m_region; std::string m_displayName; public: FastTravelDestination(const std::string &, const std::string &); virtual bool IsAvailable(Player *); void MarkAsVisited(Player *); void AddToListIfValid(std::vector &, Player *, const std::string &); }; class MasterServerConnection; class GameServerConnection; class CharacterInfo; class GameAPI { private: void InitObjects(); void StartServerListener(const ServerInfo &); public: GameAPI(); void InitLocal(ILocalPlayer *); void InitClient(ILocalPlayer *); void InitServer(const char *, uint16_t, int32_t, const char *, uint16_t, const char *, const char *, const char *); void Shutdown(); void Tick(float); bool IsAuthority(); bool IsDedicatedServer(); bool IsTransitioningToNewServer(); IItem * GetItemByName(const char *); IQuest * GetQuestByName(const char *); FastTravelDestination * GetFastTravelDestination(const std::string &); IAchievement * GetAchievement(const char *); IAchievementList * GetAchievements(); std::vector > GetAchievementList(); std::vector > GetGoldenEggList(); size_t GetGoldenEggCount(); virtual bool SpawnActor(IActor *, const Vector3 &, const Rotation &, bool); virtual bool SpawnActorAtNamedLocation(IActor *, const char *); virtual bool SpawnRemotePlayer(IPlayer *, const Vector3 &, const Rotation &); virtual void DamageInRadius(IActor *, IItem *, const Vector3 &, float, int32_t, DamageType); virtual size_t GetNamedLocationPoints(const char *, LocationAndRotation *&); virtual void FreeNamedLocationPoints(LocationAndRotation *); std::vector GetNamedLocationPointList(const char *); bool GetNamedLocationPoint(const std::string &, LocationAndRotation &); std::vector GetSpawnPoints(const char *); void GiveAll(IPlayer *); virtual Vector3 GetDirectionFromRotation(const Rotation &); virtual Rotation GetRotationFromDirection(const Vector3 &); virtual void OnWeaponFired(IItem *, const Vector3 &, const Vector3 &); virtual void OnBulletHitActor(IItem *, IActor *, const Vector3 &, const Vector3 &); virtual void OnBulletHitWorld(IItem *, const Vector3 &, const Vector3 &); virtual void OnLog(const char *); void Log(const char *); virtual void OnMasterServerConnected(bool, const char *, const char *); virtual void OnLoginComplete(bool, const char *, bool, CharacterInfo *, size_t); virtual void OnRegisterComplete(bool, const char *, const char *, bool); virtual void OnCreateCharacterComplete(bool, const char *, int32_t); virtual void OnDeleteCharacterComplete(bool, int32_t); virtual void OnJoinGameServerComplete(bool, const char *, bool, const char *, uint16_t, const char *); virtual void OnGameServerConnected(bool, const char *, const Vector3 &, const Rotation &); virtual void OnTransitionToNewServer(); virtual void OnSubmitAnswerComplete(bool, const char *); virtual void OnTeammatesListed(const char **, const char **, size_t); virtual uint32_t GetDefaultCircuitInputs(const char *); virtual size_t GetCircuitOutputCount(const char *); virtual void GetCircuitOutputs(const char *, uint32_t, bool *, size_t, bool *); LootTier * GetLootTier(uint32_t); void Enqueue(const std::function &); void Process(const std::function &); MasterServerConnection * GetMasterServer(); void UpdatePlayerCounts(); void GetTeammates(); void Login(const char *, const char *); void CreateCharacter(const char *, uint8_t, uint32_t *); void DeleteCharacter(int32_t); void JoinGameServer(int32_t, bool); void SubmitAnswer(const char *, const char *); GameServerConnection * GetGameServer(); void ConnectToGameServer(const char *, uint16_t, int32_t, const char *); bool IsConnectedToMasterServer(); bool IsConnectedToGameServer(); int32_t GetUserId(); int32_t GetCharacterId(); const char * GetUserName(); const char * GetTeamName(); const char * GetTeamHash(); void ConnectToMasterServer(const char *, uint16_t, const char *); void DisconnectFromMasterServer(); void Register(const char *, const char *, const char *); void TransitionToNewGameServer(); Actor * CreateRemoteActorByName(const std::string &, bool); Actor * CreateRemoteActorByNameWithOwner(const std::string &, bool, IActor *); bool HasActorFactory(const std::string &); int32_t GetTeamPlayerCount(); int32_t GetTotalPlayerCount(); }; /* class ServerConnection { protected: bool m_running; bool m_valid; bool m_readyToDisconnect; std::thread m_thread; std::mutex m_mutex; std::queue, std::deque, std::allocator > > > m_serverQueue; std::condition_variable m_serverQueueEvent; ThreadActionQueue m_gameThreadActions; void ThreadProc(); void StartConnectionThread(); void ServerEnqueue(const std::function &); void ServerProcess(const std::function &); virtual const char * GetServerType(); public: ServerConnection(); virtual ~ServerConnection(); bool IsValid() const; bool IsReadyToDisconnect() const; void ProcessGameThreadActions(); void Disconnect(); } class GameServerConnection : public ServerConnection { protected: TCPSocket *m_sock; WriteStream m_writeStream; volatile bool m_tickInProgress; void NotifyDisconnect(); virtual const char * GetServerType(); void OnPositionEvent(Player *); void OnPositionAndVelocityEvent(Player *); void OnPlayerPositionEvent(Player *); void OnAddItemEvent(Player *); void OnRemoveItemEvent(Player *); void OnLoadedAmmoEvent(Player *); void OnPickedUpEvent(Player *); void OnEquipItemEvent(Player *); void OnCurrentSlotEvent(Player *); void OnSetCurrentQuestEvent(Player *); void OnStartQuestEvent(Player *); void OnAdvanceQuestToStateEvent(Player *); void OnCompleteQuestEvent(Player *); void OnHealthUpdateEvent(Player *); void OnManaUpdateEvent(Player *); void OnCountdownUpdateEvent(Player *); void OnPvPCountdownUpdateEvent(Player *); void OnPvPEnableEvent(Player *); void OnStateEvent(Player *); void OnTriggerEvent(Player *); void OnFireBulletsEvent(Player *); void OnDisplayEvent(Player *); void OnNPCConversationStateEvent(Player *); void OnNPCConversationEndEvent(Player *); void OnNPCShopEvent(Player *); void OnRespawnThisPlayerEvent(Player *); void OnRespawnOtherPlayerEvent(Player *); void OnTeleportEvent(Player *); void OnRelativeTeleportEvent(Player *); void OnReloadEvent(Player *); void OnRemoteReloadEvent(Player *); void OnPlayerJoinedEvent(Player *); void OnPlayerLeftEvent(Player *); void OnPlayerItemEvent(Player *); void OnActorSpawnEvent(Player *); void OnActorDestroyEvent(Player *); void OnChatEvent(Player *); void OnKillEvent(Player *); void OnCircuitOutputEvent(Player *); void OnRegionChangeEvent(Player *); void OnLastHitByItemEvent(Player *); public: GameServerConnection(); virtual ~GameServerConnection(); void Connect(const std::string &, uint16_t, int32_t, const std::string &, const std::function &, unsigned int, const LocationAndRotation &)> &); void MoveAndGetEvents(Player *); void Use(Actor *); void Activate(Player *, IItem *); void Reload(); void Jump(bool); void Sprint(bool); void FireRequest(bool); void TransitionToNPCState(const std::string &); void BuyItem(Actor *, IItem *, uint32_t); void SellItem(Actor *, IItem *, uint32_t); void Respawn(); void Teleport(const std::string &); void EquipItem(uint8_t, IItem *); void SetCurrentSlot(uint8_t); void SetCurrentQuest(IQuest *); void Chat(const std::string &); void FastTravel(const std::string &, const std::string &); void SetPvPDesired(bool); void SubmitDLCKey(const std::string &); void SetCircuitInputs(const std::string &, uint32_t); } */ class KeyVerifier { public: static bool VerifyKey(std::string const&); }; enum EnemyRank {NormalEnemy, EliteEnemy, LegendaryEnemy}; class LootTable; class LootTable { private: float m_dropChance; //std::vector m_tiers; //std::vector m_counts; float m_totalTierWeight; float m_totalCountWeight; std::vector m_additionalItems; uint32_t GetRandomCount(); LootEntry GetRandomItem(); public: LootTable(); void SetDropChance(float); void SetTiers(uint32_t, uint32_t, float); void SetCounts(uint32_t, uint32_t, float); void AddAdditionalItem(IItem *, uint32_t, uint32_t, float); std::map, std::allocator > > GetItems(); }; class AIActor; class AIState { protected: AIActor *m_owner; TimerSet m_timers; public: AIState(AIActor *); virtual ~AIState(); AIActor * GetOwner() const; Actor * GetTarget() const; virtual void EnterState(Actor *); virtual void LeaveState(); virtual void Tick(float); virtual void OnAIMoveComplete(); void AddTimer(const std::string &, float, const std::function &); void AddTimerWithContext(const std::string &, float, const std::function &); void AddRecurringTimer(const std::string &, float, const std::function &); void AddRecurringTimerWithContext(const std::string &, float, const std::function &); void CancelTimer(const std::string &); void CancelAllTimers(); }; class AIActor : public Actor { public: std::map, std::allocator > > m_states; AIState *m_initialState; AIState *m_currentState; ActorRef m_target; void AddInitialState(const std::string &, AIState *); void AddState(const std::string &, AIState *); public: AIActor(const std::string &); virtual ~AIActor(); virtual bool IsCharacter(); virtual bool ShouldSendPositionUpdates(); virtual bool ShouldReceivePositionUpdates(); Actor * GetTarget() const; virtual bool ShouldTargetPlayer(Player *); virtual bool ShouldAttackFromRange() const; virtual float GetRangedAttackDistance() const; virtual bool ShouldWander() const; virtual bool ShouldMove() const; virtual bool ShouldAttack() const; virtual bool ShouldAttackMultipleTargets() const; virtual void Tick(float); virtual void OnAIMoveComplete(); AIState * GetStateByName(const std::string &); void TransitionToState(const std::string &, Actor *); virtual void TransitionToState(AIState *, Actor *); }; class Enemy : public AIActor { public: LootTable m_loot; virtual void OnKilled(IActor *, IItem *); public: Enemy(const std::string &); virtual bool CanBeDamaged(IActor *); virtual float GetMaximumDamageDistance(); virtual int32_t GetAttackDamage(); virtual DamageType GetAttackDamageType(); virtual IItem * GetAttackItem(); virtual float GetAggressionRadius(); virtual float GetAttackTime(); virtual float GetAttackHitTime(); virtual void OnPrepareAttack(Actor *); virtual void OnEndAttack(); virtual void Attack(Actor *); virtual EnemyRank GetRank() const; virtual Rotation GetLookRotation(); virtual void Damage(IActor *, IItem *, int32_t, DamageType); }; class Magmarok : public Enemy { bool m_healingActive; float m_healingTimeLeft; float m_advanceQuestTimer; protected: virtual void OnKilled(IActor *, IItem *); public: Magmarok(); virtual float GetMaximumDamageDistance(); virtual float GetAggressionRadius(); virtual bool ShouldWander() const; virtual bool ShouldAttackFromRange() const; virtual bool ShouldMove() const; virtual bool ShouldAttack() const; virtual bool ShouldAttackMultipleTargets() const; virtual float GetRangedAttackDistance() const; virtual float GetAttackTime(); virtual int32_t GetMaxHealth(); virtual const char * GetDisplayName(); virtual const char * GetDeathMessage(); virtual bool IsElite(); virtual void Damage(IActor *, IItem *, int32_t, DamageType); virtual void Tick(float); virtual void OnPrepareAttack(Actor *); };