mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-12 01:11:29 +00:00
[Crash] Add additional raid integrity checks on Bot Spawn. (#3295)
* simple cleanup before changes * can't be in a raid yet * change to sizeof * change to use sizeof
This commit is contained in:
parent
d45a57056a
commit
93db35658a
17
zone/bot.cpp
17
zone/bot.cpp
@ -422,12 +422,6 @@ Bot::Bot(uint32 botID, uint32 botOwnerCharacterID, uint32 botSpellsID, double to
|
||||
}
|
||||
|
||||
cur_end = max_end;
|
||||
|
||||
// Safety Check to confirm we have a valid raid
|
||||
if (HasRaid() && !GetRaid()->IsRaidMember(GetBotOwner()->CastToClient())) {
|
||||
Bot::RemoveBotFromRaid(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Bot::~Bot() {
|
||||
@ -3307,11 +3301,16 @@ bool Bot::Spawn(Client* botCharacterOwner) {
|
||||
}
|
||||
|
||||
if (auto raid = entity_list.GetRaidByBotName(GetName())) {
|
||||
raid->VerifyRaid();
|
||||
SetRaidGrouped(true);
|
||||
// Safety Check to confirm we have a valid raid
|
||||
if (raid->IsRaidMember(GetBotOwner()->CastToClient())) {
|
||||
Bot::RemoveBotFromRaid(this);
|
||||
} else {
|
||||
raid->LearnMembers();
|
||||
SetRaidGrouped(true);
|
||||
}
|
||||
}
|
||||
else if (auto group = entity_list.GetGroupByMobName(GetName())) {
|
||||
group->VerifyGroup();
|
||||
group->LearnMembers();
|
||||
SetGrouped(true);
|
||||
}
|
||||
|
||||
|
||||
@ -6999,7 +6999,7 @@ void Client::Handle_OP_GroupDisband(const EQApplicationPacket *app)
|
||||
//we have a raid.. see if we're in a raid group
|
||||
uint32 grp = raid->GetGroup(memberToDisband->GetName());
|
||||
bool wasGrpLdr = raid->members[raid->GetPlayerIndex(memberToDisband->GetName())].is_group_leader;
|
||||
if (grp < 12) {
|
||||
if (grp < MAX_RAID_GROUPS) {
|
||||
if (wasGrpLdr) {
|
||||
raid->SetGroupLeader(memberToDisband->GetName(), false);
|
||||
for (int x = 0; x < MAX_RAID_MEMBERS; x++) {
|
||||
|
||||
@ -1126,8 +1126,8 @@ void Raid::SendRaidAdd(const char *who, Client *to)
|
||||
auto ram = (RaidAddMember_Struct*)outapp->pBuffer;
|
||||
ram->raidGen.action = raidAdd;
|
||||
ram->raidGen.parameter = m.group_number;
|
||||
strn0cpy(ram->raidGen.leader_name, m.member_name, 64);
|
||||
strn0cpy(ram->raidGen.player_name, m.member_name, 64);
|
||||
strn0cpy(ram->raidGen.leader_name, m.member_name, sizeof(ram->raidGen.leader_name));
|
||||
strn0cpy(ram->raidGen.player_name, m.member_name, sizeof(ram->raidGen.player_name));
|
||||
ram->_class = m._class;
|
||||
ram->level = m.level;
|
||||
ram->isGroupLeader = m.is_group_leader;
|
||||
@ -1148,8 +1148,8 @@ void Raid::SendRaidAddAll(const char *who)
|
||||
auto ram = (RaidAddMember_Struct*)outapp->pBuffer;
|
||||
ram->raidGen.action = raidAdd;
|
||||
ram->raidGen.parameter = m.group_number;
|
||||
strcpy(ram->raidGen.leader_name, m.member_name);
|
||||
strcpy(ram->raidGen.player_name, m.member_name);
|
||||
strn0cpy(ram->raidGen.leader_name, m.member_name, sizeof(ram->raidGen.leader_name));
|
||||
strn0cpy(ram->raidGen.player_name, m.member_name, sizeof(ram->raidGen.player_name));
|
||||
ram->isGroupLeader = m.is_group_leader;
|
||||
ram->_class = m._class;
|
||||
ram->level = m.level;
|
||||
@ -1361,33 +1361,31 @@ void Raid::SendGroupUpdate(Client *to)
|
||||
auto outapp = new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupUpdate2_Struct));
|
||||
auto gu = (GroupUpdate2_Struct*)outapp->pBuffer;
|
||||
gu->action = groupActUpdate;
|
||||
int i = 0;
|
||||
uint32 grp = GetGroup(to->GetName());
|
||||
if (grp >= MAX_RAID_GROUPS) {
|
||||
safe_delete(outapp);
|
||||
return;
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
for (const auto& m : members) {
|
||||
if (m.group_number == grp && strlen(m.member_name) > 0) {
|
||||
if (m.is_group_leader) {
|
||||
strn0cpy(gu->leadersname, m.member_name, 64);
|
||||
strn0cpy(gu->leadersname, m.member_name, sizeof(gu->leadersname));
|
||||
if (strcmp(to->GetName(), m.member_name) != 0) {
|
||||
strn0cpy(gu->membername[i], m.member_name, 64);
|
||||
i++;
|
||||
strn0cpy(gu->membername[i], m.member_name, sizeof(gu->membername[i]));
|
||||
++i;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (strcmp(to->GetName(), m.member_name) != 0) {
|
||||
strn0cpy(gu->membername[i], m.member_name, 64);
|
||||
i++;
|
||||
}
|
||||
else if (strcmp(to->GetName(), m.member_name) != 0) {
|
||||
strn0cpy(gu->membername[i], m.member_name, sizeof(gu->membername[i]));
|
||||
++i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (strlen(gu->leadersname) < 1) {
|
||||
strn0cpy(gu->leadersname, to->GetName(), 64);
|
||||
strn0cpy(gu->leadersname, to->GetName(), sizeof(gu->leadersname));
|
||||
}
|
||||
|
||||
strn0cpy(gu->yourname, to->GetName(), 64);
|
||||
@ -1404,7 +1402,7 @@ void Raid::GroupUpdate(uint32 gid, bool initial)
|
||||
}
|
||||
|
||||
for (const auto& m : members) {
|
||||
if (strlen(m.member_name) > 0 && m.group_number == gid && m.member) {
|
||||
if (m.member && m.group_number == gid && strlen(m.member_name) > 0) {
|
||||
SendGroupUpdate(m.member);
|
||||
SendGroupLeadershipAA(m.member, gid);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user