diff --git a/Source/Game/Chat/Commands/MiscCommands.cs b/Source/Game/Chat/Commands/MiscCommands.cs index 6954a15a9..bfd95be1e 100644 --- a/Source/Game/Chat/Commands/MiscCommands.cs +++ b/Source/Game/Chat/Commands/MiscCommands.cs @@ -676,8 +676,8 @@ namespace Game.Chat handler.SendSysMessage(CypherStrings.GridPosition, cell.GetGridX(), cell.GetGridY(), cell.GetCellX(), cell.GetCellY(), obj.GetInstanceId(), zoneX, zoneY, groundZ, floorZ, map.GetMinHeight(obj.GetPhaseShift(), obj.GetPositionX(), obj.GetPositionY()), haveMap, haveVMap, haveMMap); - LiquidData liquidStatus = new(); - ZLiquidStatus status = map.GetLiquidStatus(obj.GetPhaseShift(), obj.GetPositionX(), obj.GetPositionY(), obj.GetPositionZ(), LiquidHeaderTypeFlags.AllLiquids, liquidStatus); + LiquidData liquidStatus; + ZLiquidStatus status = map.GetLiquidStatus(obj.GetPhaseShift(), obj.GetPositionX(), obj.GetPositionY(), obj.GetPositionZ(), LiquidHeaderTypeFlags.AllLiquids, out liquidStatus); if (liquidStatus != null) handler.SendSysMessage(CypherStrings.LiquidStatus, liquidStatus.level, liquidStatus.depth_level, liquidStatus.entry, liquidStatus.type_flags, status); diff --git a/Source/Game/Entities/Unit/Unit.Movement.cs b/Source/Game/Entities/Unit/Unit.Movement.cs index cb9674832..d2dd170c0 100644 --- a/Source/Game/Entities/Unit/Unit.Movement.cs +++ b/Source/Game/Entities/Unit/Unit.Movement.cs @@ -747,7 +747,7 @@ namespace Game.Entities mountFlags = (AreaMountFlags)areaTable.MountFlags; } - ZLiquidStatus liquidStatus = GetMap().GetLiquidStatus(GetPhaseShift(), GetPositionX(), GetPositionY(), GetPositionZ(), LiquidHeaderTypeFlags.AllLiquids, null); + ZLiquidStatus liquidStatus = GetMap().GetLiquidStatus(GetPhaseShift(), GetPositionX(), GetPositionY(), GetPositionZ(), LiquidHeaderTypeFlags.AllLiquids); isSubmerged = liquidStatus.HasAnyFlag(ZLiquidStatus.UnderWater) || HasUnitMovementFlag(MovementFlag.Swimming); isInWater = liquidStatus.HasAnyFlag(ZLiquidStatus.InWater | ZLiquidStatus.UnderWater); diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index bdd55948c..4cb360513 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -1521,12 +1521,12 @@ namespace Game.Maps public ZLiquidStatus GetLiquidStatus(PhaseShift phaseShift, float x, float y, float z, LiquidHeaderTypeFlags reqLiquidType, float collisionHeight = MapConst.DefaultCollesionHeight) { - return m_terrain.GetLiquidStatus(phaseShift, GetId(), x, y, z, reqLiquidType, null, collisionHeight); + return m_terrain.GetLiquidStatus(phaseShift, GetId(), x, y, z, reqLiquidType, out _, collisionHeight); } - public ZLiquidStatus GetLiquidStatus(PhaseShift phaseShift, float x, float y, float z, LiquidHeaderTypeFlags reqLiquidType, LiquidData data, float collisionHeight = MapConst.DefaultCollesionHeight) + public ZLiquidStatus GetLiquidStatus(PhaseShift phaseShift, float x, float y, float z, LiquidHeaderTypeFlags reqLiquidType, out LiquidData data, float collisionHeight = MapConst.DefaultCollesionHeight) { - return m_terrain.GetLiquidStatus(phaseShift, GetId(), x, y, z, reqLiquidType, data, collisionHeight); + return m_terrain.GetLiquidStatus(phaseShift, GetId(), x, y, z, reqLiquidType, out data, collisionHeight); } private bool GetAreaInfo(PhaseShift phaseShift, float x, float y, float z, out uint mogpflags, out int adtId, out int rootId, out int groupId) @@ -1594,9 +1594,9 @@ namespace Game.Maps return m_terrain.GetWaterLevel(phaseShift, GetId(), x, y); } - public bool IsInWater(PhaseShift phaseShift, float x, float y, float z, LiquidData data) + public bool IsInWater(PhaseShift phaseShift, float x, float y, float z, out LiquidData data) { - return m_terrain.IsInWater(phaseShift, GetId(), x, y, z, data); + return m_terrain.IsInWater(phaseShift, GetId(), x, y, z, out data); } public bool IsUnderWater(PhaseShift phaseShift, float x, float y, float z) diff --git a/Source/Game/Maps/TerrainManager.cs b/Source/Game/Maps/TerrainManager.cs index 05c0d9383..7139ddc7a 100644 --- a/Source/Game/Maps/TerrainManager.cs +++ b/Source/Game/Maps/TerrainManager.cs @@ -549,8 +549,10 @@ namespace Game.Maps } } - public ZLiquidStatus GetLiquidStatus(PhaseShift phaseShift, uint mapId, float x, float y, float z, LiquidHeaderTypeFlags ReqLiquidType, LiquidData data = null, float collisionHeight = MapConst.DefaultCollesionHeight) + public ZLiquidStatus GetLiquidStatus(PhaseShift phaseShift, uint mapId, float x, float y, float z, LiquidHeaderTypeFlags ReqLiquidType, out LiquidData data, float collisionHeight = MapConst.DefaultCollesionHeight) { + data = null; + ZLiquidStatus result = ZLiquidStatus.NoWater; float liquid_level = MapConst.InvalidHeight; float ground_level = MapConst.InvalidHeight; @@ -567,46 +569,45 @@ namespace Game.Maps if (liquid_level > ground_level && MathFunctions.fuzzyGe(z, ground_level - MapConst.GroundHeightTolerance)) { // All ok in water . store data - if (data != null) + data = new(); + + // hardcoded in client like this + if (GetId() == 530 && liquid_type == 2) + liquid_type = 15; + + uint liquidFlagType = 0; + var liq = CliDB.LiquidTypeStorage.LookupByKey(liquid_type); + if (liq != null) + liquidFlagType = liq.SoundBank; + + if (liquid_type != 0 && liquid_type < 21) { - // hardcoded in client like this - if (GetId() == 530 && liquid_type == 2) - liquid_type = 15; - - uint liquidFlagType = 0; - var liq = CliDB.LiquidTypeStorage.LookupByKey(liquid_type); - if (liq != null) - liquidFlagType = liq.SoundBank; - - if (liquid_type != 0 && liquid_type < 21) + var area = CliDB.AreaTableStorage.LookupByKey(GetAreaId(phaseShift, mapId, x, y, z)); + if (area != null) { - var area = CliDB.AreaTableStorage.LookupByKey(GetAreaId(phaseShift, mapId, x, y, z)); - if (area != null) + uint overrideLiquid = area.LiquidTypeID[liquidFlagType]; + if (overrideLiquid == 0 && area.ParentAreaID != 0) { - uint overrideLiquid = area.LiquidTypeID[liquidFlagType]; - if (overrideLiquid == 0 && area.ParentAreaID != 0) - { - area = CliDB.AreaTableStorage.LookupByKey(area.ParentAreaID); - if (area != null) - overrideLiquid = area.LiquidTypeID[liquidFlagType]; - } + area = CliDB.AreaTableStorage.LookupByKey(area.ParentAreaID); + if (area != null) + overrideLiquid = area.LiquidTypeID[liquidFlagType]; + } - var liq1 = CliDB.LiquidTypeStorage.LookupByKey(overrideLiquid); - if (liq1 != null) - { - liquid_type = overrideLiquid; - liquidFlagType = liq1.SoundBank; - } + var liq1 = CliDB.LiquidTypeStorage.LookupByKey(overrideLiquid); + if (liq1 != null) + { + liquid_type = overrideLiquid; + liquidFlagType = liq1.SoundBank; } } - - data.level = liquid_level; - data.depth_level = ground_level; - - data.entry = liquid_type; - data.type_flags = (LiquidHeaderTypeFlags)(1 << (int)liquidFlagType); } + data.level = liquid_level; + data.depth_level = ground_level; + + data.entry = liquid_type; + data.type_flags = (LiquidHeaderTypeFlags)(1 << (int)liquidFlagType); + float delta = liquid_level - z; // Get position delta @@ -630,18 +631,16 @@ namespace Game.Maps // Not override LIQUID_MAP_ABOVE_WATER with LIQUID_MAP_NO_WATER: if (map_result != ZLiquidStatus.NoWater && (map_data.level > ground_level)) { - if (data != null) - { - // hardcoded in client like this - if (GetId() == 530 && map_data.entry == 2) - map_data.entry = 15; + // hardcoded in client like this + if (GetId() == 530 && map_data.entry == 2) + map_data.entry = 15; - data = map_data; - } + data = map_data; return map_result; } } } + return result; } @@ -845,16 +844,14 @@ namespace Game.Maps return 0; } - public bool IsInWater(PhaseShift phaseShift, uint mapId, float x, float y, float pZ, LiquidData data = null) + public bool IsInWater(PhaseShift phaseShift, uint mapId, float x, float y, float pZ, out LiquidData data) { - LiquidData liquid_status = new(); - LiquidData liquid_ptr = data != null ? data : liquid_status; - return (GetLiquidStatus(phaseShift, mapId, x, y, pZ, LiquidHeaderTypeFlags.AllLiquids, liquid_ptr) & (ZLiquidStatus.InWater | ZLiquidStatus.UnderWater)) != 0; + return (GetLiquidStatus(phaseShift, mapId, x, y, pZ, LiquidHeaderTypeFlags.AllLiquids, out data) & (ZLiquidStatus.InWater | ZLiquidStatus.UnderWater)) != 0; } public bool IsUnderWater(PhaseShift phaseShift, uint mapId, float x, float y, float z) { - return (GetLiquidStatus(phaseShift, mapId, x, y, z, LiquidHeaderTypeFlags.Water | LiquidHeaderTypeFlags.Ocean) & ZLiquidStatus.UnderWater) != 0; + return (GetLiquidStatus(phaseShift, mapId, x, y, z, LiquidHeaderTypeFlags.Water | LiquidHeaderTypeFlags.Ocean, out _) & ZLiquidStatus.UnderWater) != 0; } public float GetWaterOrGroundLevel(PhaseShift phaseShift, uint mapId, float x, float y, float z, ref float ground, bool swim = false, float collisionHeight = MapConst.DefaultCollesionHeight, DynamicMapTree dynamicMapTree = null) @@ -868,8 +865,8 @@ namespace Game.Maps ground = ground_z; - LiquidData liquid_status = new(); - ZLiquidStatus res = GetLiquidStatus(phaseShift, mapId, x, y, ground_z, LiquidHeaderTypeFlags.AllLiquids, liquid_status, collisionHeight); + LiquidData liquid_status; + ZLiquidStatus res = GetLiquidStatus(phaseShift, mapId, x, y, ground_z, LiquidHeaderTypeFlags.AllLiquids, out liquid_status, collisionHeight); switch (res) { case ZLiquidStatus.AboveWater: diff --git a/Source/Game/Movement/Generators/PathGenerator.cs b/Source/Game/Movement/Generators/PathGenerator.cs index 1164367f5..565eddc44 100644 --- a/Source/Game/Movement/Generators/PathGenerator.cs +++ b/Source/Game/Movement/Generators/PathGenerator.cs @@ -890,8 +890,8 @@ namespace Game.Movement NavTerrainFlag GetNavTerrain(float x, float y, float z) { - LiquidData data = new(); - ZLiquidStatus liquidStatus = _source.GetMap().GetLiquidStatus(_source.GetPhaseShift(), x, y, z, LiquidHeaderTypeFlags.AllLiquids, data, _source.GetCollisionHeight()); + LiquidData data; + ZLiquidStatus liquidStatus = _source.GetMap().GetLiquidStatus(_source.GetPhaseShift(), x, y, z, LiquidHeaderTypeFlags.AllLiquids, out data, _source.GetCollisionHeight()); if (liquidStatus == ZLiquidStatus.NoWater) return NavTerrainFlag.Ground; diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index d509e35b4..18ddff304 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -921,8 +921,8 @@ namespace Game.Spells float ground = m_caster.GetMapHeight(x, y, z); float liquidLevel = MapConst.VMAPInvalidHeightValue; - LiquidData liquidData = new(); - if (m_caster.GetMap().GetLiquidStatus(m_caster.GetPhaseShift(), x, y, z, LiquidHeaderTypeFlags.AllLiquids, liquidData, m_caster.GetCollisionHeight()) != 0) + LiquidData liquidData; + if (m_caster.GetMap().GetLiquidStatus(m_caster.GetPhaseShift(), x, y, z, LiquidHeaderTypeFlags.AllLiquids, out liquidData, m_caster.GetCollisionHeight()) != 0) liquidLevel = liquidData.level; if (liquidLevel <= ground) // When there is no liquid Map.GetWaterOrGroundLevel returns ground level diff --git a/Source/Scripts/Spells/Generic.cs b/Source/Scripts/Spells/Generic.cs index 97d9f2184..47b193990 100644 --- a/Source/Scripts/Spells/Generic.cs +++ b/Source/Scripts/Spells/Generic.cs @@ -594,8 +594,8 @@ namespace Scripts.Spells.Generic { Unit caster = GetCaster(); Position summonPos = caster.GetPosition(); - LiquidData liquidStatus = new(); - if (caster.GetMap().GetLiquidStatus(caster.GetPhaseShift(), caster.GetPositionX(), caster.GetPositionY(), caster.GetPositionZ(), LiquidHeaderTypeFlags.AllLiquids, liquidStatus, caster.GetCollisionHeight()) != ZLiquidStatus.NoWater) + LiquidData liquidStatus; + if (caster.GetMap().GetLiquidStatus(caster.GetPhaseShift(), caster.GetPositionX(), caster.GetPositionY(), caster.GetPositionZ(), LiquidHeaderTypeFlags.AllLiquids, out liquidStatus, caster.GetCollisionHeight()) != ZLiquidStatus.NoWater) summonPos.posZ = liquidStatus.level; dest.Relocate(summonPos); }