From 122e71f4a35e7f5efdd442db8201907c5cddf0d1 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Mon, 10 Jul 2017 20:40:32 -0500 Subject: [PATCH] Fix HP/Mana/Endurance updates for group/raids when entering-leaving zone and when initially being added to group/raid --- zone/client_packet.cpp | 9 +++++++ zone/groups.cpp | 22 +++++++++++------ zone/raids.cpp | 55 ++++++++++++++++++++++++------------------ 3 files changed, 55 insertions(+), 31 deletions(-) diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 2ca3a1ed4..daf2e5f97 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -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 diff --git a/zone/groups.cpp b/zone/groups.cpp index 6216de4ac..28b4abd6a 100644 --- a/zone/groups.cpp +++ b/zone/groups.cpp @@ -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(); diff --git a/zone/raids.cpp b/zone/raids.cpp index c9d4ee6c5..d32ad4def 100644 --- a/zone/raids.cpp +++ b/zone/raids.cpp @@ -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); } } }