mirror of
https://github.com/mangosfour/server.git
synced 2025-12-18 10:37:01 +00:00
[7183] Updated spell casting pushback system.
Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
parent
de4c5ebbaa
commit
f8463bef69
6 changed files with 32 additions and 17 deletions
|
|
@ -5192,18 +5192,22 @@ void Spell::Delayed()
|
||||||
if (m_spellState == SPELL_STATE_DELAYED)
|
if (m_spellState == SPELL_STATE_DELAYED)
|
||||||
return; // spell is active and can't be time-backed
|
return; // spell is active and can't be time-backed
|
||||||
|
|
||||||
|
if(isDelayableNoMore()) // Spells may only be delayed twice
|
||||||
|
return;
|
||||||
|
|
||||||
// spells not loosing casting time ( slam, dynamites, bombs.. )
|
// spells not loosing casting time ( slam, dynamites, bombs.. )
|
||||||
if(!(m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_DAMAGE))
|
if(!(m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_DAMAGE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//check resist chance
|
//check pushback reduce
|
||||||
int32 resistChance = 100; //must be initialized to 100 for percent modifiers
|
int32 delaytime = 500; // spellcasting delay is normally 500ms
|
||||||
((Player*)m_caster)->ApplySpellMod(m_spellInfo->Id,SPELLMOD_NOT_LOSE_CASTING_TIME,resistChance, this);
|
int32 delayReduce = 100; // must be initialized to 100 for percent modifiers
|
||||||
resistChance += m_caster->GetTotalAuraModifier(SPELL_AURA_RESIST_PUSHBACK) - 100;
|
((Player*)m_caster)->ApplySpellMod(m_spellInfo->Id,SPELLMOD_NOT_LOSE_CASTING_TIME, delayReduce, this);
|
||||||
if (roll_chance_i(resistChance))
|
delayReduce += m_caster->GetTotalAuraModifier(SPELL_AURA_REDUCE_PUSHBACK) - 100;
|
||||||
|
if(delayReduce >= 100)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int32 delaytime = GetNextDelayAtDamageMsTime();
|
delaytime = delaytime * (100 - delayReduce) / 100;
|
||||||
|
|
||||||
if(int32(m_timer) + delaytime > m_casttime)
|
if(int32(m_timer) + delaytime > m_casttime)
|
||||||
{
|
{
|
||||||
|
|
@ -5227,14 +5231,18 @@ void Spell::DelayedChannel()
|
||||||
if(!m_caster || m_caster->GetTypeId() != TYPEID_PLAYER || getState() != SPELL_STATE_CASTING)
|
if(!m_caster || m_caster->GetTypeId() != TYPEID_PLAYER || getState() != SPELL_STATE_CASTING)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//check resist chance
|
if(isDelayableNoMore()) // Spells may only be delayed twice
|
||||||
int32 resistChance = 100; //must be initialized to 100 for percent modifiers
|
|
||||||
((Player*)m_caster)->ApplySpellMod(m_spellInfo->Id,SPELLMOD_NOT_LOSE_CASTING_TIME,resistChance, this);
|
|
||||||
resistChance += m_caster->GetTotalAuraModifier(SPELL_AURA_RESIST_PUSHBACK) - 100;
|
|
||||||
if (roll_chance_i(resistChance))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int32 delaytime = GetNextDelayAtDamageMsTime();
|
//check pushback reduce
|
||||||
|
int32 delaytime = GetSpellDuration(m_spellInfo) * 25 / 100; // channeling delay is normally 25% of its time per hit
|
||||||
|
int32 delayReduce = 100; // must be initialized to 100 for percent modifiers
|
||||||
|
((Player*)m_caster)->ApplySpellMod(m_spellInfo->Id,SPELLMOD_NOT_LOSE_CASTING_TIME,delayReduce, this);
|
||||||
|
delayReduce += m_caster->GetTotalAuraModifier(SPELL_AURA_REDUCE_PUSHBACK) - 100;
|
||||||
|
if(delayReduce >= 100)
|
||||||
|
return;
|
||||||
|
|
||||||
|
delaytime = delaytime * (100 - delayReduce) / 100;
|
||||||
|
|
||||||
if(int32(m_timer) < delaytime)
|
if(int32(m_timer) < delaytime)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -455,7 +455,14 @@ class Spell
|
||||||
uint8 m_runesState;
|
uint8 m_runesState;
|
||||||
|
|
||||||
uint8 m_delayAtDamageCount;
|
uint8 m_delayAtDamageCount;
|
||||||
int32 GetNextDelayAtDamageMsTime() { return m_delayAtDamageCount < 5 ? 1000 - (m_delayAtDamageCount++)* 200 : 200; }
|
bool isDelayableNoMore()
|
||||||
|
{
|
||||||
|
if(m_delayAtDamageCount >= 2)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
m_delayAtDamageCount++;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Delayed spells system
|
// Delayed spells system
|
||||||
uint64 m_delayStart; // time of spell delay start, filled by event handler, zero = just started
|
uint64 m_delayStart; // time of spell delay start, filled by event handler, zero = just started
|
||||||
|
|
|
||||||
|
|
@ -191,7 +191,7 @@ enum AuraType
|
||||||
SPELL_AURA_ALLOW_TAME_PET_TYPE = 146,
|
SPELL_AURA_ALLOW_TAME_PET_TYPE = 146,
|
||||||
SPELL_AURA_ADD_CREATURE_IMMUNITY = 147,
|
SPELL_AURA_ADD_CREATURE_IMMUNITY = 147,
|
||||||
SPELL_AURA_RETAIN_COMBO_POINTS = 148,
|
SPELL_AURA_RETAIN_COMBO_POINTS = 148,
|
||||||
SPELL_AURA_RESIST_PUSHBACK = 149, // Resist Pushback
|
SPELL_AURA_REDUCE_PUSHBACK = 149, // Reduce Pushback
|
||||||
SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT = 150,
|
SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT = 150,
|
||||||
SPELL_AURA_TRACK_STEALTHED = 151, // Track Stealthed
|
SPELL_AURA_TRACK_STEALTHED = 151, // Track Stealthed
|
||||||
SPELL_AURA_MOD_DETECTED_RANGE = 152, // Mod Detected Range
|
SPELL_AURA_MOD_DETECTED_RANGE = 152, // Mod Detected Range
|
||||||
|
|
|
||||||
|
|
@ -199,7 +199,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
|
||||||
&Aura::HandleNoImmediateEffect, //146 SPELL_AURA_ALLOW_TAME_PET_TYPE
|
&Aura::HandleNoImmediateEffect, //146 SPELL_AURA_ALLOW_TAME_PET_TYPE
|
||||||
&Aura::HandleNULL, //147 SPELL_AURA_ADD_CREATURE_IMMUNITY
|
&Aura::HandleNULL, //147 SPELL_AURA_ADD_CREATURE_IMMUNITY
|
||||||
&Aura::HandleAuraRetainComboPoints, //148 SPELL_AURA_RETAIN_COMBO_POINTS
|
&Aura::HandleAuraRetainComboPoints, //148 SPELL_AURA_RETAIN_COMBO_POINTS
|
||||||
&Aura::HandleNoImmediateEffect, //149 SPELL_AURA_RESIST_PUSHBACK
|
&Aura::HandleNoImmediateEffect, //149 SPELL_AURA_REDUCE_PUSHBACK
|
||||||
&Aura::HandleShieldBlockValue, //150 SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT
|
&Aura::HandleShieldBlockValue, //150 SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT
|
||||||
&Aura::HandleAuraTrackStealthed, //151 SPELL_AURA_TRACK_STEALTHED
|
&Aura::HandleAuraTrackStealthed, //151 SPELL_AURA_TRACK_STEALTHED
|
||||||
&Aura::HandleNoImmediateEffect, //152 SPELL_AURA_MOD_DETECTED_RANGE implemented in Creature::GetAttackDistance
|
&Aura::HandleNoImmediateEffect, //152 SPELL_AURA_MOD_DETECTED_RANGE implemented in Creature::GetAttackDistance
|
||||||
|
|
|
||||||
|
|
@ -10305,7 +10305,7 @@ bool InitTriggerAuraData()
|
||||||
isTriggerAura[SPELL_AURA_MOD_DAMAGE_FROM_CASTER] = true;
|
isTriggerAura[SPELL_AURA_MOD_DAMAGE_FROM_CASTER] = true;
|
||||||
|
|
||||||
isNonTriggerAura[SPELL_AURA_MOD_POWER_REGEN]=true;
|
isNonTriggerAura[SPELL_AURA_MOD_POWER_REGEN]=true;
|
||||||
isNonTriggerAura[SPELL_AURA_RESIST_PUSHBACK]=true;
|
isNonTriggerAura[SPELL_AURA_REDUCE_PUSHBACK]=true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7182"
|
#define REVISION_NR "7183"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue