mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-21 10:11:30 +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, SpellMessages, 75)
|
||||||
RULE_INT(Range, SongMessages, 75)
|
RULE_INT(Range, SongMessages, 75)
|
||||||
RULE_INT(Range, MobPositionUpdates, 600)
|
RULE_INT(Range, MobPositionUpdates, 600)
|
||||||
|
RULE_INT(Range, ClientPositionUpdates, 300)
|
||||||
RULE_INT(Range, CriticalDamage, 80)
|
RULE_INT(Range, CriticalDamage, 80)
|
||||||
RULE_INT(Range, ClientNPCScan, 300)
|
RULE_INT(Range, ClientNPCScan, 300)
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|||||||
@ -4634,7 +4634,19 @@ void Client::Handle_OP_ClientUpdate(const EQApplicationPacket *app)
|
|||||||
entity_list.QueueClientsStatus(this, outapp, true, Admin(), 250);
|
entity_list.QueueClientsStatus(this, outapp, true, Admin(), 250);
|
||||||
}
|
}
|
||||||
else {
|
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);
|
safe_delete(outapp);
|
||||||
|
|||||||
@ -2464,3 +2464,30 @@ bool Group::HasRole(Mob *m, uint8 Role)
|
|||||||
return false;
|
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]; }
|
inline int GetLeadershipAA(int AAID) { return LeaderAbilities.ranks[AAID]; }
|
||||||
void ClearAllNPCMarks();
|
void ClearAllNPCMarks();
|
||||||
void QueueHPPacketsForNPCHealthAA(Mob* sender, const EQApplicationPacket* app);
|
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);
|
void ChangeLeader(Mob* newleader);
|
||||||
const char *GetClientNameByIndex(uint8 index);
|
const char *GetClientNameByIndex(uint8 index);
|
||||||
void UpdateXTargetMarkedNPC(uint32 Number, Mob *m);
|
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();
|
void SetDirtyAutoHaters();
|
||||||
inline XTargetAutoHaters *GetXTargetAutoMgr() { return &m_autohatermgr; }
|
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];
|
RaidMember members[MAX_RAID_MEMBERS];
|
||||||
char leadername[64];
|
char leadername[64];
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user