From 9adfe5b9ff3f50afe27b294e000067adfbb1ba7e Mon Sep 17 00:00:00 2001 From: Uleat Date: Tue, 21 Feb 2017 20:40:04 -0500 Subject: [PATCH] Fix for bot wizard repeating familiar casting when pet is dead and buff is active --- zone/bot.cpp | 19 ++++++++++++++++--- zone/botspellsai.cpp | 31 ++++++++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/zone/bot.cpp b/zone/bot.cpp index 240530237..5da128aa6 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -1634,6 +1634,19 @@ bool Bot::LoadPet() auto bot_owner = GetBotOwner(); if (!bot_owner) return false; + + if (GetClass() == WIZARD) { + auto buffs_max = GetMaxBuffSlots(); + auto my_buffs = GetBuffs(); + if (buffs_max && my_buffs) { + for (int index = 0; index < buffs_max; ++index) { + if (IsEffectInSpell(my_buffs[index].spellid, SE_Familiar)) { + MakePet(my_buffs[index].spellid, spells[my_buffs[index].spellid].teleport_zone); + return true; + } + } + } + } std::string error_message; @@ -1649,7 +1662,7 @@ bool Bot::LoadPet() if (!botdb.LoadPetSpellID(GetBotID(), saved_pet_spell_id)) { bot_owner->Message(13, "%s for %s's pet", BotDatabase::fail::LoadPetSpellID(), GetCleanName()); } - if (!saved_pet_spell_id || saved_pet_spell_id > SPDAT_RECORDS) { + if (!IsValidSpell(saved_pet_spell_id)) { bot_owner->Message(13, "Invalid spell id for %s's pet", GetCleanName()); DeletePet(); return false; @@ -1693,11 +1706,11 @@ bool Bot::LoadPet() bool Bot::SavePet() { - if (!GetPet() /*|| dead*/) + if (!GetPet() || GetPet()->IsFamiliar() /*|| dead*/) return true; NPC *pet_inst = GetPet()->CastToNPC(); - if (pet_inst->IsFamiliar() || !pet_inst->GetPetSpellID() || pet_inst->GetPetSpellID() > SPDAT_RECORDS) + if (!pet_inst->GetPetSpellID() || !IsValidSpell(pet_inst->GetPetSpellID())) return false; auto bot_owner = GetBotOwner(); diff --git a/zone/botspellsai.cpp b/zone/botspellsai.cpp index 74870fed3..f3b4ec83a 100644 --- a/zone/botspellsai.cpp +++ b/zone/botspellsai.cpp @@ -557,10 +557,35 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint32 iSpellTypes) { case SpellType_Pet: { //keep mobs from recasting pets when they have them. if (!IsPet() && !GetPetID() && !IsBotCharmer()) { - if(botClass == MAGICIAN) - botSpell = GetBestBotMagicianPetSpell(this); - else + if (botClass == WIZARD) { + auto buffs_max = GetMaxBuffSlots(); + auto my_buffs = GetBuffs(); + int familiar_buff_slot = -1; + if (buffs_max && my_buffs) { + for (int index = 0; index < buffs_max; ++index) { + if (IsEffectInSpell(my_buffs[index].spellid, SE_Familiar)) { + MakePet(my_buffs[index].spellid, spells[my_buffs[index].spellid].teleport_zone); + familiar_buff_slot = index; + break; + } + } + } + if (GetPetID()) + break; + + if (familiar_buff_slot >= 0) { + BuffFadeBySlot(familiar_buff_slot); + break; + } + botSpell = GetFirstBotSpellBySpellType(this, SpellType_Pet); + } + else if (botClass == MAGICIAN) { + botSpell = GetBestBotMagicianPetSpell(this); + } + else { + botSpell = GetFirstBotSpellBySpellType(this, SpellType_Pet); + } if(botSpell.SpellId == 0) break;