Fixes creatures falling under map when chasing a player though water.
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user