mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 10:31:29 +00:00
[Constants] Convert SE Defines to SpellEffect Namespace (#4999)
This commit is contained in:
parent
92c8b0e585
commit
060f6e377d
@ -438,7 +438,7 @@ namespace EQ
|
|||||||
//uint32 Unk054 {};
|
//uint32 Unk054 {};
|
||||||
int16 MaxCharges {}; // Maximum charges items can hold: -1 if not a chargeable item
|
int16 MaxCharges {}; // Maximum charges items can hold: -1 if not a chargeable item
|
||||||
uint8 ItemType {}; // Item Type/Skill (itemClass* from above)
|
uint8 ItemType {}; // Item Type/Skill (itemClass* from above)
|
||||||
int32 SubType {}; // Some items have sub types that can be used for other things (unbreakable fishing poles, SE_FFItemClass)
|
int32 SubType {}; // Some items have sub types that can be used for other things (unbreakable fishing poles, SpellEffect::FFItemClass)
|
||||||
uint8 Material {}; // Item material type
|
uint8 Material {}; // Item material type
|
||||||
uint32 HerosForgeModel {};// Hero's Forge Armor Model Type (2-13?)
|
uint32 HerosForgeModel {};// Hero's Forge Armor Model Type (2-13?)
|
||||||
float SellRate {}; // Sell rate
|
float SellRate {}; // Sell rate
|
||||||
|
|||||||
@ -619,7 +619,7 @@ RULE_INT(Combat, SneakPullAssistRange, 400, "Modified range of assist for sneak
|
|||||||
RULE_BOOL(Combat, Classic2HBAnimation, false, "2HB will use the 2 hand piercing animation instead of the overhead slashing animation")
|
RULE_BOOL(Combat, Classic2HBAnimation, false, "2HB will use the 2 hand piercing animation instead of the overhead slashing animation")
|
||||||
RULE_BOOL(Combat, ArcheryConsumesAmmo, true, "Set to false to disable Archery Ammo Consumption")
|
RULE_BOOL(Combat, ArcheryConsumesAmmo, true, "Set to false to disable Archery Ammo Consumption")
|
||||||
RULE_BOOL(Combat, ThrowingConsumesAmmo, true, "Set to false to disable Throwing Ammo Consumption")
|
RULE_BOOL(Combat, ThrowingConsumesAmmo, true, "Set to false to disable Throwing Ammo Consumption")
|
||||||
RULE_BOOL(Combat, UseLiveRiposteMechanics, false, "Set to true to disable SPA 173 SE_RiposteChance from making those with the effect on them immune to enrage, can longer riposte from a riposte.")
|
RULE_BOOL(Combat, UseLiveRiposteMechanics, false, "Set to true to disable SPA 173 SpellEffect::RiposteChance from making those with the effect on them immune to enrage, can longer riposte from a riposte.")
|
||||||
RULE_INT(Combat, FrontalStunImmunityClasses, 0, "Bitmask for Classes than have frontal stun immunity, No Races (0) by default.")
|
RULE_INT(Combat, FrontalStunImmunityClasses, 0, "Bitmask for Classes than have frontal stun immunity, No Races (0) by default.")
|
||||||
RULE_BOOL(Combat, NPCsUseFrontalStunImmunityClasses, false, "Enable or disable NPCs using frontal stun immunity Classes from Combat:FrontalStunImmunityClasses, false by default.")
|
RULE_BOOL(Combat, NPCsUseFrontalStunImmunityClasses, false, "Enable or disable NPCs using frontal stun immunity Classes from Combat:FrontalStunImmunityClasses, false by default.")
|
||||||
RULE_INT(Combat, FrontalStunImmunityRaces, 512, "Bitmask for Races than have frontal stun immunity, Ogre (512) only by default.")
|
RULE_INT(Combat, FrontalStunImmunityRaces, 512, "Bitmask for Races than have frontal stun immunity, Ogre (512) only by default.")
|
||||||
|
|||||||
830
common/spdat.cpp
830
common/spdat.cpp
File diff suppressed because it is too large
Load Diff
1061
common/spdat.h
1061
common/spdat.h
File diff suppressed because it is too large
Load Diff
20
zone/aa.cpp
20
zone/aa.cpp
@ -82,7 +82,7 @@ void Mob::TemporaryPets(uint16 spell_id, Mob *targ, const char *name_override, u
|
|||||||
|
|
||||||
for (int x = 0; x < MAX_SWARM_PETS; x++)
|
for (int x = 0; x < MAX_SWARM_PETS; x++)
|
||||||
{
|
{
|
||||||
if (spells[spell_id].effect_id[x] == SE_TemporaryPets)
|
if (spells[spell_id].effect_id[x] == SpellEffect::TemporaryPets)
|
||||||
{
|
{
|
||||||
pet.count = spells[spell_id].base_value[x];
|
pet.count = spells[spell_id].base_value[x];
|
||||||
pet.duration = spells[spell_id].max_value[x];
|
pet.duration = spells[spell_id].max_value[x];
|
||||||
@ -1376,7 +1376,7 @@ int Mob::GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(auto &effect : rank->effects) {
|
for(auto &effect : rank->effects) {
|
||||||
if(effect.effect_id == SE_HastenedAASkill && effect.limit_value == ability_in->id) {
|
if(effect.effect_id == SpellEffect::HastenedAASkill && effect.limit_value == ability_in->id) {
|
||||||
total_reduction += effect.base_value;
|
total_reduction += effect.base_value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1949,7 +1949,7 @@ void Client::TogglePassiveAlternativeAdvancement(const AA::Rank &rank, uint32 ab
|
|||||||
|
|
||||||
Instructions for how to make the AA - assuming a basic level of knowledge of how AA's work.
|
Instructions for how to make the AA - assuming a basic level of knowledge of how AA's work.
|
||||||
- aa_abilities table : Create new ability with a hotkey, type 3, zero charges
|
- aa_abilities table : Create new ability with a hotkey, type 3, zero charges
|
||||||
- aa_ranks table : [Disabled rank] First rank, should have a cost > 0 (this is what you buy), Set hotkeys, MUST SET A SPELL CONTAINING EFFECT SE_Buy_AA_Rank(SPA 472), set a short recast timer.
|
- aa_ranks table : [Disabled rank] First rank, should have a cost > 0 (this is what you buy), Set hotkeys, MUST SET A SPELL CONTAINING EFFECT SpellEffect::Buy_AA_Rank(SPA 472), set a short recast timer.
|
||||||
[Enabled rank] Second rank, should have a cost = 0, Set hotkeys, Set any valid spell ID you want (it has to exist but does nothing), set a short recast timer.
|
[Enabled rank] Second rank, should have a cost = 0, Set hotkeys, Set any valid spell ID you want (it has to exist but does nothing), set a short recast timer.
|
||||||
*Recommend if doing custom, just make the hotkey titled 'Toggle <Ability Name>' and use for both.
|
*Recommend if doing custom, just make the hotkey titled 'Toggle <Ability Name>' and use for both.
|
||||||
|
|
||||||
@ -1969,7 +1969,7 @@ void Client::TogglePassiveAlternativeAdvancement(const AA::Rank &rank, uint32 ab
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool enable_next_rank = IsEffectInSpell(rank.spell, SE_Buy_AA_Rank);
|
bool enable_next_rank = IsEffectInSpell(rank.spell, SpellEffect::Buy_AA_Rank);
|
||||||
|
|
||||||
if (enable_next_rank) {
|
if (enable_next_rank) {
|
||||||
|
|
||||||
@ -1980,7 +1980,7 @@ void Client::TogglePassiveAlternativeAdvancement(const AA::Rank &rank, uint32 ab
|
|||||||
AA::Rank *rank_next = zone->GetAlternateAdvancementRank(rank.next_id);
|
AA::Rank *rank_next = zone->GetAlternateAdvancementRank(rank.next_id);
|
||||||
|
|
||||||
//Add checks for any special cases for toggle.
|
//Add checks for any special cases for toggle.
|
||||||
if (rank_next && IsEffectinAlternateAdvancementRankEffects(*rank_next, SE_Weapon_Stance)) {
|
if (rank_next && IsEffectinAlternateAdvancementRankEffects(*rank_next, SpellEffect::Weapon_Stance)) {
|
||||||
weaponstance.aabonus_enabled = true;
|
weaponstance.aabonus_enabled = true;
|
||||||
ApplyWeaponsStance();
|
ApplyWeaponsStance();
|
||||||
}
|
}
|
||||||
@ -1994,7 +1994,7 @@ void Client::TogglePassiveAlternativeAdvancement(const AA::Rank &rank, uint32 ab
|
|||||||
Message(Chat::Spells, "You disable an ability."); //Message live gives you. Should come from spell.
|
Message(Chat::Spells, "You disable an ability."); //Message live gives you. Should come from spell.
|
||||||
|
|
||||||
//Add checks for any special cases for toggle.
|
//Add checks for any special cases for toggle.
|
||||||
if (IsEffectinAlternateAdvancementRankEffects(rank, SE_Weapon_Stance)) {
|
if (IsEffectinAlternateAdvancementRankEffects(rank, SpellEffect::Weapon_Stance)) {
|
||||||
weaponstance.aabonus_enabled = false;
|
weaponstance.aabonus_enabled = false;
|
||||||
BuffFadeBySpellID(weaponstance.aabonus_buff_spell_id);
|
BuffFadeBySpellID(weaponstance.aabonus_buff_spell_id);
|
||||||
}
|
}
|
||||||
@ -2005,8 +2005,8 @@ void Client::TogglePassiveAlternativeAdvancement(const AA::Rank &rank, uint32 ab
|
|||||||
bool Client::UseTogglePassiveHotkey(const AA::Rank &rank) {
|
bool Client::UseTogglePassiveHotkey(const AA::Rank &rank) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Disabled rank needs a rank spell containing the SE_Buy_AA_Rank effect to return true.
|
Disabled rank needs a rank spell containing the SpellEffect::Buy_AA_Rank effect to return true.
|
||||||
Enabled rank checks to see if the prior rank contains a rank spell with SE_Buy_AA_Rank, if so true.
|
Enabled rank checks to see if the prior rank contains a rank spell with SpellEffect::Buy_AA_Rank, if so true.
|
||||||
|
|
||||||
Note: On live the enabled rank is Expendable with Charge 1.
|
Note: On live the enabled rank is Expendable with Charge 1.
|
||||||
|
|
||||||
@ -2014,13 +2014,13 @@ bool Client::UseTogglePassiveHotkey(const AA::Rank &rank) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
if (IsEffectInSpell(rank.spell, SE_Buy_AA_Rank)) {//Checked when is Disabled.
|
if (IsEffectInSpell(rank.spell, SpellEffect::Buy_AA_Rank)) {//Checked when is Disabled.
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (rank.prev_id != -1) {//Check when effect is Enabled.
|
else if (rank.prev_id != -1) {//Check when effect is Enabled.
|
||||||
AA::Rank *rank_prev = zone->GetAlternateAdvancementRank(rank.prev_id);
|
AA::Rank *rank_prev = zone->GetAlternateAdvancementRank(rank.prev_id);
|
||||||
|
|
||||||
if (rank_prev && IsEffectInSpell(rank_prev->spell, SE_Buy_AA_Rank)) {
|
if (rank_prev && IsEffectInSpell(rank_prev->spell, SpellEffect::Buy_AA_Rank)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
134
zone/aggro.cpp
134
zone/aggro.cpp
@ -1377,132 +1377,132 @@ int32 Mob::CheckAggroAmount(uint16 spell_id, Mob *target, bool is_proc)
|
|||||||
|
|
||||||
for (int o = 0; o < EFFECT_COUNT; o++) {
|
for (int o = 0; o < EFFECT_COUNT; o++) {
|
||||||
switch (spells[spell_id].effect_id[o]) {
|
switch (spells[spell_id].effect_id[o]) {
|
||||||
case SE_CurrentHPOnce:
|
case SpellEffect::CurrentHPOnce:
|
||||||
case SE_CurrentHP: {
|
case SpellEffect::CurrentHP: {
|
||||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||||
if(val < 0) {
|
if(val < 0) {
|
||||||
aggro_amount -= val;
|
aggro_amount -= val;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_MovementSpeed: {
|
case SpellEffect::MovementSpeed: {
|
||||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||||
if (val < 0) {
|
if (val < 0) {
|
||||||
aggro_amount += default_aggro;
|
aggro_amount += default_aggro;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_AttackSpeed:
|
case SpellEffect::AttackSpeed:
|
||||||
case SE_AttackSpeed2:
|
case SpellEffect::AttackSpeed2:
|
||||||
case SE_AttackSpeed3: {
|
case SpellEffect::AttackSpeed3: {
|
||||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||||
if (val < 100) {
|
if (val < 100) {
|
||||||
aggro_amount += default_aggro;
|
aggro_amount += default_aggro;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_Stun:
|
case SpellEffect::Stun:
|
||||||
case SE_Blind:
|
case SpellEffect::Blind:
|
||||||
case SE_Mez:
|
case SpellEffect::Mez:
|
||||||
case SE_Charm:
|
case SpellEffect::Charm:
|
||||||
case SE_Fear:
|
case SpellEffect::Fear:
|
||||||
case SE_Fearstun:
|
case SpellEffect::Fearstun:
|
||||||
aggro_amount += default_aggro;
|
aggro_amount += default_aggro;
|
||||||
break;
|
break;
|
||||||
case SE_Root:
|
case SpellEffect::Root:
|
||||||
aggro_amount += 10;
|
aggro_amount += 10;
|
||||||
break;
|
break;
|
||||||
case SE_ACv2:
|
case SpellEffect::ACv2:
|
||||||
case SE_ArmorClass: {
|
case SpellEffect::ArmorClass: {
|
||||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||||
if (val < 0) {
|
if (val < 0) {
|
||||||
aggro_amount += default_aggro;
|
aggro_amount += default_aggro;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_ATK:
|
case SpellEffect::ATK:
|
||||||
case SE_ResistMagic:
|
case SpellEffect::ResistMagic:
|
||||||
case SE_ResistFire:
|
case SpellEffect::ResistFire:
|
||||||
case SE_ResistCold:
|
case SpellEffect::ResistCold:
|
||||||
case SE_ResistPoison:
|
case SpellEffect::ResistPoison:
|
||||||
case SE_ResistDisease:
|
case SpellEffect::ResistDisease:
|
||||||
case SE_STR:
|
case SpellEffect::STR:
|
||||||
case SE_STA:
|
case SpellEffect::STA:
|
||||||
case SE_DEX:
|
case SpellEffect::DEX:
|
||||||
case SE_AGI:
|
case SpellEffect::AGI:
|
||||||
case SE_INT:
|
case SpellEffect::INT:
|
||||||
case SE_WIS:
|
case SpellEffect::WIS:
|
||||||
case SE_CHA: {
|
case SpellEffect::CHA: {
|
||||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||||
if (val < 0) {
|
if (val < 0) {
|
||||||
aggro_amount += 10;
|
aggro_amount += 10;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_ResistAll: {
|
case SpellEffect::ResistAll: {
|
||||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||||
if (val < 0) {
|
if (val < 0) {
|
||||||
aggro_amount += 50;
|
aggro_amount += 50;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_AllStats: {
|
case SpellEffect::AllStats: {
|
||||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||||
if (val < 0) {
|
if (val < 0) {
|
||||||
aggro_amount += 70;
|
aggro_amount += 70;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_BardAEDot:
|
case SpellEffect::BardAEDot:
|
||||||
aggro_amount += 10;
|
aggro_amount += 10;
|
||||||
break;
|
break;
|
||||||
case SE_SpinTarget:
|
case SpellEffect::SpinTarget:
|
||||||
case SE_Amnesia:
|
case SpellEffect::Amnesia:
|
||||||
case SE_Silence:
|
case SpellEffect::Silence:
|
||||||
case SE_Destroy:
|
case SpellEffect::Destroy:
|
||||||
aggro_amount += default_aggro;
|
aggro_amount += default_aggro;
|
||||||
break;
|
break;
|
||||||
// unsure -- leave them this for now
|
// unsure -- leave them this for now
|
||||||
case SE_Harmony:
|
case SpellEffect::Harmony:
|
||||||
case SE_CastingLevel:
|
case SpellEffect::CastingLevel:
|
||||||
case SE_MeleeMitigation:
|
case SpellEffect::MeleeMitigation:
|
||||||
case SE_CriticalHitChance:
|
case SpellEffect::CriticalHitChance:
|
||||||
case SE_AvoidMeleeChance:
|
case SpellEffect::AvoidMeleeChance:
|
||||||
case SE_RiposteChance:
|
case SpellEffect::RiposteChance:
|
||||||
case SE_DodgeChance:
|
case SpellEffect::DodgeChance:
|
||||||
case SE_ParryChance:
|
case SpellEffect::ParryChance:
|
||||||
case SE_DualWieldChance:
|
case SpellEffect::DualWieldChance:
|
||||||
case SE_DoubleAttackChance:
|
case SpellEffect::DoubleAttackChance:
|
||||||
case SE_MeleeSkillCheck:
|
case SpellEffect::MeleeSkillCheck:
|
||||||
case SE_HitChance:
|
case SpellEffect::HitChance:
|
||||||
case SE_DamageModifier:
|
case SpellEffect::DamageModifier:
|
||||||
case SE_MinDamageModifier:
|
case SpellEffect::MinDamageModifier:
|
||||||
case SE_IncreaseBlockChance:
|
case SpellEffect::IncreaseBlockChance:
|
||||||
case SE_Accuracy:
|
case SpellEffect::Accuracy:
|
||||||
case SE_DamageShield:
|
case SpellEffect::DamageShield:
|
||||||
case SE_SpellDamageShield:
|
case SpellEffect::SpellDamageShield:
|
||||||
case SE_ReverseDS: {
|
case SpellEffect::ReverseDS: {
|
||||||
aggro_amount += mob_level * 2;
|
aggro_amount += mob_level * 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// unsure -- leave them this for now
|
// unsure -- leave them this for now
|
||||||
case SE_CurrentMana:
|
case SpellEffect::CurrentMana:
|
||||||
case SE_ManaRegen_v2:
|
case SpellEffect::ManaRegen_v2:
|
||||||
case SE_ManaPool:
|
case SpellEffect::ManaPool:
|
||||||
case SE_CurrentEndurance: {
|
case SpellEffect::CurrentEndurance: {
|
||||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||||
if (val < 0) {
|
if (val < 0) {
|
||||||
aggro_amount -= val * 2;
|
aggro_amount -= val * 2;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_CancelMagic:
|
case SpellEffect::CancelMagic:
|
||||||
case SE_DispelDetrimental:
|
case SpellEffect::DispelDetrimental:
|
||||||
case SE_DispelBeneficial:
|
case SpellEffect::DispelBeneficial:
|
||||||
dispel = true;
|
dispel = true;
|
||||||
break;
|
break;
|
||||||
case SE_ReduceHate:
|
case SpellEffect::ReduceHate:
|
||||||
case SE_InstantHate:
|
case SpellEffect::InstantHate:
|
||||||
non_modified_aggro = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
non_modified_aggro = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1549,8 +1549,8 @@ int32 Mob::CheckHealAggroAmount(uint16 spell_id, Mob *target, uint32 heal_possib
|
|||||||
|
|
||||||
for (int o = 0; o < EFFECT_COUNT; o++) {
|
for (int o = 0; o < EFFECT_COUNT; o++) {
|
||||||
switch (spells[spell_id].effect_id[o]) {
|
switch (spells[spell_id].effect_id[o]) {
|
||||||
case SE_CurrentHP:
|
case SpellEffect::CurrentHP:
|
||||||
case SE_PercentalHeal:
|
case SpellEffect::PercentalHeal:
|
||||||
{
|
{
|
||||||
if (heal_possible == 0) {
|
if (heal_possible == 0) {
|
||||||
AggroAmount += 1;
|
AggroAmount += 1;
|
||||||
@ -1572,12 +1572,12 @@ int32 Mob::CheckHealAggroAmount(uint16 spell_id, Mob *target, uint32 heal_possib
|
|||||||
AggroAmount += std::max(val, (int64)1);
|
AggroAmount += std::max(val, (int64)1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_Rune:
|
case SpellEffect::Rune:
|
||||||
AggroAmount += CalcSpellEffectValue_formula(spells[spell_id].formula[o],
|
AggroAmount += CalcSpellEffectValue_formula(spells[spell_id].formula[o],
|
||||||
spells[spell_id].base_value[o], spells[spell_id].max_value[o], GetLevel(), spell_id) * 2;
|
spells[spell_id].base_value[o], spells[spell_id].max_value[o], GetLevel(), spell_id) * 2;
|
||||||
ignore_default_buff = true;
|
ignore_default_buff = true;
|
||||||
break;
|
break;
|
||||||
case SE_HealOverTime:
|
case SpellEffect::HealOverTime:
|
||||||
AggroAmount += 10;
|
AggroAmount += 10;
|
||||||
ignore_default_buff = true;
|
ignore_default_buff = true;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -179,7 +179,7 @@ int Mob::compute_tohit(EQ::skills::SkillType skillinuse)
|
|||||||
//SYNC WITH: tune.cpp, mob.h TuneGetTotalToHit
|
//SYNC WITH: tune.cpp, mob.h TuneGetTotalToHit
|
||||||
int Mob::GetTotalToHit(EQ::skills::SkillType skill, int chance_mod)
|
int Mob::GetTotalToHit(EQ::skills::SkillType skill, int chance_mod)
|
||||||
{
|
{
|
||||||
if (chance_mod >= 10000) // override for stuff like SE_SkillAttack
|
if (chance_mod >= 10000) // override for stuff like SpellEffect::SkillAttack
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
// calculate attacker's accuracy
|
// calculate attacker's accuracy
|
||||||
@ -209,7 +209,7 @@ int Mob::GetTotalToHit(EQ::skills::SkillType skill, int chance_mod)
|
|||||||
if (atkhit_bonus)
|
if (atkhit_bonus)
|
||||||
accuracy += round(static_cast<double>(accuracy) * static_cast<double>(atkhit_bonus) * 0.0001);
|
accuracy += round(static_cast<double>(accuracy) * static_cast<double>(atkhit_bonus) * 0.0001);
|
||||||
|
|
||||||
// 216 Melee Accuracy Amt aka SE_Accuracy -- flat bonus
|
// 216 Melee Accuracy Amt aka SpellEffect::Accuracy -- flat bonus
|
||||||
accuracy += itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
accuracy += itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
||||||
aabonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
aabonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
||||||
spellbonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
spellbonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
||||||
@ -224,7 +224,7 @@ int Mob::GetTotalToHit(EQ::skills::SkillType skill, int chance_mod)
|
|||||||
if (spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] >= 10000)
|
if (spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] >= 10000)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
// 184 Accuracy % aka SE_HitChance -- percentage increase
|
// 184 Accuracy % aka SpellEffect::HitChance -- percentage increase
|
||||||
auto hit_bonus = itembonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
auto hit_bonus = itembonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
||||||
aabonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
aabonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
||||||
spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
||||||
@ -285,7 +285,7 @@ int Mob::compute_defense()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//516 SE_AC_Mitigation_Max_Percent
|
//516 SpellEffect::AC_Mitigation_Max_Percent
|
||||||
auto ac_bonus = itembonuses.AC_Mitigation_Max_Percent + aabonuses.AC_Mitigation_Max_Percent + spellbonuses.AC_Mitigation_Max_Percent;
|
auto ac_bonus = itembonuses.AC_Mitigation_Max_Percent + aabonuses.AC_Mitigation_Max_Percent + spellbonuses.AC_Mitigation_Max_Percent;
|
||||||
if (ac_bonus) {
|
if (ac_bonus) {
|
||||||
defense += round(static_cast<double>(defense) * static_cast<double>(ac_bonus) * 0.0001);
|
defense += round(static_cast<double>(defense) * static_cast<double>(ac_bonus) * 0.0001);
|
||||||
@ -315,15 +315,15 @@ int Mob::GetTotalDefense()
|
|||||||
if (evasion_bonus >= 10000)
|
if (evasion_bonus >= 10000)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
// 515 SE_AC_Avoidance_Max_Percent
|
// 515 SpellEffect::AC_Avoidance_Max_Percent
|
||||||
auto ac_aviodance_bonus = itembonuses.AC_Avoidance_Max_Percent + aabonuses.AC_Avoidance_Max_Percent + spellbonuses.AC_Avoidance_Max_Percent;
|
auto ac_aviodance_bonus = itembonuses.AC_Avoidance_Max_Percent + aabonuses.AC_Avoidance_Max_Percent + spellbonuses.AC_Avoidance_Max_Percent;
|
||||||
if (ac_aviodance_bonus)
|
if (ac_aviodance_bonus)
|
||||||
avoidance += round(static_cast<double>(avoidance) * static_cast<double>(ac_aviodance_bonus) * 0.0001);
|
avoidance += round(static_cast<double>(avoidance) * static_cast<double>(ac_aviodance_bonus) * 0.0001);
|
||||||
|
|
||||||
// 172 Evasion aka SE_AvoidMeleeChance
|
// 172 Evasion aka SpellEffect::AvoidMeleeChance
|
||||||
evasion_bonus += itembonuses.AvoidMeleeChanceEffect + aabonuses.AvoidMeleeChanceEffect; // item bonus here isn't mod2 avoidance
|
evasion_bonus += itembonuses.AvoidMeleeChanceEffect + aabonuses.AvoidMeleeChanceEffect; // item bonus here isn't mod2 avoidance
|
||||||
|
|
||||||
// 215 Pet Avoidance % aka SE_PetAvoidance
|
// 215 Pet Avoidance % aka SpellEffect::PetAvoidance
|
||||||
evasion_bonus += GetPetAvoidanceBonusFromOwner();
|
evasion_bonus += GetPetAvoidanceBonusFromOwner();
|
||||||
|
|
||||||
// Evasion is a percentage bonus according to AA descriptions
|
// Evasion is a percentage bonus according to AA descriptions
|
||||||
@ -1917,7 +1917,7 @@ bool Client::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::Skil
|
|||||||
dead = true;
|
dead = true;
|
||||||
|
|
||||||
if (m_pet && m_pet->IsCharmed()) {
|
if (m_pet && m_pet->IsCharmed()) {
|
||||||
m_pet->BuffFadeByEffect(SE_Charm);
|
m_pet->BuffFadeByEffect(SpellEffect::Charm);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetMerc()) {
|
if (GetMerc()) {
|
||||||
@ -3678,7 +3678,7 @@ int64 Mob::ReduceDamage(int64 damage)
|
|||||||
return DMG_RUNE;
|
return DMG_RUNE;
|
||||||
|
|
||||||
if (spellbonuses.MeleeRune[SBIndex::RUNE_AMOUNT] && spellbonuses.MeleeRune[SBIndex::RUNE_BUFFSLOT] >= 0)
|
if (spellbonuses.MeleeRune[SBIndex::RUNE_AMOUNT] && spellbonuses.MeleeRune[SBIndex::RUNE_BUFFSLOT] >= 0)
|
||||||
damage = RuneAbsorb(damage, SE_Rune);
|
damage = RuneAbsorb(damage, SpellEffect::Rune);
|
||||||
|
|
||||||
if (damage < 1)
|
if (damage < 1)
|
||||||
return DMG_RUNE;
|
return DMG_RUNE;
|
||||||
@ -3805,10 +3805,10 @@ int64 Mob::AffectMagicalDamage(int64 damage, uint16 spell_id, const bool iBuffTi
|
|||||||
|
|
||||||
//Regular runes absorb spell damage (except dots) - Confirmed on live.
|
//Regular runes absorb spell damage (except dots) - Confirmed on live.
|
||||||
if (spellbonuses.MeleeRune[SBIndex::RUNE_AMOUNT] && spellbonuses.MeleeRune[SBIndex::RUNE_BUFFSLOT] >= 0)
|
if (spellbonuses.MeleeRune[SBIndex::RUNE_AMOUNT] && spellbonuses.MeleeRune[SBIndex::RUNE_BUFFSLOT] >= 0)
|
||||||
damage = RuneAbsorb(damage, SE_Rune);
|
damage = RuneAbsorb(damage, SpellEffect::Rune);
|
||||||
|
|
||||||
if (spellbonuses.AbsorbMagicAtt[SBIndex::RUNE_AMOUNT] && spellbonuses.AbsorbMagicAtt[SBIndex::RUNE_BUFFSLOT] >= 0)
|
if (spellbonuses.AbsorbMagicAtt[SBIndex::RUNE_AMOUNT] && spellbonuses.AbsorbMagicAtt[SBIndex::RUNE_BUFFSLOT] >= 0)
|
||||||
damage = RuneAbsorb(damage, SE_AbsorbMagicAtt);
|
damage = RuneAbsorb(damage, SpellEffect::AbsorbMagicAtt);
|
||||||
|
|
||||||
if (damage < 1)
|
if (damage < 1)
|
||||||
return 0;
|
return 0;
|
||||||
@ -4174,7 +4174,7 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
|
|||||||
damage = ReduceDamage(damage);
|
damage = ReduceDamage(damage);
|
||||||
LogCombat("Melee Damage reduced to [{}]", damage);
|
LogCombat("Melee Damage reduced to [{}]", damage);
|
||||||
damage = ReduceAllDamage(damage);
|
damage = ReduceAllDamage(damage);
|
||||||
TryTriggerThreshHold(damage, SE_TriggerMeleeThreshold, attacker);
|
TryTriggerThreshHold(damage, SpellEffect::TriggerMeleeThreshold, attacker);
|
||||||
|
|
||||||
CheckNumHitsRemaining(NumHit::IncomingHitSuccess);
|
CheckNumHitsRemaining(NumHit::IncomingHitSuccess);
|
||||||
}
|
}
|
||||||
@ -4199,7 +4199,7 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
|
|||||||
Message(263, "%s tries to cast on YOU, but YOUR magical skin absorbs the spell.", attacker->GetCleanName());
|
Message(263, "%s tries to cast on YOU, but YOUR magical skin absorbs the spell.", attacker->GetCleanName());
|
||||||
}
|
}
|
||||||
damage = ReduceAllDamage(damage);
|
damage = ReduceAllDamage(damage);
|
||||||
TryTriggerThreshHold(damage, SE_TriggerSpellThreshold, attacker);
|
TryTriggerThreshHold(damage, SpellEffect::TriggerSpellThreshold, attacker);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsClient() && CastToClient()->sneaking) {
|
if (IsClient() && CastToClient()->sneaking) {
|
||||||
@ -4314,7 +4314,7 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
|
|||||||
GetCleanName(), /* Message1 */
|
GetCleanName(), /* Message1 */
|
||||||
attacker->GetCleanName() /* Message2 */
|
attacker->GetCleanName() /* Message2 */
|
||||||
);
|
);
|
||||||
BuffFadeByEffect(SE_Mez);
|
BuffFadeByEffect(SpellEffect::Mez);
|
||||||
}
|
}
|
||||||
|
|
||||||
// broken up for readability
|
// broken up for readability
|
||||||
@ -4399,12 +4399,12 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
|
|||||||
int bashsave_roll = zone->random.Int(0, 100);
|
int bashsave_roll = zone->random.Int(0, 100);
|
||||||
if (bashsave_roll > 98 || bashsave_roll > (55 - stunbash_chance)) {
|
if (bashsave_roll > 98 || bashsave_roll > (55 - stunbash_chance)) {
|
||||||
// did stun -- roll other resists
|
// did stun -- roll other resists
|
||||||
// SE_FrontalStunResist description says any angle now a days
|
// SpellEffect::FrontalStunResist description says any angle now a days
|
||||||
int stun_resist2 = spellbonuses.FrontalStunResist + itembonuses.FrontalStunResist +
|
int stun_resist2 = spellbonuses.FrontalStunResist + itembonuses.FrontalStunResist +
|
||||||
aabonuses.FrontalStunResist;
|
aabonuses.FrontalStunResist;
|
||||||
if (zone->random.Int(1, 100) > stun_resist2) {
|
if (zone->random.Int(1, 100) > stun_resist2) {
|
||||||
// stun resist 2 failed
|
// stun resist 2 failed
|
||||||
// time to check SE_StunResist and mod2 stun resist
|
// time to check SpellEffect::StunResist and mod2 stun resist
|
||||||
int stun_resist =
|
int stun_resist =
|
||||||
spellbonuses.StunResist + itembonuses.StunResist + aabonuses.StunResist;
|
spellbonuses.StunResist + itembonuses.StunResist + aabonuses.StunResist;
|
||||||
if (zone->random.Int(0, 100) >= stun_resist) {
|
if (zone->random.Int(0, 100) >= stun_resist) {
|
||||||
@ -5668,7 +5668,7 @@ void Mob::DoRiposte(Mob *defender)
|
|||||||
defender->itembonuses.DoubleRiposte;
|
defender->itembonuses.DoubleRiposte;
|
||||||
|
|
||||||
if (DoubleRipChance && zone->random.Roll(DoubleRipChance)) {
|
if (DoubleRipChance && zone->random.Roll(DoubleRipChance)) {
|
||||||
LogCombat("Preforming a double riposted from SE_DoubleRiposte ([{}] percent chance)", DoubleRipChance);
|
LogCombat("Preforming a double riposted from SpellEffect::DoubleRiposte ([{}] percent chance)", DoubleRipChance);
|
||||||
defender->Attack(this, EQ::invslot::slotPrimary, true);
|
defender->Attack(this, EQ::invslot::slotPrimary, true);
|
||||||
if (HasDied())
|
if (HasDied())
|
||||||
return;
|
return;
|
||||||
@ -5679,7 +5679,7 @@ void Mob::DoRiposte(Mob *defender)
|
|||||||
|
|
||||||
// Live AA - Double Riposte
|
// Live AA - Double Riposte
|
||||||
if (DoubleRipChance && zone->random.Roll(DoubleRipChance)) {
|
if (DoubleRipChance && zone->random.Roll(DoubleRipChance)) {
|
||||||
LogCombat("Preforming a double riposted from SE_GiveDoubleRiposte base1 == 0 ([{}] percent chance)", DoubleRipChance);
|
LogCombat("Preforming a double riposted from SpellEffect::GiveDoubleRiposte base1 == 0 ([{}] percent chance)", DoubleRipChance);
|
||||||
defender->Attack(this, EQ::invslot::slotPrimary, true);
|
defender->Attack(this, EQ::invslot::slotPrimary, true);
|
||||||
if (HasDied())
|
if (HasDied())
|
||||||
return;
|
return;
|
||||||
@ -6027,12 +6027,12 @@ void Mob::TrySkillProc(Mob *on, EQ::skills::SkillType skill, uint16 ReuseTime, b
|
|||||||
|
|
||||||
for (int i = 0; i < EFFECT_COUNT; i++) {
|
for (int i = 0; i < EFFECT_COUNT; i++) {
|
||||||
|
|
||||||
if (spells[base_spell_id].effect_id[i] == SE_SkillProcAttempt || spells[base_spell_id].effect_id[i] == SE_SkillProcSuccess) {
|
if (spells[base_spell_id].effect_id[i] == SpellEffect::SkillProcAttempt || spells[base_spell_id].effect_id[i] == SpellEffect::SkillProcSuccess) {
|
||||||
proc_spell_id = spells[base_spell_id].base_value[i];
|
proc_spell_id = spells[base_spell_id].base_value[i];
|
||||||
ProcMod = static_cast<float>(spells[base_spell_id].limit_value[i]);
|
ProcMod = static_cast<float>(spells[base_spell_id].limit_value[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (spells[base_spell_id].effect_id[i] == SE_LimitToSkill && spells[base_spell_id].base_value[i] <= EQ::skills::HIGHEST_SKILL) {
|
else if (spells[base_spell_id].effect_id[i] == SpellEffect::LimitToSkill && spells[base_spell_id].base_value[i] <= EQ::skills::HIGHEST_SKILL) {
|
||||||
if (CanProc && spells[base_spell_id].base_value[i] == skill && IsValidSpell(proc_spell_id)) {
|
if (CanProc && spells[base_spell_id].base_value[i] == skill && IsValidSpell(proc_spell_id)) {
|
||||||
float final_chance = chance * (ProcMod / 100.0f);
|
float final_chance = chance * (ProcMod / 100.0f);
|
||||||
if (zone->random.Roll(final_chance)) {
|
if (zone->random.Roll(final_chance)) {
|
||||||
@ -6071,12 +6071,12 @@ void Mob::TrySkillProc(Mob *on, EQ::skills::SkillType skill, uint16 ReuseTime, b
|
|||||||
ProcMod = 0;
|
ProcMod = 0;
|
||||||
|
|
||||||
for (int i = 0; i < EFFECT_COUNT; i++) {
|
for (int i = 0; i < EFFECT_COUNT; i++) {
|
||||||
if (spells[base_spell_id].effect_id[i] == SE_SkillProcAttempt || spells[base_spell_id].effect_id[i] == SE_SkillProcSuccess) {
|
if (spells[base_spell_id].effect_id[i] == SpellEffect::SkillProcAttempt || spells[base_spell_id].effect_id[i] == SpellEffect::SkillProcSuccess) {
|
||||||
proc_spell_id = spells[base_spell_id].base_value[i];
|
proc_spell_id = spells[base_spell_id].base_value[i];
|
||||||
ProcMod = static_cast<float>(spells[base_spell_id].limit_value[i]);
|
ProcMod = static_cast<float>(spells[base_spell_id].limit_value[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (spells[base_spell_id].effect_id[i] == SE_LimitToSkill && spells[base_spell_id].base_value[i] <= EQ::skills::HIGHEST_SKILL) {
|
else if (spells[base_spell_id].effect_id[i] == SpellEffect::LimitToSkill && spells[base_spell_id].base_value[i] <= EQ::skills::HIGHEST_SKILL) {
|
||||||
|
|
||||||
if (CanProc && spells[base_spell_id].base_value[i] == skill && IsValidSpell(proc_spell_id)) {
|
if (CanProc && spells[base_spell_id].base_value[i] == skill && IsValidSpell(proc_spell_id)) {
|
||||||
float final_chance = chance * (ProcMod / 100.0f);
|
float final_chance = chance * (ProcMod / 100.0f);
|
||||||
@ -6133,11 +6133,11 @@ void Mob::TrySkillProc(Mob *on, EQ::skills::SkillType skill, uint16 ReuseTime, b
|
|||||||
limit_value = effect.limit_value;
|
limit_value = effect.limit_value;
|
||||||
slot = effect.slot;
|
slot = effect.slot;
|
||||||
|
|
||||||
if (effect_id == SE_SkillProcAttempt || effect_id == SE_SkillProcSuccess) {
|
if (effect_id == SpellEffect::SkillProcAttempt || effect_id == SpellEffect::SkillProcSuccess) {
|
||||||
proc_spell_id = base_value;
|
proc_spell_id = base_value;
|
||||||
ProcMod = static_cast<float>(limit_value);
|
ProcMod = static_cast<float>(limit_value);
|
||||||
}
|
}
|
||||||
else if (effect_id == SE_LimitToSkill && base_value <= EQ::skills::HIGHEST_SKILL) {
|
else if (effect_id == SpellEffect::LimitToSkill && base_value <= EQ::skills::HIGHEST_SKILL) {
|
||||||
|
|
||||||
if (CanProc && base_value == skill && IsValidSpell(proc_spell_id)) {
|
if (CanProc && base_value == skill && IsValidSpell(proc_spell_id)) {
|
||||||
float final_chance = chance * (ProcMod / 100.0f);
|
float final_chance = chance * (ProcMod / 100.0f);
|
||||||
@ -6300,7 +6300,7 @@ bool Mob::TryRootFadeByDamage(int buffslot, Mob* attacker) {
|
|||||||
int32 Mob::RuneAbsorb(int64 damage, uint16 type)
|
int32 Mob::RuneAbsorb(int64 damage, uint16 type)
|
||||||
{
|
{
|
||||||
uint32 buff_max = GetMaxTotalSlots();
|
uint32 buff_max = GetMaxTotalSlots();
|
||||||
if (type == SE_Rune) {
|
if (type == SpellEffect::Rune) {
|
||||||
for (uint32 slot = 0; slot < buff_max; slot++) {
|
for (uint32 slot = 0; slot < buff_max; slot++) {
|
||||||
if (slot == spellbonuses.MeleeRune[SBIndex::RUNE_BUFFSLOT] && spellbonuses.MeleeRune[SBIndex::RUNE_AMOUNT] && buffs[slot].melee_rune && IsValidSpell(buffs[slot].spellid)) {
|
if (slot == spellbonuses.MeleeRune[SBIndex::RUNE_BUFFSLOT] && spellbonuses.MeleeRune[SBIndex::RUNE_AMOUNT] && buffs[slot].melee_rune && IsValidSpell(buffs[slot].spellid)) {
|
||||||
int melee_rune_left = buffs[slot].melee_rune;
|
int melee_rune_left = buffs[slot].melee_rune;
|
||||||
@ -6544,7 +6544,7 @@ void Mob::DoShieldDamageOnShielderSpellEffect(Mob* shield_target, int64 hit_dama
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
SPA 463 SE_SHIELD_TARGET
|
SPA 463 SpellEffect::SHIELD_TARGET
|
||||||
|
|
||||||
Live description: "Shields your target, taking a percentage of their damage".
|
Live description: "Shields your target, taking a percentage of their damage".
|
||||||
Only example spell on live is an NPC who uses it during a raid event "Laurion's Song" expansion. SPA 54492 'Guardian Stance' Described as 100% Melee Shielding
|
Only example spell on live is an NPC who uses it during a raid event "Laurion's Song" expansion. SPA 54492 'Guardian Stance' Described as 100% Melee Shielding
|
||||||
@ -6596,7 +6596,7 @@ void Mob::CommonBreakInvisibleFromCombat()
|
|||||||
CancelSneakHide();
|
CancelSneakHide();
|
||||||
|
|
||||||
if (spellbonuses.NegateIfCombat) {
|
if (spellbonuses.NegateIfCombat) {
|
||||||
BuffFadeByEffect(SE_NegateIfCombat);
|
BuffFadeByEffect(SpellEffect::NegateIfCombat);
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden = false;
|
hidden = false;
|
||||||
|
|||||||
1430
zone/bonuses.cpp
1430
zone/bonuses.cpp
File diff suppressed because it is too large
Load Diff
180
zone/bot.cpp
180
zone/bot.cpp
@ -296,8 +296,8 @@ Bot::Bot(
|
|||||||
|
|
||||||
for (int x1 = 0; x1 < EFFECT_COUNT; x1++) {
|
for (int x1 = 0; x1 < EFFECT_COUNT; x1++) {
|
||||||
switch (spell.effect_id[x1]) {
|
switch (spell.effect_id[x1]) {
|
||||||
case SE_IllusionCopy:
|
case SpellEffect::IllusionCopy:
|
||||||
case SE_Illusion: {
|
case SpellEffect::Illusion: {
|
||||||
if (GetIllusionBlock()) {
|
if (GetIllusionBlock()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -375,63 +375,63 @@ Bot::Bot(
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_Silence:
|
case SpellEffect::Silence:
|
||||||
{
|
{
|
||||||
Silence(true);
|
Silence(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_Amnesia:
|
case SpellEffect::Amnesia:
|
||||||
{
|
{
|
||||||
Amnesia(true);
|
Amnesia(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_DivineAura:
|
case SpellEffect::DivineAura:
|
||||||
{
|
{
|
||||||
invulnerable = true;
|
invulnerable = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_Invisibility2:
|
case SpellEffect::Invisibility2:
|
||||||
case SE_Invisibility:
|
case SpellEffect::Invisibility:
|
||||||
{
|
{
|
||||||
invisible = true;
|
invisible = true;
|
||||||
SendAppearancePacket(AppearanceType::Invisibility, 1);
|
SendAppearancePacket(AppearanceType::Invisibility, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_Levitate:
|
case SpellEffect::Levitate:
|
||||||
{
|
{
|
||||||
if (!zone->CanLevitate())
|
if (!zone->CanLevitate())
|
||||||
{
|
{
|
||||||
SendAppearancePacket(AppearanceType::FlyMode, 0);
|
SendAppearancePacket(AppearanceType::FlyMode, 0);
|
||||||
BuffFadeByEffect(SE_Levitate);
|
BuffFadeByEffect(SpellEffect::Levitate);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SendAppearancePacket(AppearanceType::FlyMode, 2);
|
SendAppearancePacket(AppearanceType::FlyMode, 2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_InvisVsUndead2:
|
case SpellEffect::InvisVsUndead2:
|
||||||
case SE_InvisVsUndead:
|
case SpellEffect::InvisVsUndead:
|
||||||
{
|
{
|
||||||
invisible_undead = true;
|
invisible_undead = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_InvisVsAnimals:
|
case SpellEffect::InvisVsAnimals:
|
||||||
{
|
{
|
||||||
invisible_animals = true;
|
invisible_animals = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_AddMeleeProc:
|
case SpellEffect::AddMeleeProc:
|
||||||
case SE_WeaponProc:
|
case SpellEffect::WeaponProc:
|
||||||
{
|
{
|
||||||
AddProcToWeapon(GetProcID(buffs[j1].spellid, x1), false, 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, buffs[j1].casterlevel);
|
AddProcToWeapon(GetProcID(buffs[j1].spellid, x1), false, 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, buffs[j1].casterlevel);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_DefensiveProc:
|
case SpellEffect::DefensiveProc:
|
||||||
{
|
{
|
||||||
AddDefensiveProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid);
|
AddDefensiveProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_RangedProc:
|
case SpellEffect::RangedProc:
|
||||||
{
|
{
|
||||||
AddRangedProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid);
|
AddRangedProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid);
|
||||||
break;
|
break;
|
||||||
@ -1527,7 +1527,7 @@ bool Bot::LoadPet()
|
|||||||
auto my_buffs = GetBuffs();
|
auto my_buffs = GetBuffs();
|
||||||
if (buffs_max && my_buffs) {
|
if (buffs_max && my_buffs) {
|
||||||
for (int index = 0; index < buffs_max; ++index) {
|
for (int index = 0; index < buffs_max; ++index) {
|
||||||
if (IsEffectInSpell(my_buffs[index].spellid, SE_Familiar)) {
|
if (IsEffectInSpell(my_buffs[index].spellid, SpellEffect::Familiar)) {
|
||||||
MakePet(my_buffs[index].spellid, spells[my_buffs[index].spellid].teleport_zone);
|
MakePet(my_buffs[index].spellid, spells[my_buffs[index].spellid].teleport_zone);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -3578,7 +3578,7 @@ void Bot::Depop() {
|
|||||||
|
|
||||||
if (bot_pet) {
|
if (bot_pet) {
|
||||||
if (bot_pet->Charmed()) {
|
if (bot_pet->Charmed()) {
|
||||||
bot_pet->BuffFadeByEffect(SE_Charm);
|
bot_pet->BuffFadeByEffect(SpellEffect::Charm);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bot_pet->Depop();
|
bot_pet->Depop();
|
||||||
@ -5974,7 +5974,7 @@ bool Bot::SpellOnTarget(
|
|||||||
|
|
||||||
if (spelltar->IsPet()) {
|
if (spelltar->IsPet()) {
|
||||||
for (int i = 0; i < EFFECT_COUNT; ++i) {
|
for (int i = 0; i < EFFECT_COUNT; ++i) {
|
||||||
if (spells[spell_id].effect_id[i] == SE_Illusion) {
|
if (spells[spell_id].effect_id[i] == SpellEffect::Illusion) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6214,7 +6214,7 @@ bool Bot::DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, EQ::spe
|
|||||||
|
|
||||||
if (!noGroupSpell) {
|
if (!noGroupSpell) {
|
||||||
for (Mob* m : GetBuffTargets(spellTarget)) {
|
for (Mob* m : GetBuffTargets(spellTarget)) {
|
||||||
if (IsEffectInSpell(thespell, SE_AbsorbMagicAtt) || IsEffectInSpell(thespell, SE_Rune)) {
|
if (IsEffectInSpell(thespell, SpellEffect::AbsorbMagicAtt) || IsEffectInSpell(thespell, SpellEffect::Rune)) {
|
||||||
for (int i = 0; i < m->GetMaxTotalSlots(); i++) {
|
for (int i = 0; i < m->GetMaxTotalSlots(); i++) {
|
||||||
uint32 buff_count = m->GetMaxTotalSlots();
|
uint32 buff_count = m->GetMaxTotalSlots();
|
||||||
|
|
||||||
@ -7831,7 +7831,7 @@ bool Bot::GetNeedsCured(Mob *tar) {
|
|||||||
bool need_cured = false;
|
bool need_cured = false;
|
||||||
|
|
||||||
if (tar) {
|
if (tar) {
|
||||||
if (tar->FindType(SE_PoisonCounter) || tar->FindType(SE_DiseaseCounter) || tar->FindType(SE_CurseCounter) || tar->FindType(SE_CorruptionCounter)) {
|
if (tar->FindType(SpellEffect::PoisonCounter) || tar->FindType(SpellEffect::DiseaseCounter) || tar->FindType(SpellEffect::CurseCounter) || tar->FindType(SpellEffect::CorruptionCounter)) {
|
||||||
uint32 buff_count = tar->GetMaxTotalSlots();
|
uint32 buff_count = tar->GetMaxTotalSlots();
|
||||||
|
|
||||||
for (unsigned int j = 0; j < buff_count; j++) {
|
for (unsigned int j = 0; j < buff_count; j++) {
|
||||||
@ -8616,7 +8616,7 @@ void Bot::Escape()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Bot::Fling(float value, float target_x, float target_y, float target_z, bool ignore_los, bool clip_through_walls, bool calculate_speed) {
|
void Bot::Fling(float value, float target_x, float target_y, float target_z, bool ignore_los, bool clip_through_walls, bool calculate_speed) {
|
||||||
BuffFadeByEffect(SE_Levitate);
|
BuffFadeByEffect(SpellEffect::Levitate);
|
||||||
if (CheckLosFN(target_x, target_y, target_z, 6.0f) || ignore_los) {
|
if (CheckLosFN(target_x, target_y, target_z, 6.0f) || ignore_los) {
|
||||||
auto p = new EQApplicationPacket(OP_Fling, sizeof(fling_struct));
|
auto p = new EQApplicationPacket(OP_Fling, sizeof(fling_struct));
|
||||||
auto* f = (fling_struct*) p->pBuffer;
|
auto* f = (fling_struct*) p->pBuffer;
|
||||||
@ -9553,9 +9553,9 @@ bool Bot::CastChecks(uint16 spell_id, Mob* tar, uint16 spell_type, bool precheck
|
|||||||
|
|
||||||
if (spells[spell_id].target_type == ST_Self && tar != this) {
|
if (spells[spell_id].target_type == ST_Self && tar != this) {
|
||||||
if (
|
if (
|
||||||
!IsEffectInSpell(spell_id, SE_SummonCorpse) ||
|
!IsEffectInSpell(spell_id, SpellEffect::SummonCorpse) ||
|
||||||
(
|
(
|
||||||
IsEffectInSpell(spell_id, SE_SummonCorpse) &&
|
IsEffectInSpell(spell_id, SpellEffect::SummonCorpse) &&
|
||||||
!RuleB(Bots, AllowCommandedSummonCorpse)
|
!RuleB(Bots, AllowCommandedSummonCorpse)
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
@ -9667,7 +9667,7 @@ bool Bot::CastChecks(uint16 spell_id, Mob* tar, uint16 spell_type, bool precheck
|
|||||||
|
|
||||||
if (
|
if (
|
||||||
!zone->CanLevitate() &&
|
!zone->CanLevitate() &&
|
||||||
IsEffectInSpell(spell_id, SE_Levitate)
|
IsEffectInSpell(spell_id, SpellEffect::Levitate)
|
||||||
) {
|
) {
|
||||||
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} due to !CanLevitate.'", GetCleanName(), GetSpellName(spell_id));
|
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} due to !CanLevitate.'", GetCleanName(), GetSpellName(spell_id));
|
||||||
return false;
|
return false;
|
||||||
@ -9907,8 +9907,8 @@ bool Bot::CanCastSpellType(uint16 spell_type, uint16 spell_id, Mob* tar) {
|
|||||||
spell_type != BotSpellTypes::Succor
|
spell_type != BotSpellTypes::Succor
|
||||||
) &&
|
) &&
|
||||||
(
|
(
|
||||||
IsEffectInSpell(spell_id, SE_Teleport) ||
|
IsEffectInSpell(spell_id, SpellEffect::Teleport) ||
|
||||||
IsEffectInSpell(spell_id, SE_Succor)
|
IsEffectInSpell(spell_id, SpellEffect::Succor)
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} on {} due to Teleport.'", GetCleanName(), GetSpellName(spell_id), tar->GetCleanName());
|
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} on {} due to Teleport.'", GetCleanName(), GetSpellName(spell_id), tar->GetCleanName());
|
||||||
@ -9918,7 +9918,7 @@ bool Bot::CanCastSpellType(uint16 spell_type, uint16 spell_id, Mob* tar) {
|
|||||||
if (
|
if (
|
||||||
tar->IsPet() &&
|
tar->IsPet() &&
|
||||||
!RuleB(Bots, CanCastIllusionsOnPets) &&
|
!RuleB(Bots, CanCastIllusionsOnPets) &&
|
||||||
IsEffectInSpell(spell_id, SE_Illusion)
|
IsEffectInSpell(spell_id, SpellEffect::Illusion)
|
||||||
) {
|
) {
|
||||||
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} on {} due to PetSE_Illusion.'", GetCleanName(), GetSpellName(spell_id), tar->GetCleanName());
|
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} on {} due to PetSE_Illusion.'", GetCleanName(), GetSpellName(spell_id), tar->GetCleanName());
|
||||||
return false;
|
return false;
|
||||||
@ -9962,13 +9962,13 @@ bool Bot::CanCastSpellType(uint16 spell_type, uint16 spell_id, Mob* tar) {
|
|||||||
tar->IsBot() &&
|
tar->IsBot() &&
|
||||||
(tar->GetLevel() >= tar->CastToBot()->GetStopMeleeLevel()) &&
|
(tar->GetLevel() >= tar->CastToBot()->GetStopMeleeLevel()) &&
|
||||||
(
|
(
|
||||||
IsEffectInSpell(spell_id, SE_AttackSpeed) ||
|
IsEffectInSpell(spell_id, SpellEffect::AttackSpeed) ||
|
||||||
IsEffectInSpell(spell_id, SE_ReverseDS)
|
IsEffectInSpell(spell_id, SpellEffect::ReverseDS)
|
||||||
) ||
|
) ||
|
||||||
(
|
(
|
||||||
SpellEffectsCount(spell_id) == 1 &&
|
SpellEffectsCount(spell_id) == 1 &&
|
||||||
(
|
(
|
||||||
IsEffectInSpell(spell_id, SE_ATK) || IsEffectInSpell(spell_id, SE_STR)
|
IsEffectInSpell(spell_id, SpellEffect::ATK) || IsEffectInSpell(spell_id, SpellEffect::STR)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
@ -9978,11 +9978,11 @@ bool Bot::CanCastSpellType(uint16 spell_type, uint16 spell_id, Mob* tar) {
|
|||||||
break;
|
break;
|
||||||
case Archetype::Melee:
|
case Archetype::Melee:
|
||||||
if (
|
if (
|
||||||
IsEffectInSpell(spell_id, SE_IncreaseSpellHaste) ||
|
IsEffectInSpell(spell_id, SpellEffect::IncreaseSpellHaste) ||
|
||||||
IsEffectInSpell(spell_id, SE_ManaPool) ||
|
IsEffectInSpell(spell_id, SpellEffect::ManaPool) ||
|
||||||
IsEffectInSpell(spell_id, SE_CastingLevel) ||
|
IsEffectInSpell(spell_id, SpellEffect::CastingLevel) ||
|
||||||
IsEffectInSpell(spell_id, SE_ManaRegen_v2) ||
|
IsEffectInSpell(spell_id, SpellEffect::ManaRegen_v2) ||
|
||||||
IsEffectInSpell(spell_id, SE_CurrentMana)
|
IsEffectInSpell(spell_id, SpellEffect::CurrentMana)
|
||||||
) {
|
) {
|
||||||
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} on {} due to Archetype::Melee.'", GetCleanName(), GetSpellName(spell_id), tar->GetCleanName());
|
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} on {} due to Archetype::Melee.'", GetCleanName(), GetSpellName(spell_id), tar->GetCleanName());
|
||||||
return false;
|
return false;
|
||||||
@ -9997,8 +9997,8 @@ bool Bot::CanCastSpellType(uint16 spell_type, uint16 spell_id, Mob* tar) {
|
|||||||
// Differences for each type
|
// Differences for each type
|
||||||
if (spell_type != BotSpellTypes::InCombatBuff) {
|
if (spell_type != BotSpellTypes::InCombatBuff) {
|
||||||
if (
|
if (
|
||||||
IsEffectInSpell(spell_id, SE_AbsorbMagicAtt) ||
|
IsEffectInSpell(spell_id, SpellEffect::AbsorbMagicAtt) ||
|
||||||
IsEffectInSpell(spell_id, SE_Rune)
|
IsEffectInSpell(spell_id, SpellEffect::Rune)
|
||||||
) {
|
) {
|
||||||
for (int i = 0; i < tar->GetMaxTotalSlots(); i++) {
|
for (int i = 0; i < tar->GetMaxTotalSlots(); i++) {
|
||||||
uint32 buff_count = tar->GetMaxTotalSlots();
|
uint32 buff_count = tar->GetMaxTotalSlots();
|
||||||
@ -10026,14 +10026,14 @@ bool Bot::CanCastSpellType(uint16 spell_type, uint16 spell_id, Mob* tar) {
|
|||||||
tar->IsBot() &&
|
tar->IsBot() &&
|
||||||
(tar->GetLevel() >= tar->CastToBot()->GetStopMeleeLevel()) &&
|
(tar->GetLevel() >= tar->CastToBot()->GetStopMeleeLevel()) &&
|
||||||
(
|
(
|
||||||
IsEffectInSpell(spell_id, SE_AttackSpeed) ||
|
IsEffectInSpell(spell_id, SpellEffect::AttackSpeed) ||
|
||||||
IsEffectInSpell(spell_id, SE_ReverseDS)
|
IsEffectInSpell(spell_id, SpellEffect::ReverseDS)
|
||||||
) ||
|
) ||
|
||||||
(
|
(
|
||||||
SpellEffectsCount(spell_id) == 1 &&
|
SpellEffectsCount(spell_id) == 1 &&
|
||||||
(
|
(
|
||||||
IsEffectInSpell(spell_id, SE_ATK) ||
|
IsEffectInSpell(spell_id, SpellEffect::ATK) ||
|
||||||
IsEffectInSpell(spell_id, SE_STR)
|
IsEffectInSpell(spell_id, SpellEffect::STR)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
@ -10043,11 +10043,11 @@ bool Bot::CanCastSpellType(uint16 spell_type, uint16 spell_id, Mob* tar) {
|
|||||||
break;
|
break;
|
||||||
case Archetype::Melee:
|
case Archetype::Melee:
|
||||||
if (
|
if (
|
||||||
IsEffectInSpell(spell_id, SE_IncreaseSpellHaste) ||
|
IsEffectInSpell(spell_id, SpellEffect::IncreaseSpellHaste) ||
|
||||||
IsEffectInSpell(spell_id, SE_ManaPool) ||
|
IsEffectInSpell(spell_id, SpellEffect::ManaPool) ||
|
||||||
IsEffectInSpell(spell_id, SE_CastingLevel) ||
|
IsEffectInSpell(spell_id, SpellEffect::CastingLevel) ||
|
||||||
IsEffectInSpell(spell_id, SE_ManaRegen_v2) ||
|
IsEffectInSpell(spell_id, SpellEffect::ManaRegen_v2) ||
|
||||||
IsEffectInSpell(spell_id, SE_CurrentMana)
|
IsEffectInSpell(spell_id, SpellEffect::CurrentMana)
|
||||||
) {
|
) {
|
||||||
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} on {} due to Archetype::Melee.'", GetCleanName(), GetSpellName(spell_id), tar->GetCleanName());
|
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} on {} due to Archetype::Melee.'", GetCleanName(), GetSpellName(spell_id), tar->GetCleanName());
|
||||||
return false;
|
return false;
|
||||||
@ -10329,7 +10329,7 @@ bool Bot::IsValidMezTarget(Mob* owner, Mob* npc, uint16 spell_id) {
|
|||||||
auto npc_buffs = npc->GetBuffs();
|
auto npc_buffs = npc->GetBuffs();
|
||||||
|
|
||||||
for (int i = 0; i < buff_count; i++) {
|
for (int i = 0; i < buff_count; i++) {
|
||||||
if (IsDetrimentalSpell(npc_buffs[i].spellid) && IsEffectInSpell(npc_buffs[i].spellid, SE_CurrentHP)) {
|
if (IsDetrimentalSpell(npc_buffs[i].spellid) && IsEffectInSpell(npc_buffs[i].spellid, SpellEffect::CurrentHP)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -11684,7 +11684,7 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
|||||||
return false;
|
return false;
|
||||||
case BotSpellTypes::Root:
|
case BotSpellTypes::Root:
|
||||||
case BotSpellTypes::AERoot:
|
case BotSpellTypes::AERoot:
|
||||||
if (IsDetrimentalSpell(spell_id) && IsEffectInSpell(spell_id, SE_Root)) {
|
if (IsDetrimentalSpell(spell_id) && IsEffectInSpell(spell_id, SpellEffect::Root)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11718,7 +11718,7 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
case BotSpellTypes::Pet:
|
case BotSpellTypes::Pet:
|
||||||
if (IsSummonPetSpell(spell_id) || IsEffectInSpell(spell_id, SE_TemporaryPets)) {
|
if (IsSummonPetSpell(spell_id) || IsEffectInSpell(spell_id, SpellEffect::TemporaryPets)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11732,7 +11732,7 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
|||||||
return false;
|
return false;
|
||||||
case BotSpellTypes::Snare:
|
case BotSpellTypes::Snare:
|
||||||
case BotSpellTypes::AESnare:
|
case BotSpellTypes::AESnare:
|
||||||
if (IsDetrimentalSpell(spell_id) && IsEffectInSpell(spell_id, SE_MovementSpeed)) {
|
if (IsDetrimentalSpell(spell_id) && IsEffectInSpell(spell_id, SpellEffect::MovementSpeed)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11806,7 +11806,7 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
case BotSpellTypes::Resurrect:
|
case BotSpellTypes::Resurrect:
|
||||||
if (IsEffectInSpell(spell_id, SE_Revive)) {
|
if (IsEffectInSpell(spell_id, SpellEffect::Revive)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11911,14 +11911,14 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
|||||||
return false;
|
return false;
|
||||||
case BotSpellTypes::ResistBuffs:
|
case BotSpellTypes::ResistBuffs:
|
||||||
case BotSpellTypes::PetResistBuffs:
|
case BotSpellTypes::PetResistBuffs:
|
||||||
if (IsResistanceBuffSpell(spell_id) && !IsEffectInSpell(spell_id, SE_DamageShield)) {
|
if (IsResistanceBuffSpell(spell_id) && !IsEffectInSpell(spell_id, SpellEffect::DamageShield)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
case BotSpellTypes::DamageShields:
|
case BotSpellTypes::DamageShields:
|
||||||
case BotSpellTypes::PetDamageShields:
|
case BotSpellTypes::PetDamageShields:
|
||||||
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SE_DamageShield)) {
|
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SpellEffect::DamageShield)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11926,7 +11926,7 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
|||||||
case BotSpellTypes::Teleport:
|
case BotSpellTypes::Teleport:
|
||||||
if (
|
if (
|
||||||
IsBeneficialSpell(spell_id) &&
|
IsBeneficialSpell(spell_id) &&
|
||||||
(IsEffectInSpell(spell_id, SE_Teleport) || IsEffectInSpell(spell_id, SE_Translocate))
|
(IsEffectInSpell(spell_id, SpellEffect::Teleport) || IsEffectInSpell(spell_id, SpellEffect::Translocate))
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -11942,40 +11942,40 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
|||||||
case BotSpellTypes::Succor:
|
case BotSpellTypes::Succor:
|
||||||
if (
|
if (
|
||||||
IsBeneficialSpell(spell_id) &&
|
IsBeneficialSpell(spell_id) &&
|
||||||
IsEffectInSpell(spell_id, SE_Succor)
|
IsEffectInSpell(spell_id, SpellEffect::Succor)
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
case BotSpellTypes::BindAffinity:
|
case BotSpellTypes::BindAffinity:
|
||||||
if (IsEffectInSpell(spell_id, SE_BindAffinity)) {
|
if (IsEffectInSpell(spell_id, SpellEffect::BindAffinity)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
case BotSpellTypes::Identify:
|
case BotSpellTypes::Identify:
|
||||||
if (IsEffectInSpell(spell_id, SE_Identify)) {
|
if (IsEffectInSpell(spell_id, SpellEffect::Identify)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
case BotSpellTypes::Levitate:
|
case BotSpellTypes::Levitate:
|
||||||
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SE_Levitate)) {
|
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SpellEffect::Levitate)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
case BotSpellTypes::Rune:
|
case BotSpellTypes::Rune:
|
||||||
if (IsBeneficialSpell(spell_id) &&
|
if (IsBeneficialSpell(spell_id) &&
|
||||||
(IsEffectInSpell(spell_id, SE_AbsorbMagicAtt) || IsEffectInSpell(spell_id, SE_Rune))
|
(IsEffectInSpell(spell_id, SpellEffect::AbsorbMagicAtt) || IsEffectInSpell(spell_id, SpellEffect::Rune))
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
case BotSpellTypes::WaterBreathing:
|
case BotSpellTypes::WaterBreathing:
|
||||||
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SE_WaterBreathing)) {
|
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SpellEffect::WaterBreathing)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11983,7 +11983,7 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
|||||||
case BotSpellTypes::Size:
|
case BotSpellTypes::Size:
|
||||||
if (
|
if (
|
||||||
IsBeneficialSpell(spell_id) &&
|
IsBeneficialSpell(spell_id) &&
|
||||||
(IsEffectInSpell(spell_id, SE_ModelSize) || IsEffectInSpell(spell_id, SE_ChangeHeight))
|
(IsEffectInSpell(spell_id, SpellEffect::ModelSize) || IsEffectInSpell(spell_id, SpellEffect::ChangeHeight))
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -11991,14 +11991,14 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
|||||||
return false;
|
return false;
|
||||||
case BotSpellTypes::Invisibility:
|
case BotSpellTypes::Invisibility:
|
||||||
if (IsBeneficialSpell(spell_id) &&
|
if (IsBeneficialSpell(spell_id) &&
|
||||||
(IsEffectInSpell(spell_id, SE_SeeInvis) ||IsInvisibleSpell(spell_id))
|
(IsEffectInSpell(spell_id, SpellEffect::SeeInvis) ||IsInvisibleSpell(spell_id))
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
case BotSpellTypes::MovementSpeed:
|
case BotSpellTypes::MovementSpeed:
|
||||||
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SE_MovementSpeed)) {
|
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SpellEffect::MovementSpeed)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12007,10 +12007,10 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
|||||||
if (
|
if (
|
||||||
IsBeneficialSpell(spell_id) &&
|
IsBeneficialSpell(spell_id) &&
|
||||||
(
|
(
|
||||||
IsEffectInSpell(spell_id, SE_GateToHomeCity) ||
|
IsEffectInSpell(spell_id, SpellEffect::GateToHomeCity) ||
|
||||||
(
|
(
|
||||||
teleport_zone.compare("") &&
|
teleport_zone.compare("") &&
|
||||||
(IsEffectInSpell(spell_id, SE_Teleport) || IsEffectInSpell(spell_id, SE_Translocate))
|
(IsEffectInSpell(spell_id, SpellEffect::Teleport) || IsEffectInSpell(spell_id, SpellEffect::Translocate))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
@ -12019,7 +12019,7 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
case BotSpellTypes::SummonCorpse:
|
case BotSpellTypes::SummonCorpse:
|
||||||
if (IsEffectInSpell(spell_id, SE_SummonCorpse)) {
|
if (IsEffectInSpell(spell_id, SpellEffect::SummonCorpse)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12510,15 +12510,15 @@ bool Bot::IsValidSpellTypeSubType(uint16 spell_type, uint16 sub_type, uint16 spe
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case CommandedSubTypes::SeeInvis:
|
case CommandedSubTypes::SeeInvis:
|
||||||
if (IsEffectInSpell(spell_id, SE_SeeInvis)) {
|
if (IsEffectInSpell(spell_id, SpellEffect::SeeInvis)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case CommandedSubTypes::Invis:
|
case CommandedSubTypes::Invis:
|
||||||
if (
|
if (
|
||||||
IsEffectInSpell(spell_id, SE_Invisibility) ||
|
IsEffectInSpell(spell_id, SpellEffect::Invisibility) ||
|
||||||
IsEffectInSpell(spell_id, SE_Invisibility2)
|
IsEffectInSpell(spell_id, SpellEffect::Invisibility2)
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -12526,8 +12526,8 @@ bool Bot::IsValidSpellTypeSubType(uint16 spell_type, uint16 sub_type, uint16 spe
|
|||||||
break;
|
break;
|
||||||
case CommandedSubTypes::InvisUndead:
|
case CommandedSubTypes::InvisUndead:
|
||||||
if (
|
if (
|
||||||
IsEffectInSpell(spell_id, SE_InvisVsUndead) ||
|
IsEffectInSpell(spell_id, SpellEffect::InvisVsUndead) ||
|
||||||
IsEffectInSpell(spell_id, SE_InvisVsUndead2)
|
IsEffectInSpell(spell_id, SpellEffect::InvisVsUndead2)
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -12535,8 +12535,8 @@ bool Bot::IsValidSpellTypeSubType(uint16 spell_type, uint16 sub_type, uint16 spe
|
|||||||
break;
|
break;
|
||||||
case CommandedSubTypes::InvisAnimals:
|
case CommandedSubTypes::InvisAnimals:
|
||||||
if (
|
if (
|
||||||
IsEffectInSpell(spell_id, SE_InvisVsAnimals) ||
|
IsEffectInSpell(spell_id, SpellEffect::InvisVsAnimals) ||
|
||||||
IsEffectInSpell(spell_id, SE_ImprovedInvisAnimals)
|
IsEffectInSpell(spell_id, SpellEffect::ImprovedInvisAnimals)
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -12545,13 +12545,13 @@ bool Bot::IsValidSpellTypeSubType(uint16 spell_type, uint16 sub_type, uint16 spe
|
|||||||
case CommandedSubTypes::Shrink:
|
case CommandedSubTypes::Shrink:
|
||||||
if (
|
if (
|
||||||
(
|
(
|
||||||
IsEffectInSpell(spell_id, SE_ModelSize) &&
|
IsEffectInSpell(spell_id, SpellEffect::ModelSize) &&
|
||||||
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SE_ModelSize), GetLevel()) < 100
|
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SpellEffect::ModelSize), GetLevel()) < 100
|
||||||
)
|
)
|
||||||
||
|
||
|
||||||
(
|
(
|
||||||
IsEffectInSpell(spell_id, SE_ChangeHeight) &&
|
IsEffectInSpell(spell_id, SpellEffect::ChangeHeight) &&
|
||||||
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SE_ChangeHeight), GetLevel()) < 100
|
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SpellEffect::ChangeHeight), GetLevel()) < 100
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
@ -12561,13 +12561,13 @@ bool Bot::IsValidSpellTypeSubType(uint16 spell_type, uint16 sub_type, uint16 spe
|
|||||||
case CommandedSubTypes::Grow:
|
case CommandedSubTypes::Grow:
|
||||||
if (
|
if (
|
||||||
(
|
(
|
||||||
IsEffectInSpell(spell_id, SE_ModelSize) &&
|
IsEffectInSpell(spell_id, SpellEffect::ModelSize) &&
|
||||||
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SE_ModelSize), GetLevel()) > 100
|
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SpellEffect::ModelSize), GetLevel()) > 100
|
||||||
)
|
)
|
||||||
||
|
||
|
||||||
(
|
(
|
||||||
IsEffectInSpell(spell_id, SE_ChangeHeight) &&
|
IsEffectInSpell(spell_id, SpellEffect::ChangeHeight) &&
|
||||||
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SE_ChangeHeight), GetLevel()) > 100
|
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SpellEffect::ChangeHeight), GetLevel()) > 100
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
@ -12577,7 +12577,7 @@ bool Bot::IsValidSpellTypeSubType(uint16 spell_type, uint16 sub_type, uint16 spe
|
|||||||
case CommandedSubTypes::Selo:
|
case CommandedSubTypes::Selo:
|
||||||
if (
|
if (
|
||||||
IsBeneficialSpell(spell_id) &&
|
IsBeneficialSpell(spell_id) &&
|
||||||
IsEffectInSpell(spell_id, SE_MovementSpeed) &&
|
IsEffectInSpell(spell_id, SpellEffect::MovementSpeed) &&
|
||||||
IsBardSong(spell_id)
|
IsBardSong(spell_id)
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
@ -13347,7 +13347,7 @@ bool Bot::IsImmuneToBotSpell(uint16 spell_id, Mob* caster) {
|
|||||||
|
|
||||||
if (!GetSpecialAbility(SpecialAbility::MesmerizeImmunity) && IsMesmerizeSpell(spell_id)) {
|
if (!GetSpecialAbility(SpecialAbility::MesmerizeImmunity) && IsMesmerizeSpell(spell_id)) {
|
||||||
// check max level for spell
|
// check max level for spell
|
||||||
effect_index = GetSpellEffectIndex(spell_id, SE_Mez);
|
effect_index = GetSpellEffectIndex(spell_id, SpellEffect::Mez);
|
||||||
assert(effect_index >= 0);
|
assert(effect_index >= 0);
|
||||||
// NPCs get to ignore the max level
|
// NPCs get to ignore the max level
|
||||||
if (
|
if (
|
||||||
@ -13359,13 +13359,13 @@ bool Bot::IsImmuneToBotSpell(uint16 spell_id, Mob* caster) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// slow and haste spells
|
// slow and haste spells
|
||||||
if (GetSpecialAbility(SpecialAbility::SlowImmunity) && IsEffectInSpell(spell_id, SE_AttackSpeed)) {
|
if (GetSpecialAbility(SpecialAbility::SlowImmunity) && IsEffectInSpell(spell_id, SpellEffect::AttackSpeed)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// client vs client fear
|
// client vs client fear
|
||||||
if (!GetSpecialAbility(SpecialAbility::FearImmunity) && IsEffectInSpell(spell_id, SE_Fear)) {
|
if (!GetSpecialAbility(SpecialAbility::FearImmunity) && IsEffectInSpell(spell_id, SpellEffect::Fear)) {
|
||||||
effect_index = GetSpellEffectIndex(spell_id, SE_Fear);
|
effect_index = GetSpellEffectIndex(spell_id, SpellEffect::Fear);
|
||||||
|
|
||||||
if (IsClient() && caster->IsClient() && (caster->CastToClient()->GetGM() == false)) {
|
if (IsClient() && caster->IsClient() && (caster->CastToClient()->GetGM() == false)) {
|
||||||
LogSpells("Clients cannot fear eachother!");
|
LogSpells("Clients cannot fear eachother!");
|
||||||
@ -13389,7 +13389,7 @@ bool Bot::IsImmuneToBotSpell(uint16 spell_id, Mob* caster) {
|
|||||||
//let npcs cast whatever charm on anyone
|
//let npcs cast whatever charm on anyone
|
||||||
if (!caster->IsNPC()) {
|
if (!caster->IsNPC()) {
|
||||||
// check level limit of charm spell
|
// check level limit of charm spell
|
||||||
effect_index = GetSpellEffectIndex(spell_id, SE_Charm);
|
effect_index = GetSpellEffectIndex(spell_id, SpellEffect::Charm);
|
||||||
assert(effect_index >= 0);
|
assert(effect_index >= 0);
|
||||||
if (GetLevel() > spells[spell_id].max_value[effect_index] && spells[spell_id].max_value[effect_index] != 0) {
|
if (GetLevel() > spells[spell_id].max_value[effect_index] && spells[spell_id].max_value[effect_index] != 0) {
|
||||||
return true;
|
return true;
|
||||||
@ -13400,8 +13400,8 @@ bool Bot::IsImmuneToBotSpell(uint16 spell_id, Mob* caster) {
|
|||||||
if (
|
if (
|
||||||
GetSpecialAbility(SpecialAbility::SnareImmunity) &&
|
GetSpecialAbility(SpecialAbility::SnareImmunity) &&
|
||||||
(
|
(
|
||||||
IsEffectInSpell(spell_id, SE_Root) ||
|
IsEffectInSpell(spell_id, SpellEffect::Root) ||
|
||||||
IsEffectInSpell(spell_id, SE_MovementSpeed)
|
IsEffectInSpell(spell_id, SpellEffect::MovementSpeed)
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@ -245,7 +245,7 @@ void bot_command_pet_set_type(Client *c, const Seperator *sep)
|
|||||||
|
|
||||||
if (pet_type == 6 && RuleI(Bots, RequiredMagicianEpicPetItemID) > 0) {
|
if (pet_type == 6 && RuleI(Bots, RequiredMagicianEpicPetItemID) > 0) {
|
||||||
bool has_item = bot_iter->HasBotItem(RuleI(Bots, RequiredMagicianEpicPetItemID)) != INVALID_INDEX;
|
bool has_item = bot_iter->HasBotItem(RuleI(Bots, RequiredMagicianEpicPetItemID)) != INVALID_INDEX;
|
||||||
|
|
||||||
if (!has_item) {
|
if (!has_item) {
|
||||||
c->Message(
|
c->Message(
|
||||||
Chat::Say,
|
Chat::Say,
|
||||||
@ -257,7 +257,7 @@ void bot_command_pet_set_type(Client *c, const Seperator *sep)
|
|||||||
);
|
);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current_check) {
|
if (current_check) {
|
||||||
@ -313,7 +313,7 @@ void bot_command_pet_set_type(Client *c, const Seperator *sep)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsEffectInSpell(s.SpellId, SE_SummonPet)) {
|
if (!IsEffectInSpell(s.SpellId, SpellEffect::SummonPet)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -401,7 +401,7 @@ void bot_command_pet_set_type(Client *c, const Seperator *sep)
|
|||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (success_count == 1 && first_found) {
|
if (success_count == 1 && first_found) {
|
||||||
c->Message(
|
c->Message(
|
||||||
Chat::Green,
|
Chat::Green,
|
||||||
|
|||||||
@ -40,7 +40,7 @@ bool Bot::AICastSpell(Mob* tar, uint8 chance, uint16 spell_type, uint16 sub_targ
|
|||||||
) {
|
) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
!IsCommandedSpell() &&
|
!IsCommandedSpell() &&
|
||||||
zone->random.Int(0, 100) > chance
|
zone->random.Int(0, 100) > chance
|
||||||
@ -240,7 +240,7 @@ bool Bot::AICastSpell(Mob* tar, uint8 chance, uint16 spell_type, uint16 sub_targ
|
|||||||
tar->GetCleanName()
|
tar->GetCleanName()
|
||||||
).c_str()
|
).c_str()
|
||||||
);
|
);
|
||||||
|
|
||||||
InterruptSpell();
|
InterruptSpell();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,7 +297,7 @@ bool Bot::BotCastMez(Mob* tar, uint8 bot_class, BotSpell& bot_spell, uint16 spel
|
|||||||
if (AIDoSpellCast(s.SpellIndex, tar, s.ManaCost)) {
|
if (AIDoSpellCast(s.SpellIndex, tar, s.ManaCost)) {
|
||||||
if (BotSpellTypeUsesTargetSettings(spell_type)) {
|
if (BotSpellTypeUsesTargetSettings(spell_type)) {
|
||||||
SetCastedSpellType(UINT16_MAX);
|
SetCastedSpellType(UINT16_MAX);
|
||||||
|
|
||||||
if (!IsCommandedSpell()) {
|
if (!IsCommandedSpell()) {
|
||||||
SetBotSpellRecastTimer(spell_type, tar, true);
|
SetBotSpellRecastTimer(spell_type, tar, true);
|
||||||
}
|
}
|
||||||
@ -384,7 +384,7 @@ bool Bot::BotCastPet(Mob* tar, uint8 bot_class, BotSpell& bot_spell, uint16 spel
|
|||||||
int familiar_buff_slot = -1;
|
int familiar_buff_slot = -1;
|
||||||
if (buffs_max && my_buffs) {
|
if (buffs_max && my_buffs) {
|
||||||
for (int index = 0; index < buffs_max; ++index) {
|
for (int index = 0; index < buffs_max; ++index) {
|
||||||
if (IsEffectInSpell(my_buffs[index].spellid, SE_Familiar)) {
|
if (IsEffectInSpell(my_buffs[index].spellid, SpellEffect::Familiar)) {
|
||||||
MakePet(my_buffs[index].spellid, spells[my_buffs[index].spellid].teleport_zone);
|
MakePet(my_buffs[index].spellid, spells[my_buffs[index].spellid].teleport_zone);
|
||||||
familiar_buff_slot = index;
|
familiar_buff_slot = index;
|
||||||
break;
|
break;
|
||||||
@ -445,11 +445,11 @@ bool Bot::BotCastNuke(Mob* tar, uint8 bot_class, BotSpell& bot_spell, uint16 spe
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
!tar->GetSpecialAbility(SpecialAbility::StunImmunity) &&
|
!tar->GetSpecialAbility(SpecialAbility::StunImmunity) &&
|
||||||
(
|
(
|
||||||
IsCommandedSpell() ||
|
IsCommandedSpell() ||
|
||||||
(!tar->IsStunned() && (zone->random.Int(1, 100) <= stun_chance))
|
(!tar->IsStunned() && (zone->random.Int(1, 100) <= stun_chance))
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
bot_spell = GetBestBotSpellForStunByTargetType(this, ST_TargetOptional, spell_type, IsAEBotSpellType(spell_type), tar);
|
bot_spell = GetBestBotSpellForStunByTargetType(this, ST_TargetOptional, spell_type, IsAEBotSpellType(spell_type), tar);
|
||||||
}
|
}
|
||||||
@ -1173,7 +1173,7 @@ BotSpell Bot::GetBestBotSpellForVeryFastHeal(Bot* caster, Mob* tar, uint16 spell
|
|||||||
result.ManaCost = 0;
|
result.ManaCost = 0;
|
||||||
|
|
||||||
if (caster) {
|
if (caster) {
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_CurrentHP);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::CurrentHP);
|
||||||
|
|
||||||
for (auto bot_spell_list_itr : bot_spell_list) {
|
for (auto bot_spell_list_itr : bot_spell_list) {
|
||||||
if (
|
if (
|
||||||
@ -1198,7 +1198,7 @@ BotSpell Bot::GetBestBotSpellForFastHeal(Bot* caster, Mob* tar, uint16 spell_typ
|
|||||||
result.ManaCost = 0;
|
result.ManaCost = 0;
|
||||||
|
|
||||||
if (caster) {
|
if (caster) {
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_CurrentHP);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::CurrentHP);
|
||||||
|
|
||||||
for (auto bot_spell_list_itr : bot_spell_list) {
|
for (auto bot_spell_list_itr : bot_spell_list) {
|
||||||
if (IsFastHealSpell(bot_spell_list_itr.SpellId) && caster->CastChecks(bot_spell_list_itr.SpellId, tar, spell_type)) {
|
if (IsFastHealSpell(bot_spell_list_itr.SpellId) && caster->CastChecks(bot_spell_list_itr.SpellId, tar, spell_type)) {
|
||||||
@ -1222,7 +1222,7 @@ BotSpell Bot::GetBestBotSpellForHealOverTime(Bot* caster, Mob* tar, uint16 spell
|
|||||||
result.ManaCost = 0;
|
result.ManaCost = 0;
|
||||||
|
|
||||||
if (caster) {
|
if (caster) {
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_HealOverTime);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::HealOverTime);
|
||||||
|
|
||||||
for (auto bot_spell_list_itr : bot_spell_list) {
|
for (auto bot_spell_list_itr : bot_spell_list) {
|
||||||
if (IsHealOverTimeSpell(bot_spell_list_itr.SpellId) && caster->CastChecks(bot_spell_list_itr.SpellId, tar, spell_type)) {
|
if (IsHealOverTimeSpell(bot_spell_list_itr.SpellId) && caster->CastChecks(bot_spell_list_itr.SpellId, tar, spell_type)) {
|
||||||
@ -1278,7 +1278,7 @@ BotSpell Bot::GetBestBotSpellForRegularSingleTargetHeal(Bot* caster, Mob* tar, u
|
|||||||
result.ManaCost = 0;
|
result.ManaCost = 0;
|
||||||
|
|
||||||
if (caster) {
|
if (caster) {
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_CurrentHP);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::CurrentHP);
|
||||||
|
|
||||||
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
||||||
if (IsRegularSingleTargetHealSpell(bot_spell_list_itr->SpellId) && caster->CastChecks(bot_spell_list_itr->SpellId, tar, spell_type)) {
|
if (IsRegularSingleTargetHealSpell(bot_spell_list_itr->SpellId) && caster->CastChecks(bot_spell_list_itr->SpellId, tar, spell_type)) {
|
||||||
@ -1302,7 +1302,7 @@ BotSpell Bot::GetFirstBotSpellForSingleTargetHeal(Bot* caster, Mob* tar, uint16
|
|||||||
result.ManaCost = 0;
|
result.ManaCost = 0;
|
||||||
|
|
||||||
if (caster) {
|
if (caster) {
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_CurrentHP);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::CurrentHP);
|
||||||
|
|
||||||
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
||||||
if (IsRegularSingleTargetHealSpell(bot_spell_list_itr->SpellId) && caster->CastChecks(bot_spell_list_itr->SpellId, tar, spell_type)) {
|
if (IsRegularSingleTargetHealSpell(bot_spell_list_itr->SpellId) && caster->CastChecks(bot_spell_list_itr->SpellId, tar, spell_type)) {
|
||||||
@ -1329,7 +1329,7 @@ BotSpell Bot::GetBestBotSpellForGroupHeal(Bot* caster, Mob* tar, uint16 spell_ty
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_CurrentHP);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::CurrentHP);
|
||||||
int target_count = 0;
|
int target_count = 0;
|
||||||
int required_count = caster->GetSpellTypeAEOrGroupTargetCount(spell_type);
|
int required_count = caster->GetSpellTypeAEOrGroupTargetCount(spell_type);
|
||||||
|
|
||||||
@ -1367,7 +1367,7 @@ BotSpell Bot::GetBestBotSpellForGroupHealOverTime(Bot* caster, Mob* tar, uint16
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_HealOverTime);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::HealOverTime);
|
||||||
int target_count = 0;
|
int target_count = 0;
|
||||||
int required_count = caster->GetSpellTypeAEOrGroupTargetCount(spell_type);
|
int required_count = caster->GetSpellTypeAEOrGroupTargetCount(spell_type);
|
||||||
|
|
||||||
@ -1405,7 +1405,7 @@ BotSpell Bot::GetBestBotSpellForGroupCompleteHeal(Bot* caster, Mob* tar, uint16
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_CompleteHeal);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::CompleteHeal);
|
||||||
int target_count = 0;
|
int target_count = 0;
|
||||||
int required_count = caster->GetSpellTypeAEOrGroupTargetCount(spell_type);
|
int required_count = caster->GetSpellTypeAEOrGroupTargetCount(spell_type);
|
||||||
|
|
||||||
@ -1440,7 +1440,7 @@ BotSpell Bot::GetBestBotSpellForMez(Bot* caster, uint16 spell_type) {
|
|||||||
result.ManaCost = 0;
|
result.ManaCost = 0;
|
||||||
|
|
||||||
if (caster) {
|
if (caster) {
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_Mez);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::Mez);
|
||||||
|
|
||||||
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
||||||
if (
|
if (
|
||||||
@ -1548,7 +1548,7 @@ BotSpell Bot::GetBestBotMagicianPetSpell(Bot* caster, uint16 spell_type) {
|
|||||||
result.ManaCost = 0;
|
result.ManaCost = 0;
|
||||||
|
|
||||||
if (caster) {
|
if (caster) {
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_SummonPet);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::SummonPet);
|
||||||
std::string pet_type = GetBotMagicianPetType(caster);
|
std::string pet_type = GetBotMagicianPetType(caster);
|
||||||
|
|
||||||
for(std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
for(std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
||||||
@ -1638,7 +1638,7 @@ std::string Bot::GetBotMagicianPetType(Bot* caster) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsEffectInSpell(s.SpellId, SE_SummonPet)) {
|
if (!IsEffectInSpell(s.SpellId, SpellEffect::SummonPet)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1683,7 +1683,7 @@ std::string Bot::GetBotMagicianPetType(Bot* caster) {
|
|||||||
if (bot_level >= water_min_level) {
|
if (bot_level >= water_min_level) {
|
||||||
result = std::string("SumWater");
|
result = std::string("SumWater");
|
||||||
}
|
}
|
||||||
|
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
case SumFire:
|
case SumFire:
|
||||||
@ -1730,7 +1730,7 @@ BotSpell Bot::GetBestBotSpellForNukeByTargetType(Bot* caster, SpellTargetType ta
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (caster) {
|
if (caster) {
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffectAndTargetType(caster, spell_type, SE_CurrentHP, target_type);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffectAndTargetType(caster, spell_type, SpellEffect::CurrentHP, target_type);
|
||||||
|
|
||||||
for(std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
for(std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
||||||
if (IsPureNukeSpell(bot_spell_list_itr->SpellId) || IsDamageSpell(bot_spell_list_itr->SpellId)) {
|
if (IsPureNukeSpell(bot_spell_list_itr->SpellId) || IsDamageSpell(bot_spell_list_itr->SpellId)) {
|
||||||
@ -1777,7 +1777,7 @@ BotSpell Bot::GetBestBotSpellForStunByTargetType(Bot* caster, SpellTargetType ta
|
|||||||
|
|
||||||
if (caster)
|
if (caster)
|
||||||
{
|
{
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffectAndTargetType(caster, spell_type, SE_Stun, target_type);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffectAndTargetType(caster, spell_type, SpellEffect::Stun, target_type);
|
||||||
|
|
||||||
for(std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr)
|
for(std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr)
|
||||||
{
|
{
|
||||||
@ -1835,7 +1835,7 @@ BotSpell Bot::GetBestBotWizardNukeSpellByTargetResists(Bot* caster, Mob* target,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffectAndTargetType(caster, spell_type, SE_CurrentHP, ST_Target);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffectAndTargetType(caster, spell_type, SpellEffect::CurrentHP, ST_Target);
|
||||||
|
|
||||||
BotSpell first_wizard_magic_nuke_spell_found;
|
BotSpell first_wizard_magic_nuke_spell_found;
|
||||||
first_wizard_magic_nuke_spell_found.SpellId = 0;
|
first_wizard_magic_nuke_spell_found.SpellId = 0;
|
||||||
@ -1855,32 +1855,32 @@ BotSpell Bot::GetBestBotWizardNukeSpellByTargetResists(Bot* caster, Mob* target,
|
|||||||
}
|
}
|
||||||
else if (!select_lure_nuke && IsPureNukeSpell(bot_spell_list_itr->SpellId)) {
|
else if (!select_lure_nuke && IsPureNukeSpell(bot_spell_list_itr->SpellId)) {
|
||||||
if (
|
if (
|
||||||
((target->GetMR() < target->GetCR()) || (target->GetMR() < target->GetFR())) &&
|
((target->GetMR() < target->GetCR()) || (target->GetMR() < target->GetFR())) &&
|
||||||
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_MAGIC) &&
|
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_MAGIC) &&
|
||||||
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
||||||
caster->CastChecks(bot_spell_list_itr->SpellId, target, spell_type)
|
caster->CastChecks(bot_spell_list_itr->SpellId, target, spell_type)
|
||||||
) {
|
) {
|
||||||
spell_selected = true;
|
spell_selected = true;
|
||||||
}
|
}
|
||||||
else if (
|
else if (
|
||||||
((target->GetCR() < target->GetMR()) || (target->GetCR() < target->GetFR())) &&
|
((target->GetCR() < target->GetMR()) || (target->GetCR() < target->GetFR())) &&
|
||||||
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_COLD) &&
|
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_COLD) &&
|
||||||
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
||||||
caster->CastChecks(bot_spell_list_itr->SpellId, target, spell_type)
|
caster->CastChecks(bot_spell_list_itr->SpellId, target, spell_type)
|
||||||
) {
|
) {
|
||||||
spell_selected = true;
|
spell_selected = true;
|
||||||
}
|
}
|
||||||
else if (
|
else if (
|
||||||
((target->GetFR() < target->GetCR()) || (target->GetFR() < target->GetMR())) &&
|
((target->GetFR() < target->GetCR()) || (target->GetFR() < target->GetMR())) &&
|
||||||
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_FIRE) &&
|
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_FIRE) &&
|
||||||
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
||||||
caster->CastChecks(bot_spell_list_itr->SpellId, target, spell_type)
|
caster->CastChecks(bot_spell_list_itr->SpellId, target, spell_type)
|
||||||
) {
|
) {
|
||||||
spell_selected = true;
|
spell_selected = true;
|
||||||
}
|
}
|
||||||
else if (
|
else if (
|
||||||
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_MAGIC) &&
|
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_MAGIC) &&
|
||||||
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
||||||
caster->CastChecks(bot_spell_list_itr->SpellId, target, spell_type)
|
caster->CastChecks(bot_spell_list_itr->SpellId, target, spell_type)
|
||||||
) {
|
) {
|
||||||
first_wizard_magic_nuke_spell_found.SpellId = bot_spell_list_itr->SpellId;
|
first_wizard_magic_nuke_spell_found.SpellId = bot_spell_list_itr->SpellId;
|
||||||
@ -1998,11 +1998,11 @@ BotSpell Bot::GetBestBotSpellForResistDebuff(Bot* caster, Mob *tar, uint16 spell
|
|||||||
if (
|
if (
|
||||||
(bot_spell_list[i].type == BotSpellTypes::Debuff || IsResistDebuffSpell(bot_spell_list[i].spellid)) &&
|
(bot_spell_list[i].type == BotSpellTypes::Debuff || IsResistDebuffSpell(bot_spell_list[i].spellid)) &&
|
||||||
(
|
(
|
||||||
(needs_magic_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistMagic) || IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistAll))) ||
|
(needs_magic_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistMagic) || IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistAll))) ||
|
||||||
(needs_cold_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistCold) || IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistAll))) ||
|
(needs_cold_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistCold) || IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistAll))) ||
|
||||||
(needs_fire_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistFire) || IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistAll))) ||
|
(needs_fire_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistFire) || IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistAll))) ||
|
||||||
(needs_poison_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistPoison) || IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistAll))) ||
|
(needs_poison_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistPoison) || IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistAll))) ||
|
||||||
(needs_disease_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistDisease) || IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistAll)))
|
(needs_disease_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistDisease) || IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistAll)))
|
||||||
) &&
|
) &&
|
||||||
!tar->IsImmuneToSpell(bot_spell_list[i].spellid, caster) &&
|
!tar->IsImmuneToSpell(bot_spell_list[i].spellid, caster) &&
|
||||||
tar->CanBuffStack(bot_spell_list[i].spellid, caster->GetLevel(), true) >= 0 &&
|
tar->CanBuffStack(bot_spell_list[i].spellid, caster->GetLevel(), true) >= 0 &&
|
||||||
@ -2033,7 +2033,7 @@ BotSpell Bot::GetBestBotSpellForCure(Bot* caster, Mob* tar, uint16 spell_type) {
|
|||||||
|
|
||||||
if (caster) {
|
if (caster) {
|
||||||
std::vector<BotSpell_wPriority> bot_spell_list_itr = GetPrioritizedBotSpellsBySpellType(caster, spell_type, tar);
|
std::vector<BotSpell_wPriority> bot_spell_list_itr = GetPrioritizedBotSpellsBySpellType(caster, spell_type, tar);
|
||||||
|
|
||||||
if (IsGroupBotSpellType(spell_type)) {
|
if (IsGroupBotSpellType(spell_type)) {
|
||||||
int count_needs_cured = 0;
|
int count_needs_cured = 0;
|
||||||
uint16 count_poisoned = 0;
|
uint16 count_poisoned = 0;
|
||||||
@ -2049,16 +2049,16 @@ BotSpell Bot::GetBestBotSpellForCure(Bot* caster, Mob* tar, uint16 spell_type) {
|
|||||||
for (Mob* m : (IsGroupBotSpellType(spell_type) ? caster->GetSpellTargetList() : caster->GetSpellTargetList(true))) {
|
for (Mob* m : (IsGroupBotSpellType(spell_type) ? caster->GetSpellTargetList() : caster->GetSpellTargetList(true))) {
|
||||||
if (caster->GetNeedsCured(m)) {
|
if (caster->GetNeedsCured(m)) {
|
||||||
if (caster->CastChecks(itr->SpellId, m, spell_type, true, IsGroupBotSpellType(spell_type))) {
|
if (caster->CastChecks(itr->SpellId, m, spell_type, true, IsGroupBotSpellType(spell_type))) {
|
||||||
if (m->FindType(SE_PoisonCounter)) {
|
if (m->FindType(SpellEffect::PoisonCounter)) {
|
||||||
++count_poisoned;
|
++count_poisoned;
|
||||||
}
|
}
|
||||||
if (m->FindType(SE_DiseaseCounter)) {
|
if (m->FindType(SpellEffect::DiseaseCounter)) {
|
||||||
++count_diseased;
|
++count_diseased;
|
||||||
}
|
}
|
||||||
if (m->FindType(SE_CurseCounter)) {
|
if (m->FindType(SpellEffect::CurseCounter)) {
|
||||||
++count_cursed;
|
++count_cursed;
|
||||||
}
|
}
|
||||||
if (m->FindType(SE_CorruptionCounter)) {
|
if (m->FindType(SpellEffect::CorruptionCounter)) {
|
||||||
++count_corrupted;
|
++count_corrupted;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2066,10 +2066,10 @@ BotSpell Bot::GetBestBotSpellForCure(Bot* caster, Mob* tar, uint16 spell_type) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(count_poisoned >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SE_PoisonCounter)) ||
|
(count_poisoned >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SpellEffect::PoisonCounter)) ||
|
||||||
(count_diseased >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SE_DiseaseCounter)) ||
|
(count_diseased >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SpellEffect::DiseaseCounter)) ||
|
||||||
(count_cursed >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SE_CurseCounter)) ||
|
(count_cursed >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SpellEffect::CurseCounter)) ||
|
||||||
(count_corrupted >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SE_CorruptionCounter))
|
(count_corrupted >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SpellEffect::CorruptionCounter))
|
||||||
) {
|
) {
|
||||||
result.SpellId = itr->SpellId;
|
result.SpellId = itr->SpellId;
|
||||||
result.SpellIndex = itr->SpellIndex;
|
result.SpellIndex = itr->SpellIndex;
|
||||||
@ -2086,10 +2086,10 @@ BotSpell Bot::GetBestBotSpellForCure(Bot* caster, Mob* tar, uint16 spell_type) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
tar->FindType(SE_PoisonCounter) && IsEffectInSpell(itr->SpellId, SE_PoisonCounter) ||
|
tar->FindType(SpellEffect::PoisonCounter) && IsEffectInSpell(itr->SpellId, SpellEffect::PoisonCounter) ||
|
||||||
tar->FindType(SE_DiseaseCounter) && IsEffectInSpell(itr->SpellId, SE_DiseaseCounter) ||
|
tar->FindType(SpellEffect::DiseaseCounter) && IsEffectInSpell(itr->SpellId, SpellEffect::DiseaseCounter) ||
|
||||||
tar->FindType(SE_CurseCounter) && IsEffectInSpell(itr->SpellId, SE_CurseCounter) ||
|
tar->FindType(SpellEffect::CurseCounter) && IsEffectInSpell(itr->SpellId, SpellEffect::CurseCounter) ||
|
||||||
tar->FindType(SE_CorruptionCounter) && IsEffectInSpell(itr->SpellId, SE_CorruptionCounter)
|
tar->FindType(SpellEffect::CorruptionCounter) && IsEffectInSpell(itr->SpellId, SpellEffect::CorruptionCounter)
|
||||||
) {
|
) {
|
||||||
result.SpellId = itr->SpellId;
|
result.SpellId = itr->SpellId;
|
||||||
result.SpellIndex = itr->SpellIndex;
|
result.SpellIndex = itr->SpellIndex;
|
||||||
@ -2146,13 +2146,13 @@ uint8 Bot::GetChanceToCastBySpellType(uint16 spell_type)
|
|||||||
case BotSpellTypes::Dispel:
|
case BotSpellTypes::Dispel:
|
||||||
return RuleI(Bots, PercentChanceToCastDispel);
|
return RuleI(Bots, PercentChanceToCastDispel);
|
||||||
case BotSpellTypes::InCombatBuff:
|
case BotSpellTypes::InCombatBuff:
|
||||||
return RuleI(Bots, PercentChanceToCastInCombatBuff);
|
return RuleI(Bots, PercentChanceToCastInCombatBuff);
|
||||||
case BotSpellTypes::HateLine:
|
case BotSpellTypes::HateLine:
|
||||||
return RuleI(Bots, PercentChanceToCastHateLine);
|
return RuleI(Bots, PercentChanceToCastHateLine);
|
||||||
case BotSpellTypes::Mez:
|
case BotSpellTypes::Mez:
|
||||||
return RuleI(Bots, PercentChanceToCastMez);
|
return RuleI(Bots, PercentChanceToCastMez);
|
||||||
case BotSpellTypes::Slow:
|
case BotSpellTypes::Slow:
|
||||||
return RuleI(Bots, PercentChanceToCastSlow);
|
return RuleI(Bots, PercentChanceToCastSlow);
|
||||||
case BotSpellTypes::Debuff:
|
case BotSpellTypes::Debuff:
|
||||||
return RuleI(Bots, PercentChanceToCastDebuff);
|
return RuleI(Bots, PercentChanceToCastDebuff);
|
||||||
case BotSpellTypes::Cure:
|
case BotSpellTypes::Cure:
|
||||||
@ -2161,7 +2161,7 @@ uint8 Bot::GetChanceToCastBySpellType(uint16 spell_type)
|
|||||||
case BotSpellTypes::GroupCures:
|
case BotSpellTypes::GroupCures:
|
||||||
return RuleI(Bots, PercentChanceToCastGroupCure);
|
return RuleI(Bots, PercentChanceToCastGroupCure);
|
||||||
case BotSpellTypes::HateRedux:
|
case BotSpellTypes::HateRedux:
|
||||||
return RuleI(Bots, PercentChanceToCastHateRedux);
|
return RuleI(Bots, PercentChanceToCastHateRedux);
|
||||||
case BotSpellTypes::Fear:
|
case BotSpellTypes::Fear:
|
||||||
return RuleI(Bots, PercentChanceToCastFear);
|
return RuleI(Bots, PercentChanceToCastFear);
|
||||||
case BotSpellTypes::RegularHeal:
|
case BotSpellTypes::RegularHeal:
|
||||||
@ -2758,8 +2758,8 @@ bool Bot::IsValidSpellRange(uint16 spell_id, Mob* tar) {
|
|||||||
) {
|
) {
|
||||||
range = GetAOERange(spell_id);
|
range = GetAOERange(spell_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RuleB(Bots, EnableBotTGB) && IsTGBCompatibleSpell(spell_id) && IsGroupSpell(spell_id)) {
|
if (RuleB(Bots, EnableBotTGB) && IsTGBCompatibleSpell(spell_id) && IsGroupSpell(spell_id)) {
|
||||||
range = spells[spell_id].aoe_range;
|
range = spells[spell_id].aoe_range;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2838,7 +2838,7 @@ BotSpell Bot::GetBestBotSpellForRez(Bot* caster, Mob* target, uint16 spell_type)
|
|||||||
result.ManaCost = 0;
|
result.ManaCost = 0;
|
||||||
|
|
||||||
if (caster) {
|
if (caster) {
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_Revive);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::Revive);
|
||||||
|
|
||||||
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
||||||
if (
|
if (
|
||||||
@ -2865,7 +2865,7 @@ BotSpell Bot::GetBestBotSpellForCharm(Bot* caster, Mob* target, uint16 spell_typ
|
|||||||
result.ManaCost = 0;
|
result.ManaCost = 0;
|
||||||
|
|
||||||
if (caster) {
|
if (caster) {
|
||||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_Charm);
|
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::Charm);
|
||||||
|
|
||||||
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
||||||
if (
|
if (
|
||||||
|
|||||||
@ -1391,7 +1391,7 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
|
|||||||
}
|
}
|
||||||
case ChatChannel_Shout: { /* Shout */
|
case ChatChannel_Shout: { /* Shout */
|
||||||
Mob *sender = this;
|
Mob *sender = this;
|
||||||
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SE_VoiceGraft))
|
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SpellEffect::VoiceGraft))
|
||||||
sender = GetPet();
|
sender = GetPet();
|
||||||
|
|
||||||
entity_list.ChannelMessage(sender, chan_num, language, lang_skill, message);
|
entity_list.ChannelMessage(sender, chan_num, language, lang_skill, message);
|
||||||
@ -1429,7 +1429,7 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
|
|||||||
else if(!RuleB(Chat, ServerWideAuction)) {
|
else if(!RuleB(Chat, ServerWideAuction)) {
|
||||||
Mob *sender = this;
|
Mob *sender = this;
|
||||||
|
|
||||||
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SE_VoiceGraft))
|
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SpellEffect::VoiceGraft))
|
||||||
sender = GetPet();
|
sender = GetPet();
|
||||||
|
|
||||||
entity_list.ChannelMessage(sender, chan_num, language, lang_skill, message);
|
entity_list.ChannelMessage(sender, chan_num, language, lang_skill, message);
|
||||||
@ -1476,7 +1476,7 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
|
|||||||
{
|
{
|
||||||
Mob *sender = this;
|
Mob *sender = this;
|
||||||
|
|
||||||
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SE_VoiceGraft))
|
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SpellEffect::VoiceGraft))
|
||||||
sender = GetPet();
|
sender = GetPet();
|
||||||
|
|
||||||
entity_list.ChannelMessage(sender, chan_num, language, lang_skill, message);
|
entity_list.ChannelMessage(sender, chan_num, language, lang_skill, message);
|
||||||
@ -1606,7 +1606,7 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
|
|||||||
}
|
}
|
||||||
|
|
||||||
Mob* sender = this;
|
Mob* sender = this;
|
||||||
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SE_VoiceGraft)) {
|
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SpellEffect::VoiceGraft)) {
|
||||||
sender = GetPet();
|
sender = GetPet();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6907,7 +6907,7 @@ void Client::CheckLDoNHail(NPC* n)
|
|||||||
auto pet = GetPet();
|
auto pet = GetPet();
|
||||||
if (pet) {
|
if (pet) {
|
||||||
if (pet->GetPetType() == PetType::Charmed) {
|
if (pet->GetPetType() == PetType::Charmed) {
|
||||||
pet->BuffFadeByEffect(SE_Charm);
|
pet->BuffFadeByEffect(SpellEffect::Charm);
|
||||||
} else if (pet->GetPetType() == PetType::Follow) {
|
} else if (pet->GetPetType() == PetType::Follow) {
|
||||||
pet->SetOwnerID(0);
|
pet->SetOwnerID(0);
|
||||||
} else {
|
} else {
|
||||||
@ -10658,7 +10658,7 @@ void Client::MovePCDynamicZone(const std::string& zone_name, int zone_version, b
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Client::Fling(float value, float target_x, float target_y, float target_z, bool ignore_los, bool clip_through_walls, bool calculate_speed) {
|
void Client::Fling(float value, float target_x, float target_y, float target_z, bool ignore_los, bool clip_through_walls, bool calculate_speed) {
|
||||||
BuffFadeByEffect(SE_Levitate);
|
BuffFadeByEffect(SpellEffect::Levitate);
|
||||||
if (CheckLosFN(target_x, target_y, target_z, 6.0f) || ignore_los) {
|
if (CheckLosFN(target_x, target_y, target_z, 6.0f) || ignore_los) {
|
||||||
auto p = new EQApplicationPacket(OP_Fling, sizeof(fling_struct));
|
auto p = new EQApplicationPacket(OP_Fling, sizeof(fling_struct));
|
||||||
auto* f = (fling_struct*) p->pBuffer;
|
auto* f = (fling_struct*) p->pBuffer;
|
||||||
@ -10723,7 +10723,7 @@ std::vector<int> Client::GetLearnableDisciplines(uint8 min_level, uint8 max_leve
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RuleB(Spells, UseCHAScribeHack) && spells[spell_id].effect_id[EFFECT_COUNT - 1] == SE_CHA) {
|
if (RuleB(Spells, UseCHAScribeHack) && spells[spell_id].effect_id[EFFECT_COUNT - 1] == SpellEffect::CHA) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10794,7 +10794,7 @@ std::vector<int> Client::GetScribeableSpells(uint8 min_level, uint8 max_level) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RuleB(Spells, UseCHAScribeHack) && spells[spell_id].effect_id[EFFECT_COUNT - 1] == SE_CHA) {
|
if (RuleB(Spells, UseCHAScribeHack) && spells[spell_id].effect_id[EFFECT_COUNT - 1] == SpellEffect::CHA) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11436,7 +11436,7 @@ void Client::SummonBaggedItems(uint32 bag_item_id, const std::vector<LootItem>&
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: maybe some common functions for SE_SummonItem and SE_SummonItemIntoBag
|
// todo: maybe some common functions for SpellEffect::SummonItem and SpellEffect::SummonItemIntoBag
|
||||||
|
|
||||||
const EQ::ItemData* bag_item = database.GetItem(bag_item_id);
|
const EQ::ItemData* bag_item = database.GetItem(bag_item_id);
|
||||||
if (!bag_item)
|
if (!bag_item)
|
||||||
|
|||||||
@ -693,7 +693,7 @@ int64 Client::CalcManaRegen(bool bCombat)
|
|||||||
}
|
}
|
||||||
|
|
||||||
regen += aabonuses.ManaRegen;
|
regen += aabonuses.ManaRegen;
|
||||||
// add in + 1 bonus for SE_CompleteHeal, but we don't do anything for it yet?
|
// add in + 1 bonus for SpellEffect::CompleteHeal, but we don't do anything for it yet?
|
||||||
|
|
||||||
int item_bonus = itembonuses.ManaRegen; // this is capped already
|
int item_bonus = itembonuses.ManaRegen; // this is capped already
|
||||||
item_bonus += itembonuses.heroic_mana_regen;
|
item_bonus += itembonuses.heroic_mana_regen;
|
||||||
@ -1482,24 +1482,24 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id)
|
|||||||
Bard Spell Effects
|
Bard Spell Effects
|
||||||
|
|
||||||
Mod uses the highest bonus from either of these for each instrument
|
Mod uses the highest bonus from either of these for each instrument
|
||||||
SPA 179 SE_AllInstrumentMod is used for instrument spellbonus.______Mod. This applies to ALL instrument mods (Puretones Discipline)
|
SPA 179 SpellEffect::AllInstrumentMod is used for instrument spellbonus.______Mod. This applies to ALL instrument mods (Puretones Discipline)
|
||||||
SPA 260 SE_AddSingingMod is used for instrument spellbonus.______Mod. This applies to indiviual instrument mods. (Instrument mastery AA)
|
SPA 260 SpellEffect::AddSingingMod is used for instrument spellbonus.______Mod. This applies to indiviual instrument mods. (Instrument mastery AA)
|
||||||
-Example usage: From AA a value of 4 = 40%
|
-Example usage: From AA a value of 4 = 40%
|
||||||
|
|
||||||
SPA 118 SE_Amplification is a stackable singing mod, on live it exists as both spell and AA bonus (stackable)
|
SPA 118 SpellEffect::Amplification is a stackable singing mod, on live it exists as both spell and AA bonus (stackable)
|
||||||
- Live Behavior: Amplifcation can be modified by singing mods and amplification itself, thus on the second cast of Amplification you will recieve
|
- Live Behavior: Amplifcation can be modified by singing mods and amplification itself, thus on the second cast of Amplification you will recieve
|
||||||
the mod from the first cast, this continues until you reach the song mod cap.
|
the mod from the first cast, this continues until you reach the song mod cap.
|
||||||
|
|
||||||
SPA 261 SE_SongModCap raises song focus cap (No longer used on live)
|
SPA 261 SpellEffect::SongModCap raises song focus cap (No longer used on live)
|
||||||
SPA 270 SE_BardSongRange increase range of beneficial bard songs (Sionachie's Crescendo)
|
SPA 270 SpellEffect::BardSongRange increase range of beneficial bard songs (Sionachie's Crescendo)
|
||||||
|
|
||||||
SPA 413 SE_FcBaseEffects focus effect that replaced item instrument mods
|
SPA 413 SpellEffect::FcBaseEffects focus effect that replaced item instrument mods
|
||||||
|
|
||||||
Issues 10-15-21:
|
Issues 10-15-21:
|
||||||
Bonuses are not applied, unless song is stopped and restarted due to pulse keeping it continues. -> Need to recode songs to recast when duration ends.
|
Bonuses are not applied, unless song is stopped and restarted due to pulse keeping it continues. -> Need to recode songs to recast when duration ends.
|
||||||
|
|
||||||
Formula Live Bards:
|
Formula Live Bards:
|
||||||
mod = (10 + (aabonus.____Mod [SPA 260 AA Instrument Mastery]) + (SE_FcBaseEffect[SPA 413])/10 + (spellbonus.______Mod [SPA 179 Puretone Disc]) + (Amplication [SPA 118])/10
|
mod = (10 + (aabonus.____Mod [SPA 260 AA Instrument Mastery]) + (SpellEffect::FcBaseEffect[SPA 413])/10 + (spellbonus.______Mod [SPA 179 Puretone Disc]) + (Amplication [SPA 118])/10
|
||||||
|
|
||||||
TODO: Spell Table Fields that need to be implemented
|
TODO: Spell Table Fields that need to be implemented
|
||||||
Field 225 //float base_effects_focus_slope; // -- BASE_EFFECTS_FOCUS_SLOPE
|
Field 225 //float base_effects_focus_slope; // -- BASE_EFFECTS_FOCUS_SLOPE
|
||||||
@ -1567,7 +1567,7 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id)
|
|||||||
else
|
else
|
||||||
effectmod = spellbonuses.singingMod;
|
effectmod = spellbonuses.singingMod;
|
||||||
if (IsBardSong(spell_id))
|
if (IsBardSong(spell_id))
|
||||||
effectmod += aabonuses.singingMod + (spellbonuses.Amplification + itembonuses.Amplification + aabonuses.Amplification); //SPA 118 SE_Amplification
|
effectmod += aabonuses.singingMod + (spellbonuses.Amplification + itembonuses.Amplification + aabonuses.Amplification); //SPA 118 SpellEffect::Amplification
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
effectmod = 10;
|
effectmod = 10;
|
||||||
@ -1584,7 +1584,7 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id)
|
|||||||
|
|
||||||
if (effectmodcap) {
|
if (effectmodcap) {
|
||||||
|
|
||||||
effectmodcap += aabonuses.songModCap + spellbonuses.songModCap + itembonuses.songModCap; //SPA 261 SE_SongModCap (not used on live)
|
effectmodcap += aabonuses.songModCap + spellbonuses.songModCap + itembonuses.songModCap; //SPA 261 SpellEffect::SongModCap (not used on live)
|
||||||
|
|
||||||
//Incase a negative modifier is used.
|
//Incase a negative modifier is used.
|
||||||
if (effectmodcap <= 0) {
|
if (effectmodcap <= 0) {
|
||||||
|
|||||||
@ -671,7 +671,7 @@ void Client::CompleteConnect()
|
|||||||
|
|
||||||
for (int x1 = 0; x1 < EFFECT_COUNT; x1++) {
|
for (int x1 = 0; x1 < EFFECT_COUNT; x1++) {
|
||||||
switch (spell.effect_id[x1]) {
|
switch (spell.effect_id[x1]) {
|
||||||
case SE_Illusion: {
|
case SpellEffect::Illusion: {
|
||||||
if (GetIllusionBlock()) {
|
if (GetIllusionBlock()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -682,41 +682,41 @@ void Client::CompleteConnect()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_SummonHorse: {
|
case SpellEffect::SummonHorse: {
|
||||||
if (RuleB(Character, PreventMountsFromZoning) || !zone->CanCastOutdoor()) {
|
if (RuleB(Character, PreventMountsFromZoning) || !zone->CanCastOutdoor()) {
|
||||||
BuffFadeByEffect(SE_SummonHorse);
|
BuffFadeByEffect(SpellEffect::SummonHorse);
|
||||||
} else {
|
} else {
|
||||||
SummonHorse(buffs[j1].spellid);
|
SummonHorse(buffs[j1].spellid);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_Silence:
|
case SpellEffect::Silence:
|
||||||
{
|
{
|
||||||
Silence(true);
|
Silence(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_Amnesia:
|
case SpellEffect::Amnesia:
|
||||||
{
|
{
|
||||||
Amnesia(true);
|
Amnesia(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_DivineAura:
|
case SpellEffect::DivineAura:
|
||||||
{
|
{
|
||||||
invulnerable = true;
|
invulnerable = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_Invisibility2:
|
case SpellEffect::Invisibility2:
|
||||||
case SE_Invisibility:
|
case SpellEffect::Invisibility:
|
||||||
{
|
{
|
||||||
SendAppearancePacket(AppearanceType::Invisibility, Invisibility::Invisible);
|
SendAppearancePacket(AppearanceType::Invisibility, Invisibility::Invisible);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_Levitate:
|
case SpellEffect::Levitate:
|
||||||
{
|
{
|
||||||
if (!zone->CanLevitate()) {
|
if (!zone->CanLevitate()) {
|
||||||
if (!GetGM()) {
|
if (!GetGM()) {
|
||||||
SendAppearancePacket(AppearanceType::FlyMode, 0);
|
SendAppearancePacket(AppearanceType::FlyMode, 0);
|
||||||
BuffFadeByEffect(SE_Levitate);
|
BuffFadeByEffect(SpellEffect::Levitate);
|
||||||
Message(Chat::Red, "You can't levitate in this zone.");
|
Message(Chat::Red, "You can't levitate in this zone.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -737,18 +737,18 @@ void Client::CompleteConnect()
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_AddMeleeProc:
|
case SpellEffect::AddMeleeProc:
|
||||||
case SE_WeaponProc:
|
case SpellEffect::WeaponProc:
|
||||||
{
|
{
|
||||||
AddProcToWeapon(GetProcID(buffs[j1].spellid, x1), false, 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, buffs[j1].casterlevel, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::MELEE_PROC));
|
AddProcToWeapon(GetProcID(buffs[j1].spellid, x1), false, 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, buffs[j1].casterlevel, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::MELEE_PROC));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_DefensiveProc:
|
case SpellEffect::DefensiveProc:
|
||||||
{
|
{
|
||||||
AddDefensiveProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::DEFENSIVE_PROC));
|
AddDefensiveProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::DEFENSIVE_PROC));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SE_RangedProc:
|
case SpellEffect::RangedProc:
|
||||||
{
|
{
|
||||||
AddRangedProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::RANGED_PROC));
|
AddRangedProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::RANGED_PROC));
|
||||||
break;
|
break;
|
||||||
@ -4259,7 +4259,7 @@ void Client::Handle_OP_BuffRemoveRequest(const EQApplicationPacket *app)
|
|||||||
|
|
||||||
uint16 SpellID = m->GetSpellIDFromSlot(brrs->SlotID);
|
uint16 SpellID = m->GetSpellIDFromSlot(brrs->SlotID);
|
||||||
|
|
||||||
if (SpellID && (GetGM() || ((IsBeneficialSpell(SpellID) || IsEffectInSpell(SpellID, SE_BindSight)) && !spells[SpellID].no_remove))) {
|
if (SpellID && (GetGM() || ((IsBeneficialSpell(SpellID) || IsEffectInSpell(SpellID, SpellEffect::BindSight)) && !spells[SpellID].no_remove))) {
|
||||||
m->BuffFadeBySlot(brrs->SlotID, true);
|
m->BuffFadeBySlot(brrs->SlotID, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5078,7 +5078,7 @@ void Client::Handle_OP_ClientUpdate(const EQApplicationPacket *app) {
|
|||||||
// Dismount horses when entering water
|
// Dismount horses when entering water
|
||||||
if (GetHorseId() && RuleB(Character, DismountWater)) {
|
if (GetHorseId() && RuleB(Character, DismountWater)) {
|
||||||
SetHorseId(0);
|
SetHorseId(0);
|
||||||
BuffFadeByEffect(SE_SummonHorse);
|
BuffFadeByEffect(SpellEffect::SummonHorse);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CheckRegionTypeChanges();
|
CheckRegionTypeChanges();
|
||||||
@ -11312,7 +11312,7 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app)
|
|||||||
parse->EventMob(EVENT_PET_COMMAND, CastToMob(), pet, f, s->command);
|
parse->EventMob(EVENT_PET_COMMAND, CastToMob(), pet, f, s->command);
|
||||||
|
|
||||||
if (pet->GetPetType() == PetType::Charmed) {
|
if (pet->GetPetType() == PetType::Charmed) {
|
||||||
pet->BuffFadeByEffect(SE_Charm);
|
pet->BuffFadeByEffect(SpellEffect::Charm);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
SetPet(nullptr);
|
SetPet(nullptr);
|
||||||
@ -14239,7 +14239,7 @@ void Client::Handle_OP_Shielding(const EQApplicationPacket *app)
|
|||||||
Recast is 3 minutes.
|
Recast is 3 minutes.
|
||||||
|
|
||||||
For custom use cases, Mob::ShieldAbility can be used in quests with all parameters being altered. This functional
|
For custom use cases, Mob::ShieldAbility can be used in quests with all parameters being altered. This functional
|
||||||
is also used for SPA 201 SE_PetShield, which functions in a simalar manner with pet shielding owner.
|
is also used for SPA 201 SpellEffect::PetShield, which functions in a simalar manner with pet shielding owner.
|
||||||
|
|
||||||
Note: If either the shielder or the shield target die all variables are reset on both.
|
Note: If either the shielder or the shield target die all variables are reset on both.
|
||||||
|
|
||||||
|
|||||||
@ -53,50 +53,50 @@ namespace Archetype {
|
|||||||
#define SHIELD_ABILITY_RECAST_TIME 180
|
#define SHIELD_ABILITY_RECAST_TIME 180
|
||||||
|
|
||||||
typedef enum { //focus types
|
typedef enum { //focus types
|
||||||
focusSpellHaste = 1, //@Fc, SPA: 127, SE_IncreaseSpellHaste, On Caster, cast time mod pct, base: pct
|
focusSpellHaste = 1, //@Fc, SPA: 127, SpellEffect::IncreaseSpellHaste, On Caster, cast time mod pct, base: pct
|
||||||
focusSpellDuration, //@Fc, SPA: 128, SE_IncreaseSpellDuration, On Caster, spell duration mod pct, base: pct
|
focusSpellDuration, //@Fc, SPA: 128, SpellEffect::IncreaseSpellDuration, On Caster, spell duration mod pct, base: pct
|
||||||
focusRange, //@Fc, SPA: 129, SE_IncreaseRange, On Caster, spell range mod pct, base: pct
|
focusRange, //@Fc, SPA: 129, SpellEffect::IncreaseRange, On Caster, spell range mod pct, base: pct
|
||||||
focusReagentCost, //@Fc, SPA: 131, SE_ReduceReagentCost, On Caster, do not consume reagent pct chance, base: min pct, limit: max pct
|
focusReagentCost, //@Fc, SPA: 131, SpellEffect::ReduceReagentCost, On Caster, do not consume reagent pct chance, base: min pct, limit: max pct
|
||||||
focusManaCost, //@Fc, SPA: 132, SE_ReduceManaCost, On Caster, reduce mana cost by pct, base: min pct, limt: max pct
|
focusManaCost, //@Fc, SPA: 132, SpellEffect::ReduceManaCost, On Caster, reduce mana cost by pct, base: min pct, limt: max pct
|
||||||
focusImprovedHeal, //@Fc, SPA: 125, SE_ImprovedHeal, On Caster, spell healing mod pct, base: min pct, limit: max pct
|
focusImprovedHeal, //@Fc, SPA: 125, SpellEffect::ImprovedHeal, On Caster, spell healing mod pct, base: min pct, limit: max pct
|
||||||
focusImprovedDamage, //@Fc, SPA: 124, SE_ImprovedDamage, On Caster, spell damage mod pct, base: min pct, limit: max pct
|
focusImprovedDamage, //@Fc, SPA: 124, SpellEffect::ImprovedDamage, On Caster, spell damage mod pct, base: min pct, limit: max pct
|
||||||
focusImprovedDamage2, //@Fc, SPA: 461, SE_ImprovedDamage2, On Caster, spell damage mod pct, base: min pct, limit: max pct
|
focusImprovedDamage2, //@Fc, SPA: 461, SpellEffect::ImprovedDamage2, On Caster, spell damage mod pct, base: min pct, limit: max pct
|
||||||
focusFcDamagePctCrit, //@Fc, SPA: 302, SE_FcDamagePctCrit, On Caster, spell damage mod pct, base: min pct, limit: max pct
|
focusFcDamagePctCrit, //@Fc, SPA: 302, SpellEffect::FcDamagePctCrit, On Caster, spell damage mod pct, base: min pct, limit: max pct
|
||||||
focusPetPower, //@Fc, SPA: 167, SE_PetPowerIncrease, On Caster, pet power mod, base: value
|
focusPetPower, //@Fc, SPA: 167, SpellEffect::PetPowerIncrease, On Caster, pet power mod, base: value
|
||||||
focusResistRate, //@Fc, SPA: 126, SE_SpellResistReduction, On Caster, casted spell resist mod pct, base: min pct, limit: max pct
|
focusResistRate, //@Fc, SPA: 126, SpellEffect::SpellResistReduction, On Caster, casted spell resist mod pct, base: min pct, limit: max pct
|
||||||
focusSpellHateMod, //@Fc, SPA: 130, SE_SpellHateMod, On Caster, spell hate mod pct, base: min pct, limit: max pct
|
focusSpellHateMod, //@Fc, SPA: 130, SpellEffect::SpellHateMod, On Caster, spell hate mod pct, base: min pct, limit: max pct
|
||||||
focusTriggerOnCast, //@Fc, SPA: 339, SE_TriggerOnCast, On Caster, cast on spell use, base: chance pct limit: spellid
|
focusTriggerOnCast, //@Fc, SPA: 339, SpellEffect::TriggerOnCast, On Caster, cast on spell use, base: chance pct limit: spellid
|
||||||
focusSpellVulnerability, //@Fc, SPA: 296, SE_FcSpellVulnerability, On Target, spell damage taken mod pct, base: min pct, limit: max pct
|
focusSpellVulnerability, //@Fc, SPA: 296, SpellEffect::FcSpellVulnerability, On Target, spell damage taken mod pct, base: min pct, limit: max pct
|
||||||
focusFcSpellDamagePctIncomingPC, //@Fc, SPA: 483, SE_Fc_Spell_Damage_Pct_IncomingPC, On Target, spell damage taken mod pct, base: min pct, limit: max pct
|
focusFcSpellDamagePctIncomingPC, //@Fc, SPA: 483, SpellEffect::Fc_Spell_Damage_Pct_IncomingPC, On Target, spell damage taken mod pct, base: min pct, limit: max pct
|
||||||
focusTwincast, //@Fc, SPA: 399, SE_FcTwincast, On Caster, chance cast spell twice, base: chance pct
|
focusTwincast, //@Fc, SPA: 399, SpellEffect::FcTwincast, On Caster, chance cast spell twice, base: chance pct
|
||||||
focusSympatheticProc, //@Fc, SPA: 383, SE_SympatheticProc, On Caster, cast on spell use, base: variable proc chance on cast time, limit: spellid
|
focusSympatheticProc, //@Fc, SPA: 383, SpellEffect::SympatheticProc, On Caster, cast on spell use, base: variable proc chance on cast time, limit: spellid
|
||||||
focusFcDamageAmt, //@Fc, SPA: 286, SE_FcDamageAmt, On Caster, spell damage mod flat amt, base: amt
|
focusFcDamageAmt, //@Fc, SPA: 286, SpellEffect::FcDamageAmt, On Caster, spell damage mod flat amt, base: amt
|
||||||
focusFcDamageAmt2, //@Fc, SPA: 462, SE_FcDamageAmt2, On Caster, spell damage mod flat amt, base: amt
|
focusFcDamageAmt2, //@Fc, SPA: 462, SpellEffect::FcDamageAmt2, On Caster, spell damage mod flat amt, base: amt
|
||||||
focusFcDamageAmtCrit, //@Fc, SPA: 303, SE_FFcDamageAmtCrit, On Caster, spell damage mod flat amt, base: amt
|
focusFcDamageAmtCrit, //@Fc, SPA: 303, SpellEffect::FFcDamageAmtCrit, On Caster, spell damage mod flat amt, base: amt
|
||||||
focusSpellDurByTic, //@Fc, SPA: 287, SE_SpellDurationIncByTic, On Caster, spell buff duration mod, base: tics
|
focusSpellDurByTic, //@Fc, SPA: 287, SpellEffect::SpellDurationIncByTic, On Caster, spell buff duration mod, base: tics
|
||||||
focusSwarmPetDuration, //@Fc, SPA: 398, SE_SwarmPetDuration, On Caster, swarm pet duration mod, base: milliseconds
|
focusSwarmPetDuration, //@Fc, SPA: 398, SpellEffect::SwarmPetDuration, On Caster, swarm pet duration mod, base: milliseconds
|
||||||
focusReduceRecastTime, //@Fc, SPA: 310, SE_ReduceReuseTimer, On Caster, disc reuse time mod, base: milliseconds
|
focusReduceRecastTime, //@Fc, SPA: 310, SpellEffect::ReduceReuseTimer, On Caster, disc reuse time mod, base: milliseconds
|
||||||
focusBlockNextSpell, //@Fc, SPA: 335, SE_BlockNextSpellFocus, On Caster, chance to block next spell, base: chance
|
focusBlockNextSpell, //@Fc, SPA: 335, SpellEffect::BlockNextSpellFocus, On Caster, chance to block next spell, base: chance
|
||||||
focusFcHealPctIncoming, //@Fc, SPA: 393, SE_FcHealPctIncoming, On Target, heal received mod pct, base: pct
|
focusFcHealPctIncoming, //@Fc, SPA: 393, SpellEffect::FcHealPctIncoming, On Target, heal received mod pct, base: pct
|
||||||
focusFcDamageAmtIncoming, //@Fc, SPA: 297, SE_FcDamageAmtIncoming, On Target, damage taken flat amt, base: amt
|
focusFcDamageAmtIncoming, //@Fc, SPA: 297, SpellEffect::FcDamageAmtIncoming, On Target, damage taken flat amt, base: amt
|
||||||
focusFcSpellDamageAmtIncomingPC, //@Fc, SPA: 484, SE_Fc_Spell_Damage_Amt_IncomingPC, On Target, damage taken flat amt, base: amt
|
focusFcSpellDamageAmtIncomingPC, //@Fc, SPA: 484, SpellEffect::Fc_Spell_Damage_Amt_IncomingPC, On Target, damage taken flat amt, base: amt
|
||||||
focusFcCastSpellOnLand, //@Fc, SPA: 481, SE_Fc_Cast_Spell_On_Land, On Target, cast spell if hit by spell, base: chance pct, limit: spellid
|
focusFcCastSpellOnLand, //@Fc, SPA: 481, SpellEffect::Fc_Cast_Spell_On_Land, On Target, cast spell if hit by spell, base: chance pct, limit: spellid
|
||||||
focusFcHealAmtIncoming, //@Fc, SPA: 394, SE_FcHealAmtIncoming, On Target, heal received mod flat amt, base: amt
|
focusFcHealAmtIncoming, //@Fc, SPA: 394, SpellEffect::FcHealAmtIncoming, On Target, heal received mod flat amt, base: amt
|
||||||
focusFcBaseEffects, //@Fc, SPA: 413, SE_FcBaseEffects, On Caster, base spell effectiveness mod pct, base: pct
|
focusFcBaseEffects, //@Fc, SPA: 413, SpellEffect::FcBaseEffects, On Caster, base spell effectiveness mod pct, base: pct
|
||||||
focusIncreaseNumHits, //@Fc, SPA: 421, SE_FcIncreaseNumHits, On Caster, numhits mod flat amt, base: amt
|
focusIncreaseNumHits, //@Fc, SPA: 421, SpellEffect::FcIncreaseNumHits, On Caster, numhits mod flat amt, base: amt
|
||||||
focusFcLimitUse, //@Fc, SPA: 420, SE_FcLimitUse, On Caster, numhits mod pct, base: pct
|
focusFcLimitUse, //@Fc, SPA: 420, SpellEffect::FcLimitUse, On Caster, numhits mod pct, base: pct
|
||||||
focusFcMute, //@Fc, SPA: 357, SE_FcMute, On Caster, prevents spell casting, base: chance pct
|
focusFcMute, //@Fc, SPA: 357, SpellEffect::FcMute, On Caster, prevents spell casting, base: chance pct
|
||||||
focusFcTimerRefresh, //@Fc, SPA: 389, SE_FcTimerRefresh, On Caster, reset spell recast timer, base: 1
|
focusFcTimerRefresh, //@Fc, SPA: 389, SpellEffect::FcTimerRefresh, On Caster, reset spell recast timer, base: 1
|
||||||
focusFcTimerLockout, //@Fc, SPA: 390, SE_FcTimerLockout, On Caster, set a spell to be on recast timer, base: recast duration milliseconds
|
focusFcTimerLockout, //@Fc, SPA: 390, SpellEffect::FcTimerLockout, On Caster, set a spell to be on recast timer, base: recast duration milliseconds
|
||||||
focusFcStunTimeMod, //@Fc, SPA: 133, SE_FcStunTimeMod, On Caster, stun time mod pct, base: chance pct
|
focusFcStunTimeMod, //@Fc, SPA: 133, SpellEffect::FcStunTimeMod, On Caster, stun time mod pct, base: chance pct
|
||||||
focusFcResistIncoming, //@Fc, SPA: 510, SE_Fc_Resist_Incoming, On Target, resist modifier, base: amt
|
focusFcResistIncoming, //@Fc, SPA: 510, SpellEffect::Fc_Resist_Incoming, On Target, resist modifier, base: amt
|
||||||
focusFcAmplifyMod, //@Fc, SPA: 507, SE_Fc_Amplify_Mod, On Caster, damage-heal-dot mod pct, base: pct
|
focusFcAmplifyMod, //@Fc, SPA: 507, SpellEffect::Fc_Amplify_Mod, On Caster, damage-heal-dot mod pct, base: pct
|
||||||
focusFcAmplifyAmt, //@Fc, SPA: 508, SE_Fc_Amplify_Amt, On Caster, damage-heal-dot mod flat amt, base: amt
|
focusFcAmplifyAmt, //@Fc, SPA: 508, SpellEffect::Fc_Amplify_Amt, On Caster, damage-heal-dot mod flat amt, base: amt
|
||||||
focusFcCastTimeMod2, //@Fc, SPA: 500, SE_Fc_CastTimeMod2, On Caster, cast time mod pct, base: pct
|
focusFcCastTimeMod2, //@Fc, SPA: 500, SpellEffect::Fc_CastTimeMod2, On Caster, cast time mod pct, base: pct
|
||||||
focusFcCastTimeAmt, //@Fc, SPA: 501, SE_Fc_CastTimeAmt, On Caster, cast time mod flat amt, base: milliseconds
|
focusFcCastTimeAmt, //@Fc, SPA: 501, SpellEffect::Fc_CastTimeAmt, On Caster, cast time mod flat amt, base: milliseconds
|
||||||
focusFcHealPctCritIncoming, //@Fc, SPA: 395, SE_FcHealPctCritIncoming, On Target, spell healing mod pct, base: pct
|
focusFcHealPctCritIncoming, //@Fc, SPA: 395, SpellEffect::FcHealPctCritIncoming, On Target, spell healing mod pct, base: pct
|
||||||
focusFcHealAmt, //@Fc, SPA: 392, SE_FcHealAmt, On Caster, spell healing mod flat amt, base: amt
|
focusFcHealAmt, //@Fc, SPA: 392, SpellEffect::FcHealAmt, On Caster, spell healing mod flat amt, base: amt
|
||||||
focusFcHealAmtCrit, //@Fc, SPA: 396, SE_FcHealAmtCrit, On Caster, spell healing mod flat amt, base: amt
|
focusFcHealAmtCrit, //@Fc, SPA: 396, SpellEffect::FcHealAmtCrit, On Caster, spell healing mod flat amt, base: amt
|
||||||
} focusType; //Any new FocusType needs to be added to the Mob::IsFocus function
|
} focusType; //Any new FocusType needs to be added to the Mob::IsFocus function
|
||||||
#define HIGHEST_FOCUS focusFcHealAmtCrit //Should always be last focusType in enum
|
#define HIGHEST_FOCUS focusFcHealAmtCrit //Should always be last focusType in enum
|
||||||
|
|
||||||
|
|||||||
@ -263,7 +263,7 @@ int64 Mob::GetActDoTDamage(uint16 spell_id, int64 value, Mob* target, bool from_
|
|||||||
chance += itembonuses.CriticalDoTChance + spellbonuses.CriticalDoTChance + aabonuses.CriticalDoTChance;
|
chance += itembonuses.CriticalDoTChance + spellbonuses.CriticalDoTChance + aabonuses.CriticalDoTChance;
|
||||||
|
|
||||||
if (spellbonuses.CriticalDotDecay)
|
if (spellbonuses.CriticalDotDecay)
|
||||||
chance += GetDecayEffectValue(spell_id, SE_CriticalDotDecay);
|
chance += GetDecayEffectValue(spell_id, SpellEffect::CriticalDotDecay);
|
||||||
|
|
||||||
if (spells[spell_id].override_crit_chance > 0 && chance > spells[spell_id].override_crit_chance)
|
if (spells[spell_id].override_crit_chance > 0 && chance > spells[spell_id].override_crit_chance)
|
||||||
chance = spells[spell_id].override_crit_chance;
|
chance = spells[spell_id].override_crit_chance;
|
||||||
@ -429,14 +429,14 @@ int64 Mob::GetActSpellHealing(uint16 spell_id, int64 value, Mob* target, bool fr
|
|||||||
critical_chance += itembonuses.CriticalHealChance + spellbonuses.CriticalHealChance + aabonuses.CriticalHealChance;
|
critical_chance += itembonuses.CriticalHealChance + spellbonuses.CriticalHealChance + aabonuses.CriticalHealChance;
|
||||||
|
|
||||||
if (spellbonuses.CriticalHealDecay) {
|
if (spellbonuses.CriticalHealDecay) {
|
||||||
critical_chance += GetDecayEffectValue(spell_id, SE_CriticalHealDecay);
|
critical_chance += GetDecayEffectValue(spell_id, SpellEffect::CriticalHealDecay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
critical_chance = itembonuses.CriticalHealOverTime + spellbonuses.CriticalHealOverTime + aabonuses.CriticalHealOverTime;
|
critical_chance = itembonuses.CriticalHealOverTime + spellbonuses.CriticalHealOverTime + aabonuses.CriticalHealOverTime;
|
||||||
|
|
||||||
if (spellbonuses.CriticalRegenDecay) {
|
if (spellbonuses.CriticalRegenDecay) {
|
||||||
critical_chance += GetDecayEffectValue(spell_id, SE_CriticalRegenDecay);
|
critical_chance += GetDecayEffectValue(spell_id, SpellEffect::CriticalRegenDecay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -596,7 +596,7 @@ int32 Mob::GetActSpellCost(uint16 spell_id, int32 cost)
|
|||||||
if (buffs[buffSlot].spellid == 0 || buffs[buffSlot].spellid >= SPDAT_RECORDS)
|
if (buffs[buffSlot].spellid == 0 || buffs[buffSlot].spellid >= SPDAT_RECORDS)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(IsEffectInSpell(buffs[buffSlot].spellid, SE_ReduceManaCost)) {
|
if(IsEffectInSpell(buffs[buffSlot].spellid, SpellEffect::ReduceManaCost)) {
|
||||||
if(CalcFocusEffect(focusManaCost, buffs[buffSlot].spellid, spell_id) == 100)
|
if(CalcFocusEffect(focusManaCost, buffs[buffSlot].spellid, spell_id) == 100)
|
||||||
cost = 1;
|
cost = 1;
|
||||||
}
|
}
|
||||||
@ -1105,8 +1105,8 @@ void EntityList::AESpell(
|
|||||||
IsTargetableAESpell(spell_id) &&
|
IsTargetableAESpell(spell_id) &&
|
||||||
is_detrimental_spell &&
|
is_detrimental_spell &&
|
||||||
!is_npc &&
|
!is_npc &&
|
||||||
!IsEffectInSpell(spell_id, SE_Lull) &&
|
!IsEffectInSpell(spell_id, SpellEffect::Lull) &&
|
||||||
!IsEffectInSpell(spell_id, SE_Mez)
|
!IsEffectInSpell(spell_id, SpellEffect::Mez)
|
||||||
) {
|
) {
|
||||||
max_targets_allowed = RuleI(Spells, TargetedAOEMaxTargets);
|
max_targets_allowed = RuleI(Spells, TargetedAOEMaxTargets);
|
||||||
} else if (
|
} else if (
|
||||||
|
|||||||
@ -365,7 +365,7 @@ void Mob::CalculateNewFearpoint()
|
|||||||
// fallback logic if pathing system can't be used
|
// fallback logic if pathing system can't be used
|
||||||
bool inliquid = zone->HasWaterMap() && zone->watermap->InLiquid(glm::vec3(GetPosition())) || zone->IsWaterZone(GetZ());
|
bool inliquid = zone->HasWaterMap() && zone->watermap->InLiquid(glm::vec3(GetPosition())) || zone->IsWaterZone(GetZ());
|
||||||
bool stay_inliquid = (inliquid && IsNPC() && CastToNPC()->IsUnderwaterOnly());
|
bool stay_inliquid = (inliquid && IsNPC() && CastToNPC()->IsUnderwaterOnly());
|
||||||
bool levitating = IsClient() && (FindType(SE_Levitate) || flymode != GravityBehavior::Ground);
|
bool levitating = IsClient() && (FindType(SpellEffect::Levitate) || flymode != GravityBehavior::Ground);
|
||||||
bool open_outdoor_zone = !zone->CanCastOutdoor() && !zone->IsCity();
|
bool open_outdoor_zone = !zone->CanCastOutdoor() && !zone->IsCity();
|
||||||
|
|
||||||
int loop = 0;
|
int loop = 0;
|
||||||
|
|||||||
@ -118,7 +118,7 @@ void Merc::CalcBonuses()
|
|||||||
CalcMaxMana();
|
CalcMaxMana();
|
||||||
CalcMaxEndurance();
|
CalcMaxEndurance();
|
||||||
|
|
||||||
rooted = FindType(SE_Root);
|
rooted = FindType(SpellEffect::Root);
|
||||||
}
|
}
|
||||||
|
|
||||||
float Merc::GetDefaultSize() {
|
float Merc::GetDefaultSize() {
|
||||||
@ -1730,7 +1730,7 @@ bool Merc::AICastSpell(int8 iChance, uint32 iSpellTypes) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//check for heal over time. if not present, try it first
|
//check for heal over time. if not present, try it first
|
||||||
if (!tar->FindType(SE_HealOverTime)) {
|
if (!tar->FindType(SpellEffect::HealOverTime)) {
|
||||||
selectedMercSpell = GetBestMercSpellForHealOverTime(this);
|
selectedMercSpell = GetBestMercSpellForHealOverTime(this);
|
||||||
|
|
||||||
//get regular heal
|
//get regular heal
|
||||||
@ -1779,7 +1779,7 @@ bool Merc::AICastSpell(int8 iChance, uint32 iSpellTypes) {
|
|||||||
if( !IsImmuneToSpell(selectedMercSpell.spellid, this)
|
if( !IsImmuneToSpell(selectedMercSpell.spellid, this)
|
||||||
&& (CanBuffStack(selectedMercSpell.spellid, mercLevel, true) >= 0)) {
|
&& (CanBuffStack(selectedMercSpell.spellid, mercLevel, true) >= 0)) {
|
||||||
|
|
||||||
if( GetArchetype() == Archetype::Melee && IsEffectInSpell(selectedMercSpell.spellid, SE_IncreaseSpellHaste)) {
|
if( GetArchetype() == Archetype::Melee && IsEffectInSpell(selectedMercSpell.spellid, SpellEffect::IncreaseSpellHaste)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1806,7 +1806,7 @@ bool Merc::AICastSpell(int8 iChance, uint32 iSpellTypes) {
|
|||||||
if( !tar->IsImmuneToSpell(selectedMercSpell.spellid, this)
|
if( !tar->IsImmuneToSpell(selectedMercSpell.spellid, this)
|
||||||
&& (tar->CanBuffStack(selectedMercSpell.spellid, mercLevel, true) >= 0)) {
|
&& (tar->CanBuffStack(selectedMercSpell.spellid, mercLevel, true) >= 0)) {
|
||||||
|
|
||||||
if( tar->GetArchetype() == Archetype::Melee && IsEffectInSpell(selectedMercSpell.spellid, SE_IncreaseSpellHaste)) {
|
if( tar->GetArchetype() == Archetype::Melee && IsEffectInSpell(selectedMercSpell.spellid, SpellEffect::IncreaseSpellHaste)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2292,7 +2292,7 @@ int64 Merc::GetFocusEffect(focusType type, uint16 spell_id, bool from_buff_tic)
|
|||||||
if(type == focusReagentCost && IsSummonPetSpell(spell_id) && GetAA(aaElementalPact))
|
if(type == focusReagentCost && IsSummonPetSpell(spell_id) && GetAA(aaElementalPact))
|
||||||
return 100;
|
return 100;
|
||||||
|
|
||||||
if(type == focusReagentCost && (IsEffectInSpell(spell_id, SE_SummonItem) || IsSacrificeSpell(spell_id)))
|
if(type == focusReagentCost && (IsEffectInSpell(spell_id, SpellEffect::SummonItem) || IsSacrificeSpell(spell_id)))
|
||||||
return 0;
|
return 0;
|
||||||
//Summon Spells that require reagents are typically imbue type spells, enchant metal, sacrifice and shouldn't be affected
|
//Summon Spells that require reagents are typically imbue type spells, enchant metal, sacrifice and shouldn't be affected
|
||||||
//by reagent conservation for obvious reasons.
|
//by reagent conservation for obvious reasons.
|
||||||
@ -2620,7 +2620,7 @@ MercSpell Merc::GetBestMercSpellForVeryFastHeal(Merc* caster) {
|
|||||||
result.time_cancast = 0;
|
result.time_cancast = 0;
|
||||||
|
|
||||||
if(caster) {
|
if(caster) {
|
||||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_CurrentHP);
|
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::CurrentHP);
|
||||||
|
|
||||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||||
++mercSpellListItr) {
|
++mercSpellListItr) {
|
||||||
@ -2653,7 +2653,7 @@ MercSpell Merc::GetBestMercSpellForFastHeal(Merc* caster) {
|
|||||||
result.time_cancast = 0;
|
result.time_cancast = 0;
|
||||||
|
|
||||||
if(caster) {
|
if(caster) {
|
||||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_CurrentHP);
|
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::CurrentHP);
|
||||||
|
|
||||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||||
++mercSpellListItr) {
|
++mercSpellListItr) {
|
||||||
@ -2686,7 +2686,7 @@ MercSpell Merc::GetBestMercSpellForHealOverTime(Merc* caster) {
|
|||||||
result.time_cancast = 0;
|
result.time_cancast = 0;
|
||||||
|
|
||||||
if(caster) {
|
if(caster) {
|
||||||
std::list<MercSpell> mercHoTSpellList = GetMercSpellsForSpellEffect(caster, SE_HealOverTime);
|
std::list<MercSpell> mercHoTSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::HealOverTime);
|
||||||
|
|
||||||
for (auto mercSpellListItr = mercHoTSpellList.begin(); mercSpellListItr != mercHoTSpellList.end();
|
for (auto mercSpellListItr = mercHoTSpellList.begin(); mercSpellListItr != mercHoTSpellList.end();
|
||||||
++mercSpellListItr) {
|
++mercSpellListItr) {
|
||||||
@ -2727,7 +2727,7 @@ MercSpell Merc::GetBestMercSpellForPercentageHeal(Merc* caster) {
|
|||||||
result.time_cancast = 0;
|
result.time_cancast = 0;
|
||||||
|
|
||||||
if(caster && caster->AI_HasSpells()) {
|
if(caster && caster->AI_HasSpells()) {
|
||||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_CurrentHP);
|
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::CurrentHP);
|
||||||
|
|
||||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||||
++mercSpellListItr) {
|
++mercSpellListItr) {
|
||||||
@ -2760,7 +2760,7 @@ MercSpell Merc::GetBestMercSpellForRegularSingleTargetHeal(Merc* caster) {
|
|||||||
result.time_cancast = 0;
|
result.time_cancast = 0;
|
||||||
|
|
||||||
if(caster) {
|
if(caster) {
|
||||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_CurrentHP);
|
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::CurrentHP);
|
||||||
|
|
||||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||||
++mercSpellListItr) {
|
++mercSpellListItr) {
|
||||||
@ -2793,7 +2793,7 @@ MercSpell Merc::GetFirstMercSpellForSingleTargetHeal(Merc* caster) {
|
|||||||
result.time_cancast = 0;
|
result.time_cancast = 0;
|
||||||
|
|
||||||
if(caster) {
|
if(caster) {
|
||||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_CurrentHP);
|
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::CurrentHP);
|
||||||
|
|
||||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||||
++mercSpellListItr) {
|
++mercSpellListItr) {
|
||||||
@ -2827,7 +2827,7 @@ MercSpell Merc::GetBestMercSpellForGroupHeal(Merc* caster) {
|
|||||||
result.time_cancast = 0;
|
result.time_cancast = 0;
|
||||||
|
|
||||||
if(caster) {
|
if(caster) {
|
||||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_CurrentHP);
|
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::CurrentHP);
|
||||||
|
|
||||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||||
++mercSpellListItr) {
|
++mercSpellListItr) {
|
||||||
@ -2860,7 +2860,7 @@ MercSpell Merc::GetBestMercSpellForGroupHealOverTime(Merc* caster) {
|
|||||||
result.time_cancast = 0;
|
result.time_cancast = 0;
|
||||||
|
|
||||||
if(caster) {
|
if(caster) {
|
||||||
std::list<MercSpell> mercHoTSpellList = GetMercSpellsForSpellEffect(caster, SE_HealOverTime);
|
std::list<MercSpell> mercHoTSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::HealOverTime);
|
||||||
|
|
||||||
for (auto mercSpellListItr = mercHoTSpellList.begin(); mercSpellListItr != mercHoTSpellList.end();
|
for (auto mercSpellListItr = mercHoTSpellList.begin(); mercSpellListItr != mercHoTSpellList.end();
|
||||||
++mercSpellListItr) {
|
++mercSpellListItr) {
|
||||||
@ -2901,7 +2901,7 @@ MercSpell Merc::GetBestMercSpellForGroupCompleteHeal(Merc* caster) {
|
|||||||
result.time_cancast = 0;
|
result.time_cancast = 0;
|
||||||
|
|
||||||
if(caster) {
|
if(caster) {
|
||||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_CompleteHeal);
|
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::CompleteHeal);
|
||||||
|
|
||||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||||
++mercSpellListItr) {
|
++mercSpellListItr) {
|
||||||
@ -2934,7 +2934,7 @@ MercSpell Merc::GetBestMercSpellForAETaunt(Merc* caster) {
|
|||||||
result.time_cancast = 0;
|
result.time_cancast = 0;
|
||||||
|
|
||||||
if(caster) {
|
if(caster) {
|
||||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_Taunt);
|
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::Taunt);
|
||||||
|
|
||||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||||
++mercSpellListItr) {
|
++mercSpellListItr) {
|
||||||
@ -2969,7 +2969,7 @@ MercSpell Merc::GetBestMercSpellForTaunt(Merc* caster) {
|
|||||||
result.time_cancast = 0;
|
result.time_cancast = 0;
|
||||||
|
|
||||||
if(caster) {
|
if(caster) {
|
||||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_Taunt);
|
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::Taunt);
|
||||||
|
|
||||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||||
++mercSpellListItr) {
|
++mercSpellListItr) {
|
||||||
@ -3002,7 +3002,7 @@ MercSpell Merc::GetBestMercSpellForHate(Merc* caster) {
|
|||||||
result.time_cancast = 0;
|
result.time_cancast = 0;
|
||||||
|
|
||||||
if(caster) {
|
if(caster) {
|
||||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_InstantHate);
|
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::InstantHate);
|
||||||
|
|
||||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||||
++mercSpellListItr) {
|
++mercSpellListItr) {
|
||||||
@ -3038,10 +3038,10 @@ MercSpell Merc::GetBestMercSpellForCure(Merc* caster, Mob *tar) {
|
|||||||
return result;
|
return result;
|
||||||
|
|
||||||
int countNeedsCured = 0;
|
int countNeedsCured = 0;
|
||||||
bool isPoisoned = tar->FindType(SE_PoisonCounter);
|
bool isPoisoned = tar->FindType(SpellEffect::PoisonCounter);
|
||||||
bool isDiseased = tar->FindType(SE_DiseaseCounter);
|
bool isDiseased = tar->FindType(SpellEffect::DiseaseCounter);
|
||||||
bool isCursed = tar->FindType(SE_CurseCounter);
|
bool isCursed = tar->FindType(SpellEffect::CurseCounter);
|
||||||
bool isCorrupted = tar->FindType(SE_CorruptionCounter);
|
bool isCorrupted = tar->FindType(SpellEffect::CorruptionCounter);
|
||||||
|
|
||||||
if(caster && caster->AI_HasSpells()) {
|
if(caster && caster->AI_HasSpells()) {
|
||||||
std::list<MercSpell> cureList = GetMercSpellsBySpellType(caster, SpellType_Cure);
|
std::list<MercSpell> cureList = GetMercSpellsBySpellType(caster, SpellType_Cure);
|
||||||
@ -3068,19 +3068,19 @@ MercSpell Merc::GetBestMercSpellForCure(Merc* caster, Mob *tar) {
|
|||||||
if(selectedMercSpell.spellid == 0)
|
if(selectedMercSpell.spellid == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(isPoisoned && IsEffectInSpell(itr->spellid, SE_PoisonCounter)) {
|
if(isPoisoned && IsEffectInSpell(itr->spellid, SpellEffect::PoisonCounter)) {
|
||||||
spellSelected = true;
|
spellSelected = true;
|
||||||
}
|
}
|
||||||
else if(isDiseased && IsEffectInSpell(itr->spellid, SE_DiseaseCounter)) {
|
else if(isDiseased && IsEffectInSpell(itr->spellid, SpellEffect::DiseaseCounter)) {
|
||||||
spellSelected = true;
|
spellSelected = true;
|
||||||
}
|
}
|
||||||
else if(isCursed && IsEffectInSpell(itr->spellid, SE_CurseCounter)) {
|
else if(isCursed && IsEffectInSpell(itr->spellid, SpellEffect::CurseCounter)) {
|
||||||
spellSelected = true;
|
spellSelected = true;
|
||||||
}
|
}
|
||||||
else if(isCorrupted && IsEffectInSpell(itr->spellid, SE_CorruptionCounter)) {
|
else if(isCorrupted && IsEffectInSpell(itr->spellid, SpellEffect::CorruptionCounter)) {
|
||||||
spellSelected = true;
|
spellSelected = true;
|
||||||
}
|
}
|
||||||
else if(IsEffectInSpell(itr->spellid, SE_DispelDetrimental)) {
|
else if(IsEffectInSpell(itr->spellid, SpellEffect::DispelDetrimental)) {
|
||||||
spellSelected = true;
|
spellSelected = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3108,19 +3108,19 @@ MercSpell Merc::GetBestMercSpellForCure(Merc* caster, Mob *tar) {
|
|||||||
if(selectedMercSpell.spellid == 0)
|
if(selectedMercSpell.spellid == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(isPoisoned && IsEffectInSpell(itr->spellid, SE_PoisonCounter)) {
|
if(isPoisoned && IsEffectInSpell(itr->spellid, SpellEffect::PoisonCounter)) {
|
||||||
spellSelected = true;
|
spellSelected = true;
|
||||||
}
|
}
|
||||||
else if(isDiseased && IsEffectInSpell(itr->spellid, SE_DiseaseCounter)) {
|
else if(isDiseased && IsEffectInSpell(itr->spellid, SpellEffect::DiseaseCounter)) {
|
||||||
spellSelected = true;
|
spellSelected = true;
|
||||||
}
|
}
|
||||||
else if(isCursed && IsEffectInSpell(itr->spellid, SE_CurseCounter)) {
|
else if(isCursed && IsEffectInSpell(itr->spellid, SpellEffect::CurseCounter)) {
|
||||||
spellSelected = true;
|
spellSelected = true;
|
||||||
}
|
}
|
||||||
else if(isCorrupted && IsEffectInSpell(itr->spellid, SE_CorruptionCounter)) {
|
else if(isCorrupted && IsEffectInSpell(itr->spellid, SpellEffect::CorruptionCounter)) {
|
||||||
spellSelected = true;
|
spellSelected = true;
|
||||||
}
|
}
|
||||||
else if(IsEffectInSpell(itr->spellid, SE_DispelDetrimental)) {
|
else if(IsEffectInSpell(itr->spellid, SpellEffect::DispelDetrimental)) {
|
||||||
spellSelected = true;
|
spellSelected = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3155,7 +3155,7 @@ MercSpell Merc::GetBestMercSpellForStun(Merc* caster) {
|
|||||||
result.time_cancast = 0;
|
result.time_cancast = 0;
|
||||||
|
|
||||||
if(caster) {
|
if(caster) {
|
||||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_Stun);
|
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::Stun);
|
||||||
|
|
||||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||||
++mercSpellListItr) {
|
++mercSpellListItr) {
|
||||||
@ -3492,7 +3492,7 @@ bool Merc::GetNeedsCured(Mob *tar) {
|
|||||||
bool needCured = false;
|
bool needCured = false;
|
||||||
|
|
||||||
if(tar) {
|
if(tar) {
|
||||||
if(tar->FindType(SE_PoisonCounter) || tar->FindType(SE_DiseaseCounter) || tar->FindType(SE_CurseCounter) || tar->FindType(SE_CorruptionCounter)) {
|
if(tar->FindType(SpellEffect::PoisonCounter) || tar->FindType(SpellEffect::DiseaseCounter) || tar->FindType(SpellEffect::CurseCounter) || tar->FindType(SpellEffect::CorruptionCounter)) {
|
||||||
uint32 buff_count = tar->GetMaxTotalSlots();
|
uint32 buff_count = tar->GetMaxTotalSlots();
|
||||||
int buffsWithCounters = 0;
|
int buffsWithCounters = 0;
|
||||||
needCured = true;
|
needCured = true;
|
||||||
|
|||||||
44
zone/mob.cpp
44
zone/mob.cpp
@ -547,7 +547,7 @@ Mob::~Mob()
|
|||||||
AI_Stop();
|
AI_Stop();
|
||||||
if (GetPet()) {
|
if (GetPet()) {
|
||||||
if (GetPet()->Charmed()) {
|
if (GetPet()->Charmed()) {
|
||||||
GetPet()->BuffFadeByEffect(SE_Charm);
|
GetPet()->BuffFadeByEffect(SpellEffect::Charm);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SetPet(0);
|
SetPet(0);
|
||||||
@ -625,7 +625,7 @@ void Mob::BreakCharmPetIfConditionsMet() {
|
|||||||
auto pet = GetPet();
|
auto pet = GetPet();
|
||||||
if (pet && pet->GetPetType() == PetType::Charmed && HasAnInvisibilityEffect()) {
|
if (pet && pet->GetPetType() == PetType::Charmed && HasAnInvisibilityEffect()) {
|
||||||
if (RuleB(Pets, LivelikeBreakCharmOnInvis) || IsInvisible(pet)) {
|
if (RuleB(Pets, LivelikeBreakCharmOnInvis) || IsInvisible(pet)) {
|
||||||
pet->BuffFadeByEffect(SE_Charm);
|
pet->BuffFadeByEffect(SpellEffect::Charm);
|
||||||
}
|
}
|
||||||
LogRules(
|
LogRules(
|
||||||
"Pets:LivelikeBreakCharmOnInvis for [{}] invisible [{}] hidden [{}] improved_hidden (shroud of stealth) [{}] invisible_animals [{}] invisible_undead [{}]",
|
"Pets:LivelikeBreakCharmOnInvis for [{}] invisible [{}] hidden [{}] improved_hidden (shroud of stealth) [{}] invisible_animals [{}] invisible_undead [{}]",
|
||||||
@ -1352,7 +1352,7 @@ void Mob::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho)
|
|||||||
// 3 - Mobs in water do not sink. A value of 3 in this field appears to be the default setting for all mobs
|
// 3 - Mobs in water do not sink. A value of 3 in this field appears to be the default setting for all mobs
|
||||||
// (in water or not) according to 6.2 era packet collects.
|
// (in water or not) according to 6.2 era packet collects.
|
||||||
if(IsClient())
|
if(IsClient())
|
||||||
ns->spawn.flymode = FindType(SE_Levitate) ? 2 : 0;
|
ns->spawn.flymode = FindType(SpellEffect::Levitate) ? 2 : 0;
|
||||||
else
|
else
|
||||||
ns->spawn.flymode = flymode;
|
ns->spawn.flymode = flymode;
|
||||||
|
|
||||||
@ -5629,7 +5629,7 @@ int Mob::GetSnaredAmount()
|
|||||||
|
|
||||||
for(int j = 0; j < EFFECT_COUNT; j++)
|
for(int j = 0; j < EFFECT_COUNT; j++)
|
||||||
{
|
{
|
||||||
if (spells[buffs[i].spellid].effect_id[j] == SE_MovementSpeed)
|
if (spells[buffs[i].spellid].effect_id[j] == SpellEffect::MovementSpeed)
|
||||||
{
|
{
|
||||||
int64 val = CalcSpellEffectValue_formula(spells[buffs[i].spellid].formula[j], spells[buffs[i].spellid].base_value[j], spells[buffs[i].spellid].max_value[j], buffs[i].casterlevel, buffs[i].spellid);
|
int64 val = CalcSpellEffectValue_formula(spells[buffs[i].spellid].formula[j], spells[buffs[i].spellid].base_value[j], spells[buffs[i].spellid].max_value[j], buffs[i].casterlevel, buffs[i].spellid);
|
||||||
//int effect = CalcSpellEffectValue(buffs[i].spellid, spells[buffs[i].spellid].effectid[j], buffs[i].casterlevel);
|
//int effect = CalcSpellEffectValue(buffs[i].spellid, spells[buffs[i].spellid].effectid[j], buffs[i].casterlevel);
|
||||||
@ -5827,7 +5827,7 @@ bool Mob::TrySpellTrigger(Mob *target, uint32 spell_id, int effect)
|
|||||||
if (!target || !IsValidSpell(spell_id))
|
if (!target || !IsValidSpell(spell_id))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/*The effects SE_SpellTrigger (SPA 340) and SE_Chance_Best_in_Spell_Grp (SPA 469) work as follows, you typically will have 2-3 different spells each with their own
|
/*The effects SpellEffect::SpellTrigger (SPA 340) and SpellEffect::Chance_Best_in_Spell_Grp (SPA 469) work as follows, you typically will have 2-3 different spells each with their own
|
||||||
chance to be triggered with all chances equaling up to 100 pct, with only 1 spell out of the group being ultimately cast.
|
chance to be triggered with all chances equaling up to 100 pct, with only 1 spell out of the group being ultimately cast.
|
||||||
(ie Effect1 trigger spellA with 30% chance, Effect2 triggers spellB with 20% chance, Effect3 triggers spellC with 50% chance).
|
(ie Effect1 trigger spellA with 30% chance, Effect2 triggers spellB with 20% chance, Effect3 triggers spellC with 50% chance).
|
||||||
The following function ensures a statistically accurate chance for each spell to be cast based on their chance values. These effects are also used in spells where there
|
The following function ensures a statistically accurate chance for each spell to be cast based on their chance values. These effects are also used in spells where there
|
||||||
@ -5842,7 +5842,7 @@ bool Mob::TrySpellTrigger(Mob *target, uint32 spell_id, int effect)
|
|||||||
|
|
||||||
for (int i = 0; i < EFFECT_COUNT; i++)
|
for (int i = 0; i < EFFECT_COUNT; i++)
|
||||||
{
|
{
|
||||||
if (spells[spell_id].effect_id[i] == SE_SpellTrigger || spells[spell_id].effect_id[i] == SE_Chance_Best_in_Spell_Grp)
|
if (spells[spell_id].effect_id[i] == SpellEffect::SpellTrigger || spells[spell_id].effect_id[i] == SpellEffect::Chance_Best_in_Spell_Grp)
|
||||||
total_chance += spells[spell_id].base_value[i];
|
total_chance += spells[spell_id].base_value[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5852,7 +5852,7 @@ bool Mob::TrySpellTrigger(Mob *target, uint32 spell_id, int effect)
|
|||||||
|
|
||||||
for (int i = 0; i < EFFECT_COUNT; i++){
|
for (int i = 0; i < EFFECT_COUNT; i++){
|
||||||
//Find spells with SPA 340 and add the cumulative percent chances to the roll array
|
//Find spells with SPA 340 and add the cumulative percent chances to the roll array
|
||||||
if ((spells[spell_id].effect_id[i] == SE_SpellTrigger) || (spells[spell_id].effect_id[i] == SE_Chance_Best_in_Spell_Grp)){
|
if ((spells[spell_id].effect_id[i] == SpellEffect::SpellTrigger) || (spells[spell_id].effect_id[i] == SpellEffect::Chance_Best_in_Spell_Grp)){
|
||||||
const int cumulative_chance = current_chance + spells[spell_id].base_value[i];
|
const int cumulative_chance = current_chance + spells[spell_id].base_value[i];
|
||||||
chance_array[i] = cumulative_chance;
|
chance_array[i] = cumulative_chance;
|
||||||
current_chance = cumulative_chance;
|
current_chance = cumulative_chance;
|
||||||
@ -5875,11 +5875,11 @@ bool Mob::TrySpellTrigger(Mob *target, uint32 spell_id, int effect)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (CastSpell) {
|
if (CastSpell) {
|
||||||
if (spells[spell_id].effect_id[effect_slot] == SE_SpellTrigger && IsValidSpell(spells[spell_id].limit_value[effect_slot])) {
|
if (spells[spell_id].effect_id[effect_slot] == SpellEffect::SpellTrigger && IsValidSpell(spells[spell_id].limit_value[effect_slot])) {
|
||||||
SpellFinished(spells[spell_id].limit_value[effect_slot], target, EQ::spells::CastingSlot::Item, 0, -1, spells[spells[spell_id].limit_value[effect_slot]].resist_difficulty);
|
SpellFinished(spells[spell_id].limit_value[effect_slot], target, EQ::spells::CastingSlot::Item, 0, -1, spells[spells[spell_id].limit_value[effect_slot]].resist_difficulty);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (IsClient() && spells[spell_id].effect_id[effect_slot] == SE_Chance_Best_in_Spell_Grp) {
|
else if (IsClient() && spells[spell_id].effect_id[effect_slot] == SpellEffect::Chance_Best_in_Spell_Grp) {
|
||||||
uint32 best_spell_id = CastToClient()->GetHighestScribedSpellinSpellGroup(spells[spell_id].limit_value[effect_slot]);
|
uint32 best_spell_id = CastToClient()->GetHighestScribedSpellinSpellGroup(spells[spell_id].limit_value[effect_slot]);
|
||||||
if (IsValidSpell(best_spell_id)) {
|
if (IsValidSpell(best_spell_id)) {
|
||||||
SpellFinished(best_spell_id, target, EQ::spells::CastingSlot::Item, 0, -1, spells[best_spell_id].resist_difficulty);
|
SpellFinished(best_spell_id, target, EQ::spells::CastingSlot::Item, 0, -1, spells[best_spell_id].resist_difficulty);
|
||||||
@ -5899,7 +5899,7 @@ void Mob::TryTriggerOnCastRequirement()
|
|||||||
int spell_id = buffs[e].spellid;
|
int spell_id = buffs[e].spellid;
|
||||||
if (IsValidSpell(spell_id)) {
|
if (IsValidSpell(spell_id)) {
|
||||||
for (int i = 0; i < EFFECT_COUNT; i++) {
|
for (int i = 0; i < EFFECT_COUNT; i++) {
|
||||||
if ((spells[spell_id].effect_id[i] == SE_TriggerOnReqTarget) || (spells[spell_id].effect_id[i] == SE_TriggerOnReqCaster)) {
|
if ((spells[spell_id].effect_id[i] == SpellEffect::TriggerOnReqTarget) || (spells[spell_id].effect_id[i] == SpellEffect::TriggerOnReqCaster)) {
|
||||||
if (PassCastRestriction(spells[spell_id].limit_value[i])) {
|
if (PassCastRestriction(spells[spell_id].limit_value[i])) {
|
||||||
SpellFinished(spells[spell_id].base_value[i], this, EQ::spells::CastingSlot::Item, 0, -1, spells[spell_id].resist_difficulty);
|
SpellFinished(spells[spell_id].base_value[i], this, EQ::spells::CastingSlot::Item, 0, -1, spells[spell_id].resist_difficulty);
|
||||||
if (!TryFadeEffect(e)) {
|
if (!TryFadeEffect(e)) {
|
||||||
@ -5942,7 +5942,7 @@ void Mob::TryTwincast(Mob *caster, Mob *target, uint32 spell_id)
|
|||||||
int buff_count = GetMaxTotalSlots();
|
int buff_count = GetMaxTotalSlots();
|
||||||
for(int i = 0; i < buff_count; i++)
|
for(int i = 0; i < buff_count; i++)
|
||||||
{
|
{
|
||||||
if(IsEffectInSpell(buffs[i].spellid, SE_FcTwincast))
|
if(IsEffectInSpell(buffs[i].spellid, SpellEffect::FcTwincast))
|
||||||
{
|
{
|
||||||
int32 focus = CalcFocusEffect(focusTwincast, buffs[i].spellid, spell_id);
|
int32 focus = CalcFocusEffect(focusTwincast, buffs[i].spellid, spell_id);
|
||||||
if(focus > 0)
|
if(focus > 0)
|
||||||
@ -5968,10 +5968,10 @@ void Mob::ApplyHealthTransferDamage(Mob *caster, Mob *target, uint16 spell_id)
|
|||||||
This allows for the AE spells to function without repeatedly killing caster
|
This allows for the AE spells to function without repeatedly killing caster
|
||||||
Damage or heal portion can be found as regular single use spell effect
|
Damage or heal portion can be found as regular single use spell effect
|
||||||
*/
|
*/
|
||||||
if (IsEffectInSpell(spell_id, SE_Health_Transfer)){
|
if (IsEffectInSpell(spell_id, SpellEffect::Health_Transfer)){
|
||||||
for (int i = 0; i < EFFECT_COUNT; i++) {
|
for (int i = 0; i < EFFECT_COUNT; i++) {
|
||||||
|
|
||||||
if (spells[spell_id].effect_id[i] == SE_Health_Transfer) {
|
if (spells[spell_id].effect_id[i] == SpellEffect::Health_Transfer) {
|
||||||
int64 new_hp = GetMaxHP();
|
int64 new_hp = GetMaxHP();
|
||||||
new_hp -= GetMaxHP() * spells[spell_id].base_value[i] / 1000;
|
new_hp -= GetMaxHP() * spells[spell_id].base_value[i] / 1000;
|
||||||
|
|
||||||
@ -6175,8 +6175,8 @@ bool Mob::TryFadeEffect(int slot)
|
|||||||
if (!spells[buffs[slot].spellid].effect_id[i])
|
if (!spells[buffs[slot].spellid].effect_id[i])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (spells[buffs[slot].spellid].effect_id[i] == SE_CastOnFadeEffectAlways ||
|
if (spells[buffs[slot].spellid].effect_id[i] == SpellEffect::CastOnFadeEffectAlways ||
|
||||||
spells[buffs[slot].spellid].effect_id[i] == SE_CastOnRuneFadeEffect)
|
spells[buffs[slot].spellid].effect_id[i] == SpellEffect::CastOnRuneFadeEffect)
|
||||||
{
|
{
|
||||||
uint16 spell_id = spells[buffs[slot].spellid].base_value[i];
|
uint16 spell_id = spells[buffs[slot].spellid].base_value[i];
|
||||||
BuffFadeBySlot(slot);
|
BuffFadeBySlot(slot);
|
||||||
@ -6560,9 +6560,9 @@ void Mob::TrySpellOnKill(uint8 level, uint16 spell_id)
|
|||||||
{
|
{
|
||||||
if (IsValidSpell(spell_id))
|
if (IsValidSpell(spell_id))
|
||||||
{
|
{
|
||||||
if(IsEffectInSpell(spell_id, SE_ProcOnSpellKillShot)) {
|
if(IsEffectInSpell(spell_id, SpellEffect::ProcOnSpellKillShot)) {
|
||||||
for (int i = 0; i < EFFECT_COUNT; i++) {
|
for (int i = 0; i < EFFECT_COUNT; i++) {
|
||||||
if (spells[spell_id].effect_id[i] == SE_ProcOnSpellKillShot)
|
if (spells[spell_id].effect_id[i] == SpellEffect::ProcOnSpellKillShot)
|
||||||
{
|
{
|
||||||
if (IsValidSpell(spells[spell_id].limit_value[i]) && spells[spell_id].max_value[i] <= level)
|
if (IsValidSpell(spells[spell_id].limit_value[i]) && spells[spell_id].max_value[i] <= level)
|
||||||
{
|
{
|
||||||
@ -6897,11 +6897,11 @@ void Mob::DoGravityEffect()
|
|||||||
int buff_count = GetMaxTotalSlots();
|
int buff_count = GetMaxTotalSlots();
|
||||||
for (int slot = 0; slot < buff_count; slot++)
|
for (int slot = 0; slot < buff_count; slot++)
|
||||||
{
|
{
|
||||||
if (IsValidSpell(buffs[slot].spellid) && IsEffectInSpell(buffs[slot].spellid, SE_GravityEffect))
|
if (IsValidSpell(buffs[slot].spellid) && IsEffectInSpell(buffs[slot].spellid, SpellEffect::GravityEffect))
|
||||||
{
|
{
|
||||||
for (int i = 0; i < EFFECT_COUNT; i++)
|
for (int i = 0; i < EFFECT_COUNT; i++)
|
||||||
{
|
{
|
||||||
if(spells[buffs[slot].spellid].effect_id[i] == SE_GravityEffect) {
|
if(spells[buffs[slot].spellid].effect_id[i] == SpellEffect::GravityEffect) {
|
||||||
|
|
||||||
int casterId = buffs[slot].casterid;
|
int casterId = buffs[slot].casterid;
|
||||||
if(casterId)
|
if(casterId)
|
||||||
@ -7108,7 +7108,7 @@ void Mob::CastOnCurer(uint32 spell_id)
|
|||||||
{
|
{
|
||||||
for(int i = 0; i < EFFECT_COUNT; i++)
|
for(int i = 0; i < EFFECT_COUNT; i++)
|
||||||
{
|
{
|
||||||
if (spells[spell_id].effect_id[i] == SE_CastOnCurer)
|
if (spells[spell_id].effect_id[i] == SpellEffect::CastOnCurer)
|
||||||
{
|
{
|
||||||
if(IsValidSpell(spells[spell_id].base_value[i]))
|
if(IsValidSpell(spells[spell_id].base_value[i]))
|
||||||
{
|
{
|
||||||
@ -7122,7 +7122,7 @@ void Mob::CastOnCure(uint32 spell_id)
|
|||||||
{
|
{
|
||||||
for(int i = 0; i < EFFECT_COUNT; i++)
|
for(int i = 0; i < EFFECT_COUNT; i++)
|
||||||
{
|
{
|
||||||
if (spells[spell_id].effect_id[i] == SE_CastOnCure)
|
if (spells[spell_id].effect_id[i] == SpellEffect::CastOnCure)
|
||||||
{
|
{
|
||||||
if(IsValidSpell(spells[spell_id].base_value[i]))
|
if(IsValidSpell(spells[spell_id].base_value[i]))
|
||||||
{
|
{
|
||||||
@ -7139,7 +7139,7 @@ void Mob::CastOnNumHitFade(uint32 spell_id)
|
|||||||
|
|
||||||
for(int i = 0; i < EFFECT_COUNT; i++)
|
for(int i = 0; i < EFFECT_COUNT; i++)
|
||||||
{
|
{
|
||||||
if (spells[spell_id].effect_id[i] == SE_CastonNumHitFade)
|
if (spells[spell_id].effect_id[i] == SpellEffect::CastonNumHitFade)
|
||||||
{
|
{
|
||||||
if(IsValidSpell(spells[spell_id].base_value[i]))
|
if(IsValidSpell(spells[spell_id].base_value[i]))
|
||||||
{
|
{
|
||||||
|
|||||||
@ -615,7 +615,7 @@ void Client::AI_SpellCast()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(IsEffectInSpell(current_spell, SE_Charm))
|
if(IsEffectInSpell(current_spell, SpellEffect::Charm))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -724,7 +724,7 @@ void Client::AI_Process()
|
|||||||
{
|
{
|
||||||
if(!IsFeared() && !IsLD())
|
if(!IsFeared() && !IsLD())
|
||||||
{
|
{
|
||||||
BuffFadeByEffect(SE_Charm);
|
BuffFadeByEffect(SpellEffect::Charm);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -547,22 +547,22 @@ void NPC::SetPetState(SpellBuff_Struct *pet_buffs, uint32 *items) {
|
|||||||
if (buffs[j1].spellid <= (uint32)SPDAT_RECORDS) {
|
if (buffs[j1].spellid <= (uint32)SPDAT_RECORDS) {
|
||||||
for (int x1=0; x1 < EFFECT_COUNT; x1++) {
|
for (int x1=0; x1 < EFFECT_COUNT; x1++) {
|
||||||
switch (spells[buffs[j1].spellid].effect_id[x1]) {
|
switch (spells[buffs[j1].spellid].effect_id[x1]) {
|
||||||
case SE_AddMeleeProc:
|
case SpellEffect::AddMeleeProc:
|
||||||
case SE_WeaponProc:
|
case SpellEffect::WeaponProc:
|
||||||
// We need to reapply buff based procs
|
// We need to reapply buff based procs
|
||||||
// We need to do this here so suspended pets also regain their procs.
|
// We need to do this here so suspended pets also regain their procs.
|
||||||
AddProcToWeapon(GetProcID(buffs[j1].spellid,x1), false, 100+spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, buffs[j1].casterlevel, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::MELEE_PROC));
|
AddProcToWeapon(GetProcID(buffs[j1].spellid,x1), false, 100+spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, buffs[j1].casterlevel, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::MELEE_PROC));
|
||||||
break;
|
break;
|
||||||
case SE_DefensiveProc:
|
case SpellEffect::DefensiveProc:
|
||||||
AddDefensiveProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::DEFENSIVE_PROC));
|
AddDefensiveProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::DEFENSIVE_PROC));
|
||||||
break;
|
break;
|
||||||
case SE_RangedProc:
|
case SpellEffect::RangedProc:
|
||||||
AddRangedProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::RANGED_PROC));
|
AddRangedProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::RANGED_PROC));
|
||||||
break;
|
break;
|
||||||
case SE_Charm:
|
case SpellEffect::Charm:
|
||||||
case SE_Rune:
|
case SpellEffect::Rune:
|
||||||
case SE_NegateAttacks:
|
case SpellEffect::NegateAttacks:
|
||||||
case SE_Illusion:
|
case SpellEffect::Illusion:
|
||||||
buffs[j1].spellid = SPELL_UNKNOWN;
|
buffs[j1].spellid = SPELL_UNKNOWN;
|
||||||
pet_buffs[j1].spellid = SPELLBOOK_UNKNOWN;
|
pet_buffs[j1].spellid = SPELLBOOK_UNKNOWN;
|
||||||
pet_buffs[j1].effect_type = 0;
|
pet_buffs[j1].effect_type = 0;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
106
zone/spells.cpp
106
zone/spells.cpp
@ -218,11 +218,11 @@ bool Mob::CastSpell(uint16 spell_id, uint16 target_id, CastingSlot slot,
|
|||||||
|
|
||||||
//It appears that the Sanctuary effect is removed by a check on the client side (keep this however for redundancy)
|
//It appears that the Sanctuary effect is removed by a check on the client side (keep this however for redundancy)
|
||||||
if (spellbonuses.Sanctuary && (spells[spell_id].target_type != ST_Self && GetTarget() != this) || IsDetrimentalSpell(spell_id)) {
|
if (spellbonuses.Sanctuary && (spells[spell_id].target_type != ST_Self && GetTarget() != this) || IsDetrimentalSpell(spell_id)) {
|
||||||
BuffFadeByEffect(SE_Sanctuary);
|
BuffFadeByEffect(SpellEffect::Sanctuary);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spellbonuses.NegateIfCombat) {
|
if (spellbonuses.NegateIfCombat) {
|
||||||
BuffFadeByEffect(SE_NegateIfCombat);
|
BuffFadeByEffect(SpellEffect::NegateIfCombat);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GetTarget() && IsManaTapSpell(spell_id)) {
|
if(GetTarget() && IsManaTapSpell(spell_id)) {
|
||||||
@ -696,7 +696,7 @@ bool Mob::DoCastingChecksZoneRestrictions(bool check_on_casting, int32 spell_id)
|
|||||||
},
|
},
|
||||||
// Levitation restriction
|
// Levitation restriction
|
||||||
{
|
{
|
||||||
[&]() { return !bypass_casting_restrictions && !zone->CanLevitate() && IsEffectInSpell(spell_id, SE_Levitate); },
|
[&]() { return !bypass_casting_restrictions && !zone->CanLevitate() && IsEffectInSpell(spell_id, SpellEffect::Levitate); },
|
||||||
[&]() {
|
[&]() {
|
||||||
if (gm_bypass_message("zone levitation restrictions")) { return true; }
|
if (gm_bypass_message("zone levitation restrictions")) { return true; }
|
||||||
Message(Chat::Red, "You have entered an area where levitation effects do not function.");
|
Message(Chat::Red, "You have entered an area where levitation effects do not function.");
|
||||||
@ -858,7 +858,7 @@ bool Mob::DoCastingChecksOnTarget(bool check_on_casting, int32 spell_id, Mob *sp
|
|||||||
/*
|
/*
|
||||||
Cannot cast shield target on self
|
Cannot cast shield target on self
|
||||||
*/
|
*/
|
||||||
if (this == spell_target && IsEffectInSpell(spell_id, SE_Shield_Target)) {
|
if (this == spell_target && IsEffectInSpell(spell_id, SpellEffect::Shield_Target)) {
|
||||||
LogSpells("You cannot shield yourself");
|
LogSpells("You cannot shield yourself");
|
||||||
Message(Chat::SpellFailure, "You cannot shield yourself.");
|
Message(Chat::SpellFailure, "You cannot shield yourself.");
|
||||||
return false;
|
return false;
|
||||||
@ -890,7 +890,7 @@ bool Mob::DoCastingChecksOnTarget(bool check_on_casting, int32 spell_id, Mob *sp
|
|||||||
/*
|
/*
|
||||||
Various charm related target restrictions
|
Various charm related target restrictions
|
||||||
*/
|
*/
|
||||||
if (IsEffectInSpell(spell_id, SE_Charm) && !PassCharmTargetRestriction(spell_target)) {
|
if (IsEffectInSpell(spell_id, SpellEffect::Charm) && !PassCharmTargetRestriction(spell_target)) {
|
||||||
LogSpells("Spell casting canceled [{}] : can not use charm on this target.", spell_id);
|
LogSpells("Spell casting canceled [{}] : can not use charm on this target.", spell_id);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1669,7 +1669,7 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo
|
|||||||
|
|
||||||
// handle the components for traditional casters
|
// handle the components for traditional casters
|
||||||
else {
|
else {
|
||||||
if (!RuleB(Character, PetsUseReagents) && (IsEffectInSpell(spell_id, SE_SummonPet) || IsEffectInSpell(spell_id, SE_NecPet)) ||
|
if (!RuleB(Character, PetsUseReagents) && (IsEffectInSpell(spell_id, SpellEffect::SummonPet) || IsEffectInSpell(spell_id, SpellEffect::NecPet)) ||
|
||||||
(IsBardSong(spell_id) && (slot == CastingSlot::Item|| slot == CastingSlot::PotionBelt))) {
|
(IsBardSong(spell_id) && (slot == CastingSlot::Item|| slot == CastingSlot::PotionBelt))) {
|
||||||
//bypass reagent cost
|
//bypass reagent cost
|
||||||
}
|
}
|
||||||
@ -1706,7 +1706,7 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!RuleB(Character, PetsUseReagents) && (IsEffectInSpell(spell_id, SE_SummonPet) || IsEffectInSpell(spell_id, SE_NecPet))) {
|
else if (!RuleB(Character, PetsUseReagents) && (IsEffectInSpell(spell_id, SpellEffect::SummonPet) || IsEffectInSpell(spell_id, SpellEffect::NecPet))) {
|
||||||
//bypass reagent cost
|
//bypass reagent cost
|
||||||
}
|
}
|
||||||
else if (!bard_song_mode)
|
else if (!bard_song_mode)
|
||||||
@ -1922,7 +1922,7 @@ bool Mob::DetermineSpellTargets(uint16 spell_id, Mob *&spell_target, Mob *&ae_ce
|
|||||||
case ST_Self:
|
case ST_Self:
|
||||||
{
|
{
|
||||||
bool bot_can_summon_corpse = IsBot() &&
|
bool bot_can_summon_corpse = IsBot() &&
|
||||||
IsEffectInSpell(spell_id, SE_SummonCorpse) &&
|
IsEffectInSpell(spell_id, SpellEffect::SummonCorpse) &&
|
||||||
RuleB(Bots, AllowCommandedSummonCorpse);
|
RuleB(Bots, AllowCommandedSummonCorpse);
|
||||||
|
|
||||||
if (!bot_can_summon_corpse) {
|
if (!bot_can_summon_corpse) {
|
||||||
@ -2878,7 +2878,7 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, CastingSlot slot, in
|
|||||||
ApplyHealthTransferDamage(this, target, spell_id);
|
ApplyHealthTransferDamage(this, target, spell_id);
|
||||||
|
|
||||||
//This needs to be here for bind sight to update correctly on client.
|
//This needs to be here for bind sight to update correctly on client.
|
||||||
if (IsClient() && IsEffectInSpell(spell_id, SE_BindSight)) {
|
if (IsClient() && IsEffectInSpell(spell_id, SpellEffect::BindSight)) {
|
||||||
for (int i = 0; i < GetMaxTotalSlots(); i++) {
|
for (int i = 0; i < GetMaxTotalSlots(); i++) {
|
||||||
if (buffs[i].spellid == spell_id) {
|
if (buffs[i].spellid == spell_id) {
|
||||||
CastToClient()->SendBuffNumHitPacket(buffs[i], i);//its hack, it works.
|
CastToClient()->SendBuffNumHitPacket(buffs[i], i);//its hack, it works.
|
||||||
@ -2911,7 +2911,7 @@ bool Mob::ApplyBardPulse(int32 spell_id, Mob *spell_target, CastingSlot slot) {
|
|||||||
Bard song charm that have no mana will continue to try and pulse on target, but will only reapply when charm fades.
|
Bard song charm that have no mana will continue to try and pulse on target, but will only reapply when charm fades.
|
||||||
Live does not spam client with do not take hold messages. Checking here avoids that from happening. Only try to reapply if charm fades.
|
Live does not spam client with do not take hold messages. Checking here avoids that from happening. Only try to reapply if charm fades.
|
||||||
*/
|
*/
|
||||||
if (spell_target->IsCharmed() && spells[spell_id].mana == 0 && spell_target->GetOwner() == this && IsEffectInSpell(spell_id, SE_Charm)) {
|
if (spell_target->IsCharmed() && spells[spell_id].mana == 0 && spell_target->GetOwner() == this && IsEffectInSpell(spell_id, SpellEffect::Charm)) {
|
||||||
if (IsClient()) {
|
if (IsClient()) {
|
||||||
CastToClient()->CheckSongSkillIncrease(spell_id);
|
CastToClient()->CheckSongSkillIncrease(spell_id);
|
||||||
}
|
}
|
||||||
@ -2992,7 +2992,7 @@ int Mob::CalcBuffDuration(Mob *caster, Mob *target, uint16 spell_id, int32 caste
|
|||||||
) &&
|
) &&
|
||||||
spell_id != SPELL_MINOR_ILLUSION &&
|
spell_id != SPELL_MINOR_ILLUSION &&
|
||||||
spell_id != SPELL_ILLUSION_TREE &&
|
spell_id != SPELL_ILLUSION_TREE &&
|
||||||
IsEffectInSpell(spell_id, SE_Illusion)
|
IsEffectInSpell(spell_id, SpellEffect::Illusion)
|
||||||
) {
|
) {
|
||||||
res = 10000; // ~16h override
|
res = 10000; // ~16h override
|
||||||
}
|
}
|
||||||
@ -3104,7 +3104,7 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spellbonuses.CompleteHealBuffBlocker && IsEffectInSpell(spellid2, SE_CompleteHeal)) {
|
if (spellbonuses.CompleteHealBuffBlocker && IsEffectInSpell(spellid2, SpellEffect::CompleteHeal)) {
|
||||||
Message(0, "You must wait before you can be affected by this spell again.");
|
Message(0, "You must wait before you can be affected by this spell again.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -3116,9 +3116,9 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsStackableDOT(spellid1) && !IsEffectInSpell(spellid1, SE_ManaBurn)) { // mana burn spells we need to use the stacking command blocks live actually checks those first, we should probably rework to that too
|
if (!IsStackableDOT(spellid1) && !IsEffectInSpell(spellid1, SpellEffect::ManaBurn)) { // mana burn spells we need to use the stacking command blocks live actually checks those first, we should probably rework to that too
|
||||||
if (caster_level1 > caster_level2) { // cur buff higher level than new
|
if (caster_level1 > caster_level2) { // cur buff higher level than new
|
||||||
if (IsEffectInSpell(spellid1, SE_ImprovedTaunt)) {
|
if (IsEffectInSpell(spellid1, SpellEffect::ImprovedTaunt)) {
|
||||||
LogSpells("SE_ImprovedTaunt level exception, overwriting");
|
LogSpells("SE_ImprovedTaunt level exception, overwriting");
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
@ -3162,12 +3162,12 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
|||||||
if (spellid1 != spellid2) {
|
if (spellid1 != spellid2) {
|
||||||
for (i = 0; i < EFFECT_COUNT; i++) {
|
for (i = 0; i < EFFECT_COUNT; i++) {
|
||||||
// we don't want this optimization for mana burns
|
// we don't want this optimization for mana burns
|
||||||
if (sp1.effect_id[i] != sp2.effect_id[i] || sp1.effect_id[i] == SE_ManaBurn) {
|
if (sp1.effect_id[i] != sp2.effect_id[i] || sp1.effect_id[i] == SpellEffect::ManaBurn) {
|
||||||
effect_match = false;
|
effect_match = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (IsEffectInSpell(spellid1, SE_ManaBurn)) {
|
} else if (IsEffectInSpell(spellid1, SpellEffect::ManaBurn)) {
|
||||||
LogSpells("We have a Mana Burn spell that is the same, they won't stack");
|
LogSpells("We have a Mana Burn spell that is the same, they won't stack");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -3181,7 +3181,7 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
|||||||
effect2 = sp2.effect_id[i];
|
effect2 = sp2.effect_id[i];
|
||||||
|
|
||||||
if (spellbonuses.Screech == 1) {
|
if (spellbonuses.Screech == 1) {
|
||||||
if (effect2 == SE_Screech && sp2.base_value[i] == -1) {
|
if (effect2 == SpellEffect::Screech && sp2.base_value[i] == -1) {
|
||||||
MessageString(Chat::SpellFailure, SCREECH_BUFF_BLOCK, sp2.name);
|
MessageString(Chat::SpellFailure, SCREECH_BUFF_BLOCK, sp2.name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -3194,32 +3194,32 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
|||||||
is not fully removed at the time of the trigger
|
is not fully removed at the time of the trigger
|
||||||
*/
|
*/
|
||||||
if (spellbonuses.AStacker[SBIndex::BUFFSTACKER_EXISTS]) {
|
if (spellbonuses.AStacker[SBIndex::BUFFSTACKER_EXISTS]) {
|
||||||
if ((effect2 == SE_AStacker) && (sp2.effect_id[i] <= spellbonuses.AStacker[SBIndex::BUFFSTACKER_VALUE]))
|
if ((effect2 == SpellEffect::AStacker) && (sp2.effect_id[i] <= spellbonuses.AStacker[SBIndex::BUFFSTACKER_VALUE]))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spellbonuses.BStacker[SBIndex::BUFFSTACKER_EXISTS]) {
|
if (spellbonuses.BStacker[SBIndex::BUFFSTACKER_EXISTS]) {
|
||||||
if ((effect2 == SE_BStacker) && (sp2.effect_id[i] <= spellbonuses.BStacker[SBIndex::BUFFSTACKER_VALUE]))
|
if ((effect2 == SpellEffect::BStacker) && (sp2.effect_id[i] <= spellbonuses.BStacker[SBIndex::BUFFSTACKER_VALUE]))
|
||||||
return -1;
|
return -1;
|
||||||
if ((effect2 == SE_AStacker) && (!IsCastOnFadeDurationSpell(spellid1) && buffs[buffslot].ticsremaining != 1 && IsEffectInSpell(spellid1, SE_BStacker)))
|
if ((effect2 == SpellEffect::AStacker) && (!IsCastOnFadeDurationSpell(spellid1) && buffs[buffslot].ticsremaining != 1 && IsEffectInSpell(spellid1, SpellEffect::BStacker)))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spellbonuses.CStacker[SBIndex::BUFFSTACKER_EXISTS]) {
|
if (spellbonuses.CStacker[SBIndex::BUFFSTACKER_EXISTS]) {
|
||||||
if ((effect2 == SE_CStacker) && (sp2.effect_id[i] <= spellbonuses.CStacker[SBIndex::BUFFSTACKER_VALUE]))
|
if ((effect2 == SpellEffect::CStacker) && (sp2.effect_id[i] <= spellbonuses.CStacker[SBIndex::BUFFSTACKER_VALUE]))
|
||||||
return -1;
|
return -1;
|
||||||
if ((effect2 == SE_BStacker) && (!IsCastOnFadeDurationSpell(spellid1) && buffs[buffslot].ticsremaining != 1 && IsEffectInSpell(spellid1, SE_CStacker)))
|
if ((effect2 == SpellEffect::BStacker) && (!IsCastOnFadeDurationSpell(spellid1) && buffs[buffslot].ticsremaining != 1 && IsEffectInSpell(spellid1, SpellEffect::CStacker)))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spellbonuses.DStacker[SBIndex::BUFFSTACKER_EXISTS]) {
|
if (spellbonuses.DStacker[SBIndex::BUFFSTACKER_EXISTS]) {
|
||||||
if ((effect2 == SE_DStacker) && (sp2.effect_id[i] <= spellbonuses.DStacker[SBIndex::BUFFSTACKER_VALUE]))
|
if ((effect2 == SpellEffect::DStacker) && (sp2.effect_id[i] <= spellbonuses.DStacker[SBIndex::BUFFSTACKER_VALUE]))
|
||||||
return -1;
|
return -1;
|
||||||
if ((effect2 == SE_CStacker) && (!IsCastOnFadeDurationSpell(spellid1) && buffs[buffslot].ticsremaining != 1 && IsEffectInSpell(spellid1, SE_DStacker)))
|
if ((effect2 == SpellEffect::CStacker) && (!IsCastOnFadeDurationSpell(spellid1) && buffs[buffslot].ticsremaining != 1 && IsEffectInSpell(spellid1, SpellEffect::DStacker)))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(effect2 == SE_StackingCommand_Overwrite)
|
if(effect2 == SpellEffect::StackingCommand_Overwrite)
|
||||||
{
|
{
|
||||||
overwrite_effect = sp2.base_value[i];
|
overwrite_effect = sp2.base_value[i];
|
||||||
overwrite_slot = sp2.formula[i] - 201; //they use base 1 for slots, we use base 0
|
overwrite_slot = sp2.formula[i] - 201; //they use base 1 for slots, we use base 0
|
||||||
@ -3247,7 +3247,7 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
|||||||
sp2.name, spellid2, overwrite_effect, overwrite_slot, overwrite_below_value);
|
sp2.name, spellid2, overwrite_effect, overwrite_slot, overwrite_below_value);
|
||||||
|
|
||||||
}
|
}
|
||||||
} else if (effect1 == SE_StackingCommand_Block)
|
} else if (effect1 == SpellEffect::StackingCommand_Block)
|
||||||
{
|
{
|
||||||
blocked_effect = sp1.base_value[i];
|
blocked_effect = sp1.base_value[i];
|
||||||
blocked_slot = sp1.formula[i] - 201;
|
blocked_slot = sp1.formula[i] - 201;
|
||||||
@ -3324,7 +3324,7 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
|||||||
// negative AC affects are skipped. Ex. Sun's Corona and Glacier Breath should stack
|
// negative AC affects are skipped. Ex. Sun's Corona and Glacier Breath should stack
|
||||||
// There may be more SPAs we need to add here ....
|
// There may be more SPAs we need to add here ....
|
||||||
// The client does just check base rather than calculating the affect change value.
|
// The client does just check base rather than calculating the affect change value.
|
||||||
if ((effect1 == SE_ArmorClass || effect1 == SE_ACv2) && sp2.base_value[i] < 0)
|
if ((effect1 == SpellEffect::ArmorClass || effect1 == SpellEffect::ACv2) && sp2.base_value[i] < 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -3332,13 +3332,13 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
|||||||
If Caster1 isn't the same as Caster2 and the effect is a DoT then ignore it.
|
If Caster1 isn't the same as Caster2 and the effect is a DoT then ignore it.
|
||||||
*/
|
*/
|
||||||
if(IsNPC() && caster1 && caster2 && caster1 != caster2) {
|
if(IsNPC() && caster1 && caster2 && caster1 != caster2) {
|
||||||
if(effect1 == SE_CurrentHP && sp1_detrimental && sp2_detrimental) {
|
if(effect1 == SpellEffect::CurrentHP && sp1_detrimental && sp2_detrimental) {
|
||||||
LogSpells("Both casters exist and are not the same, the effect is a detrimental dot, moving on");
|
LogSpells("Both casters exist and are not the same, the effect is a detrimental dot, moving on");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(effect1 == SE_CompleteHeal){ //SE_CompleteHeal never stacks or overwrites ever, always block.
|
if(effect1 == SpellEffect::CompleteHeal){ //SE_CompleteHeal never stacks or overwrites ever, always block.
|
||||||
LogSpells("Blocking spell because complete heal never stacks or overwries");
|
LogSpells("Blocking spell because complete heal never stacks or overwries");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
@ -3347,7 +3347,7 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
|||||||
If the spells aren't the same
|
If the spells aren't the same
|
||||||
and the effect is a dot we can go ahead and stack it
|
and the effect is a dot we can go ahead and stack it
|
||||||
*/
|
*/
|
||||||
if(effect1 == SE_CurrentHP && spellid1 != spellid2 && sp1_detrimental && sp2_detrimental) {
|
if(effect1 == SpellEffect::CurrentHP && spellid1 != spellid2 && sp1_detrimental && sp2_detrimental) {
|
||||||
LogSpells("The spells are not the same and it is a detrimental dot, passing");
|
LogSpells("The spells are not the same and it is a detrimental dot, passing");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -3356,7 +3356,7 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
|||||||
sp2_value = CalcSpellEffectValue(spellid2, i, caster_level2);
|
sp2_value = CalcSpellEffectValue(spellid2, i, caster_level2);
|
||||||
|
|
||||||
// Spells like SoW won't stack if a snare effect is already in place.
|
// Spells like SoW won't stack if a snare effect is already in place.
|
||||||
if (effect2 == SE_MovementSpeed && effect1 == SE_MovementSpeed) {
|
if (effect2 == SpellEffect::MovementSpeed && effect1 == SpellEffect::MovementSpeed) {
|
||||||
if (sp1_value < 0 && sp2_value > 0) {
|
if (sp1_value < 0 && sp2_value > 0) {
|
||||||
return -1;
|
return -1;
|
||||||
} else if (sp2_value < 0 && sp1_value > 0) {
|
} else if (sp2_value < 0 && sp1_value > 0) {
|
||||||
@ -3366,7 +3366,7 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
|||||||
|
|
||||||
// DoTs won't overwrite regeneration but will block regeneration spells.
|
// DoTs won't overwrite regeneration but will block regeneration spells.
|
||||||
if (spells[spellid1].buff_duration > 0 && spells[spellid2].buff_duration > 0 &&
|
if (spells[spellid1].buff_duration > 0 && spells[spellid2].buff_duration > 0 &&
|
||||||
effect1 == SE_CurrentHP && effect2 == SE_CurrentHP) {
|
effect1 == SpellEffect::CurrentHP && effect2 == SpellEffect::CurrentHP) {
|
||||||
if (!sp1_detrimental && sp2_detrimental) {
|
if (!sp1_detrimental && sp2_detrimental) {
|
||||||
continue;
|
continue;
|
||||||
} else if (sp1_detrimental && !sp2_detrimental) {
|
} else if (sp1_detrimental && !sp2_detrimental) {
|
||||||
@ -3378,8 +3378,8 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
|||||||
// have a value that's a percentage for instance
|
// have a value that's a percentage for instance
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
effect1 == SE_AttackSpeed ||
|
effect1 == SpellEffect::AttackSpeed ||
|
||||||
effect1 == SE_AttackSpeed2
|
effect1 == SpellEffect::AttackSpeed2
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
sp1_value -= 100;
|
sp1_value -= 100;
|
||||||
@ -3929,7 +3929,7 @@ bool Mob::SpellOnTarget(
|
|||||||
IsDetrimentalSpell(spell_id) &&
|
IsDetrimentalSpell(spell_id) &&
|
||||||
!IsAttackAllowed(spelltar, true) &&
|
!IsAttackAllowed(spelltar, true) &&
|
||||||
!IsResurrectionEffects(spell_id) &&
|
!IsResurrectionEffects(spell_id) &&
|
||||||
!IsEffectInSpell(spell_id, SE_BindSight)
|
!IsEffectInSpell(spell_id, SpellEffect::BindSight)
|
||||||
) {
|
) {
|
||||||
if (!IsClient() || !CastToClient()->GetGM()) {
|
if (!IsClient() || !CastToClient()->GetGM()) {
|
||||||
MessageString(Chat::SpellFailure, SPELL_NO_HOLD);
|
MessageString(Chat::SpellFailure, SPELL_NO_HOLD);
|
||||||
@ -3997,7 +3997,7 @@ bool Mob::SpellOnTarget(
|
|||||||
// select target
|
// select target
|
||||||
uint16 target_id = 0;
|
uint16 target_id = 0;
|
||||||
|
|
||||||
if (IsEffectInSpell(spell_id, SE_BindSight)) {
|
if (IsEffectInSpell(spell_id, SpellEffect::BindSight)) {
|
||||||
action->target = GetID();
|
action->target = GetID();
|
||||||
target_id = GetID();
|
target_id = GetID();
|
||||||
} else {
|
} else {
|
||||||
@ -4151,7 +4151,7 @@ bool Mob::SpellOnTarget(
|
|||||||
// Not sure if all 3 should be stacking
|
// Not sure if all 3 should be stacking
|
||||||
//This is not live like behavior (~Kayen confirmed 2/2/22)
|
//This is not live like behavior (~Kayen confirmed 2/2/22)
|
||||||
if (!RuleB(Spells, AllowDoubleInvis) && !IsActiveBardSong(spell_id)) {
|
if (!RuleB(Spells, AllowDoubleInvis) && !IsActiveBardSong(spell_id)) {
|
||||||
if (IsEffectInSpell(spell_id, SE_Invisibility)) {
|
if (IsEffectInSpell(spell_id, SpellEffect::Invisibility)) {
|
||||||
if (spelltar->invisible) {
|
if (spelltar->invisible) {
|
||||||
spelltar->MessageString(Chat::SpellFailure, ALREADY_INVIS, GetCleanName());
|
spelltar->MessageString(Chat::SpellFailure, ALREADY_INVIS, GetCleanName());
|
||||||
safe_delete(action_packet);
|
safe_delete(action_packet);
|
||||||
@ -4159,7 +4159,7 @@ bool Mob::SpellOnTarget(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsEffectInSpell(spell_id, SE_InvisVsUndead)) {
|
if (IsEffectInSpell(spell_id, SpellEffect::InvisVsUndead)) {
|
||||||
if (spelltar->invisible_undead) {
|
if (spelltar->invisible_undead) {
|
||||||
spelltar->MessageString(Chat::SpellFailure, ALREADY_INVIS, GetCleanName());
|
spelltar->MessageString(Chat::SpellFailure, ALREADY_INVIS, GetCleanName());
|
||||||
safe_delete(action_packet);
|
safe_delete(action_packet);
|
||||||
@ -4167,7 +4167,7 @@ bool Mob::SpellOnTarget(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsEffectInSpell(spell_id, SE_InvisVsAnimals)) {
|
if (IsEffectInSpell(spell_id, SpellEffect::InvisVsAnimals)) {
|
||||||
if (spelltar->invisible_animals) {
|
if (spelltar->invisible_animals) {
|
||||||
spelltar->MessageString(Chat::SpellFailure, ALREADY_INVIS, GetCleanName());
|
spelltar->MessageString(Chat::SpellFailure, ALREADY_INVIS, GetCleanName());
|
||||||
safe_delete(action_packet);
|
safe_delete(action_packet);
|
||||||
@ -4276,7 +4276,7 @@ bool Mob::SpellOnTarget(
|
|||||||
} else if (
|
} else if (
|
||||||
!IsAttackAllowed(spelltar, true) &&
|
!IsAttackAllowed(spelltar, true) &&
|
||||||
!IsResurrectionEffects(spell_id) &&
|
!IsResurrectionEffects(spell_id) &&
|
||||||
!IsEffectInSpell(spell_id, SE_BindSight)
|
!IsEffectInSpell(spell_id, SpellEffect::BindSight)
|
||||||
) { // Detrimental spells - PVP check
|
) { // Detrimental spells - PVP check
|
||||||
LogSpells(
|
LogSpells(
|
||||||
"Detrimental spell [{}] can't take hold [{}] -> [{}]",
|
"Detrimental spell [{}] can't take hold [{}] -> [{}]",
|
||||||
@ -4334,7 +4334,7 @@ bool Mob::SpellOnTarget(
|
|||||||
int buff_count = GetMaxTotalSlots();
|
int buff_count = GetMaxTotalSlots();
|
||||||
int focus = 0;
|
int focus = 0;
|
||||||
for (int b = 0; b < buff_count; b++) {
|
for (int b = 0; b < buff_count; b++) {
|
||||||
if (IsEffectInSpell(buffs[b].spellid, SE_BlockNextSpellFocus)) {
|
if (IsEffectInSpell(buffs[b].spellid, SpellEffect::BlockNextSpellFocus)) {
|
||||||
focus = CalcFocusEffect(focusBlockNextSpell, buffs[b].spellid, spell_id);
|
focus = CalcFocusEffect(focusBlockNextSpell, buffs[b].spellid, spell_id);
|
||||||
if (focus) {
|
if (focus) {
|
||||||
CheckNumHitsRemaining(NumHit::MatchingSpells, b);
|
CheckNumHitsRemaining(NumHit::MatchingSpells, b);
|
||||||
@ -4629,7 +4629,7 @@ bool Mob::SpellOnTarget(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check SE_Fc_Cast_Spell_On_Land SPA 481 on target, if hit by this spell and Conditions are Met then target will cast the specified spell.
|
//Check SpellEffect::Fc_Cast_Spell_On_Land SPA 481 on target, if hit by this spell and Conditions are Met then target will cast the specified spell.
|
||||||
if (spelltar) {
|
if (spelltar) {
|
||||||
spelltar->CastSpellOnLand(this, spell_id);
|
spelltar->CastSpellOnLand(this, spell_id);
|
||||||
}
|
}
|
||||||
@ -4677,11 +4677,11 @@ bool Mob::SpellOnTarget(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spelltar->IsClient() && IsEffectInSpell(spell_id, SE_ShadowStep)) {
|
if (spelltar->IsClient() && IsEffectInSpell(spell_id, SpellEffect::ShadowStep)) {
|
||||||
spelltar->CastToClient()->cheat_manager.SetExemptStatus(ShadowStep, true);
|
spelltar->CastToClient()->cheat_manager.SetExemptStatus(ShadowStep, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsEffectInSpell(spell_id, SE_BindAffinity)) {
|
if (!IsEffectInSpell(spell_id, SpellEffect::BindAffinity)) {
|
||||||
if (spelltar != this && spelltar->IsClient()) {// send to target
|
if (spelltar != this && spelltar->IsClient()) {// send to target
|
||||||
spelltar->CastToClient()->QueuePacket(action_packet);
|
spelltar->CastToClient()->QueuePacket(action_packet);
|
||||||
}
|
}
|
||||||
@ -4704,7 +4704,7 @@ bool Mob::SpellOnTarget(
|
|||||||
|
|
||||||
if (
|
if (
|
||||||
!IsLifetapSpell(spell_id) &&
|
!IsLifetapSpell(spell_id) &&
|
||||||
!IsEffectInSpell(spell_id, SE_BindAffinity) &&
|
!IsEffectInSpell(spell_id, SpellEffect::BindAffinity) &&
|
||||||
!IsAENukeSpell(spell_id) &&
|
!IsAENukeSpell(spell_id) &&
|
||||||
!IsDamageSpell(spell_id)
|
!IsDamageSpell(spell_id)
|
||||||
) {
|
) {
|
||||||
@ -4727,7 +4727,7 @@ bool Mob::SpellOnTarget(
|
|||||||
However due to server thinking your healed, you are unable to correct it by healing.
|
However due to server thinking your healed, you are unable to correct it by healing.
|
||||||
Solution: You need to resend the HP update after buff completed and action packet resent.
|
Solution: You need to resend the HP update after buff completed and action packet resent.
|
||||||
*/
|
*/
|
||||||
if ((IsEffectInSpell(spell_id, SE_TotalHP) || IsEffectInSpell(spell_id, SE_MaxHPChange)) && (IsEffectInSpell(spell_id, SE_CurrentHPOnce) || IsEffectInSpell(spell_id, SE_CurrentHP))) {
|
if ((IsEffectInSpell(spell_id, SpellEffect::TotalHP) || IsEffectInSpell(spell_id, SpellEffect::MaxHPChange)) && (IsEffectInSpell(spell_id, SpellEffect::CurrentHPOnce) || IsEffectInSpell(spell_id, SpellEffect::CurrentHP))) {
|
||||||
SendHPUpdate(true);
|
SendHPUpdate(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5096,7 +5096,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check max level for spell
|
// check max level for spell
|
||||||
effect_index = GetSpellEffectIndex(spell_id, SE_Mez);
|
effect_index = GetSpellEffectIndex(spell_id, SpellEffect::Mez);
|
||||||
assert(effect_index >= 0);
|
assert(effect_index >= 0);
|
||||||
// NPCs get to ignore the max level
|
// NPCs get to ignore the max level
|
||||||
if((GetLevel() > spells[spell_id].max_value[effect_index]) &&
|
if((GetLevel() > spells[spell_id].max_value[effect_index]) &&
|
||||||
@ -5110,7 +5110,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// slow and haste spells
|
// slow and haste spells
|
||||||
if(GetSpecialAbility(SpecialAbility::SlowImmunity) && IsEffectInSpell(spell_id, SE_AttackSpeed))
|
if(GetSpecialAbility(SpecialAbility::SlowImmunity) && IsEffectInSpell(spell_id, SpellEffect::AttackSpeed))
|
||||||
{
|
{
|
||||||
LogSpells("We are immune to Slow spells");
|
LogSpells("We are immune to Slow spells");
|
||||||
caster->MessageString(Chat::Red, IMMUNE_ATKSPEED);
|
caster->MessageString(Chat::Red, IMMUNE_ATKSPEED);
|
||||||
@ -5124,9 +5124,9 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// client vs client fear
|
// client vs client fear
|
||||||
if(IsEffectInSpell(spell_id, SE_Fear))
|
if(IsEffectInSpell(spell_id, SpellEffect::Fear))
|
||||||
{
|
{
|
||||||
effect_index = GetSpellEffectIndex(spell_id, SE_Fear);
|
effect_index = GetSpellEffectIndex(spell_id, SpellEffect::Fear);
|
||||||
if(GetSpecialAbility(SpecialAbility::FearImmunity)) {
|
if(GetSpecialAbility(SpecialAbility::FearImmunity)) {
|
||||||
LogSpells("We are immune to Fear spells");
|
LogSpells("We are immune to Fear spells");
|
||||||
caster->MessageString(Chat::Red, IMMUNE_FEAR); // need to verify message type, not in MQ2Cast for easy look up
|
caster->MessageString(Chat::Red, IMMUNE_FEAR); // need to verify message type, not in MQ2Cast for easy look up
|
||||||
@ -5190,7 +5190,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
|
|||||||
if(!caster->IsNPC())
|
if(!caster->IsNPC())
|
||||||
{
|
{
|
||||||
// check level limit of charm spell
|
// check level limit of charm spell
|
||||||
effect_index = GetSpellEffectIndex(spell_id, SE_Charm);
|
effect_index = GetSpellEffectIndex(spell_id, SpellEffect::Charm);
|
||||||
assert(effect_index >= 0);
|
assert(effect_index >= 0);
|
||||||
if(GetLevel() > spells[spell_id].max_value[effect_index] && spells[spell_id].max_value[effect_index] != 0)
|
if(GetLevel() > spells[spell_id].max_value[effect_index] && spells[spell_id].max_value[effect_index] != 0)
|
||||||
{
|
{
|
||||||
@ -5211,8 +5211,8 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
|
|||||||
|
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
IsEffectInSpell(spell_id, SE_Root) ||
|
IsEffectInSpell(spell_id, SpellEffect::Root) ||
|
||||||
IsEffectInSpell(spell_id, SE_MovementSpeed)
|
IsEffectInSpell(spell_id, SpellEffect::MovementSpeed)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if(GetSpecialAbility(SpecialAbility::SnareImmunity)) {
|
if(GetSpecialAbility(SpecialAbility::SnareImmunity)) {
|
||||||
|
|||||||
@ -466,12 +466,12 @@ void Mob::TuneGetAvoidanceByHitChance(Mob* defender, Mob *attacker, float hit_ch
|
|||||||
|
|
||||||
if (loop_add_avoid >= 0) {
|
if (loop_add_avoid >= 0) {
|
||||||
Message(0, "[#Tune] OPTION1: MODIFY Client Heroic AGI or Avoidance Mod2 stat by [+ %i ]", loop_add_avoid);
|
Message(0, "[#Tune] OPTION1: MODIFY Client Heroic AGI or Avoidance Mod2 stat by [+ %i ]", loop_add_avoid);
|
||||||
Message(0, "[#Tune] OPTION2: Give CLIENT an evasion bonus using SPA 172 Evasion SE_AvoidMeleeChance from (spells/items/aa) of [+ %i pct ]", evasion_bonus);
|
Message(0, "[#Tune] OPTION2: Give CLIENT an evasion bonus using SPA 172 Evasion SpellEffect::AvoidMeleeChance from (spells/items/aa) of [+ %i pct ]", evasion_bonus);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Message(0, "[#Tune] OPTION1: MODIFY Client Heroic AGI or Avoidance Mod2 stat by [ %i ]", loop_add_avoid);
|
Message(0, "[#Tune] OPTION1: MODIFY Client Heroic AGI or Avoidance Mod2 stat by [ %i ]", loop_add_avoid);
|
||||||
Message(0, "[#Tune] OPTION2: Give CLIENT an evasion bonus using SPA 172 Evasion SE_AvoidMeleeChance from (spells/items/aa) of [ %i pct ]", evasion_bonus);
|
Message(0, "[#Tune] OPTION2: Give CLIENT an evasion bonus using SPA 172 Evasion SpellEffect::AvoidMeleeChance from (spells/items/aa) of [ %i pct ]", evasion_bonus);
|
||||||
}
|
}
|
||||||
|
|
||||||
Message(0, "###################COMPLETE###################");
|
Message(0, "###################COMPLETE###################");
|
||||||
@ -1283,7 +1283,7 @@ int64 Mob::Tunecompute_tohit(EQ::skills::SkillType skillinuse, int accuracy_over
|
|||||||
// return -1 in cases that always hit
|
// return -1 in cases that always hit
|
||||||
int64 Mob::TuneGetTotalToHit(EQ::skills::SkillType skill, int chance_mod, int accuracy_override, int add_accuracy)
|
int64 Mob::TuneGetTotalToHit(EQ::skills::SkillType skill, int chance_mod, int accuracy_override, int add_accuracy)
|
||||||
{
|
{
|
||||||
if (chance_mod >= 10000) // override for stuff like SE_SkillAttack
|
if (chance_mod >= 10000) // override for stuff like SpellEffect::SkillAttack
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
// calculate attacker's accuracy
|
// calculate attacker's accuracy
|
||||||
@ -1313,7 +1313,7 @@ int64 Mob::TuneGetTotalToHit(EQ::skills::SkillType skill, int chance_mod, int ac
|
|||||||
if (atkhit_bonus)
|
if (atkhit_bonus)
|
||||||
accuracy += round(static_cast<double>(accuracy) * static_cast<double>(atkhit_bonus) * 0.0001);
|
accuracy += round(static_cast<double>(accuracy) * static_cast<double>(atkhit_bonus) * 0.0001);
|
||||||
|
|
||||||
// 216 Melee Accuracy Amt aka SE_Accuracy -- flat bonus
|
// 216 Melee Accuracy Amt aka SpellEffect::Accuracy -- flat bonus
|
||||||
accuracy += itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
accuracy += itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
||||||
aabonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
aabonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
||||||
spellbonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
spellbonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
||||||
@ -1335,7 +1335,7 @@ int64 Mob::TuneGetTotalToHit(EQ::skills::SkillType skill, int chance_mod, int ac
|
|||||||
if (spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] >= 10000)
|
if (spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] >= 10000)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
// 184 Accuracy % aka SE_HitChance -- percentage increase
|
// 184 Accuracy % aka SpellEffect::HitChance -- percentage increase
|
||||||
auto hit_bonus = itembonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
auto hit_bonus = itembonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
||||||
aabonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
aabonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
||||||
spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
||||||
@ -1360,15 +1360,15 @@ int64 Mob::TuneGetTotalDefense(int avoidance_override, int add_avoidance)
|
|||||||
if (evasion_bonus >= 10000)
|
if (evasion_bonus >= 10000)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
// 515 SE_AC_Avoidance_Max_Percent
|
// 515 SpellEffect::AC_Avoidance_Max_Percent
|
||||||
auto ac_aviodance_bonus = itembonuses.AC_Avoidance_Max_Percent + aabonuses.AC_Avoidance_Max_Percent + spellbonuses.AC_Avoidance_Max_Percent;
|
auto ac_aviodance_bonus = itembonuses.AC_Avoidance_Max_Percent + aabonuses.AC_Avoidance_Max_Percent + spellbonuses.AC_Avoidance_Max_Percent;
|
||||||
if (ac_aviodance_bonus)
|
if (ac_aviodance_bonus)
|
||||||
avoidance += round(static_cast<double>(avoidance) * static_cast<double>(ac_aviodance_bonus) * 0.0001);
|
avoidance += round(static_cast<double>(avoidance) * static_cast<double>(ac_aviodance_bonus) * 0.0001);
|
||||||
|
|
||||||
// 172 Evasion aka SE_AvoidMeleeChance
|
// 172 Evasion aka SpellEffect::AvoidMeleeChance
|
||||||
evasion_bonus += itembonuses.AvoidMeleeChanceEffect + aabonuses.AvoidMeleeChanceEffect; // item bonus here isn't mod2 avoidance
|
evasion_bonus += itembonuses.AvoidMeleeChanceEffect + aabonuses.AvoidMeleeChanceEffect; // item bonus here isn't mod2 avoidance
|
||||||
|
|
||||||
// 215 Pet Avoidance % aka SE_PetAvoidance
|
// 215 Pet Avoidance % aka SpellEffect::PetAvoidance
|
||||||
evasion_bonus += GetPetAvoidanceBonusFromOwner();
|
evasion_bonus += GetPetAvoidanceBonusFromOwner();
|
||||||
|
|
||||||
// Evasion is a percentage bonus according to AA descriptions
|
// Evasion is a percentage bonus according to AA descriptions
|
||||||
@ -1410,7 +1410,7 @@ int64 Mob::Tunecompute_defense(int avoidance_override, int add_avoidance)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//516 SE_AC_Mitigation_Max_Percent
|
//516 SpellEffect::AC_Mitigation_Max_Percent
|
||||||
auto ac_bonus = itembonuses.AC_Mitigation_Max_Percent + aabonuses.AC_Mitigation_Max_Percent + spellbonuses.AC_Mitigation_Max_Percent;
|
auto ac_bonus = itembonuses.AC_Mitigation_Max_Percent + aabonuses.AC_Mitigation_Max_Percent + spellbonuses.AC_Mitigation_Max_Percent;
|
||||||
if (ac_bonus) {
|
if (ac_bonus) {
|
||||||
defense += round(static_cast<double>(defense) * static_cast<double>(ac_bonus) * 0.0001);
|
defense += round(static_cast<double>(defense) * static_cast<double>(ac_bonus) * 0.0001);
|
||||||
|
|||||||
@ -957,7 +957,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
|
|||||||
|
|
||||||
LogSpells("[WorldServer::HandleMessage] Found corpse. Marking corpse as rezzed if needed");
|
LogSpells("[WorldServer::HandleMessage] Found corpse. Marking corpse as rezzed if needed");
|
||||||
// I don't know why Rezzed is not set to true in CompleteRezz().
|
// I don't know why Rezzed is not set to true in CompleteRezz().
|
||||||
if (!IsEffectInSpell(srs->rez.spellid, SE_SummonToCorpse)) {
|
if (!IsEffectInSpell(srs->rez.spellid, SpellEffect::SummonToCorpse)) {
|
||||||
corpse->IsRezzed(true);
|
corpse->IsRezzed(true);
|
||||||
corpse->CompleteResurrection();
|
corpse->CompleteResurrection();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3009,12 +3009,12 @@ void ZoneDatabase::LoadBuffs(Client *client)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsEffectInSpell(buffs[slot_id].spellid, SE_Charm)) {
|
if (IsEffectInSpell(buffs[slot_id].spellid, SpellEffect::Charm)) {
|
||||||
buffs[slot_id].spellid = SPELL_UNKNOWN;
|
buffs[slot_id].spellid = SPELL_UNKNOWN;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsEffectInSpell(buffs[slot_id].spellid, SE_Illusion)) {
|
if (IsEffectInSpell(buffs[slot_id].spellid, SpellEffect::Illusion)) {
|
||||||
if (buffs[slot_id].persistant_buff) {
|
if (buffs[slot_id].persistant_buff) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user