[Bug Fix] Clear Ramp when Clearing hate (#3892)

* [Bug Fix] Clear Ramp when Clearing hate

When clearing a client from the hatelist, also clear them from ramp

* Add additional calls missed

* requested changes

* extra tabs
This commit is contained in:
Fryguy 2024-01-07 15:27:12 -05:00 committed by GitHub
parent fc8ace91cb
commit 84b8bdd2b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 68 additions and 9 deletions

View File

@ -2119,6 +2119,7 @@ bool NPC::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, bool
}
RemoveFromHateList(other);
RemoveFromRampageList(other);
LogCombat("I am not allowed to attack [{}]", other->GetName());
return false;
}

View File

@ -2783,10 +2783,12 @@ bool Bot::IsValidTarget(Client* bot_owner, Client* leash_owner, float lo_distanc
// Normally, we wouldn't want to do this without class checks..but, too many issues can arise if we let enchanter animation pets run rampant
if (HasPet()) {
GetPet()->RemoveFromHateList(tar);
GetPet()->RemoveFromRampageList(tar);
GetPet()->SetTarget(nullptr);
}
RemoveFromHateList(tar);
RemoveFromRampageList(tar);
SetTarget(nullptr);
SetAttackFlag(false);

View File

@ -1491,18 +1491,21 @@ void EntityList::RemoveFromTargets(Mob *mob, bool RemoveFromXTargets)
Mob *m = it->second;
++it;
if (!m)
if (!m) {
continue;
}
if (RemoveFromXTargets && mob) {
if (m->IsClient() && (mob->CheckAggro(m) || mob->IsOnFeignMemory(m)))
if (m->IsClient() && (mob->CheckAggro(m) || mob->IsOnFeignMemory(m))) {
m->CastToClient()->RemoveXTarget(mob, false);
// FadingMemories calls this function passing the client.
else if (mob->IsClient() && (m->CheckAggro(mob) || m->IsOnFeignMemory(mob)))
} else if (mob->IsClient() && (m->CheckAggro(mob) || m->IsOnFeignMemory(mob))) {
mob->CastToClient()->RemoveXTarget(m, false);
}
}
m->RemoveFromHateList(mob);
m->RemoveFromRampageList(mob);
}
}
@ -1515,20 +1518,24 @@ void EntityList::RemoveFromTargetsFadingMemories(Mob *spell_target, bool RemoveF
continue;
}
if (max_level && mob->GetLevel() > max_level)
if (max_level && mob->GetLevel() > max_level) {
continue;
}
if (mob->GetSpecialAbility(IMMUNE_FADING_MEMORIES))
if (mob->GetSpecialAbility(IMMUNE_FADING_MEMORIES)) {
continue;
}
if (RemoveFromXTargets && spell_target) {
if (mob->IsClient() && (spell_target->CheckAggro(mob) || spell_target->IsOnFeignMemory(mob)))
if (mob->IsClient() && (spell_target->CheckAggro(mob) || spell_target->IsOnFeignMemory(mob))) {
mob->CastToClient()->RemoveXTarget(spell_target, false);
else if (spell_target->IsClient() && (mob->CheckAggro(spell_target) || mob->IsOnFeignMemory(spell_target)))
} else if (spell_target->IsClient() && (mob->CheckAggro(spell_target) || mob->IsOnFeignMemory(spell_target))) {
spell_target->CastToClient()->RemoveXTarget(mob, false);
}
}
mob->RemoveFromHateList(spell_target);
mob->RemoveFromRampageList(spell_target);
}
}
@ -3188,8 +3195,10 @@ void EntityList::RemoveFromHateLists(Mob *mob, bool settoone)
if (it->second->CheckAggro(mob)) {
if (!settoone) {
it->second->RemoveFromHateList(mob);
if (mob->IsClient())
it->second->RemoveFromRampageList(mob);
if (mob->IsClient()) {
mob->CastToClient()->RemoveXTarget(it->second, false); // gotta do book keeping
}
} else {
it->second->SetHateAmountOnEnt(mob, 1);
}
@ -3548,8 +3557,11 @@ void EntityList::ClearAggro(Mob* targ)
if (c) {
c->RemoveXTarget(it->second, false);
}
it->second->RemoveFromHateList(targ);
it->second->RemoveFromRampageList(targ, true);
}
if (c && it->second->IsOnFeignMemory(c)) {
it->second->RemoveFromFeignMemory(c); //just in case we feigned
c->RemoveXTarget(it->second, false);
@ -3573,6 +3585,7 @@ void EntityList::ClearWaterAggro(Mob* targ)
c->RemoveXTarget(it->second, false);
}
it->second->RemoveFromHateList(targ);
it->second->RemoveFromRampageList(targ);
}
if (c && it->second->IsOnFeignMemory(c)) {
it->second->RemoveFromFeignMemory(c); //just in case we feigned
@ -3618,6 +3631,11 @@ void EntityList::ClearFeignAggro(Mob *targ)
}
it->second->RemoveFromHateList(targ);
if (it->second->GetSpecialAbility(SPECATK_RAMPAGE)) {
it->second->RemoveFromRampageList(targ, true);
}
if (targ->IsClient()) {
if (it->second->GetLevel() >= 35 && zone->random.Roll(60)) {
it->second->AddFeignMemory(targ);

View File

@ -1137,6 +1137,7 @@ public:
bool Rampage(ExtraAttackOptions *opts);
bool AddRampage(Mob*);
void ClearRampage();
void RemoveFromRampageList(Mob* mob, bool remove_feigned = false);
void SetBottomRampageList();
void SetTopRampageList();
void AreaRampage(ExtraAttackOptions *opts);

View File

@ -778,6 +778,7 @@ void Client::AI_Process()
if (GetTarget()->IsCorpse()) {
RemoveFromHateList(this);
RemoveFromRampageList(this);
return;
}
@ -1089,6 +1090,7 @@ void Mob::AI_Process() {
if (target->IsCorpse()) {
RemoveFromHateList(this);
RemoveFromRampageList(this);
return;
}
@ -2062,6 +2064,32 @@ void Mob::ClearRampage()
RampageArray.clear();
}
void Mob::RemoveFromRampageList(Mob* mob, bool remove_feigned)
{
if (!mob) {
return;
}
if (
IsNPC() &&
GetSpecialAbility(SPECATK_RAMPAGE) &&
(
remove_feigned ||
mob->IsNPC() ||
(
mob->IsClient() &&
!mob->CastToClient()->GetFeigned()
)
)
) {
for (int i = 0; i < RampageArray.size(); i++) {
if (mob->GetID() == RampageArray[i]) {
RampageArray[i] = 0;
}
}
}
}
bool Mob::Rampage(ExtraAttackOptions *opts)
{
int index_hit = 0;
@ -2083,8 +2111,16 @@ bool Mob::Rampage(ExtraAttackOptions *opts)
// range is important
Mob *m_target = entity_list.GetMob(RampageArray[i]);
if (m_target) {
if (m_target == GetTarget())
if (m_target == GetTarget()) {
continue;
}
if (m_target->IsCorpse()) {
LogAggroDetail("[{}] is on [{}]'s rampage list", m_target->GetCleanName(), GetCleanName());
RemoveFromRampageList(m_target, true);
continue;
}
if (DistanceSquaredNoZ(GetPosition(), m_target->GetPosition()) <= NPC_RAMPAGE_RANGE2) {
ProcessAttackRounds(m_target, opts);
index_hit++;

View File

@ -204,6 +204,7 @@ bool Perl_NPC_IsOnHatelist(NPC* self, Mob* mob) // @categories Hate and Aggro
void Perl_NPC_RemoveFromHateList(NPC* self, Mob* mob) // @categories Hate and Aggro
{
self->RemoveFromHateList(mob);
self->RemoveFromRampageList(mob);
}
void Perl_NPC_SetNPCFactionID(NPC* self, int faction_id) // @categories Faction