From 90508f768949a6ed039c6dd2c7ef3e7f73a190fc Mon Sep 17 00:00:00 2001 From: hondacrx Date: Wed, 2 Jun 2021 22:09:53 -0400 Subject: [PATCH] Core/Maps & Extractors: Move copypasted map file headers into a single shared file and replace #defines with enums Port From (https://github.com/TrinityCore/TrinityCore/commit/6ecfe58cae6d9cfa7a3aef21a4a96aa00c513ba2) --- Source/Framework/Constants/MapConst.cs | 42 ++++++++++++--- Source/Game/Chat/Commands/MiscCommands.cs | 2 +- Source/Game/Entities/Object/WorldObject.cs | 2 +- Source/Game/Entities/Player/Player.Map.cs | 8 +-- Source/Game/Entities/Unit/Unit.Movement.cs | 2 +- Source/Game/Maps/GridMap.cs | 54 ++++++------------- Source/Game/Maps/Map.cs | 29 +++++----- .../Game/Movement/Generators/PathGenerator.cs | 14 ++--- Source/Game/Spells/Spell.cs | 2 +- 9 files changed, 81 insertions(+), 74 deletions(-) diff --git a/Source/Framework/Constants/MapConst.cs b/Source/Framework/Constants/MapConst.cs index 417c88704..ef802e910 100644 --- a/Source/Framework/Constants/MapConst.cs +++ b/Source/Framework/Constants/MapConst.cs @@ -45,13 +45,6 @@ namespace Framework.Constants public const uint ReadycheckDuration = 35000; //Liquid - public const uint MapLiquidTypeNoWater = 0x00; - public const uint MapLiquidTypeWater = 0x01; - public const uint MapLiquidTypeOcean = 0x02; - public const uint MapLiquidTypeMagma = 0x04; - public const uint MapLiquidTypeSlime = 0x08; - public const uint MapLiquidTypeDarkWater = 0x10; - public const uint MapAllLiquidTypes = (MapLiquidTypeWater | MapLiquidTypeOcean | MapLiquidTypeMagma | MapLiquidTypeSlime); public const float LiquidTileSize = (533.333f / 128.0f); public const int MinMapUpdateDelay = 50; @@ -243,4 +236,39 @@ namespace Framework.Constants All = (ActivateSpawn | BlockSpawn) } + + public enum AreaHeaderFlags : ushort + { + None = 0x0000, + NoArea = 0x0001 + } + + public enum HeightHeaderFlags : uint + { + None = 0x0000, + NoHeight = 0x0001, + HeightAsInt16 = 0x0002, + HeightAsInt8 = 0x0004, + HasFlightBounds = 0x0008 + } + + public enum LiquidHeaderFlags : byte + { + None = 0x0000, + NoType = 0x0001, + NoHeight = 0x0002 + } + + public enum LiquidHeaderTypeFlags : byte + { + NoWater = 0x00, + Water = 0x01, + Ocean = 0x02, + Magma = 0x04, + Slime = 0x08, + + DarkWater = 0x10, + + AllLiquids = Water | Ocean | Magma | Slime + } } diff --git a/Source/Game/Chat/Commands/MiscCommands.cs b/Source/Game/Chat/Commands/MiscCommands.cs index 862bfbf84..07bb29a3c 100644 --- a/Source/Game/Chat/Commands/MiscCommands.cs +++ b/Source/Game/Chat/Commands/MiscCommands.cs @@ -966,7 +966,7 @@ namespace Game.Chat zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap, haveMMap); LiquidData liquidStatus; - ZLiquidStatus status = map.GetLiquidStatus(obj.GetPhaseShift(), obj.GetPositionX(), obj.GetPositionY(), obj.GetPositionZ(), MapConst.MapAllLiquidTypes, out 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/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 2b5382c0e..c83cbb735 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -114,7 +114,7 @@ namespace Game.Entities public void UpdatePositionData() { PositionFullTerrainStatus data = new(); - GetMap().GetFullTerrainStatusForPosition(_phaseShift, GetPositionX(), GetPositionY(), GetPositionZ(), data); + GetMap().GetFullTerrainStatusForPosition(_phaseShift, GetPositionX(), GetPositionY(), GetPositionZ(), data, LiquidHeaderTypeFlags.AllLiquids); ProcessPositionDataChanged(data); } diff --git a/Source/Game/Entities/Player/Player.Map.cs b/Source/Game/Entities/Player/Player.Map.cs index 330741405..bc94fadfe 100644 --- a/Source/Game/Entities/Player/Player.Map.cs +++ b/Source/Game/Entities/Player/Player.Map.cs @@ -795,7 +795,7 @@ namespace Game.Entities if (status != 0 && liquidData.HasValue) { // Breath bar state (under water in any liquid type) - if (liquidData.Value.type_flags.HasAnyFlag(MapConst.MapAllLiquidTypes)) + if (liquidData.Value.type_flags.HasAnyFlag(LiquidHeaderTypeFlags.AllLiquids)) { if (status.HasAnyFlag(ZLiquidStatus.UnderWater)) m_MirrorTimerFlags |= PlayerUnderwaterState.InWater; @@ -804,13 +804,13 @@ namespace Game.Entities } // Fatigue bar state (if not on flight path or transport) - if (liquidData.Value.type_flags.HasAnyFlag(MapConst.MapLiquidTypeDarkWater) && !IsInFlight() && !GetTransport()) + if (liquidData.Value.type_flags.HasAnyFlag(LiquidHeaderTypeFlags.DarkWater) && !IsInFlight() && !GetTransport()) m_MirrorTimerFlags |= PlayerUnderwaterState.InDarkWater; else m_MirrorTimerFlags &= ~PlayerUnderwaterState.InDarkWater; // Lava state (any contact) - if (liquidData.Value.type_flags.HasAnyFlag(MapConst.MapLiquidTypeMagma)) + if (liquidData.Value.type_flags.HasAnyFlag(LiquidHeaderTypeFlags.Magma)) { if (status.HasAnyFlag(ZLiquidStatus.InContact)) m_MirrorTimerFlags |= PlayerUnderwaterState.InLava; @@ -819,7 +819,7 @@ namespace Game.Entities } // Slime state (any contact) - if (liquidData.Value.type_flags.HasAnyFlag(MapConst.MapLiquidTypeSlime)) + if (liquidData.Value.type_flags.HasAnyFlag(LiquidHeaderTypeFlags.Slime)) { if (status.HasAnyFlag(ZLiquidStatus.InContact)) m_MirrorTimerFlags |= PlayerUnderwaterState.InSlime; diff --git a/Source/Game/Entities/Unit/Unit.Movement.cs b/Source/Game/Entities/Unit/Unit.Movement.cs index 0804c716b..7f7be2e01 100644 --- a/Source/Game/Entities/Unit/Unit.Movement.cs +++ b/Source/Game/Entities/Unit/Unit.Movement.cs @@ -706,7 +706,7 @@ namespace Game.Entities } LiquidData liquid; - ZLiquidStatus liquidStatus = GetMap().GetLiquidStatus(GetPhaseShift(), GetPositionX(), GetPositionY(), GetPositionZ(), MapConst.MapAllLiquidTypes, out liquid); + ZLiquidStatus liquidStatus = GetMap().GetLiquidStatus(GetPhaseShift(), GetPositionX(), GetPositionY(), GetPositionZ(), LiquidHeaderTypeFlags.AllLiquids, out liquid); isSubmerged = liquidStatus.HasAnyFlag(ZLiquidStatus.UnderWater) || HasUnitMovementFlag(MovementFlag.Swimming); isInWater = liquidStatus.HasAnyFlag(ZLiquidStatus.InWater | ZLiquidStatus.UnderWater); diff --git a/Source/Game/Maps/GridMap.cs b/Source/Game/Maps/GridMap.cs index 10d5477e8..2e9426898 100644 --- a/Source/Game/Maps/GridMap.cs +++ b/Source/Game/Maps/GridMap.cs @@ -139,7 +139,7 @@ namespace Game.Maps else _gridGetHeight = GetHeightFromFlat; - if (mapHeader.flags.HasAnyFlag(HeightHeaderFlags.HeightHasFlightBounds)) + if (mapHeader.flags.HasAnyFlag(HeightHeaderFlags.HasFlightBounds)) { short[] maxHeights = reader.ReadArray(3 * 3); short[] minHeights = reader.ReadArray(3 * 3); @@ -190,20 +190,20 @@ namespace Game.Maps return false; _liquidGlobalEntry = liquidHeader.liquidType; - _liquidGlobalFlags = liquidHeader.liquidFlags; + _liquidGlobalFlags = (LiquidHeaderTypeFlags)liquidHeader.liquidFlags; _liquidOffX = liquidHeader.offsetX; _liquidOffY = liquidHeader.offsetY; _liquidWidth = liquidHeader.width; _liquidHeight = liquidHeader.height; _liquidLevel = liquidHeader.liquidLevel; - if (!liquidHeader.flags.HasAnyFlag(LiquidHeaderFlags.LiquidNoType)) + if (!liquidHeader.flags.HasAnyFlag(LiquidHeaderFlags.NoType)) { _liquidEntry = reader.ReadArray(16 * 16); _liquidFlags = reader.ReadBytes(16 * 16); } - if (!liquidHeader.flags.HasAnyFlag(LiquidHeaderFlags.LiquidNoHeight)) + if (!liquidHeader.flags.HasAnyFlag(LiquidHeaderFlags.NoHeight)) _liquidMap = reader.ReadArray((uint)(_liquidWidth * _liquidHeight)); return true; @@ -488,23 +488,23 @@ namespace Game.Maps } // Why does this return LIQUID data? - public byte GetTerrainType(float x, float y) + public LiquidHeaderTypeFlags GetTerrainType(float x, float y) { if (_liquidFlags == null) - return 0; + return LiquidHeaderTypeFlags.NoWater; x = 16 * (32 - x / MapConst.SizeofGrids); y = 16 * (32 - y / MapConst.SizeofGrids); int lx = (int)x & 15; int ly = (int)y & 15; - return _liquidFlags[lx * 16 + ly]; + return (LiquidHeaderTypeFlags)_liquidFlags[lx * 16 + ly]; } // Get water state on map - public ZLiquidStatus GetLiquidStatus(float x, float y, float z, uint ReqLiquidType, LiquidData data, float collisionHeight) + public ZLiquidStatus GetLiquidStatus(float x, float y, float z, LiquidHeaderTypeFlags? reqLiquidType, LiquidData data, float collisionHeight) { // Check water type (if no water return) - if (_liquidGlobalFlags == 0 && _liquidFlags == null) + if (_liquidGlobalFlags == LiquidHeaderTypeFlags.NoWater && _liquidFlags == null) return ZLiquidStatus.NoWater; // Get cell @@ -516,12 +516,12 @@ namespace Game.Maps // Check water type in cell int idx = (x_int >> 3) * 16 + (y_int >> 3); - byte type = _liquidFlags != null ? _liquidFlags[idx] : _liquidGlobalFlags; + LiquidHeaderTypeFlags type = _liquidFlags != null ? (LiquidHeaderTypeFlags)_liquidFlags[idx] : _liquidGlobalFlags; uint entry = _liquidEntry != null ? _liquidEntry[idx] : _liquidGlobalEntry; LiquidTypeRecord liquidEntry = CliDB.LiquidTypeStorage.LookupByKey(entry); if (liquidEntry != null) { - type &= (byte)MapConst.MapLiquidTypeDarkWater; + type &= LiquidHeaderTypeFlags.DarkWater; uint liqTypeIdx = liquidEntry.SoundBank; if (entry < 21) { @@ -543,14 +543,14 @@ namespace Game.Maps } } } - type |= (byte)(1 << (int)liqTypeIdx); + type |= (LiquidHeaderTypeFlags)(1 << (int)liqTypeIdx); } - if (type == 0) + if (type == LiquidHeaderTypeFlags.NoWater) return ZLiquidStatus.NoWater; // Check req liquid type mask - if (ReqLiquidType != 0 && !Convert.ToBoolean(ReqLiquidType & type)) + if (reqLiquidType.HasValue && (reqLiquidType & type) == LiquidHeaderTypeFlags.NoWater) return ZLiquidStatus.NoWater; // Check water level: @@ -622,7 +622,7 @@ namespace Game.Maps float[] _liquidMap; ushort _gridArea; ushort _liquidGlobalEntry; - byte _liquidGlobalFlags; + LiquidHeaderTypeFlags _liquidGlobalFlags; byte _liquidOffX; byte _liquidOffY; byte _liquidWidth; @@ -675,31 +675,9 @@ namespace Game.Maps public class LiquidData { - public uint type_flags; + public LiquidHeaderTypeFlags type_flags; public uint entry; public float level; public float depth_level; } - - [Flags] - public enum AreaHeaderFlags : ushort - { - NoArea = 0x0001 - } - - [Flags] - public enum HeightHeaderFlags - { - NoHeight = 0x0001, - HeightAsInt16 = 0x0002, - HeightAsInt8 = 0x0004, - HeightHasFlightBounds = 0x0008 - } - - [Flags] - public enum LiquidHeaderFlags : byte - { - LiquidNoType = 0x0001, - LiquidNoHeight = 0x0002 - } } diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index 6b887dc61..07455f9f4 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -1705,7 +1705,7 @@ namespace Game.Maps LiquidData liquid_status; - ZLiquidStatus res = GetLiquidStatus(phaseShift, x, y, ground_z, MapConst.MapAllLiquidTypes, out liquid_status, collisionHeight); + ZLiquidStatus res = GetLiquidStatus(phaseShift, x, y, ground_z, LiquidHeaderTypeFlags.AllLiquids, out liquid_status, collisionHeight); switch (res) { case ZLiquidStatus.AboveWater: @@ -1959,20 +1959,21 @@ namespace Game.Maps public void GetZoneAndAreaId(PhaseShift phaseShift, out uint zoneid, out uint areaid, Position pos) { GetZoneAndAreaId(phaseShift, out zoneid, out areaid, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); } - private byte GetTerrainType(PhaseShift phaseShift, float x, float y) + private LiquidHeaderTypeFlags GetTerrainType(PhaseShift phaseShift, float x, float y) { GridMap gmap = GetGridMap(PhasingHandler.GetTerrainMapId(phaseShift, this, x, y), x, y); if (gmap != null) return gmap.GetTerrainType(x, y); - return 0; + + return LiquidHeaderTypeFlags.NoWater; } - public ZLiquidStatus GetLiquidStatus(PhaseShift phaseShift, float x, float y, float z, uint ReqLiquidType, float collisionHeight = MapConst.DefaultCollesionHeight) + public ZLiquidStatus GetLiquidStatus(PhaseShift phaseShift, float x, float y, float z, LiquidHeaderTypeFlags reqLiquidType, float collisionHeight = MapConst.DefaultCollesionHeight) { - return GetLiquidStatus(phaseShift, x, y, z, ReqLiquidType, out _, collisionHeight); + return GetLiquidStatus(phaseShift, x, y, z, reqLiquidType, out _, collisionHeight); } - public ZLiquidStatus GetLiquidStatus(PhaseShift phaseShift, float x, float y, float z, uint ReqLiquidType, out 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) { data = new LiquidData(); var result = ZLiquidStatus.NoWater; @@ -1980,7 +1981,7 @@ namespace Game.Maps float ground_level = MapConst.InvalidHeight; uint liquid_type = 0; uint terrainMapId = PhasingHandler.GetTerrainMapId(phaseShift, this, x, y); - if (Global.VMapMgr.GetLiquidLevel(terrainMapId, x, y, z, ReqLiquidType, ref liquid_level, ref ground_level, ref liquid_type)) + if (Global.VMapMgr.GetLiquidLevel(terrainMapId, x, y, z, (byte)reqLiquidType, ref liquid_level, ref ground_level, ref liquid_type)) { Log.outDebug(LogFilter.Maps, "getLiquidStatus(): vmap liquid level: {0} ground: {1} type: {2}", liquid_level, ground_level, liquid_type); @@ -2023,7 +2024,7 @@ namespace Game.Maps data.depth_level = ground_level; data.entry = liquid_type; - data.type_flags = (uint)(1 << (int)liquidFlagType); + data.type_flags = (LiquidHeaderTypeFlags)(1 << (int)liquidFlagType); float delta = liquid_level - z; @@ -2042,7 +2043,7 @@ namespace Game.Maps if (gmap != null) { var map_data = new LiquidData(); - ZLiquidStatus map_result = gmap.GetLiquidStatus(x, y, z, ReqLiquidType, map_data, collisionHeight); + ZLiquidStatus map_result = gmap.GetLiquidStatus(x, y, z, reqLiquidType, map_data, collisionHeight); // Not override LIQUID_MAP_ABOVE_WATER with LIQUID_MAP_NO_WATER: if (map_result != ZLiquidStatus.NoWater && (map_data.level > ground_level)) { @@ -2058,10 +2059,10 @@ namespace Game.Maps return result; } - public void GetFullTerrainStatusForPosition(PhaseShift phaseShift, float x, float y, float z, PositionFullTerrainStatus data, uint reqLiquidType = MapConst.MapAllLiquidTypes, float collisionHeight = MapConst.DefaultCollesionHeight) + public void GetFullTerrainStatusForPosition(PhaseShift phaseShift, float x, float y, float z, PositionFullTerrainStatus data, LiquidHeaderTypeFlags reqLiquidType, float collisionHeight = MapConst.DefaultCollesionHeight) { uint terrainMapId = PhasingHandler.GetTerrainMapId(phaseShift, this, x, y); - AreaAndLiquidData vmapData = Global.VMapMgr.GetAreaAndLiquidData(terrainMapId, x, y, z, reqLiquidType); + AreaAndLiquidData vmapData = Global.VMapMgr.GetAreaAndLiquidData(terrainMapId, x, y, z, (byte)reqLiquidType); if (vmapData.areaInfo.HasValue) data.areaInfo.Set(new PositionFullTerrainStatus.AreaInfo(vmapData.areaInfo.Value.AdtId, vmapData.areaInfo.Value.RootId, vmapData.areaInfo.Value.GroupId, vmapData.areaInfo.Value.MogpFlags)); @@ -2134,7 +2135,7 @@ namespace Game.Maps liquidInfo.level = vmapData.liquidInfo.Value.Level; liquidInfo.depth_level = vmapData.floorZ; liquidInfo.entry = liquidType; - liquidInfo.type_flags = 1u << (int)liquidFlagType; + liquidInfo.type_flags = (LiquidHeaderTypeFlags)(1u << (int)liquidFlagType); data.LiquidInfo.Set(liquidInfo); float delta = vmapData.liquidInfo.Value.Level - z; @@ -2197,12 +2198,12 @@ namespace Game.Maps public bool IsInWater(PhaseShift phaseShift, float x, float y, float pZ) { - return Convert.ToBoolean(GetLiquidStatus(phaseShift, x, y, pZ, MapConst.MapAllLiquidTypes) & (ZLiquidStatus.InWater | ZLiquidStatus.UnderWater)); + return Convert.ToBoolean(GetLiquidStatus(phaseShift, x, y, pZ, LiquidHeaderTypeFlags.AllLiquids) & (ZLiquidStatus.InWater | ZLiquidStatus.UnderWater)); } public bool IsUnderWater(PhaseShift phaseShift, float x, float y, float z) { - return Convert.ToBoolean(GetLiquidStatus(phaseShift, x, y, z, MapConst.MapLiquidTypeWater | MapConst.MapLiquidTypeOcean) & ZLiquidStatus.UnderWater); + return Convert.ToBoolean(GetLiquidStatus(phaseShift, x, y, z, LiquidHeaderTypeFlags.Water | LiquidHeaderTypeFlags.Ocean) & ZLiquidStatus.UnderWater); } public string GetMapName() diff --git a/Source/Game/Movement/Generators/PathGenerator.cs b/Source/Game/Movement/Generators/PathGenerator.cs index ce7dabcf0..06b17eac8 100644 --- a/Source/Game/Movement/Generators/PathGenerator.cs +++ b/Source/Game/Movement/Generators/PathGenerator.cs @@ -174,7 +174,7 @@ namespace Game.Movement // Check both start and end points, if they're both in water, then we can *safely* let the creature move for (uint i = 0; i < _pathPoints.Length; ++i) { - ZLiquidStatus status = _sourceUnit.GetMap().GetLiquidStatus(_sourceUnit.GetPhaseShift(), _pathPoints[i].X, _pathPoints[i].Y, _pathPoints[i].Z, MapConst.MapAllLiquidTypes, _sourceUnit.GetCollisionHeight()); + ZLiquidStatus status = _sourceUnit.GetMap().GetLiquidStatus(_sourceUnit.GetPhaseShift(), _pathPoints[i].X, _pathPoints[i].Y, _pathPoints[i].Z, LiquidHeaderTypeFlags.AllLiquids, _sourceUnit.GetCollisionHeight()); // One of the points is not in the water, cancel movement. if (status == ZLiquidStatus.NoWater) { @@ -839,18 +839,18 @@ namespace Game.Movement NavTerrainFlag GetNavTerrain(float x, float y, float z) { LiquidData data; - ZLiquidStatus liquidStatus = _sourceUnit.GetMap().GetLiquidStatus(_sourceUnit.GetPhaseShift(), x, y, z, MapConst.MapAllLiquidTypes, out data, _sourceUnit.GetCollisionHeight()); + ZLiquidStatus liquidStatus = _sourceUnit.GetMap().GetLiquidStatus(_sourceUnit.GetPhaseShift(), x, y, z, LiquidHeaderTypeFlags.AllLiquids, out data, _sourceUnit.GetCollisionHeight()); if (liquidStatus == ZLiquidStatus.NoWater) return NavTerrainFlag.Ground; - data.type_flags &= ~MapConst.MapLiquidTypeDarkWater; + data.type_flags &= ~LiquidHeaderTypeFlags.DarkWater; switch (data.type_flags) { - case MapConst.MapLiquidTypeWater: - case MapConst.MapLiquidTypeOcean: + case LiquidHeaderTypeFlags.Water: + case LiquidHeaderTypeFlags.Ocean: return NavTerrainFlag.Water; - case MapConst.MapLiquidTypeMagma: - case MapConst.MapLiquidTypeSlime: + case LiquidHeaderTypeFlags.Magma: + case LiquidHeaderTypeFlags.Slime: return NavTerrainFlag.MagmaSlime; default: return NavTerrainFlag.Ground; diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 2eccd85f7..6bd6f43e1 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -861,7 +861,7 @@ namespace Game.Spells float ground = m_caster.GetMapHeight(x, y, z); float liquidLevel = MapConst.VMAPInvalidHeightValue; LiquidData liquidData; - if (m_caster.GetMap().GetLiquidStatus(m_caster.GetPhaseShift(), x, y, z, MapConst.MapAllLiquidTypes, out liquidData, m_caster.GetCollisionHeight()) != 0) + 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