aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp38
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp9
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h11
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp2
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp10
-rw-r--r--src/server/scripts/Kalimdor/CMakeLists.txt1
-rw-r--r--src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp160
-rw-r--r--src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp4
-rw-r--r--src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h21
9 files changed, 238 insertions, 18 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 261c4166a15..c4c208e596e 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -2097,13 +2097,47 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
GetBaseObject()->SummonCreatureGroup(e.action.creatureGroup.group, &summonList);
for (std::list<TempSummon*>::const_iterator itr = summonList.begin(); itr != summonList.end(); ++itr)
- {
if (unit && e.action.creatureGroup.attackInvoker)
(*itr)->AI()->AttackStart(unit);
- }
break;
}
+ case SMART_ACTION_SET_POWER:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+
+ if (targets)
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
+ if (IsUnit(*itr))
+ (*itr)->ToUnit()->SetPower(Powers(e.action.power.powerType), e.action.power.newPower);
+
+ delete targets;
+ break;
+ }
+ case SMART_ACTION_ADD_POWER:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+
+ if (targets)
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
+ if (IsUnit(*itr))
+ (*itr)->ToUnit()->SetPower(Powers(e.action.power.powerType), (*itr)->ToUnit()->GetPower(Powers(e.action.power.powerType)) + e.action.power.newPower);
+
+ delete targets;
+ break;
+ }
+ case SMART_ACTION_REMOVE_POWER:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+
+ if (targets)
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
+ if (IsUnit(*itr))
+ (*itr)->ToUnit()->SetPower(Powers(e.action.power.powerType), (*itr)->ToUnit()->GetPower(Powers(e.action.power.powerType)) - e.action.power.newPower);
+
+ delete targets;
+ break;
+ }
default:
TC_LOG_ERROR(LOG_FILTER_SQL, "SmartScript::ProcessAction: Entry %d SourceType %u, Event %u, Unhandled Action type %u", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
break;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index f26d3bb328a..feb0d1a03b8 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -838,6 +838,15 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
return false;
break;
}
+ case SMART_ACTION_SET_POWER:
+ case SMART_ACTION_ADD_POWER:
+ case SMART_ACTION_REMOVE_POWER:
+ if (e.action.power.powerType > MAX_POWERS)
+ {
+ TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses non-existent Power %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.power.powerType);
+ return false;
+ }
+ break;
case SMART_ACTION_FOLLOW:
case SMART_ACTION_SET_ORIENTATION:
case SMART_ACTION_STORE_TARGET_LIST:
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index cf208aa91df..ef7080bf9db 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -490,8 +490,11 @@ enum SMART_ACTION
SMART_ACTION_ADD_GO_FLAG = 105, // Flags
SMART_ACTION_REMOVE_GO_FLAG = 106, // Flags
SMART_ACTION_SUMMON_CREATURE_GROUP = 107, // Group, attackInvoker
+ SMART_ACTION_SET_POWER = 108, // PowerType, newPower
+ SMART_ACTION_ADD_POWER = 109, // PowerType, newPower
+ SMART_ACTION_REMOVE_POWER = 110, // PowerType, newPower
- SMART_ACTION_END = 108
+ SMART_ACTION_END = 111
};
struct SmartAction
@@ -945,6 +948,12 @@ struct SmartAction
uint32 attackInvoker;
} creatureGroup;
+ struct
+ {
+ uint32 powerType;
+ uint32 newPower;
+ } power;
+
//! Note for any new future actions
//! All parameters must have type uint32
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
index 3be95a86ca8..f8c9e888176 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
@@ -1623,7 +1623,7 @@ void BattlegroundAV::ResetBGSubclass()
bool BattlegroundAV::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target, uint32 miscValue)
{
- uint8 team = source->GetTeam();
+ uint32 team = source->GetTeam();
switch (criteriaId)
{
case BG_CRITERIA_CHECK_EVERYTHING_COUNTS:
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index b11ece9307d..dbed7d990b5 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -337,8 +337,9 @@ void AddSC_npc_anubisath_sentinel();
void AddSC_instance_temple_of_ahnqiraj();
void AddSC_wailing_caverns(); //Wailing caverns
void AddSC_instance_wailing_caverns();
-void AddSC_zulfarrak(); //Zul'Farrak generic
-void AddSC_instance_zulfarrak(); //Zul'Farrak instance script
+void AddSC_boss_zum_rah(); //Zul'Farrak
+void AddSC_zulfarrak();
+void AddSC_instance_zulfarrak();
void AddSC_instance_halls_of_origination();
void AddSC_boss_temple_guardian_anhuur();
void AddSC_boss_earthrager_ptah();
@@ -1001,8 +1002,9 @@ void AddKalimdorScripts()
AddSC_instance_temple_of_ahnqiraj();
AddSC_wailing_caverns(); //Wailing caverns
AddSC_instance_wailing_caverns();
- AddSC_zulfarrak(); //Zul'Farrak generic
- AddSC_instance_zulfarrak(); //Zul'Farrak instance script
+ AddSC_boss_zum_rah(); //Zul'Farrak
+ AddSC_zulfarrak();
+ AddSC_instance_zulfarrak();
AddSC_ashenvale();
AddSC_azshara();
diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt
index 0e7b1f6c2b6..67082631c4e 100644
--- a/src/server/scripts/Kalimdor/CMakeLists.txt
+++ b/src/server/scripts/Kalimdor/CMakeLists.txt
@@ -20,6 +20,7 @@ set(scripts_STAT_SRCS
Kalimdor/ZulFarrak/zulfarrak.h
Kalimdor/ZulFarrak/zulfarrak.cpp
Kalimdor/ZulFarrak/instance_zulfarrak.cpp
+ Kalimdor/ZulFarrak/boss_zum_rah.cpp
Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp
Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h
Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp
diff --git a/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp b/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp
new file mode 100644
index 00000000000..bc31fd118be
--- /dev/null
+++ b/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp
@@ -0,0 +1,160 @@
+/*
+* Copyright (C) 2008-2013 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/>.
+*/
+
+/*
+Name: Boss_Zum_Rah
+Category: Tanaris, ZulFarrak
+*/
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "zulfarrak.h"
+
+enum Says
+{
+ SAY_SANCT_INVADE = 0,
+ SAY_WARD = 1,
+ SAY_KILL = 2
+};
+
+enum Spells
+{
+ SPELL_SHADOW_BOLT = 12739,
+ SPELL_SHADOWBOLT_VOLLEY = 15245,
+ SPELL_WARD_OF_ZUM_RAH = 11086,
+ SPELL_HEALING_WAVE = 12491
+};
+
+enum Events
+{
+ EVENT_SHADOW_BOLT = 1,
+ EVENT_SHADOWBOLT_VOLLEY = 2,
+ EVENT_WARD_OF_ZUM_RAH = 3,
+ EVENT_HEALING_WAVE = 4
+};
+
+enum Faction
+{
+ ZUMRAH_FRIENDLY_FACTION = 35
+};
+
+class boss_zum_rah : public CreatureScript
+{
+public:
+ boss_zum_rah() : CreatureScript("boss_zum_rah") { }
+
+ struct boss_zum_rahAI : public BossAI
+ {
+ boss_zum_rahAI(Creature* creature) : BossAI(creature, DATA_ZUM_RAH) { }
+
+ void Reset() OVERRIDE
+ {
+ me->setFaction(ZUMRAH_FRIENDLY_FACTION); // areatrigger sets faction to enemy
+ _ward80 = false;
+ _ward40 = false;
+ _heal30 = false;
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ Talk(SAY_SANCT_INVADE);
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, 1000);
+ events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 10000);
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ if (instance)
+ instance->SetData(DATA_ZUM_RAH, DONE);
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE
+ {
+ Talk(SAY_KILL);
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SHADOW_BOLT:
+ DoCastVictim(SPELL_SHADOW_BOLT);
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, 4000);
+ break;
+ case EVENT_WARD_OF_ZUM_RAH:
+ DoCast(me,SPELL_WARD_OF_ZUM_RAH);
+ break;
+ case EVENT_HEALING_WAVE:
+ DoCast(me,SPELL_HEALING_WAVE);
+ break;
+ case EVENT_SHADOWBOLT_VOLLEY:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_SHADOWBOLT_VOLLEY);
+ events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 9000);
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (!_ward80 && HealthBelowPct(80))
+ {
+ _ward80 = true;
+ Talk(SAY_WARD);
+ events.ScheduleEvent(EVENT_WARD_OF_ZUM_RAH, 1000);
+ }
+
+ if (!_ward40 && HealthBelowPct(40))
+ {
+ _ward40 = true;
+ Talk(SAY_WARD);
+ events.ScheduleEvent(EVENT_WARD_OF_ZUM_RAH, 1000);
+ }
+
+ if (!_heal30 && HealthBelowPct(30))
+ {
+ _heal30 = true;
+ events.ScheduleEvent(EVENT_HEALING_WAVE, 3000);
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool _ward80;
+ bool _ward40;
+ bool _heal30;
+
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_zum_rahAI(creature);
+ }
+};
+
+void AddSC_boss_zum_rah()
+{
+ new boss_zum_rah();
+}
diff --git a/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp
index 8f5275be5cd..8e2d393e6a6 100644
--- a/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp
+++ b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp
@@ -145,7 +145,7 @@ public:
{
switch (creature->GetEntry())
{
- case ENTRY_ZUMRAH:
+ case ENTRY_ZUM_RAH:
ZumrahGUID = creature->GetGUID();
break;
case ENTRY_BLY:
@@ -201,7 +201,7 @@ public:
{
switch (data)
{
- case ENTRY_ZUMRAH:
+ case ENTRY_ZUM_RAH:
return ZumrahGUID;
case ENTRY_BLY:
return BlyGUID;
diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h
index f634d593f44..0d16c1d1ddd 100644
--- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h
+++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h
@@ -7,19 +7,24 @@
enum zfEntries
{
- ENTRY_ZUMRAH = 7271,
- ENTRY_BLY = 7604,
- ENTRY_RAVEN = 7605,
- ENTRY_ORO = 7606,
- ENTRY_WEEGLI = 7607,
- ENTRY_MURTA = 7608,
+ ENTRY_ZUM_RAH = 7271,
+ ENTRY_BLY = 7604,
+ ENTRY_RAVEN = 7605,
+ ENTRY_ORO = 7606,
+ ENTRY_WEEGLI = 7607,
+ ENTRY_MURTA = 7608,
- GO_END_DOOR = 146084,
+ GO_END_DOOR = 146084,
- EVENT_PYRAMID = 1,
+ EVENT_PYRAMID = 1,
EVENT_GAHZRILLA
};
+enum DataTypes
+{
+ DATA_ZUM_RAH = 0
+};
+
enum zfPyramidPhases
{
PYRAMID_NOT_STARTED, //default