aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp5
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundDS.h8
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundSA.cpp10
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundSA.h89
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundWS.cpp4
-rwxr-xr-xsrc/server/game/Chat/Chat.cpp1
-rwxr-xr-xsrc/server/game/Chat/Commands/Level2.cpp16
-rwxr-xr-xsrc/server/game/Scripting/ScriptLoader.cpp2
-rw-r--r--src/server/scripts/Commands/CMakeLists.txt1
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp11
-rw-r--r--src/server/scripts/Commands/cs_gps.cpp144
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp90
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp40
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp65
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp14
-rw-r--r--src/server/scripts/Spells/spell_item.cpp32
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp56
19 files changed, 323 insertions, 269 deletions
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
index 8a11edf85e6..ccc6a2305b4 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
@@ -86,11 +86,8 @@ void BattlegroundDS::PostUpdateImpl(uint32 diff)
setWaterFallTimer(BG_DS_WATERFALL_WARNING_DURATION);
setWaterFallStatus(BG_DS_WATERFALL_STATUS_WARNING);
}
- else if (getWaterFallStatus() == BG_DS_WATERFALL_STATUS_WARNING) // Active collision and perform knockback
+ else if (getWaterFallStatus() == BG_DS_WATERFALL_STATUS_WARNING) // Active collision and start knockback timer
{
- if (Creature* waterSpout = GetBgMap()->GetCreature(BgCreatures[BG_DS_NPC_WATERFALL_KNOCKBACK]))
- waterSpout->CastSpell(waterSpout, BG_DS_SPELL_WATER_SPOUT, true);
-
if (GameObject* gob = GetBgMap()->GetGameObject(BgObjects[BG_DS_OBJECT_WATER_1]))
gob->SetGoState(GO_STATE_READY);
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundDS.h b/src/server/game/Battlegrounds/Zones/BattlegroundDS.h
index 12ed91fc922..aaf08ba1313 100755
--- a/src/server/game/Battlegrounds/Zones/BattlegroundDS.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundDS.h
@@ -66,9 +66,9 @@ enum BattlegroundDSData
{ // These values are NOT blizzlike... need the correct data!
BG_DS_WATERFALL_TIMER_MIN = 30000,
BG_DS_WATERFALL_TIMER_MAX = 60000,
- BG_DS_WATERFALL_WARNING_DURATION = 7000,
- BG_DS_WATERFALL_DURATION = 10000,
- BG_DS_WATERFALL_KNOCKBACK_TIMER = 500,
+ BG_DS_WATERFALL_WARNING_DURATION = 5000,
+ BG_DS_WATERFALL_DURATION = 30000,
+ BG_DS_WATERFALL_KNOCKBACK_TIMER = 1500,
BG_DS_PIPE_KNOCKBACK_FIRST_DELAY = 5000,
BG_DS_PIPE_KNOCKBACK_DELAY = 3000,
@@ -118,7 +118,7 @@ class BattlegroundDS : public Battleground
void setWaterFallStatus(uint8 status) { _waterfallStatus = status; };
uint32 getWaterFallTimer() { return _waterfallTimer; };
void setWaterFallTimer(uint32 timer) { _waterfallTimer = timer; };
- uint32 getWaterFallKnockbackTimer() { return _waterfallTimer; };
+ uint32 getWaterFallKnockbackTimer() { return _waterfallKnockbackTimer; };
void setWaterFallKnockbackTimer(uint32 timer) { _waterfallKnockbackTimer = timer; };
uint8 getPipeKnockBackCount() { return _pipeKnockBackCount; };
void setPipeKnockBackCount(uint8 count) { _pipeKnockBackCount = count; };
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
index 6d784488aad..977897b8d48 100755
--- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
@@ -534,16 +534,16 @@ void BattlegroundSA::EventPlayerDamagedGO(Player* /*player*/, GameObject* go, ui
if (eventType == go->GetGOInfo()->building.damagedEvent)
{
- uint32 i = GetGateIDFromDestroyEventID(eventType);
+ uint32 i = getGateIdFromDamagedOrDestroyEventId(eventType);
GateStatus[i] = BG_SA_GATE_DAMAGED;
- uint32 uws = GetWorldStateFromGateID(i);
+ uint32 uws = getWorldStateFromGateId(i);
if (uws)
UpdateWorldState(uws, GateStatus[i]);
}
if (eventType == go->GetGOInfo()->building.destroyedEvent)
{
- if (go->GetGOInfo()->building.destroyedEvent == 19837)
+ if (go->GetGOInfo()->building.destroyedEvent == BG_SA_EVENT_ANCIENT_GATE_DESTROYED)
SendWarningToAll(LANG_BG_SA_CHAMBER_BREACHED);
else
SendWarningToAll(LANG_BG_SA_WAS_DESTROYED, go->GetGOInfo()->name.c_str());
@@ -603,7 +603,7 @@ void BattlegroundSA::DemolisherStartState(bool start)
void BattlegroundSA::DestroyGate(Player* player, GameObject* go)
{
- uint32 i = GetGateIDFromDestroyEventID(go->GetGOInfo()->building.destroyedEvent);
+ uint32 i = getGateIdFromDamagedOrDestroyEventId(go->GetGOInfo()->building.destroyedEvent);
if (!GateStatus[i])
return;
@@ -612,7 +612,7 @@ void BattlegroundSA::DestroyGate(Player* player, GameObject* go)
if (g->GetGOValue()->Building.Health == 0)
{
GateStatus[i] = BG_SA_GATE_DESTROYED;
- uint32 uws = GetWorldStateFromGateID(i);
+ uint32 uws = getWorldStateFromGateId(i);
if (uws)
UpdateWorldState(uws, GateStatus[i]);
bool rewardHonor = true;
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
index 76a772ff978..2ade101ce54 100755
--- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
@@ -45,9 +45,30 @@ enum BG_SA_Status
enum BG_SA_GateState
{
- BG_SA_GATE_OK = 1,
- BG_SA_GATE_DAMAGED = 2,
- BG_SA_GATE_DESTROYED = 3
+ BG_SA_GATE_OK = 1,
+ BG_SA_GATE_DAMAGED = 2,
+ BG_SA_GATE_DESTROYED = 3
+};
+
+enum BG_SA_EventIdGate
+{
+ BG_SA_EVENT_GREEN_GATE_DAMAGED = 19041,
+ BG_SA_EVENT_GREEN_GATE_DESTROYED = 19046,
+
+ BG_SA_EVENT_BLUE_GATE_DAMAGED = 19040,
+ BG_SA_EVENT_BLUE_GATE_DESTROYED = 19045,
+
+ BG_SA_EVENT_RED_GATE_DAMAGED = 19042,
+ BG_SA_EVENT_RED_GATE_DESTROYED = 19047,
+
+ BG_SA_EVENT_PURPLE_GATE_DAMAGED = 19048,
+ BG_SA_EVENT_PURPLE_GATE_DESTROYED = 19043,
+
+ BG_SA_EVENT_YELLOW_GATE_DAMAGED = 19049,
+ BG_SA_EVENT_YELLOW_GATE_DESTROYED = 19044,
+
+ BG_SA_EVENT_ANCIENT_GATE_DAMAGED = 19836,
+ BG_SA_EVENT_ANCIENT_GATE_DESTROYED = 19837
};
enum BG_SA_Timers
@@ -443,34 +464,60 @@ class BattlegroundSA : public Battleground
/// Called when a player use a gamobject (relic)
virtual void EventPlayerUsedGO(Player* Source, GameObject* object);
/// Return gate id, relative to bg data, according to gameobject id
- uint32 GetGateIDFromDestroyEventID(uint32 id)
+ uint32 getGateIdFromDamagedOrDestroyEventId(uint32 id)
{
- uint32 i = 0;
switch (id)
{
- case 19046: i = BG_SA_GREEN_GATE; break; //Green gate destroyed
- case 19045: i = BG_SA_BLUE_GATE; break; //blue gate
- case 19047: i = BG_SA_RED_GATE; break; //red gate
- case 19048: i = BG_SA_PURPLE_GATE; break; //purple gate
- case 19049: i = BG_SA_YELLOW_GATE; break; //yellow gate
- case 19837: i = BG_SA_ANCIENT_GATE; break; //ancient gate
+ // Green gate
+ case BG_SA_EVENT_GREEN_GATE_DAMAGED:
+ case BG_SA_EVENT_GREEN_GATE_DESTROYED:
+ return BG_SA_GREEN_GATE;
+ // Blue gate
+ case BG_SA_EVENT_BLUE_GATE_DAMAGED:
+ case BG_SA_EVENT_BLUE_GATE_DESTROYED:
+ return BG_SA_BLUE_GATE;
+ // Red gate
+ case BG_SA_EVENT_RED_GATE_DAMAGED:
+ case BG_SA_EVENT_RED_GATE_DESTROYED:
+ return BG_SA_RED_GATE;
+ // Purple gate
+ case BG_SA_EVENT_PURPLE_GATE_DAMAGED:
+ case BG_SA_EVENT_PURPLE_GATE_DESTROYED:
+ return BG_SA_PURPLE_GATE;
+ // Yellow gate
+ case BG_SA_EVENT_YELLOW_GATE_DAMAGED:
+ case BG_SA_EVENT_YELLOW_GATE_DESTROYED:
+ return BG_SA_YELLOW_GATE;
+ // Ancient gate
+ case BG_SA_EVENT_ANCIENT_GATE_DAMAGED:
+ case BG_SA_EVENT_ANCIENT_GATE_DESTROYED:
+ return BG_SA_ANCIENT_GATE;
+ default:
+ break;
}
- return i;
+ return 0;
}
/// Return worldstate id, according to door id
- uint32 GetWorldStateFromGateID(uint32 id)
+ uint32 getWorldStateFromGateId(uint32 id)
{
- uint32 uws = 0;
switch (id)
{
- case BG_SA_GREEN_GATE: uws = BG_SA_GREEN_GATEWS; break;
- case BG_SA_YELLOW_GATE: uws = BG_SA_YELLOW_GATEWS; break;
- case BG_SA_BLUE_GATE: uws = BG_SA_BLUE_GATEWS; break;
- case BG_SA_RED_GATE: uws = BG_SA_RED_GATEWS; break;
- case BG_SA_PURPLE_GATE: uws = BG_SA_PURPLE_GATEWS; break;
- case BG_SA_ANCIENT_GATE: uws = BG_SA_ANCIENT_GATEWS; break;
+ case BG_SA_GREEN_GATE:
+ return BG_SA_GREEN_GATEWS;
+ case BG_SA_YELLOW_GATE:
+ return BG_SA_YELLOW_GATEWS;
+ case BG_SA_BLUE_GATE:
+ return BG_SA_BLUE_GATEWS;
+ case BG_SA_RED_GATE:
+ return BG_SA_RED_GATEWS;
+ case BG_SA_PURPLE_GATE:
+ return BG_SA_PURPLE_GATEWS;
+ case BG_SA_ANCIENT_GATE:
+ return BG_SA_ANCIENT_GATEWS;
+ default:
+ break;
}
- return uws;
+ return 0;
}
/// Called on battleground ending
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
index 495178f18dd..d100dc645a2 100755
--- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
@@ -476,7 +476,7 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target
}
//Alliance flag on ground(not in base) (returned or picked up again from ground!)
- if (GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_GROUND && Source->IsWithinDistInMap(target_obj, 10) && BgObjects[BG_WS_OBJECT_A_FLAG] == target_obj->GetGUID())
+ if (GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_GROUND && Source->IsWithinDistInMap(target_obj, 10) && target_obj->GetGOInfo()->entry == BG_OBJECT_A_FLAG_GROUND_WS_ENTRY)
{
if (Source->GetTeam() == ALLIANCE)
{
@@ -510,7 +510,7 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target
}
//Horde flag on ground(not in base) (returned or picked up again)
- if (GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_GROUND && Source->IsWithinDistInMap(target_obj, 10) && BgObjects[BG_WS_OBJECT_H_FLAG] == target_obj->GetGUID())
+ if (GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_GROUND && Source->IsWithinDistInMap(target_obj, 10) && target_obj->GetGOInfo()->entry == BG_OBJECT_H_FLAG_GROUND_WS_ENTRY)
{
if (Source->GetTeam() == HORDE)
{
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 042f16be3cc..cc64a8e22dd 100755
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -359,7 +359,6 @@ ChatCommand* ChatHandler::getCommandTable()
{ "summon", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleSummonCommand>, "", NULL },
{ "groupsummon", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleGroupSummonCommand>, "", NULL },
{ "commands", SEC_PLAYER, true, OldHandler<&ChatHandler::HandleCommandsCommand>, "", NULL },
- { "demorph", SEC_GAMEMASTER, false, OldHandler<&ChatHandler::HandleDeMorphCommand>, "", NULL },
{ "die", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleDieCommand>, "", NULL },
{ "revive", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandleReviveCommand>, "", NULL },
{ "dismount", SEC_PLAYER, false, OldHandler<&ChatHandler::HandleDismountCommand>, "", NULL },
diff --git a/src/server/game/Chat/Commands/Level2.cpp b/src/server/game/Chat/Commands/Level2.cpp
index cc638193b5a..52bdcd15163 100755
--- a/src/server/game/Chat/Commands/Level2.cpp
+++ b/src/server/game/Chat/Commands/Level2.cpp
@@ -205,22 +205,6 @@ bool ChatHandler::HandleItemMoveCommand(const char* args)
return true;
}
-//demorph player or unit
-bool ChatHandler::HandleDeMorphCommand(const char* /*args*/)
-{
- Unit* target = getSelectedUnit();
- if (!target)
- target = m_session->GetPlayer();
-
- // check online security
- else if (target->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)target, 0))
- return false;
-
- target->DeMorph();
-
- return true;
-}
-
//kick player
bool ChatHandler::HandleKickPlayerCommand(const char *args)
{
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index 476b0082617..f64d0953e86 100755
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -61,7 +61,6 @@ void AddSC_reload_commandscript();
void AddSC_tele_commandscript();
void AddSC_titles_commandscript();
void AddSC_wp_commandscript();
-void AddSC_gps_commandscript();
#ifdef SCRIPTS
//world
@@ -664,7 +663,6 @@ void AddCommandScripts()
AddSC_tele_commandscript();
AddSC_titles_commandscript();
AddSC_wp_commandscript();
- AddSC_gps_commandscript();
}
void AddWorldScripts()
diff --git a/src/server/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt
index d14e71aac4a..86fe984e197 100644
--- a/src/server/scripts/Commands/CMakeLists.txt
+++ b/src/server/scripts/Commands/CMakeLists.txt
@@ -17,7 +17,6 @@ set(scripts_STAT_SRCS
Commands/cs_gm.cpp
Commands/cs_go.cpp
Commands/cs_gobject.cpp
- Commands/cs_gps.cpp
Commands/cs_honor.cpp
Commands/cs_learn.cpp
Commands/cs_misc.cpp
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 679bb450800..c7bcde01e9b 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -95,6 +95,7 @@ public:
static ChatCommand commandTable[] =
{
{ "debug", SEC_MODERATOR, true, NULL, "", debugCommandTable },
+ { "wpgps", SEC_ADMINISTRATOR, false, &HandleWPGPSCommand, "", NULL },
{ NULL, SEC_PLAYER, false, NULL, "", NULL }
};
return commandTable;
@@ -1319,6 +1320,16 @@ public:
return true;
}
+
+ static bool HandleWPGPSCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Player* player = handler->GetSession()->GetPlayer();
+
+ sLog->outSQLDev("(@PATH, XX, %.3f, %.3f, %.5f, 0,0, 0,100, 0),", player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
+
+ handler->PSendSysMessage("Waypoint SQL written to SQL Developer log");
+ return true;
+ }
};
void AddSC_debug_commandscript()
diff --git a/src/server/scripts/Commands/cs_gps.cpp b/src/server/scripts/Commands/cs_gps.cpp
deleted file mode 100644
index 59e2ec90905..00000000000
--- a/src/server/scripts/Commands/cs_gps.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* ScriptData
-Name: gps_commandscript
-%Complete: 100
-Comment: GPS/WPGPS commands
-Category: commandscripts
-EndScriptData */
-
-#include "ObjectAccessor.h"
-#include "ScriptMgr.h"
-#include "Chat.h"
-#include "CellImpl.h"
-
-class gps_commandscript : public CommandScript
-{
-public:
- gps_commandscript() : CommandScript("gps_commandscript") { }
-
- ChatCommand* GetCommands() const
- {
- static ChatCommand commandTable[] =
- {
- { "gps", SEC_ADMINISTRATOR, false, &HandleGPSCommand, "", NULL },
- { "wpgps", SEC_ADMINISTRATOR, false, &HandleWPGPSCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
- };
- return commandTable;
- }
-
- static bool HandleGPSCommand(ChatHandler* handler, char const* args)
- {
- WorldObject* object = NULL;
- if (*args)
- {
- uint64 guid = handler->extractGuidFromLink((char*)args);
- if (guid)
- object = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*handler->GetSession()->GetPlayer(), guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT);
-
- if (!object)
- {
- handler->SendSysMessage(LANG_PLAYER_NOT_FOUND);
- handler->SetSentErrorMessage(true);
- return false;
- }
- }
- else
- {
- object = handler->getSelectedUnit();
-
- if (!object)
- {
- handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE);
- handler->SetSentErrorMessage(true);
- return false;
- }
- }
-
- CellCoord cellCoord = Trinity::ComputeCellCoord(object->GetPositionX(), object->GetPositionY());
- Cell cell(cellCoord);
-
- uint32 zoneId, areaId;
- object->GetZoneAndAreaId(zoneId, areaId);
-
- MapEntry const* mapEntry = sMapStore.LookupEntry(object->GetMapId());
- AreaTableEntry const* zoneEntry = GetAreaEntryByAreaID(zoneId);
- AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaId);
-
- float zoneX = object->GetPositionX();
- float zoneY = object->GetPositionY();
-
- Map2ZoneCoordinates(zoneX, zoneY, zoneId);
-
- Map const* map = object->GetMap();
- float groundZ = map->GetHeight(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), MAX_HEIGHT);
- float floorZ = map->GetHeight(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ());
-
- GridCoord gridCoord = Trinity::ComputeGridCoord(object->GetPositionX(), object->GetPositionY());
-
- // 63? WHY?
- int gridX = 63 - gridCoord.x_coord;
- int gridY = 63 - gridCoord.y_coord;
-
- uint32 haveMap = Map::ExistMap(object->GetMapId(), gridX, gridY) ? 1 : 0;
- uint32 haveVMap = Map::ExistVMap(object->GetMapId(), gridX, gridY) ? 1 : 0;
-
- if (haveVMap)
- {
- if (map->IsOutdoors(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ()))
- handler->PSendSysMessage("You are outdoors");
- else
- handler->PSendSysMessage("You are indoors");
- }
- else
- handler->PSendSysMessage("no VMAP available for area info");
-
- handler->PSendSysMessage(LANG_MAP_POSITION,
- object->GetMapId(), (mapEntry ? mapEntry->name[handler->GetSessionDbcLocale()] : "<unknown>"),
- zoneId, (zoneEntry ? zoneEntry->area_name[handler->GetSessionDbcLocale()] : "<unknown>"),
- areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : "<unknown>"),
- object->GetPhaseMask(),
- object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(),
- cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(),
- zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap);
-
- LiquidData liquidStatus;
- ZLiquidStatus status = map->getLiquidStatus(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), MAP_ALL_LIQUIDS, &liquidStatus);
-
- if (status)
- handler->PSendSysMessage(LANG_LIQUID_STATUS, liquidStatus.level, liquidStatus.depth_level, liquidStatus.entry, liquidStatus.type_flags, status);
-
- return true;
- }
-
- static bool HandleWPGPSCommand(ChatHandler* handler, char const* /*args*/)
- {
- Player* player = handler->GetSession()->GetPlayer();
-
- sLog->outSQLDev("(@PATH, XX, %.3f, %.3f, %.5f, 0,0, 0,100, 0),", player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
-
- handler->PSendSysMessage("Waypoint SQL written to SQL Developer log");
- return true;
- }
-};
-
-void AddSC_gps_commandscript()
-{
- new gps_commandscript();
-}
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 5f0434e5c55..7c431566f52 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -17,6 +17,9 @@
#include "ScriptPCH.h"
#include "Chat.h"
+#include "ObjectAccessor.h"
+#include "ScriptMgr.h"
+#include "CellImpl.h"
class misc_commandscript : public CommandScript
{
@@ -27,7 +30,8 @@ public:
{
static ChatCommand commandTable[] =
{
- { "dev", SEC_ADMINISTRATOR, false, &HandleDevCommand, "", NULL },
+ { "dev", SEC_ADMINISTRATOR, false, &HandleDevCommand, "", NULL },
+ { "gps", SEC_ADMINISTRATOR, false, &HandleGPSCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
return commandTable;
@@ -64,6 +68,90 @@ public:
handler->SetSentErrorMessage(true);
return false;
}
+
+ static bool HandleGPSCommand(ChatHandler* handler, char const* args)
+ {
+ WorldObject* object = NULL;
+ if (*args)
+ {
+ uint64 guid = handler->extractGuidFromLink((char*)args);
+ if (guid)
+ object = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*handler->GetSession()->GetPlayer(), guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT);
+
+ if (!object)
+ {
+ handler->SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ }
+ else
+ {
+ object = handler->getSelectedUnit();
+
+ if (!object)
+ {
+ handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ }
+
+ CellCoord cellCoord = Trinity::ComputeCellCoord(object->GetPositionX(), object->GetPositionY());
+ Cell cell(cellCoord);
+
+ uint32 zoneId, areaId;
+ object->GetZoneAndAreaId(zoneId, areaId);
+
+ MapEntry const* mapEntry = sMapStore.LookupEntry(object->GetMapId());
+ AreaTableEntry const* zoneEntry = GetAreaEntryByAreaID(zoneId);
+ AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaId);
+
+ float zoneX = object->GetPositionX();
+ float zoneY = object->GetPositionY();
+
+ Map2ZoneCoordinates(zoneX, zoneY, zoneId);
+
+ Map const* map = object->GetMap();
+ float groundZ = map->GetHeight(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), MAX_HEIGHT);
+ float floorZ = map->GetHeight(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ());
+
+ GridCoord gridCoord = Trinity::ComputeGridCoord(object->GetPositionX(), object->GetPositionY());
+
+ // 63? WHY?
+ int gridX = 63 - gridCoord.x_coord;
+ int gridY = 63 - gridCoord.y_coord;
+
+ uint32 haveMap = Map::ExistMap(object->GetMapId(), gridX, gridY) ? 1 : 0;
+ uint32 haveVMap = Map::ExistVMap(object->GetMapId(), gridX, gridY) ? 1 : 0;
+
+ if (haveVMap)
+ {
+ if (map->IsOutdoors(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ()))
+ handler->PSendSysMessage("You are outdoors");
+ else
+ handler->PSendSysMessage("You are indoors");
+ }
+ else
+ handler->PSendSysMessage("no VMAP available for area info");
+
+ handler->PSendSysMessage(LANG_MAP_POSITION,
+ object->GetMapId(), (mapEntry ? mapEntry->name[handler->GetSessionDbcLocale()] : "<unknown>"),
+ zoneId, (zoneEntry ? zoneEntry->area_name[handler->GetSessionDbcLocale()] : "<unknown>"),
+ areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : "<unknown>"),
+ object->GetPhaseMask(),
+ object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(),
+ cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(),
+ zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap);
+
+ LiquidData liquidStatus;
+ ZLiquidStatus status = map->getLiquidStatus(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), MAP_ALL_LIQUIDS, &liquidStatus);
+
+ if (status)
+ handler->PSendSysMessage(LANG_LIQUID_STATUS, liquidStatus.level, liquidStatus.depth_level, liquidStatus.entry, liquidStatus.type_flags, status);
+
+ return true;
+ }
};
void AddSC_misc_commandscript()
diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp
index bb3a4d65b76..b6feccc10c6 100644
--- a/src/server/scripts/Commands/cs_modify.cpp
+++ b/src/server/scripts/Commands/cs_modify.cpp
@@ -33,6 +33,16 @@ public:
ChatCommand* GetCommands() const
{
+ static ChatCommand modifyspeedCommandTable[] =
+ {
+ { "fly", SEC_MODERATOR, false, &HandleModifyFlyCommand, "", NULL },
+ { "all", SEC_MODERATOR, false, &HandleModifyASpeedCommand, "", NULL },
+ { "walk", SEC_MODERATOR, false, &HandleModifySpeedCommand, "", NULL },
+ { "backwalk", SEC_MODERATOR, false, &HandleModifyBWalkCommand, "", NULL },
+ { "swim", SEC_MODERATOR, false, &HandleModifySwimCommand, "", NULL },
+ { "", SEC_MODERATOR, false, &HandleModifyASpeedCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
static ChatCommand modifyCommandTable[] =
{
{ "hp", SEC_MODERATOR, false, &HandleModifyHPCommand, "", NULL },
@@ -41,29 +51,26 @@ public:
{ "runicpower", SEC_MODERATOR, false, &HandleModifyRunicPowerCommand, "", NULL },
{ "energy", SEC_MODERATOR, false, &HandleModifyEnergyCommand, "", NULL },
{ "money", SEC_MODERATOR, false, &HandleModifyMoneyCommand, "", NULL },
- { "speed", SEC_MODERATOR, false, &HandleModifySpeedCommand, "", NULL },
- { "swim", SEC_MODERATOR, false, &HandleModifySwimCommand, "", NULL },
{ "scale", SEC_MODERATOR, false, &HandleModifyScaleCommand, "", NULL },
{ "bit", SEC_MODERATOR, false, &HandleModifyBitCommand, "", NULL },
- { "bwalk", SEC_MODERATOR, false, &HandleModifyBWalkCommand, "", NULL },
- { "fly", SEC_MODERATOR, false, &HandleModifyFlyCommand, "", NULL },
- { "aspeed", SEC_MODERATOR, false, &HandleModifyASpeedCommand, "", NULL },
{ "faction", SEC_MODERATOR, false, &HandleModifyFactionCommand, "", NULL },
{ "spell", SEC_MODERATOR, false, &HandleModifySpellCommand, "", NULL },
- { "tp", SEC_MODERATOR, false, &HandleModifyTalentCommand, "", NULL },
+ { "talentpoints", SEC_MODERATOR, false, &HandleModifyTalentCommand, "", NULL },
{ "mount", SEC_MODERATOR, false, &HandleModifyMountCommand, "", NULL },
{ "honor", SEC_MODERATOR, false, &HandleModifyHonorCommand, "", NULL },
- { "rep", SEC_GAMEMASTER, false, &HandleModifyRepCommand, "", NULL },
- { "arena", SEC_MODERATOR, false, &HandleModifyArenaCommand, "", NULL },
+ { "reputation", SEC_GAMEMASTER, false, &HandleModifyRepCommand, "", NULL },
+ { "arenapoints", SEC_MODERATOR, false, &HandleModifyArenaCommand, "", NULL },
{ "drunk", SEC_MODERATOR, false, &HandleModifyDrunkCommand, "", NULL },
{ "standstate", SEC_GAMEMASTER, false, &HandleModifyStandStateCommand, "", NULL },
- { "morph", SEC_GAMEMASTER, false, &HandleModifyMorphCommand, "", NULL },
{ "phase", SEC_ADMINISTRATOR, false, &HandleModifyPhaseCommand, "", NULL },
{ "gender", SEC_GAMEMASTER, false, &HandleModifyGenderCommand, "", NULL },
+ { "speed", SEC_MODERATOR, false, NULL, "", modifyspeedCommandTable },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
+ { "morph", SEC_GAMEMASTER, false, &HandleModifyMorphCommand, "", NULL },
+ { "demorph", SEC_GAMEMASTER, false, &HandleDeMorphCommand, "", NULL },
{ "modify", SEC_MODERATOR, false, NULL, "", modifyCommandTable },
{ NULL, 0, false, NULL, "", NULL }
};
@@ -1376,6 +1383,21 @@ public:
return true;
}
+//demorph player or unit
+ static bool HandleDeMorphCommand(ChatHandler* handler, const char* /*args*/)
+ {
+ Unit* target = handler->getSelectedUnit();
+ if (!target)
+ target = handler->GetSession()->GetPlayer();
+
+ // check online security
+ else if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer(), 0))
+ return false;
+
+ target->DeMorph();
+
+ return true;
+ }
};
void AddSC_modify_commandscript()
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 de104a78e43..8090fc98101 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
@@ -103,6 +103,7 @@ enum Spells
SPELL_UNSTABLE = 72059,
SPELL_KINETIC_BOMB_VISUAL = 72054,
SPELL_KINETIC_BOMB_EXPLOSION = 72052,
+ SPELL_KINETIC_BOMB_KNOCKBACK = 72087,
// Shock Vortex
SPELL_SHOCK_VORTEX_PERIODIC = 71945,
@@ -443,20 +444,12 @@ class boss_prince_keleseth_icc : public CreatureScript
{
summons.Summon(summon);
Position pos;
- pos.Relocate(summon);
+ me->GetPosition(&pos);
float maxRange = me->GetDistance2d(summon);
float angle = me->GetAngle(summon);
- // prevent spawning outside of room
- while (!me->IsWithinLOS(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()))
- {
- maxRange -= 5.0f;
- if (maxRange < 5.0f)
- break;
-
- summon->MovePosition(pos, float(rand_norm() * maxRange), angle);
- }
-
+ me->MovePositionToFirstCollision(pos, maxRange, angle);
summon->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation());
+ summon->ToTempSummon()->SetTempSummonType(TEMPSUMMON_CORPSE_DESPAWN);
}
void DamageDealt(Unit* /*target*/, uint32& damage, DamageEffectType damageType)
@@ -894,6 +887,7 @@ class boss_prince_valanar_icc : public CreatureScript
summon->GetPosition(x, y, z);
float ground_Z = summon->GetMap()->GetHeight(summon->GetPhaseMask(), x, y, z, true, 500.0f);
summon->GetMotionMaster()->MovePoint(POINT_KINETIC_BOMB_IMPACT, x, y, ground_Z);
+ summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
break;
}
case NPC_SHOCK_VORTEX:
@@ -1073,7 +1067,7 @@ class npc_blood_queen_lana_thel : public CreatureScript
if (_introDone)
return;
- if (!me->IsWithinDistInMap(who, 35.0f))
+ if (!me->IsWithinDistInMap(who, 35.0f, false))
return;
_introDone = true;
@@ -1232,12 +1226,12 @@ class npc_kinetic_bomb : public CreatureScript
void Reset()
{
_events.Reset();
- me->SetDisplayId(DISPLAY_KINETIC_BOMB);
+ me->SetWalk(true);
me->CastSpell(me, SPELL_UNSTABLE, true);
me->CastSpell(me, SPELL_KINETIC_BOMB_VISUAL, true);
me->SetReactState(REACT_PASSIVE);
- me->SetSpeed(MOVE_FLIGHT, IsHeroic() ? 0.3f : 0.15f, true);
me->GetPosition(_x, _y, _groundZ);
+ me->DespawnOrUnsummon(60000);
_groundZ = me->GetMap()->GetHeight(me->GetPhaseMask(), _x, _y, _groundZ, true, 500.0f);
}
@@ -1247,9 +1241,9 @@ class npc_kinetic_bomb : public CreatureScript
_events.ScheduleEvent(EVENT_BOMB_DESPAWN, 1000);
else if (action == ACTION_KINETIC_BOMB_JUMP)
{
- me->GetMotionMaster()->Clear();
- me->GetMotionMaster()->MoveJump(_x, _y, me->GetPositionZ() + 7.0f, 1.0f, 7.0f);
- _events.ScheduleEvent(EVENT_CONTINUE_FALLING, 700);
+ if (!me->HasAura(SPELL_KINETIC_BOMB_KNOCKBACK))
+ me->GetMotionMaster()->MoveCharge(_x, _y, me->GetPositionZ() + 100.0f, me->GetSpeed(MOVE_RUN), 0);
+ _events.RescheduleEvent(EVENT_CONTINUE_FALLING, 3000);
}
}
@@ -1263,10 +1257,10 @@ class npc_kinetic_bomb : public CreatureScript
{
case EVENT_BOMB_DESPAWN:
me->SetVisible(false);
+ me->DespawnOrUnsummon(5000);
break;
case EVENT_CONTINUE_FALLING:
- me->GetMotionMaster()->Clear();
- me->GetMotionMaster()->MovePoint(POINT_KINETIC_BOMB_IMPACT, _x, _y, _groundZ);
+ me->GetMotionMaster()->MoveCharge(_x, _y, _groundZ, me->GetSpeed(MOVE_WALK), POINT_KINETIC_BOMB_IMPACT);
break;
default:
break;
@@ -1329,17 +1323,16 @@ class npc_dark_nucleus : public CreatureScript
void DamageTaken(Unit* attacker, uint32& /*damage*/)
{
- if (attacker == me)
+ if (attacker == me || attacker == me->getVictim())
return;
- if (!_lockedTarget)
- if (me->getVictim() == attacker)
- _lockedTarget = true;
+ me->DeleteThreatList();
+ me->AddThreat(attacker, 500000000.0f);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 const diff)
{
- if (!me->isInCombat())
+ if (!UpdateVictim())
return;
if (_targetAuraCheck <= diff)
@@ -1355,23 +1348,6 @@ class npc_dark_nucleus : public CreatureScript
}
else
_targetAuraCheck -= diff;
-
- if (!_lockedTarget)
- {
- if (Unit* victim = me->SelectVictim())
- {
- if (me->getVictim() && me->getVictim() != victim)
- {
- me->getVictim()->RemoveAurasDueToSpell(SPELL_SHADOW_RESONANCE_RESIST, me->GetGUID());
- _lockedTarget = true;
- }
-
- _lockedTarget = true;
- AttackStart(victim);
- DoCast(victim, SPELL_SHADOW_RESONANCE_RESIST);
- me->ClearUnitState(UNIT_STATE_CASTING);
- }
- }
}
private:
@@ -1525,6 +1501,7 @@ class spell_valanar_kinetic_bomb : public SpellScriptLoader
Position offset = {0.0f, 0.0f, 20.0f, 0.0f};
summonPos.RelocateOffset(offset);
SetTargetDest(summonPos);
+ GetHitDest()->RelocateOffset(offset);
}
void Register()
@@ -1586,7 +1563,7 @@ class spell_valanar_kinetic_bomb_knockback : public SpellScriptLoader
void Register()
{
- AfterHit += SpellHitFn(spell_valanar_kinetic_bomb_knockback_SpellScript::KnockIntoAir);
+ BeforeHit += SpellHitFn(spell_valanar_kinetic_bomb_knockback_SpellScript::KnockIntoAir);
}
};
@@ -1663,7 +1640,7 @@ class spell_blood_council_shadow_prison_damage : public SpellScriptLoader
void AddExtraDamage()
{
if (Aura* aur = GetHitUnit()->GetAura(GetSpellInfo()->Id))
- if (AuraEffect const* eff = aur->GetEffect(1))
+ if (AuraEffect const* eff = aur->GetEffect(EFFECT_1))
SetHitDamage(GetHitDamage() + eff->GetAmount());
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
index 273f2a20b4b..c043cb27c7c 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
@@ -544,7 +544,7 @@ class boss_professor_putricide : public CreatureScript
void UpdateAI(uint32 const diff)
{
- if ((!UpdateVictim() && !(events.GetPhaseMask() & PHASE_MASK_NOT_SELF)) || !CheckInRoom())
+ if ((!(events.GetPhaseMask() & PHASE_MASK_NOT_SELF) && !UpdateVictim()) || !CheckInRoom())
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index ab924d1b543..ebf9ae02a95 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -713,6 +713,7 @@ class npc_spinestalker : public CreatureScript
me->SetDisableGravity(false);
me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
me->SetHomePosition(SpinestalkerLandPos);
+ me->SetFacingTo(SpinestalkerLandPos.GetOrientation());
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
@@ -839,6 +840,7 @@ class npc_rimefang : public CreatureScript
me->SetDisableGravity(false);
me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
me->SetHomePosition(RimefangLandPos);
+ me->SetFacingTo(RimefangLandPos.GetOrientation());
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index c99fde1739c..8d562a23f67 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -796,7 +796,8 @@ class boss_sister_svalna : public CreatureScript
{
_JustReachedHome();
me->SetReactState(REACT_PASSIVE);
- me->SetCanFly(false);
+ me->SetDisableGravity(false);
+ me->SetHover(false);
}
void DoAction(int32 const action)
@@ -838,13 +839,14 @@ class boss_sister_svalna : public CreatureScript
void MovementInform(uint32 type, uint32 id)
{
- if (type != POINT_MOTION_TYPE || id != POINT_LAND)
+ if (type != EFFECT_MOTION_TYPE || id != POINT_LAND)
return;
_isEventInProgress = false;
me->setActive(false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
- me->SetCanFly(false);
+ me->SetDisableGravity(false);
+ me->SetHover(false);
}
void SpellHitTarget(Unit* target, SpellInfo const* spell)
@@ -1921,10 +1923,10 @@ class spell_svalna_revive_champion : public SpellScriptLoader
Position pos;
caster->GetPosition(&pos);
caster->GetNearPosition(pos, 5.0f, 0.0f);
- pos.m_positionZ = caster->GetBaseMap()->GetHeight(caster->GetPhaseMask(), pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), true, 20.0f);
- pos.m_positionZ += 0.05f;
+ //pos.m_positionZ = caster->GetBaseMap()->GetHeight(caster->GetPhaseMask(), pos.GetPositionX(), pos.GetPositionY(), caster->GetPositionZ(), true, 50.0f);
+ //pos.m_positionZ += 0.05f;
caster->SetHomePosition(pos);
- caster->GetMotionMaster()->MovePoint(POINT_LAND, pos);
+ caster->GetMotionMaster()->MoveLand(POINT_LAND, pos, caster->GetSpeed(MOVE_FLIGHT));
}
void Register()
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index 666477e68e7..3c5d6438275 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -1744,6 +1744,7 @@ class spell_item_rocket_boots : public SpellScriptLoader
if (Battleground* bg = caster->GetBattleground())
bg->EventPlayerDroppedFlag(caster);
+ caster->RemoveSpellCooldown(SPELL_ROCKET_BOOTS_PROC);
caster->CastSpell(caster, SPELL_ROCKET_BOOTS_PROC, true, NULL);
}
@@ -2020,6 +2021,37 @@ class spell_item_muisek_vessel : public SpellScriptLoader
}
};
+enum GreatmothersSoulcather
+{
+ SPELL_FORCE_CAST_SUMMON_GNOME_SOUL = 46486,
+};
+class spell_item_greatmothers_soulcatcher : public SpellScriptLoader
+{
+public:
+ spell_item_greatmothers_soulcatcher() : SpellScriptLoader("spell_item_greatmothers_soulcatcher") { }
+
+ class spell_item_greatmothers_soulcatcher_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_item_greatmothers_soulcatcher_SpellScript);
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* target = GetHitUnit())
+ GetCaster()->CastSpell(GetCaster(),SPELL_FORCE_CAST_SUMMON_GNOME_SOUL);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_item_greatmothers_soulcatcher_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_item_greatmothers_soulcatcher_SpellScript();
+ }
+};
+
void AddSC_item_spell_scripts()
{
// 23074 Arcanite Dragonling
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index 84e3bd8d604..f16f663ae2d 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -215,13 +215,12 @@ class spell_sha_earthbind_totem : public SpellScriptLoader
void HandleEffectPeriodic(AuraEffect const* aurEff)
{
- if (Unit* target = GetTarget())
- if (Unit* caster = aurEff->GetBase()->GetCaster())
- if (TempSummon* summon = caster->ToTempSummon())
- if (Unit* owner = summon->GetOwner())
- if (AuraEffect* aur = owner->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0))
- if (roll_chance_i(aur->GetBaseAmount()) && target->HasAuraWithMechanic(1 << MECHANIC_SNARE))
- caster->CastSpell(caster, SHAMAN_TOTEM_SPELL_EARTHEN_POWER, true, NULL, aurEff);
+ if (!GetCaster())
+ return;
+ if (Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself())
+ if (AuraEffect* aur = owner->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0))
+ if (roll_chance_i(aur->GetBaseAmount()))
+ GetTarget()->CastSpell((Unit*)NULL, SHAMAN_TOTEM_SPELL_EARTHEN_POWER, true);
}
void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
@@ -252,6 +251,46 @@ class spell_sha_earthbind_totem : public SpellScriptLoader
}
};
+class EarthenPowerTargetSelector
+{
+ public:
+ EarthenPowerTargetSelector() { }
+
+ bool operator() (Unit* target)
+ {
+ if (!target->HasAuraWithMechanic(1 << MECHANIC_SNARE))
+ return true;
+
+ return false;
+ }
+};
+
+class spell_sha_earthen_power : public SpellScriptLoader
+{
+ public:
+ spell_sha_earthen_power() : SpellScriptLoader("spell_sha_earthen_power") { }
+
+ class spell_sha_earthen_power_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_sha_earthen_power_SpellScript);
+
+ void FilterTargets(std::list<Unit*>& unitList)
+ {
+ unitList.remove_if(EarthenPowerTargetSelector());
+ }
+
+ void Register()
+ {
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_sha_earthen_power_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_sha_earthen_power_SpellScript();
+ }
+};
+
class spell_sha_bloodlust : public SpellScriptLoader
{
public:
@@ -270,7 +309,7 @@ class spell_sha_bloodlust : public SpellScriptLoader
void RemoveInvalidTargets(std::list<Unit*>& targets)
{
- targets.remove_if (Trinity::UnitAuraCheck(true, SHAMAN_SPELL_SATED));
+ targets.remove_if(Trinity::UnitAuraCheck(true, SHAMAN_SPELL_SATED));
}
void ApplyDebuff()
@@ -617,6 +656,7 @@ void AddSC_shaman_spell_scripts()
new spell_sha_fire_nova();
new spell_sha_mana_tide_totem();
new spell_sha_earthbind_totem();
+ new spell_sha_earthen_power();
new spell_sha_bloodlust();
new spell_sha_heroism();
new spell_sha_ancestral_awakening_proc();