aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-03-06 17:44:10 +0100
committerShauren <shauren.trinity@gmail.com>2021-12-22 21:51:33 +0100
commite8d1f37ee098db01872d8861a0b48d5d4cb9d172 (patch)
tree307ce49ff7ea5f67bd8aaacf426e51be2fd4a60d /src/server/game
parentbab4e668b8bcc00d18f4d1c5132afc9719c4cb1d (diff)
Core/Maps: Citizens of Dalaran! Raise your eyes to the skies and observe! Any non-map-default light can now be overriden!
Closes #24250 (cherry picked from commit e10313b380c84dafde462bdb116827f2b8be1851)
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp6
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp6
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h1
-rw-r--r--src/server/game/Maps/Map.cpp32
-rw-r--r--src/server/game/Maps/Map.h12
5 files changed, 40 insertions, 17 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 972886427dc..7fba67cacb3 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -2433,9 +2433,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
if (WorldObject* obj = GetBaseObject())
{
- obj->GetMap()->SetZoneOverrideLight(e.action.overrideLight.zoneId, e.action.overrideLight.overrideLightId, e.action.overrideLight.transitionMilliseconds);
- TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_OVERRIDE_LIGHT: %s sets zone override light (zoneId: %u, overrideLightId: %u, transitionMilliseconds: %u)",
- obj->GetGUID().ToString().c_str(), e.action.overrideLight.zoneId, e.action.overrideLight.overrideLightId, e.action.overrideLight.transitionMilliseconds);
+ obj->GetMap()->SetZoneOverrideLight(e.action.overrideLight.zoneId, e.action.overrideLight.areaLightId, e.action.overrideLight.overrideLightId, e.action.overrideLight.transitionMilliseconds);
+ TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_OVERRIDE_LIGHT: %s sets zone override light (zoneId: %u, areaLightId: %u, overrideLightId: %u, transitionMilliseconds: %u)",
+ obj->GetGUID().ToString().c_str(), e.action.overrideLight.zoneId, e.action.overrideLight.areaLightId, e.action.overrideLight.overrideLightId, e.action.overrideLight.transitionMilliseconds);
}
break;
}
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index d8a0258b05b..16af7d46ab9 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -1715,6 +1715,12 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
return false;
}
+ if (!sLightStore.LookupEntry(e.action.overrideLight.areaLightId))
+ {
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u uses non-existent areaLightId %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.overrideLight.areaLightId);
+ return false;
+ }
+
if (e.action.overrideLight.overrideLightId && !sLightStore.LookupEntry(e.action.overrideLight.overrideLightId))
{
TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u uses non-existent overrideLightId %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.overrideLight.overrideLightId);
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 67135e7491a..ce15f52c04c 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -1212,6 +1212,7 @@ struct SmartAction
struct
{
uint32 zoneId;
+ uint32 areaLightId;
uint32 overrideLightId;
uint32 transitionMilliseconds;
} overrideLight;
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 4e25c7ba4a4..913c67997fd 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -66,7 +66,7 @@ GridState* si_GridStates[MAX_GRID_STATE];
ZoneDynamicInfo::ZoneDynamicInfo() : MusicId(0), DefaultWeather(nullptr), WeatherId(WEATHER_STATE_FINE),
- Intensity(0.0f), OverrideLightId(0), TransitionMilliseconds(0) { }
+ Intensity(0.0f) { }
Map::~Map()
{
@@ -328,7 +328,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), _respawnCheckTimer(0), _defaultLight(DB2Manager::GetDefaultMapLight(id))
+i_scriptLock(false), _respawnCheckTimer(0)
{
if (_parent)
{
@@ -4859,12 +4859,12 @@ void Map::SendZoneDynamicInfo(uint32 zoneId, Player* player) const
SendZoneWeather(itr->second, player);
- if (uint32 overrideLightId = itr->second.OverrideLightId)
+ for (ZoneDynamicInfo::LightOverride const& lightOverride : itr->second.LightOverrides)
{
WorldPackets::Misc::OverrideLight overrideLight;
- overrideLight.AreaLightID = _defaultLight;
- overrideLight.OverrideLightID = overrideLightId;
- overrideLight.TransitionMilliseconds = itr->second.TransitionMilliseconds;
+ overrideLight.AreaLightID = lightOverride.AreaLightId;
+ overrideLight.OverrideLightID = lightOverride.OverrideLightId;
+ overrideLight.TransitionMilliseconds = lightOverride.TransitionMilliseconds;
player->SendDirectMessage(overrideLight.Write());
}
}
@@ -4964,17 +4964,29 @@ void Map::SetZoneWeather(uint32 zoneId, WeatherState weatherId, float intensity)
}
}
-void Map::SetZoneOverrideLight(uint32 zoneId, uint32 overrideLightId, uint32 transitionMilliseconds)
+void Map::SetZoneOverrideLight(uint32 zoneId, uint32 areaLightId, uint32 overrideLightId, uint32 transitionMilliseconds)
{
ZoneDynamicInfo& info = _zoneDynamicInfo[zoneId];
- info.OverrideLightId = overrideLightId;
- info.TransitionMilliseconds = transitionMilliseconds;
+ // client can support only one override for each light (zone independent)
+ info.LightOverrides.erase(std::remove_if(info.LightOverrides.begin(), info.LightOverrides.end(), [areaLightId](ZoneDynamicInfo::LightOverride const& lightOverride)
+ {
+ return lightOverride.AreaLightId == areaLightId;
+ }), info.LightOverrides.end());
+
+ // set new override (if any)
+ if (overrideLightId)
+ {
+ ZoneDynamicInfo::LightOverride& lightOverride = info.LightOverrides.emplace_back();
+ lightOverride.AreaLightId = areaLightId;
+ lightOverride.OverrideLightId = overrideLightId;
+ lightOverride.TransitionMilliseconds = transitionMilliseconds;
+ }
Map::PlayerList const& players = GetPlayers();
if (!players.isEmpty())
{
WorldPackets::Misc::OverrideLight overrideLight;
- overrideLight.AreaLightID = _defaultLight;
+ overrideLight.AreaLightID = areaLightId;
overrideLight.OverrideLightID = overrideLightId;
overrideLight.TransitionMilliseconds = transitionMilliseconds;
overrideLight.Write();
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index f418c10ffa2..e8a1a4d8a00 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -205,8 +205,13 @@ struct ZoneDynamicInfo
WeatherState WeatherId;
float Intensity;
- uint32 OverrideLightId;
- uint32 TransitionMilliseconds;
+ struct LightOverride
+ {
+ uint32 AreaLightId;
+ uint32 OverrideLightId;
+ uint32 TransitionMilliseconds;
+ };
+ std::vector<LightOverride> LightOverrides;
};
#pragma pack(pop)
@@ -573,7 +578,7 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
Weather* GetOrGenerateZoneDefaultWeather(uint32 zoneId);
WeatherState GetZoneWeather(uint32 zoneId) const;
void SetZoneWeather(uint32 zoneId, WeatherState weatherId, float intensity);
- void SetZoneOverrideLight(uint32 zoneId, uint32 overrideLightId, uint32 transitionMilliseconds);
+ void SetZoneOverrideLight(uint32 zoneId, uint32 areaLightId, uint32 overrideLightId, uint32 transitionMilliseconds);
void UpdateAreaDependentAuras();
@@ -853,7 +858,6 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
ZoneDynamicInfoMap _zoneDynamicInfo;
IntervalTimer _weatherUpdateTimer;
- uint32 _defaultLight;
template<HighGuid high>
inline ObjectGuidGeneratorBase& GetGuidSequenceGenerator()