Fix HP/Mana/Endurance updates for group/raids when entering-leaving zone and when initially being added to group/raid

This commit is contained in:
Akkadius 2017-07-10 20:40:32 -05:00
parent c6c6d00bad
commit 122e71f4a3
3 changed files with 55 additions and 31 deletions

View File

@ -583,8 +583,17 @@ void Client::CompleteConnect()
if (raid->IsLocked())
raid->SendRaidLockTo(this);
raid->SendHPPacketsTo(this);
}
}
else {
Group *group_update = nullptr;
group_update = this->GetGroup();
if (group_update)
group_update->SendHPPacketsTo(this);
}
//bulk raid send in here eventually

View File

@ -338,6 +338,13 @@ bool Group::AddMember(Mob* newmember, const char *NewMemberName, uint32 Characte
database.SetGroupID(NewMemberName, GetID(), owner->CharacterID(), true);
}
}
Group* group = newmember->CastToClient()->GetGroup();
if (group) {
group->SendHPPacketsTo(newmember);
group->SendHPPacketsFrom(newmember);
}
}
else
{
@ -389,26 +396,25 @@ void Group::QueuePacket(const EQApplicationPacket *app, bool ack_req)
// first joins a group, but otherwise there shouldn't be a need to call it
void Group::SendHPPacketsTo(Mob *member)
{
if(member && member->IsClient())
{
if(member && member->IsClient()) {
EQApplicationPacket hpapp;
EQApplicationPacket outapp(OP_MobManaUpdate, sizeof(MobManaUpdate_Struct));
for (uint32 i = 0; i < MAX_GROUP_MEMBERS; i++)
{
if(members[i] && members[i] != member)
{
for (uint32 i = 0; i < MAX_GROUP_MEMBERS; i++) {
if(members[i] && members[i] != member) {
members[i]->CreateHPPacket(&hpapp);
member->CastToClient()->QueuePacket(&hpapp, false);
safe_delete_array(hpapp.pBuffer);
hpapp.size = 0;
if (member->CastToClient()->ClientVersion() >= EQEmu::versions::ClientVersion::SoD)
{
if (member->CastToClient()->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) {
outapp.SetOpcode(OP_MobManaUpdate);
MobManaUpdate_Struct *mmus = (MobManaUpdate_Struct *)outapp.pBuffer;
mmus->spawn_id = members[i]->GetID();
mmus->mana = members[i]->GetManaPercent();
member->CastToClient()->QueuePacket(&outapp, false);
MobEnduranceUpdate_Struct *meus = (MobEnduranceUpdate_Struct *)outapp.pBuffer;
outapp.SetOpcode(OP_MobEnduranceUpdate);
meus->endurance = members[i]->GetEndurancePercent();

View File

@ -145,6 +145,13 @@ void Raid::AddMember(Client *c, uint32 group, bool rleader, bool groupleader, bo
}
}
Group *group_update = nullptr;
group_update = c->GetGroup();
if (group_update) {
group_update->SendHPPacketsTo(c);
group_update->SendHPPacketsFrom(c);
}
auto pack = new ServerPacket(ServerOP_RaidAdd, sizeof(ServerRaidGeneralAction_Struct));
ServerRaidGeneralAction_Struct *rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer;
rga->rid = GetID();
@ -1539,35 +1546,37 @@ void Raid::MemberZoned(Client *c)
group_mentor[gid].mentoree = nullptr;
}
void Raid::SendHPPacketsTo(Client *c)
void Raid::SendHPPacketsTo(Client *client)
{
if(!c)
if(!client)
return;
uint32 gid = this->GetGroup(c);
EQApplicationPacket hpapp;
uint32 group_id = this->GetGroup(client);
EQApplicationPacket hp_packet;
EQApplicationPacket outapp(OP_MobManaUpdate, sizeof(MobManaUpdate_Struct));
for(int x = 0; x < MAX_RAID_MEMBERS; x++)
{
if(members[x].member)
{
if((members[x].member != c) && (members[x].GroupNumber == gid))
{
members[x].member->CreateHPPacket(&hpapp);
c->QueuePacket(&hpapp, false);
safe_delete_array(hpapp.pBuffer);
hpapp.size = 0;
if (c->ClientVersion() >= EQEmu::versions::ClientVersion::SoD)
{
for(int x = 0; x < MAX_RAID_MEMBERS; x++) {
if(members[x].member) {
if((members[x].member != client) && (members[x].GroupNumber == group_id)) {
members[x].member->CreateHPPacket(&hp_packet);
client->QueuePacket(&hp_packet, false);
safe_delete_array(hp_packet.pBuffer);
hp_packet.size = 0;
if (client->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) {
outapp.SetOpcode(OP_MobManaUpdate);
MobManaUpdate_Struct *mmus = (MobManaUpdate_Struct *)outapp.pBuffer;
mmus->spawn_id = members[x].member->GetID();
mmus->mana = members[x].member->GetManaPercent();
c->QueuePacket(&outapp, false);
MobManaUpdate_Struct *mana_update = (MobManaUpdate_Struct *)outapp.pBuffer;
mana_update->spawn_id = members[x].member->GetID();
mana_update->mana = members[x].member->GetManaPercent();
client->QueuePacket(&outapp, false);
outapp.SetOpcode(OP_MobEnduranceUpdate);
MobEnduranceUpdate_Struct *meus = (MobEnduranceUpdate_Struct *)outapp.pBuffer;
meus->endurance = members[x].member->GetEndurancePercent();
c->QueuePacket(&outapp, false);
MobEnduranceUpdate_Struct *endurance_update = (MobEnduranceUpdate_Struct *)outapp.pBuffer;
endurance_update->endurance = members[x].member->GetEndurancePercent();
client->QueuePacket(&outapp, false);
}
}
}