--HG--
branch : trunk
This commit is contained in:
megamage
2009-04-08 17:34:01 -05:00
7 changed files with 74 additions and 13 deletions
@@ -68,6 +68,7 @@ struct TRINITY_DLL_DECL npc_escortAI : public ScriptedAI
void SetCanMelee(bool usemelee) { CanMelee = usemelee; } void SetCanMelee(bool usemelee) { CanMelee = usemelee; }
void SetDespawnAtEnd(bool despawn) { DespawnAtEnd = despawn; } void SetDespawnAtEnd(bool despawn) { DespawnAtEnd = despawn; }
void SetDespawnAtFar(bool despawn) { DespawnAtFar = despawn; } void SetDespawnAtFar(bool despawn) { DespawnAtFar = despawn; }
bool GetAttack() { return Attack; }//used in EnterEvadeMode override
// EscortAI variables // EscortAI variables
protected: protected:
@@ -299,6 +299,8 @@ hyjalAI::hyjalAI(Creature *c) : npc_escortAI(c), Summons(m_creature)
RespawnTimer = 10000; RespawnTimer = 10000;
DoRespawn = false; DoRespawn = false;
DoHide = false; DoHide = false;
MassTeleportTimer = 0;
DoMassTeleport = false;
} }
void hyjalAI::JustSummoned(Creature *summoned) void hyjalAI::JustSummoned(Creature *summoned)
@@ -389,7 +391,8 @@ void hyjalAI::Reset()
void hyjalAI::EnterEvadeMode() void hyjalAI::EnterEvadeMode()
{ {
m_creature->InterruptNonMeleeSpells(true); m_creature->InterruptNonMeleeSpells(true);
m_creature->RemoveAllAuras(); if(m_creature->GetEntry() != JAINA)
m_creature->RemoveAllAuras();
m_creature->DeleteThreatList(); m_creature->DeleteThreatList();
m_creature->CombatStop(); m_creature->CombatStop();
m_creature->LoadCreaturesAddon(); m_creature->LoadCreaturesAddon();
@@ -404,6 +407,7 @@ void hyjalAI::EnterEvadeMode()
void hyjalAI::Aggro(Unit *who) void hyjalAI::Aggro(Unit *who)
{ {
if(IsDummy)return;
for(uint8 i = 0; i < 3; ++i) for(uint8 i = 0; i < 3; ++i)
if(Spell[i].Cooldown) if(Spell[i].Cooldown)
SpellTimer[i] = Spell[i].Cooldown; SpellTimer[i] = Spell[i].Cooldown;
@@ -411,6 +415,18 @@ void hyjalAI::Aggro(Unit *who)
Talk(ATTACKED); Talk(ATTACKED);
} }
void hyjalAI::MoveInLineOfSight(Unit *who)
{
if(IsDummy)return;
if (IsBeingEscorted && !GetAttack())
return;
if(m_creature->getVictim() || !m_creature->canStartAttack(who))
return;
AttackStart(who);
}
void hyjalAI::SummonCreature(uint32 entry, float Base[4][3]) void hyjalAI::SummonCreature(uint32 entry, float Base[4][3])
{ {
uint32 random = rand()%4; uint32 random = rand()%4;
@@ -683,7 +699,9 @@ void hyjalAI::Retreat()
{ {
JainaDummy->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); JainaDummy->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
((hyjalAI*)JainaDummy->AI())->IsDummy = true; ((hyjalAI*)JainaDummy->AI())->IsDummy = true;
JainaDummy->CastSpell(JainaDummy, SPELL_TELEPORT_VISUAL, true); DummyGuid = JainaDummy->GetGUID();
//((hyjalAI*)JainaDummy->AI())->MassTeleportTimer = 20000;
//((hyjalAI*)JainaDummy->AI())->DoMassTeleport = true;
} }
AddWaypoint(0,JainaDummySpawn[1][0],JainaDummySpawn[1][1],JainaDummySpawn[1][2]); AddWaypoint(0,JainaDummySpawn[1][0],JainaDummySpawn[1][1],JainaDummySpawn[1][2]);
Start(false, false, false); Start(false, false, false);
@@ -755,6 +773,11 @@ void hyjalAI::UpdateAI(const uint32 diff)
{ {
if(IsDummy) if(IsDummy)
{ {
if(MassTeleportTimer < diff && DoMassTeleport)
{
m_creature->CastSpell(m_creature,SPELL_MASS_TELEPORT,false);
DoMassTeleport = false;
}else MassTeleportTimer -= diff;
return; return;
} }
if(DoHide) if(DoHide)
@@ -781,6 +804,9 @@ void hyjalAI::UpdateAI(const uint32 diff)
HideNearPos(m_creature->GetPositionX(), m_creature->GetPositionY()); HideNearPos(m_creature->GetPositionX(), m_creature->GetPositionY());
HideNearPos(5563, -2763.19); HideNearPos(5563, -2763.19);
HideNearPos(5542.2, -2629.36); HideNearPos(5542.2, -2629.36);
for(uint8 i = 0; i < 65; i++)//summon fires
m_creature->SummonGameObject(FLAMEOBJECT,HordeFirePos[i][0],HordeFirePos[i][1],HordeFirePos[i][2],HordeFirePos[i][3],HordeFirePos[i][4],HordeFirePos[i][5],HordeFirePos[i][6],HordeFirePos[i][7],0);
} }
else m_creature->SetVisibility(VISIBILITY_ON); else m_creature->SetVisibility(VISIBILITY_ON);
break; break;
@@ -809,15 +835,16 @@ void hyjalAI::UpdateAI(const uint32 diff)
} }
if(Overrun) if(Overrun)
DoOverrun(Faction, diff); DoOverrun(Faction, diff);
if(m_creature->GetEntry() == 17772) /* if(m_creature->GetEntry() == 17772)
{ {
if(!m_creature->HasAura(SPELL_BRILLIANCE_AURA,0)) if(!m_creature->HasAura(SPELL_BRILLIANCE_AURA,0))
DoCast(m_creature, SPELL_BRILLIANCE_AURA, true); DoCast(m_creature, SPELL_BRILLIANCE_AURA, true);
} }*/
if(bRetreat) if(bRetreat)
{ {
if(RetreatTimer < diff) if(RetreatTimer < diff)
{ {
IsDummy = true;
bRetreat = false; bRetreat = false;
HideNearPos(m_creature->GetPositionX(), m_creature->GetPositionY()); HideNearPos(m_creature->GetPositionX(), m_creature->GetPositionY());
switch(m_creature->GetEntry()) switch(m_creature->GetEntry())
@@ -996,7 +1023,19 @@ void hyjalAI::WaypointReached(uint32 i)
{ {
m_creature->MonsterYell("Hurry, we don't have much time",0,0); m_creature->MonsterYell("Hurry, we don't have much time",0,0);
WaitForTeleport = true; WaitForTeleport = true;
TeleportTimer = 15000; TeleportTimer = 20000;
if(m_creature->GetEntry() == JAINA)
m_creature->CastSpell(m_creature,SPELL_MASS_TELEPORT,false);
if(m_creature->GetEntry() == THRALL && DummyGuid)
{
Unit* Dummy = Unit::GetUnit((*m_creature),DummyGuid);
if(Dummy)
{
((hyjalAI*)((Creature*)Dummy)->AI())->DoMassTeleport = true;
((hyjalAI*)((Creature*)Dummy)->AI())->MassTeleportTimer = 20000;
Dummy->CastSpell(m_creature,SPELL_MASS_TELEPORT,false);
}
}
//do some talking //do some talking
//all alive guards walk near here //all alive guards walk near here
CellPair pair(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY())); CellPair pair(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
@@ -1065,6 +1104,7 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff)
{ {
(*itr)->CastSpell(*itr, SPELL_TELEPORT_VISUAL, true); (*itr)->CastSpell(*itr, SPELL_TELEPORT_VISUAL, true);
(*itr)->setFaction(35);//make them friendly so mobs won't attack them (*itr)->setFaction(35);//make them friendly so mobs won't attack them
(*itr)->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
} }
} }
DoCast(m_creature, SPELL_TELEPORT_VISUAL); DoCast(m_creature, SPELL_TELEPORT_VISUAL);
@@ -1122,7 +1162,10 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff)
} }
} }
break; break;
case 1://horde case 1://horde
for(uint8 i = 0; i < 65; i++)//summon fires
m_creature->SummonGameObject(FLAMEOBJECT,HordeFirePos[i][0],HordeFirePos[i][1],HordeFirePos[i][2],HordeFirePos[i][3],HordeFirePos[i][4],HordeFirePos[i][5],HordeFirePos[i][6],HordeFirePos[i][7],0);
break; break;
} }
} }
@@ -28,7 +28,7 @@
#define TYRANDE 17948 #define TYRANDE 17948
#define ANCIENT_VEIN 185557 #define ANCIENT_VEIN 185557
#define FLAMEOBJECT 182592 #define FLAMEOBJECT 182592
// Bosses summoned after every 8 waves // Bosses summoned after every 8 waves
#define RAGE_WINTERCHILL 17767 #define RAGE_WINTERCHILL 17767
@@ -37,10 +37,11 @@
#define AZGALOR 17842 #define AZGALOR 17842
#define ARCHIMONDE 17968 #define ARCHIMONDE 17968
#define SPELL_TELEPORT_VISUAL 41232 #define SPELL_TELEPORT_VISUAL 41232
#define SPELL_MASS_TELEPORT 16807
//Spells for Jaina //Spells for Jaina
#define SPELL_BRILLIANCE_AURA 31260 // The database must handle this spell via creature_addon #define SPELL_BRILLIANCE_AURA 31260 // The database must handle this spell via creature_addon(it should, but is removed in evade..)
#define SPELL_BLIZZARD 31266 #define SPELL_BLIZZARD 31266
#define SPELL_PYROBLAST 31263 #define SPELL_PYROBLAST 31263
#define SPELL_SUMMON_ELEMENTALS 31264 #define SPELL_SUMMON_ELEMENTALS 31264
@@ -185,6 +186,7 @@ struct TRINITY_DLL_DECL hyjalAI : public npc_escortAI
void RespawnNearPos(float x, float y); void RespawnNearPos(float x, float y);
void WaypointReached(uint32 i); void WaypointReached(uint32 i);
void DoOverrun(uint32 faction, const uint32 diff); void DoOverrun(uint32 faction, const uint32 diff);
void MoveInLineOfSight(Unit *who);
void SummonCreature(uint32 entry, float Base[4][3]); // Summons a creature for that wave in that base void SummonCreature(uint32 entry, float Base[4][3]); // Summons a creature for that wave in that base
@@ -232,6 +234,9 @@ struct TRINITY_DLL_DECL hyjalAI : public npc_escortAI
bool DoRespawn; bool DoRespawn;
bool DoHide; bool DoHide;
bool IsDummy; bool IsDummy;
uint32 MassTeleportTimer;
bool DoMassTeleport;
uint64 DummyGuid;
struct Spell struct Spell
{ {
+1 -1
View File
@@ -1376,7 +1376,7 @@ bool BattleGround::AddObject(uint32 type, uint32 entry, float x, float y, float
data.go_state = 1; data.go_state = 1;
*/ */
// add to world, so it can be later looked up from HashMapHolder // add to world, so it can be later looked up from HashMapHolder
go->AddToWorld(); map->Add(go);
m_BgObjects[type] = go->GetGUID(); m_BgObjects[type] = go->GetGUID();
return true; return true;
} }
+2 -2
View File
@@ -477,7 +477,7 @@ bool Map::Add(Player *player)
SendInitTransports(player); SendInitTransports(player);
player->m_clientGUIDs.clear(); player->m_clientGUIDs.clear();
AddNotifier(player); //AddNotifier(player);
return true; return true;
} }
@@ -517,7 +517,7 @@ Map::Add(T *obj)
//if(obj->GetTypeId() != TYPEID_UNIT) //if(obj->GetTypeId() != TYPEID_UNIT)
UpdateObjectVisibility(obj,cell,p); UpdateObjectVisibility(obj,cell,p);
AddNotifier(obj); //AddNotifier(obj);
} }
void Map::MessageBroadcast(Player *player, WorldPacket *msg, bool to_self, bool to_possessor) void Map::MessageBroadcast(Player *player, WorldPacket *msg, bool to_self, bool to_possessor)
+3 -1
View File
@@ -1674,7 +1674,9 @@ Map const* WorldObject::GetBaseMap() const
void WorldObject::AddObjectToRemoveList() void WorldObject::AddObjectToRemoveList()
{ {
Map* map = MapManager::Instance().FindMap(GetMapId(), GetInstanceId()); assert(m_uint32Values);
Map* map = FindMap();
if(!map) if(!map)
{ {
sLog.outError("Object (TypeId: %u Entry: %u GUID: %u) at attempt add to move list not have valid map (Id: %u).",GetTypeId(),GetEntry(),GetGUIDLow(),GetMapId()); sLog.outError("Object (TypeId: %u Entry: %u GUID: %u) at attempt add to move list not have valid map (Id: %u).",GetTypeId(),GetEntry(),GetGUIDLow(),GetMapId());
+10
View File
@@ -11007,6 +11007,16 @@ uint32 Unit::GetCreatePowers( Powers power ) const
return 0; return 0;
} }
void Unit::AddToWorld()
{
if(!IsInWorld())
{
m_Notified = false;
m_IsInNotifyList = false;
SetToNotify();
}
}
void Unit::RemoveFromWorld() void Unit::RemoveFromWorld()
{ {
// cleanup // cleanup