aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp150
-rw-r--r--src/server/scripts/Commands/cs_server.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp44
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp79
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp2
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp17
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp15
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h2
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp21
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp2
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp5
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp4
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp12
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp6
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp9
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp25
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp2
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp74
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();
}