Advertisement
Guest User

Untitled

a guest
Oct 19th, 2011
605
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. // DELETE FROM spell_script_names WHERE spell_id = 58984;
  2. // INSERT INTO spell_script_names VALUES (58984, 'spell_shadowmeld');
  3. class spell_shadowmeld : public SpellScriptLoader
  4. {
  5.     public:
  6.         spell_shadowmeld() : SpellScriptLoader("spell_shadowmeld") {}
  7.  
  8.         class spell_shadowmeld_SpellScript : public SpellScript
  9.         {
  10.             PrepareSpellScript(spell_shadowmeld_SpellScript);
  11.  
  12.             void HandleDummy(SpellEffIndex /*effIndex*/)
  13.             {
  14.                 Unit *caster = GetCaster();
  15.                 if (!caster)
  16.                     return;
  17.  
  18.                 caster->InterruptSpell(CURRENT_AUTOREPEAT_SPELL); // break Auto Shot and autohit
  19.                 caster->InterruptSpell(CURRENT_CHANNELED_SPELL);  // break channeled spells
  20.  
  21.                 bool instant_exit = true;
  22.                 if (Player *pCaster = caster->ToPlayer()) // if is a creature instant exits combat, else check if someone in party is in combat in visibility distance
  23.                 {
  24.                     uint64 myGUID = pCaster->GetGUID();
  25.                     float visibilityRange = pCaster->GetMap()->GetVisibilityRange();
  26.                     if (Group *pGroup = pCaster->GetGroup())
  27.                     {
  28.                         const Group::MemberSlotList membersList = pGroup->GetMemberSlots();
  29.                         for (Group::member_citerator itr=membersList.begin(); itr!=membersList.end() && instant_exit; ++itr)
  30.                             if (itr->guid != myGUID)
  31.                                 if (Player *GroupMember = Unit::GetPlayer(*pCaster, itr->guid))
  32.                                     if (GroupMember->isInCombat() && pCaster->GetMap()==GroupMember->GetMap() && pCaster->IsWithinDistInMap(GroupMember, visibilityRange))
  33.                                         instant_exit = false;
  34.                     }
  35.  
  36.                     pCaster->SendAttackSwingCancelAttack();
  37.                 }
  38.  
  39.                 if (!caster->GetInstanceScript() || !caster->GetInstanceScript()->IsEncounterInProgress()) //Don't leave combat if you are in combat with a boss
  40.                 {
  41.                     if (!instant_exit)
  42.                         caster->getHostileRefManager().deleteReferences(); // exit combat after 6 seconds
  43.                     else caster->CombatStop(); // isn't necessary to call AttackStop because is just called in CombatStop
  44.                 }
  45.             }
  46.  
  47.             void Register()
  48.             {
  49.                 OnEffectHitTarget += SpellEffectFn(spell_shadowmeld_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY);
  50.             }
  51.         };
  52.  
  53.         SpellScript* GetSpellScript() const
  54.         {
  55.             return new spell_shadowmeld_SpellScript();
  56.         }
  57. };
  58.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement