mirror of
https://github.com/EQEmu/Server.git
synced 2026-03-27 14:42:25 +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);
|
entity_list.RemoveFromTargets(this, true);
|
||||||
hate_list.RemoveEntFromHateList(this);
|
hate_list.RemoveEntFromHateList(this);
|
||||||
RemoveAutoXTargets();
|
RemoveAutoXTargets();
|
||||||
|
ProcessXTargetAutoHaters();
|
||||||
|
|
||||||
//remove ourself from all proximities
|
//remove ourself from all proximities
|
||||||
ClearAllProximities();
|
ClearAllProximities();
|
||||||
@ -2569,6 +2570,10 @@ bool NPC::Death(Mob* killer_mob, int32 damage, uint16 spell, EQ::skills::SkillTy
|
|||||||
}
|
}
|
||||||
|
|
||||||
entity_list.RemoveFromAutoXTargets(this);
|
entity_list.RemoveFromAutoXTargets(this);
|
||||||
|
|
||||||
|
if (killer->GetUltimateOwner() && killer->GetUltimateOwner()->IsClient()) {
|
||||||
|
killer->GetUltimateOwner()->CastToClient()->ProcessXTargetAutoHaters();
|
||||||
|
}
|
||||||
uint16 emoteid = this->GetEmoteID();
|
uint16 emoteid = this->GetEmoteID();
|
||||||
auto corpse = new Corpse(this, &itemlist, GetNPCTypeID(), &NPCTypedata,
|
auto corpse = new Corpse(this, &itemlist, GetNPCTypeID(), &NPCTypedata,
|
||||||
level > 54 ? RuleI(NPC, MajorNPCCorpseDecayTimeMS)
|
level > 54 ? RuleI(NPC, MajorNPCCorpseDecayTimeMS)
|
||||||
|
|||||||
@ -7172,7 +7172,7 @@ void Client::OpenLFGuildWindow()
|
|||||||
|
|
||||||
bool Client::IsXTarget(const Mob *m) const
|
bool Client::IsXTarget(const Mob *m) const
|
||||||
{
|
{
|
||||||
if(!XTargettingAvailable() || !m || (m->GetID() == 0))
|
if(!XTargettingAvailable() || !m || !m->IsValidXTarget())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for(int i = 0; i < GetMaxXTargets(); ++i)
|
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
|
// IT IS NOT SAFE TO CALL THIS IF IT'S NOT INITIAL AGGRO
|
||||||
void Client::AddAutoXTarget(Mob *m, bool send)
|
void Client::AddAutoXTarget(Mob *m, bool send)
|
||||||
{
|
{
|
||||||
m_activeautohatermgr->increment_count(m);
|
|
||||||
|
|
||||||
if (!XTargettingAvailable() || !XTargetAutoAddHaters || IsXTarget(m))
|
if (!XTargettingAvailable() || !XTargetAutoAddHaters || IsXTarget(m))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
m_activeautohatermgr->increment_count(m);
|
||||||
|
|
||||||
for(int i = 0; i < GetMaxXTargets(); ++i)
|
for(int i = 0; i < GetMaxXTargets(); ++i)
|
||||||
{
|
{
|
||||||
@ -7428,8 +7428,17 @@ void Client::ProcessXTargetAutoHaters()
|
|||||||
if (XTargets[i].Type != Auto)
|
if (XTargets[i].Type != Auto)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
auto *mob = entity_list.GetMob(XTargets[i].ID);
|
||||||
|
|
||||||
if (XTargets[i].ID != 0 && !GetXTargetAutoMgr()->contains_mob(XTargets[i].ID)) {
|
if (XTargets[i].ID != 0 && !GetXTargetAutoMgr()->contains_mob(XTargets[i].ID)) {
|
||||||
XTargets[i].ID = 0;
|
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;
|
XTargets[i].dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7465,6 +7474,7 @@ void Client::ProcessXTargetAutoHaters()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_dirtyautohaters = false;
|
m_dirtyautohaters = false;
|
||||||
SendXTargetUpdates();
|
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);
|
std::string full_bucket_name = fmt::format("{}-{}", GetBucketKey(), bucket_name);
|
||||||
DataBucket::SetData(full_bucket_name, bucket_value, expiration);
|
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);
|
std::string GetBucketRemaining(std::string bucket_name);
|
||||||
void SetBucket(std::string bucket_name, std::string bucket_value, std::string expiration = "");
|
void SetBucket(std::string bucket_name, std::string bucket_value, std::string expiration = "");
|
||||||
|
|
||||||
|
bool IsValidXTarget() const;
|
||||||
|
|
||||||
#ifdef BOTS
|
#ifdef BOTS
|
||||||
// Bots HealRotation methods
|
// Bots HealRotation methods
|
||||||
bool IsHealRotationTarget() { return (m_target_of_heal_rotation.use_count() && m_target_of_heal_rotation.get()); }
|
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