diff --git a/Source/Game/AI/SmartScripts/SmartAIManager.cs b/Source/Game/AI/SmartScripts/SmartAIManager.cs index 9386e0649..e28a0f255 100644 --- a/Source/Game/AI/SmartScripts/SmartAIManager.cs +++ b/Source/Game/AI/SmartScripts/SmartAIManager.cs @@ -1465,6 +1465,12 @@ namespace Game.AI return false; } + if (!CliDB.LightStorage.ContainsKey(e.Action.overrideLight.areaLightId)) + { + Log.outError(LogFilter.Sql, $"SmartAIMgr: {e} uses non-existent areaLightId {e.Action.overrideLight.areaLightId}, skipped."); + return false; + } + if (e.Action.overrideLight.overrideLightId != 0 && !CliDB.LightStorage.ContainsKey(e.Action.overrideLight.overrideLightId)) { Log.outError(LogFilter.Sql, $"SmartAIMgr: {e} uses non-existent overrideLightId {e.Action.overrideLight.overrideLightId}, skipped."); @@ -3140,6 +3146,7 @@ namespace Game.AI public struct OverrideLight { public uint zoneId; + public uint areaLightId; public uint overrideLightId; public uint transitionMilliseconds; } diff --git a/Source/Game/AI/SmartScripts/SmartScript.cs b/Source/Game/AI/SmartScripts/SmartScript.cs index c178443b7..45b6eb8d3 100644 --- a/Source/Game/AI/SmartScripts/SmartScript.cs +++ b/Source/Game/AI/SmartScripts/SmartScript.cs @@ -2419,9 +2419,9 @@ namespace Game.AI WorldObject obj = GetBaseObject(); if (obj != null) { - obj.GetMap().SetZoneOverrideLight(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); Log.outDebug(LogFilter.ScriptsAi, $"SmartScript::ProcessAction: SMART_ACTION_OVERRIDE_LIGHT: {obj.GetGUID()} sets zone override light (zoneId: {e.Action.overrideLight.zoneId}, " + - $"overrideLightId: {e.Action.overrideLight.overrideLightId}, transitionMilliseconds: {e.Action.overrideLight.transitionMilliseconds})"); + $"areaLightId: {e.Action.overrideLight.areaLightId}, overrideLightId: {e.Action.overrideLight.overrideLightId}, transitionMilliseconds: {e.Action.overrideLight.transitionMilliseconds})"); } break; } diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index d2ddb3dd4..606c64e2e 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -45,7 +45,6 @@ namespace Game.Maps m_VisibleDistance = SharedConst.DefaultVisibilityDistance; m_VisibilityNotifyPeriod = SharedConst.DefaultVisibilityNotifyPeriod; i_gridExpiry = expiry; - _defaultLight = Global.DB2Mgr.GetDefaultMapLight(id); if (parent) { @@ -3402,13 +3401,12 @@ namespace Game.Maps SendZoneWeather(zoneInfo, player); - uint overrideLightId = zoneInfo.OverrideLightId; - if (overrideLightId != 0) + foreach (var lightOverride in zoneInfo.LightOverrides) { OverrideLight overrideLight = new(); - overrideLight.AreaLightID = _defaultLight; - overrideLight.OverrideLightID = overrideLightId; - overrideLight.TransitionMilliseconds = zoneInfo.TransitionMilliseconds; + overrideLight.AreaLightID = lightOverride.AreaLightId; + overrideLight.OverrideLightID = lightOverride.OverrideLightId; + overrideLight.TransitionMilliseconds = lightOverride.TransitionMilliseconds; player.SendPacket(overrideLight); } } @@ -3516,20 +3514,31 @@ namespace Game.Maps } } - public void SetZoneOverrideLight(uint zoneId, uint overrideLightId, uint transitionMilliseconds) + public void SetZoneOverrideLight(uint zoneId, uint areaLightId, uint overrideLightId, uint transitionMilliseconds) { if (!_zoneDynamicInfo.ContainsKey(zoneId)) _zoneDynamicInfo[zoneId] = new ZoneDynamicInfo(); ZoneDynamicInfo info = _zoneDynamicInfo[zoneId]; - info.OverrideLightId = overrideLightId; - info.TransitionMilliseconds = transitionMilliseconds; + // client can support only one override for each light (zone independent) + info.LightOverrides.RemoveAll(lightOverride => lightOverride.AreaLightId == areaLightId); + + // set new override (if any) + if (overrideLightId != 0) + { + ZoneDynamicInfo.LightOverride lightOverride = new(); + lightOverride.AreaLightId = areaLightId; + lightOverride.OverrideLightId = overrideLightId; + lightOverride.TransitionMilliseconds = transitionMilliseconds; + info.LightOverrides.Add(lightOverride); + } + var players = GetPlayers(); if (!players.Empty()) { OverrideLight overrideLight = new(); - overrideLight.AreaLightID = _defaultLight; + overrideLight.AreaLightID = areaLightId; overrideLight.OverrideLightID = overrideLightId; overrideLight.TransitionMilliseconds = transitionMilliseconds; @@ -5062,7 +5071,6 @@ namespace Game.Maps Dictionary _zoneDynamicInfo = new(); IntervalTimer _weatherUpdateTimer; - uint _defaultLight; Dictionary _guidGenerators = new(); Dictionary _objectsStore = new(); MultiMap _creatureBySpawnIdStore = new(); @@ -5624,8 +5632,14 @@ namespace Game.Maps public Weather DefaultWeather; public WeatherState WeatherId; public float Intensity; - public uint OverrideLightId; - public uint TransitionMilliseconds; + public List LightOverrides = new(); + + public struct LightOverride + { + public uint AreaLightId; + public uint OverrideLightId; + public uint TransitionMilliseconds; + } } public class PositionFullTerrainStatus