#pragma once enum ResistanceTypes { NONE_R = 0, FIRE_R = 1, COLD_R = 2, LIGHTNING_R = 3, MAGIC_R = 4, DISEASE_R = 5, POISON_R = 6, LIGHT_R = 7, DARKNESS_R = 8 }; enum MagicDamageType { FIRE_DAMAGE = 5, ICE_DAMAGE = 6, LIGHTNING_DAMAGE = 7 }; enum SkillMoral { MORAL_SELF = 1, MORAL_FRIEND_WITHME = 2, MORAL_FRIEND_EXCEPTME = 3, MORAL_PARTY = 4, MORAL_NPC = 5, MORAL_PARTY_ALL = 6, MORAL_ENEMY = 7, MORAL_ALL = 8, MORAL_AREA_ENEMY = 10, MORAL_AREA_FRIEND = 11, MORAL_AREA_ALL = 12, MORAL_SELF_AREA = 13, MORAL_CLAN = 14, MORAL_CLAN_ALL = 15, MORAL_UNDEAD = 16, // I don't think a lot of these made it to KO. MORAL_PET_WITHME = 17, MORAL_PET_ENEMY = 18, MORAL_ANIMAL1 = 19, MORAL_ANIMAL2 = 20, MORAL_ANIMAL3 = 21, MORAL_ANGEL = 22, MORAL_DRAGON = 23, MORAL_CORPSE_FRIEND = 25, MORAL_CORPSE_ENEMY = 26, MORAL_SIEGE_WEAPON = 31, // must be using a siege weapon MORAL_EXTEND_DURATION = 240 }; #define WARP_RESURRECTION 1 // To the resurrection point. #define REMOVE_TYPE3 1 #define REMOVE_TYPE4 2 #define RESURRECTION 3 #define RESURRECTION_SELF 4 #define REMOVE_BLESS 5 #define CLASS_STONE_BASE_ID 379058000 enum SkillUseResult { SkillUseOK, SkillUseFail, SkillUseHandled }; class Unit; struct _MAGIC_TABLE; class MagicInstance { public: uint8 bOpcode; uint32 nSkillID; _MAGIC_TABLE * pSkill; int16 sCasterID, sTargetID; Unit *pSkillCaster, *pSkillTarget; int16 sData[7]; bool bSendFail; // When enabled (enabled by default), sends fail packets to the client. // This is not preferable in cases like scripted casts, as the script should handle the failure. bool bIsRecastingSavedMagic; bool bIsItemProc; bool bInstantCast; bool bSkillSuccessful; uint32 nConsumeItem; INLINE bool ColdSkills() { return nSkillID == 109642 || nSkillID == 110642 || nSkillID == 209642 || nSkillID == 210642 || nSkillID == 110672 || nSkillID == 210672; } INLINE bool LightStunSkills() { return nSkillID == 109742 || nSkillID == 110742 || nSkillID == 209742 || nSkillID == 210742 || nSkillID == 110772 || nSkillID == 210772 || nSkillID == 107566 || nSkillID == 207566 || nSkillID == 108566 || nSkillID == 208566 || nSkillID == 115810 || nSkillID == 215810; } INLINE bool KurianStuns() { return nSkillID == 114509 || nSkillID == 214509 || nSkillID == 115509 || nSkillID == 215509; } INLINE bool KurianStunsNot() { return nSkillID == 194509 || nSkillID == 294509 || nSkillID == 195509 || nSkillID == 295509; } INLINE bool ColdSkillsNot() { return nSkillID == 189642 || nSkillID == 190642 || nSkillID == 289642 || nSkillID == 290642 || nSkillID == 190672 || nSkillID == 290672; } INLINE bool LightStunSkillsNot() { return nSkillID == 189742 || nSkillID == 190742 || nSkillID == 289742 || nSkillID == 290742 || nSkillID == 190772 || nSkillID == 290772 || nSkillID == 187566 || nSkillID == 287566 || nSkillID == 188566 || nSkillID == 288566 || nSkillID == 195810 || nSkillID == 295810;; } MagicInstance() : bOpcode(MAGIC_EFFECTING), nSkillID(0), pSkill(nullptr), sCasterID(-1), sTargetID(-1), pSkillCaster(nullptr), pSkillTarget(nullptr), bSendFail(true), bIsRecastingSavedMagic(false), bIsItemProc(false), bInstantCast(false), bSkillSuccessful(true), nConsumeItem(0) { memset(&sData, 0, sizeof(sData)); } void Run(); bool IsAvailable(); SkillUseResult UserCanCast(); SkillUseResult CheckSkillPrerequisites(); bool CheckType3Prerequisites(); bool CheckType4Prerequisites(); bool CheckType6Prerequisites(); bool ExecuteSkill(uint8 bType); bool ExecuteType1(); bool ExecuteType2(); bool ExecuteType3(); bool ExecuteType4(); bool ExecuteType5(); bool ExecuteType6(); bool ExecuteType7(); bool ExecuteType8(); bool ExecuteType9(); void Type3Cancel(); void Type4Cancel(); void Type6Cancel(bool bForceRemoval = false); void Type9Cancel(bool bRemoveFromMap = true); void Type4Extend(); short GetMagicDamage(Unit *pTarget, int total_hit, int attribute); int32 GetWeatherDamage(int32 damage, int attribute); void ReflectDamage(int32 damage, Unit * pTarget); void ConsumeItem(); void SendSkillToAI(); void BuildSkillPacket(Packet & result, int16 sSkillCaster, int16 sSkillTarget, int8 opcode, uint32 nSkillID, int16 sData[7]); void BuildAndSendSkillPacket(Unit * pUnit, bool bSendToRegion, int16 sSkillCaster, int16 sSkillTarget, int8 opcode, uint32 nSkillID, int16 sData[7]); void SendSkill(bool bSendToRegion = true, Unit * pUnit = nullptr); void SendSkillFailed(int16 sTargetID = -1); void SendSkillNotEffect(); void SendTransformationList(); };