knightonline/server/GameServer/MagicInstance.h

170 lines
4.5 KiB
C++

#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();
};