From 7f415479634af0145a5e843d35b01ee45151c78b Mon Sep 17 00:00:00 2001 From: Aeadoin <109764533+Aeadoin@users.noreply.github.com> Date: Sat, 25 Mar 2023 18:02:05 -0400 Subject: [PATCH] [Crash] Fix for crash in Raid::QueuePacket (#3145) * [Crash] Fix for crash in Raid::QueuePacket * bots can't be a part of BalanceMana * corrected additions * adding additional is_bot gates * updating raid for loops to be range based. * typo * formatting * formatting --- zone/attack.cpp | 62 +++++++---- zone/bot.cpp | 16 +-- zone/client.cpp | 82 ++++++-------- zone/client_packet.cpp | 2 +- zone/questmgr.cpp | 10 +- zone/raids.cpp | 47 +++++++- zone/worldserver.cpp | 241 +++++++++++++++++++++++------------------ 7 files changed, 271 insertions(+), 189 deletions(-) diff --git a/zone/attack.cpp b/zone/attack.cpp index d567985b7..a87862506 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -2505,8 +2505,10 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy bool ownerInGroup = false; if ((give_exp->HasGroup() && give_exp->GetGroup()->IsGroupMember(give_exp->GetUltimateOwner())) || (give_exp->IsPet() && (give_exp->GetOwner()->IsClient() - || (give_exp->GetOwner()->HasGroup() && give_exp->GetOwner()->GetGroup()->IsGroupMember(give_exp->GetOwner()->GetUltimateOwner()))))) + || (give_exp->GetOwner()->HasGroup() && give_exp->GetOwner()->GetGroup()->IsGroupMember(give_exp->GetOwner()->GetUltimateOwner())))) + ) { ownerInGroup = true; + } give_exp = give_exp->GetUltimateOwner(); @@ -2518,20 +2520,23 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy if (give_exp && give_exp->IsTempPet() && give_exp->IsPetOwnerClient()) { if (give_exp->IsNPC() && give_exp->CastToNPC()->GetSwarmOwner()) { Mob* temp_owner = entity_list.GetMobID(give_exp->CastToNPC()->GetSwarmOwner()); - if (temp_owner) + if (temp_owner) { give_exp = temp_owner; + } } } int PlayerCount = 0; // QueryServ Player Counting Client *give_exp_client = nullptr; - if (give_exp && give_exp->IsClient()) + if (give_exp && give_exp->IsClient()) { give_exp_client = give_exp->CastToClient(); + } //do faction hits even if we are a merchant, so long as a player killed us - if (!IsCharmed() && give_exp_client && !RuleB(NPC, EnableMeritBasedFaction)) + if (!IsCharmed() && give_exp_client && !RuleB(NPC, EnableMeritBasedFaction)) { hate_list.DoFactionHits(GetNPCFactionID(), GetPrimaryFaction(), GetFactionAmount()); + } bool IsLdonTreasure = (GetClass() == LDON_TREASURE); @@ -2559,17 +2564,22 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy } /* Send the EVENT_KILLED_MERIT event for all raid members */ - for (int i = 0; i < MAX_RAID_MEMBERS; i++) { - if (kr->members[i].member != nullptr && kr->members[i].member->IsClient()) { // If Group Member is Client - Client *c = kr->members[i].member; + for (const auto& m : kr->members) { + if (m.is_bot) { + continue; + } + + if (m.member && m.member->IsClient()) { // If Group Member is Client + Client *c = m.member; c->RecordKilledNPCEvent(this); if (parse->HasQuestSub(GetNPCTypeID(), EVENT_KILLED_MERIT)) { parse->EventNPC(EVENT_KILLED_MERIT, this, c, "killed", 0); } - if (RuleB(NPC, EnableMeritBasedFaction)) + if (RuleB(NPC, EnableMeritBasedFaction)) { c->SetFactionLevel(c->CharacterID(), GetNPCFactionID(), c->GetBaseClass(), c->GetBaseRace(), c->GetDeity()); + } PlayerCount++; } @@ -2586,9 +2596,13 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy QS->s1.NPCID = GetNPCTypeID(); QS->s1.ZoneID = GetZoneID(); QS->s1.Type = 2; // Raid Fight - for (int i = 0; i < MAX_RAID_MEMBERS; i++) { - if (kr->members[i].member != nullptr && kr->members[i].member->IsClient()) { // If Group Member is Client - Client *c = kr->members[i].member; + for (const auto& m : kr->members) { + if (m.is_bot) { + continue; + } + + if (m.member && m.member->IsClient()) { // If Group Member is Client + Client *c = m.member; QS->Chars[PlayerCount].char_id = c->CharacterID(); PlayerCount++; } @@ -2742,34 +2756,34 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy Raid* r = entity_list.GetRaidByClient(killer->CastToClient()); if (r) { int i = 0; - for (int x = 0; x < MAX_RAID_MEMBERS; x++) { + for (const auto& m : r->members) { + if (m.is_bot) { + continue; + } + switch (r->GetLootType()) { case 0: case 1: - if (r->members[x].member && r->members[x].is_raid_leader) { - corpse->AllowPlayerLoot(r->members[x].member, i); + if (m.member && m.is_raid_leader) { + corpse->AllowPlayerLoot(m.member, i); i++; } break; case 2: - if (r->members[x].member && r->members[x].is_raid_leader) { - corpse->AllowPlayerLoot(r->members[x].member, i); - i++; - } - else if (r->members[x].member && r->members[x].is_group_leader) { - corpse->AllowPlayerLoot(r->members[x].member, i); + if (m.member && (m.is_raid_leader || m.is_group_leader)) { + corpse->AllowPlayerLoot(m.member, i); i++; } break; case 3: - if (r->members[x].member && r->members[x].is_looter) { - corpse->AllowPlayerLoot(r->members[x].member, i); + if (m.member && m.is_looter) { + corpse->AllowPlayerLoot(m.member, i); i++; } break; case 4: - if (r->members[x].member) { - corpse->AllowPlayerLoot(r->members[x].member, i); + if (m.member) { + corpse->AllowPlayerLoot(m.member, i); i++; } break; diff --git a/zone/bot.cpp b/zone/bot.cpp index af8584f5d..e68789e07 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -9105,16 +9105,18 @@ std::vector Bot::GetApplySpellList( auto* r = GetRaid(); auto group_id = r->GetGroup(GetCleanName()); if (r && EQ::ValueWithin(group_id, 0, (MAX_RAID_GROUPS - 1))) { - for (auto i = 0; i < MAX_RAID_MEMBERS; i++) { - auto* m = r->members[i].member; - if (m && m->IsClient() && (!is_raid_group_only || r->GetGroup(m) == group_id)) { - l.push_back(m); + for (const auto& m : r->members) { + if (m.is_bot) { + continue; + } + if (m.member && m.member->IsClient() && (!is_raid_group_only || r->GetGroup(m.member) == group_id)) { + l.push_back(m.member); - if (allow_pets && m->HasPet()) { - l.push_back(m->GetPet()); + if (allow_pets && m.member->HasPet()) { + l.push_back(m.member->GetPet()); } - const auto& sbl = entity_list.GetBotListByCharacterID(m->CharacterID()); + const auto& sbl = entity_list.GetBotListByCharacterID(m.member->CharacterID()); for (const auto& b : sbl) { l.push_back(b); } diff --git a/zone/client.cpp b/zone/client.cpp index d820328df..7b87af474 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -798,24 +798,21 @@ bool Client::SendAllPackets() { } void Client::QueuePacket(const EQApplicationPacket* app, bool ack_req, CLIENT_CONN_STATUS required_state, eqFilterType filter) { - if(filter!=FilterNone){ - //this is incomplete... no support for FilterShowGroupOnly or FilterShowSelfOnly - if(GetFilter(filter) == FilterHide) - return; //Client has this filter on, no need to send packet + if (filter != FilterNone && GetFilter(filter) == FilterHide) { + return; } - if(client_state != CLIENT_CONNECTED && required_state == CLIENT_CONNECTED){ + + if (client_state != CLIENT_CONNECTED && required_state == CLIENT_CONNECTED) { AddPacket(app, ack_req); return; } // if the program doesnt care about the status or if the status isnt what we requested - if (required_state != CLIENT_CONNECTINGALL && client_state != required_state) - { + if (required_state != CLIENT_CONNECTINGALL && client_state != required_state) { // todo: save packets for later use AddPacket(app, ack_req); } - else if (eqs) - { + else if (eqs) { eqs->QueuePacket(app, ack_req); } } @@ -4143,42 +4140,32 @@ void Client::UpdateLFP() { bool Client::GroupFollow(Client* inviter) { - if (inviter) - { + if (inviter) { isgrouped = true; Raid* raid = entity_list.GetRaidByClient(inviter); Raid* iraid = entity_list.GetRaidByClient(this); //inviter has a raid don't do group stuff instead do raid stuff! - if (raid) - { + if (raid) { // Suspend the merc while in a raid (maybe a rule could be added for this) - if (GetMerc()) + if (GetMerc()) { GetMerc()->Suspend(); + } uint32 groupToUse = 0xFFFFFFFF; - for (int x = 0; x < MAX_RAID_MEMBERS; x++) - { - if (raid->members[x].member) - { - //this assumes the inviter is in the zone - if (raid->members[x].member == inviter){ - groupToUse = raid->members[x].group_number; - break; - } + for (const auto& m : raid->members) { + if (m.member && m.member == inviter) { + groupToUse = m.group_number; + break; } } - if (iraid == raid) - { + if (iraid == raid) { //both in same raid uint32 ngid = raid->GetGroup(inviter->GetName()); - if (raid->GroupCount(ngid) < 6) - { + if (raid->GroupCount(ngid) < 6) { raid->MoveMember(GetName(), ngid); raid->SendGroupDisband(this); - //raid->SendRaidGroupAdd(GetName(), ngid); - //raid->SendGroupUpdate(this); - raid->GroupUpdate(ngid); //break + raid->GroupUpdate(ngid); } return false; } @@ -8866,16 +8853,15 @@ void Client::ProcessAggroMeter() if (m_aggrometer.set_pct(AggroMeter::AT_Secondary, has_aggro ? cur_tar->GetHateRatio(this, secondary) : secondary ? 100 : 0)) add_entry(AggroMeter::AT_Secondary); - // fuuuuuuuuuuuuuuuuuuuuuuuucckkkkkkkkkkkkkkk raids if (IsRaidGrouped()) { auto raid = GetRaid(); if (raid) { auto gid = raid->GetGroup(this); - if (gid < 12) { + if (gid < MAX_RAID_GROUPS) { int at_id = AggroMeter::AT_Group1; - for (int i = 0; i < MAX_RAID_MEMBERS; ++i) { - if (raid->members[i].member && raid->members[i].member != this && raid->members[i].group_number == gid) { - if (m_aggrometer.set_pct(static_cast(at_id), cur_tar->GetHateRatio(cur_tar->GetTarget(), raid->members[i].member))) + for (const auto& m : raid->members) { + if (m.member && m.member != this && m.group_number == gid) { + if (m_aggrometer.set_pct(static_cast(at_id), cur_tar->GetHateRatio(cur_tar->GetTarget(), m.member))) add_entry(static_cast(at_id)); at_id++; if (at_id > AggroMeter::AT_Group5) @@ -10956,11 +10942,14 @@ std::vector Client::GetPartyMembers() std::vector clients_to_update = {}; // raid - Raid *raid = entity_list.GetRaidByClient(this); - if (raid) { - for (auto &e : raid->members) { - if (e.member && e.member->IsClient()) { - clients_to_update.push_back(e.member->CastToClient()); + if (const auto raid = entity_list.GetRaidByClient(this)) { + for (auto &m : raid->members) { + if (m.is_bot) { + continue; + } + + if (m.member && m.member->IsClient()) { + clients_to_update.push_back(m.member->CastToClient()); } } } @@ -11747,17 +11736,16 @@ std::vector Client::GetApplySpellList( auto* r = GetRaid(); auto group_id = r->GetGroup(this); if (r && EQ::ValueWithin(group_id, 0, (MAX_RAID_GROUPS - 1))) { - for (auto i = 0; i < MAX_RAID_MEMBERS; i++) { - auto* m = r->members[i].member; - if (m && m->IsClient() && (!is_raid_group_only || r->GetGroup(m) == group_id)) { - l.push_back(m); + for (const auto& m : r->members) { + if (m.member && m.member->IsClient() && (!is_raid_group_only || r->GetGroup(m.member) == group_id)) { + l.push_back(m.member); - if (allow_pets && m->HasPet()) { - l.push_back(m->GetPet()); + if (allow_pets && m.member->HasPet()) { + l.push_back(m.member->GetPet()); } if (allow_bots) { - const auto& sbl = entity_list.GetBotListByCharacterID(m->CharacterID()); + const auto& sbl = entity_list.GetBotListByCharacterID(m.member->CharacterID()); for (const auto& b : sbl) { l.push_back(b); } diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 1ea1a85c8..85fb68804 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -12183,7 +12183,7 @@ void Client::Handle_OP_RaidCommand(const EQApplicationPacket* app) uint32 i = raid->GetPlayerIndex(raid_command_packet->leader_name); raid->SetNewRaidLeader(i); raid->HandleBotGroupDisband(c_to_disband->CharacterID()); - raid->HandleOfflineBots(c_to_disband->CharacterID()); + raid->HandleOfflineBots(c_to_disband->CharacterID()); raid->RemoveMember(raid_command_packet->leader_name); raid->SendGroupDisband(c_to_disband); raid->GroupUpdate(group); diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 027df7e0b..57e074891 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -448,9 +448,13 @@ void QuestManager::ZoneRaid(const char *zone_name) { initiator->MoveZone(zone_name); } else { auto client_raid = initiator->GetRaid(); - for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { - if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { - auto raid_member = client_raid->members[member_index].member->CastToClient(); + for (const auto& m : client_raid->members) { + if (m.is_bot) { + continue; + } + + if (m.member && m.member->IsClient()) { + auto raid_member = m.member->CastToClient(); raid_member->MoveZone(zone_name); } } diff --git a/zone/raids.cpp b/zone/raids.cpp index 54250e680..43f27530d 100644 --- a/zone/raids.cpp +++ b/zone/raids.cpp @@ -611,9 +611,8 @@ void Raid::RaidGroupSay(const char *msg, Client *c, uint8 language, uint8 lang_s uint32 Raid::GetPlayerIndex(const char *name) { - for(int x = 0; x < MAX_RAID_MEMBERS; x++) - { - if(strcmp(name, members[x].member_name) == 0) { + for (int x = 0; x < MAX_RAID_MEMBERS; x++) { + if (strcmp(name, members[x].member_name) == 0) { return x; } } @@ -832,6 +831,10 @@ void Raid::BalanceMana(int32 penalty, uint32 gid, float range, Mob* caster, int3 manataken /= numMem; for (const auto& m : members) { + if (m.is_bot) { + continue; + } + if (m.member && m.group_number == gid) { distance = DistanceSquared(caster->GetPosition(), m.member->GetPosition()); @@ -875,6 +878,10 @@ void Raid::SplitMoney(uint32 gid, uint32 copper, uint32 silver, uint32 gold, uin uint8 member_count = 0; for (const auto& m : members) { + if (m.is_bot) { + continue; + } + if (m.member && m.group_number == gid && m.member->IsClient()) { member_count++; } @@ -914,6 +921,10 @@ void Raid::SplitMoney(uint32 gid, uint32 copper, uint32 silver, uint32 gold, uin auto platinum_split = platinum / member_count; for (const auto& m : members) { + if (m.is_bot) { + continue; + } + if (m.member && m.group_number == gid && m.member->IsClient()) { // If Group Member is Client m.member->AddMoneyToPP( copper_split, @@ -952,6 +963,10 @@ void Raid::SplitMoney(uint32 gid, uint32 copper, uint32 silver, uint32 gold, uin void Raid::TeleportGroup(Mob* sender, uint32 zoneID, uint16 instance_id, float x, float y, float z, float heading, uint32 gid) { for (const auto& m : members) { + if (m.is_bot) { + continue; + } + if (m.member && m.group_number == gid && m.member->IsClient()) { m.member->MovePC(zoneID, instance_id, x, y, z, heading, 0, ZoneSolicited); } @@ -961,6 +976,10 @@ void Raid::TeleportGroup(Mob* sender, uint32 zoneID, uint16 instance_id, float x void Raid::TeleportRaid(Mob* sender, uint32 zoneID, uint16 instance_id, float x, float y, float z, float heading) { for (const auto& m : members) { + if (m.is_bot) { + continue; + } + if (m.member && m.member->IsClient()) { m.member->MovePC(zoneID, instance_id, x, y, z, heading, 0, ZoneSolicited); } @@ -981,6 +1000,10 @@ void Raid::AddRaidLooter(const char* looter) auto results = database.QueryDatabase(query); for (auto& m : members) { + if (m.is_bot) { + continue; + } + if (strcmp(looter, m.member_name) == 0) { m.is_looter = true; break; @@ -1002,6 +1025,10 @@ void Raid::RemoveRaidLooter(const char* looter) auto results = database.QueryDatabase(query); for (auto& m: members) { + if (m.is_bot) { + continue; + } + if (strcmp(looter, m.member_name) == 0) { m.is_looter = false; break; @@ -1258,6 +1285,10 @@ void Raid::SendBulkRaid(Client *to) void Raid::QueuePacket(const EQApplicationPacket *app, bool ack_req) { for (const auto& m : members) { + if (m.is_bot) { + continue; + } + if (m.member && m.member->IsClient()) { m.member->QueuePacket(app, ack_req); } @@ -1332,7 +1363,7 @@ void Raid::SendGroupUpdate(Client *to) gu->action = groupActUpdate; int i = 0; uint32 grp = GetGroup(to->GetName()); - if (grp >= MAX_RAID_MEMBERS) { + if (grp >= MAX_RAID_GROUPS) { safe_delete(outapp); return; } @@ -1502,6 +1533,10 @@ void Raid::SendRaidMOTD() } for (const auto& m: members) { + if (m.is_bot) { + continue; + } + if (m.member) { SendRaidMOTD(m.member); } @@ -1911,6 +1946,10 @@ const char *Raid::GetClientNameByIndex(uint8 index) void Raid::RaidMessageString(Mob* sender, uint32 type, uint32 string_id, const char* message,const char* message2,const char* message3,const char* message4,const char* message5,const char* message6,const char* message7,const char* message8,const char* message9, uint32 distance) { for (const auto& m : members) { + if (m.is_bot) { + continue; + } + if (m.member && m.member->IsClient() && m.member != sender) { m.member->MessageString(type, string_id, message, message2, message3, message4, message5, message6, message7, message8, message9, distance); diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 70013c3e6..699db95fb 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -294,12 +294,19 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) case VoiceMacroRaid: { Raid *r = entity_list.GetRaidByID(svm->RaidID); - if (!r) + if (!r) { break; + } - for (int i = 0; i < MAX_RAID_MEMBERS; i++) - if (r->members[i].member) - r->members[i].member->QueuePacket(outapp); + for (const auto& m: r->members) { + if (m.is_bot) { + continue; + } + + if (m.member) { + m.member->QueuePacket(outapp); + } + } break; } @@ -1055,7 +1062,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { auto outapp = new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupJoin_Struct)); - GroupJoin_Struct* outgj = (GroupJoin_Struct*)outapp->pBuffer; + auto outgj = (GroupJoin_Struct*)outapp->pBuffer; strcpy(outgj->membername, Inviter->GetName()); strcpy(outgj->yourname, Inviter->GetName()); outgj->action = groupActInviteInitial; // 'You have formed the group'. @@ -1095,7 +1102,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) Inviter->CastToClient()->UpdateLFP(); auto pack2 = new ServerPacket(ServerOP_GroupJoin, sizeof(ServerGroupJoin_Struct)); - ServerGroupJoin_Struct* gj = (ServerGroupJoin_Struct*)pack2->pBuffer; + auto gj = (ServerGroupJoin_Struct*)pack2->pBuffer; gj->gid = group->GetID(); gj->zoneid = zone->GetZoneID(); gj->instance_id = zone->GetInstanceID(); @@ -1213,7 +1220,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_GroupJoin: { - ServerGroupJoin_Struct* gj = (ServerGroupJoin_Struct*)pack->pBuffer; + auto gj = (ServerGroupJoin_Struct*)pack->pBuffer; if (zone) { if (gj->zoneid == zone->GetZoneID() && gj->instance_id == zone->GetInstanceID()) break; @@ -1259,7 +1266,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_RaidAdd: { - ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; + auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; if (zone) { if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) break; @@ -1274,7 +1281,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_RaidRemove: { - ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; + auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; if (zone) { if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) break; @@ -1294,7 +1301,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_RaidDisband: { - ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; + auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; if (zone) { if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) break; @@ -1309,7 +1316,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_RaidLockFlag: { - ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; + auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; if (zone) { if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) break; @@ -1326,7 +1333,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_RaidChangeGroup: { - ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; + auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; if (zone) { if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) break; @@ -1354,7 +1361,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_UpdateGroup: { - ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; + auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; if (zone) { if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) break; @@ -1367,7 +1374,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_RaidGroupLeader: { - ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; + auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; if (zone) { if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) break; @@ -1375,7 +1382,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_RaidLeader: { - ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; + auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; if (zone) { if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) break; @@ -1395,7 +1402,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_DetailsChange: { - ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; + auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; if (zone) { if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) break; @@ -1410,7 +1417,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_RaidGroupDisband: { - ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; + auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; if (zone) { if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) break; @@ -1420,7 +1427,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { auto outapp = new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupUpdate_Struct)); - GroupUpdate_Struct* gu = (GroupUpdate_Struct*)outapp->pBuffer; + auto gu = (GroupUpdate_Struct*)outapp->pBuffer; gu->action = groupActDisband; strn0cpy(gu->leadersname, c->GetName(), 64); strn0cpy(gu->yourname, c->GetName(), 64); @@ -1430,27 +1437,26 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_RaidGroupAdd: { - ServerRaidGroupAction_Struct* rga = (ServerRaidGroupAction_Struct*)pack->pBuffer; + auto rga = (ServerRaidGroupAction_Struct*)pack->pBuffer; if (zone) { Raid *r = entity_list.GetRaidByID(rga->rid); if (r) { r->LearnMembers(); r->VerifyRaid(); auto outapp = new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupJoin_Struct)); - GroupJoin_Struct* gj = (GroupJoin_Struct*)outapp->pBuffer; + auto gj = (GroupJoin_Struct*)outapp->pBuffer; strn0cpy(gj->membername, rga->membername, 64); gj->action = groupActJoin; - for (int x = 0; x < MAX_RAID_MEMBERS; x++) - { - if (r->members[x].member) - { - if (strcmp(r->members[x].member->GetName(), rga->membername) != 0) { - if ((rga->gid < 12) && rga->gid == r->members[x].group_number) - { - strn0cpy(gj->yourname, r->members[x].member->GetName(), 64); - r->members[x].member->QueuePacket(outapp); - } + for (const auto& m : r->members) { + if (m.is_bot) { + continue; + } + + if (m.member && strcmp(m.member->GetName(), rga->membername) != 0) { + if ((rga->gid < MAX_RAID_GROUPS) && rga->gid == m.group_number) { + strn0cpy(gj->yourname, m.member->GetName(), 64); + m.member->QueuePacket(outapp); } } } @@ -1460,27 +1466,26 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_RaidGroupRemove: { - ServerRaidGroupAction_Struct* rga = (ServerRaidGroupAction_Struct*)pack->pBuffer; + auto rga = (ServerRaidGroupAction_Struct*)pack->pBuffer; if (zone) { Raid *r = entity_list.GetRaidByID(rga->rid); if (r) { r->LearnMembers(); r->VerifyRaid(); auto outapp = new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupJoin_Struct)); - GroupJoin_Struct* gj = (GroupJoin_Struct*)outapp->pBuffer; + auto gj = (GroupJoin_Struct*)outapp->pBuffer; strn0cpy(gj->membername, rga->membername, 64); gj->action = groupActLeave; - for (int x = 0; x < MAX_RAID_MEMBERS; x++) - { - if (r->members[x].member) - { - if (strcmp(r->members[x].member->GetName(), rga->membername) != 0) { - if ((rga->gid < 12) && rga->gid == r->members[x].group_number) - { - strn0cpy(gj->yourname, r->members[x].member->GetName(), 64); - r->members[x].member->QueuePacket(outapp); - } + for (const auto& m : r->members) { + if (m.is_bot) { + continue; + } + + if (m.member && strcmp(m.member->GetName(), rga->membername) != 0) { + if ((rga->gid < MAX_RAID_GROUPS) && rga->gid == m.group_number) { + strn0cpy(gj->yourname, m.member->GetName(), 64); + m.member->QueuePacket(outapp); } } } @@ -1490,21 +1495,19 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_RaidGroupSay: { - ServerRaidMessage_Struct* rmsg = (ServerRaidMessage_Struct*)pack->pBuffer; + auto rmsg = (ServerRaidMessage_Struct*)pack->pBuffer; if (zone) { Raid *r = entity_list.GetRaidByID(rmsg->rid); - if (r) - { - for (int x = 0; x < MAX_RAID_MEMBERS; x++) - { - if (r->members[x].member) { - if (strcmp(rmsg->from, r->members[x].member->GetName()) != 0) - { - if (r->members[x].group_number == rmsg->gid) { - if (!r->members[x].is_bot && r->members[x].member->GetFilter(FilterGroupChat) != 0) - { - r->members[x].member->ChannelMessageSend(rmsg->from, r->members[x].member->GetName(), ChatChannel_Group, rmsg->language, rmsg->lang_skill, rmsg->message); - } + if (r) { + for (const auto& m :r->members) { + if (m.is_bot) { + continue; + } + + if (m.member && strcmp(m.member->GetName(), rmsg->from) != 0) { + if (m.group_number == rmsg->gid) { + if (m.member->GetFilter(FilterGroupChat) != 0) { + m.member->ChannelMessageSend(rmsg->from, m.member->GetName(), ChatChannel_Group, rmsg->language, rmsg->lang_skill, rmsg->message); } } } @@ -1514,20 +1517,20 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_RaidSay: { - ServerRaidMessage_Struct* rmsg = (ServerRaidMessage_Struct*)pack->pBuffer; - if (zone) - { + auto rmsg = (ServerRaidMessage_Struct*)pack->pBuffer; + if (zone) { Raid *r = entity_list.GetRaidByID(rmsg->rid); - if (r) - { - for (int x = 0; x < MAX_RAID_MEMBERS; x++) - { - if (r->members[x].member) { - if (strcmp(rmsg->from, r->members[x].member->GetName()) != 0) - { - if (!r->members[x].is_bot && r->members[x].member->GetFilter(FilterGroupChat) != 0) - { - r->members[x].member->ChannelMessageSend(rmsg->from, r->members[x].member->GetName(), ChatChannel_Raid, rmsg->language, rmsg->lang_skill, rmsg->message); + + if (r) { + for (const auto& m :r->members) { + if (m.is_bot) { + continue; + } + + if (m.member) { + if (strcmp(rmsg->from, m.member->GetName()) != 0) { + if (!m.is_bot && m.member->GetFilter(FilterGroupChat) != 0) { + m.member->ChannelMessageSend(rmsg->from, m.member->GetName(), ChatChannel_Raid, rmsg->language, rmsg->lang_skill, rmsg->message); } } } @@ -2144,10 +2147,13 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } else if (update_type == CZUpdateType_Raid) { auto client_raid = entity_list.GetRaidByID(update_identifier); if (client_raid) { - for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { - if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { - auto raid_member = client_raid->members[member_index].member->CastToClient(); - DialogueWindow::Render(raid_member, message); + for (const auto& m : client_raid->members) { + if (m.is_bot) { + continue; + } + + if (m.member && m.member->IsClient()) { + DialogueWindow::Render( m.member->CastToClient(), message); } } } @@ -2235,24 +2241,27 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } else if (update_type == CZUpdateType_Raid) { auto client_raid = entity_list.GetRaidByID(update_identifier); if (client_raid) { - for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { - auto client_raid_member = client_raid->members[member_index].member; - if (client_raid_member && client_raid_member->IsClient()) { + for (const auto& m : client_raid->members) { + if (m.is_bot) { + continue; + } + + if (m.member && m.member->IsClient()) { switch (update_subtype) { case CZLDoNUpdateSubtype_AddLoss: - client_raid_member->UpdateLDoNWinLoss(theme_id, false); + m.member->UpdateLDoNWinLoss(theme_id, false); break; case CZLDoNUpdateSubtype_AddPoints: - client_raid_member->UpdateLDoNPoints(theme_id, points); + m.member->UpdateLDoNPoints(theme_id, points); break; case CZLDoNUpdateSubtype_AddWin: - client_raid_member->UpdateLDoNWinLoss(theme_id, true); + m.member->UpdateLDoNWinLoss(theme_id, true); break; case CZLDoNUpdateSubtype_RemoveLoss: - client_raid_member->UpdateLDoNWinLoss(theme_id, false, true); + m.member->UpdateLDoNWinLoss(theme_id, false, true); break; case CZLDoNUpdateSubtype_RemoveWin: - client_raid_member->UpdateLDoNWinLoss(theme_id, true, true); + m.member->UpdateLDoNWinLoss(theme_id, true, true); break; default: break; @@ -2365,9 +2374,13 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } else if (update_type == CZUpdateType_Raid) { auto client_raid = entity_list.GetRaidByID(update_identifier); if (client_raid) { - for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { - if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { - auto raid_member = client_raid->members[member_index].member->CastToClient(); + for (const auto& m : client_raid->members) { + if (m.is_bot) { + continue; + } + + if (m.member && m.member->IsClient()) { + auto raid_member = m.member->CastToClient(); raid_member->SendMarqueeMessage(type, priority, fade_in, fade_out, duration, message); } } @@ -2418,9 +2431,13 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } else if (update_type == CZUpdateType_Raid) { auto client_raid = entity_list.GetRaidByID(update_identifier); if (client_raid) { - for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { - if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { - auto raid_member = client_raid->members[member_index].member->CastToClient(); + for (const auto& m : client_raid->members) { + if (m.is_bot) { + continue; + } + + if (m.member && m.member->IsClient()) { + auto raid_member = m.member->CastToClient(); raid_member->Message(type, message); } } @@ -2486,9 +2503,13 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } else if (update_type == CZUpdateType_Raid) { auto client_raid = entity_list.GetRaidByID(update_identifier); if (client_raid) { - for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { - if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { - auto raid_member = client_raid->members[member_index].member->CastToClient(); + for (const auto& m : client_raid->members) { + if (m.is_bot) { + continue; + } + + if (m.member && m.member->IsClient()) { + auto raid_member = m.member->CastToClient(); switch (update_subtype) { case CZMoveUpdateSubtype_MoveZone: raid_member->MoveZone(zone_short_name); @@ -2567,9 +2588,13 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } else if (update_type == CZUpdateType_Raid) { auto client_raid = entity_list.GetRaidByID(update_identifier); if (client_raid) { - for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { - if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { - auto raid_member = client_raid->members[member_index].member->CastToClient(); + for (const auto& m : client_raid->members) { + if (m.is_bot) { + continue; + } + + if (m.member && m.member->IsClient()) { + auto raid_member = m.member->CastToClient(); raid_member->SetEntityVariable(variable_name, variable_value); } } @@ -2601,7 +2626,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } case ServerOP_CZSignal: { - CZSignal_Struct* CZS = (CZSignal_Struct*) pack->pBuffer; + auto CZS = (CZSignal_Struct*) pack->pBuffer; uint8 update_type = CZS->update_type; int update_identifier = CZS->update_identifier; int signal_id = CZS->signal_id; @@ -2624,10 +2649,13 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } else if (update_type == CZUpdateType_Raid) { auto client_raid = entity_list.GetRaidByID(update_identifier); if (client_raid) { - for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { - if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { - auto raid_member = client_raid->members[member_index].member->CastToClient(); - raid_member->Signal(signal_id); + for (const auto& m : client_raid->members) { + if (m.is_bot) { + continue; + } + + if (m.member && m.member->IsClient()) { + m.member->CastToClient()->Signal(signal_id); } } } @@ -2696,9 +2724,13 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } else if (update_type == CZUpdateType_Raid) { auto client_raid = entity_list.GetRaidByID(update_identifier); if (client_raid) { - for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { - if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { - auto raid_member = client_raid->members[member_index].member->CastToClient(); + for (const auto& m : client_raid->members) { + if (m.is_bot) { + continue; + } + + if (m.member && m.member->IsClient()) { + auto raid_member = m.member->CastToClient(); switch (update_subtype) { case CZSpellUpdateSubtype_Cast: raid_member->ApplySpellBuff(spell_id); @@ -2825,9 +2857,12 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } else if (update_type == CZUpdateType_Raid) { auto client_raid = entity_list.GetRaidByID(update_identifier); if (client_raid) { - for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { - if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { - auto raid_member = client_raid->members[member_index].member->CastToClient(); + for (const auto& m : client_raid->members) { + if (m.is_bot) { + continue; + } + if (m.member && m.member->IsClient()) { + auto raid_member = m.member->CastToClient(); switch (update_subtype) { case CZTaskUpdateSubtype_ActivityReset: raid_member->ResetTaskActivity(task_identifier, task_subidentifier);