rendered paste bodyIndex: game/Spell.cpp
===================================================================
--- game/Spell.cpp (revision 5224)
+++ game/Spell.cpp (working copy)
@@ -1867,7 +1867,8 @@
if(m_targets.getUnitTargetGUID())
{
- if(!m_targets.getUnitTarget() || !m_targets.getUnitTarget()->isAlive())
+ if(!m_targets.getUnitTarget() || !m_targets.getUnitTarget()->isAlive() ||
+ (!m_targets.getUnitTarget()->isVisibleForOrDetect(m_caster,false) && m_spellState != SPELL_STATE_DELAYED))
{
if(m_autoRepeat)
{
@@ -1876,7 +1877,7 @@
return;
}
- if(!m_targets.getUnitTarget())
+ if(!m_targets.getUnitTarget() || (!m_targets.getUnitTarget()->isVisibleForOrDetect(m_caster,false) && m_spellState != SPELL_STATE_DELAYED))
{
cancel();
return;
Index: game/SpellAuras.cpp
===================================================================
--- game/SpellAuras.cpp (revision 5224)
+++ game/SpellAuras.cpp (working copy)
@@ -2347,7 +2361,7 @@
{
if(apply)
{
- m_target->m_stealthvalue = m_modifier.m_amount;
+ m_target->m_stealthvalue += m_modifier.m_amount;
// drop flag at stealth in bg
if(Real && m_target->GetTypeId()==TYPEID_PLAYER && ((Player*)m_target)->InBattleGround())
@@ -2390,7 +2404,7 @@
reallyRemove = false; // vanish it timed out, but we have stealth active as well
if(reallyRemove)
{
- m_target->m_stealthvalue = 0;
+ m_target->m_stealthvalue -= m_modifier.m_amount;
m_target->RemoveFlag(UNIT_FIELD_BYTES_1, PLAYER_STATE_FLAG_CREEP);
// apply only if not in GM invisibility
Index: game/SpellEffects.cpp
===================================================================
--- game/SpellEffects.cpp (revision 5224)
+++ game/SpellEffects.cpp (working copy)
@@ -831,7 +831,7 @@
uint32 classspell = itr->first;
SpellEntry const *spellInfo = sSpellStore.LookupEntry(classspell);
- if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && spellInfo->Id != 14185 && GetRecoveryTime(spellInfo) > 0)
+ if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && (spellInfo->SpellFamilyFlags & 0x26000000860LL))
{
((Player*)m_caster)->RemoveSpellCooldown(classspell);
@@ -1365,6 +1365,49 @@
m_caster->CastSpell(unitTarget, 31790, true);
return;
}
+ // Vanish
+ case 18461:
+ {
+ m_caster->RemoveSpellsCausingAura(SPELL_AURA_MOD_ROOT);
+ m_caster->RemoveSpellsCausingAura(SPELL_AURA_MOD_DECREASE_SPEED);
+ m_caster->RemoveSpellsCausingAura(SPELL_AURA_MOD_STALKED);
+
+ if ( m_caster->GetTypeId() != TYPEID_PLAYER )
+ return;
+
+ uint32 spellId = 0;
+ const PlayerSpellMap& sp_list = ((Player *)m_caster)->GetSpellMap();
+ for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)
+ {
+ if(itr->second->state == PLAYERSPELL_REMOVED) continue;
+ SpellEntry const *spellInfo = sSpellStore.LookupEntry(itr->first);
+ if (!spellInfo) continue;
+
+ if ( spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE &&
+ spellInfo->SpellFamilyFlags & SPELLFAMILYFLAG_ROGUE_STEALTH )
+ {
+ spellId = spellInfo->Id;
+ break;
+ }
+ }
+
+ // Apparently some idiot that does not even know stealth spell
+ if (!spellId)
+ return;
+
+ if(((Player *)m_caster)->HasSpellCooldown(spellId))
+ {
+ ((Player *)m_caster)->RemoveSpellCooldown(spellId);
+ WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8+4));
+ data << uint32(spellId);
+ data << m_caster->GetGUID();
+ ((Player *)m_caster)->GetSession()->SendPacket(&data);
+ }
+
+ m_caster->CastSpell(m_caster, spellId, true);
+ return;
+ }
+
}
// normal case
@@ -3667,11 +3714,6 @@
unitTarget->CombatStop();
unitTarget->getHostilRefManager().deleteReferences(); // stop all fighting
- //Vanish allows to remove all threat and cast regular stealth so other spells can be used
- if(m_spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && (m_spellInfo->SpellFamilyFlags & SPELLFAMILYFLAG_ROGUE_VANISH))
- {
- ((Player *)m_caster)->RemoveSpellsCausingAura(SPELL_AURA_MOD_ROOT);
- }
}
void Spell::EffectAddComboPoints(uint32 /*i*/)