*Merge with 551.

--HG--
branch : trunk
This commit is contained in:
megamage
2008-12-20 12:30:17 -06:00
15 changed files with 492 additions and 212 deletions

22
sql/updates/551_world.sql Normal file
View File

@@ -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');

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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.

View File

@@ -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);

View File

@@ -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);
}
};

View File

@@ -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)

View File

@@ -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 */
@@ -330,6 +331,341 @@ bool GOHello_go_manaforge_control_console(Player *player, GameObject* _GO)
return true;
}
/*######
## 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;

View File

@@ -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
@@ -411,68 +410,6 @@ bool GossipSelect_npc_drake_dealer_hurlunk(Player *player, Creature *_Creature,
return true;
}
/*######
## 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
######*/
@@ -1124,11 +1061,6 @@ void AddSC_shadowmoon_valley()
newscript->pGossipSelect = &GossipSelect_npc_drake_dealer_hurlunk;
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;

View File

@@ -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);
m_creature->GetRandomPoint(m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ(),20.0f,x,y,z);
int j = rand()%i;
if (!j)
m_creature->SummonCreature(ENTRY_RESTLESS,x,y,z,0,TEMPSUMMON_CORPSE_DESPAWN,600000);
}
}
}
//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)
{

View File

@@ -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)

View File

@@ -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);
}

View File

@@ -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