mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-20 09:17:36 +01:00
Core/Map: Save weather, light and music overrides in map to send them to players logging in
This commit is contained in:
@@ -123,6 +123,7 @@ DBCStorage <ItemRandomSuffixEntry> sItemRandomSuffixStore(ItemRandomSuffixfmt);
|
||||
DBCStorage <ItemSetEntry> sItemSetStore(ItemSetEntryfmt);
|
||||
|
||||
DBCStorage <LFGDungeonEntry> sLFGDungeonStore(LFGDungeonEntryfmt);
|
||||
DBCStorage <LightEntry> sLightStore(LightEntryfmt);
|
||||
DBCStorage <LiquidTypeEntry> sLiquidTypeStore(LiquidTypefmt);
|
||||
DBCStorage <LockEntry> sLockStore(LockEntryfmt);
|
||||
|
||||
@@ -371,6 +372,7 @@ void LoadDBCStores(const std::string& dataPath)
|
||||
LoadDBC(availableDbcLocales, bad_dbc_files, sItemSetStore, dbcPath, "ItemSet.dbc");
|
||||
|
||||
LoadDBC(availableDbcLocales, bad_dbc_files, sLFGDungeonStore, dbcPath, "LFGDungeons.dbc");
|
||||
LoadDBC(availableDbcLocales, bad_dbc_files, sLightStore, dbcPath, "Light.dbc");
|
||||
LoadDBC(availableDbcLocales, bad_dbc_files, sLiquidTypeStore, dbcPath, "LiquidType.dbc");
|
||||
LoadDBC(availableDbcLocales, bad_dbc_files, sLockStore, dbcPath, "Lock.dbc");
|
||||
|
||||
@@ -944,3 +946,18 @@ LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty)
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
uint32 GetDefaultMapLight(uint32 mapId)
|
||||
{
|
||||
for (int32 i = sLightStore.GetNumRows(); i >= 0; --i)
|
||||
{
|
||||
LightEntry const* light = sLightStore.LookupEntry(uint32(i));
|
||||
if (!light)
|
||||
continue;
|
||||
|
||||
if (light->MapId == mapId && light->X == 0.0f && light->Y == 0.0f && light->Z == 0.0f)
|
||||
return light->Id;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -72,6 +72,8 @@ CharStartOutfitEntry const* GetCharStartOutfitEntry(uint8 race, uint8 class_, ui
|
||||
|
||||
LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty);
|
||||
|
||||
uint32 GetDefaultMapLight(uint32 mapId);
|
||||
|
||||
extern DBCStorage <AchievementEntry> sAchievementStore;
|
||||
extern DBCStorage <AchievementCriteriaEntry> sAchievementCriteriaStore;
|
||||
extern DBCStorage <AreaTableEntry> sAreaStore;// recommend access using functions
|
||||
|
||||
@@ -1230,6 +1230,24 @@ struct LFGDungeonEntry
|
||||
uint32 Entry() const { return ID + (type << 24); }
|
||||
};
|
||||
|
||||
struct LightEntry
|
||||
{
|
||||
uint32 Id;
|
||||
uint32 MapId;
|
||||
float X;
|
||||
float Y;
|
||||
float Z;
|
||||
//float FalloffStart;
|
||||
//float FalloffEnd;
|
||||
//uint32 SkyAndFog;
|
||||
//uint32 WaterSettings;
|
||||
//uint32 SunsetParams;
|
||||
//uint32 OtherParams;
|
||||
//uint32 DeathParams;
|
||||
//uint32 Unknown;
|
||||
//uint32 Unknown;
|
||||
//uint32 Unknown;
|
||||
};
|
||||
|
||||
struct LiquidTypeEntry
|
||||
{
|
||||
|
||||
@@ -79,6 +79,7 @@ char const ItemRandomPropertiesfmt[] = "nxiiixxssssssssssssssssx";
|
||||
char const ItemRandomSuffixfmt[] = "nssssssssssssssssxxiiixxiiixx";
|
||||
char const ItemSetEntryfmt[] = "dssssssssssssssssxiiiiiiiiiixxxxxxxiiiiiiiiiiiiiiiiii";
|
||||
char const LFGDungeonEntryfmt[] = "nssssssssssssssssxiiiiiiiiixxixixxxxxxxxxxxxxxxxx";
|
||||
char const LightEntryfmt[] = "nifffxxxxxxxxxx";
|
||||
char const LiquidTypefmt[] = "nxxixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
|
||||
char const LockEntryfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx";
|
||||
char const MailTemplateEntryfmt[] = "nxxxxxxxxxxxxxxxxxssssssssssssssssx";
|
||||
|
||||
@@ -223,7 +223,7 @@ m_unloadTimer(0), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE),
|
||||
m_VisibilityNotifyPeriod(DEFAULT_VISIBILITY_NOTIFY_PERIOD),
|
||||
m_activeNonPlayersIter(m_activeNonPlayers.end()), _transportsUpdateIter(_transports.end()),
|
||||
i_gridExpiry(expiry),
|
||||
i_scriptLock(false)
|
||||
i_scriptLock(false), _defaultLight(GetDefaultMapLight(id))
|
||||
{
|
||||
m_parentMap = (_parent ? _parent : this);
|
||||
for (unsigned int idx=0; idx < MAX_NUMBER_OF_GRIDS; ++idx)
|
||||
@@ -477,6 +477,7 @@ bool Map::AddPlayerToMap(Player* player)
|
||||
|
||||
SendInitSelf(player);
|
||||
SendInitTransports(player);
|
||||
SendZoneDynamicInfo(player);
|
||||
|
||||
player->m_clientGUIDs.clear();
|
||||
player->UpdateObjectVisibility(false);
|
||||
@@ -3433,3 +3434,103 @@ time_t Map::GetLinkedRespawnTime(uint64 guid) const
|
||||
return time_t(0);
|
||||
}
|
||||
|
||||
void Map::SendZoneDynamicInfo(Player* player)
|
||||
{
|
||||
uint32 zoneId = GetZoneId(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
|
||||
ZoneDynamicInfoMap::const_iterator itr = _zoneDynamicInfo.find(zoneId);
|
||||
if (itr == _zoneDynamicInfo.end())
|
||||
return;
|
||||
|
||||
if (uint32 music = itr->second.MusicId)
|
||||
{
|
||||
WorldPacket data(SMSG_PLAY_MUSIC, 4);
|
||||
data << uint32(music);
|
||||
player->SendDirectMessage(&data);
|
||||
}
|
||||
|
||||
if (uint32 weather = itr->second.WeatherId)
|
||||
{
|
||||
WorldPacket data(SMSG_WEATHER, 4 + 4 + 1);
|
||||
data << uint32(weather);
|
||||
data << float(itr->second.WeatherGrade);
|
||||
data << uint8(0);
|
||||
player->SendDirectMessage(&data);
|
||||
}
|
||||
|
||||
if (uint32 overrideLight = itr->second.OverrideLightId)
|
||||
{
|
||||
WorldPacket data(SMSG_OVERRIDE_LIGHT, 4 + 4 + 1);
|
||||
data << uint32(_defaultLight);
|
||||
data << uint32(overrideLight);
|
||||
data << uint32(itr->second.LightFadeInTime);
|
||||
player->SendDirectMessage(&data);
|
||||
}
|
||||
}
|
||||
|
||||
void Map::SetZoneMusic(uint32 zoneId, uint32 musicId)
|
||||
{
|
||||
if (_zoneDynamicInfo.find(zoneId) == _zoneDynamicInfo.end())
|
||||
_zoneDynamicInfo.insert(ZoneDynamicInfoMap::value_type(zoneId, ZoneDynamicInfo()));
|
||||
|
||||
_zoneDynamicInfo[zoneId].MusicId = musicId;
|
||||
|
||||
Map::PlayerList const& players = GetPlayers();
|
||||
if (!players.isEmpty())
|
||||
{
|
||||
WorldPacket data(SMSG_PLAY_MUSIC, 4);
|
||||
data << uint32(musicId);
|
||||
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
if (Player* player = itr->GetSource())
|
||||
if (player->GetZoneId() == zoneId)
|
||||
player->SendDirectMessage(&data);
|
||||
}
|
||||
}
|
||||
|
||||
void Map::SetZoneWeather(uint32 zoneId, uint32 weatherId, float weatherGrade)
|
||||
{
|
||||
if (_zoneDynamicInfo.find(zoneId) == _zoneDynamicInfo.end())
|
||||
_zoneDynamicInfo.insert(ZoneDynamicInfoMap::value_type(zoneId, ZoneDynamicInfo()));
|
||||
|
||||
ZoneDynamicInfo& info = _zoneDynamicInfo[zoneId];
|
||||
info.WeatherId = weatherId;
|
||||
info.WeatherGrade = weatherGrade;
|
||||
Map::PlayerList const& players = GetPlayers();
|
||||
|
||||
if (!players.isEmpty())
|
||||
{
|
||||
WorldPacket data(SMSG_WEATHER, 4 + 4 + 1);
|
||||
data << uint32(weatherId);
|
||||
data << float(weatherGrade);
|
||||
data << uint8(0);
|
||||
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
if (Player* player = itr->GetSource())
|
||||
if (player->GetZoneId() == zoneId)
|
||||
player->SendDirectMessage(&data);
|
||||
}
|
||||
}
|
||||
|
||||
void Map::SetZoneOverrideLight(uint32 zoneId, uint32 lightId, uint32 fadeInTime)
|
||||
{
|
||||
if (_zoneDynamicInfo.find(zoneId) == _zoneDynamicInfo.end())
|
||||
_zoneDynamicInfo.insert(ZoneDynamicInfoMap::value_type(zoneId, ZoneDynamicInfo()));
|
||||
|
||||
ZoneDynamicInfo& info = _zoneDynamicInfo[zoneId];
|
||||
info.OverrideLightId = lightId;
|
||||
info.LightFadeInTime = fadeInTime;
|
||||
Map::PlayerList const& players = GetPlayers();
|
||||
|
||||
if (!players.isEmpty())
|
||||
{
|
||||
WorldPacket data(SMSG_OVERRIDE_LIGHT, 4 + 4 + 1);
|
||||
data << uint32(_defaultLight);
|
||||
data << uint32(lightId);
|
||||
data << uint32(fadeInTime);
|
||||
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
if (Player* player = itr->GetSource())
|
||||
if (player->GetZoneId() == zoneId)
|
||||
player->SendDirectMessage(&data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -229,6 +229,18 @@ enum LevelRequirementVsMode
|
||||
LEVELREQUIREMENT_HEROIC = 70
|
||||
};
|
||||
|
||||
struct ZoneDynamicInfo
|
||||
{
|
||||
ZoneDynamicInfo() : MusicId(0), WeatherId(0), WeatherGrade(0.0f),
|
||||
OverrideLightId(0), LightFadeInTime(0) { }
|
||||
|
||||
uint32 MusicId;
|
||||
uint32 WeatherId;
|
||||
float WeatherGrade;
|
||||
uint32 OverrideLightId;
|
||||
uint32 LightFadeInTime;
|
||||
};
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#pragma pack()
|
||||
#else
|
||||
@@ -243,6 +255,8 @@ enum LevelRequirementVsMode
|
||||
|
||||
typedef std::map<uint32/*leaderDBGUID*/, CreatureGroup*> CreatureGroupHolderType;
|
||||
|
||||
typedef UNORDERED_MAP<uint32 /*zoneId*/, ZoneDynamicInfo> ZoneDynamicInfoMap;
|
||||
|
||||
class Map : public GridRefManager<NGridType>
|
||||
{
|
||||
friend class MapReference;
|
||||
@@ -490,6 +504,11 @@ class Map : public GridRefManager<NGridType>
|
||||
|
||||
void SendInitTransports(Player* player);
|
||||
void SendRemoveTransports(Player* player);
|
||||
void SendZoneDynamicInfo(Player* player);
|
||||
|
||||
void SetZoneMusic(uint32 zoneId, uint32 musicId);
|
||||
void SetZoneWeather(uint32 zoneId, uint32 weatherId, float weatherGrade);
|
||||
void SetZoneOverrideLight(uint32 zoneId, uint32 lightId, uint32 fadeInTime);
|
||||
|
||||
private:
|
||||
void LoadMapAndVMap(int gx, int gy);
|
||||
@@ -634,6 +653,9 @@ class Map : public GridRefManager<NGridType>
|
||||
|
||||
UNORDERED_MAP<uint32 /*dbGUID*/, time_t> _creatureRespawnTimes;
|
||||
UNORDERED_MAP<uint32 /*dbGUID*/, time_t> _goRespawnTimes;
|
||||
|
||||
ZoneDynamicInfoMap _zoneDynamicInfo;
|
||||
uint32 _defaultLight;
|
||||
};
|
||||
|
||||
enum InstanceResetMethod
|
||||
|
||||
@@ -560,7 +560,7 @@ class boss_the_lich_king : public CreatureScript
|
||||
me->VisitNearbyGridObject(333.0f, worker);
|
||||
|
||||
// Reset any light override
|
||||
SendLightOverride(0, 5000);
|
||||
me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, 0, 5000);
|
||||
}
|
||||
|
||||
bool CanAIAttack(Unit const* target) const OVERRIDE
|
||||
@@ -593,7 +593,7 @@ class boss_the_lich_king : public CreatureScript
|
||||
case ACTION_START_ENCOUNTER:
|
||||
instance->SetBossState(DATA_THE_LICH_KING, IN_PROGRESS);
|
||||
Talk(SAY_LK_INTRO_1);
|
||||
SendMusicToPlayers(MUSIC_FROZEN_THRONE);
|
||||
me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FROZEN_THRONE);
|
||||
// schedule talks
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
events.ScheduleEvent(EVENT_INTRO_MOVE_1, 4000);
|
||||
@@ -602,10 +602,10 @@ class boss_the_lich_king : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_START_ATTACK, 5000);
|
||||
break;
|
||||
case ACTION_PLAY_MUSIC:
|
||||
SendMusicToPlayers(MUSIC_FINAL);
|
||||
me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FINAL);
|
||||
break;
|
||||
case ACTION_RESTORE_LIGHT:
|
||||
SendLightOverride(0, 5000);
|
||||
me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, 0, 5000);
|
||||
break;
|
||||
case ACTION_BREAK_FROSTMOURNE:
|
||||
me->CastSpell((Unit*)NULL, SPELL_SUMMON_BROKEN_FROSTMOURNE, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
|
||||
@@ -687,7 +687,7 @@ class boss_the_lich_king : public CreatureScript
|
||||
events.Reset();
|
||||
events.SetPhase(PHASE_OUTRO);
|
||||
summons.DespawnAll();
|
||||
SendMusicToPlayers(MUSIC_FURY_OF_FROSTMOURNE);
|
||||
me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FURY_OF_FROSTMOURNE);
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
me->CastSpell((Unit*)NULL, SPELL_FURY_OF_FROSTMOURNE, TRIGGERED_NONE);
|
||||
me->SetWalk(true);
|
||||
@@ -739,8 +739,8 @@ class boss_the_lich_king : public CreatureScript
|
||||
{
|
||||
summon->CastSpell((Unit*)NULL, SPELL_BROKEN_FROSTMOURNE, true);
|
||||
|
||||
SendLightOverride(LIGHT_SOULSTORM, 10000);
|
||||
SendWeather(WEATHER_STATE_BLACKSNOW);
|
||||
me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, LIGHT_SOULSTORM, 10000);
|
||||
me->GetMap()->SetZoneWeather(AREA_THE_FROZEN_THRONE, WEATHER_STATE_BLACKSNOW, 0.5f);
|
||||
|
||||
events.ScheduleEvent(EVENT_OUTRO_SOUL_BARRAGE, 5000, 0, PHASE_OUTRO);
|
||||
return;
|
||||
@@ -792,8 +792,8 @@ class boss_the_lich_king : public CreatureScript
|
||||
{
|
||||
if (spell->Id == REMORSELESS_WINTER_1 || spell->Id == REMORSELESS_WINTER_2)
|
||||
{
|
||||
SendLightOverride(LIGHT_SNOWSTORM, 5000);
|
||||
SendWeather(WEATHER_STATE_LIGHT_SNOW);
|
||||
me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, LIGHT_SNOWSTORM, 5000);
|
||||
me->GetMap()->SetZoneWeather(AREA_THE_FROZEN_THRONE, WEATHER_STATE_LIGHT_SNOW, 0.5f);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -819,7 +819,7 @@ class boss_the_lich_king : public CreatureScript
|
||||
case POINT_CENTER_1:
|
||||
me->SetFacingTo(0.0f);
|
||||
Talk(SAY_LK_REMORSELESS_WINTER);
|
||||
SendMusicToPlayers(MUSIC_SPECIAL);
|
||||
me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
|
||||
DoCast(me, SPELL_REMORSELESS_WINTER_1);
|
||||
events.DelayEvents(62500, EVENT_GROUP_BERSERK); // delay berserk timer, its not ticking during phase transitions
|
||||
events.ScheduleEvent(EVENT_QUAKE, 62500, 0, PHASE_TRANSITION);
|
||||
@@ -834,7 +834,7 @@ class boss_the_lich_king : public CreatureScript
|
||||
case POINT_CENTER_2:
|
||||
me->SetFacingTo(0.0f);
|
||||
Talk(SAY_LK_REMORSELESS_WINTER);
|
||||
SendMusicToPlayers(MUSIC_SPECIAL);
|
||||
me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
|
||||
DoCast(me, SPELL_REMORSELESS_WINTER_2);
|
||||
summons.DespawnEntry(NPC_VALKYR_SHADOWGUARD);
|
||||
events.DelayEvents(62500, EVENT_GROUP_BERSERK); // delay berserk timer, its not ticking during phase transitions
|
||||
@@ -920,7 +920,7 @@ class boss_the_lich_king : public CreatureScript
|
||||
break;
|
||||
case EVENT_SUMMON_SHAMBLING_HORROR:
|
||||
DoCast(me, SPELL_SUMMON_SHAMBLING_HORROR);
|
||||
SendMusicToPlayers(MUSIC_SPECIAL);
|
||||
me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SHAMBLING_HORROR, 60000, 0, PHASE_ONE);
|
||||
break;
|
||||
case EVENT_SUMMON_DRUDGE_GHOUL:
|
||||
@@ -980,18 +980,18 @@ class boss_the_lich_king : public CreatureScript
|
||||
events.SetPhase(PHASE_TWO);
|
||||
me->ClearUnitState(UNIT_STATE_CASTING); // clear state to ensure check in DoCastAOE passes
|
||||
DoCastAOE(SPELL_QUAKE);
|
||||
SendMusicToPlayers(MUSIC_SPECIAL);
|
||||
me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
|
||||
Talk(SAY_LK_QUAKE);
|
||||
break;
|
||||
case EVENT_QUAKE_2:
|
||||
events.SetPhase(PHASE_THREE);
|
||||
me->ClearUnitState(UNIT_STATE_CASTING); // clear state to ensure check in DoCastAOE passes
|
||||
DoCastAOE(SPELL_QUAKE);
|
||||
SendMusicToPlayers(MUSIC_SPECIAL);
|
||||
me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
|
||||
Talk(SAY_LK_QUAKE);
|
||||
break;
|
||||
case EVENT_SUMMON_VALKYR:
|
||||
SendMusicToPlayers(MUSIC_SPECIAL);
|
||||
me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
|
||||
Talk(SAY_LK_SUMMON_VALKYR);
|
||||
DoCastAOE(SUMMON_VALKYR);
|
||||
events.ScheduleEvent(EVENT_SUMMON_VALKYR, urand(45000, 50000), 0, PHASE_TWO);
|
||||
@@ -1002,7 +1002,7 @@ class boss_the_lich_king : public CreatureScript
|
||||
events.SetPhase(PHASE_THREE);
|
||||
break;
|
||||
case EVENT_VILE_SPIRITS:
|
||||
SendMusicToPlayers(MUSIC_SPECIAL);
|
||||
me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
|
||||
DoCastAOE(SPELL_VILE_SPIRITS);
|
||||
events.ScheduleEvent(EVENT_VILE_SPIRITS, urand(35000, 40000), EVENT_GROUP_VILE_SPIRITS, PHASE_THREE);
|
||||
break;
|
||||
@@ -1073,7 +1073,7 @@ class boss_the_lich_king : public CreatureScript
|
||||
case EVENT_OUTRO_RAISE_DEAD:
|
||||
DoCastAOE(SPELL_RAISE_DEAD);
|
||||
me->ClearUnitState(UNIT_STATE_CASTING);
|
||||
SendMusicToPlayers(MUSIC_FINAL);
|
||||
me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FINAL);
|
||||
break;
|
||||
case EVENT_OUTRO_TALK_5:
|
||||
Talk(SAY_LK_OUTRO_5);
|
||||
@@ -1114,42 +1114,6 @@ class boss_the_lich_king : public CreatureScript
|
||||
}
|
||||
|
||||
private:
|
||||
void SendMusicToPlayers(uint32 musicId) const
|
||||
{
|
||||
WorldPacket data(SMSG_PLAY_MUSIC, 4);
|
||||
data << uint32(musicId);
|
||||
SendPacketToPlayers(&data);
|
||||
}
|
||||
|
||||
void SendLightOverride(uint32 overrideId, uint32 fadeInTime) const
|
||||
{
|
||||
WorldPacket data(SMSG_OVERRIDE_LIGHT, 12);
|
||||
data << uint32(2488); // Light.dbc entry (map default)
|
||||
data << uint32(overrideId); // Light.dbc entry (override)
|
||||
data << uint32(fadeInTime);
|
||||
SendPacketToPlayers(&data);
|
||||
}
|
||||
|
||||
void SendWeather(WeatherState weather) const
|
||||
{
|
||||
WorldPacket data(SMSG_WEATHER, 9);
|
||||
data << uint32(weather);
|
||||
data << float(0.5f);
|
||||
data << uint8(0);
|
||||
SendPacketToPlayers(&data);
|
||||
}
|
||||
|
||||
// Send packet to all players in The Frozen Throne
|
||||
void SendPacketToPlayers(WorldPacket const* data) const
|
||||
{
|
||||
Map::PlayerList const& players = me->GetMap()->GetPlayers();
|
||||
if (!players.isEmpty())
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
if (Player* player = itr->GetSource())
|
||||
if (player->GetAreaId() == AREA_THE_FROZEN_THRONE)
|
||||
player->GetSession()->SendPacket(data);
|
||||
}
|
||||
|
||||
uint32 _necroticPlagueStack;
|
||||
uint32 _vileSpiritExplosions;
|
||||
};
|
||||
|
||||
@@ -68,7 +68,7 @@ enum TeleporterSpells
|
||||
DEATHBRINGER_S_RISE_TELEPORT = 70858,
|
||||
UPPER_SPIRE_TELEPORT = 70859,
|
||||
FROZEN_THRONE_TELEPORT = 70860,
|
||||
SINDRAGOSA_S_LAIR_TELEPORT = 70861,
|
||||
SINDRAGOSA_S_LAIR_TELEPORT = 70861
|
||||
};
|
||||
|
||||
enum DataTypes
|
||||
@@ -285,7 +285,7 @@ enum CreaturesIds
|
||||
NPC_FROSTMOURNE_TRIGGER = 38584,
|
||||
|
||||
// Generic
|
||||
NPC_INVISIBLE_STALKER = 30298,
|
||||
NPC_INVISIBLE_STALKER = 30298
|
||||
};
|
||||
|
||||
enum GameObjectsIds
|
||||
@@ -368,7 +368,7 @@ enum GameObjectsIds
|
||||
GO_DOODAD_ICECROWN_SNOWEDGEWARNING01 = 202190,
|
||||
GO_FROZEN_LAVAMAN = 202436,
|
||||
GO_LAVAMAN_PILLARS_CHAINED = 202437,
|
||||
GO_LAVAMAN_PILLARS_UNCHAINED = 202438,
|
||||
GO_LAVAMAN_PILLARS_UNCHAINED = 202438
|
||||
};
|
||||
|
||||
enum AchievementCriteriaIds
|
||||
@@ -403,7 +403,7 @@ enum AchievementCriteriaIds
|
||||
CRITERIA_ONCE_BITTEN_TWICE_SHY_10N = 12780,
|
||||
CRITERIA_ONCE_BITTEN_TWICE_SHY_25N = 13012,
|
||||
CRITERIA_ONCE_BITTEN_TWICE_SHY_10V = 13011,
|
||||
CRITERIA_ONCE_BITTEN_TWICE_SHY_25V = 13013,
|
||||
CRITERIA_ONCE_BITTEN_TWICE_SHY_25V = 13013
|
||||
};
|
||||
|
||||
enum SharedActions
|
||||
@@ -431,7 +431,7 @@ enum SharedActions
|
||||
|
||||
// The Lich King
|
||||
ACTION_RESTORE_LIGHT = -72262,
|
||||
ACTION_FROSTMOURNE_INTRO = -36823,
|
||||
ACTION_FROSTMOURNE_INTRO = -36823
|
||||
};
|
||||
|
||||
enum WeekliesICC
|
||||
@@ -445,7 +445,7 @@ enum WeekliesICC
|
||||
QUEST_BLOOD_QUICKENING_10 = 24874,
|
||||
QUEST_BLOOD_QUICKENING_25 = 24879,
|
||||
QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_10 = 24872,
|
||||
QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_25 = 24880,
|
||||
QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_25 = 24880
|
||||
};
|
||||
|
||||
enum WorldStatesICC
|
||||
@@ -454,12 +454,12 @@ enum WorldStatesICC
|
||||
WORLDSTATE_EXECUTION_TIME = 4904,
|
||||
WORLDSTATE_SHOW_ATTEMPTS = 4940,
|
||||
WORLDSTATE_ATTEMPTS_REMAINING = 4941,
|
||||
WORLDSTATE_ATTEMPTS_MAX = 4942,
|
||||
WORLDSTATE_ATTEMPTS_MAX = 4942
|
||||
};
|
||||
|
||||
enum AreaIds
|
||||
{
|
||||
AREA_THE_FROZEN_THRONE = 4859,
|
||||
AREA_THE_FROZEN_THRONE = 4859
|
||||
};
|
||||
|
||||
class spell_trigger_spell_from_caster : public SpellScriptLoader
|
||||
|
||||
@@ -31,7 +31,7 @@ enum EventIds
|
||||
{
|
||||
EVENT_QUAKE = 23437,
|
||||
EVENT_SECOND_REMORSELESS_WINTER = 23507,
|
||||
EVENT_TELEPORT_TO_FROSMOURNE = 23617,
|
||||
EVENT_TELEPORT_TO_FROSTMOURNE = 23617
|
||||
};
|
||||
|
||||
enum TimedEvents
|
||||
@@ -68,7 +68,7 @@ DoorData const doorData[] =
|
||||
{GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
|
||||
{GO_ICE_WALL, DATA_SINDRAGOSA, DOOR_TYPE_ROOM, BOUNDARY_SE },
|
||||
{GO_ICE_WALL, DATA_SINDRAGOSA, DOOR_TYPE_ROOM, BOUNDARY_SW },
|
||||
{0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE}, // END
|
||||
{0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE} // END
|
||||
};
|
||||
|
||||
// this doesnt have to only store questgivers, also can be used for related quest spawns
|
||||
@@ -89,7 +89,7 @@ WeeklyQuest const WeeklyQuestData[WeeklyNPCs] =
|
||||
{NPC_ALRIN_THE_AGILE, {QUEST_BLOOD_QUICKENING_10, QUEST_BLOOD_QUICKENING_25 }}, // Blood Quickening
|
||||
{NPC_INFILTRATOR_MINCHAR_BQ, {QUEST_BLOOD_QUICKENING_10, QUEST_BLOOD_QUICKENING_25 }}, // Blood Quickening
|
||||
{NPC_MINCHAR_BEAM_STALKER, {QUEST_BLOOD_QUICKENING_10, QUEST_BLOOD_QUICKENING_25 }}, // Blood Quickening
|
||||
{NPC_VALITHRIA_DREAMWALKER_QUEST, {QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_10, QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_25}}, // Respite for a Tormented Soul
|
||||
{NPC_VALITHRIA_DREAMWALKER_QUEST, {QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_10, QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_25}} // Respite for a Tormented Soul
|
||||
};
|
||||
|
||||
class instance_icecrown_citadel : public InstanceMapScript
|
||||
@@ -335,7 +335,7 @@ class instance_icecrown_citadel : public InstanceMapScript
|
||||
{
|
||||
uint8 diffIndex = uint8(instance->GetSpawnMode() & 1);
|
||||
if (!sPoolMgr->IsSpawnedObject<Quest>(WeeklyQuestData[questIndex].questId[diffIndex]))
|
||||
entry = 0;
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1235,7 +1235,7 @@ class instance_icecrown_citadel : public InstanceMapScript
|
||||
Events.ScheduleEvent(EVENT_REBUILD_PLATFORM, 1500);
|
||||
}
|
||||
break;
|
||||
case EVENT_TELEPORT_TO_FROSMOURNE: // Harvest Soul (normal mode)
|
||||
case EVENT_TELEPORT_TO_FROSTMOURNE: // Harvest Soul (normal mode)
|
||||
if (Creature* terenas = instance->SummonCreature(NPC_TERENAS_MENETHIL_FROSTMOURNE, TerenasSpawn, NULL, 63000))
|
||||
{
|
||||
terenas->AI()->DoAction(ACTION_FROSTMOURNE_INTRO);
|
||||
|
||||
@@ -584,7 +584,7 @@ public:
|
||||
{
|
||||
instance->SetBossState(DATA_MALYGOS_EVENT, FAIL);
|
||||
|
||||
SendLightOverride(LIGHT_GET_DEFAULT_FOR_MAP, 1*IN_MILLISECONDS);
|
||||
me->GetMap()->SetZoneOverrideLight(AREA_EYE_OF_ETERNITY, LIGHT_GET_DEFAULT_FOR_MAP, 1*IN_MILLISECONDS);
|
||||
|
||||
if (_phase == PHASE_THREE)
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
@@ -725,8 +725,8 @@ public:
|
||||
me->SetDisableGravity(true);
|
||||
if (Creature* alexstraszaBunny = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID)))
|
||||
me->SetFacingToObject(alexstraszaBunny);
|
||||
SendLightOverride(LIGHT_ARCANE_RUNES, 5*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_FLY_OUT_OF_PLATFORM, 18*IN_MILLISECONDS, 0, PHASE_TWO);
|
||||
me->GetMap()->SetZoneOverrideLight(AREA_EYE_OF_ETERNITY, LIGHT_ARCANE_RUNES, 5 * IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_FLY_OUT_OF_PLATFORM, 18 * IN_MILLISECONDS, 0, PHASE_TWO);
|
||||
break;
|
||||
case POINT_SURGE_OF_POWER_P_TWO:
|
||||
if (!_performingDestroyPlatform)
|
||||
@@ -737,7 +737,7 @@ public:
|
||||
}
|
||||
break;
|
||||
case POINT_DESTROY_PLATFORM_P_TWO:
|
||||
SendLightOverride(LIGHT_OBSCURE_SPACE, 1*IN_MILLISECONDS);
|
||||
me->GetMap()->SetZoneOverrideLight(AREA_EYE_OF_ETERNITY, LIGHT_OBSCURE_SPACE, 1 * IN_MILLISECONDS);
|
||||
DoCast(me, SPELL_DESTROY_PLATFORM_CHANNEL);
|
||||
events.ScheduleEvent(EVENT_MOVE_TO_P_THREE_POINT, 11*IN_MILLISECONDS, 0, PHASE_TWO);
|
||||
break;
|
||||
@@ -929,7 +929,7 @@ public:
|
||||
}
|
||||
break;
|
||||
case EVENT_LIGHT_DIMENSION_CHANGE:
|
||||
SendLightOverride(LIGHT_CHANGE_DIMENSIONS, 2*IN_MILLISECONDS);
|
||||
me->GetMap()->SetZoneOverrideLight(AREA_EYE_OF_ETERNITY, LIGHT_CHANGE_DIMENSIONS, 2 * IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_DELAY_MOVE_TO_DESTROY_P:
|
||||
me->GetMotionMaster()->MovePoint(POINT_DESTROY_PLATFORM_P_TWO, MalygosPositions[0]);
|
||||
@@ -939,7 +939,7 @@ public:
|
||||
me->GetMotionMaster()->MovePoint(POINT_IDLE_P_THREE, MalygosPositions[4]);
|
||||
break;
|
||||
case EVENT_START_P_THREE:
|
||||
SendLightOverride(LIGHT_OBSCURE_ARCANE_RUNES, 1*IN_MILLISECONDS);
|
||||
me->GetMap()->SetZoneOverrideLight(AREA_EYE_OF_ETERNITY, LIGHT_OBSCURE_ARCANE_RUNES, 1 * IN_MILLISECONDS);
|
||||
DoCast(me, SPELL_CLEAR_ALL_DEBUFFS);
|
||||
DoCast(me, SPELL_IMMUNE_CURSES);
|
||||
_canAttack = true;
|
||||
@@ -1026,27 +1026,6 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
// Function that will change lights of map for all players on map.
|
||||
void SendLightOverride(uint32 overrideId, uint32 fadeInTime) const
|
||||
{
|
||||
WorldPacket data(SMSG_OVERRIDE_LIGHT, 12);
|
||||
data << uint32(1773); // Light.dbc entry (map default)
|
||||
data << uint32(overrideId); // Light.dbc entry (override)
|
||||
data << uint32(fadeInTime);
|
||||
SendPacketToPlayers(&data);
|
||||
}
|
||||
|
||||
// Send packet to all players in Eye of Eternity
|
||||
void SendPacketToPlayers(WorldPacket const* data) const
|
||||
{
|
||||
Map::PlayerList const& players = me->GetMap()->GetPlayers();
|
||||
if (!players.isEmpty())
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
if (Player* player = itr->GetSource())
|
||||
if (player->GetAreaId() == AREA_EYE_OF_ETERNITY)
|
||||
player->GetSession()->SendPacket(data);
|
||||
}
|
||||
|
||||
uint8 _phase; // Counter for phases used with a getter.
|
||||
uint8 _summonDeaths; // Keeps count of arcane trash.
|
||||
uint8 _preparingPulsesChecker; // In retail they use 2 preparing pulses with 7 sec CD, after they pass 2 seconds.
|
||||
|
||||
Reference in New Issue
Block a user