Skip to content

Commit

Permalink
InfClassCharacter: Refactor and fix poisoning
Browse files Browse the repository at this point in the history
  • Loading branch information
Kaffeine committed Dec 23, 2023
1 parent bd6ddb0 commit 857025a
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 11 deletions.
8 changes: 7 additions & 1 deletion src/game/server/infclass/entities/growingexplosion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -309,8 +309,14 @@ void CGrowingExplosion::Tick()
m_Hit[p->GetCID()] = true;
break;
case GROWING_EXPLOSION_EFFECT::POISON_INFECTED:
p->Poison(Config()->m_InfPoisonDamage, m_Owner, DAMAGE_TYPE::MERCENARY_GRENADE);
{
int Damage = maximum(Config()->m_InfPoisonDamage, 1);
const float PoisonDurationSeconds = Config()->m_InfPoisonDuration / 1000.0;
const float DamageIntervalSeconds = PoisonDurationSeconds / Damage;

p->Poison(Damage, m_Owner, DAMAGE_TYPE::MERCENARY_GRENADE, DamageIntervalSeconds);
p->GetClass()->DisableHealing(Config()->m_InfPoisonDuration / 1000.0f, m_Owner, DAMAGE_TYPE::MERCENARY_GRENADE);
}
GameServer()->SendEmoticon(p->GetCID(), EMOTICON_DROP);
m_Hit[p->GetCID()] = true;
break;
Expand Down
14 changes: 5 additions & 9 deletions src/game/server/infclass/entities/infccharacter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,13 +206,7 @@ void CInfClassCharacter::Tick()
vec2 Force(0, 0);
static const int PoisonDamage = 1;
TakeDamage(Force, PoisonDamage, m_PoisonFrom, m_PoisonDamageType);
if(m_Poison >= 0)
{
int Damage = maximum(Config()->m_InfPoisonDamage, 1);
const float PoisonDurationSeconds = Config()->m_InfPoisonDuration / 1000.0;
const float DamageIntervalSeconds = PoisonDurationSeconds / Damage;
m_PoisonTick = CurrentTick + Server()->TickSpeed() * DamageIntervalSeconds;
}
m_PoisonTick = CurrentTick + Server()->TickSpeed() * m_PoisonEffectInterval;

if(m_PoisonDamageType == DAMAGE_TYPE::SLUG_SLIME)
{
Expand Down Expand Up @@ -957,11 +951,13 @@ bool CInfClassCharacter::IsPoisoned() const
return m_Poison > 0;
}

void CInfClassCharacter::Poison(int Count, int From, DAMAGE_TYPE DamageType)
void CInfClassCharacter::Poison(int Count, int From, DAMAGE_TYPE DamageType, float Interval)
{
if(Count > m_Poison)
bool JustPoisoned = m_PoisonTick > Server()->Tick();
if(Count > m_Poison + JustPoisoned ? 1 : 0)
{
m_Poison = Count;
m_PoisonEffectInterval = Interval;
m_PoisonFrom = From;
m_PoisonDamageType = DamageType;
}
Expand Down
3 changes: 2 additions & 1 deletion src/game/server/infclass/entities/infccharacter.h
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ class CInfClassCharacter : public CCharacter
void CancelSlowMotion();

bool IsPoisoned() const;
void Poison(int Count, int From, DAMAGE_TYPE DamageType);
void Poison(int Count, int From, DAMAGE_TYPE DamageType, float Interval = 1.0f);
void ResetPoisonEffect();

void ResetMovementsInput();
Expand Down Expand Up @@ -296,6 +296,7 @@ class CInfClassCharacter : public CCharacter
int m_SlowEffectApplicant;

int m_Poison = 0;
float m_PoisonEffectInterval{};
int m_PoisonTick = 0;
int m_PoisonFrom = 0;
DAMAGE_TYPE m_PoisonDamageType;
Expand Down

0 comments on commit 857025a

Please sign in to comment.