CMagicState::CMagicState(CBattleEntity* PEntity, uint16 targid, uint16 spellid, uint8 flags) : CState(PEntity, targid), m_PEntity(PEntity), m_PSpell(nullptr) { CSpell* PSpell = spell::GetSpell(spellid); m_PSpell = PSpell->clone(); if (!m_PSpell) { throw CStateInitException(std::make_unique<CMessageBasicPacket>(m_PEntity, m_PEntity, m_PSpell->getID(), 0, MSGBASIC_CANNOT_CAST_SPELL)); } auto PTarget = m_PEntity->IsValidTarget(m_targid, m_PSpell->getValidTarget(), m_errorMsg); if (!PTarget || m_errorMsg) { throw CStateInitException(std::move(m_errorMsg)); } if (!CanCastSpell(PTarget)) { throw CStateInitException(std::move(m_errorMsg)); } auto errorMsg = luautils::OnMagicCastingCheck(m_PEntity, PTarget, GetSpell()); if (errorMsg) { throw CStateInitException(std::make_unique<CMessageBasicPacket>(m_PEntity, PTarget, m_PSpell->getID(), 0, errorMsg == 1 ? MSGBASIC_CANNOT_CAST_SPELL : errorMsg)); } m_flags = flags; m_castTime = std::chrono::milliseconds(battleutils::CalculateSpellCastTime(m_PEntity, GetSpell())); m_startPos = m_PEntity->loc.p; action_t action; action.id = m_PEntity->id; action.spellgroup = m_PSpell->getSpellGroup(); action.actiontype = ACTION_MAGIC_START; actionList_t& actionList = action.getNewActionList(); actionList.ActionTargetID = PTarget->id; actionTarget_t& actionTarget = actionList.getNewActionTarget(); actionTarget.reaction = REACTION_NONE; actionTarget.speceffect = SPECEFFECT_NONE; actionTarget.animation = 0; actionTarget.param = m_PSpell->getID(); actionTarget.messageID = 327; // starts casting m_PEntity->PAI->EventHandler.triggerListener("MAGIC_START", m_PEntity, m_PSpell.get(), &action); //TODO: weaponskill lua object m_PEntity->loc.zone->PushPacket(m_PEntity, CHAR_INRANGE_SELF, new CActionPacket(action)); }