diff options
Diffstat (limited to 'src/server/scripts')
| -rw-r--r-- | src/server/scripts/Commands/cs_npc.cpp | 32 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp | 73 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp | 118 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp | 137 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h | 50 | ||||
| -rwxr-xr-x | src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp | 17 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 113 |
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(); } |
