bool CanUseSpell(CBattleEntity* PCaster, uint16 SpellID) { bool usable = false; CSpell* spell = GetSpell(SpellID); if (spell != NULL) { uint8 JobMLVL = spell->getJob(PCaster->GetMJob()); uint8 JobSLVL = spell->getJob(PCaster->GetSJob()); uint8 requirements = spell->getRequirements(); if(PCaster->GetMLevel() >= JobMLVL) { usable = true; if (requirements & SPELLREQ_TABULA_RASA) { if (!PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_TABULA_RASA)) { usable = false; } } if (requirements & SPELLREQ_ADDENDUM_BLACK && PCaster->GetMJob() == JOB_SCH) { if(!PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ADDENDUM_BLACK) && !PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ENLIGHTENMENT)) { usable = false; } } else if (requirements & SPELLREQ_ADDENDUM_WHITE && PCaster->GetMJob() == JOB_SCH) { if (!PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ADDENDUM_WHITE) && !PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ENLIGHTENMENT)) { usable = false; } } else if (SpellID > 0x200) { if (PCaster->objtype == TYPE_PC) { if (!blueutils::IsSpellSet((CCharEntity*)PCaster, (CBlueSpell*)spell)) { usable = false; } } } if (usable) { return true; } } if(PCaster->GetSLevel() >= JobSLVL) { usable = true; if (requirements & SPELLREQ_TABULA_RASA) { if (!PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_TABULA_RASA)) { usable = false; } } if (requirements & SPELLREQ_ADDENDUM_BLACK && PCaster->GetSJob() == JOB_SCH) { if (!PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ADDENDUM_BLACK) && !PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ENLIGHTENMENT)) { usable = false; } } else if (requirements & SPELLREQ_ADDENDUM_WHITE && PCaster->GetSJob() == JOB_SCH) { if (!PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ADDENDUM_WHITE) && !PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ENLIGHTENMENT)) { usable = false; } } else if (SpellID > 0x200) { if (PCaster->objtype == TYPE_PC) { if (!blueutils::IsSpellSet((CCharEntity*)PCaster, (CBlueSpell*)spell)) { usable = false; } } } } } return usable; }