diff options
15 files changed, 493 insertions, 213 deletions
diff --git a/sql/updates/551_world.sql b/sql/updates/551_world.sql new file mode 100644 index 00000000000..5a01d596ab4 --- /dev/null +++ b/sql/updates/551_world.sql @@ -0,0 +1,22 @@ +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = '36574'; +INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES ('36574', '36650', '0', 'Apply Phase Slip Vulnerability'); + +UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=21807; +DELETE FROM `areatrigger_scripts` WHERE `entry`=4560; +INSERT INTO `areatrigger_scripts` VALUES (4560,'at_legion_teleporter'); +UPDATE `creature_template` SET `ScriptName`='npc_commander_dawnforge' WHERE `entry`=19831; +DELETE FROM `areatrigger_scripts` WHERE `entry`=4497; +INSERT INTO `areatrigger_scripts` VALUES (4497,'at_commander_dawnforge'); + +DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000137 AND -1000128; +INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES +(-1000128, 'We need you to send reinforcements to Manaforge Duro, Ardonis. This is not a request, it\'s an order.', 0, 0, 0, 'dawnforge SAY_COMMANDER_DAWNFORGE_1'), +(-1000129, 'You cannot be serious! We are severely understaffed and can barely keep this manaforge functional!', 0, 0, 0, 'dawnforge SAY_ARCANIST_ARDONIS_1'), +(-1000130, 'You will do as ordered. Manaforge Duro has come under heavy attack by mana creatures and the situation is out of control. Failure to comply will not be tolerated!', 0, 0, 0, 'dawnforge SAY_COMMANDER_DAWNFORGE_2'), +(-1000131, 'Indeed, it is not a request.', 0, 0, 0, 'dawnforge SAY_PATHALEON_CULATOR_IMAGE_1'), +(-1000132, 'My lord!', 0, 0, 0, 'dawnforge SAY_COMMANDER_DAWNFORGE_3'), +(-1000133, 'Duro will be reinforced! Ultris was a complete disaster. I will NOT have that mistake repeated!', 0, 0, 0, 'dawnforge PATHALEON_CULATOR_IMAGE_2'), +(-1000134, 'We\'ve had too many setbacks along the way: Hellfire Citadel, Fallen Sky Ridge, Firewing Point... Prince Kael\'thas will tolerate no further delays. I will tolerate nothing other than complete success!', 0, 0, 0, 'dawnforge PATHALEON_CULATOR_IMAGE_2_1'), +(-1000135, 'I am returning to Tempest Keep. See to it that I do not have reason to return!', 0, 0, 0, 'dawnforge PATHALEON_CULATOR_IMAGE_2_2' ), +(-1000136, 'Yes, my lord.', 0, 0, 0, 'dawnforge COMMANDER_DAWNFORGE_4 SAY_ARCANIST_ARDONIS_2'), +(-1000137, 'See to it, Ardonis!', 0, 0, 0, 'dawnforge COMMANDER_DAWNFORGE_5');
\ No newline at end of file diff --git a/src/bindings/scripts/scripts/areatrigger/areatrigger_scripts.cpp b/src/bindings/scripts/scripts/areatrigger/areatrigger_scripts.cpp index 83dda669e1f..3247e7e5fcb 100644 --- a/src/bindings/scripts/scripts/areatrigger/areatrigger_scripts.cpp +++ b/src/bindings/scripts/scripts/areatrigger/areatrigger_scripts.cpp @@ -22,11 +22,40 @@ SDCategory: Areatrigger EndScriptData */ /* ContentData +at_legion_teleporter 4560 Teleporter TO Invasion Point: Cataclysm at_test script test only EndContentData */ #include "precompiled.h" +/*##### +## at_legion_teleporter +#####*/ + +#define SPELL_TELE_A_TO 37387 +#define SPELL_TELE_H_TO 37389 + +bool AreaTrigger_at_legion_teleporter(Player *player, AreaTriggerEntry *at) +{ + if (player->isAlive() && !player->isInCombat()) + { + if (player->GetTeam()== ALLIANCE && player->GetQuestRewardStatus(10589)) + { + player->CastSpell(player,SPELL_TELE_A_TO,false); + return true; + } + + if (player->GetTeam()== HORDE && player->GetQuestRewardStatus(10604)) + { + player->CastSpell(player,SPELL_TELE_H_TO,false); + return true; + } + + return false; + } + return false; +} + bool ATtest(Player *player, AreaTriggerEntry *at) { player->Say("Hi!",LANG_UNIVERSAL); @@ -37,6 +66,11 @@ void AddSC_areatrigger_scripts() { Script *newscript; + newscript = new Script; + newscript->Name = "at_legion_teleporter"; + newscript->pAreaTrigger = &AreaTrigger_at_legion_teleporter; + newscript->RegisterSelf(); + newscript = new Script; newscript->Name="at_test"; newscript->pAreaTrigger = ATtest; diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_exarch_maladaar.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_exarch_maladaar.cpp index 7f0cc22121c..f9b9a277058 100644 --- a/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_exarch_maladaar.cpp +++ b/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_exarch_maladaar.cpp @@ -303,8 +303,8 @@ CreatureAI* GetAI_boss_exarch_maladaar(Creature *_Creature) return new boss_exarch_maladaarAI (_Creature); } -#define SPELL_MORTAL_STRIKE 16856 -#define SPELL_SUNDER_ARMOR 16145 +#define SPELL_AV_MORTAL_STRIKE 16856 +#define SPELL_AV_MORTAL_STRIKE 16856 struct TRINITY_DLL_DECL mob_avatar_of_martyredAI : public ScriptedAI { @@ -328,7 +328,7 @@ struct TRINITY_DLL_DECL mob_avatar_of_martyredAI : public ScriptedAI if (Mortal_Strike_timer < diff) { - DoCast(m_creature->getVictim(), SPELL_MORTAL_STRIKE); + DoCast(m_creature->getVictim(), SPELL_AV_MORTAL_STRIKE); Mortal_Strike_timer = 10000 + rand()%20 * 1000; } else Mortal_Strike_timer -= diff; diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp index 1d257cc186d..201d1af187d 100644 --- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp +++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp @@ -55,7 +55,7 @@ struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI pTarget = 0; //database should have `RegenHealth`=0 to prevent regen - uint32 hp = m_creature->GetMaxHealth()*0.4; + uint32 hp = (m_creature->GetMaxHealth()*40)/100; if (hp) m_creature->SetHealth(hp); } diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/def_dark_portal.h b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/def_dark_portal.h index 876200a138c..1470296cec0 100644 --- a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/def_dark_portal.h +++ b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/def_dark_portal.h @@ -22,7 +22,6 @@ #define C_TIME_KEEPER 17918 #define C_RKEEP 21104 #define C_RLORD 17839 -#define RIFT_BOSS (rand()%2 ? C_RKEEP : C_RLORD) #define C_DEJA 17879 #define C_TEMPO 17880 #define C_AEONUS 17881 diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/instance_dark_portal.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/instance_dark_portal.cpp index 6f0d497dd40..ea9d64673f1 100644 --- a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/instance_dark_portal.cpp +++ b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/instance_dark_portal.cpp @@ -30,6 +30,9 @@ EndScriptData */ #define C_TIME_RIFT 17838 #define SPELL_RIFT_CHANNEL 31387 + +#define RIFT_BOSS 1 +inline uint32 RandRiftBoss() { return rand()%2 ? C_RKEEP : C_RLORD; } float PortalLocation[4][4]= { @@ -271,6 +274,9 @@ struct TRINITY_DLL_DECL instance_dark_portal : public ScriptedInstance Unit* SummonedPortalBoss(Unit* source) { uint32 entry = RiftWaves[GetRiftWaveId()].PortalBoss; + if (entry == RIFT_BOSS) + entry = RandRiftBoss(); + float x,y,z; source->GetRandomPoint(source->GetPositionX(),source->GetPositionY(),source->GetPositionZ(),10.0f,x,y,z); //normalize Z-level if we can, if rift is not at ground level. diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp index f5630155af0..d7fb169d9c3 100644 --- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp +++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp @@ -153,66 +153,6 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI } } - /*void ApplyWateryGrave(Unit *player, uint8 pos) - { - float x, y, z; - - switch(pos) - { - case 0: - x = WATERY_GRAVE_X1; - y = WATERY_GRAVE_Y1; - z = WATERY_GRAVE_Z1; - break; - case 1: - x = WATERY_GRAVE_X2; - y = WATERY_GRAVE_Y2; - z = WATERY_GRAVE_Z2; - break; - case 2: - x = WATERY_GRAVE_X3; - y = WATERY_GRAVE_Y3; - z = WATERY_GRAVE_Z3; - break; - case 3: - x = WATERY_GRAVE_X4; - y = WATERY_GRAVE_Y4; - z = WATERY_GRAVE_Z4; - break; - } - - DoTeleportPlayer(player, x, y, z+1, player->GetOrientation()); - DoCast(player, SPELL_WATERY_GRAVE); - }*/ - - /*void SummonMurloc(float x, float y, float z) - { - Creature *Summoned; - - Summoned = m_creature->SummonCreature(TIDEWALKER_LURKER, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); - if (Summoned) - { - Unit *target = NULL; - target = SelectUnit(SELECT_TARGET_RANDOM, 0); - if (target) - Summoned->AI()->AttackStart(target); - } - }*/ - - /*void SummonWaterGlobule(float x, float y, float z) - { - Creature *Globule; - - Globule = m_creature->SummonCreature(WATER_GLOBULE, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 30000); //they despawn after 30 seconds - if (Globule) - { - Unit *target = NULL; - target = SelectUnit(SELECT_TARGET_RANDOM, 0); - if (target) - Globule->AI()->AttackStart(target); - } - }*/ - void UpdateAI(const uint32 diff) { //Return since we have no target @@ -236,30 +176,16 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI case 1: DoScriptText(SAY_SUMMON2, m_creature); break; } - /*//north - SummonMurloc(486.10, -723.64, -7.14); - SummonMurloc(482.58, -723.78, -7.14); - SummonMurloc(479.38, -723.91, -7.14); - SummonMurloc(476.03, -723.86, -7.14); - SummonMurloc(472.69, -723.69, -7.14); - SummonMurloc(469.04, -723.63, -7.14); - - //south - SummonMurloc(311.63, -725.04, -13.15); - SummonMurloc(307.81, -725.34, -13.15); - SummonMurloc(303.91, -725.64, -13.06); - SummonMurloc(300.23, -726, -11.89); - SummonMurloc(296.82, -726.33, -10.82); - SummonMurloc(293.64, -726.64, -9.81);*/ - if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) { + //north DoCast(target, SPELL_SUMMON_MURLOC_A6); DoCast(target, SPELL_SUMMON_MURLOC_A7); DoCast(target, SPELL_SUMMON_MURLOC_A8); DoCast(target, SPELL_SUMMON_MURLOC_A9); DoCast(target, SPELL_SUMMON_MURLOC_A10); + //south DoCast(target, SPELL_SUMMON_MURLOC_B6); DoCast(target, SPELL_SUMMON_MURLOC_B7); DoCast(target, SPELL_SUMMON_MURLOC_B8); @@ -313,10 +239,6 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI //WateryGlobules_Timer if (WateryGlobules_Timer < diff) { - /*SummonWaterGlobule(WATERY_GRAVE_X1, WATERY_GRAVE_Y1, WATERY_GRAVE_Z1); - SummonWaterGlobule(WATERY_GRAVE_X2, WATERY_GRAVE_Y2, WATERY_GRAVE_Z2); - SummonWaterGlobule(WATERY_GRAVE_X3, WATERY_GRAVE_Y3, WATERY_GRAVE_Z3); - SummonWaterGlobule(WATERY_GRAVE_X4, WATERY_GRAVE_Y4, WATERY_GRAVE_Z4);*/ if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) { DoCast(target, SPELL_SUMMON_WATER_GLOBULE_1); diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_midnight.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_midnight.cpp index 35a74ca21aa..24f2857e425 100644 --- a/src/bindings/scripts/scripts/zone/karazhan/boss_midnight.cpp +++ b/src/bindings/scripts/scripts/zone/karazhan/boss_midnight.cpp @@ -101,25 +101,26 @@ struct TRINITY_DLL_DECL boss_midnightAI : public ScriptedAI } else if(Phase ==3) { - if(Mount_Timer) - if(Mount_Timer <= diff) - { - Mount_Timer = 0; - m_creature->SetVisibility(VISIBILITY_OFF); - m_creature->GetMotionMaster()->MoveIdle(); - if (Unit *pAttumen = Unit::GetUnit(*m_creature, Attumen)) - { - pAttumen->SetUInt32Value(UNIT_FIELD_DISPLAYID, MOUNTED_DISPLAYID); - pAttumen->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if(pAttumen->getVictim()) - { - pAttumen->GetMotionMaster()->MoveChase(pAttumen->getVictim()); - pAttumen->SetUInt64Value(UNIT_FIELD_TARGET, pAttumen->getVictim()->GetGUID()); - } - pAttumen->SetFloatValue(OBJECT_FIELD_SCALE_X,1); - + if(Mount_Timer) + { + if(Mount_Timer <= diff) + { + Mount_Timer = 0; + m_creature->SetVisibility(VISIBILITY_OFF); + m_creature->GetMotionMaster()->MoveIdle(); + if (Unit *pAttumen = Unit::GetUnit(*m_creature, Attumen)) + { + pAttumen->SetUInt32Value(UNIT_FIELD_DISPLAYID, MOUNTED_DISPLAYID); + pAttumen->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + if(pAttumen->getVictim()) + { + pAttumen->GetMotionMaster()->MoveChase(pAttumen->getVictim()); + pAttumen->SetUInt64Value(UNIT_FIELD_TARGET, pAttumen->getVictim()->GetGUID()); + } + pAttumen->SetFloatValue(OBJECT_FIELD_SCALE_X,1); + } } else Mount_Timer -= diff; - } + } } if(Phase != 3) @@ -201,29 +202,27 @@ struct TRINITY_DLL_DECL boss_attumenAI : public ScriptedAI { DoScriptText(SAY_DEATH, m_creature); if (Unit *pMidnight = Unit::GetUnit(*m_creature, Midnight)) - { - pMidnight->DealDamage(pMidnight, pMidnight->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - } + pMidnight->DealDamage(pMidnight, pMidnight->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } void UpdateAI(const uint32 diff) { - if(ResetTimer) - if(ResetTimer <= diff) - { - ResetTimer = 0; - Unit *pMidnight = Unit::GetUnit(*m_creature, Midnight); - if(pMidnight) - { - pMidnight->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - pMidnight->SetVisibility(VISIBILITY_ON); - } - Midnight = 0; - - m_creature->SetVisibility(VISIBILITY_OFF); - m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - } - else ResetTimer -= diff; + if(ResetTimer) + { + if(ResetTimer <= diff) + { + ResetTimer = 0; + Unit *pMidnight = Unit::GetUnit(*m_creature, Midnight); + if(pMidnight) + { + pMidnight->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + pMidnight->SetVisibility(VISIBILITY_ON); + } + Midnight = 0; + m_creature->SetVisibility(VISIBILITY_OFF); + m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + } + } else ResetTimer -= diff; //Return since we have no target if (!m_creature->SelectHostilTarget() || !m_creature->getVictim()) @@ -293,10 +292,8 @@ struct TRINITY_DLL_DECL boss_attumenAI : public ScriptedAI void SpellHit(Unit *source, const SpellEntry *spell) { - if(spell->Mechanic == MECHANIC_DISARM) - { - DoScriptText(SAY_DISARMED, m_creature); - } + if(spell->Mechanic == MECHANIC_DISARM) + DoScriptText(SAY_DISARMED, m_creature); } }; diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp index 294159f196e..7e9b6e828e5 100644 --- a/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp +++ b/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp @@ -451,7 +451,7 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI m_creature->SetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE, cinfo->mindmg); m_creature->SetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE, cinfo->maxdmg); - m_creature->SetAttackTime(OFF_ATTACK, (((uint32)m_creature->GetAttackTime(BASE_ATTACK)/1.5))); + m_creature->SetAttackTime(OFF_ATTACK, (m_creature->GetAttackTime(BASE_ATTACK)*150)/100); } } else if(phase == 2) diff --git a/src/bindings/scripts/scripts/zone/netherstorm/netherstorm.cpp b/src/bindings/scripts/scripts/zone/netherstorm/netherstorm.cpp index 3449b863a27..2f6ce7d300b 100644 --- a/src/bindings/scripts/scripts/zone/netherstorm/netherstorm.cpp +++ b/src/bindings/scripts/scripts/zone/netherstorm/netherstorm.cpp @@ -17,13 +17,14 @@ /* ScriptData SDName: Netherstorm SD%Complete: 75 -SDComment: Quest support: 10438, 10652 (special flight paths), 10299,10321,10322,10323,10329,10330,10338,10365(Shutting Down Manaforge) +SDComment: Quest support: 10438, 10652 (special flight paths), 10299,10321,10322,10323,10329,10330,10338,10365(Shutting Down Manaforge), 10198 SDCategory: Netherstorm EndScriptData */ /* ContentData npc_manaforge_control_console go_manaforge_control_console +npc_commander_dawnforge npc_protectorate_nether_drake npc_veronia EndContentData */ @@ -331,6 +332,341 @@ bool GOHello_go_manaforge_control_console(Player *player, GameObject* _GO) } /*###### +## npc_commander_dawnforge +######*/ + +// The Speech of Dawnforge, Ardonis & Pathaleon +#define SAY_COMMANDER_DAWNFORGE_1 -1000128 +#define SAY_ARCANIST_ARDONIS_1 -1000129 +#define SAY_COMMANDER_DAWNFORGE_2 -1000130 +#define SAY_PATHALEON_CULATOR_IMAGE_1 -1000131 +#define SAY_COMMANDER_DAWNFORGE_3 -1000132 +#define SAY_PATHALEON_CULATOR_IMAGE_2 -1000133 +#define SAY_PATHALEON_CULATOR_IMAGE_2_1 -1000134 +#define SAY_PATHALEON_CULATOR_IMAGE_2_2 -1000135 +#define SAY_COMMANDER_DAWNFORGE_4 -1000136 +#define SAY_ARCANIST_ARDONIS_2 -1000136 +#define SAY_COMMANDER_DAWNFORGE_5 -1000137 + +#define QUEST_INFO_GATHERING 10198 +#define SPELL_SUNFURY_DISGUISE 34603 + +// Entries of Arcanist Ardonis, Commander Dawnforge, Pathaleon the Curators Image +int CreatureEntry[3][1] = +{ + {19830}, // Ardonis + {19831}, // Dawnforge + {21504} // Pathaleon +}; + +struct TRINITY_DLL_DECL npc_commander_dawnforgeAI : public ScriptedAI +{ + npc_commander_dawnforgeAI(Creature *c) : ScriptedAI(c) { Reset (); } + + + uint64 playerGUID; + uint64 ardonisGUID; + uint64 pathaleonGUID; + + + uint32 Phase; + uint32 PhaseSubphase; + uint32 Phase_Timer; + bool isEvent; + + float angle_dawnforge; + float angle_ardonis; + + void Reset() + { + playerGUID = 0; + ardonisGUID = 0; + pathaleonGUID = 0; + + Phase = 1; + PhaseSubphase = 0; + Phase_Timer = 4000; + isEvent = false; + } + + void Aggro(Unit *who) { } + + //Select any creature in a grid + Creature* SelectCreatureInGrid(uint32 entry, float range) + { + Creature* pCreature = NULL; + + CellPair pair(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY())); + Cell cell(pair); + cell.data.Part.reserved = ALL_DISTRICT; + cell.SetNoCreate(); + + Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck creature_check(*m_creature, entry, true, range); + Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(pCreature, creature_check); + + TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer> creature_searcher(searcher); + + CellLock<GridReadGuard> cell_lock(cell, pair); + cell_lock->Visit(cell_lock, creature_searcher,*(m_creature->GetMap())); + + return pCreature; + } + + void JustSummoned(Creature *summoned) + { + pathaleonGUID = summoned->GetGUID(); + } + + // Emote Ardonis and Pathaleon + void Turn_to_Pathaleons_Image() + { + Unit *ardonis = Unit::GetUnit(*m_creature,ardonisGUID); + Unit *pathaleon = Unit::GetUnit(*m_creature,pathaleonGUID); + Player *player = (Player*)Unit::GetUnit(*m_creature,playerGUID); + + if (!ardonis || !pathaleon || !player) + return; + + //Calculate the angle to Pathaleon + angle_dawnforge = m_creature->GetAngle(pathaleon->GetPositionX(), pathaleon->GetPositionY()); + angle_ardonis = ardonis->GetAngle(pathaleon->GetPositionX(), pathaleon->GetPositionY()); + + //Turn Dawnforge and update + m_creature->SetOrientation(angle_dawnforge); + m_creature->SendUpdateToPlayer(player); + //Turn Ardonis and update + ardonis->SetOrientation(angle_ardonis); + ardonis->SendUpdateToPlayer(player); + + //Set them to kneel + m_creature->SetStandState(PLAYER_STATE_KNEEL); + ardonis->SetStandState(PLAYER_STATE_KNEEL); + } + + //Set them back to each other + void Turn_to_eachother() + { + if (Unit *ardonis = Unit::GetUnit(*m_creature,ardonisGUID)) + { + Player *player = (Player*)Unit::GetUnit(*m_creature,playerGUID); + + if (!player) + return; + + angle_dawnforge = m_creature->GetAngle(ardonis->GetPositionX(), ardonis->GetPositionY()); + angle_ardonis = ardonis->GetAngle(m_creature->GetPositionX(), m_creature->GetPositionY()); + + //Turn Dawnforge and update + m_creature->SetOrientation(angle_dawnforge); + m_creature->SendUpdateToPlayer(player); + //Turn Ardonis and update + ardonis->SetOrientation(angle_ardonis); + ardonis->SendUpdateToPlayer(player); + + //Set state + m_creature->SetStandState(PLAYER_STATE_NONE); + ardonis->SetStandState(PLAYER_STATE_NONE); + } + } + + bool CanStartEvent(Player *player) + { + if (!isEvent) + { + Creature *ardonis = SelectCreatureInGrid(CreatureEntry[0][0], 10.0f); + if (!ardonis) + return false; + + ardonisGUID = ardonis->GetGUID(); + playerGUID = player->GetGUID(); + + isEvent = true; + + Turn_to_eachother(); + return true; + } + + debug_log("SD2: npc_commander_dawnforge event already in progress, need to wait."); + return false; + } + + void UpdateAI(const uint32 diff) + { + //Is event even running? + if (!isEvent) + return; + + //Phase timing + if (Phase_Timer >= diff) + { + Phase_Timer -= diff; + return; + } + + Unit *ardonis = Unit::GetUnit(*m_creature,ardonisGUID); + Unit *pathaleon = Unit::GetUnit(*m_creature,pathaleonGUID); + Player *player = (Player*)Unit::GetUnit(*m_creature,playerGUID); + + if (!ardonis || !player) + { + Reset(); + return; + } + + if (Phase > 4 && !pathaleon) + { + Reset(); + return; + } + + //Phase 1 Dawnforge say + switch (Phase) + { + case 1: + DoScriptText(SAY_COMMANDER_DAWNFORGE_1, m_creature); + ++Phase; + Phase_Timer = 16000; + break; + //Phase 2 Ardonis say + case 2: + DoScriptText(SAY_ARCANIST_ARDONIS_1, ardonis); + ++Phase; + Phase_Timer = 16000; + break; + //Phase 3 Dawnforge say + case 3: + DoScriptText(SAY_COMMANDER_DAWNFORGE_2, m_creature); + ++Phase; + Phase_Timer = 16000; + break; + //Phase 4 Pathaleon spawns up to phase 9 + case 4: + //spawn pathaleon's image + m_creature->SummonCreature(CreatureEntry[2][0], 2325.851563, 2799.534668, 133.084229, 6.038996, TEMPSUMMON_TIMED_DESPAWN, 90000); + ++Phase; + Phase_Timer = 500; + break; + //Phase 5 Pathaleon say + case 5: + DoScriptText(SAY_PATHALEON_CULATOR_IMAGE_1, pathaleon); + ++Phase; + Phase_Timer = 6000; + break; + //Phase 6 + case 6: + switch(PhaseSubphase) + { + //Subphase 1: Turn Dawnforge and Ardonis + case 0: + Turn_to_Pathaleons_Image(); + ++PhaseSubphase; + Phase_Timer = 8000; + break; + //Subphase 2 Dawnforge say + case 1: + DoScriptText(SAY_COMMANDER_DAWNFORGE_3, m_creature); + PhaseSubphase = 0; + ++Phase; + Phase_Timer = 8000; + break; + } + break; + //Phase 7 Pathaleons say 3 Sentence, every sentence need a subphase + case 7: + switch(PhaseSubphase) + { + //Subphase 1 + case 0: + DoScriptText(SAY_PATHALEON_CULATOR_IMAGE_2, pathaleon); + ++PhaseSubphase; + Phase_Timer = 12000; + break; + //Subphase 2 + case 1: + DoScriptText(SAY_PATHALEON_CULATOR_IMAGE_2_1, pathaleon); + ++PhaseSubphase; + Phase_Timer = 16000; + break; + //Subphase 3 + case 2: + DoScriptText(SAY_PATHALEON_CULATOR_IMAGE_2_2, pathaleon); + PhaseSubphase = 0; + ++Phase; + Phase_Timer = 10000; + break; + } + break; + //Phase 8 Dawnforge & Ardonis say + case 8: + DoScriptText(SAY_COMMANDER_DAWNFORGE_4, m_creature); + DoScriptText(SAY_ARCANIST_ARDONIS_2, ardonis); + ++Phase; + Phase_Timer = 4000; + break; + //Phase 9 Pathaleons Despawn, Reset Dawnforge & Ardonis angle + case 9: + Turn_to_eachother(); + //hide pathaleon, unit will despawn shortly + pathaleon->SetVisibility(VISIBILITY_OFF); + PhaseSubphase = 0; + ++Phase; + Phase_Timer = 3000; + break; + //Phase 10 Dawnforge say + case 10: + DoScriptText(SAY_COMMANDER_DAWNFORGE_5, m_creature); + player->AreaExploredOrEventHappens(QUEST_INFO_GATHERING); + Reset(); + break; + } + } +}; + +CreatureAI* GetAI_npc_commander_dawnforge(Creature* _Creature) +{ + return new npc_commander_dawnforgeAI(_Creature); +} + +Creature* SearchDawnforge(Player *source, uint32 entry, float range) +{ + Creature* pCreature = NULL; + + CellPair pair(Trinity::ComputeCellPair(source->GetPositionX(), source->GetPositionY())); + Cell cell(pair); + cell.data.Part.reserved = ALL_DISTRICT; + cell.SetNoCreate(); + + Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck creature_check(*source, entry, true, range); + Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(pCreature, creature_check); + + TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer> creature_searcher(searcher); + + CellLock<GridReadGuard> cell_lock(cell, pair); + cell_lock->Visit(cell_lock, creature_searcher,*(source->GetMap())); + + return pCreature; +} + +bool AreaTrigger_at_commander_dawnforge(Player *player, AreaTriggerEntry *at) +{ + //if player lost aura or not have at all, we should not try start event. + if (!player->HasAura(SPELL_SUNFURY_DISGUISE,0)) + return false; + + if (player->isAlive() && player->GetQuestStatus(QUEST_INFO_GATHERING) == QUEST_STATUS_INCOMPLETE) + { + Creature* Dawnforge = SearchDawnforge(player, CreatureEntry[1][0], 30.0f); + + if (!Dawnforge) + return false; + + if (((npc_commander_dawnforgeAI*)Dawnforge->AI())->CanStartEvent(player)) + return true; + } + return false; +} + +/*###### ## npc_protectorate_nether_drake ######*/ @@ -393,12 +729,14 @@ bool GossipSelect_npc_veronia(Player *player, Creature *_Creature, uint32 sender ## mob_phase_hunter ######*/ -#define SUMMONED_MOB 19595 -#define EMOTE_WEAK "is very weak" +#define SUMMONED_MOB 19595 +#define EMOTE_WEAK "is very weak" // Spells -#define SPELL_PHASE_SLIP 36574 -#define SPELL_MANA_BURN 13321 +#define SPELL_PHASE_SLIP 36574 +#define SPELL_MANA_BURN 13321 +#define SPELL_MATERIALIZE 34804 +#define SPELL_DE_MATERIALIZE 34804 struct TRINITY_DLL_DECL mob_phase_hunterAI : public ScriptedAI { @@ -406,6 +744,8 @@ struct TRINITY_DLL_DECL mob_phase_hunterAI : public ScriptedAI mob_phase_hunterAI(Creature *c) : ScriptedAI(c) {Reset();} bool Weak; + bool Materialize; + int WeakPercent; uint32 PlayerGUID; uint32 Health; @@ -416,6 +756,8 @@ struct TRINITY_DLL_DECL mob_phase_hunterAI : public ScriptedAI void Reset() { Weak = false; + Materialize = false; + WeakPercent = 25 + (rand()%16); // 25-40 PlayerGUID = 0; ManaBurnTimer = 5000 + (rand()%3 * 1000); // 5-8 sec cd @@ -426,9 +768,20 @@ struct TRINITY_DLL_DECL mob_phase_hunterAI : public ScriptedAI PlayerGUID = who->GetGUID(); } + void SpellHit(Unit *caster, const SpellEntry *spell) + { + DoCast(m_creature, SPELL_DE_MATERIALIZE); + } + void UpdateAI(const uint32 diff) { + if(!Materialize) + { + DoCast(m_creature, SPELL_MATERIALIZE); + Materialize = true; + } + Player* target = NULL; target = ((Player*)Unit::GetUnit((*m_creature), PlayerGUID)); @@ -501,6 +854,16 @@ void AddSC_netherstorm() newscript->GetAI = GetAI_npc_manaforge_control_console; newscript->RegisterSelf(); + newscript = new Script; + newscript->Name = "npc_commander_dawnforge"; + newscript->GetAI = GetAI_npc_commander_dawnforge; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "at_commander_dawnforge"; + newscript->pAreaTrigger = &AreaTrigger_at_commander_dawnforge; + newscript->RegisterSelf(); + newscript = new Script; newscript->Name="npc_protectorate_nether_drake"; newscript->pGossipHello = &GossipHello_npc_protectorate_nether_drake; diff --git a/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp b/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp index 534a853302d..519209d5ba0 100644 --- a/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp +++ b/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp @@ -17,7 +17,7 @@ /* ScriptData SDName: Shadowmoon_Valley SD%Complete: 100 -SDComment: Quest support: 10519, 10583, 10601, 10814, 10804, 10854, 11082, 11108. Vendor Drake Dealer Hurlunk. Teleporter TO Invasion Point: Cataclysm +SDComment: Quest support: 10519, 10583, 10601, 10814, 10804, 10854, 11082. Vendor Drake Dealer Hurlunk. SDCategory: Shadowmoon Valley EndScriptData */ @@ -25,7 +25,6 @@ EndScriptData */ mob_mature_netherwing_drake mob_enslaved_netherwing_drake npc_drake_dealer_hurlunk -npc_invis_legion_teleporter npcs_flanis_swiftwing_and_kagrosh npc_murkblood_overseer npc_neltharaku @@ -412,68 +411,6 @@ bool GossipSelect_npc_drake_dealer_hurlunk(Player *player, Creature *_Creature, } /*###### -## npc_invis_legion_teleporter -######*/ - -#define SPELL_TELE_A_TO 37387 -#define SPELL_TELE_H_TO 37389 - -struct TRINITY_DLL_DECL npc_invis_legion_teleporterAI : public ScriptedAI -{ - npc_invis_legion_teleporterAI(Creature *c) : ScriptedAI(c) {Reset();} - - uint64 PlayerGuid; - uint32 TeleTimer; - - void Reset() - { - PlayerGuid=0; - TeleTimer = 5000; - } - - void Aggro(Unit* who) - { - } - - void MoveInLineOfSight(Unit *who) - { - if (!who || who->GetTypeId() != TYPEID_PLAYER) - return; - - if(who->GetTypeId() == TYPEID_PLAYER && m_creature->GetDistance(who)<4) - { - if (who->isAlive() || !who->isInCombat()) - PlayerGuid = who->GetGUID(); - } - } - - void UpdateAI(const uint32 diff) - { - if(TeleTimer < diff) - { - if(PlayerGuid) - { - Player* player = ((Player*)Unit::GetUnit((*m_creature), PlayerGuid)); - - if(m_creature->GetDistance(player)<3) - { - if(player->GetTeam()== ALLIANCE && player->GetQuestRewardStatus(10589)) - player->CastSpell(player,SPELL_TELE_A_TO,false); - if(player->GetTeam()== HORDE && player->GetQuestRewardStatus(10604)) - player->CastSpell(player,SPELL_TELE_H_TO,false); - } - PlayerGuid=0; - } - TeleTimer = 5000; - }else TeleTimer -= diff; - } -}; -CreatureAI* GetAI_npc_invis_legion_teleporter(Creature *_Creature) -{ - return new npc_invis_legion_teleporterAI (_Creature); -} - -/*###### ## npc_flanis_swiftwing_and_kagrosh ######*/ @@ -1125,11 +1062,6 @@ void AddSC_shadowmoon_valley() newscript->RegisterSelf(); newscript = new Script; - newscript->Name="npc_invis_legion_teleporter"; - newscript->GetAI = GetAI_npc_invis_legion_teleporter; - newscript->RegisterSelf(); - - newscript = new Script; newscript->Name="npcs_flanis_swiftwing_and_kagrosh"; newscript->pGossipHello = &GossipHello_npcs_flanis_swiftwing_and_kagrosh; newscript->pGossipSelect = &GossipSelect_npcs_flanis_swiftwing_and_kagrosh; diff --git a/src/bindings/scripts/scripts/zone/stratholme/stratholme.cpp b/src/bindings/scripts/scripts/zone/stratholme/stratholme.cpp index 139c0ddea75..1ebfbef1782 100644 --- a/src/bindings/scripts/scripts/zone/stratholme/stratholme.cpp +++ b/src/bindings/scripts/scripts/zone/stratholme/stratholme.cpp @@ -199,17 +199,18 @@ struct TRINITY_DLL_DECL mobs_spectral_ghostly_citizenAI : public ScriptedAI { if (Tagged) { - for(uint8 i = 0; i < 4; i++) + for(uint32 i = 1; i <= 4; i++) { float x,y,z; - m_creature->GetRandomPoint(m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ(),25.0f,x,y,z); - - int j = rand()%i; - if (!j) - m_creature->SummonCreature(ENTRY_RESTLESS,x,y,z,0,TEMPSUMMON_CORPSE_DESPAWN,600000); - } - } - } + m_creature->GetRandomPoint(m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ(),20.0f,x,y,z); + + //100%, 50%, 33%, 25% chance to spawn + uint32 j = urand(1,i); + if (j==1) + m_creature->SummonCreature(ENTRY_RESTLESS,x,y,z,0,TEMPSUMMON_CORPSE_DESPAWN,600000); + } + } + } void UpdateAI(const uint32 diff) { diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 2ecb350beb5..c2acd65e72e 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -438,19 +438,20 @@ Map::LoadGrid(const Cell& cell, bool no_unload) { ObjectGridLoader loader(*grid, this, cell); loader.LoadN(); + setGridObjectDataLoaded(true,cell.GridX(), cell.GridY()); // Add resurrectable corpses to world object list in grid ObjectAccessor::Instance().AddCorpsesToGrid(GridPair(cell.GridX(),cell.GridY()),(*grid)(cell.CellX(), cell.CellY()), this); - setGridObjectDataLoaded(true,cell.GridX(), cell.GridY()); // Not sure if this is the reason that far sight cause crash // Seems crash happens when trying to delete a far sight dynobj from an unopened grid ResetGridExpiry(*getNGrid(cell.GridX(), cell.GridY()), 1.0f); grid->SetGridState(GRID_STATE_ACTIVE); + if(no_unload) getNGrid(cell.GridX(), cell.GridY())->setUnloadFlag(false); } - LoadVMap(63-cell.GridX(),63-cell.GridY()); + //LoadVMap(63-cell.GridX(),63-cell.GridY()); } bool Map::Add(Player *player) diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp index 59a6f596c72..504b78a5aa6 100644 --- a/src/game/Pet.cpp +++ b/src/game/Pet.cpp @@ -1767,6 +1767,9 @@ void Pet::LearnPetPassives() PetFamilySpellsStore::const_iterator petStore = sPetFamilySpellsStore.find(cFamily->ID); if(petStore != sPetFamilySpellsStore.end()) { + // For general hunter pets skill 270 + // Passive 01~10, Passive 00 (20782, not used), Ferocious Inspiration (34457) + // Scale 01~03 (34902~34904, bonus from owner, not used) for(PetFamilySpellsSet::const_iterator petSet = petStore->second.begin(); petSet != petStore->second.end(); ++petSet) addSpell(*petSet, ACT_DECIDE, PETSPELL_NEW, 0xffff, PETSPELL_FAMILY); } diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index a11fa495d00..f53338b023d 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -3469,7 +3469,7 @@ void Spell::EffectAddFarsight(uint32 i) CellPair pair = Trinity::ComputeCellPair(dynObj->GetPositionX(), dynObj->GetPositionY()); Cell cell(pair); Map* map = dynObj->GetMap(); - map->LoadGrid(cell); // In case the spell is casted into a different grid by player + map->EnsureGridLoadedForPlayer(cell, NULL, false); // In case the spell is casted into a different grid by player map->Add(dynObj); map->SwitchGridContainers(dynObj, true); // Needed for forwarding player packets dynObj->setActive(true); // Keep the grid updated even if there are no players in it |