mirror of
https://github.com/mangosfour/server.git
synced 2025-12-18 01:37:01 +00:00
[7156] More generic periodic aura work
Implement SPELL_AURA_PERIODIC_HEALTH_FUNNEL Apply SPELL_AURA_PERIODIC_HEALTH_FUNNEL mod to aura periodic time Add support SPELL_ATTR_EX5_START_PERIODIC_AT_APPLY flag Apply duration mod to channeling spells Fix mage 44401 and correct drop its charge Signed-off-by: DiSlord <dislord@nomail.com>
This commit is contained in:
parent
fbe212d359
commit
3f4821acfb
8 changed files with 143 additions and 229 deletions
|
|
@ -22,7 +22,7 @@
|
||||||
DROP TABLE IF EXISTS `db_version`;
|
DROP TABLE IF EXISTS `db_version`;
|
||||||
CREATE TABLE `db_version` (
|
CREATE TABLE `db_version` (
|
||||||
`version` varchar(120) default NULL,
|
`version` varchar(120) default NULL,
|
||||||
`required_7150_01_mangos_playercreateinfo_spell` bit(1) default NULL
|
`required_7156_01_mangos_spell_proc_event` bit(1) default NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -16862,6 +16862,7 @@ INSERT INTO `spell_proc_event` VALUES
|
||||||
(44394, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
|
(44394, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
|
||||||
(44395, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
|
(44395, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
|
||||||
(44396, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
|
(44396, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
|
||||||
|
(44401, 0x00000000, 3, 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00000FFF, 0.000000, 0.000000, 0),
|
||||||
(44404, 0x00000000, 3, 0x20000021, 0x00009000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(44404, 0x00000000, 3, 0x20000021, 0x00009000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(44445, 0x00000000, 3, 0x00000013, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(44445, 0x00000000, 3, 0x00000013, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
(44446, 0x00000000, 3, 0x00000013, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
(44446, 0x00000000, 3, 0x00000013, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
|
||||||
|
|
|
||||||
5
sql/updates/7156_01_mangos_spell_proc_event.sql
Normal file
5
sql/updates/7156_01_mangos_spell_proc_event.sql
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
ALTER TABLE db_version CHANGE COLUMN required_7150_01_mangos_playercreateinfo_spell required_7156_01_mangos_spell_proc_event bit;
|
||||||
|
|
||||||
|
-- (44401) Missile Barrage ()
|
||||||
|
DELETE FROM `spell_proc_event` WHERE `entry` IN (44401);
|
||||||
|
INSERT INTO `spell_proc_event` VALUES (44401, 0x00, 3, 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00000FFF, 0.000000, 0.000000, 0);
|
||||||
|
|
@ -149,6 +149,7 @@ pkgdata_DATA = \
|
||||||
7147_01_mangos_creature_template.sql \
|
7147_01_mangos_creature_template.sql \
|
||||||
7149_01_mangos_spell_proc_event.sql \
|
7149_01_mangos_spell_proc_event.sql \
|
||||||
7150_01_mangos_playercreateinfo_spell.sql \
|
7150_01_mangos_playercreateinfo_spell.sql \
|
||||||
|
7156_01_mangos_spell_proc_event.sql \
|
||||||
README
|
README
|
||||||
|
|
||||||
## Additional files to include when running 'make dist'
|
## Additional files to include when running 'make dist'
|
||||||
|
|
@ -278,4 +279,5 @@ EXTRA_DIST = \
|
||||||
7147_01_mangos_creature_template.sql \
|
7147_01_mangos_creature_template.sql \
|
||||||
7149_01_mangos_spell_proc_event.sql \
|
7149_01_mangos_spell_proc_event.sql \
|
||||||
7150_01_mangos_playercreateinfo_spell.sql \
|
7150_01_mangos_playercreateinfo_spell.sql \
|
||||||
|
7156_01_mangos_spell_proc_event.sql \
|
||||||
README
|
README
|
||||||
|
|
|
||||||
|
|
@ -383,7 +383,7 @@ enum ItemQualities
|
||||||
#define SPELL_ATTR_EX5_UNK6 0x00000040 // 6
|
#define SPELL_ATTR_EX5_UNK6 0x00000040 // 6
|
||||||
#define SPELL_ATTR_EX5_UNK7 0x00000080 // 7
|
#define SPELL_ATTR_EX5_UNK7 0x00000080 // 7
|
||||||
#define SPELL_ATTR_EX5_UNK8 0x00000100 // 8
|
#define SPELL_ATTR_EX5_UNK8 0x00000100 // 8
|
||||||
#define SPELL_ATTR_EX5_UNK9 0x00000200 // 9
|
#define SPELL_ATTR_EX5_START_PERIODIC_AT_APPLY 0x00000200 // 9 begin periodic tick at aura apply
|
||||||
#define SPELL_ATTR_EX5_UNK10 0x00000400 // 10
|
#define SPELL_ATTR_EX5_UNK10 0x00000400 // 10
|
||||||
#define SPELL_ATTR_EX5_UNK11 0x00000800 // 11
|
#define SPELL_ATTR_EX5_UNK11 0x00000800 // 11
|
||||||
#define SPELL_ATTR_EX5_UNK12 0x00001000 // 12
|
#define SPELL_ATTR_EX5_UNK12 0x00001000 // 12
|
||||||
|
|
|
||||||
|
|
@ -2263,6 +2263,9 @@ void Spell::handle_immediate()
|
||||||
int32 duration = GetSpellDuration(m_spellInfo);
|
int32 duration = GetSpellDuration(m_spellInfo);
|
||||||
if (duration)
|
if (duration)
|
||||||
{
|
{
|
||||||
|
// Apply duration mod
|
||||||
|
if(Player* modOwner = m_caster->GetSpellModOwner())
|
||||||
|
modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DURATION, duration);
|
||||||
m_spellState = SPELL_STATE_CASTING;
|
m_spellState = SPELL_STATE_CASTING;
|
||||||
SendChannelStart(duration);
|
SendChannelStart(duration);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -112,7 +112,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
|
||||||
&Aura::HandleNoImmediateEffect, // 59 SPELL_AURA_MOD_DAMAGE_DONE_CREATURE implemented in Unit::MeleeDamageBonus and Unit::SpellDamageBonus
|
&Aura::HandleNoImmediateEffect, // 59 SPELL_AURA_MOD_DAMAGE_DONE_CREATURE implemented in Unit::MeleeDamageBonus and Unit::SpellDamageBonus
|
||||||
&Aura::HandleAuraModPacifyAndSilence, // 60 SPELL_AURA_MOD_PACIFY_SILENCE
|
&Aura::HandleAuraModPacifyAndSilence, // 60 SPELL_AURA_MOD_PACIFY_SILENCE
|
||||||
&Aura::HandleAuraModScale, // 61 SPELL_AURA_MOD_SCALE
|
&Aura::HandleAuraModScale, // 61 SPELL_AURA_MOD_SCALE
|
||||||
&Aura::HandleNULL, // 62 SPELL_AURA_PERIODIC_HEALTH_FUNNEL
|
&Aura::HandlePeriodicHealthFunnel, // 62 SPELL_AURA_PERIODIC_HEALTH_FUNNEL
|
||||||
&Aura::HandleUnused, // 63 SPELL_AURA_PERIODIC_MANA_FUNNEL obsolete?
|
&Aura::HandleUnused, // 63 SPELL_AURA_PERIODIC_MANA_FUNNEL obsolete?
|
||||||
&Aura::HandlePeriodicManaLeech, // 64 SPELL_AURA_PERIODIC_MANA_LEECH
|
&Aura::HandlePeriodicManaLeech, // 64 SPELL_AURA_PERIODIC_MANA_LEECH
|
||||||
&Aura::HandleModCastingSpeed, // 65 SPELL_AURA_MOD_CASTING_SPEED
|
&Aura::HandleModCastingSpeed, // 65 SPELL_AURA_MOD_CASTING_SPEED
|
||||||
|
|
@ -405,14 +405,19 @@ m_updated(false), m_isRemovedOnShapeLost(true), m_in_use(false)
|
||||||
|
|
||||||
m_duration = m_maxduration;
|
m_duration = m_maxduration;
|
||||||
|
|
||||||
if(modOwner)
|
|
||||||
modOwner->ApplySpellMod(GetId(), SPELLMOD_ACTIVATION_TIME, m_periodicTimer);
|
|
||||||
|
|
||||||
sLog.outDebug("Aura: construct Spellid : %u, Aura : %u Duration : %d Target : %d Damage : %d", m_spellProto->Id, m_spellProto->EffectApplyAuraName[eff], m_maxduration, m_spellProto->EffectImplicitTargetA[eff],damage);
|
sLog.outDebug("Aura: construct Spellid : %u, Aura : %u Duration : %d Target : %d Damage : %d", m_spellProto->Id, m_spellProto->EffectApplyAuraName[eff], m_maxduration, m_spellProto->EffectImplicitTargetA[eff],damage);
|
||||||
|
|
||||||
m_effIndex = eff;
|
m_effIndex = eff;
|
||||||
SetModifier(AuraType(m_spellProto->EffectApplyAuraName[eff]), damage, m_spellProto->EffectAmplitude[eff], m_spellProto->EffectMiscValue[eff]);
|
SetModifier(AuraType(m_spellProto->EffectApplyAuraName[eff]), damage, m_spellProto->EffectAmplitude[eff], m_spellProto->EffectMiscValue[eff]);
|
||||||
|
|
||||||
|
// Apply periodic time mod
|
||||||
|
if(modOwner && m_modifier.periodictime)
|
||||||
|
modOwner->ApplySpellMod(GetId(), SPELLMOD_ACTIVATION_TIME, m_modifier.periodictime);
|
||||||
|
|
||||||
|
// Start periodic on next tick or at aura apply
|
||||||
|
if (!(m_spellProto->AttributesEx5 & SPELL_ATTR_EX5_START_PERIODIC_AT_APPLY))
|
||||||
|
m_periodicTimer += m_modifier.periodictime;
|
||||||
|
|
||||||
m_isDeathPersist = IsDeathPersistentSpell(m_spellProto);
|
m_isDeathPersist = IsDeathPersistentSpell(m_spellProto);
|
||||||
|
|
||||||
m_procCharges = m_spellProto->procCharges;
|
m_procCharges = m_spellProto->procCharges;
|
||||||
|
|
@ -606,18 +611,8 @@ void Aura::Update(uint32 diff)
|
||||||
if(m_isPeriodic && (m_duration >= 0 || m_isPassive || m_permanent))
|
if(m_isPeriodic && (m_duration >= 0 || m_isPassive || m_permanent))
|
||||||
{
|
{
|
||||||
m_periodicTimer -= diff;
|
m_periodicTimer -= diff;
|
||||||
if(m_periodicTimer <= 0) // tick also at m_periodicTimer==0 to prevent lost last tick in case max m_duration == (max m_periodicTimer)*N
|
if(m_periodicTimer <= 0) // tick also at m_periodicTimer==0 to prevent lost last tick in case max m_duration == (max m_periodicTimer)*N
|
||||||
{
|
{
|
||||||
if( m_modifier.m_auraname == SPELL_AURA_MOD_REGEN ||
|
|
||||||
m_modifier.m_auraname == SPELL_AURA_MOD_POWER_REGEN ||
|
|
||||||
// Cannibalize, eating items and other spells
|
|
||||||
m_modifier.m_auraname == SPELL_AURA_OBS_MOD_HEALTH ||
|
|
||||||
// Eating items and other spells
|
|
||||||
m_modifier.m_auraname == SPELL_AURA_OBS_MOD_MANA )
|
|
||||||
{
|
|
||||||
ApplyModifier(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// update before applying (aura can be removed in TriggerSpell or PeriodicTick calls)
|
// update before applying (aura can be removed in TriggerSpell or PeriodicTick calls)
|
||||||
m_periodicTimer += m_modifier.periodictime;
|
m_periodicTimer += m_modifier.periodictime;
|
||||||
PeriodicTick();
|
PeriodicTick();
|
||||||
|
|
@ -923,19 +918,6 @@ void Aura::_AddAura()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// not call total regen auras at adding
|
|
||||||
switch (m_modifier.m_auraname)
|
|
||||||
{
|
|
||||||
case SPELL_AURA_OBS_MOD_HEALTH:
|
|
||||||
case SPELL_AURA_OBS_MOD_MANA:
|
|
||||||
m_periodicTimer = m_modifier.periodictime;
|
|
||||||
break;
|
|
||||||
case SPELL_AURA_MOD_REGEN:
|
|
||||||
case SPELL_AURA_MOD_POWER_REGEN:
|
|
||||||
case SPELL_AURA_MOD_MANA_REGEN_FROM_STAT:
|
|
||||||
m_periodicTimer = 5000;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Unit* caster = GetCaster();
|
Unit* caster = GetCaster();
|
||||||
|
|
||||||
|
|
@ -959,6 +941,10 @@ void Aura::_AddAura()
|
||||||
//*****************************************************
|
//*****************************************************
|
||||||
if (!secondaura)
|
if (!secondaura)
|
||||||
{
|
{
|
||||||
|
// Sitdown on apply aura req seated
|
||||||
|
if (m_spellProto->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED && !m_target->IsSitState())
|
||||||
|
m_target->SetStandState(PLAYER_STATE_SIT);
|
||||||
|
|
||||||
// register aura diminishing on apply
|
// register aura diminishing on apply
|
||||||
if (getDiminishGroup() != DIMINISHING_NONE )
|
if (getDiminishGroup() != DIMINISHING_NONE )
|
||||||
m_target->ApplyDiminishingAura(getDiminishGroup(),true);
|
m_target->ApplyDiminishingAura(getDiminishGroup(),true);
|
||||||
|
|
@ -2365,54 +2351,6 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandleAuraPeriodicDummy(bool apply, bool Real)
|
|
||||||
{
|
|
||||||
// spells required only Real aura add/remove
|
|
||||||
if(!Real)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Unit* caster = GetCaster();
|
|
||||||
|
|
||||||
SpellEntry const*spell = GetSpellProto();
|
|
||||||
switch( spell->SpellFamilyName)
|
|
||||||
{
|
|
||||||
case SPELLFAMILY_ROGUE:
|
|
||||||
{
|
|
||||||
// Master of Subtlety
|
|
||||||
if (spell->Id==31666 && !apply && Real)
|
|
||||||
{
|
|
||||||
m_target->RemoveAurasDueToSpell(31665);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SPELLFAMILY_HUNTER:
|
|
||||||
{
|
|
||||||
// Aspect of the Viper
|
|
||||||
if (spell->SpellFamilyFlags&0x0004000000000000LL)
|
|
||||||
{
|
|
||||||
// Update regen on remove
|
|
||||||
if (!apply && m_target->GetTypeId() == TYPEID_PLAYER)
|
|
||||||
((Player*)m_target)->UpdateManaRegen();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// Explosive Shot
|
|
||||||
if (spell->SpellFamilyFlags & 0x8000000000000000LL)
|
|
||||||
{
|
|
||||||
if (apply && caster)
|
|
||||||
{
|
|
||||||
int32 damage = m_modifier.m_amount + caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 8 / 100;
|
|
||||||
caster->CastCustomSpell(m_target, 53352, &damage, 0, 0, true, 0, this);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_isPeriodic = apply;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Aura::HandleAuraMounted(bool apply, bool Real)
|
void Aura::HandleAuraMounted(bool apply, bool Real)
|
||||||
{
|
{
|
||||||
// only at real add/remove aura
|
// only at real add/remove aura
|
||||||
|
|
@ -4066,33 +4004,71 @@ void Aura::HandleAuraModStalked(bool apply, bool Real)
|
||||||
|
|
||||||
void Aura::HandlePeriodicTriggerSpell(bool apply, bool Real)
|
void Aura::HandlePeriodicTriggerSpell(bool apply, bool Real)
|
||||||
{
|
{
|
||||||
if (m_periodicTimer <= 0)
|
|
||||||
m_periodicTimer += m_modifier.periodictime;
|
|
||||||
|
|
||||||
m_isPeriodic = apply;
|
m_isPeriodic = apply;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandlePeriodicTriggerSpellWithValue(bool apply, bool Real)
|
void Aura::HandlePeriodicTriggerSpellWithValue(bool apply, bool Real)
|
||||||
{
|
{
|
||||||
if (m_periodicTimer <= 0)
|
|
||||||
m_periodicTimer += m_modifier.periodictime;
|
|
||||||
|
|
||||||
m_isPeriodic = apply;
|
m_isPeriodic = apply;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandlePeriodicEnergize(bool apply, bool Real)
|
void Aura::HandlePeriodicEnergize(bool apply, bool Real)
|
||||||
{
|
{
|
||||||
if (m_periodicTimer <= 0)
|
if (!Real)
|
||||||
m_periodicTimer += m_modifier.periodictime;
|
return;
|
||||||
|
|
||||||
|
m_isPeriodic = apply;
|
||||||
|
|
||||||
|
// Replenishment (0.25% from max)
|
||||||
|
// Infinite Replenishment
|
||||||
|
if (GetId() == 57669 ||
|
||||||
|
GetId() == 61782)
|
||||||
|
m_modifier.m_amount = m_target->GetMaxPower(POWER_MANA) * 25 / 10000;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Aura::HandleAuraPowerBurn(bool apply, bool Real)
|
||||||
|
{
|
||||||
|
m_isPeriodic = apply;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Aura::HandleAuraPeriodicDummy(bool apply, bool Real)
|
||||||
|
{
|
||||||
|
// spells required only Real aura add/remove
|
||||||
|
if(!Real)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// For prevent double apply bonuses
|
||||||
|
bool loading = (m_target->GetTypeId() == TYPEID_PLAYER && ((Player*)m_target)->GetSession()->PlayerLoading());
|
||||||
|
|
||||||
|
Unit* caster = GetCaster();
|
||||||
|
|
||||||
|
SpellEntry const*spell = GetSpellProto();
|
||||||
|
switch( spell->SpellFamilyName)
|
||||||
|
{
|
||||||
|
case SPELLFAMILY_ROGUE:
|
||||||
|
{
|
||||||
|
// Master of Subtlety
|
||||||
|
if (spell->Id==31666 && !apply)
|
||||||
|
{
|
||||||
|
m_target->RemoveAurasDueToSpell(31665);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SPELLFAMILY_HUNTER:
|
||||||
|
{
|
||||||
|
// Explosive Shot
|
||||||
|
if (apply && !loading && caster)
|
||||||
|
m_modifier.m_amount +=caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 8 / 100;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_isPeriodic = apply;
|
m_isPeriodic = apply;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandlePeriodicHeal(bool apply, bool Real)
|
void Aura::HandlePeriodicHeal(bool apply, bool Real)
|
||||||
{
|
{
|
||||||
if (m_periodicTimer <= 0)
|
|
||||||
m_periodicTimer += m_modifier.periodictime;
|
|
||||||
|
|
||||||
m_isPeriodic = apply;
|
m_isPeriodic = apply;
|
||||||
|
|
||||||
// For prevent double apply bonuses
|
// For prevent double apply bonuses
|
||||||
|
|
@ -4136,18 +4112,17 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
|
||||||
if(!Real)
|
if(!Real)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (m_periodicTimer <= 0)
|
|
||||||
m_periodicTimer += m_modifier.periodictime;
|
|
||||||
|
|
||||||
m_isPeriodic = apply;
|
m_isPeriodic = apply;
|
||||||
|
|
||||||
// For prevent double apply bonuses
|
// For prevent double apply bonuses
|
||||||
bool loading = (m_target->GetTypeId() == TYPEID_PLAYER && ((Player*)m_target)->GetSession()->PlayerLoading());
|
bool loading = (m_target->GetTypeId() == TYPEID_PLAYER && ((Player*)m_target)->GetSession()->PlayerLoading());
|
||||||
|
|
||||||
Unit *caster = GetCaster();
|
|
||||||
|
|
||||||
// Custom damage calculation after
|
// Custom damage calculation after
|
||||||
if (!apply || loading || !caster)
|
if (!apply || loading)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Unit *caster = GetCaster();
|
||||||
|
if (!caster)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (m_spellProto->SpellFamilyName)
|
switch (m_spellProto->SpellFamilyName)
|
||||||
|
|
@ -4322,25 +4297,21 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
|
||||||
|
|
||||||
void Aura::HandlePeriodicDamagePCT(bool apply, bool Real)
|
void Aura::HandlePeriodicDamagePCT(bool apply, bool Real)
|
||||||
{
|
{
|
||||||
if (m_periodicTimer <= 0)
|
|
||||||
m_periodicTimer += m_modifier.periodictime;
|
|
||||||
|
|
||||||
m_isPeriodic = apply;
|
m_isPeriodic = apply;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandlePeriodicLeech(bool apply, bool Real)
|
void Aura::HandlePeriodicLeech(bool apply, bool Real)
|
||||||
{
|
{
|
||||||
if (m_periodicTimer <= 0)
|
|
||||||
m_periodicTimer += m_modifier.periodictime;
|
|
||||||
|
|
||||||
m_isPeriodic = apply;
|
m_isPeriodic = apply;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandlePeriodicManaLeech(bool apply, bool Real)
|
void Aura::HandlePeriodicManaLeech(bool apply, bool Real)
|
||||||
{
|
{
|
||||||
if (m_periodicTimer <= 0)
|
m_isPeriodic = apply;
|
||||||
m_periodicTimer += m_modifier.periodictime;
|
}
|
||||||
|
|
||||||
|
void Aura::HandlePeriodicHealthFunnel(bool apply, bool Real)
|
||||||
|
{
|
||||||
m_isPeriodic = apply;
|
m_isPeriodic = apply;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4585,117 +4556,47 @@ void Aura::HandleAuraModResistenceOfStatPercent(bool /*apply*/, bool Real)
|
||||||
/********************************/
|
/********************************/
|
||||||
void Aura::HandleAuraModTotalHealthPercentRegen(bool apply, bool Real)
|
void Aura::HandleAuraModTotalHealthPercentRegen(bool apply, bool Real)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
Need additional checking for auras who reduce or increase healing, magic effect like Dumpen Magic,
|
|
||||||
so this aura not fully working.
|
|
||||||
*/
|
|
||||||
if(apply)
|
|
||||||
{
|
|
||||||
if(!m_target->isAlive())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if((GetSpellProto()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) && !m_target->IsSitState())
|
|
||||||
m_target->SetStandState(PLAYER_STATE_SIT);
|
|
||||||
|
|
||||||
if(m_periodicTimer <= 0)
|
|
||||||
{
|
|
||||||
m_periodicTimer += m_modifier.periodictime;
|
|
||||||
|
|
||||||
if(m_target->GetHealth() < m_target->GetMaxHealth())
|
|
||||||
{
|
|
||||||
// PeriodicTick can cast triggered spells with stats changes
|
|
||||||
PeriodicTick();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_isPeriodic = apply;
|
m_isPeriodic = apply;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandleAuraModTotalManaPercentRegen(bool apply, bool Real)
|
void Aura::HandleAuraModTotalManaPercentRegen(bool apply, bool Real)
|
||||||
{
|
{
|
||||||
if((GetSpellProto()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) && apply && !m_target->IsSitState())
|
if(m_modifier.periodictime == 0)
|
||||||
m_target->SetStandState(PLAYER_STATE_SIT);
|
m_modifier.periodictime = 1000;
|
||||||
if(apply)
|
|
||||||
{
|
|
||||||
if(m_modifier.periodictime == 0)
|
|
||||||
m_modifier.periodictime = 1000;
|
|
||||||
if(m_periodicTimer <= 0 && m_target->getPowerType() == POWER_MANA)
|
|
||||||
{
|
|
||||||
m_periodicTimer += m_modifier.periodictime;
|
|
||||||
|
|
||||||
if(m_target->GetPower(POWER_MANA) < m_target->GetMaxPower(POWER_MANA))
|
|
||||||
{
|
|
||||||
// PeriodicTick can cast triggered spells with stats changes
|
|
||||||
PeriodicTick();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
m_periodicTimer = m_modifier.periodictime;
|
||||||
m_isPeriodic = apply;
|
m_isPeriodic = apply;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandleModRegen(bool apply, bool Real) // eating
|
void Aura::HandleModRegen(bool apply, bool Real) // eating
|
||||||
{
|
{
|
||||||
if(apply)
|
if(m_modifier.periodictime == 0)
|
||||||
{
|
m_modifier.periodictime = 5000;
|
||||||
if(!m_target->isAlive())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ((GetSpellProto()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) && !m_target->IsSitState())
|
|
||||||
m_target->SetStandState(PLAYER_STATE_SIT);
|
|
||||||
|
|
||||||
if(m_periodicTimer <= 0)
|
|
||||||
{
|
|
||||||
m_periodicTimer += 5000;
|
|
||||||
int32 gain = m_target->ModifyHealth(m_modifier.m_amount);
|
|
||||||
Unit *caster = GetCaster();
|
|
||||||
if (caster)
|
|
||||||
{
|
|
||||||
SpellEntry const *spellProto = GetSpellProto();
|
|
||||||
if (spellProto)
|
|
||||||
m_target->getHostilRefManager().threatAssist(caster, float(gain) * 0.5f, spellProto);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
m_periodicTimer = 5000;
|
||||||
m_isPeriodic = apply;
|
m_isPeriodic = apply;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandleModPowerRegen(bool apply, bool Real) // drinking
|
void Aura::HandleModPowerRegen(bool apply, bool Real) // drinking
|
||||||
{
|
{
|
||||||
if ((GetSpellProto()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) && apply && !m_target->IsSitState())
|
if (!Real)
|
||||||
m_target->SetStandState(PLAYER_STATE_SIT);
|
return;
|
||||||
|
|
||||||
if(apply && m_periodicTimer <= 0)
|
Powers pt = m_target->getPowerType();
|
||||||
|
if(m_modifier.periodictime == 0)
|
||||||
{
|
{
|
||||||
m_periodicTimer += 2000;
|
if (pt == POWER_RAGE)
|
||||||
|
m_modifier.periodictime = 1000;
|
||||||
Powers pt = m_target->getPowerType();
|
else
|
||||||
if(int32(pt) != m_modifier.m_miscvalue)
|
m_modifier.periodictime = 2000;
|
||||||
return;
|
|
||||||
|
|
||||||
if ( GetSpellProto()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED )
|
|
||||||
{
|
|
||||||
// eating anim
|
|
||||||
m_target->HandleEmoteCommand(EMOTE_ONESHOT_EAT);
|
|
||||||
}
|
|
||||||
else if( GetId() == 20577 )
|
|
||||||
{
|
|
||||||
// cannibalize anim
|
|
||||||
m_target->HandleEmoteCommand(EMOTE_STATE_CANNIBALIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warrior talent, gain 1 rage every 3 seconds while in combat
|
|
||||||
if(pt == POWER_RAGE && m_target->isInCombat())
|
|
||||||
{
|
|
||||||
m_target->ModifyPower(pt, m_modifier.m_amount*10/17);
|
|
||||||
m_periodicTimer += 1000;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
m_isPeriodic = apply;
|
|
||||||
if (Real && m_target->GetTypeId() == TYPEID_PLAYER && m_modifier.m_miscvalue == POWER_MANA)
|
m_periodicTimer = 5000;
|
||||||
|
|
||||||
|
if (m_target->GetTypeId() == TYPEID_PLAYER && m_modifier.m_miscvalue == POWER_MANA)
|
||||||
((Player*)m_target)->UpdateManaRegen();
|
((Player*)m_target)->UpdateManaRegen();
|
||||||
|
|
||||||
|
m_isPeriodic = apply;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandleModPowerRegenPCT(bool /*apply*/, bool Real)
|
void Aura::HandleModPowerRegenPCT(bool /*apply*/, bool Real)
|
||||||
|
|
@ -5610,14 +5511,6 @@ void Aura::CleanupTriggeredSpells()
|
||||||
m_target->RemoveAurasDueToSpell(tSpellId);
|
m_target->RemoveAurasDueToSpell(tSpellId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Aura::HandleAuraPowerBurn(bool apply, bool Real)
|
|
||||||
{
|
|
||||||
if (m_periodicTimer <= 0)
|
|
||||||
m_periodicTimer += m_modifier.periodictime;
|
|
||||||
|
|
||||||
m_isPeriodic = apply;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Aura::HandleSchoolAbsorb(bool apply, bool Real)
|
void Aura::HandleSchoolAbsorb(bool apply, bool Real)
|
||||||
{
|
{
|
||||||
if(!Real)
|
if(!Real)
|
||||||
|
|
@ -5799,6 +5692,7 @@ void Aura::PeriodicTick()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SPELL_AURA_PERIODIC_LEECH:
|
case SPELL_AURA_PERIODIC_LEECH:
|
||||||
|
case SPELL_AURA_PERIODIC_HEALTH_FUNNEL:
|
||||||
{
|
{
|
||||||
Unit *pCaster = GetCaster();
|
Unit *pCaster = GetCaster();
|
||||||
if(!pCaster)
|
if(!pCaster)
|
||||||
|
|
@ -5811,7 +5705,7 @@ void Aura::PeriodicTick()
|
||||||
pCaster->SpellHitResult(m_target,GetSpellProto(),false)!=SPELL_MISS_NONE)
|
pCaster->SpellHitResult(m_target,GetSpellProto(),false)!=SPELL_MISS_NONE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Check for immune (not use charges)
|
// Check for immune
|
||||||
if(m_target->IsImmunedToDamage(GetSpellSchoolMask(GetSpellProto())))
|
if(m_target->IsImmunedToDamage(GetSpellSchoolMask(GetSpellProto())))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -6195,6 +6089,35 @@ void Aura::PeriodicTick()
|
||||||
pCaster->DealSpellDamage(&damageInfo, true);
|
pCaster->DealSpellDamage(&damageInfo, true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case SPELL_AURA_MOD_REGEN:
|
||||||
|
{
|
||||||
|
int32 gain = m_target->ModifyHealth(m_modifier.m_amount);
|
||||||
|
if (Unit *caster = GetCaster())
|
||||||
|
m_target->getHostilRefManager().threatAssist(caster, float(gain) * 0.5f, GetSpellProto());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SPELL_AURA_MOD_POWER_REGEN:
|
||||||
|
{
|
||||||
|
Powers pt = m_target->getPowerType();
|
||||||
|
if(int32(pt) != m_modifier.m_miscvalue)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( GetSpellProto()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED )
|
||||||
|
{
|
||||||
|
// eating anim
|
||||||
|
m_target->HandleEmoteCommand(EMOTE_ONESHOT_EAT);
|
||||||
|
}
|
||||||
|
else if( GetId() == 20577 )
|
||||||
|
{
|
||||||
|
// cannibalize anim
|
||||||
|
m_target->HandleEmoteCommand(EMOTE_STATE_CANNIBALIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Warrior talent, gain 1 rage every 3 seconds while in combat
|
||||||
|
if(pt == POWER_RAGE && m_target->isInCombat())
|
||||||
|
m_target->ModifyPower(pt, m_modifier.m_amount*10/17);
|
||||||
|
break;
|
||||||
|
}
|
||||||
// Here tick dummy auras
|
// Here tick dummy auras
|
||||||
case SPELL_AURA_PERIODIC_DUMMY:
|
case SPELL_AURA_PERIODIC_DUMMY:
|
||||||
{
|
{
|
||||||
|
|
@ -6321,29 +6244,6 @@ void Aura::PeriodicDummyTick()
|
||||||
// case 33208: break;
|
// case 33208: break;
|
||||||
// // Gossip NPC Periodic - Despawn
|
// // Gossip NPC Periodic - Despawn
|
||||||
// case 33209: break;
|
// case 33209: break;
|
||||||
|
|
||||||
// TODO: now its not periodic dummy - need move out from here
|
|
||||||
// Aspect of the Viper
|
|
||||||
case 34074:
|
|
||||||
{
|
|
||||||
if (m_target->GetTypeId() != TYPEID_PLAYER)
|
|
||||||
return;
|
|
||||||
// Should be manauser
|
|
||||||
if (m_target->getPowerType()!=POWER_MANA)
|
|
||||||
return;
|
|
||||||
if (!caster)
|
|
||||||
return;
|
|
||||||
// Regen amount is max (100% from spell) on 21% or less mana and min on 92.5% or greater mana (20% from spell)
|
|
||||||
int mana = m_target->GetPower(POWER_MANA);
|
|
||||||
int max_mana = m_target->GetMaxPower(POWER_MANA);
|
|
||||||
int32 base_regen = caster->CalculateSpellDamage(m_spellProto, m_effIndex, m_currentBasePoints, m_target);
|
|
||||||
float regen_pct = 1.20f - 1.1f * mana / max_mana;
|
|
||||||
if (regen_pct > 1.0f) regen_pct = 1.0f;
|
|
||||||
else if (regen_pct < 0.2f) regen_pct = 0.2f;
|
|
||||||
m_modifier.m_amount = int32 (base_regen * regen_pct);
|
|
||||||
((Player*)m_target)->UpdateManaRegen();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// // Steal Weapon
|
// // Steal Weapon
|
||||||
// case 36207: break;
|
// case 36207: break;
|
||||||
// // Simon Game START timer, (DND)
|
// // Simon Game START timer, (DND)
|
||||||
|
|
@ -6569,11 +6469,13 @@ void Aura::PeriodicDummyTick()
|
||||||
{
|
{
|
||||||
if (!caster)
|
if (!caster)
|
||||||
return;
|
return;
|
||||||
// Skip 0 tick
|
int32 damage = m_modifier.m_amount;
|
||||||
|
// Full damage to target at 0 tick
|
||||||
if (m_duration > m_modifier.periodictime)
|
if (m_duration > m_modifier.periodictime)
|
||||||
|
{
|
||||||
|
caster->CastCustomSpell(m_target, 53352, &damage, 0, 0, true, 0, this);
|
||||||
return;
|
return;
|
||||||
int32 damage = caster->CalculateSpellDamage(spell, GetEffIndex(), GetBasePoints(), m_target);
|
}
|
||||||
damage+=caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 8 / 100;
|
|
||||||
damage/=4;
|
damage/=4;
|
||||||
caster->CastCustomSpell(m_target, 56298, &damage, 0, 0, true, 0, this);
|
caster->CastCustomSpell(m_target, 56298, &damage, 0, 0, true, 0, this);
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -148,6 +148,7 @@ class MANGOS_DLL_SPEC Aura
|
||||||
void HandleModSpellHitChance(bool Apply, bool Real);
|
void HandleModSpellHitChance(bool Apply, bool Real);
|
||||||
void HandleAuraModScale(bool Apply, bool Real);
|
void HandleAuraModScale(bool Apply, bool Real);
|
||||||
void HandlePeriodicManaLeech(bool Apply, bool Real);
|
void HandlePeriodicManaLeech(bool Apply, bool Real);
|
||||||
|
void HandlePeriodicHealthFunnel(bool apply, bool Real);
|
||||||
void HandleModCastingSpeed(bool Apply, bool Real);
|
void HandleModCastingSpeed(bool Apply, bool Real);
|
||||||
void HandleAuraMounted(bool Apply, bool Real);
|
void HandleAuraMounted(bool Apply, bool Real);
|
||||||
void HandleWaterBreathing(bool Apply, bool Real);
|
void HandleWaterBreathing(bool Apply, bool Real);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7155"
|
#define REVISION_NR "7156"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue