2021-12-05 17:54:36 +00:00
|
|
|
#ifndef BUFFCOMPONENT_H
|
|
|
|
#define BUFFCOMPONENT_H
|
|
|
|
|
|
|
|
#include "dCommonVars.h"
|
|
|
|
#include "RakNetTypes.h"
|
|
|
|
#include <vector>
|
|
|
|
#include <unordered_map>
|
|
|
|
#include <map>
|
|
|
|
#include "Component.h"
|
2023-03-04 07:16:37 +00:00
|
|
|
#include "eReplicaComponentType.h"
|
2021-12-05 17:54:36 +00:00
|
|
|
|
|
|
|
class Entity;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Extra information on effects to apply after applying a buff, for example whether to buff armor, imag or health and by how much
|
|
|
|
*/
|
2023-12-01 16:12:48 +00:00
|
|
|
struct BuffParameter {
|
2022-07-28 13:39:57 +00:00
|
|
|
int32_t buffId;
|
|
|
|
std::string name;
|
|
|
|
float value;
|
|
|
|
std::vector<float> values;
|
|
|
|
int32_t effectId;
|
2021-12-05 17:54:36 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Meta information about a buff that can be applied, e.g. how long it's applied, who applied it, etc.
|
|
|
|
*/
|
2023-12-01 16:12:48 +00:00
|
|
|
struct Buff {
|
2024-07-02 11:05:44 +00:00
|
|
|
bool operator==(const Buff& other) const {
|
|
|
|
return id == other.id &&
|
|
|
|
time == other.time &&
|
|
|
|
tick == other.tick &&
|
|
|
|
tickTime == other.tickTime &&
|
|
|
|
stacks == other.stacks &&
|
|
|
|
source == other.source &&
|
|
|
|
behaviorID == other.behaviorID &&
|
|
|
|
cancelOnDamaged == other.cancelOnDamaged &&
|
|
|
|
cancelOnDeath == other.cancelOnDeath &&
|
|
|
|
cancelOnLogout == other.cancelOnLogout &&
|
|
|
|
cancelOnRemoveBuff == other.cancelOnRemoveBuff &&
|
|
|
|
cancelOnUi == other.cancelOnUi &&
|
|
|
|
cancelOnUnequip == other.cancelOnUnequip &&
|
|
|
|
cancelOnZone == other.cancelOnZone &&
|
|
|
|
applyOnTeammates == other.applyOnTeammates &&
|
|
|
|
refCount == other.refCount;
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
int32_t id = 0;
|
|
|
|
float time = 0;
|
|
|
|
float tick = 0;
|
|
|
|
float tickTime = 0;
|
|
|
|
int32_t stacks = 0;
|
|
|
|
LWOOBJID source = 0;
|
|
|
|
int32_t behaviorID = 0;
|
2023-12-01 16:12:48 +00:00
|
|
|
bool cancelOnDamaged = false;
|
|
|
|
bool cancelOnDeath = false;
|
|
|
|
bool cancelOnLogout = false;
|
|
|
|
bool cancelOnRemoveBuff = false;
|
|
|
|
bool cancelOnUi = false;
|
|
|
|
bool cancelOnUnequip = false;
|
|
|
|
bool cancelOnZone = false;
|
|
|
|
bool applyOnTeammates = false;
|
|
|
|
uint32_t refCount = 0;
|
2021-12-05 17:54:36 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Allows for the application of buffs to the parent entity, altering health, armor and imagination.
|
|
|
|
*/
|
2024-01-24 05:13:23 +00:00
|
|
|
class BuffComponent final : public Component {
|
2021-12-05 17:54:36 +00:00
|
|
|
public:
|
2024-01-24 05:13:23 +00:00
|
|
|
static constexpr eReplicaComponentType ComponentType = eReplicaComponentType::BUFF;
|
2022-07-28 13:39:57 +00:00
|
|
|
|
|
|
|
explicit BuffComponent(Entity* parent);
|
|
|
|
|
|
|
|
~BuffComponent();
|
|
|
|
|
|
|
|
Entity* GetParent() const;
|
|
|
|
|
2024-04-08 20:13:49 +00:00
|
|
|
void LoadFromXml(const tinyxml2::XMLDocument& doc) override;
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2024-04-08 20:13:49 +00:00
|
|
|
void UpdateXml(tinyxml2::XMLDocument& doc) override;
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2024-02-27 07:25:44 +00:00
|
|
|
void Serialize(RakNet::BitStream& outBitStream, bool bIsInitialUpdate) override;
|
2022-07-28 13:39:57 +00:00
|
|
|
|
|
|
|
void Update(float deltaTime) override;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Applies a buff to the parent entity
|
|
|
|
* @param id the id of the buff to apply
|
|
|
|
* @param duration the duration of the buff in seconds
|
|
|
|
* @param source an optional source entity that cast the buff
|
|
|
|
* @param addImmunity client flag
|
|
|
|
* @param cancelOnDamaged client flag to indicate that the buff should disappear when damaged
|
|
|
|
* @param cancelOnDeath client flag to indicate that the buff should disappear when dying
|
|
|
|
* @param cancelOnLogout client flag to indicate that the buff should disappear when logging out
|
|
|
|
* @param cancelOnRemoveBuff client flag to indicate that the buff should disappear when a concrete GM to do so comes around
|
|
|
|
* @param cancelOnUi client flag to indicate that the buff should disappear when interacting with UI
|
|
|
|
* @param cancelOnUnequip client flag to indicate that the buff should disappear when the triggering item is unequipped
|
|
|
|
* @param cancelOnZone client flag to indicate that the buff should disappear when changing zones
|
|
|
|
*/
|
|
|
|
void ApplyBuff(int32_t id, float duration, LWOOBJID source, bool addImmunity = false, bool cancelOnDamaged = false,
|
|
|
|
bool cancelOnDeath = true, bool cancelOnLogout = false, bool cancelOnRemoveBuff = true,
|
2023-12-01 16:12:48 +00:00
|
|
|
bool cancelOnUi = false, bool cancelOnUnequip = false, bool cancelOnZone = false, bool applyOnTeammates = false);
|
|
|
|
|
|
|
|
void ApplyBuffFx(uint32_t buffId, const BuffParameter& buffName);
|
|
|
|
void RemoveBuffFx(uint32_t buffId, const BuffParameter& buffName);
|
2022-07-28 13:39:57 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Removes a buff from the parent entity, reversing its effects
|
|
|
|
* @param id the id of the buff to remove
|
2022-11-28 00:40:14 +00:00
|
|
|
* @param removeImmunity whether or not to remove immunity on removing the buff
|
2022-07-28 13:39:57 +00:00
|
|
|
*/
|
2023-12-01 16:12:48 +00:00
|
|
|
void RemoveBuff(int32_t id, bool fromUnEquip = false, bool removeImmunity = false, bool ignoreRefCount = false);
|
2022-07-28 13:39:57 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns whether or not the entity has a buff identified by `id`
|
|
|
|
* @param id the id of the buff to find
|
|
|
|
* @return whether or not the entity has a buff with the specified id active
|
|
|
|
*/
|
|
|
|
bool HasBuff(int32_t id);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Applies the effects of the buffs on the entity, e.g.: changing armor, health, imag, etc.
|
|
|
|
* @param id the id of the buff effects to apply
|
|
|
|
*/
|
|
|
|
void ApplyBuffEffect(int32_t id);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reverses the effects of the applied buff
|
|
|
|
* @param id the id of the buff for which to remove the effects
|
|
|
|
*/
|
|
|
|
void RemoveBuffEffect(int32_t id);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Removes all buffs for the entity and reverses all of their effects
|
|
|
|
*/
|
|
|
|
void RemoveAllBuffs();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Removes all buffs for the entity and reverses all of their effects
|
|
|
|
*/
|
|
|
|
void Reset();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Applies all effects for all buffs, active or not, again
|
|
|
|
*/
|
|
|
|
void ReApplyBuffs();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets all the parameters (= effects), for the buffs that belong to this component
|
|
|
|
* @param buffId
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
const std::vector<BuffParameter>& GetBuffParameters(int32_t buffId);
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2024-07-02 11:05:44 +00:00
|
|
|
const std::map<int32_t, Buff>& GetBuffs() const { return m_Buffs; }
|
|
|
|
const std::set<int32_t>& GetBuffsToRemove() const { return m_BuffsToRemove; }
|
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
private:
|
2022-07-28 13:39:57 +00:00
|
|
|
/**
|
|
|
|
* The currently active buffs
|
|
|
|
*/
|
|
|
|
std::map<int32_t, Buff> m_Buffs;
|
|
|
|
|
2024-01-03 06:52:11 +00:00
|
|
|
// Buffs to remove at the end of the update frame.
|
2024-02-25 07:01:28 +00:00
|
|
|
std::set<int32_t> m_BuffsToRemove;
|
2024-01-03 06:52:11 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
/**
|
|
|
|
* Parameters (=effects) for each buff
|
|
|
|
*/
|
|
|
|
static std::unordered_map<int32_t, std::vector<BuffParameter>> m_Cache;
|
2021-12-05 17:54:36 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // BUFFCOMPONENT_H
|