bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target) { if (!spellId) return false; if (!target) target = bot; Pet* pet = bot->GetPet(); if (pet && pet->HasSpell(spellId)) { pet->ToggleAutocast(spellId, true); TellMaster("My pet will auto-cast this spell"); return true; } aiObjectContext->GetValue<LastSpellCast&>("last spell cast")->Get().Set(spellId, target->GetObjectGuid(), time(0)); aiObjectContext->GetValue<LastMovement&>("last movement")->Get().Set(NULL); const SpellEntry* const pSpellInfo = sSpellStore.LookupEntry(spellId); MotionMaster &mm = *bot->GetMotionMaster(); if (bot->isMoving() && GetSpellCastTime(pSpellInfo, NULL)) { return false; } if (bot->IsTaxiFlying()) return false; bot->clearUnitState( UNIT_STAT_CHASE ); bot->clearUnitState( UNIT_STAT_FOLLOW ); ObjectGuid oldSel = bot->GetSelectionGuid(); bot->SetSelectionGuid(target->GetObjectGuid()); Spell *spell = new Spell(bot, pSpellInfo, false); SpellCastTargets targets; targets.setUnitTarget(target); WorldObject* faceTo = target; if (pSpellInfo->Targets & TARGET_FLAG_ITEM) { spell->m_CastItem = aiObjectContext->GetValue<Item*>("item for spell", spellId)->Get(); targets.setItemTarget(spell->m_CastItem); } if (pSpellInfo->Effect[0] == SPELL_EFFECT_OPEN_LOCK || pSpellInfo->Effect[0] == SPELL_EFFECT_SKINNING) { LootObject loot = *aiObjectContext->GetValue<LootObject>("loot target"); if (!loot.IsLootPossible(bot)) return false; GameObject* go = GetGameObject(loot.guid); if (go && go->isSpawned()) { WorldPacket* const packetgouse = new WorldPacket(CMSG_GAMEOBJ_USE, 8); *packetgouse << loot.guid; bot->GetSession()->QueuePacket(packetgouse); targets.setGOTarget(go); faceTo = go; } else { Unit* creature = GetUnit(loot.guid); if (creature) { targets.setUnitTarget(creature); faceTo = creature; } } } if (!bot->IsInFront(faceTo, sPlayerbotAIConfig.sightDistance)) { bot->SetFacingTo(bot->GetAngle(faceTo)); SetNextCheckDelay(sPlayerbotAIConfig.globalCoolDown); return false; } WaitForSpellCast(spellId); spell->prepare(&targets); bot->SetSelectionGuid(oldSel); LastSpellCast& lastSpell = aiObjectContext->GetValue<LastSpellCast&>("last spell cast")->Get(); return lastSpell.id == spellId; }