aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Scripting/ScriptLoader.cpp2
-rw-r--r--src/server/scripts/Northrend/CMakeLists.txt1
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp16
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp292
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp8
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp31
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h2
7 files changed, 330 insertions, 22 deletions
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index e68f6adef90..0293c350649 100755
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -484,6 +484,7 @@ void AddSC_instance_ruby_sanctum(); // Ruby Sanctum
void AddSC_ruby_sanctum();
void AddSC_boss_baltharus_the_warborn();
void AddSC_boss_saviana_ragefire();
+void AddSC_boss_general_zarithrian();
void AddSC_dalaran();
void AddSC_borean_tundra();
@@ -1183,6 +1184,7 @@ void AddNorthrendScripts()
AddSC_ruby_sanctum();
AddSC_boss_baltharus_the_warborn();
AddSC_boss_saviana_ragefire();
+ AddSC_boss_general_zarithrian();
AddSC_dalaran();
AddSC_borean_tundra();
diff --git a/src/server/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt
index 04d906519a0..3e1f500ebce 100644
--- a/src/server/scripts/Northrend/CMakeLists.txt
+++ b/src/server/scripts/Northrend/CMakeLists.txt
@@ -49,6 +49,7 @@ set(scripts_STAT_SRCS
Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp
Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
+ Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
index bd9b478a035..52277ee420d 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
@@ -221,14 +221,14 @@ class boss_baltharus_the_warborn : public CreatureScript
}
};
-class npc_baltarhus_the_warborn_clone : public CreatureScript
+class npc_baltharus_the_warborn_clone : public CreatureScript
{
public:
- npc_baltarhus_the_warborn_clone() : CreatureScript("npc_baltarhus_the_warborn_clone") { }
+ npc_baltharus_the_warborn_clone() : CreatureScript("npc_baltharus_the_warborn_clone") { }
- struct npc_baltarhus_the_warborn_cloneAI : public ScriptedAI
+ struct npc_baltharus_the_warborn_cloneAI : public ScriptedAI
{
- npc_baltarhus_the_warborn_cloneAI(Creature* creature) : ScriptedAI(creature)
+ npc_baltharus_the_warborn_cloneAI(Creature* creature) : ScriptedAI(creature)
{
_instance = (InstanceScript*)creature->GetInstanceScript();
}
@@ -251,8 +251,8 @@ class npc_baltarhus_the_warborn_clone : public CreatureScript
{
// This is here because DamageTaken wont trigger if the damage is deadly.
if (_instance)
- if (Creature* baltarhus = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_BALTHARUS_THE_WARBORN)))
- killer->Kill(baltarhus);
+ if (Creature* baltharus = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_BALTHARUS_THE_WARBORN)))
+ killer->Kill(baltharus);
}
void UpdateAI(uint32 const diff)
@@ -295,7 +295,7 @@ class npc_baltarhus_the_warborn_clone : public CreatureScript
CreatureAI* GetAI(Creature* creature) const
{
- return GetRubySanctumAI<npc_baltarhus_the_warborn_cloneAI>(creature);
+ return GetRubySanctumAI<npc_baltharus_the_warborn_cloneAI>(creature);
}
};
@@ -384,7 +384,7 @@ class spell_baltharus_enervating_brand_trigger : public SpellScriptLoader
void AddSC_boss_baltharus_the_warborn()
{
new boss_baltharus_the_warborn();
- new npc_baltarhus_the_warborn_clone();
+ new npc_baltharus_the_warborn_clone();
new spell_baltharus_enervating_brand();
new spell_baltharus_enervating_brand_trigger();
}
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
new file mode 100644
index 00000000000..f594087aefb
--- /dev/null
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2008-2011 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/>.
+ */
+
+#include "ScriptPCH.h"
+#include "ScriptedEscortAI.h"
+#include "ruby_sanctum.h"
+
+enum Texts
+{
+ SAY_AGGRO = 0, // Alexstrasza has chosen capable allies.... A pity that I must END YOU!
+ SAY_KILL = 1, // You thought you stood a chance? - It's for the best.
+ SAY_ADDS = 2, // Turn them to ash, minions!
+ SAY_DEATH = 3, // HALION! I...
+};
+
+enum Spells
+{
+ // General Zarithrian
+ SPELL_INTIMIDATING_ROAR = 74384,
+ SPELL_CLEAVE_ARMOR = 74367,
+ // Zarithrian Spawn Stalker
+ SPELL_SUMMON_FLAMECALLER = 74398,
+ // Onyx Flamecaller
+ SPELL_BLAST_NOVA = 74392,
+ SPELL_LAVA_GOUT = 74394,
+};
+
+enum Events
+{
+ // General Zarithrian
+ EVENT_CLEAVE = 1,
+ EVENT_INTIDMDATING_ROAR = 2,
+ EVENT_SUMMON_ADDS = 3,
+ // Onyx Flamecaller
+ EVENT_BLAST_NOVA = 4,
+ EVENT_LAVA_GOUT = 5,
+};
+
+uint32 const MAX_PATH_FLAMECALLER_WAYPOINTS = 12;
+
+Position const FlamecallerWaypoints[MAX_PATH_FLAMECALLER_WAYPOINTS*2] =
+{
+ // East
+ {3042.971f, 419.8809f, 86.94320f, 0.0f},
+ {3043.971f, 419.8809f, 86.94320f, 0.0f},
+ {3044.885f, 428.8281f, 86.19320f, 0.0f},
+ {3045.494f, 434.7930f, 85.56398f, 0.0f},
+ {3045.900f, 438.7695f, 84.81398f, 0.0f},
+ {3045.657f, 456.8290f, 85.95601f, 0.0f},
+ {3043.657f, 459.0790f, 87.20601f, 0.0f},
+ {3042.157f, 460.5790f, 87.70601f, 0.0f},
+ {3040.907f, 462.0790f, 88.45601f, 0.0f},
+ {3038.907f, 464.0790f, 89.20601f, 0.0f},
+ {3025.907f, 478.0790f, 89.70601f, 0.0f},
+ {3003.832f, 501.2510f, 89.47303f, 0.0f},
+ // West
+ {3062.596f, 636.9980f, 82.50338f, 0.0f},
+ {3062.514f, 624.9980f, 83.70634f, 0.0f},
+ {3062.486f, 620.9980f, 84.33134f, 0.0f},
+ {3062.445f, 613.9930f, 84.45634f, 0.0f},
+ {3062.445f, 613.9930f, 84.45634f, 0.0f},
+ {3059.208f, 610.6501f, 85.39581f, 0.0f},
+ {3055.958f, 606.9001f, 86.14581f, 0.0f},
+ {3046.458f, 596.4001f, 86.89581f, 0.0f},
+ {3043.958f, 593.4001f, 87.64581f, 0.0f},
+ {3040.458f, 589.9001f, 88.39581f, 0.0f},
+ {3034.458f, 583.1501f, 88.89581f, 0.0f},
+ {3014.970f, 561.8073f, 88.83527f, 0.0f},
+};
+
+class boss_general_zarithrian : public CreatureScript
+{
+ public:
+ boss_general_zarithrian() : CreatureScript("boss_general_zarithrian") { }
+
+ struct boss_general_zarithrianAI : public BossAI
+ {
+ boss_general_zarithrianAI(Creature* creature) : BossAI(creature, DATA_GENERAL_ZARITHRIAN)
+ {
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_CLEAVE, 15000);
+ events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 42000);
+ events.ScheduleEvent(EVENT_SUMMON_ADDS, 40000);
+ }
+
+ void JustReachedHome()
+ {
+ _JustReachedHome();
+ instance->SetBossState(DATA_GENERAL_ZARITHRIAN, FAIL);
+ }
+
+ // Override to not set adds in combat yet.
+ void JustSummoned(Creature* summon)
+ {
+ summons.Summon(summon);
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void KilledUnit(Unit* victim)
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_KILL);
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ // Cant use room boundary, the gameobject is spawned on same position as the boss.
+ if (!UpdateVictim() || me->GetPositionX() > 3060.0f)
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SUMMON_ADDS:
+ {
+ if (Creature* stalker1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHIAN_SPAWN_STALKER_1)))
+ stalker1->AI()->DoCast(stalker1, SPELL_SUMMON_FLAMECALLER);
+ if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHIAN_SPAWN_STALKER_2)))
+ stalker2->AI()->DoCast(stalker2, SPELL_SUMMON_FLAMECALLER);
+ Talk(SAY_ADDS);
+ events.ScheduleEvent(EVENT_SUMMON_ADDS, 42000);
+ break;
+ }
+ case EVENT_INTIDMDATING_ROAR:
+ DoCast(me, SPELL_INTIMIDATING_ROAR, true);
+ events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 42000);
+ case EVENT_CLEAVE:
+ DoCastVictim(SPELL_CLEAVE_ARMOR);
+ events.ScheduleEvent(EVENT_CLEAVE, 15000);
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetRubySanctumAI<boss_general_zarithrianAI>(creature);
+ }
+};
+
+class npc_onyx_flamecaller : public CreatureScript
+{
+ public:
+ npc_onyx_flamecaller() : CreatureScript("npc_onyx_flamecaller") { }
+
+ struct npc_onyx_flamecallerAI : public npc_escortAI
+ {
+ npc_onyx_flamecallerAI(Creature* creature) : npc_escortAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ npc_escortAI::SetDespawnAtEnd(false);
+ }
+
+ void Reset()
+ {
+ _lavaGoutCount = 0;
+ me->setActive(true);
+ AddWaypoints();
+ Start(true, true);
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000));
+ _events.ScheduleEvent(EVENT_LAVA_GOUT, 5000);
+ }
+
+ void EnterEvadeMode()
+ {
+ // Prevent EvadeMode
+ }
+
+ void IsSummonedBy(Unit* /*summoner*/)
+ {
+ // Let Zarithrian count as summoner. _instance cant be null since we got GetRubySanctumAI
+ if (Creature* zarithrian = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GENERAL_ZARITHRIAN)))
+ zarithrian->AI()->JustSummoned(me);
+ }
+
+ void WaypointReached(uint32 pointId)
+ {
+ if (pointId == MAX_PATH_FLAMECALLER_WAYPOINTS || pointId == MAX_PATH_FLAMECALLER_WAYPOINTS*2)
+ {
+ DoZoneInCombat();
+ SetEscortPaused(true);
+ }
+ }
+
+ void AddWaypoints()
+ {
+ if (me->GetPositionY() < 500.0f)
+ {
+ for (uint8 i = 0; i < MAX_PATH_FLAMECALLER_WAYPOINTS; i++)
+ AddWaypoint(i, FlamecallerWaypoints[i].GetPositionX(), FlamecallerWaypoints[i].GetPositionY(), FlamecallerWaypoints[i].GetPositionZ());
+ }
+ else
+ {
+ for (uint8 i = 0, j = MAX_PATH_FLAMECALLER_WAYPOINTS; j < MAX_PATH_FLAMECALLER_WAYPOINTS*2; j++, i++)
+ AddWaypoint(i, FlamecallerWaypoints[j].GetPositionX(), FlamecallerWaypoints[j].GetPositionY(), FlamecallerWaypoints[j].GetPositionZ());
+ }
+ }
+
+ void UpdateEscortAI(uint32 const diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ _events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_BLAST_NOVA:
+ DoCastAOE(SPELL_BLAST_NOVA);
+ _events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000));
+ break;
+ case EVENT_LAVA_GOUT:
+ if (_lavaGoutCount >= 3)
+ {
+ _lavaGoutCount = 0;
+ _events.ScheduleEvent(EVENT_LAVA_GOUT, 8000);
+ break;
+ }
+ DoCastVictim(SPELL_LAVA_GOUT);
+ _lavaGoutCount++;
+ _events.ScheduleEvent(EVENT_LAVA_GOUT, 1500);
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ private:
+ EventMap _events;
+ bool _movementComplete;
+ InstanceScript* _instance;
+ uint8 _lavaGoutCount;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetRubySanctumAI<npc_onyx_flamecallerAI>(creature);
+ }
+};
+
+void AddSC_boss_general_zarithrian()
+{
+ new boss_general_zarithrian();
+ new npc_onyx_flamecaller();
+}
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
index 3bf34c42c03..d4d03a9c819 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
@@ -75,15 +75,15 @@ class boss_saviana_ragefire : public CreatureScript
{
_Reset();
me->SetReactState(REACT_AGGRESSIVE);
- events.ScheduleEvent(EVENT_ENRAGE, 20000, EVENT_GROUP_LAND_PHASE);
- events.ScheduleEvent(EVENT_FLAME_BREATH, 30000, EVENT_GROUP_LAND_PHASE);
- events.ScheduleEvent(EVENT_FLIGHT, 50000);
}
void EnterCombat(Unit* /*who*/)
{
_EnterCombat();
Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_ENRAGE, 20000, EVENT_GROUP_LAND_PHASE);
+ events.ScheduleEvent(EVENT_FLAME_BREATH, 14000, EVENT_GROUP_LAND_PHASE);
+ events.ScheduleEvent(EVENT_FLIGHT, 60000);
}
void JustDied(Unit* /*killer*/)
@@ -212,7 +212,7 @@ class spell_saviana_conflagration_init : public SpellScriptLoader
{
PreventHitDefaultEffect(effIndex);
GetCaster()->CastSpell(GetHitUnit(), SPELL_FLAME_BEACON, true);
- GetCaster()->CastSpell(GetHitUnit(), SPELL_CONFLAGRATION_2, true);
+ GetCaster()->CastSpell(GetHitUnit(), SPELL_CONFLAGRATION_2, false);
}
void Register()
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
index 3672152bee9..0c7b47e703f 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
@@ -28,7 +28,7 @@ DoorData const doorData[] =
class instance_ruby_sanctum : public InstanceMapScript
{
public:
- instance_ruby_sanctum() : InstanceMapScript("instance_ruby_sanctum", 724) { }
+ instance_ruby_sanctum() : InstanceMapScript(RSScriptName, 724) { }
struct instance_ruby_sanctum_InstanceMapScript : public InstanceScript
{
@@ -44,6 +44,7 @@ class instance_ruby_sanctum : public InstanceMapScript
XerestraszaGUID = 0;
BaltharusSharedHealth = 0;
FlameWallsGUID = 0;
+ memset(ZarithianSpawnStalkerGUID, 0, 2*sizeof(uint64));
}
void OnCreatureCreate(Creature* creature)
@@ -68,6 +69,12 @@ class instance_ruby_sanctum : public InstanceMapScript
case NPC_XERESTRASZA:
XerestraszaGUID = creature->GetGUID();
break;
+ case NPC_ZARITHIAN_SPAWN_STALKER:
+ if (!ZarithianSpawnStalkerGUID[0])
+ ZarithianSpawnStalkerGUID[0] = creature->GetGUID();
+ else
+ ZarithianSpawnStalkerGUID[1] = creature->GetGUID();
+ break;
default:
break;
}
@@ -116,6 +123,10 @@ class instance_ruby_sanctum : public InstanceMapScript
return CrystalChannelTargetGUID;
case DATA_XERESTRASZA:
return XerestraszaGUID;
+ case DATA_ZARITHIAN_SPAWN_STALKER_1:
+ return ZarithianSpawnStalkerGUID[0];
+ case DATA_ZARITHIAN_SPAWN_STALKER_2:
+ return ZarithianSpawnStalkerGUID[1];
default:
break;
}
@@ -134,12 +145,9 @@ class instance_ruby_sanctum : public InstanceMapScript
{
if (state == DONE && GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE)
{
- // GO_FLAME_WALLS
if (GameObject* flameWalls = instance->GetGameObject(FlameWallsGUID))
- {
- flameWalls->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
- flameWalls->SetGoState(GO_STATE_READY);
- }
+ HandleGameObject(FlameWallsGUID, true, flameWalls);
+
if (Creature* zarithrian = instance->GetCreature(GeneralZarithrianGUID))
zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE);
}
@@ -150,15 +158,17 @@ class instance_ruby_sanctum : public InstanceMapScript
if (state == DONE && GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE)
{
if (GameObject* flameWalls = instance->GetGameObject(FlameWallsGUID))
- {
- flameWalls->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
- flameWalls->SetGoState(GO_STATE_READY);
- }
+ HandleGameObject(FlameWallsGUID, true, flameWalls);
+
if (Creature* zarithrian = instance->GetCreature(GeneralZarithrianGUID))
zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE);
}
break;
}
+ case DATA_GENERAL_ZARITHRIAN:
+ if (GameObject* flameWalls = instance->GetGameObject(FlameWallsGUID))
+ HandleGameObject(FlameWallsGUID, state != IN_PROGRESS, flameWalls);
+ break;
default:
break;
}
@@ -242,6 +252,7 @@ class instance_ruby_sanctum : public InstanceMapScript
uint64 XerestraszaGUID;
uint64 FlameWallsGUID;
uint32 BaltharusSharedHealth;
+ uint64 ZarithianSpawnStalkerGUID[2];
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h
index 4ece06807cf..60c13002935 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h
@@ -37,6 +37,8 @@ enum DataTypes
DATA_XERESTRASZA = 4,
DATA_CRYSTAL_CHANNEL_TARGET = 5,
DATA_BALTHARUS_SHARED_HEALTH = 6,
+ DATA_ZARITHIAN_SPAWN_STALKER_1 = 7,
+ DATA_ZARITHIAN_SPAWN_STALKER_2 = 8,
};
enum SharedActions