diff options
| author | Shauren <shauren.trinity@gmail.com> | 2020-03-06 17:44:10 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-12-22 21:51:33 +0100 |
| commit | e8d1f37ee098db01872d8861a0b48d5d4cb9d172 (patch) | |
| tree | 307ce49ff7ea5f67bd8aaacf426e51be2fd4a60d /src/server/game | |
| parent | bab4e668b8bcc00d18f4d1c5132afc9719c4cb1d (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.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 1 | ||||
| -rw-r--r-- | src/server/game/Maps/Map.cpp | 32 | ||||
| -rw-r--r-- | src/server/game/Maps/Map.h | 12 |
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() |
