void Totem::SetTypeBySummonSpell(SpellEntry const* spellProto) { // Get spell casted by totem SpellEntry const* totemSpell = sSpellStore.LookupEntry(GetSpell()); if (totemSpell) { // If spell have cast time -> so its active totem if (GetSpellCastTime(totemSpell)) m_type = TOTEM_ACTIVE; } if (spellProto->SpellIconID == 2056) m_type = TOTEM_STATUE; // Jewelery statue }
void Totem::SetTypeBySummonSpell(SpellEntry const * spellProto) { // Get spell casted by totem SpellEntry const * totemSpell = sSpellStore.LookupEntry(GetSpell()); if (totemSpell) { // If spell have cast time -> so its active totem if (GetSpellCastTime(totemSpell)) m_type = TOTEM_ACTIVE; if(totemSpell->Id == 40132 || totemSpell->Id == 40133) m_type = TOTEM_PASSIVE; // Shaman summoning totems } if(spellProto->GetSpellIconID() == 2056) m_type = TOTEM_STATUE; //Jewelery statue }
void Totem::InitStats(uint32 duration) { Minion::InitStats(duration); CreatureInfo const *cinfo = GetCreatureInfo(); if(m_owner->GetTypeId() == TYPEID_PLAYER && cinfo) { uint32 display_id = objmgr.ChooseDisplayId(((Player*)m_owner)->GetTeam(), cinfo); CreatureModelInfo const *minfo = objmgr.GetCreatureModelRandomGender(display_id); if (minfo) display_id = minfo->modelid; switch (((Player*)m_owner)->GetTeam()) { case ALLIANCE: display_id = cinfo->Modelid1; break; case HORDE: if (cinfo->Modelid3) display_id = cinfo->Modelid3; else display_id = cinfo->Modelid1; break; default: break; } SetDisplayId(display_id); } // Get spell casted by totem SpellEntry const * totemSpell = sSpellStore.LookupEntry(GetSpell()); if (totemSpell) { // If spell have cast time -> so its active totem if (GetSpellCastTime(totemSpell)) m_type = TOTEM_ACTIVE; } if(GetEntry() == SENTRY_TOTEM_ENTRY) SetReactState(REACT_AGGRESSIVE); m_duration = duration; SetLevel(m_owner->getLevel()); }
void Totem::InitStats(uint32 duration) { Minion::InitStats(duration); CreatureInfo const *cinfo = GetCreatureInfo(); if (m_owner->GetTypeId() == TYPEID_PLAYER && cinfo) { uint32 modelid = 0; if (m_owner->ToPlayer()->GetTeam() == HORDE) { if (cinfo->Modelid_H1) modelid = cinfo->Modelid_H1; else if (cinfo->Modelid_H2) modelid = cinfo->Modelid_H2; } else { if (cinfo->Modelid_A1) modelid = cinfo->Modelid_A1; else if (cinfo->Modelid_A2) modelid = cinfo->Modelid_A2; } if (modelid) SetDisplayId(modelid); else sLog.outErrorDb("Totem::Summon: Missing modelid information for entry %u, team %u, totem will use default values.",GetEntry(),m_owner->ToPlayer()->GetTeam()); } // Get spell casted by totem SpellEntry const * totemSpell = sSpellStore.LookupEntry(GetSpell()); if (totemSpell) { // If spell have cast time -> so its active totem if (GetSpellCastTime(totemSpell)) m_type = TOTEM_ACTIVE; } if (GetEntry() == SENTRY_TOTEM_ENTRY) SetReactState(REACT_AGGRESSIVE); m_duration = duration; SetLevel(m_owner->getLevel()); }
CanCastResult UnitAI::DoCastSpellIfCan(Unit* target, uint32 spellId, uint32 castFlags, ObjectGuid originalCasterGUID) const { Unit* caster = m_unit; if (target) { if (castFlags & CAST_SWITCH_CASTER_TARGET) std::swap(caster, target); if (castFlags & CAST_FORCE_TARGET_SELF) caster = target; } else if (castFlags & (CAST_FORCE_TARGET_SELF | CAST_SWITCH_CASTER_TARGET)) return CAST_FAIL_OTHER; // Allowed to cast only if not casting (unless we interrupt ourself) or if spell is triggered if (!caster->IsNonMeleeSpellCasted(false) || (castFlags & (CAST_TRIGGERED | CAST_INTERRUPT_PREVIOUS))) { if (const SpellEntry* spellInfo = sSpellTemplate.LookupEntry<SpellEntry>(spellId)) { // If cast flag CAST_AURA_NOT_PRESENT is active, check if target already has aura on them if (castFlags & CAST_AURA_NOT_PRESENT) { if (!target) { if (caster->HasAura(spellId)) return CAST_FAIL_TARGET_AURA; } else if (target->HasAura(spellId)) return CAST_FAIL_TARGET_AURA; } // Check if cannot cast spell if (!(castFlags & (CAST_FORCE_TARGET_SELF | CAST_FORCE_CAST))) { CanCastResult castResult = CanCastSpell(target, spellInfo, (castFlags & CAST_TRIGGERED) != 0); if (castResult != CAST_OK) return castResult; } // Interrupt any previous spell if (castFlags & CAST_INTERRUPT_PREVIOUS && caster->IsNonMeleeSpellCasted(false)) caster->InterruptNonMeleeSpells(false); // Creature should always stop before it will cast a non-instant spell if (GetSpellCastTime(spellInfo) || (IsChanneledSpell(spellInfo) && spellInfo->ChannelInterruptFlags & CHANNEL_FLAG_MOVEMENT)) caster->StopMoving(); // Creature should interrupt any current melee spell caster->InterruptSpell(CURRENT_MELEE_SPELL); // Creature should stop wielding weapon while casting // caster->SetSheath(SHEATH_STATE_UNARMED); uint32 flags = (castFlags & CAST_TRIGGERED ? TRIGGERED_OLD_TRIGGERED : TRIGGERED_NONE) | (castFlags & CAST_IGNORE_UNSELECTABLE_TARGET ? TRIGGERED_IGNORE_UNSELECTABLE_FLAG : TRIGGERED_NONE); if (flags == TRIGGERED_NONE) flags |= TRIGGERED_NORMAL_COMBAT_CAST; caster->CastSpell(target, spellInfo, flags, nullptr, nullptr, originalCasterGUID); return CAST_OK; } sLog.outErrorDb("DoCastSpellIfCan by %s attempt to cast spell %u but spell does not exist.", m_unit->GetObjectGuid().GetString().c_str(), spellId); return CAST_FAIL_OTHER; } return CAST_FAIL_IS_CASTING; }
CanCastResult CreatureAI::DoCastSpellIfCan(Unit* pTarget, uint32 uiSpell, uint32 uiCastFlags, ObjectGuid uiOriginalCasterGUID) const { Unit* pCaster = m_unit; if (!pTarget) return CAST_FAIL_OTHER; if (uiCastFlags & CAST_SWITCH_CASTER_TARGET) std::swap(pCaster, pTarget); if (uiCastFlags & CAST_FORCE_TARGET_SELF) pCaster = pTarget; // Allowed to cast only if not casting (unless we interrupt ourself) or if spell is triggered if (!pCaster->IsNonMeleeSpellCasted(false) || (uiCastFlags & (CAST_TRIGGERED | CAST_INTERRUPT_PREVIOUS))) { if (const SpellEntry* pSpell = sSpellTemplate.LookupEntry<SpellEntry>(uiSpell)) { // If cast flag CAST_AURA_NOT_PRESENT is active, check if target already has aura on them if (uiCastFlags & CAST_AURA_NOT_PRESENT) { if (pTarget->HasAura(uiSpell)) return CAST_FAIL_TARGET_AURA; } // Check if cannot cast spell if (!(uiCastFlags & (CAST_FORCE_TARGET_SELF | CAST_FORCE_CAST))) { CanCastResult castResult = CanCastSpell(pTarget, pSpell, !!(uiCastFlags & CAST_TRIGGERED)); if (castResult != CAST_OK) return castResult; } // Interrupt any previous spell if (uiCastFlags & CAST_INTERRUPT_PREVIOUS && pCaster->IsNonMeleeSpellCasted(false)) pCaster->InterruptNonMeleeSpells(false); // Creature should always stop before it will cast a non-instant spell if (GetSpellCastTime(pSpell)) pCaster->StopMoving(); // Creature should interrupt any current melee spell pCaster->InterruptSpell(CURRENT_MELEE_SPELL); // Creature should stop wielding weapon while casting pCaster->SetSheath(SHEATH_STATE_UNARMED); uint32 flags = (uiCastFlags & CAST_TRIGGERED ? TRIGGERED_OLD_TRIGGERED : TRIGGERED_NONE) | (uiCastFlags & CAST_IGNORE_UNSELECTABLE_TARGET ? TRIGGERED_IGNORE_UNSELECTABLE_FLAG : TRIGGERED_NONE); pCaster->CastSpell(pTarget, pSpell, flags, nullptr, nullptr, uiOriginalCasterGUID); return CAST_OK; } else { sLog.outErrorDb("DoCastSpellIfCan by %s attempt to cast spell %u but spell does not exist.", m_unit->GetObjectGuid().GetString().c_str(), uiSpell); return CAST_FAIL_OTHER; } } else return CAST_FAIL_IS_CASTING; }