diff --git a/common/types.h b/common/types.h index b3be97d32..2a6355296 100644 --- a/common/types.h +++ b/common/types.h @@ -57,6 +57,9 @@ typedef const char Const_char; //for perl XS #define safe_delete(d) if(d) { delete d; d=nullptr; } #define safe_delete_array(d) if(d) { delete[] d; d=nullptr; } +//#define safe_delete(d)(_RPTF0(_CRT_WARN,"Testing delete function\n")); +//#define safe_delete(d) if(d) { } +//#define safe_delete_array(d) if(d) { } #define L32(i) ((uint32) i) #define H32(i) ((uint32) (i >> 32)) #define L16(i) ((uint16) i) diff --git a/zone/bot.cpp b/zone/bot.cpp index e46d8d025..e2628a34e 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -7745,11 +7745,13 @@ bool Bot::DoFinishedSpellGroupTarget(uint16 spell_id, Mob* spellTarget, EQ::spel } else if (raid) { - for (RaidMember iter : raid->GetRaidGroupMembers(raid->GetGroup(this->GetName()))) { - if (iter.member) { - SpellOnTarget(spell_id, iter.member); - if (iter.member && iter.member->GetPetID()) - SpellOnTarget(spell_id, iter.member ->GetPet()); + //for (auto& iter : raid->GetRaidGroupMembers(raid->GetGroup(this->GetName()))) { + std::vector raid_group_members = raid->GetRaidGroupMembers(raid->GetGroup(this->GetName())); + for (std::vector::iterator iter = raid_group_members.begin(); iter != raid_group_members.end(); ++iter) { + if (iter->member) { + SpellOnTarget(spell_id, iter->member); + if (iter->member && iter->member->GetPetID()) + SpellOnTarget(spell_id, iter->member ->GetPet()); } } } @@ -9264,34 +9266,36 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl { //added raid check Raid* raid = entity_list.GetRaidByBotName(caster->GetName()); - uint32 g = raid->GetGroup(caster->GetName()); - if (g < 12) { - for (RaidMember& iter : raid->GetRaidGroupMembers(g)) { - if (iter.member && !iter.member->qglobal) { - if (iter.member->IsClient() && iter.member->GetHPRatio() < 90) { - if (caster->AICastSpell(iter.member, 100, SpellType_Heal)) + uint32 gid = raid->GetGroup(caster->GetName()); + if (gid < 12) { + std::vector raid_group_members = raid->GetRaidGroupMembers(gid); + for (std::vector::iterator iter = raid_group_members.begin(); iter != raid_group_members.end(); ++iter) { + //for (auto& iter : raid->GetRaidGroupMembers(g)) { + if (iter->member && !iter->member->qglobal) { + if (iter->member->IsClient() && iter->member->GetHPRatio() < 90) { + if (caster->AICastSpell(iter->member, 100, SpellType_Heal)) return true; } - else if ((iter.member->GetClass() == WARRIOR || iter.member->GetClass() == PALADIN || iter.member->GetClass() == SHADOWKNIGHT) && iter.member->GetHPRatio() < 95) { - if (caster->AICastSpell(iter.member, 100, SpellType_Heal)) + else if ((iter->member->GetClass() == WARRIOR || iter->member->GetClass() == PALADIN || iter->member->GetClass() == SHADOWKNIGHT) && iter->member->GetHPRatio() < 95) { + if (caster->AICastSpell(iter->member, 100, SpellType_Heal)) return true; } - else if (iter.member->GetClass() == ENCHANTER && iter.member->GetHPRatio() < 80) { - if (caster->AICastSpell(iter.member, 100, SpellType_Heal)) + else if (iter->member->GetClass() == ENCHANTER && iter->member->GetHPRatio() < 80) { + if (caster->AICastSpell(iter->member, 100, SpellType_Heal)) return true; } - else if (iter.member->GetHPRatio() < 70) { - if (caster->AICastSpell(iter.member, 100, SpellType_Heal)) + else if (iter->member->GetHPRatio() < 70) { + if (caster->AICastSpell(iter->member, 100, SpellType_Heal)) return true; } } - if (iter.member && !iter.member->qglobal && iter.member->HasPet() && iter.member->GetPet()->GetHPRatio() < 50) { - if (iter.member->GetPet()->GetOwner() != caster && caster->IsEngaged() && iter.member->IsCasting() && iter.member->GetClass() != ENCHANTER) + if (iter->member && !iter->member->qglobal && iter->member->HasPet() && iter->member->GetPet()->GetHPRatio() < 50) { + if (iter->member->GetPet()->GetOwner() != caster && caster->IsEngaged() && iter->member->IsCasting() && iter->member->GetClass() != ENCHANTER) continue; - if (caster->AICastSpell(iter.member->GetPet(), 100, SpellType_Heal)) + if (caster->AICastSpell(iter->member->GetPet(), 100, SpellType_Heal)) return true; } } @@ -9353,31 +9357,33 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl } else if (gid < 12) { - for (RaidMember& iter : raid->GetRaidGroupMembers(gid)) { - if (iter.member && !iter.member->qglobal) { - if (iter.member->IsClient() && iter.member->GetHPRatio() < hpRatioToHeal) { - if (caster->AICastSpell(iter.member, 100, SpellType_Heal)) + std::vector raid_group_members = raid->GetRaidGroupMembers(gid); + for (std::vector::iterator iter = raid_group_members.begin(); iter != raid_group_members.end(); ++iter) { + //for (auto& iter : raid->GetRaidGroupMembers(gid)) { + if (iter->member && !iter->member->qglobal) { + if (iter->member->IsClient() && iter->member->GetHPRatio() < hpRatioToHeal) { + if (caster->AICastSpell(iter->member, 100, SpellType_Heal)) return true; } - else if ((iter.member->GetClass() == WARRIOR || iter.member->GetClass() == PALADIN || iter.member->GetClass() == SHADOWKNIGHT) && iter.member->GetHPRatio() < hpRatioToHeal) { - if (caster->AICastSpell(iter.member, 100, SpellType_Heal)) + else if ((iter->member->GetClass() == WARRIOR || iter->member->GetClass() == PALADIN || iter->member->GetClass() == SHADOWKNIGHT) && iter->member->GetHPRatio() < hpRatioToHeal) { + if (caster->AICastSpell(iter->member, 100, SpellType_Heal)) return true; } - else if (iter.member->GetClass() == ENCHANTER && iter.member->GetHPRatio() < hpRatioToHeal) { - if (caster->AICastSpell(iter.member, 100, SpellType_Heal)) + else if (iter->member->GetClass() == ENCHANTER && iter->member->GetHPRatio() < hpRatioToHeal) { + if (caster->AICastSpell(iter->member, 100, SpellType_Heal)) return true; } - else if (iter.member->GetHPRatio() < hpRatioToHeal / 2) { - if (caster->AICastSpell(iter.member, 100, SpellType_Heal)) + else if (iter->member->GetHPRatio() < hpRatioToHeal / 2) { + if (caster->AICastSpell(iter->member, 100, SpellType_Heal)) return true; } } - if (iter.member && !iter.member->qglobal && iter.member->HasPet() && iter.member->GetPet()->GetHPRatio() < 25) { - if (iter.member->GetPet()->GetOwner() != caster && caster->IsEngaged() && iter.member->IsCasting() && iter.member->GetClass() != ENCHANTER) + if (iter->member && !iter->member->qglobal && iter->member->HasPet() && iter->member->GetPet()->GetHPRatio() < 25) { + if (iter->member->GetPet()->GetOwner() != caster && caster->IsEngaged() && iter->member->IsCasting() && iter->member->GetClass() != ENCHANTER) continue; - if (caster->AICastSpell(iter.member->GetPet(), 100, SpellType_Heal)) + if (caster->AICastSpell(iter->member->GetPet(), 100, SpellType_Heal)) return true; } } @@ -9400,9 +9406,10 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl Raid* raid = entity_list.GetRaidByBotName(caster->GetName()); uint32 g = raid->GetGroup(caster->GetName()); if (g < 12) { - for (RaidMember &iter : raid->GetRaidGroupMembers(g)) { - if (iter.member) { - if (caster->AICastSpell(iter.member, chanceToCast, SpellType_Buff) || caster->AICastSpell(iter.member->GetPet(), chanceToCast, SpellType_Buff)) + std::vector raid_group_members = raid->GetRaidGroupMembers(g); + for (std::vector::iterator iter = raid_group_members.begin(); iter != raid_group_members.end(); ++iter) { + if (iter->member) { + if (caster->AICastSpell(iter->member, chanceToCast, SpellType_Buff) || caster->AICastSpell(iter->member->GetPet(), chanceToCast, SpellType_Buff)) return true; } } @@ -9446,16 +9453,17 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl Raid* raid = entity_list.GetRaidByBotName(caster->GetName()); uint32 gid = raid->GetGroup(caster->GetName()); if (gid < 12) { - for (RaidMember& iter : raid->GetRaidGroupMembers(gid)) { - if (iter.member && caster->GetNeedsCured(iter.member)) { - if (caster->AICastSpell(iter.member, caster->GetChanceToCastBySpellType(SpellType_Cure), SpellType_Cure)) + std::vector raid_group_members = raid->GetRaidGroupMembers(gid); + for (std::vector::iterator iter = raid_group_members.begin(); iter != raid_group_members.end(); ++iter) { + if (iter->member && caster->GetNeedsCured(iter->member)) { + if (caster->AICastSpell(iter->member, caster->GetChanceToCastBySpellType(SpellType_Cure), SpellType_Cure)) return true; else if (botCasterClass == BARD) return false; } - if (iter.member && iter.member->GetPet() && caster->GetNeedsCured(iter.member->GetPet())) { - if (caster->AICastSpell(iter.member->GetPet(), (int)caster->GetChanceToCastBySpellType(SpellType_Cure) / 4, SpellType_Cure)) + if (iter->member && iter->member->GetPet() && caster->GetNeedsCured(iter->member->GetPet())) { + if (caster->AICastSpell(iter->member->GetPet(), (int)caster->GetChanceToCastBySpellType(SpellType_Cure) / 4, SpellType_Cure)) return true; } } @@ -9483,9 +9491,10 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl Raid* raid = entity_list.GetRaidByBotName(caster->GetName()); uint32 gid = raid->GetGroup(caster->GetName()); if (gid < 12) { - for (RaidMember& iter : raid->GetRaidGroupMembers(gid)) { - if (iter.member && caster->GetNeedsHateRedux(iter.member)) { - if (caster->AICastSpell(iter.member, caster->GetChanceToCastBySpellType(SpellType_HateRedux), SpellType_HateRedux)) + std::vector raid_group_members = raid->GetRaidGroupMembers(gid); + for (std::vector::iterator iter = raid_group_members.begin(); iter != raid_group_members.end(); ++iter) { + if (iter->member && caster->GetNeedsHateRedux(iter->member)) { + if (caster->AICastSpell(iter->member, caster->GetChanceToCastBySpellType(SpellType_HateRedux), SpellType_HateRedux)) return true; } } @@ -9503,9 +9512,10 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl Raid* raid = entity_list.GetRaidByBotName(caster->GetName()); uint32 g = raid->GetGroup(caster->GetName()); if (g < 12) { - for (RaidMember& iter : raid->GetRaidGroupMembers(g)) { - if (iter.member) { - if (caster->AICastSpell(iter.member, iChance, SpellType_PreCombatBuff) || caster->AICastSpell(iter.member->GetPet(), iChance, SpellType_PreCombatBuff)) + std::vector raid_group_members = raid->GetRaidGroupMembers(g); + for (std::vector::iterator iter = raid_group_members.begin(); iter != raid_group_members.end(); ++iter) { + if (iter->member) { + if (caster->AICastSpell(iter->member, iChance, SpellType_PreCombatBuff) || caster->AICastSpell(iter->member->GetPet(), iChance, SpellType_PreCombatBuff)) return true; } } diff --git a/zone/bot_raid.cpp b/zone/bot_raid.cpp index c66fa32ff..78ae8c909 100644 --- a/zone/bot_raid.cpp +++ b/zone/bot_raid.cpp @@ -314,9 +314,9 @@ void Bot::AI_Process_Raid() else { std::vector raid_group_members = raid->GetRaidGroupMembers(r_group); - for (RaidMember iter : raid_group_members) { + for (std::vector::iterator iter = raid_group_members.begin(); iter != raid_group_members.end(); ++iter) { - Mob* bg_member = iter.member;// bot_group->members[counter]; + Mob* bg_member = iter->member;// bot_group->members[counter]; if (!bg_member) { continue; } @@ -1525,6 +1525,8 @@ void Bot::PetAIProcess_Raid() { std::vector Raid::GetRaidGroupMembers(uint32 gid) { std::vector raid_group_members; + raid_group_members.clear(); + for (int i = 0; i < MAX_RAID_MEMBERS; ++i) { if (members[i].member && members[i].GroupNumber == gid) @@ -1775,12 +1777,12 @@ bool Bot::AICastSpell_Raid(Mob* tar, uint8 iChance, uint32 iSpellTypes) { if (IsGroupSpell(botSpell.SpellId)) { if (IsRaidGrouped()) { uint32 r_group = raid->GetGroup(GetName()); - std::vector raid_group_members = raid->GetRaidGroupMembers(r_group); BotGroupSay(this, "Casting %s.", spells[botSpell.SpellId].name); //raid->RaidBotGroupSay(this, 0, 100, "Casting %s.", spells[botSpell.SpellId].name); - for (RaidMember iter : raid_group_members) { - if (iter.member && !iter.member->qglobal) { - iter.member->SetDontHealMeBefore(Timer::GetCurrentTime() + 1000); + std::vector raid_group_members = raid->GetRaidGroupMembers(r_group); + for (std::vector::iterator iter = raid_group_members.begin(); iter != raid_group_members.end(); ++iter) { + if (iter->member && !iter->member->qglobal) { + iter->member->SetDontHealMeBefore(Timer::GetCurrentTime() + 1000); } } } @@ -2441,10 +2443,11 @@ bool Bot::AICastSpell_Raid(Mob* tar, uint8 iChance, uint32 iSpellTypes) { if (IsGroupSpell(botSpell.SpellId)) { if (this->IsRaidGrouped()) { if (r_group) { - for (RaidMember iter : raid->GetRaidGroupMembers(r_group)) { - if (iter.member && !iter.member->qglobal) { + std::vector raid_group_members = raid->GetRaidGroupMembers(r_group); + for (std::vector::iterator iter = raid_group_members.begin(); iter != raid_group_members.end(); ++iter) { + if (iter->member && !iter->member->qglobal) { if (TempDontCureMeBeforeTime != tar->DontCureMeBefore()) - iter.member->SetDontCureMeBefore(Timer::GetCurrentTime() + 4000); + iter->member->SetDontCureMeBefore(Timer::GetCurrentTime() + 4000); } } } @@ -2600,13 +2603,13 @@ uint8 Bot::GetNumberNeedingHealedInRaidGroup(uint8 hpr, bool includePets) { raid = entity_list.GetRaidByBotName(this->GetName()); uint32 r_group = raid->GetGroup(this->GetName()); std::vector raid_group_members = raid->GetRaidGroupMembers(r_group); - for (RaidMember iter : raid_group_members) { - if (iter.member && !iter.member->qglobal) { - if (iter.member->GetHPRatio() <= hpr) + for (std::vector::iterator iter = raid_group_members.begin(); iter != raid_group_members.end(); ++iter) { + if (iter->member && !iter->member->qglobal) { + if (iter->member->GetHPRatio() <= hpr) needHealed++; if (includePets) { - if (iter.member->GetPet() && iter.member->GetPet()->GetHPRatio() <= hpr) + if (iter->member->GetPet() && iter->member->GetPet()->GetHPRatio() <= hpr) needHealed++; } } diff --git a/zone/raids.h b/zone/raids.h index 8c31d210f..5bce90df9 100644 --- a/zone/raids.h +++ b/zone/raids.h @@ -135,7 +135,7 @@ public: bool IsGroupLeader(const char *who); bool IsRaidMember(const char *name); void UpdateLevel(const char *name, int newLevel); - std::vector GetRaidGroupMembers(uint32 gid); + uint32 GetFreeGroup(); uint8 GroupCount(uint32 gid); @@ -257,6 +257,7 @@ public: bool DoesAnyMemberHaveExpeditionLockout(const std::string& expedition_name, const std::string& event_name, int max_check_count = 0); std::vector GetMembers() const; + std::vector GetRaidGroupMembers(uint32 gid); RaidMember members[MAX_RAID_MEMBERS]; char leadername[64];