mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-18 08:28:32 +01:00
*Merge with 551.
--HG-- branch : trunk
This commit is contained in:
22
sql/updates/551_world.sql
Normal file
22
sql/updates/551_world.sql
Normal 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');
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user