[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
This commit is contained in:
Aeadoin 2023-03-25 18:02:05 -04:00 committed by GitHub
parent 2e4071cdcf
commit 7f41547963
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 271 additions and 189 deletions

View File

@ -2505,8 +2505,10 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
bool ownerInGroup = false; bool ownerInGroup = false;
if ((give_exp->HasGroup() && give_exp->GetGroup()->IsGroupMember(give_exp->GetUltimateOwner())) if ((give_exp->HasGroup() && give_exp->GetGroup()->IsGroupMember(give_exp->GetUltimateOwner()))
|| (give_exp->IsPet() && (give_exp->GetOwner()->IsClient() || (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; ownerInGroup = true;
}
give_exp = give_exp->GetUltimateOwner(); 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 && give_exp->IsTempPet() && give_exp->IsPetOwnerClient()) {
if (give_exp->IsNPC() && give_exp->CastToNPC()->GetSwarmOwner()) { if (give_exp->IsNPC() && give_exp->CastToNPC()->GetSwarmOwner()) {
Mob* temp_owner = entity_list.GetMobID(give_exp->CastToNPC()->GetSwarmOwner()); Mob* temp_owner = entity_list.GetMobID(give_exp->CastToNPC()->GetSwarmOwner());
if (temp_owner) if (temp_owner) {
give_exp = temp_owner; give_exp = temp_owner;
} }
} }
}
int PlayerCount = 0; // QueryServ Player Counting int PlayerCount = 0; // QueryServ Player Counting
Client *give_exp_client = nullptr; Client *give_exp_client = nullptr;
if (give_exp && give_exp->IsClient()) if (give_exp && give_exp->IsClient()) {
give_exp_client = give_exp->CastToClient(); give_exp_client = give_exp->CastToClient();
}
//do faction hits even if we are a merchant, so long as a player killed us //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()); hate_list.DoFactionHits(GetNPCFactionID(), GetPrimaryFaction(), GetFactionAmount());
}
bool IsLdonTreasure = (GetClass() == LDON_TREASURE); 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 */ /* Send the EVENT_KILLED_MERIT event for all raid members */
for (int i = 0; i < MAX_RAID_MEMBERS; i++) { for (const auto& m : kr->members) {
if (kr->members[i].member != nullptr && kr->members[i].member->IsClient()) { // If Group Member is Client if (m.is_bot) {
Client *c = kr->members[i].member; continue;
}
if (m.member && m.member->IsClient()) { // If Group Member is Client
Client *c = m.member;
c->RecordKilledNPCEvent(this); c->RecordKilledNPCEvent(this);
if (parse->HasQuestSub(GetNPCTypeID(), EVENT_KILLED_MERIT)) { if (parse->HasQuestSub(GetNPCTypeID(), EVENT_KILLED_MERIT)) {
parse->EventNPC(EVENT_KILLED_MERIT, this, c, "killed", 0); 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()); c->SetFactionLevel(c->CharacterID(), GetNPCFactionID(), c->GetBaseClass(), c->GetBaseRace(), c->GetDeity());
}
PlayerCount++; PlayerCount++;
} }
@ -2586,9 +2596,13 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
QS->s1.NPCID = GetNPCTypeID(); QS->s1.NPCID = GetNPCTypeID();
QS->s1.ZoneID = GetZoneID(); QS->s1.ZoneID = GetZoneID();
QS->s1.Type = 2; // Raid Fight QS->s1.Type = 2; // Raid Fight
for (int i = 0; i < MAX_RAID_MEMBERS; i++) { for (const auto& m : kr->members) {
if (kr->members[i].member != nullptr && kr->members[i].member->IsClient()) { // If Group Member is Client if (m.is_bot) {
Client *c = kr->members[i].member; continue;
}
if (m.member && m.member->IsClient()) { // If Group Member is Client
Client *c = m.member;
QS->Chars[PlayerCount].char_id = c->CharacterID(); QS->Chars[PlayerCount].char_id = c->CharacterID();
PlayerCount++; 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()); Raid* r = entity_list.GetRaidByClient(killer->CastToClient());
if (r) { if (r) {
int i = 0; 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()) { switch (r->GetLootType()) {
case 0: case 0:
case 1: case 1:
if (r->members[x].member && r->members[x].is_raid_leader) { if (m.member && m.is_raid_leader) {
corpse->AllowPlayerLoot(r->members[x].member, i); corpse->AllowPlayerLoot(m.member, i);
i++; i++;
} }
break; break;
case 2: case 2:
if (r->members[x].member && r->members[x].is_raid_leader) { if (m.member && (m.is_raid_leader || m.is_group_leader)) {
corpse->AllowPlayerLoot(r->members[x].member, i); corpse->AllowPlayerLoot(m.member, i);
i++;
}
else if (r->members[x].member && r->members[x].is_group_leader) {
corpse->AllowPlayerLoot(r->members[x].member, i);
i++; i++;
} }
break; break;
case 3: case 3:
if (r->members[x].member && r->members[x].is_looter) { if (m.member && m.is_looter) {
corpse->AllowPlayerLoot(r->members[x].member, i); corpse->AllowPlayerLoot(m.member, i);
i++; i++;
} }
break; break;
case 4: case 4:
if (r->members[x].member) { if (m.member) {
corpse->AllowPlayerLoot(r->members[x].member, i); corpse->AllowPlayerLoot(m.member, i);
i++; i++;
} }
break; break;

View File

@ -9105,16 +9105,18 @@ std::vector<Mob*> Bot::GetApplySpellList(
auto* r = GetRaid(); auto* r = GetRaid();
auto group_id = r->GetGroup(GetCleanName()); auto group_id = r->GetGroup(GetCleanName());
if (r && EQ::ValueWithin(group_id, 0, (MAX_RAID_GROUPS - 1))) { if (r && EQ::ValueWithin(group_id, 0, (MAX_RAID_GROUPS - 1))) {
for (auto i = 0; i < MAX_RAID_MEMBERS; i++) { for (const auto& m : r->members) {
auto* m = r->members[i].member; if (m.is_bot) {
if (m && m->IsClient() && (!is_raid_group_only || r->GetGroup(m) == group_id)) { continue;
l.push_back(m); }
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()) { if (allow_pets && m.member->HasPet()) {
l.push_back(m->GetPet()); 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) { for (const auto& b : sbl) {
l.push_back(b); l.push_back(b);
} }

View File

@ -798,24 +798,21 @@ bool Client::SendAllPackets() {
} }
void Client::QueuePacket(const EQApplicationPacket* app, bool ack_req, CLIENT_CONN_STATUS required_state, eqFilterType filter) { void Client::QueuePacket(const EQApplicationPacket* app, bool ack_req, CLIENT_CONN_STATUS required_state, eqFilterType filter) {
if(filter!=FilterNone){ if (filter != FilterNone && GetFilter(filter) == FilterHide) {
//this is incomplete... no support for FilterShowGroupOnly or FilterShowSelfOnly return;
if(GetFilter(filter) == FilterHide)
return; //Client has this filter on, no need to send packet
} }
if(client_state != CLIENT_CONNECTED && required_state == CLIENT_CONNECTED){
if (client_state != CLIENT_CONNECTED && required_state == CLIENT_CONNECTED) {
AddPacket(app, ack_req); AddPacket(app, ack_req);
return; return;
} }
// if the program doesnt care about the status or if the status isnt what we requested // 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 // todo: save packets for later use
AddPacket(app, ack_req); AddPacket(app, ack_req);
} }
else if (eqs) else if (eqs) {
{
eqs->QueuePacket(app, ack_req); eqs->QueuePacket(app, ack_req);
} }
} }
@ -4143,42 +4140,32 @@ void Client::UpdateLFP() {
bool Client::GroupFollow(Client* inviter) { bool Client::GroupFollow(Client* inviter) {
if (inviter) if (inviter) {
{
isgrouped = true; isgrouped = true;
Raid* raid = entity_list.GetRaidByClient(inviter); Raid* raid = entity_list.GetRaidByClient(inviter);
Raid* iraid = entity_list.GetRaidByClient(this); Raid* iraid = entity_list.GetRaidByClient(this);
//inviter has a raid don't do group stuff instead do raid stuff! //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) // Suspend the merc while in a raid (maybe a rule could be added for this)
if (GetMerc()) if (GetMerc()) {
GetMerc()->Suspend(); GetMerc()->Suspend();
}
uint32 groupToUse = 0xFFFFFFFF; uint32 groupToUse = 0xFFFFFFFF;
for (int x = 0; x < MAX_RAID_MEMBERS; x++) for (const auto& m : raid->members) {
{ if (m.member && m.member == inviter) {
if (raid->members[x].member) groupToUse = m.group_number;
{
//this assumes the inviter is in the zone
if (raid->members[x].member == inviter){
groupToUse = raid->members[x].group_number;
break; break;
} }
} }
} if (iraid == raid) {
if (iraid == raid)
{
//both in same raid //both in same raid
uint32 ngid = raid->GetGroup(inviter->GetName()); uint32 ngid = raid->GetGroup(inviter->GetName());
if (raid->GroupCount(ngid) < 6) if (raid->GroupCount(ngid) < 6) {
{
raid->MoveMember(GetName(), ngid); raid->MoveMember(GetName(), ngid);
raid->SendGroupDisband(this); raid->SendGroupDisband(this);
//raid->SendRaidGroupAdd(GetName(), ngid); raid->GroupUpdate(ngid);
//raid->SendGroupUpdate(this);
raid->GroupUpdate(ngid); //break
} }
return false; 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)) if (m_aggrometer.set_pct(AggroMeter::AT_Secondary, has_aggro ? cur_tar->GetHateRatio(this, secondary) : secondary ? 100 : 0))
add_entry(AggroMeter::AT_Secondary); add_entry(AggroMeter::AT_Secondary);
// fuuuuuuuuuuuuuuuuuuuuuuuucckkkkkkkkkkkkkkk raids
if (IsRaidGrouped()) { if (IsRaidGrouped()) {
auto raid = GetRaid(); auto raid = GetRaid();
if (raid) { if (raid) {
auto gid = raid->GetGroup(this); auto gid = raid->GetGroup(this);
if (gid < 12) { if (gid < MAX_RAID_GROUPS) {
int at_id = AggroMeter::AT_Group1; int at_id = AggroMeter::AT_Group1;
for (int i = 0; i < MAX_RAID_MEMBERS; ++i) { for (const auto& m : raid->members) {
if (raid->members[i].member && raid->members[i].member != this && raid->members[i].group_number == gid) { if (m.member && m.member != this && m.group_number == gid) {
if (m_aggrometer.set_pct(static_cast<AggroMeter::AggroTypes>(at_id), cur_tar->GetHateRatio(cur_tar->GetTarget(), raid->members[i].member))) if (m_aggrometer.set_pct(static_cast<AggroMeter::AggroTypes>(at_id), cur_tar->GetHateRatio(cur_tar->GetTarget(), m.member)))
add_entry(static_cast<AggroMeter::AggroTypes>(at_id)); add_entry(static_cast<AggroMeter::AggroTypes>(at_id));
at_id++; at_id++;
if (at_id > AggroMeter::AT_Group5) if (at_id > AggroMeter::AT_Group5)
@ -10956,11 +10942,14 @@ std::vector<Client *> Client::GetPartyMembers()
std::vector<Client *> clients_to_update = {}; std::vector<Client *> clients_to_update = {};
// raid // raid
Raid *raid = entity_list.GetRaidByClient(this); if (const auto raid = entity_list.GetRaidByClient(this)) {
if (raid) { for (auto &m : raid->members) {
for (auto &e : raid->members) { if (m.is_bot) {
if (e.member && e.member->IsClient()) { continue;
clients_to_update.push_back(e.member->CastToClient()); }
if (m.member && m.member->IsClient()) {
clients_to_update.push_back(m.member->CastToClient());
} }
} }
} }
@ -11747,17 +11736,16 @@ std::vector<Mob*> Client::GetApplySpellList(
auto* r = GetRaid(); auto* r = GetRaid();
auto group_id = r->GetGroup(this); auto group_id = r->GetGroup(this);
if (r && EQ::ValueWithin(group_id, 0, (MAX_RAID_GROUPS - 1))) { if (r && EQ::ValueWithin(group_id, 0, (MAX_RAID_GROUPS - 1))) {
for (auto i = 0; i < MAX_RAID_MEMBERS; i++) { for (const auto& m : r->members) {
auto* m = r->members[i].member; if (m.member && m.member->IsClient() && (!is_raid_group_only || r->GetGroup(m.member) == group_id)) {
if (m && m->IsClient() && (!is_raid_group_only || r->GetGroup(m) == group_id)) { l.push_back(m.member);
l.push_back(m);
if (allow_pets && m->HasPet()) { if (allow_pets && m.member->HasPet()) {
l.push_back(m->GetPet()); l.push_back(m.member->GetPet());
} }
if (allow_bots) { 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) { for (const auto& b : sbl) {
l.push_back(b); l.push_back(b);
} }

View File

@ -448,9 +448,13 @@ void QuestManager::ZoneRaid(const char *zone_name) {
initiator->MoveZone(zone_name); initiator->MoveZone(zone_name);
} else { } else {
auto client_raid = initiator->GetRaid(); auto client_raid = initiator->GetRaid();
for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { for (const auto& m : client_raid->members) {
if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { if (m.is_bot) {
auto raid_member = client_raid->members[member_index].member->CastToClient(); continue;
}
if (m.member && m.member->IsClient()) {
auto raid_member = m.member->CastToClient();
raid_member->MoveZone(zone_name); raid_member->MoveZone(zone_name);
} }
} }

View File

@ -611,9 +611,8 @@ void Raid::RaidGroupSay(const char *msg, Client *c, uint8 language, uint8 lang_s
uint32 Raid::GetPlayerIndex(const char *name) uint32 Raid::GetPlayerIndex(const char *name)
{ {
for(int x = 0; x < MAX_RAID_MEMBERS; x++) for (int x = 0; x < MAX_RAID_MEMBERS; x++) {
{ if (strcmp(name, members[x].member_name) == 0) {
if(strcmp(name, members[x].member_name) == 0) {
return x; return x;
} }
} }
@ -832,6 +831,10 @@ void Raid::BalanceMana(int32 penalty, uint32 gid, float range, Mob* caster, int3
manataken /= numMem; manataken /= numMem;
for (const auto& m : members) { for (const auto& m : members) {
if (m.is_bot) {
continue;
}
if (m.member && m.group_number == gid) { if (m.member && m.group_number == gid) {
distance = DistanceSquared(caster->GetPosition(), m.member->GetPosition()); 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; uint8 member_count = 0;
for (const auto& m : members) { for (const auto& m : members) {
if (m.is_bot) {
continue;
}
if (m.member && m.group_number == gid && m.member->IsClient()) { if (m.member && m.group_number == gid && m.member->IsClient()) {
member_count++; member_count++;
} }
@ -914,6 +921,10 @@ void Raid::SplitMoney(uint32 gid, uint32 copper, uint32 silver, uint32 gold, uin
auto platinum_split = platinum / member_count; auto platinum_split = platinum / member_count;
for (const auto& m : members) { 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 if (m.member && m.group_number == gid && m.member->IsClient()) { // If Group Member is Client
m.member->AddMoneyToPP( m.member->AddMoneyToPP(
copper_split, 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) 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) { for (const auto& m : members) {
if (m.is_bot) {
continue;
}
if (m.member && m.group_number == gid && m.member->IsClient()) { if (m.member && m.group_number == gid && m.member->IsClient()) {
m.member->MovePC(zoneID, instance_id, x, y, z, heading, 0, ZoneSolicited); 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) void Raid::TeleportRaid(Mob* sender, uint32 zoneID, uint16 instance_id, float x, float y, float z, float heading)
{ {
for (const auto& m : members) { for (const auto& m : members) {
if (m.is_bot) {
continue;
}
if (m.member && m.member->IsClient()) { if (m.member && m.member->IsClient()) {
m.member->MovePC(zoneID, instance_id, x, y, z, heading, 0, ZoneSolicited); 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); auto results = database.QueryDatabase(query);
for (auto& m : members) { for (auto& m : members) {
if (m.is_bot) {
continue;
}
if (strcmp(looter, m.member_name) == 0) { if (strcmp(looter, m.member_name) == 0) {
m.is_looter = true; m.is_looter = true;
break; break;
@ -1002,6 +1025,10 @@ void Raid::RemoveRaidLooter(const char* looter)
auto results = database.QueryDatabase(query); auto results = database.QueryDatabase(query);
for (auto& m: members) { for (auto& m: members) {
if (m.is_bot) {
continue;
}
if (strcmp(looter, m.member_name) == 0) { if (strcmp(looter, m.member_name) == 0) {
m.is_looter = false; m.is_looter = false;
break; break;
@ -1258,6 +1285,10 @@ void Raid::SendBulkRaid(Client *to)
void Raid::QueuePacket(const EQApplicationPacket *app, bool ack_req) void Raid::QueuePacket(const EQApplicationPacket *app, bool ack_req)
{ {
for (const auto& m : members) { for (const auto& m : members) {
if (m.is_bot) {
continue;
}
if (m.member && m.member->IsClient()) { if (m.member && m.member->IsClient()) {
m.member->QueuePacket(app, ack_req); m.member->QueuePacket(app, ack_req);
} }
@ -1332,7 +1363,7 @@ void Raid::SendGroupUpdate(Client *to)
gu->action = groupActUpdate; gu->action = groupActUpdate;
int i = 0; int i = 0;
uint32 grp = GetGroup(to->GetName()); uint32 grp = GetGroup(to->GetName());
if (grp >= MAX_RAID_MEMBERS) { if (grp >= MAX_RAID_GROUPS) {
safe_delete(outapp); safe_delete(outapp);
return; return;
} }
@ -1502,6 +1533,10 @@ void Raid::SendRaidMOTD()
} }
for (const auto& m: members) { for (const auto& m: members) {
if (m.is_bot) {
continue;
}
if (m.member) { if (m.member) {
SendRaidMOTD(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) 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) { for (const auto& m : members) {
if (m.is_bot) {
continue;
}
if (m.member && m.member->IsClient() && m.member != sender) { if (m.member && m.member->IsClient() && m.member != sender) {
m.member->MessageString(type, string_id, message, message2, message3, message4, message5, message6, m.member->MessageString(type, string_id, message, message2, message3, message4, message5, message6,
message7, message8, message9, distance); message7, message8, message9, distance);

View File

@ -294,12 +294,19 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
case VoiceMacroRaid: { case VoiceMacroRaid: {
Raid *r = entity_list.GetRaidByID(svm->RaidID); Raid *r = entity_list.GetRaidByID(svm->RaidID);
if (!r) if (!r) {
break; break;
}
for (int i = 0; i < MAX_RAID_MEMBERS; i++) for (const auto& m: r->members) {
if (r->members[i].member) if (m.is_bot) {
r->members[i].member->QueuePacket(outapp); continue;
}
if (m.member) {
m.member->QueuePacket(outapp);
}
}
break; break;
} }
@ -1055,7 +1062,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
{ {
auto outapp = auto outapp =
new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupJoin_Struct)); 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->membername, Inviter->GetName());
strcpy(outgj->yourname, Inviter->GetName()); strcpy(outgj->yourname, Inviter->GetName());
outgj->action = groupActInviteInitial; // 'You have formed the group'. 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(); Inviter->CastToClient()->UpdateLFP();
auto pack2 = new ServerPacket(ServerOP_GroupJoin, sizeof(ServerGroupJoin_Struct)); 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->gid = group->GetID();
gj->zoneid = zone->GetZoneID(); gj->zoneid = zone->GetZoneID();
gj->instance_id = zone->GetInstanceID(); gj->instance_id = zone->GetInstanceID();
@ -1213,7 +1220,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
break; break;
} }
case ServerOP_GroupJoin: { case ServerOP_GroupJoin: {
ServerGroupJoin_Struct* gj = (ServerGroupJoin_Struct*)pack->pBuffer; auto gj = (ServerGroupJoin_Struct*)pack->pBuffer;
if (zone) { if (zone) {
if (gj->zoneid == zone->GetZoneID() && gj->instance_id == zone->GetInstanceID()) if (gj->zoneid == zone->GetZoneID() && gj->instance_id == zone->GetInstanceID())
break; break;
@ -1259,7 +1266,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
break; break;
} }
case ServerOP_RaidAdd: { case ServerOP_RaidAdd: {
ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer;
if (zone) { if (zone) {
if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID())
break; break;
@ -1274,7 +1281,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
break; break;
} }
case ServerOP_RaidRemove: { case ServerOP_RaidRemove: {
ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer;
if (zone) { if (zone) {
if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID())
break; break;
@ -1294,7 +1301,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
break; break;
} }
case ServerOP_RaidDisband: { case ServerOP_RaidDisband: {
ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer;
if (zone) { if (zone) {
if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID())
break; break;
@ -1309,7 +1316,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
break; break;
} }
case ServerOP_RaidLockFlag: { case ServerOP_RaidLockFlag: {
ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer;
if (zone) { if (zone) {
if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID())
break; break;
@ -1326,7 +1333,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
break; break;
} }
case ServerOP_RaidChangeGroup: { case ServerOP_RaidChangeGroup: {
ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer;
if (zone) { if (zone) {
if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID())
break; break;
@ -1354,7 +1361,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
break; break;
} }
case ServerOP_UpdateGroup: { case ServerOP_UpdateGroup: {
ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer;
if (zone) { if (zone) {
if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID())
break; break;
@ -1367,7 +1374,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
break; break;
} }
case ServerOP_RaidGroupLeader: { case ServerOP_RaidGroupLeader: {
ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer;
if (zone) { if (zone) {
if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID())
break; break;
@ -1375,7 +1382,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
break; break;
} }
case ServerOP_RaidLeader: { case ServerOP_RaidLeader: {
ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer;
if (zone) { if (zone) {
if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID())
break; break;
@ -1395,7 +1402,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
break; break;
} }
case ServerOP_DetailsChange: { case ServerOP_DetailsChange: {
ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer;
if (zone) { if (zone) {
if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID())
break; break;
@ -1410,7 +1417,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
break; break;
} }
case ServerOP_RaidGroupDisband: { case ServerOP_RaidGroupDisband: {
ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer; auto rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer;
if (zone) { if (zone) {
if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID()) if (rga->zoneid == zone->GetZoneID() && rga->instance_id == zone->GetInstanceID())
break; break;
@ -1420,7 +1427,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
{ {
auto outapp = auto outapp =
new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupUpdate_Struct)); new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupUpdate_Struct));
GroupUpdate_Struct* gu = (GroupUpdate_Struct*)outapp->pBuffer; auto gu = (GroupUpdate_Struct*)outapp->pBuffer;
gu->action = groupActDisband; gu->action = groupActDisband;
strn0cpy(gu->leadersname, c->GetName(), 64); strn0cpy(gu->leadersname, c->GetName(), 64);
strn0cpy(gu->yourname, c->GetName(), 64); strn0cpy(gu->yourname, c->GetName(), 64);
@ -1430,27 +1437,26 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
break; break;
} }
case ServerOP_RaidGroupAdd: { case ServerOP_RaidGroupAdd: {
ServerRaidGroupAction_Struct* rga = (ServerRaidGroupAction_Struct*)pack->pBuffer; auto rga = (ServerRaidGroupAction_Struct*)pack->pBuffer;
if (zone) { if (zone) {
Raid *r = entity_list.GetRaidByID(rga->rid); Raid *r = entity_list.GetRaidByID(rga->rid);
if (r) { if (r) {
r->LearnMembers(); r->LearnMembers();
r->VerifyRaid(); r->VerifyRaid();
auto outapp = new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupJoin_Struct)); 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); strn0cpy(gj->membername, rga->membername, 64);
gj->action = groupActJoin; gj->action = groupActJoin;
for (int x = 0; x < MAX_RAID_MEMBERS; x++) for (const auto& m : r->members) {
{ if (m.is_bot) {
if (r->members[x].member) continue;
{
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);
} }
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; break;
} }
case ServerOP_RaidGroupRemove: { case ServerOP_RaidGroupRemove: {
ServerRaidGroupAction_Struct* rga = (ServerRaidGroupAction_Struct*)pack->pBuffer; auto rga = (ServerRaidGroupAction_Struct*)pack->pBuffer;
if (zone) { if (zone) {
Raid *r = entity_list.GetRaidByID(rga->rid); Raid *r = entity_list.GetRaidByID(rga->rid);
if (r) { if (r) {
r->LearnMembers(); r->LearnMembers();
r->VerifyRaid(); r->VerifyRaid();
auto outapp = new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupJoin_Struct)); 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); strn0cpy(gj->membername, rga->membername, 64);
gj->action = groupActLeave; gj->action = groupActLeave;
for (int x = 0; x < MAX_RAID_MEMBERS; x++) for (const auto& m : r->members) {
{ if (m.is_bot) {
if (r->members[x].member) continue;
{
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);
} }
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; break;
} }
case ServerOP_RaidGroupSay: { case ServerOP_RaidGroupSay: {
ServerRaidMessage_Struct* rmsg = (ServerRaidMessage_Struct*)pack->pBuffer; auto rmsg = (ServerRaidMessage_Struct*)pack->pBuffer;
if (zone) { if (zone) {
Raid *r = entity_list.GetRaidByID(rmsg->rid); Raid *r = entity_list.GetRaidByID(rmsg->rid);
if (r) if (r) {
{ for (const auto& m :r->members) {
for (int x = 0; x < MAX_RAID_MEMBERS; x++) if (m.is_bot) {
{ continue;
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 (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; break;
} }
case ServerOP_RaidSay: { case ServerOP_RaidSay: {
ServerRaidMessage_Struct* rmsg = (ServerRaidMessage_Struct*)pack->pBuffer; auto rmsg = (ServerRaidMessage_Struct*)pack->pBuffer;
if (zone) if (zone) {
{
Raid *r = entity_list.GetRaidByID(rmsg->rid); Raid *r = entity_list.GetRaidByID(rmsg->rid);
if (r)
{ if (r) {
for (int x = 0; x < MAX_RAID_MEMBERS; x++) for (const auto& m :r->members) {
{ if (m.is_bot) {
if (r->members[x].member) { continue;
if (strcmp(rmsg->from, r->members[x].member->GetName()) != 0) }
{
if (!r->members[x].is_bot && r->members[x].member->GetFilter(FilterGroupChat) != 0) if (m.member) {
{ if (strcmp(rmsg->from, m.member->GetName()) != 0) {
r->members[x].member->ChannelMessageSend(rmsg->from, r->members[x].member->GetName(), ChatChannel_Raid, rmsg->language, rmsg->lang_skill, rmsg->message); 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) { } else if (update_type == CZUpdateType_Raid) {
auto client_raid = entity_list.GetRaidByID(update_identifier); auto client_raid = entity_list.GetRaidByID(update_identifier);
if (client_raid) { if (client_raid) {
for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { for (const auto& m : client_raid->members) {
if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { if (m.is_bot) {
auto raid_member = client_raid->members[member_index].member->CastToClient(); continue;
DialogueWindow::Render(raid_member, message); }
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) { } else if (update_type == CZUpdateType_Raid) {
auto client_raid = entity_list.GetRaidByID(update_identifier); auto client_raid = entity_list.GetRaidByID(update_identifier);
if (client_raid) { if (client_raid) {
for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { for (const auto& m : client_raid->members) {
auto client_raid_member = client_raid->members[member_index].member; if (m.is_bot) {
if (client_raid_member && client_raid_member->IsClient()) { continue;
}
if (m.member && m.member->IsClient()) {
switch (update_subtype) { switch (update_subtype) {
case CZLDoNUpdateSubtype_AddLoss: case CZLDoNUpdateSubtype_AddLoss:
client_raid_member->UpdateLDoNWinLoss(theme_id, false); m.member->UpdateLDoNWinLoss(theme_id, false);
break; break;
case CZLDoNUpdateSubtype_AddPoints: case CZLDoNUpdateSubtype_AddPoints:
client_raid_member->UpdateLDoNPoints(theme_id, points); m.member->UpdateLDoNPoints(theme_id, points);
break; break;
case CZLDoNUpdateSubtype_AddWin: case CZLDoNUpdateSubtype_AddWin:
client_raid_member->UpdateLDoNWinLoss(theme_id, true); m.member->UpdateLDoNWinLoss(theme_id, true);
break; break;
case CZLDoNUpdateSubtype_RemoveLoss: case CZLDoNUpdateSubtype_RemoveLoss:
client_raid_member->UpdateLDoNWinLoss(theme_id, false, true); m.member->UpdateLDoNWinLoss(theme_id, false, true);
break; break;
case CZLDoNUpdateSubtype_RemoveWin: case CZLDoNUpdateSubtype_RemoveWin:
client_raid_member->UpdateLDoNWinLoss(theme_id, true, true); m.member->UpdateLDoNWinLoss(theme_id, true, true);
break; break;
default: default:
break; break;
@ -2365,9 +2374,13 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
} else if (update_type == CZUpdateType_Raid) { } else if (update_type == CZUpdateType_Raid) {
auto client_raid = entity_list.GetRaidByID(update_identifier); auto client_raid = entity_list.GetRaidByID(update_identifier);
if (client_raid) { if (client_raid) {
for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { for (const auto& m : client_raid->members) {
if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { if (m.is_bot) {
auto raid_member = client_raid->members[member_index].member->CastToClient(); continue;
}
if (m.member && m.member->IsClient()) {
auto raid_member = m.member->CastToClient();
raid_member->SendMarqueeMessage(type, priority, fade_in, fade_out, duration, message); 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) { } else if (update_type == CZUpdateType_Raid) {
auto client_raid = entity_list.GetRaidByID(update_identifier); auto client_raid = entity_list.GetRaidByID(update_identifier);
if (client_raid) { if (client_raid) {
for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { for (const auto& m : client_raid->members) {
if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { if (m.is_bot) {
auto raid_member = client_raid->members[member_index].member->CastToClient(); continue;
}
if (m.member && m.member->IsClient()) {
auto raid_member = m.member->CastToClient();
raid_member->Message(type, message); 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) { } else if (update_type == CZUpdateType_Raid) {
auto client_raid = entity_list.GetRaidByID(update_identifier); auto client_raid = entity_list.GetRaidByID(update_identifier);
if (client_raid) { if (client_raid) {
for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { for (const auto& m : client_raid->members) {
if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { if (m.is_bot) {
auto raid_member = client_raid->members[member_index].member->CastToClient(); continue;
}
if (m.member && m.member->IsClient()) {
auto raid_member = m.member->CastToClient();
switch (update_subtype) { switch (update_subtype) {
case CZMoveUpdateSubtype_MoveZone: case CZMoveUpdateSubtype_MoveZone:
raid_member->MoveZone(zone_short_name); 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) { } else if (update_type == CZUpdateType_Raid) {
auto client_raid = entity_list.GetRaidByID(update_identifier); auto client_raid = entity_list.GetRaidByID(update_identifier);
if (client_raid) { if (client_raid) {
for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { for (const auto& m : client_raid->members) {
if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { if (m.is_bot) {
auto raid_member = client_raid->members[member_index].member->CastToClient(); continue;
}
if (m.member && m.member->IsClient()) {
auto raid_member = m.member->CastToClient();
raid_member->SetEntityVariable(variable_name, variable_value); raid_member->SetEntityVariable(variable_name, variable_value);
} }
} }
@ -2601,7 +2626,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
} }
case ServerOP_CZSignal: case ServerOP_CZSignal:
{ {
CZSignal_Struct* CZS = (CZSignal_Struct*) pack->pBuffer; auto CZS = (CZSignal_Struct*) pack->pBuffer;
uint8 update_type = CZS->update_type; uint8 update_type = CZS->update_type;
int update_identifier = CZS->update_identifier; int update_identifier = CZS->update_identifier;
int signal_id = CZS->signal_id; 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) { } else if (update_type == CZUpdateType_Raid) {
auto client_raid = entity_list.GetRaidByID(update_identifier); auto client_raid = entity_list.GetRaidByID(update_identifier);
if (client_raid) { if (client_raid) {
for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { for (const auto& m : client_raid->members) {
if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { if (m.is_bot) {
auto raid_member = client_raid->members[member_index].member->CastToClient(); continue;
raid_member->Signal(signal_id); }
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) { } else if (update_type == CZUpdateType_Raid) {
auto client_raid = entity_list.GetRaidByID(update_identifier); auto client_raid = entity_list.GetRaidByID(update_identifier);
if (client_raid) { if (client_raid) {
for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { for (const auto& m : client_raid->members) {
if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { if (m.is_bot) {
auto raid_member = client_raid->members[member_index].member->CastToClient(); continue;
}
if (m.member && m.member->IsClient()) {
auto raid_member = m.member->CastToClient();
switch (update_subtype) { switch (update_subtype) {
case CZSpellUpdateSubtype_Cast: case CZSpellUpdateSubtype_Cast:
raid_member->ApplySpellBuff(spell_id); 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) { } else if (update_type == CZUpdateType_Raid) {
auto client_raid = entity_list.GetRaidByID(update_identifier); auto client_raid = entity_list.GetRaidByID(update_identifier);
if (client_raid) { if (client_raid) {
for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { for (const auto& m : client_raid->members) {
if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { if (m.is_bot) {
auto raid_member = client_raid->members[member_index].member->CastToClient(); continue;
}
if (m.member && m.member->IsClient()) {
auto raid_member = m.member->CastToClient();
switch (update_subtype) { switch (update_subtype) {
case CZTaskUpdateSubtype_ActivityReset: case CZTaskUpdateSubtype_ActivityReset:
raid_member->ResetTaskActivity(task_identifier, task_subidentifier); raid_member->ResetTaskActivity(task_identifier, task_subidentifier);