diff options
| author | Vincent-Michael <Vincent_Michael@gmx.de> | 2014-09-08 22:15:42 +0200 | 
|---|---|---|
| committer | Vincent-Michael <Vincent_Michael@gmx.de> | 2014-09-08 22:15:42 +0200 | 
| commit | 5cdea8b30cda77d6a9d93921b0f667d51ec89c6f (patch) | |
| tree | 0cf4e6bd15cdbe3543cda20702a9a17abbd2b7a8 /src/server/scripts | |
| parent | 668fe43d51208738cb95c0d30a3077d998832b50 (diff) | |
| parent | e181af1b1c983c8dc492f20eb4720973f002c538 (diff) | |
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Diffstat (limited to 'src/server/scripts')
20 files changed, 281 insertions, 194 deletions
| diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 5e8f159a8e1..54925a4546b 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -2236,69 +2236,100 @@ public:      static bool HandleFreezeCommand(ChatHandler* handler, char const* args)      { -        std::string name; -        Player* player; -        char const* TargetName = strtok((char*)args, " "); // get entered name -        if (!TargetName) // if no name entered use target -        { -            player = handler->getSelectedPlayer(); -            if (player) //prevent crash with creature as target -            { -                name = player->GetName(); -                normalizePlayerName(name); -            } -        } -        else // if name entered +        Player* player = handler->getSelectedPlayer(); // Selected player, if any. Might be null. +        uint32 freezeDuration = 0; // Freeze Duration (in seconds) +        bool canApplyFreeze = false; // Determines if every possible argument is set so Freeze can be applied +        bool getDurationFromConfig = false; // If there's no given duration, we'll retrieve the world cfg value later + +        /* +            Possible Freeze Command Scenarios: +            case 1 - .freeze (without args and a selected player) +            case 2 - .freeze duration (with a selected player) +            case 3 - .freeze player duration +            case 4 - .freeze player (without specifying duration) +        */ + +        // case 1: .freeze +        if (!*args)          { -            name = TargetName; -            normalizePlayerName(name); -            player = sObjectAccessor->FindPlayerByName(name); +            // Might have a selected player. We'll check it later +            // Get the duration from world cfg +            getDurationFromConfig = true;          } - -        if (!player) +        else          { -            handler->SendSysMessage(LANG_COMMAND_FREEZE_WRONG); -            return true; +            // Get the args that we might have (up to 2) +            char const* arg1 = strtok((char*)args, " "); +            char const* arg2 = strtok(NULL, " "); +             +            // Analyze them to see if we got either a playerName or duration or both +            if (arg1) +            { +                if (isNumeric(arg1)) +                { +                    // case 2: .freeze duration +                    // We have a selected player. We'll check him later +                    freezeDuration = uint32(atoi(arg1)); +                    canApplyFreeze = true; +                } +                else +                { +                    // case 3 or 4: .freeze player duration | .freeze player +                    // find the player +                    std::string name = arg1; +                    normalizePlayerName(name); +                    player = sObjectAccessor->FindPlayerByName(name); +                    // Check if we have duration set +                    if (arg2 && isNumeric(arg2)) +                    { +                        freezeDuration = uint32(atoi(arg2)); +                        canApplyFreeze = true; +                    } +                    else +                        getDurationFromConfig = true; +                } +            }          } -        if (player == handler->GetSession()->GetPlayer()) +        // Check if duration needs to be retrieved from config +        if (getDurationFromConfig)          { -            handler->SendSysMessage(LANG_COMMAND_FREEZE_ERROR); -            return true; +            freezeDuration = sWorld->getIntConfig(CONFIG_GM_FREEZE_DURATION); +            canApplyFreeze = true;          } -        // effect -        if (player && (player != handler->GetSession()->GetPlayer())) +        // Player and duration retrieval is over +        if (canApplyFreeze)          { -            handler->PSendSysMessage(LANG_COMMAND_FREEZE, name.c_str()); - -            // stop combat + make player unattackable + duel stop + stop some spells -            player->setFaction(35); -            player->CombatStop(); -            if (player->IsNonMeleeSpellCast(true)) -                player->InterruptNonMeleeSpells(true); -            player->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - -            // if player class = hunter || warlock remove pet if alive -            if ((player->getClass() == CLASS_HUNTER) || (player->getClass() == CLASS_WARLOCK)) +            if (!player) // can be null if some previous selection failed +            { +                handler->SendSysMessage(LANG_COMMAND_FREEZE_WRONG); +                return true; +            } +            else if (player == handler->GetSession()->GetPlayer()) +            { +                // Can't freeze himself +                handler->SendSysMessage(LANG_COMMAND_FREEZE_ERROR); +                return true; +            } +            else // Apply the effect              { -                if (Pet* pet = player->GetPet()) +                // Add the freeze aura and set the proper duration +                // Player combat status and flags are now handled +                // in Freeze Spell AuraScript (OnApply) +                Aura* freeze = player->AddAura(9454, player); +                if (freeze)                  { -                    pet->SavePetToDB(PET_SAVE_AS_CURRENT); -                    // not let dismiss dead pet -                    if (pet->IsAlive()) -                        player->RemovePet(pet, PET_SAVE_NOT_IN_SLOT); +                    if (freezeDuration) +                        freeze->SetDuration(freezeDuration * IN_MILLISECONDS); +                    handler->PSendSysMessage(LANG_COMMAND_FREEZE, player->GetName().c_str()); +                    // save player +                    player->SaveToDB(); +                    return true;                  }              } - -            if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(9454)) -                Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, player, player); - -            // save player -            player->SaveToDB();          } - -        return true; +        return false;      }      static bool HandleUnFreezeCommand(ChatHandler* handler, char const*args) @@ -2324,15 +2355,10 @@ public:          {              handler->PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str()); -            // Reset player faction + allow combat + allow duels -            player->setFactionForRace(player->getRace()); -            player->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); -              // Remove Freeze spell (allowing movement and spells) +            // Player Flags + Neutral faction removal is now +            // handled on the Freeze Spell AuraScript (OnRemove)              player->RemoveAurasDueToSpell(9454); - -            // Save player -            player->SaveToDB();          }          else          { @@ -2389,7 +2415,17 @@ public:          {              Field* fields = result->Fetch();              std::string player = fields[0].GetString(); -            handler->PSendSysMessage(LANG_COMMAND_FROZEN_PLAYERS, player.c_str()); +            int32 remaintime = fields[1].GetInt32(); +            // Save the frozen player to update remaining time in case of future .listfreeze uses +            // before the frozen state expires +            if (Player* frozen = sObjectAccessor->FindPlayerByName(player)) +                frozen->SaveToDB(); +            // Notify the freeze duration +            if (remaintime == -1) // Permanent duration +                handler->PSendSysMessage(LANG_COMMAND_PERMA_FROZEN_PLAYER, player.c_str()); +            else +                // show time left (seconds) +                handler->PSendSysMessage(LANG_COMMAND_TEMP_FROZEN_PLAYER, player.c_str(), remaintime / IN_MILLISECONDS);          }          while (result->NextRow()); diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index f828b66a93a..74a947e42e4 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -288,7 +288,7 @@ public:              return false;          sWorld->SetRecordDiffInterval(newTime); -        printf("Record diff every %u ms\n", newTime); +        printf("Record diff every %i ms\n", newTime);          return true;      } diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp index 87272037755..ca46ff36079 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp @@ -173,7 +173,7 @@ public:              DoMeleeAttackIfReady();          } -     +      private:          EventMap events;          SummonList summons; diff --git a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp index b0222413513..7338620a8b2 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp @@ -133,7 +133,7 @@ public:                  ++uiHealth;                  DoCastAOE(SPELL_SMITE_STOMP, false);                  SetCombatMovement(false); -                if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_SMITE_CHEST))) +                if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_SMITE_CHEST)))                  {                      me->GetMotionMaster()->Clear();                      me->GetMotionMaster()->MovePoint(1, go->GetPositionX() - 3.0f, go->GetPositionY(), go->GetPositionZ()); diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp index 220cf0c92b4..d009986651a 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp @@ -142,56 +142,48 @@ public:                  uiPhase = uiPhaseStep;          } -        void CaveDestruction(bool bBool) +        void CaveDestruction(bool isRight)          {              if (GoSummonList.empty())                  return;              for (std::list<uint64>::const_iterator itr = GoSummonList.begin(); itr != GoSummonList.end(); ++itr)              { -               if (GameObject* go = GameObject::GetGameObject(*me, *itr)) -               { -                    if (go) +                if (GameObject* go = ObjectAccessor::GetGameObject(*me, *itr)) +                { +                    if (Creature* trigger = go->SummonTrigger(go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, 1))                      { -                        if (Creature* trigger = go->SummonTrigger(go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, 1)) -                        { -                            //visual effects are not working! -                            trigger->CastSpell(trigger, 11542, true); -                            trigger->CastSpell(trigger, 35470, true); -                        } -                        go->RemoveFromWorld(); -                        //go->CastSpell(me, 12158); makes all die?! +                        //visual effects are not working! +                        trigger->CastSpell(trigger, 11542, true); +                        trigger->CastSpell(trigger, 35470, true);                      } -               } +                    go->RemoveFromWorld(); +                    //go->CastSpell(me, 12158); makes all die?! +                }              } -           if (bBool) -           { -                if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) -                    instance->HandleGameObject(0, false, go); -           }else -                if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT))) -                    instance->HandleGameObject(0, false, go); +            if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(isRight ? DATA_GO_CAVE_IN_RIGHT : DATA_GO_CAVE_IN_LEFT))) +                instance->HandleGameObject(0, false, go);          }          void SetInFace(bool isRight)          { -            if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(isRight ? DATA_GO_CAVE_IN_RIGHT : DATA_GO_CAVE_IN_LEFT))) +            if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(isRight ? DATA_GO_CAVE_IN_RIGHT : DATA_GO_CAVE_IN_LEFT)))                  me->SetFacingToObject(go);          }          void RestoreAll()          { -            if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) +            if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT)))                  instance->HandleGameObject(0, false, go); -            if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT))) +            if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT)))                  instance->HandleGameObject(0, false, go);              if (!GoSummonList.empty())                  for (std::list<uint64>::const_iterator itr = GoSummonList.begin(); itr != GoSummonList.end(); ++itr)                  { -                    if (GameObject* go = GameObject::GetGameObject(*me, *itr)) +                    if (GameObject* go = ObjectAccessor::GetGameObject(*me, *itr))                          go->RemoveFromWorld();                  } @@ -406,7 +398,7 @@ public:                              SetInFace(true);                              Talk(SAY_BLASTMASTER_5);                              Summon(1); -                            if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) +                            if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT)))                                  instance->HandleGameObject(0, true, go);                              NextStep(3000, true);                              break; @@ -452,7 +444,7 @@ public:                          case 16:                              Talk(SAY_BLASTMASTER_14);                              SetInFace(false); -                            if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT))) +                            if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT)))                                  instance->HandleGameObject(0, true, go);                              NextStep(2000, true);                              break; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp index 9a1f8f14557..0386341ed0c 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp @@ -162,52 +162,58 @@ class spell_shadow_portal : public SpellScriptLoader          {              PrepareSpellScript(spell_shadow_portal_SpellScript); +            bool Load() override +            { +                _instance = GetCaster()->GetInstanceScript(); +                return _instance != nullptr; +            } +              void HandleCast(SpellEffIndex /*effIndex*/)              { -                Creature* caster = GetCaster()->ToCreature(); -                int8 attempts  = 0; -                int32 spell_to_cast =0; +                Unit* caster = GetCaster(); +                uint8 attempts = 0; +                uint32 spellId = 0; -                while (!spell_to_cast) +                while (!spellId)                  {                      if (attempts++ >= 6) break;                      switch (urand(0, 5))                      {                          case ROOM_HALL_OF_SECRETS: -                            if (InstanceScript* instance = GetCaster()->GetInstanceScript()) -                                if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_RAVENIAN))->GetGoState() == GO_STATE_ACTIVE) -                                    spell_to_cast = SPELL_SHADOW_PORTAL_HALLOFSECRETS; +                            if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetData64(GO_GATE_RAVENIAN))) +                                if (go->GetGoState() == GO_STATE_ACTIVE) +                                    spellId = SPELL_SHADOW_PORTAL_HALLOFSECRETS;                              break;                          case ROOM_HALL_OF_THE_DAMNED: -                            if (InstanceScript* instance = GetCaster()->GetInstanceScript()) -                                if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_THEOLEN))->GetGoState() == GO_STATE_ACTIVE) -                                    spell_to_cast = SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED; +                            if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetData64(GO_GATE_THEOLEN))) +                                if (go->GetGoState() == GO_STATE_ACTIVE) +                                    spellId = SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED;                              break;                          case ROOM_THE_COVEN: -                            if (InstanceScript* instance = GetCaster()->GetInstanceScript()) -                                if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_MALICIA))->GetGoState() == GO_STATE_ACTIVE) -                                    spell_to_cast = SPELL_SHADOW_PORTAL_THECOVEN; +                            if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetData64(GO_GATE_MALICIA))) +                                if (go->GetGoState() == GO_STATE_ACTIVE) +                                    spellId = SPELL_SHADOW_PORTAL_THECOVEN;                              break;                          case ROOM_THE_SHADOW_VAULT: -                            if (InstanceScript* instance = GetCaster()->GetInstanceScript()) -                                if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_ILLUCIA))->GetGoState() == GO_STATE_ACTIVE) -                                    spell_to_cast = SPELL_SHADOW_PORTAL_THESHADOWVAULT; +                            if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetData64(GO_GATE_ILLUCIA))) +                                if (go->GetGoState() == GO_STATE_ACTIVE) +                                    spellId = SPELL_SHADOW_PORTAL_THESHADOWVAULT;                              break;                          case ROOM_BAROV_FAMILY_VAULT: -                            if (InstanceScript* instance = GetCaster()->GetInstanceScript()) -                                if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_BAROV))->GetGoState() == GO_STATE_ACTIVE) -                                    spell_to_cast = SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT; +                            if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetData64(GO_GATE_BAROV))) +                                if (go->GetGoState() == GO_STATE_ACTIVE) +                                    spellId = SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT;                              break;                          case ROOM_VAULT_OF_THE_RAVENIAN: -                            if (InstanceScript* instance = GetCaster()->GetInstanceScript()) -                                if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_POLKELT))->GetGoState() == GO_STATE_ACTIVE) -                                    spell_to_cast = SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN; +                            if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetData64(GO_GATE_POLKELT))) +                                if (go->GetGoState() == GO_STATE_ACTIVE) +                                    spellId = SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN;                              break;                      } -                    if (spell_to_cast) -                        GetHitUnit()->CastSpell(GetHitUnit(), spell_to_cast); +                    if (spellId) +                        GetHitUnit()->CastSpell(GetHitUnit(), spellId);                  }              } @@ -215,6 +221,9 @@ class spell_shadow_portal : public SpellScriptLoader              {                  OnEffectHitTarget += SpellEffectFn(spell_shadow_portal_SpellScript::HandleCast, EFFECT_0, SPELL_EFFECT_DUMMY);              } + +        private: +            InstanceScript* _instance;          };          SpellScript* GetSpellScript() const override @@ -276,12 +285,17 @@ class spell_shadow_portal_rooms : public SpellScriptLoader          {              PrepareSpellScript(spell_shadow_portal_rooms_SpellScript); +            bool Load() override +            { +                _instance = GetCaster()->GetInstanceScript(); +                return _instance != nullptr; +            } +              void HandleSendEvent(SpellEffIndex effIndex)              {                  // If only one player in threat list fail spell -                Creature* Summoned = NULL; -                Creature* caster = GetCaster()->ToCreature(); +                Unit* caster = GetCaster();                  int8 pos_to_summon = 0;                  int8 phase_to_set = 0; @@ -323,21 +337,19 @@ class spell_shadow_portal_rooms : public SpellScriptLoader                          break;                  } -                if (gate_to_close && (GetCaster()->GetMap()->GetId() == 289)) +                if (gate_to_close && (caster->GetMap()->GetId() == 289))                  {                      for (uint8 i = 0; i < 3; ++i)                      { -                        Summoned = GetCaster()->SummonCreature(NPC_RISEN_GUARDIAN, SummonPos[pos_to_summon++], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000); -                        if (Summoned) +                        if (Creature* Summoned = caster->SummonCreature(NPC_RISEN_GUARDIAN, SummonPos[pos_to_summon++], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000))                          {                              Summoned->GetMotionMaster()->MoveRandom(5);                              Summoned->AI()->SetData(0, phase_to_set);                          }                      } -                    if (InstanceScript* instance = GetCaster()->GetInstanceScript()) -                        if (GameObject* gate = GameObject::GetGameObject(*caster, instance->GetData64(gate_to_close))) -                            gate->SetGoState(GO_STATE_READY); +                    if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, _instance->GetData64(gate_to_close))) +                        gate->SetGoState(GO_STATE_READY);                  }              } @@ -345,6 +357,9 @@ class spell_shadow_portal_rooms : public SpellScriptLoader              {                  OnEffectHit += SpellEffectFn(spell_shadow_portal_rooms_SpellScript::HandleSendEvent, EFFECT_1, SPELL_EFFECT_SEND_EVENT);              } + +        private: +            InstanceScript* _instance;          };          SpellScript* GetSpellScript() const override diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp index 889fbe8fdc9..9c733677b42 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp @@ -149,7 +149,7 @@ public:          void JustSummoned(Creature* summoned) override          {              summoned->CastSpell(summoned, SPELL_SOUL_FREED, false); -             +              if (Player* player = ObjectAccessor::GetPlayer(*me, Tagger))                  summoned->GetMotionMaster()->MoveFollow(player, 0.0f, 0.0f);          } diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp index 347c87b160b..1a0987625df 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp +++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp @@ -145,6 +145,8 @@ public:              MovePoint = urand(0, 5);              PointData = GetMoveData();              SummonWhelpCount = 0; +            triggerGUID = 0; +            tankGUID = 0;              IsMoving = false;              instance->SetData(DATA_ONYXIA_PHASE, Phase); @@ -153,17 +155,14 @@ public:          void EnterCombat(Unit* /*who*/) override          { +            _EnterCombat();              Talk(SAY_AGGRO); -            me->SetInCombatWithZone(); - -            events.Reset();              events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 20000));              events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(15000, 20000));              events.ScheduleEvent(EVENT_CLEAVE, urand(2000, 5000));              events.ScheduleEvent(EVENT_WING_BUFFET, urand(10000, 20000)); -            instance->SetBossState(DATA_ONYXIA, IN_PROGRESS);              instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);          } @@ -226,11 +225,11 @@ public:                          me->SetCanFly(false);                          me->SetDisableGravity(false);                          me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); -                        if (Creature* trigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TRIGGER_GUID))) +                        if (Creature* trigger = ObjectAccessor::GetCreature(*me, triggerGUID))                              me->Kill(trigger);                          me->SetReactState(REACT_AGGRESSIVE);                          // tank selection based on phase one. If tank is not there i take nearest one -                        if (Unit* tank = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_TANK_GUID))) +                        if (Unit* tank = ObjectAccessor::GetUnit(*me, tankGUID))                              me->GetMotionMaster()->MoveChase(tank);                          else if (Unit* newtarget = SelectTarget(SELECT_TARGET_NEAREST, 0))                              me->GetMotionMaster()->MoveChase(newtarget); @@ -246,7 +245,7 @@ public:                          me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);                          me->SetFacingTo(me->GetOrientation() + float(M_PI));                          if (Creature * trigger = me->SummonCreature(NPC_TRIGGER, MiddleRoomLocation, TEMPSUMMON_CORPSE_DESPAWN)) -                            instance->SetData64(DATA_TRIGGER_GUID, trigger->GetGUID()); +                            triggerGUID = trigger->GetGUID();                          me->GetMotionMaster()->MoveTakeoff(11, Phase2Floating);                          me->SetSpeed(MOVE_FLIGHT, 1.0f);                          Talk(SAY_PHASE_2_TRANS); @@ -329,7 +328,7 @@ public:                      {                          SetCombatMovement(false);                          Phase = PHASE_BREATH; -                        instance->SetData64(DATA_TANK_GUID, me->GetVictim()->GetGUID()); +                        tankGUID = me->GetVictim()->GetGUID();                          me->SetReactState(REACT_PASSIVE);                          me->AttackStop();                          me->GetMotionMaster()->MovePoint(10, Phase2Location); @@ -470,6 +469,8 @@ public:              uint8 Phase;              uint8 MovePoint;              uint8 SummonWhelpCount; +            uint64 triggerGUID; +            uint64 tankGUID;              bool IsMoving;      }; diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp index 61b57d181a3..6aa50e71b17 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp +++ b/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp @@ -54,8 +54,6 @@ public:              SetBossNumber(EncounterCount);              onyxiaGUID               = 0; -            triggerGUID              = 0; -            tankGUID                 = 0;              onyxiaLiftoffTimer       = 0;              manyWhelpsCounter        = 0;              eruptTimer               = 0; @@ -184,12 +182,6 @@ public:                      FloorEruptionGUIDQueue.push(data);                      eruptTimer = 2500;                      break; -                case DATA_TRIGGER_GUID: -                    triggerGUID = data; -                    break; -                case DATA_TANK_GUID: -                    tankGUID = data; -                    break;              }          } @@ -199,13 +191,6 @@ public:              {                  case NPC_ONYXIA:                      return onyxiaGUID; -                    break; -                case DATA_TRIGGER_GUID: -                    return triggerGUID; -                    break; -                case DATA_TANK_GUID: -                    return tankGUID; -                    break;              }              return 0; diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h b/src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h index 0c423f35de6..9fd73f7a977 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h +++ b/src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h @@ -38,8 +38,6 @@ enum Data64  {      DATA_ONYXIA_GUID            = 0,      DATA_FLOOR_ERUPTION_GUID    = 1, -    DATA_TRIGGER_GUID           = 2, -    DATA_TANK_GUID              = 3  };  enum OnyxiaPhases diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 833e3e23fe1..565c581a727 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -261,9 +261,21 @@ struct generic_halionAI : public BossAI          }      } +    bool CheckInRoom() override +    { +        // Rough radius, it is not an exactly perfect circle +        if (me->GetDistance2d(HalionControllerSpawnPos.GetPositionX(), HalionControllerSpawnPos.GetPositionY()) > 48.5f) +        { +            if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER))) +                controller->AI()->EnterEvadeMode(); +            return false; +        } +        return true; +    } +      void UpdateAI(uint32 diff) override      { -        if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING)) +        if (!UpdateVictim() || !CheckInRoom() || me->HasUnitState(UNIT_STATE_CASTING))              return;          events.Update(diff); @@ -393,13 +405,6 @@ class boss_halion : public CreatureScript                  if (events.IsInPhase(PHASE_TWO))                      return; -                // Rough radius, it is not an exactly perfect circle -                if (me->GetDistance2d(HalionControllerSpawnPos.GetPositionX(), HalionControllerSpawnPos.GetPositionY()) > 48.5f) -                { -                    EnterEvadeMode(); -                    return; -                } -                  generic_halionAI::UpdateAI(diff);              } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp index e073d08ef1d..f601f06e16c 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp @@ -138,7 +138,7 @@ public:                      break;                  case DATA_IN_POSITION: //movement done.                      me->GetMotionMaster()->MovePoint(1, 735.81f, 661.92f, 412.39f); -                    if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_MAIN_GATE))) +                    if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_MAIN_GATE)))                          instance->HandleGameObject(go->GetGUID(), false);                      NextStep(10000, false, 3);                      break; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp index 3b919a778b3..949ee652d81 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp @@ -96,11 +96,10 @@ class instance_trial_of_the_crusader : public InstanceMapScript                  // make sure Anub'arak isnt missing and floor is destroyed after a crash                  if (GetBossState(BOSS_LICH_KING) == DONE && TrialCounter && GetBossState(BOSS_ANUBARAK) != DONE)                  { -                    Creature* anubArak = ObjectAccessor::GetCreature(*player, GetData64(NPC_ANUBARAK)); -                    if (!anubArak) +                    if (Creature* anubArak = ObjectAccessor::GetCreature(*player, GetData64(NPC_ANUBARAK)))                          anubArak = player->SummonCreature(NPC_ANUBARAK, AnubarakLoc[0].GetPositionX(), AnubarakLoc[0].GetPositionY(), AnubarakLoc[0].GetPositionZ(), 3, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); -                    if (GameObject* floor = GameObject::GetGameObject(*player, GetData64(GO_ARGENT_COLISEUM_FLOOR))) +                    if (GameObject* floor = ObjectAccessor::GetGameObject(*player, GetData64(GO_ARGENT_COLISEUM_FLOOR)))                          floor->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);                  }              } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp index 7829d1be627..b068b458073 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp @@ -201,7 +201,7 @@ class npc_announcer_toc10 : public CreatureScript              }              else if (instance->GetBossState(BOSS_LICH_KING) != DONE)              { -                if (GameObject* floor = GameObject::GetGameObject(*player, instance->GetData64(GO_ARGENT_COLISEUM_FLOOR))) +                if (GameObject* floor = ObjectAccessor::GetGameObject(*player, instance->GetData64(GO_ARGENT_COLISEUM_FLOOR)))                      floor->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);                  creature->CastSpell(creature, SPELL_CORPSE_TELEPORT, false); @@ -318,7 +318,7 @@ class boss_lich_king_toc : public CreatureScript                              break;                          case 5080:                          { -                            if (GameObject* go = GameObject::GetGameObject(*me, _instance->GetData64(GO_ARGENT_COLISEUM_FLOOR))) +                            if (GameObject* go = ObjectAccessor::GetGameObject(*me, _instance->GetData64(GO_ARGENT_COLISEUM_FLOOR)))                              {                                  go->SetDisplayId(DISPLAYID_DESTROYED_FLOOR);                                  go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_NODESPAWN); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index 3aebed81f0b..4b3c50d1388 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -510,7 +510,7 @@ class boss_prince_keleseth_icc : public CreatureScript                  }              } -            bool CheckRoom() +            bool CheckInRoom() override              {                  if (!CheckBoundary(me))                  { @@ -529,7 +529,7 @@ class boss_prince_keleseth_icc : public CreatureScript              void UpdateAI(uint32 diff) override              { -                if (!UpdateVictim() || !CheckRoom()) +                if (!UpdateVictim() || !CheckInRoom())                      return;                  events.Update(diff); @@ -729,7 +729,7 @@ class boss_prince_taldaram_icc : public CreatureScript                  }              } -            bool CheckRoom() +            bool CheckInRoom() override              {                  if (!CheckBoundary(me))                  { @@ -748,7 +748,7 @@ class boss_prince_taldaram_icc : public CreatureScript              void UpdateAI(uint32 diff) override              { -                if (!UpdateVictim() || !CheckRoom()) +                if (!UpdateVictim() || !CheckInRoom())                      return;                  events.Update(diff); @@ -968,7 +968,7 @@ class boss_prince_valanar_icc : public CreatureScript                  }              } -            bool CheckRoom() +            bool CheckInRoom() override              {                  if (!CheckBoundary(me))                  { @@ -987,7 +987,7 @@ class boss_prince_valanar_icc : public CreatureScript              void UpdateAI(uint32 diff) override              { -                if (!UpdateVictim() || !CheckRoom()) +                if (!UpdateVictim() || !CheckInRoom())                      return;                  events.Update(diff); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 4b9308fc12d..2909946a0db 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -305,12 +305,6 @@ class boss_deathbringer_saurfang : public CreatureScript                  _introDone = true; -                if (GameObject* teleporter = GameObject::GetGameObject(*me, instance->GetData64(GO_SCOURGE_TRANSPORTER_DEATHBRINGER))) -                { -                    instance->HandleGameObject(0, false, teleporter); -                    teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); -                } -                  Talk(SAY_AGGRO);                  events.ScheduleEvent(EVENT_SUMMON_BLOOD_BEAST, 30000, 0, PHASE_COMBAT);                  events.ScheduleEvent(EVENT_BERSERK, IsHeroic() ? 360000 : 480000, 0, PHASE_COMBAT); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index e403e37835c..23569ba77c2 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -2120,15 +2120,8 @@ class at_icc_shutdown_traps : public AreaTriggerScript          bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override          {              if (InstanceScript* instance = player->GetInstanceScript()) -            {                  instance->SetData(DATA_UPPERSPIRE_TELE_ACT, DONE); -                uint64 teleporterGUID = instance->GetData64(GO_SCOURGE_TRANSPORTER_UPPERSPIRE); -                if (GameObject* go = instance->instance->GetGameObject(teleporterGUID)) -                { -                    go->SetGoState(GO_STATE_ACTIVE); -                    go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); -                } -            } +              return true;          }  }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 2e566915922..9c26f93fd54 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -769,20 +769,6 @@ class instance_icecrown_citadel : public InstanceMapScript                          return DeathbringerSaurfangEventGUID;                      case GO_SAURFANG_S_DOOR:                          return DeathbringerSaurfangDoorGUID; -                    case GO_SCOURGE_TRANSPORTER_LICHKING: -                        return TeleporterLichKingGUID; -                    case GO_SCOURGE_TRANSPORTER_UPPERSPIRE: -                        return TeleporterUpperSpireGUID; -                    case GO_SCOURGE_TRANSPORTER_LIGHTSHAMMER: -                        return TeleporterLightsHammerGUID; -                    case GO_SCOURGE_TRANSPORTER_RAMPART: -                        return TeleporterRampartsGUID; -                    case GO_SCOURGE_TRANSPORTER_DEATHBRINGER: -                        return TeleporterDeathBringerGUID; -                    case GO_SCOURGE_TRANSPORTER_ORATORY: -                        return TeleporterOratoryGUID; -                    case GO_SCOURGE_TRANSPORTER_SINDRAGOSA: -                        return TeleporterSindragosaGUID;                      case DATA_FESTERGUT:                          return FestergutGUID;                      case DATA_ROTFACE: @@ -907,7 +893,12 @@ class instance_icecrown_citadel : public InstanceMapScript                              {                                  if (GameObject* teleporter = instance->GetGameObject(TeleporterDeathBringerGUID))                                      SetTeleporterState(teleporter, true); - +                                break; +                            } +                            case IN_PROGRESS: +                            { +                                if (GameObject* teleporter = instance->GetGameObject(TeleporterDeathBringerGUID)) +                                    SetTeleporterState(teleporter, false);                                  break;                              }                              default: @@ -1122,7 +1113,11 @@ class instance_icecrown_citadel : public InstanceMapScript                      case DATA_UPPERSPIRE_TELE_ACT:                          UpperSpireTeleporterActiveState = data;                          if (UpperSpireTeleporterActiveState == DONE) +                        { +                            if (GameObject* go = instance->GetGameObject(TeleporterUpperSpireGUID)) +                                SetTeleporterState(go, true);                              SaveToDB(); +                        }                          break;                      default:                          break; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp index ea345c0dee0..0f5320a8fa1 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -375,7 +375,7 @@ class boss_sapphiron : public CreatureScript                      for (IceBlockMap::const_iterator itr = _iceblocks.begin(); itr != _iceblocks.end(); ++itr)                      { -                        if (GameObject* go = GameObject::GetGameObject(*me, itr->second)) +                        if (GameObject* go = ObjectAccessor::GetGameObject(*me, itr->second))                          {                              if (go->IsInBetween(me, target, 2.0f)                                  && me->GetExactDist2d(target->GetPositionX(), target->GetPositionY()) - me->GetExactDist2d(go->GetPositionX(), go->GetPositionY()) < 5.0f) diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 4c80218b4ac..35d3985cfa1 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -3597,6 +3597,79 @@ class spell_gen_eject_all_passengers : public SpellScriptLoader          }  }; +enum GMFreeze +{ +    SPELL_GM_FREEZE = 9454 +}; + +class spell_gen_gm_freeze : public SpellScriptLoader +{ +    public: +        spell_gen_gm_freeze() : SpellScriptLoader("spell_gen_gm_freeze") { } + +        class spell_gen_gm_freeze_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_gen_gm_freeze_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_GM_FREEZE)) +                    return false; +                return true; +            } + +            void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            { +                // Do what was done before to the target in HandleFreezeCommand +                if (Player* player = GetTarget()->ToPlayer()) +                { +                    // stop combat + make player unattackable + duel stop + stop some spells +                    player->setFaction(35); +                    player->CombatStop(); +                    if (player->IsNonMeleeSpellCast(true)) +                        player->InterruptNonMeleeSpells(true); +                    player->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + +                    // if player class = hunter || warlock remove pet if alive +                    if ((player->getClass() == CLASS_HUNTER) || (player->getClass() == CLASS_WARLOCK)) +                    { +                        if (Pet* pet = player->GetPet()) +                        { +                            pet->SavePetToDB(PET_SAVE_AS_CURRENT); +                            // not let dismiss dead pet +                            if (pet->IsAlive()) +                                player->RemovePet(pet, PET_SAVE_NOT_IN_SLOT); +                        } +                    } +                } +            } + +            void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            { +                // Do what was done before to the target in HandleUnfreezeCommand +                if (Player* player = GetTarget()->ToPlayer()) +                { +                    // Reset player faction + allow combat + allow duels +                    player->setFactionForRace(player->getRace()); +                    player->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); +                    // save player +                    player->SaveToDB(); +                } +            } + +            void Register() override +            { +                OnEffectApply += AuraEffectApplyFn(spell_gen_gm_freeze_AuraScript::OnApply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); +                OnEffectRemove += AuraEffectRemoveFn(spell_gen_gm_freeze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_gen_gm_freeze_AuraScript(); +        } +}; +  void AddSC_generic_spell_scripts()  {      new spell_gen_absorb0_hitlimit1(); @@ -3679,4 +3752,5 @@ void AddSC_generic_spell_scripts()      new spell_gen_wg_water();      new spell_gen_whisper_gulch_yogg_saron_whisper();      new spell_gen_eject_all_passengers(); +    new spell_gen_gm_freeze();  } | 
