mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 14:41:28 +00:00
[Position Updates] Always send position updates to group members - even when in raid
This commit is contained in:
parent
7a263c032d
commit
bb2d8f6a4d
@ -563,6 +563,7 @@ RULE_INT(Range, DamageMessages, 50)
|
||||
RULE_INT(Range, SpellMessages, 75)
|
||||
RULE_INT(Range, SongMessages, 75)
|
||||
RULE_INT(Range, MobPositionUpdates, 600)
|
||||
RULE_INT(Range, ClientPositionUpdates, 300)
|
||||
RULE_INT(Range, CriticalDamage, 80)
|
||||
RULE_INT(Range, ClientNPCScan, 300)
|
||||
RULE_CATEGORY_END()
|
||||
|
||||
@ -4634,7 +4634,19 @@ void Client::Handle_OP_ClientUpdate(const EQApplicationPacket *app)
|
||||
entity_list.QueueClientsStatus(this, outapp, true, Admin(), 250);
|
||||
}
|
||||
else {
|
||||
entity_list.QueueCloseClients(this, outapp, true, 300, nullptr, true);
|
||||
entity_list.QueueCloseClients(this, outapp, true, RuleI(Range, ClientPositionUpdates), nullptr, true);
|
||||
}
|
||||
|
||||
|
||||
/* Always send position updates to group - send when beyond normal ClientPositionUpdate range */
|
||||
Group *group = this->GetGroup();
|
||||
Raid *raid = this->GetRaid();
|
||||
|
||||
if (raid) {
|
||||
raid->QueueClients(this, outapp, true, true, (RuleI(Range, ClientPositionUpdates) * -1));
|
||||
}
|
||||
else if (group) {
|
||||
group->QueueClients(this, outapp, true, true, (RuleI(Range, ClientPositionUpdates) * -1));
|
||||
}
|
||||
|
||||
safe_delete(outapp);
|
||||
|
||||
@ -2464,3 +2464,30 @@ bool Group::HasRole(Mob *m, uint8 Role)
|
||||
return false;
|
||||
}
|
||||
|
||||
void Group::QueueClients(Mob *sender, const EQApplicationPacket *app, bool ack_required /*= true*/, bool ignore_sender /*= true*/, float distance /*= 0*/) {
|
||||
if (sender && sender->IsClient()) {
|
||||
for (uint32 i = 0; i < MAX_GROUP_MEMBERS; i++) {
|
||||
|
||||
if (!members[i])
|
||||
continue;
|
||||
|
||||
if (ignore_sender && members[i] == sender)
|
||||
continue;
|
||||
|
||||
/* If we don't have a distance requirement - send to all members */
|
||||
if (distance == 0) {
|
||||
members[i]->CastToClient()->QueuePacket(app, ack_required);
|
||||
}
|
||||
else {
|
||||
/* If negative distance - we check if current distance is greater than X */
|
||||
if (distance <= 0 && DistanceSquared(sender->GetPosition(), members[i]->GetPosition()) >= (distance * distance)) {
|
||||
members[i]->CastToClient()->QueuePacket(app, ack_required);
|
||||
}
|
||||
/* If positive distance - we check if current distance is less than X */
|
||||
else if (distance >= 0 && DistanceSquared(sender->GetPosition(), members[i]->GetPosition()) <= (distance * distance)) {
|
||||
members[i]->CastToClient()->QueuePacket(app, ack_required);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -140,6 +140,7 @@ public:
|
||||
inline int GetLeadershipAA(int AAID) { return LeaderAbilities.ranks[AAID]; }
|
||||
void ClearAllNPCMarks();
|
||||
void QueueHPPacketsForNPCHealthAA(Mob* sender, const EQApplicationPacket* app);
|
||||
void QueueClients(Mob *sender, const EQApplicationPacket *app, bool ack_required = true, bool ignore_sender = true, float distance = 0);
|
||||
void ChangeLeader(Mob* newleader);
|
||||
const char *GetClientNameByIndex(uint8 index);
|
||||
void UpdateXTargetMarkedNPC(uint32 Number, Mob *m);
|
||||
|
||||
@ -1779,3 +1779,42 @@ void Raid::SetDirtyAutoHaters()
|
||||
|
||||
}
|
||||
|
||||
void Raid::QueueClients(Mob *sender, const EQApplicationPacket *app, bool ack_required /*= true*/, bool ignore_sender /*= true*/, float distance /*= 0*/, bool group_only /*= true*/) {
|
||||
if (sender && sender->IsClient()) {
|
||||
|
||||
uint32 group_id = this->GetGroup(sender->CastToClient());
|
||||
|
||||
/* If this is a group only packet and we're not in a group -- return */
|
||||
if (!group_id == 0xFFFFFFFF && group_only)
|
||||
return;
|
||||
|
||||
for (uint32 i = 0; i < MAX_RAID_MEMBERS; i++) {
|
||||
if (!members[i].member)
|
||||
continue;
|
||||
|
||||
if (!members[i].member->IsClient())
|
||||
continue;
|
||||
|
||||
if (ignore_sender && members[i].member == sender)
|
||||
continue;
|
||||
|
||||
if (group_only && members[i].GroupNumber != group_id)
|
||||
continue;
|
||||
|
||||
/* If we don't have a distance requirement - send to all members */
|
||||
if (distance == 0) {
|
||||
members[i].member->CastToClient()->QueuePacket(app, ack_required);
|
||||
}
|
||||
else {
|
||||
/* If negative distance - we check if current distance is greater than X */
|
||||
if (distance <= 0 && DistanceSquared(sender->GetPosition(), members[i].member->GetPosition()) >= (distance * distance)) {
|
||||
members[i].member->CastToClient()->QueuePacket(app, ack_required);
|
||||
}
|
||||
/* If positive distance - we check if current distance is less than X */
|
||||
else if (distance >= 0 && DistanceSquared(sender->GetPosition(), members[i].member->GetPosition()) <= (distance * distance)) {
|
||||
members[i].member->CastToClient()->QueuePacket(app, ack_required);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -237,6 +237,8 @@ public:
|
||||
void SetDirtyAutoHaters();
|
||||
inline XTargetAutoHaters *GetXTargetAutoMgr() { return &m_autohatermgr; }
|
||||
|
||||
void QueueClients(Mob *sender, const EQApplicationPacket *app, bool ack_required = true, bool ignore_sender = true, float distance = 0, bool group_only = true);
|
||||
|
||||
RaidMember members[MAX_RAID_MEMBERS];
|
||||
char leadername[64];
|
||||
protected:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user