bool CMagicState::CanCastSpell(CBattleEntity* PTarget) { auto ret = m_PEntity->CanUseSpell(GetSpell()); if (!ret) { m_errorMsg = std::make_unique<CMessageBasicPacket>(m_PEntity, m_PEntity, m_PSpell->getID(), 0, MSGBASIC_CANNOT_CAST_SPELL); return ret; } if (m_PEntity->StatusEffectContainer->HasStatusEffect({EFFECT_SILENCE, EFFECT_MUTE, EFFECT_OMERTA})) { m_errorMsg = std::make_unique<CMessageBasicPacket>(m_PEntity, m_PEntity, m_PSpell->getID(), 0, MSGBASIC_UNABLE_TO_CAST_SPELLS); return false; } if (!HasCost()) { return false; } if (!PTarget) { m_errorMsg = std::make_unique<CMessageBasicPacket>(m_PEntity, m_PEntity, m_PSpell->getID(), 0, MSGBASIC_CANNOT_ON_THAT_TARG); return false; } if (PTarget->IsNameHidden()) { return false; } if (distance(m_PEntity->loc.p, PTarget->loc.p) > 40) { m_errorMsg = std::make_unique<CMessageBasicPacket>(m_PEntity, PTarget, m_PSpell->getID(), 0, MSGBASIC_TOO_FAR_AWAY); return false; } if (m_PEntity->objtype == TYPE_PC && distance(m_PEntity->loc.p, PTarget->loc.p) > m_PSpell->getRange()) { m_errorMsg = std::make_unique<CMessageBasicPacket>(m_PEntity, PTarget, m_PSpell->getID(), 0, MSGBASIC_OUT_OF_RANGE_UNABLE_CAST); return false; } if (dynamic_cast<CMobEntity*>(m_PEntity)) { if (distanceSquared(m_PEntity->loc.p, PTarget->loc.p) > square(28.5f)) { return false; } } if (!m_PEntity->PAI->TargetFind->canSee(&PTarget->loc.p)) { m_errorMsg = std::make_unique<CMessageBasicPacket>(m_PEntity, PTarget, m_PSpell->getID(), 0, MSGBASIC_CANNOT_PERFORM_ACTION); return false; } return true; }
bool CMagicState::CanCastSpell(CBattleEntity* PTarget) { auto ret = m_PEntity->CanUseSpell(GetSpell()); if (!ret) { m_errorMsg = std::make_unique<CMessageBasicPacket>(m_PEntity, m_PEntity, m_PSpell->getID(), 0, MSGBASIC_CANNOT_CAST_SPELL); return ret; } if (m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_SILENCE) || m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_MUTE)) { m_errorMsg = std::make_unique<CMessageBasicPacket>(m_PEntity, m_PEntity, m_PSpell->getID(), 0, MSGBASIC_UNABLE_TO_CAST_SPELLS); return false; } if (!HasCost()) { return false; } if (!PTarget) { m_errorMsg = std::make_unique<CMessageBasicPacket>(m_PEntity, m_PEntity, m_PSpell->getID(), 0, MSGBASIC_CANNOT_ON_THAT_TARG); return false; } if (distance(m_PEntity->loc.p, PTarget->loc.p) > 40) { m_errorMsg = std::make_unique<CMessageBasicPacket>(m_PEntity, PTarget, m_PSpell->getID(), 0, MSGBASIC_TOO_FAR_AWAY); return false; } if (distance(m_PEntity->loc.p, PTarget->loc.p) > 30 /* #TODO: m_PSpell->getMaxRange()*/) { m_errorMsg = std::make_unique<CMessageBasicPacket>(m_PEntity, PTarget, m_PSpell->getID(), 0, MSGBASIC_OUT_OF_RANGE_UNABLE_CAST); return false; } return true; }