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_npc.cpp32
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp73
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp118
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp137
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h50
-rwxr-xr-xsrc/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp17
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp113
7 files changed, 321 insertions, 219 deletions
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index 7686ff66ae8..dd526162e66 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -63,7 +63,6 @@ public:
static ChatCommand npcSetCommandTable[] =
{
{ "allowmove", SEC_ADMINISTRATOR, false, &HandleNpcSetAllowMovementCommand, "", NULL },
- { "deathstate", SEC_GAMEMASTER, false, &HandleNpcSetDeathStateCommand, "", NULL },
{ "entry", SEC_ADMINISTRATOR, false, &HandleNpcSetEntryCommand, "", NULL },
{ "factionid", SEC_GAMEMASTER, false, &HandleNpcSetFactionIdCommand, "", NULL },
{ "flag", SEC_GAMEMASTER, false, &HandleNpcSetFlagCommand, "", NULL },
@@ -1157,37 +1156,6 @@ public:
return true;
}
- //npc deathstate handling
- static bool HandleNpcSetDeathStateCommand(ChatHandler* handler, const char* args)
- {
- if (!*args)
- return false;
-
- Creature* pCreature = handler->getSelectedCreature();
- if (!pCreature || pCreature->isPet())
- {
- handler->SendSysMessage(LANG_SELECT_CREATURE);
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- if (strncmp(args, "on", 3) == 0)
- pCreature->SetDeadByDefault(true);
- else if (strncmp(args, "off", 4) == 0)
- pCreature->SetDeadByDefault(false);
- else
- {
- handler->SendSysMessage(LANG_USE_BOL);
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- pCreature->SaveToDB();
- pCreature->Respawn();
-
- return true;
- }
-
static bool HandleNpcAddFormationCommand(ChatHandler* handler, const char* args)
{
if (!*args)
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp
index 44f024b3096..788e6eb846d 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp
@@ -221,6 +221,7 @@ enum FreyaEvents
#define WAVE_TIME 60000 // Normal wave is one minute
#define TIME_DIFFERENCE 10000 // If difference between waveTime and WAVE_TIME is bigger then TIME_DIFFERENCE, schedule EVENT_WAVE in 10 seconds
#define DATA_GETTING_BACK_TO_NATURE 1
+#define DATA_KNOCK_ON_WOOD 2
class npc_iron_roots : public CreatureScript
{
@@ -341,9 +342,8 @@ class boss_freya : public CreatureScript
me->setFaction(35);
me->DeleteThreatList();
me->CombatStop(true);
- me->ForcedDespawn(7500);
- if (elderCount)
- me->CastSpell(me, SPELL_KNOCK_ON_WOOD_CREDIT, true);
+ me->DespawnOrUnsummon(7500);
+ me->CastSpell(me, SPELL_KNOCK_ON_WOOD_CREDIT, true);
Creature* Elder[3];
for (uint8 n = 0; n < 3; ++n)
@@ -381,8 +381,6 @@ class boss_freya : public CreatureScript
}
}
- instance->SetData(DATA_KNOCK_ON_WOOD_ACHIEVEMENTS, elderCount);
-
if (Elder[0]->isAlive())
{
Elder[0]->CastSpell(me, SPELL_BRIGHTLEAF_ESSENCE, true);
@@ -418,6 +416,8 @@ class boss_freya : public CreatureScript
{
case DATA_GETTING_BACK_TO_NATURE:
return attunedToNature;
+ case DATA_KNOCK_ON_WOOD:
+ return elderCount;
}
return 0;
@@ -1630,6 +1630,66 @@ class achievement_getting_back_to_nature : public AchievementCriteriaScript
}
};
+class achievement_knock_on_wood : public AchievementCriteriaScript
+{
+ public:
+ achievement_knock_on_wood() : AchievementCriteriaScript("achievement_knock_on_wood")
+ {
+ }
+
+ bool OnCheck(Player* /*player*/, Unit* target)
+ {
+ if (!target)
+ return false;
+
+ if (Creature* Freya = target->ToCreature())
+ if (Freya->AI()->GetData(DATA_KNOCK_ON_WOOD) >= 1)
+ return true;
+
+ return false;
+ }
+};
+
+class achievement_knock_knock_on_wood : public AchievementCriteriaScript
+{
+ public:
+ achievement_knock_knock_on_wood() : AchievementCriteriaScript("achievement_knock_knock_on_wood")
+ {
+ }
+
+ bool OnCheck(Player* /*player*/, Unit* target)
+ {
+ if (!target)
+ return false;
+
+ if (Creature* Freya = target->ToCreature())
+ if (Freya->AI()->GetData(DATA_KNOCK_ON_WOOD) >= 2)
+ return true;
+
+ return false;
+ }
+};
+
+class achievement_knock_knock_knock_on_wood : public AchievementCriteriaScript
+{
+ public:
+ achievement_knock_knock_knock_on_wood() : AchievementCriteriaScript("achievement_knock_knock_knock_on_wood")
+ {
+ }
+
+ bool OnCheck(Player* /*player*/, Unit* target)
+ {
+ if (!target)
+ return false;
+
+ if (Creature* Freya = target->ToCreature())
+ if (Freya->AI()->GetData(DATA_KNOCK_ON_WOOD) == 3)
+ return true;
+
+ return false;
+ }
+};
+
void AddSC_boss_freya()
{
new boss_freya();
@@ -1650,4 +1710,7 @@ void AddSC_boss_freya()
new spell_freya_attuned_to_nature_dose_reduction();
new spell_freya_iron_roots();
new achievement_getting_back_to_nature();
+ new achievement_knock_on_wood();
+ new achievement_knock_knock_on_wood();
+ new achievement_knock_knock_knock_on_wood();
}
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
index 7edec45ca5e..51fb290502d 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
@@ -85,7 +85,7 @@ enum Yells
SAY_BERSERK = -1603238,
};
-enum
+enum Achievemments
{
ACHIEV_DISARMED_START_EVENT = 21687,
};
@@ -95,14 +95,9 @@ class boss_kologarn : public CreatureScript
public:
boss_kologarn() : CreatureScript("boss_kologarn") { }
- CreatureAI* GetAI(Creature* pCreature) const
- {
- return GetUlduarAI<boss_kologarnAI>(pCreature);
- }
-
struct boss_kologarnAI : public BossAI
{
- boss_kologarnAI(Creature *pCreature) : BossAI(pCreature, BOSS_KOLOGARN), vehicle(pCreature->GetVehicleKit()),
+ boss_kologarnAI(Creature* creature) : BossAI(creature, BOSS_KOLOGARN), vehicle(creature->GetVehicleKit()),
left(false), right(false)
{
ASSERT(vehicle);
@@ -115,7 +110,7 @@ class boss_kologarn : public CreatureScript
Reset();
}
- Vehicle *vehicle;
+ Vehicle* vehicle;
bool left, right;
uint64 eyebeamTarget;
@@ -140,7 +135,7 @@ class boss_kologarn : public CreatureScript
void Reset()
{
_Reset();
-
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
eyebeamTarget = 0;
}
@@ -149,7 +144,8 @@ class boss_kologarn : public CreatureScript
DoScriptText(SAY_DEATH, me);
DoCast(SPELL_KOLOGARN_PACIFY);
me->GetMotionMaster()->MoveTargetedHome();
-
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetCorpseDelay(604800); // Prevent corpse from despawning.
_JustDied();
}
@@ -204,8 +200,7 @@ class boss_kologarn : public CreatureScript
if (!right && !left)
events.ScheduleEvent(EVENT_STONE_SHOUT, 5000);
- if (instance)
- instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_DISARMED_START_EVENT);
+ instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_DISARMED_START_EVENT);
}
else
{
@@ -234,7 +229,6 @@ class boss_kologarn : public CreatureScript
summon->CastSpell(summon, SPELL_FOCUSED_EYEBEAM_PERIODIC, true);
summon->CastSpell(summon, SPELL_FOCUSED_EYEBEAM_VISUAL, true);
summon->SetReactState(REACT_PASSIVE);
- summon->SetFlag(UNIT_FIELD_ATTACK_POWER, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED);
// One of the above spells is a channeled spell, we need to clear this unit state for MoveChase to work
summon->ClearUnitState(UNIT_STAT_CASTING);
@@ -249,7 +243,7 @@ class boss_kologarn : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 const diff)
{
if (!UpdateVictim())
return;
@@ -289,14 +283,14 @@ class boss_kologarn : public CreatureScript
break;
case EVENT_RESPAWN_LEFT_ARM:
{
- if (Creature* arm = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_LEFT_ARM) : 0))
+ if (Creature* arm = Unit::GetCreature(*me, instance->GetData64(DATA_LEFT_ARM)))
RespawnArm(arm->ToCreature());
events.CancelEvent(EVENT_RESPAWN_LEFT_ARM);
break;
}
case EVENT_RESPAWN_RIGHT_ARM:
{
- if (Creature* arm = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_RIGHT_ARM) : 0))
+ if (Creature* arm = Unit::GetCreature(*me, instance->GetData64(DATA_RIGHT_ARM)))
RespawnArm(arm->ToCreature());
events.CancelEvent(EVENT_RESPAWN_RIGHT_ARM);
break;
@@ -312,8 +306,7 @@ class boss_kologarn : public CreatureScript
}
break;
case EVENT_FOCUSED_EYEBEAM:
- Unit* eyebeamTargetUnit = SelectTarget(SELECT_TARGET_FARTHEST, 0, 0, true);
- if (eyebeamTargetUnit)
+ if (Unit* eyebeamTargetUnit = SelectTarget(SELECT_TARGET_FARTHEST, 0, 0, true))
{
eyebeamTarget = eyebeamTargetUnit->GetGUID();
DoCast(SPELL_SUMMON_FOCUSED_EYEBEAM);
@@ -335,6 +328,11 @@ class boss_kologarn : public CreatureScript
arm->CastSpell(arm, SPELL_ARM_ENTER_VISUAL, true);
}
};
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetUlduarAI<boss_kologarnAI>(creature);
+ }
};
class spell_ulduar_rubble_summon : public SpellScriptLoader
@@ -374,14 +372,14 @@ class spell_ulduar_rubble_summon : public SpellScriptLoader
class StoneGripTargetSelector : public std::unary_function<Unit *, bool>
{
public:
- StoneGripTargetSelector(Creature* me, const Unit* victim) : _me(me), _victim(victim) {}
+ StoneGripTargetSelector(Creature* me, Unit const* victim) : _me(me), _victim(victim) {}
- bool operator() (Unit* pTarget)
+ bool operator() (Unit* target)
{
- if (pTarget == _victim && _me->getThreatManager().getThreatList().size() > 1)
+ if (target == _victim && _me->getThreatManager().getThreatList().size() > 1)
return true;
- if (pTarget->GetTypeId() != TYPEID_PLAYER)
+ if (target->GetTypeId() != TYPEID_PLAYER)
return true;
return false;
@@ -472,11 +470,8 @@ class spell_ulduar_cancel_stone_grip : public SpellScriptLoader
void HandleScript(SpellEffIndex /*effIndex*/)
{
- Unit* target = this->GetHitPlayer();
- if (!target)
- return;
-
- if (!target->GetVehicle())
+ Unit* target = GetHitUnit();
+ if (!target || !target->GetVehicle())
return;
switch (target->GetMap()->GetDifficulty())
@@ -506,38 +501,38 @@ class spell_ulduar_cancel_stone_grip : public SpellScriptLoader
class spell_ulduar_squeezed_lifeless : public SpellScriptLoader
{
-public:
- spell_ulduar_squeezed_lifeless() : SpellScriptLoader("spell_ulduar_squeezed_lifeless") { }
-
- class spell_ulduar_squeezed_lifeless_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_ulduar_squeezed_lifeless_SpellScript);
+ public:
+ spell_ulduar_squeezed_lifeless() : SpellScriptLoader("spell_ulduar_squeezed_lifeless") { }
- void HandleInstaKill(SpellEffIndex /*effIndex*/)
+ class spell_ulduar_squeezed_lifeless_SpellScript : public SpellScript
{
- if (!GetHitPlayer()->GetVehicle())
- return;
-
- Position pos;
- pos.m_positionX = 1756.25f + irand(-3, 3);
- pos.m_positionY = -8.3f + irand(-3, 3);
- pos.m_positionZ = 448.8f;
- pos.m_orientation = M_PI;
- GetHitPlayer()->DestroyForNearbyPlayers();
- GetHitPlayer()->ExitVehicle(&pos);
- GetHitPlayer()->UpdateObjectVisibility(false);
- }
+ PrepareSpellScript(spell_ulduar_squeezed_lifeless_SpellScript);
- void Register()
+ void HandleInstaKill(SpellEffIndex /*effIndex*/)
+ {
+ if (!GetHitPlayer() || !GetHitPlayer()->GetVehicle())
+ return;
+
+ Position pos;
+ pos.m_positionX = 1756.25f + irand(-3, 3);
+ pos.m_positionY = -8.3f + irand(-3, 3);
+ pos.m_positionZ = 448.8f;
+ pos.m_orientation = M_PI;
+ GetHitPlayer()->DestroyForNearbyPlayers();
+ GetHitPlayer()->ExitVehicle(&pos);
+ GetHitPlayer()->UpdateObjectVisibility(false);
+ }
+
+ void Register()
+ {
+ OnEffect += SpellEffectFn(spell_ulduar_squeezed_lifeless_SpellScript::HandleInstaKill, EFFECT_1, SPELL_EFFECT_INSTAKILL);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
{
- OnEffect += SpellEffectFn(spell_ulduar_squeezed_lifeless_SpellScript::HandleInstaKill, EFFECT_1, SPELL_EFFECT_INSTAKILL);
+ return new spell_ulduar_squeezed_lifeless_SpellScript();
}
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_ulduar_squeezed_lifeless_SpellScript();
- }
};
class spell_ulduar_stone_grip_absorb : public SpellScriptLoader
@@ -588,8 +583,8 @@ class spell_ulduar_stone_grip : public SpellScriptLoader
void OnRemoveStun(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
- if (Player* pOwner = GetOwner()->ToPlayer())
- pOwner->RemoveAurasDueToSpell(aurEff->GetAmount());
+ if (Player* owner = GetOwner()->ToPlayer())
+ owner->RemoveAurasDueToSpell(aurEff->GetAmount());
}
void OnRemoveVehicle(AuraEffect const* /*aurEff*/, AuraEffectHandleModes mode)
@@ -600,13 +595,13 @@ class spell_ulduar_stone_grip : public SpellScriptLoader
if (GetOwner()->GetTypeId() != TYPEID_UNIT)
return;
- Player* pCaster = GetCaster() ? GetCaster()->ToPlayer() : NULL;
- if (!pCaster || !pCaster->IsOnVehicle(GetOwner()->ToUnit()))
+ Player* caster = GetCaster() ? GetCaster()->ToPlayer() : NULL;
+ if (!caster || !caster->IsOnVehicle(GetOwner()->ToUnit()))
return;
- pCaster->RemoveAurasDueToSpell(GetId());
- pCaster->ExitVehicle();
- pCaster->GetMotionMaster()->MoveJump(1756.25f + irand(-3, 3), -8.3f + irand(-3, 3), 448.8f, 5.0f, 5.0f);
+ caster->RemoveAurasDueToSpell(GetId());
+ caster->ExitVehicle();
+ caster->GetMotionMaster()->MoveJump(1756.25f + irand(-3, 3), -8.3f + irand(-3, 3), 448.8f, 5.0f, 5.0f);
PreventDefaultAction();
}
@@ -652,7 +647,6 @@ class spell_kologarn_stone_shout : public SpellScriptLoader
void AddSC_boss_kologarn()
{
new boss_kologarn();
-
new spell_ulduar_rubble_summon();
new spell_ulduar_squeezed_lifeless();
new spell_ulduar_cancel_stone_grip();
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
index b91b0f350a3..8c2d2d815f6 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
@@ -79,6 +79,7 @@ class instance_ulduar : public InstanceMapScript
uint32 TeamInInstance;
uint32 HodirRareCacheData;
uint8 elderCount;
+ bool conSpeedAtory;
std::set<uint64> mRubbleSpawns;
@@ -86,37 +87,38 @@ class instance_ulduar : public InstanceMapScript
{
SetBossNumber(MAX_ENCOUNTER);
LoadDoorData(doorData);
- IgnisGUID = 0;
- RazorscaleGUID = 0;
- RazorscaleController = 0;
- ExpeditionCommanderGUID = 0;
- XT002GUID = 0;
- KologarnGUID = 0;
- LeftArmGUID = 0;
- RightArmGUID = 0;
- AuriayaGUID = 0;
- MimironGUID = 0;
- HodirGUID = 0;
- ThorimGUID = 0;
- FreyaGUID = 0;
- VezaxGUID = 0;
- YoggSaronGUID = 0;
- AlgalonGUID = 0;
- KologarnChestGUID = 0;
- KologarnBridgeGUID = 0;
- KologarnChestGUID = 0;
- ThorimChestGUID = 0;
- HodirRareCacheGUID = 0;
- HodirChestGUID = 0;
- FreyaChestGUID = 0;
- LeviathanGateGUID = 0;
- VezaxDoorGUID = 0;
- HodirDoorGUID = 0;
- HodirIceDoorGUID = 0;
- ArchivumDoorGUID = 0;
- TeamInInstance = 0;
- HodirRareCacheData = 0;
- elderCount = 0;
+ IgnisGUID = 0;
+ RazorscaleGUID = 0;
+ RazorscaleController = 0;
+ ExpeditionCommanderGUID = 0;
+ XT002GUID = 0;
+ KologarnGUID = 0;
+ LeftArmGUID = 0;
+ RightArmGUID = 0;
+ AuriayaGUID = 0;
+ MimironGUID = 0;
+ HodirGUID = 0;
+ ThorimGUID = 0;
+ FreyaGUID = 0;
+ VezaxGUID = 0;
+ YoggSaronGUID = 0;
+ AlgalonGUID = 0;
+ KologarnChestGUID = 0;
+ KologarnBridgeGUID = 0;
+ KologarnChestGUID = 0;
+ ThorimChestGUID = 0;
+ HodirRareCacheGUID = 0;
+ HodirChestGUID = 0;
+ FreyaChestGUID = 0;
+ LeviathanGateGUID = 0;
+ VezaxDoorGUID = 0;
+ HodirDoorGUID = 0;
+ HodirIceDoorGUID = 0;
+ ArchivumDoorGUID = 0;
+ TeamInInstance = 0;
+ HodirRareCacheData = 0;
+ elderCount = 0;
+ conSpeedAtory = false;
memset(Encounter, 0, sizeof(Encounter));
memset(XTToyPileGUIDs, 0, sizeof(XTToyPileGUIDs));
@@ -210,23 +212,6 @@ class instance_ulduar : public InstanceMapScript
case NPC_KOLOGARN:
KologarnGUID = creature->GetGUID();
break;
- case NPC_KOLOGARN_BRIDGE:
- // The below hacks are courtesy of the grid/visibilitysystem
- if (GetBossState(BOSS_KOLOGARN) == DONE)
- {
- creature->SetDeadByDefault(true);
- creature->setDeathState(CORPSE);
- creature->DestroyForNearbyPlayers();
- creature->UpdateObjectVisibility(true);
- }
- else
- {
- creature->SetDeadByDefault(false);
- creature->setDeathState(CORPSE);
- creature->RemoveCorpse(true);
- }
- break;
-
case NPC_AURIAYA:
AuriayaGUID = creature->GetGUID();
break;
@@ -374,6 +359,29 @@ class instance_ulduar : public InstanceMapScript
}
}
+ void OnCreatureDeath(Creature* creature)
+ {
+ switch (creature->GetEntry())
+ {
+ case NPC_CORRUPTED_SERVITOR:
+ case NPC_MISGUIDED_NYMPH:
+ case NPC_GUARDIAN_LASHER:
+ case NPC_FOREST_SWARMER:
+ case NPC_MANGROVE_ENT:
+ case NPC_IRONROOT_LASHER:
+ case NPC_NATURES_BLADE:
+ case NPC_GUARDIAN_OF_LIFE:
+ if (!conSpeedAtory)
+ {
+ DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_CON_SPEED_ATORY);
+ conSpeedAtory = true;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
void ProcessEvent(GameObject* /*gameObject*/, uint32 eventId)
{
// Flame Leviathan's Tower Event triggers
@@ -440,7 +448,7 @@ class instance_ulduar : public InstanceMapScript
if (state == DONE)
{
if (GameObject* HodirRareCache = instance->GetGameObject(HodirRareCacheGUID))
- if (GetData(DATA_HODIR_RARE_CACHE) == 1)
+ if (GetData(DATA_HODIR_RARE_CACHE))
HodirRareCache->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
if (GameObject* HodirChest = instance->GetGameObject(HodirChestGUID))
HodirChest->SetRespawnTime(HodirChest->GetRespawnDelay());
@@ -480,9 +488,12 @@ class instance_ulduar : public InstanceMapScript
break;
case DATA_HODIR_RARE_CACHE:
HodirRareCacheData = data;
- break;
- case DATA_KNOCK_ON_WOOD_ACHIEVEMENTS:
- elderCount = data;
+ if (!HodirRareCacheData)
+ {
+ if (Creature* Hodir = instance->GetCreature(HodirGUID))
+ if (GameObject* gameObject = instance->GetGameObject(HodirRareCacheGUID))
+ Hodir->RemoveGameObject(gameObject, false);
+ }
break;
default:
break;
@@ -582,33 +593,13 @@ class instance_ulduar : public InstanceMapScript
{
case TYPE_COLOSSUS:
return Encounter[type];
- break;
case DATA_HODIR_RARE_CACHE:
return HodirRareCacheData;
- break;
- }
-
- return 0;
- }
-
- bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* /*player*/, Unit const* /*target*/, uint32 /*miscvalue1*/)
- {
- switch (criteriaId)
- {
- case CRITERIA_KNOCK_ON_WOOD_10:
- case CRITERIA_KNOCK_ON_WOOD_25:
- return elderCount >= 1;
- case CRITERIA_KNOCK_KNOCK_ON_WOOD_10:
- case CRITERIA_KNOCK_KNOCK_ON_WOOD_25:
- return elderCount >= 2;
- case CRITERIA_KNOCK_KNOCK_KNOCK_ON_WOOD_10:
- case CRITERIA_KNOCK_KNOCK_KNOCK_ON_WOOD_25:
- return elderCount == 3;
default:
break;
}
- return false;
+ return 0;
}
std::string GetSaveData()
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h
index f902c33f938..3ddb2eaf036 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h
@@ -67,6 +67,7 @@ enum UlduarBosses
enum UlduarNPCs
{
+ // General
NPC_LEVIATHAN = 33113,
NPC_IGNIS = 33118,
NPC_RAZORSCALE = 33186,
@@ -79,7 +80,6 @@ enum UlduarNPCs
NPC_MOLGEIM = 32927,
NPC_BRUNDIR = 32857,
NPC_KOLOGARN = 32930,
- NPC_KOLOGARN_BRIDGE = 34297,
NPC_FOCUSED_EYEBEAM = 33632,
NPC_FOCUSED_EYEBEAM_RIGHT = 33802,
NPC_LEFT_ARM = 32933,
@@ -93,6 +93,8 @@ enum UlduarNPCs
NPC_VEZAX = 33271,
NPC_YOGGSARON = 33288,
NPC_ALGALON = 32871,
+
+ // Mimiron
NPC_LEVIATHAN_MKII = 33432,
NPC_VX_001 = 33651,
NPC_AERIAL_COMMAND_UNIT = 33670,
@@ -119,6 +121,16 @@ enum UlduarNPCs
NPC_BATTLE_PRIEST_GINA = 33330,
NPC_FIELD_MEDIC_PENNY = 32897,
NPC_FIELD_MEDIC_JESSI = 33326,
+
+ // Freya's trash NPCs
+ NPC_CORRUPTED_SERVITOR = 33354,
+ NPC_MISGUIDED_NYMPH = 33355,
+ NPC_GUARDIAN_LASHER = 33430,
+ NPC_FOREST_SWARMER = 33431,
+ NPC_MANGROVE_ENT = 33525,
+ NPC_IRONROOT_LASHER = 33526,
+ NPC_NATURES_BLADE = 33527,
+ NPC_GUARDIAN_OF_LIFE = 33528,
};
enum UlduarGameObjects
@@ -157,41 +169,7 @@ enum UlduarTowerEvents
EVENT_TOWER_OF_LIFE_DESTROYED = 21030,
};
-enum UlduarAchievementCriteriaIds
-{
- // Flame Leviathan
- CRITERIA_UNBROKEN_10 = 10044,
- CRITERIA_UNBROKEN_25 = 10045,
- CRITERIA_SHUTOUT_10 = 10054,
- CRITERIA_SHUTOUT_25 = 10055,
- CRITERIA_3_CAR_GARAGE_CHOPPER_10 = 10046,
- CRITERIA_3_CAR_GARAGE_SIEGE_10 = 10047,
- CRITERIA_3_CAR_GARAGE_DEMOLISHER_10 = 10048,
- CRITERIA_3_CAR_GARAGE_CHOPPER_25 = 10049,
- CRITERIA_3_CAR_GARAGE_SIEGE_25 = 10050,
- CRITERIA_3_CAR_GARAGE_DEMOLISHER_25 = 10051,
-
- // Ignis
- CRITERIA_HOT_POCKET_10 = 10430,
- CRITERIA_HOT_POCKET_25 = 10431,
-
- // Razorscale
- CRITERIA_QUICK_SHAVE_10 = 10062,
- CRITERIA_QUICK_SHAVE_25 = 10063,
-
- // Freya
- CRITERIA_KNOCK_ON_WOOD_10 = 10447,
- CRITERIA_KNOCK_ON_WOOD_25 = 10459,
- CRITERIA_KNOCK_KNOCK_ON_WOOD_10 = 10448,
- CRITERIA_KNOCK_KNOCK_ON_WOOD_25 = 10460,
- CRITERIA_KNOCK_KNOCK_KNOCK_ON_WOOD_10 = 10449,
- CRITERIA_KNOCK_KNOCK_KNOCK_ON_WOOD_25 = 10461,
-};
-
-enum UlduarAchievementData
-{
- DATA_KNOCK_ON_WOOD_ACHIEVEMENTS = 1,
-};
+#define CRITERIA_CON_SPEED_ATORY 21597
template<class AI>
CreatureAI* GetUlduarAI(Creature* creature)
diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp
index bff1e8e011d..eb9f2b1928a 100755
--- a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp
@@ -63,19 +63,14 @@ uint32 OPvPCapturePointNA::GetAliveGuardsCount()
case NA_NPC_GUARD_13:
case NA_NPC_GUARD_14:
case NA_NPC_GUARD_15:
+ {
+ if (Creature* cr = HashMapHolder<Creature>::Find(itr->second))
{
- if (Creature* cr = HashMapHolder<Creature>::Find(itr->second))
- {
- if (cr->isAlive())
- ++cnt;
- }
- else if (CreatureData const* cd = sObjectMgr->GetCreatureData(GUID_LOPART(itr->second)))
- {
- if (!cd->is_dead)
- ++cnt;
- }
+ if (cr->isAlive())
+ ++cnt;
}
- break;
+ }
+ break;
default:
break;
}
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 67939a61f23..fe0ecf26c96 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -1154,6 +1154,117 @@ public:
}
};
+enum Launch
+{
+ SPELL_LAUNCH_NO_FALLING_DAMAGE = 66251
+};
+
+class spell_gen_launch : public SpellScriptLoader
+{
+ public:
+ spell_gen_launch() : SpellScriptLoader("spell_gen_launch") {}
+
+ class spell_gen_launch_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_launch_SpellScript);
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ SpellEntry const* const spell = GetSpellInfo();
+
+ if (Player* player = GetHitPlayer())
+ {
+ player->CastSpell(player,spell->EffectTriggerSpell[1],true); // changes the player's seat
+ player->AddAura(SPELL_LAUNCH_NO_FALLING_DAMAGE,player); // prevents falling damage
+ }
+ }
+
+ void Launch()
+ {
+ WorldLocation const* const position = GetTargetDest();
+
+ if (Player* player = GetHitPlayer())
+ {
+ player->ExitVehicle();
+
+ // A better research is needed
+ // There is no spell for this, the following calculation was based on void Spell::CalculateJumpSpeeds
+
+ float speedZ = 10.0f;
+ float dist = position->GetExactDist2d(player->GetPositionX(),player->GetPositionY());
+ float speedXY = dist;
+
+ player->GetMotionMaster()->MoveJump(position->GetPositionX(),position->GetPositionY(),position->GetPositionZ(),speedXY,speedZ);
+ }
+ }
+
+ void Register()
+ {
+ OnEffect += SpellEffectFn(spell_gen_launch_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_FORCE_CAST);
+ AfterHit += SpellHitFn(spell_gen_launch_SpellScript::Launch);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_launch_SpellScript();
+ }
+};
+
+class spell_gen_vehicle_scaling : public SpellScriptLoader
+{
+ public:
+ spell_gen_vehicle_scaling() : SpellScriptLoader("spell_gen_vehicle_scaling") { }
+
+ class spell_gen_vehicle_scaling_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_vehicle_scaling_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ Unit* caster = GetCaster();
+ if (!caster || !caster->ToPlayer())
+ return;
+
+ float factor;
+ uint16 baseItemLevel;
+
+ // TODO: Reserach coeffs for different vehicles
+ switch (GetId())
+ {
+ case 66668:
+ factor = 1.0f;
+ baseItemLevel = 205;
+ break;
+ default:
+ factor = 1.0f;
+ baseItemLevel = 170;
+ break;
+ }
+
+ float avgILvl = caster->ToPlayer()->GetAverageItemLevel();
+ if (avgILvl < baseItemLevel)
+ return; // TODO: Research possibility of scaling down
+
+ amount = uint16((avgILvl - baseItemLevel) * factor);
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_gen_vehicle_scaling_AuraScript();
+ }
+};
+
void AddSC_generic_spell_scripts()
{
new spell_gen_absorb0_hitlimit1();
@@ -1181,4 +1292,6 @@ void AddSC_generic_spell_scripts()
new spell_gen_lifeblood();
new spell_gen_magic_rooster();
new spell_gen_allow_cast_from_item_only();
+ new spell_gen_launch();
+ new spell_gen_vehicle_scaling();
}