122 lines
3.9 KiB
C++
122 lines
3.9 KiB
C++
// Project Lab - NHTV Igad
|
|
|
|
#pragma once
|
|
|
|
#include "DealDamageProxy.h"
|
|
#include <list>
|
|
#include "AbilityInfo.h"
|
|
#include "Modifier.generated.h"
|
|
|
|
class ModifierManager
|
|
{
|
|
public:
|
|
ModifierManager(class ANetworkCharacter* character);
|
|
~ModifierManager();
|
|
|
|
void ClearModifiers(bool shouldCallEnd = true);
|
|
void Tick(float DeltaSeconds);
|
|
|
|
class AModifier* AddModifier(TSubclassOf<class AModifier> modifierClass, float duration);
|
|
class AModifier* AddModifier(AModifier* modifierInstance);
|
|
TArray<class AModifier*> GetModifiersOfClass(TSubclassOf<class AModifier> modifierClass);
|
|
void RecalculateCharacter();
|
|
void BroadcastManaDrainFailed();
|
|
|
|
private:
|
|
void m_Reset();
|
|
|
|
friend class ANetworkCharacter;
|
|
TArray<class AModifier*> m_modifiers;
|
|
class ANetworkCharacter* m_character;
|
|
};
|
|
|
|
UCLASS()
|
|
class UNREALPROJECT_API AModifier : public ADealDamageProxy
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
friend class ADefaultPlayerController;
|
|
friend class ModifierManager;
|
|
friend class ANetworkCharacter;
|
|
friend class AOnDamageModifier;
|
|
|
|
public:
|
|
AModifier();
|
|
virtual void Tick(float DeltaSeconds) override final;
|
|
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
|
|
|
|
virtual void ModifierTick();
|
|
virtual void ModifierStart();
|
|
virtual void ModifierEnd();
|
|
virtual bool OnDamage(int32& damage, ANetworkCharacter* damageDealer);
|
|
virtual bool OnDealDamage(int32& damage, ANetworkCharacter* damageTaker);
|
|
virtual void OnStandardAttack(ANetworkCharacter* character);
|
|
virtual void AfterDamage(int32 damage);
|
|
|
|
UFUNCTION(BlueprintCallable, Category = "modifiers")
|
|
virtual bool ShouldBeRemoved() const;
|
|
virtual void ModifyCharacter();
|
|
UFUNCTION(BlueprintCallable, Category = "modifiers")
|
|
void ForceDestroy();
|
|
|
|
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "modifiers", meta=(ExposeOnSpawn))
|
|
float lifeTime;
|
|
UPROPERTY()
|
|
ANetworkCharacter* target;
|
|
UPROPERTY(EditDefaultsOnly, Category = "modifiers")
|
|
int32 ticksPerSecond;
|
|
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "modifiers", meta = (ExposeOnSpawn))
|
|
int32 priority;
|
|
|
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnManaDrainFailed);
|
|
|
|
UPROPERTY(BlueprintAssignable, Category = "Mana Drain")
|
|
FOnManaDrainFailed onManaDrainFailed;
|
|
|
|
bool operator < (const AModifier&) const;
|
|
bool operator > (const AModifier&) const;
|
|
protected:
|
|
enum EffectType
|
|
{
|
|
additive = 0,
|
|
multiplicative
|
|
};
|
|
float m_MultiplyEffect(float value, EffectType effectType, bool positive);
|
|
|
|
// Modification Functions
|
|
void m_AddMaxMana(int32 maxMana);
|
|
void m_MultiplyManaRegenMultiplier(float manaRegenMultiplier);
|
|
void m_AddBlockedMana(int32 blockedMana);
|
|
void m_AddDamageMultiplier(float multiplier);
|
|
void m_AddIgnoreArmor(float normalizedPercentage);
|
|
void m_AddArmor(float armor);
|
|
void m_MultiplyArmor(float armor);
|
|
void m_MultiplyDamageTakenMultiplier(float multiplier);
|
|
void m_AddMaxHealth(int32 health);
|
|
void m_AddMovementSpeedMultiplier(float multiplier);
|
|
void m_AddAttackSpeed(float amount);
|
|
void m_AddAttackSpeedMultiplier(float multiplier);
|
|
void m_AddCooldownReduction(float amount);
|
|
void m_AddCooldownReductionMultiplier(float multiplier);
|
|
void m_AddStunnedState();
|
|
void m_AddSilencedState();
|
|
void m_RemoveSilencedState();
|
|
void m_MultiplyAttackDamage(float damageMultiplier);
|
|
void m_AddMagicDamage(float damageMultiplier);
|
|
void m_MultiplyManaUsageMultiplier(float manaUsageMultiplier);
|
|
void m_MultiplyNegativeEffectMultiplier(float effectMultiplier);
|
|
void m_MultiplyPositiveEffectMultiplier(float effectMultiplier);
|
|
void m_MultiplyMagicDamageMultiplier(float effectMultiplier);
|
|
void m_addChannelMovementSpeedMultiplier(float channelMovementSpeedMultiplier);
|
|
float m_tickRate;
|
|
|
|
private:
|
|
void m_Start();
|
|
void m_Init(class ANetworkCharacter* character, float duration);
|
|
|
|
bool m_forceDestroy;
|
|
int m_debugWarning;
|
|
bool m_started;
|
|
float m_tickTimer;
|
|
bool m_dontDestroy;
|
|
}; |