mirror of
https://github.com/EQEmu/Server.git
synced 2026-02-23 07:22:28 +00:00
[XTarget] Disallow Corpses in XTarget Auto Slots (#1881)
* [XTarget] Disallow Corpses in XTarget Auto Slots Why: There exists an odd state where corpses will fill up your XTarget window. This is reproducable using a combination of a pet to kill a mob and timely feign death to wipe the owner's aggro. What: Added an IsCorpse check to IsXTarget. Added a block to mark corpse XTargets as dirty to ProcessXTargetAutoHaters * fixup! [XTarget] Disallow Corpses in XTarget Auto Slots * fixup! [XTarget] Disallow Corpses in XTarget Auto Slots * [XTarget] Disallow Corpses Code Cleanup Added some safety, performance, and code readability changes per PR request.
This commit is contained in:
parent
645251992d
commit
220d8497dd
@ -1799,6 +1799,7 @@ bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, EQ::skills::Skill
|
||||
entity_list.RemoveFromTargets(this, true);
|
||||
hate_list.RemoveEntFromHateList(this);
|
||||
RemoveAutoXTargets();
|
||||
ProcessXTargetAutoHaters();
|
||||
|
||||
//remove ourself from all proximities
|
||||
ClearAllProximities();
|
||||
@ -2569,6 +2570,10 @@ bool NPC::Death(Mob* killer_mob, int32 damage, uint16 spell, EQ::skills::SkillTy
|
||||
}
|
||||
|
||||
entity_list.RemoveFromAutoXTargets(this);
|
||||
|
||||
if (killer->GetUltimateOwner() && killer->GetUltimateOwner()->IsClient()) {
|
||||
killer->GetUltimateOwner()->CastToClient()->ProcessXTargetAutoHaters();
|
||||
}
|
||||
uint16 emoteid = this->GetEmoteID();
|
||||
auto corpse = new Corpse(this, &itemlist, GetNPCTypeID(), &NPCTypedata,
|
||||
level > 54 ? RuleI(NPC, MajorNPCCorpseDecayTimeMS)
|
||||
|
||||
@ -7172,7 +7172,7 @@ void Client::OpenLFGuildWindow()
|
||||
|
||||
bool Client::IsXTarget(const Mob *m) const
|
||||
{
|
||||
if(!XTargettingAvailable() || !m || (m->GetID() == 0))
|
||||
if(!XTargettingAvailable() || !m || !m->IsValidXTarget())
|
||||
return false;
|
||||
|
||||
for(int i = 0; i < GetMaxXTargets(); ++i)
|
||||
@ -7215,10 +7215,10 @@ void Client::UpdateClientXTarget(Client *c)
|
||||
// IT IS NOT SAFE TO CALL THIS IF IT'S NOT INITIAL AGGRO
|
||||
void Client::AddAutoXTarget(Mob *m, bool send)
|
||||
{
|
||||
m_activeautohatermgr->increment_count(m);
|
||||
|
||||
if (!XTargettingAvailable() || !XTargetAutoAddHaters || IsXTarget(m))
|
||||
return;
|
||||
|
||||
m_activeautohatermgr->increment_count(m);
|
||||
|
||||
for(int i = 0; i < GetMaxXTargets(); ++i)
|
||||
{
|
||||
@ -7428,8 +7428,17 @@ void Client::ProcessXTargetAutoHaters()
|
||||
if (XTargets[i].Type != Auto)
|
||||
continue;
|
||||
|
||||
auto *mob = entity_list.GetMob(XTargets[i].ID);
|
||||
|
||||
if (XTargets[i].ID != 0 && !GetXTargetAutoMgr()->contains_mob(XTargets[i].ID)) {
|
||||
XTargets[i].ID = 0;
|
||||
XTargets[i].Name[0] = 0;
|
||||
XTargets[i].dirty = true;
|
||||
}
|
||||
|
||||
if (XTargets[i].ID != 0 && mob && !mob->IsValidXTarget()) {
|
||||
XTargets[i].ID = 0;
|
||||
XTargets[i].Name[0] = 0;
|
||||
XTargets[i].dirty = true;
|
||||
}
|
||||
|
||||
@ -7465,6 +7474,7 @@ void Client::ProcessXTargetAutoHaters()
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
m_dirtyautohaters = false;
|
||||
SendXTargetUpdates();
|
||||
}
|
||||
|
||||
@ -6649,3 +6649,7 @@ void Mob::SetBucket(std::string bucket_name, std::string bucket_value, std::stri
|
||||
std::string full_bucket_name = fmt::format("{}-{}", GetBucketKey(), bucket_name);
|
||||
DataBucket::SetData(full_bucket_name, bucket_value, expiration);
|
||||
}
|
||||
|
||||
bool Mob::IsValidXTarget() const {
|
||||
return (GetID() > 0 || !IsCorpse());
|
||||
}
|
||||
|
||||
@ -1307,6 +1307,8 @@ public:
|
||||
std::string GetBucketRemaining(std::string bucket_name);
|
||||
void SetBucket(std::string bucket_name, std::string bucket_value, std::string expiration = "");
|
||||
|
||||
bool IsValidXTarget() const;
|
||||
|
||||
#ifdef BOTS
|
||||
// Bots HealRotation methods
|
||||
bool IsHealRotationTarget() { return (m_target_of_heal_rotation.use_count() && m_target_of_heal_rotation.get()); }
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user