[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;
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;

View File

@ -9105,16 +9105,18 @@ std::vector<Mob*> 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);
}

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) {
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) {
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;
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<AggroMeter::AggroTypes>(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<AggroMeter::AggroTypes>(at_id), cur_tar->GetHateRatio(cur_tar->GetTarget(), m.member)))
add_entry(static_cast<AggroMeter::AggroTypes>(at_id));
at_id++;
if (at_id > AggroMeter::AT_Group5)
@ -10956,11 +10942,14 @@ std::vector<Client *> Client::GetPartyMembers()
std::vector<Client *> 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<Mob*> 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);
}

View File

@ -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);
}
}

View File

@ -611,8 +611,7 @@ 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++)
{
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);

View File

@ -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);