Fixes creatures falling under map when chasing a player though water.

This commit is contained in:
hondacrx
2023-02-21 19:18:28 -05:00
parent 82fcf27e8b
commit f51dbf95ec
7 changed files with 58 additions and 61 deletions
+2 -2
View File
@@ -676,8 +676,8 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.GridPosition, cell.GetGridX(), cell.GetGridY(), cell.GetCellX(), cell.GetCellY(), obj.GetInstanceId(), 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); zoneX, zoneY, groundZ, floorZ, map.GetMinHeight(obj.GetPhaseShift(), obj.GetPositionX(), obj.GetPositionY()), haveMap, haveVMap, haveMMap);
LiquidData liquidStatus = new(); LiquidData liquidStatus;
ZLiquidStatus status = map.GetLiquidStatus(obj.GetPhaseShift(), obj.GetPositionX(), obj.GetPositionY(), obj.GetPositionZ(), LiquidHeaderTypeFlags.AllLiquids, liquidStatus); ZLiquidStatus status = map.GetLiquidStatus(obj.GetPhaseShift(), obj.GetPositionX(), obj.GetPositionY(), obj.GetPositionZ(), LiquidHeaderTypeFlags.AllLiquids, out liquidStatus);
if (liquidStatus != null) if (liquidStatus != null)
handler.SendSysMessage(CypherStrings.LiquidStatus, liquidStatus.level, liquidStatus.depth_level, liquidStatus.entry, liquidStatus.type_flags, status); handler.SendSysMessage(CypherStrings.LiquidStatus, liquidStatus.level, liquidStatus.depth_level, liquidStatus.entry, liquidStatus.type_flags, status);
+1 -1
View File
@@ -747,7 +747,7 @@ namespace Game.Entities
mountFlags = (AreaMountFlags)areaTable.MountFlags; 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); isSubmerged = liquidStatus.HasAnyFlag(ZLiquidStatus.UnderWater) || HasUnitMovementFlag(MovementFlag.Swimming);
isInWater = liquidStatus.HasAnyFlag(ZLiquidStatus.InWater | ZLiquidStatus.UnderWater); isInWater = liquidStatus.HasAnyFlag(ZLiquidStatus.InWater | ZLiquidStatus.UnderWater);
+5 -5
View File
@@ -1521,12 +1521,12 @@ namespace Game.Maps
public ZLiquidStatus GetLiquidStatus(PhaseShift phaseShift, float x, float y, float z, LiquidHeaderTypeFlags reqLiquidType, float collisionHeight = MapConst.DefaultCollesionHeight) 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) 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); 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) public bool IsUnderWater(PhaseShift phaseShift, float x, float y, float z)
+44 -47
View File
@@ -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; ZLiquidStatus result = ZLiquidStatus.NoWater;
float liquid_level = MapConst.InvalidHeight; float liquid_level = MapConst.InvalidHeight;
float ground_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)) if (liquid_level > ground_level && MathFunctions.fuzzyGe(z, ground_level - MapConst.GroundHeightTolerance))
{ {
// All ok in water . store data // 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 var area = CliDB.AreaTableStorage.LookupByKey(GetAreaId(phaseShift, mapId, x, y, z));
if (GetId() == 530 && liquid_type == 2) if (area != null)
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)); uint overrideLiquid = area.LiquidTypeID[liquidFlagType];
if (area != null) if (overrideLiquid == 0 && area.ParentAreaID != 0)
{ {
uint overrideLiquid = area.LiquidTypeID[liquidFlagType]; area = CliDB.AreaTableStorage.LookupByKey(area.ParentAreaID);
if (overrideLiquid == 0 && area.ParentAreaID != 0) 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); var liq1 = CliDB.LiquidTypeStorage.LookupByKey(overrideLiquid);
if (liq1 != null) if (liq1 != null)
{ {
liquid_type = overrideLiquid; liquid_type = overrideLiquid;
liquidFlagType = liq1.SoundBank; 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; float delta = liquid_level - z;
// Get position delta // Get position delta
@@ -630,18 +631,16 @@ namespace Game.Maps
// Not override LIQUID_MAP_ABOVE_WATER with LIQUID_MAP_NO_WATER: // Not override LIQUID_MAP_ABOVE_WATER with LIQUID_MAP_NO_WATER:
if (map_result != ZLiquidStatus.NoWater && (map_data.level > ground_level)) 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)
// hardcoded in client like this map_data.entry = 15;
if (GetId() == 530 && map_data.entry == 2)
map_data.entry = 15;
data = map_data; data = map_data;
}
return map_result; return map_result;
} }
} }
} }
return result; return result;
} }
@@ -845,16 +844,14 @@ namespace Game.Maps
return 0; 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(); return (GetLiquidStatus(phaseShift, mapId, x, y, pZ, LiquidHeaderTypeFlags.AllLiquids, out data) & (ZLiquidStatus.InWater | ZLiquidStatus.UnderWater)) != 0;
LiquidData liquid_ptr = data != null ? data : liquid_status;
return (GetLiquidStatus(phaseShift, mapId, x, y, pZ, LiquidHeaderTypeFlags.AllLiquids, liquid_ptr) & (ZLiquidStatus.InWater | ZLiquidStatus.UnderWater)) != 0;
} }
public bool IsUnderWater(PhaseShift phaseShift, uint mapId, float x, float y, float z) 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) 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; ground = ground_z;
LiquidData liquid_status = new(); LiquidData liquid_status;
ZLiquidStatus res = GetLiquidStatus(phaseShift, mapId, x, y, ground_z, LiquidHeaderTypeFlags.AllLiquids, liquid_status, collisionHeight); ZLiquidStatus res = GetLiquidStatus(phaseShift, mapId, x, y, ground_z, LiquidHeaderTypeFlags.AllLiquids, out liquid_status, collisionHeight);
switch (res) switch (res)
{ {
case ZLiquidStatus.AboveWater: case ZLiquidStatus.AboveWater:
@@ -890,8 +890,8 @@ namespace Game.Movement
NavTerrainFlag GetNavTerrain(float x, float y, float z) NavTerrainFlag GetNavTerrain(float x, float y, float z)
{ {
LiquidData data = new(); LiquidData data;
ZLiquidStatus liquidStatus = _source.GetMap().GetLiquidStatus(_source.GetPhaseShift(), x, y, z, LiquidHeaderTypeFlags.AllLiquids, data, _source.GetCollisionHeight()); ZLiquidStatus liquidStatus = _source.GetMap().GetLiquidStatus(_source.GetPhaseShift(), x, y, z, LiquidHeaderTypeFlags.AllLiquids, out data, _source.GetCollisionHeight());
if (liquidStatus == ZLiquidStatus.NoWater) if (liquidStatus == ZLiquidStatus.NoWater)
return NavTerrainFlag.Ground; return NavTerrainFlag.Ground;
+2 -2
View File
@@ -921,8 +921,8 @@ namespace Game.Spells
float ground = m_caster.GetMapHeight(x, y, z); float ground = m_caster.GetMapHeight(x, y, z);
float liquidLevel = MapConst.VMAPInvalidHeightValue; float liquidLevel = MapConst.VMAPInvalidHeightValue;
LiquidData liquidData = new(); LiquidData liquidData;
if (m_caster.GetMap().GetLiquidStatus(m_caster.GetPhaseShift(), x, y, z, LiquidHeaderTypeFlags.AllLiquids, 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; liquidLevel = liquidData.level;
if (liquidLevel <= ground) // When there is no liquid Map.GetWaterOrGroundLevel returns ground level if (liquidLevel <= ground) // When there is no liquid Map.GetWaterOrGroundLevel returns ground level
+2 -2
View File
@@ -594,8 +594,8 @@ namespace Scripts.Spells.Generic
{ {
Unit caster = GetCaster(); Unit caster = GetCaster();
Position summonPos = caster.GetPosition(); Position summonPos = caster.GetPosition();
LiquidData liquidStatus = new(); LiquidData liquidStatus;
if (caster.GetMap().GetLiquidStatus(caster.GetPhaseShift(), caster.GetPositionX(), caster.GetPositionY(), caster.GetPositionZ(), LiquidHeaderTypeFlags.AllLiquids, liquidStatus, caster.GetCollisionHeight()) != ZLiquidStatus.NoWater) if (caster.GetMap().GetLiquidStatus(caster.GetPhaseShift(), caster.GetPositionX(), caster.GetPositionY(), caster.GetPositionZ(), LiquidHeaderTypeFlags.AllLiquids, out liquidStatus, caster.GetCollisionHeight()) != ZLiquidStatus.NoWater)
summonPos.posZ = liquidStatus.level; summonPos.posZ = liquidStatus.level;
dest.Relocate(summonPos); dest.Relocate(summonPos);
} }