Core/Objects: increase sight range of all Infinite, Gigantic and Large objects & correct general default visibility distance

This commit is contained in:
hondacrx
2019-01-16 19:42:22 -05:00
parent 055e9d1776
commit ec7807eaac
9 changed files with 186 additions and 19 deletions
+30 -6
View File
@@ -65,7 +65,6 @@ namespace Framework.Constants
public const int LFGHealersNeeded = 1; public const int LFGHealersNeeded = 1;
public const int LFGDPSNeeded = 3; public const int LFGDPSNeeded = 3;
/// <summary> /// <summary>
/// Loot Const /// Loot Const
/// </summary> /// </summary>
@@ -83,7 +82,6 @@ namespace Framework.Constants
public const float terminal_fallTime = (float)(terminalVelocity / gravity); // the time that needed to reach terminalVelocity public const float terminal_fallTime = (float)(terminalVelocity / gravity); // the time that needed to reach terminalVelocity
public const float terminal_safeFall_fallTime = (float)(terminalSafefallVelocity / gravity); // the time that needed to reach terminalVelocity with safefall public const float terminal_safeFall_fallTime = (float)(terminalSafefallVelocity / gravity); // the time that needed to reach terminalVelocity with safefall
/// <summary> /// <summary>
/// Vehicle Const /// Vehicle Const
/// </summary> /// </summary>
@@ -212,7 +210,6 @@ namespace Framework.Constants
public const int MaxPetTalentRank = 3; public const int MaxPetTalentRank = 3;
public const int ActionBarIndexMax = (ActionBarIndexEnd - ActionBarIndexStart); public const int ActionBarIndexMax = (ActionBarIndexEnd - ActionBarIndexStart);
/// <summary> /// <summary>
/// Object Const /// Object Const
/// </summary> /// </summary>
@@ -227,9 +224,14 @@ namespace Framework.Constants
public const float InteractionDistance = 5.0f; public const float InteractionDistance = 5.0f;
public const float MaxVisibilityDistance = MapConst.SizeofGrids; // max distance for visible objects public const float MaxVisibilityDistance = MapConst.SizeofGrids; // max distance for visible objects
public const float SightRangeUnit = 50.0f; public const float SightRangeUnit = 50.0f;
public const float DefaultVisibilityDistance = 90.0f; // default visible distance, 90 yards on continents public const float VisibilityDistanceGigantic = 400.0f;
public const float DefaultVisibilityInstance = 170.0f; // default visible distance in instances, 170 yards public const float VisibilityDistanceLarge = 200.0f;
public const float DefaultVisibilityBGAreans = 533.0f; // default visible distance in BG/Arenas, roughly 533 yards public const float VisibilityDistanceNormal = 100.0f;
public const float VisibilityDistanceSmall = 50.0f;
public const float VisibilityDistanceTiny = 25.0f;
public const float DefaultVisibilityDistance = VisibilityDistanceNormal; // default visible distance, 100 yards on continents
public const float DefaultVisibilityInstance = 170.0f; // default visible distance in instances, 170 yards
public const float DefaultVisibilityBGAreans = 533.0f; // default visible distance in BG/Arenas, roughly 533 yards
public const int DefaultVisibilityNotifyPeriod = 1000; public const int DefaultVisibilityNotifyPeriod = 1000;
public const int WorldTrigger = 12999; public const int WorldTrigger = 12999;
@@ -260,6 +262,16 @@ namespace Framework.Constants
3.14f // MOVE_PITCH_RATE 3.14f // MOVE_PITCH_RATE
}; };
public static float[] VisibilityDistances =
{
DefaultVisibilityDistance,
VisibilityDistanceTiny,
VisibilityDistanceSmall,
VisibilityDistanceLarge,
VisibilityDistanceGigantic,
MaxVisibilityDistance
};
//Todo move these else where //Todo move these else where
/// <summary> /// <summary>
/// Method Const /// Method Const
@@ -2389,4 +2401,16 @@ namespace Framework.Constants
{ {
Dungeon = 0x04 Dungeon = 0x04
} }
public enum VisibilityDistanceType
{
Normal = 0,
Tiny = 1,
Small = 2,
Large = 3,
Gigantic = 4,
Infinite = 5,
Max
}
} }
@@ -2136,6 +2136,10 @@ namespace Game.Entities
SetMovementAnimKitId(cainfo.movementAnimKit); SetMovementAnimKitId(cainfo.movementAnimKit);
SetMeleeAnimKitId(cainfo.meleeAnimKit); SetMeleeAnimKitId(cainfo.meleeAnimKit);
// Check if visibility distance different
if (cainfo.visibilityDistanceType != VisibilityDistanceType.Normal)
SetVisibilityDistanceOverride(cainfo.visibilityDistanceType);
//Load Path //Load Path
if (cainfo.path_id != 0) if (cainfo.path_id != 0)
m_path_id = cainfo.path_id; m_path_id = cainfo.path_id;
@@ -332,6 +332,7 @@ namespace Game.Entities
public ushort movementAnimKit; public ushort movementAnimKit;
public ushort meleeAnimKit; public ushort meleeAnimKit;
public uint[] auras; public uint[] auras;
public VisibilityDistanceType visibilityDistanceType;
} }
public class VendorItem public class VendorItem
+13 -1
View File
@@ -382,6 +382,18 @@ namespace Game.Entities
} }
} }
// Check if GameObject is Infinite
if (goInfo.IsInfiniteGameObject())
SetVisibilityDistanceOverride(VisibilityDistanceType.Infinite);
// Check if GameObject is Gigantic
if (goInfo.IsGiganticGameObject())
SetVisibilityDistanceOverride(VisibilityDistanceType.Gigantic);
// Check if GameObject is Large
if (goInfo.IsLargeGameObject())
SetVisibilityDistanceOverride(VisibilityDistanceType.Large);
return true; return true;
} }
@@ -1865,7 +1877,7 @@ namespace Game.Entities
return; return;
Player player = user.ToPlayer(); Player player = user.ToPlayer();
PlayerConditionRecord playerCondition = CliDB.PlayerConditionStorage.LookupByKey(info.artifactForge.conditionID1); PlayerConditionRecord playerCondition = CliDB.PlayerConditionStorage.LookupByKey(info.ArtifactForge.conditionID1);
if (playerCondition != null) if (playerCondition != null)
if (!ConditionManager.IsPlayerMeetingCondition(player, playerCondition)) if (!ConditionManager.IsPlayerMeetingCondition(player, playerCondition))
return; return;
@@ -180,7 +180,7 @@ namespace Game.Entities
public garrisonmonumentplaque GarrisonMonumentPlaque; public garrisonmonumentplaque GarrisonMonumentPlaque;
[FieldOffset(68)] [FieldOffset(68)]
public artifactforge artifactForge; public artifactforge ArtifactForge;
[FieldOffset(68)] [FieldOffset(68)]
public uilink UILink; public uilink UILink;
@@ -431,6 +431,90 @@ namespace Game.Entities
} }
} }
public bool IsInfiniteGameObject()
{
switch (type)
{
case GameObjectTypes.Door:
return Door.InfiniteAOI != 0;
case GameObjectTypes.FlagStand:
return FlagStand.InfiniteAOI != 0;
case GameObjectTypes.FlagDrop:
return FlagDrop.InfiniteAOI != 0;
case GameObjectTypes.TrapDoor:
return TrapDoor.InfiniteAOI != 0;
case GameObjectTypes.NewFlag:
return NewFlag.InfiniteAOI != 0;
default: return false;
}
}
public bool IsGiganticGameObject()
{
switch (type)
{
case GameObjectTypes.Door:
return Door.GiganticAOI != 0;
case GameObjectTypes.Button:
return Button.GiganticAOI != 0;
case GameObjectTypes.QuestGiver:
return QuestGiver.GiganticAOI != 0;
case GameObjectTypes.Chest:
return Chest.GiganticAOI != 0;
case GameObjectTypes.Generic:
return Generic.GiganticAOI != 0;
case GameObjectTypes.Trap:
return Trap.GiganticAOI != 0;
case GameObjectTypes.SpellFocus:
return SpellFocus.GiganticAOI != 0;
case GameObjectTypes.Goober:
return Goober.GiganticAOI != 0;
case GameObjectTypes.SpellCaster:
return SpellCaster.GiganticAOI != 0;
case GameObjectTypes.FlagStand:
return FlagStand.GiganticAOI != 0;
case GameObjectTypes.FlagDrop:
return FlagDrop.GiganticAOI != 0;
case GameObjectTypes.ControlZone:
return ControlZone.GiganticAOI != 0;
case GameObjectTypes.DungeonDifficulty:
return DungeonDifficulty.GiganticAOI != 0;
case GameObjectTypes.TrapDoor:
return TrapDoor.GiganticAOI != 0;
case GameObjectTypes.NewFlag:
return NewFlag.GiganticAOI != 0;
case GameObjectTypes.CapturePoint:
return CapturePoint.GiganticAOI != 0;
case GameObjectTypes.GarrisonShipment:
return GarrisonShipment.GiganticAOI != 0;
case GameObjectTypes.UILink:
return UILink.GiganticAOI != 0;
case GameObjectTypes.GatheringNode:
return GatheringNode.GiganticAOI != 0;
default: return false;
}
}
public bool IsLargeGameObject()
{
switch (type)
{
case GameObjectTypes.Chest:
return Chest.LargeAOI != 0;
case GameObjectTypes.Generic:
return Generic.LargeAOI != 0;
case GameObjectTypes.DungeonDifficulty:
return DungeonDifficulty.LargeAOI != 0;
case GameObjectTypes.GarrisonShipment:
return GarrisonShipment.LargeAOI != 0;
case GameObjectTypes.ArtifactForge:
return ArtifactForge.LargeAOI != 0;
case GameObjectTypes.GatheringNode:
return GatheringNode.LargeAOI != 0;
default: return false;
}
}
#region TypeStructs #region TypeStructs
public unsafe struct raw public unsafe struct raw
{ {
+18 -2
View File
@@ -1560,6 +1560,17 @@ namespace Game.Entities
} }
} }
bool IsVisibilityOverridden() { return m_visibilityDistanceOverride.HasValue; }
public void SetVisibilityDistanceOverride(VisibilityDistanceType type)
{
Cypher.Assert(type < VisibilityDistanceType.Max);
if (GetTypeId() == TypeId.Player)
return;
m_visibilityDistanceOverride.Set(SharedConst.VisibilityDistances[(int)type]);
}
public virtual void CleanupsBeforeDelete(bool finalCleanup = true) public virtual void CleanupsBeforeDelete(bool finalCleanup = true)
{ {
if (IsInWorld) if (IsInWorld)
@@ -1615,7 +1626,9 @@ namespace Game.Entities
public float GetVisibilityRange() public float GetVisibilityRange()
{ {
if (isActiveObject() && !IsTypeId(TypeId.Player)) if (IsVisibilityOverridden() && !IsTypeId(TypeId.Player))
return m_visibilityDistanceOverride.Value;
else if (isActiveObject() && !IsTypeId(TypeId.Player))
return SharedConst.MaxVisibilityDistance; return SharedConst.MaxVisibilityDistance;
else else
return GetMap().GetVisibilityRange(); return GetMap().GetVisibilityRange();
@@ -1627,7 +1640,9 @@ namespace Game.Entities
{ {
if (IsTypeId(TypeId.Player)) if (IsTypeId(TypeId.Player))
{ {
if (target != null && target.isActiveObject() && target.ToPlayer() == null) if (target != null && target.IsVisibilityOverridden() && !target.IsTypeId(TypeId.Player))
return target.m_visibilityDistanceOverride.Value;
else if (target != null && target.isActiveObject() && !target.IsTypeId(TypeId.Player))
return SharedConst.MaxVisibilityDistance; return SharedConst.MaxVisibilityDistance;
else if (ToPlayer().GetCinematicMgr().IsOnCinematic()) else if (ToPlayer().GetCinematicMgr().IsOnCinematic())
return SharedConst.DefaultVisibilityInstance; return SharedConst.DefaultVisibilityInstance;
@@ -2902,6 +2917,7 @@ namespace Game.Entities
public MovementInfo m_movementInfo; public MovementInfo m_movementInfo;
string _name; string _name;
protected bool m_isActive; protected bool m_isActive;
Optional<float> m_visibilityDistanceOverride;
bool m_isWorldObject; bool m_isWorldObject;
public ZoneScript m_zoneScript; public ZoneScript m_zoneScript;
+20 -6
View File
@@ -1913,8 +1913,8 @@ namespace Game
public void LoadCreatureTemplateAddons() public void LoadCreatureTemplateAddons()
{ {
var time = Time.GetMSTime(); var time = Time.GetMSTime();
// 0 1 2 3 4 5 6 7 8 9 // 0 1 2 3 4 5 6 7 8 9 10
SQLResult result = DB.World.Query("SELECT entry, path_id, mount, bytes1, bytes2, emote, aiAnimKit, movementAnimKit, meleeAnimKit, auras FROM creature_template_addon"); SQLResult result = DB.World.Query("SELECT entry, path_id, mount, bytes1, bytes2, emote, aiAnimKit, movementAnimKit, meleeAnimKit, visibilityDistanceType, auras FROM creature_template_addon");
if (result.IsEmpty()) if (result.IsEmpty())
{ {
@@ -1941,8 +1941,9 @@ namespace Game
creatureAddon.aiAnimKit = result.Read<ushort>(6); creatureAddon.aiAnimKit = result.Read<ushort>(6);
creatureAddon.movementAnimKit = result.Read<ushort>(7); creatureAddon.movementAnimKit = result.Read<ushort>(7);
creatureAddon.meleeAnimKit = result.Read<ushort>(8); creatureAddon.meleeAnimKit = result.Read<ushort>(8);
creatureAddon.visibilityDistanceType = (VisibilityDistanceType)result.Read<byte>(9);
var tokens = new StringArray(result.Read<string>(9), ' '); var tokens = new StringArray(result.Read<string>(10), ' ');
creatureAddon.auras = new uint[tokens.Length]; creatureAddon.auras = new uint[tokens.Length];
byte i = 0; byte i = 0;
@@ -2004,6 +2005,12 @@ namespace Game
creatureAddon.meleeAnimKit = 0; creatureAddon.meleeAnimKit = 0;
} }
if (creatureAddon.visibilityDistanceType >= VisibilityDistanceType.Max)
{
Log.outError(LogFilter.Sql, $"Creature (Entry: {entry}) has invalid visibilityDistanceType ({creatureAddon.visibilityDistanceType}) defined in `creature_template_addon`.");
creatureAddon.visibilityDistanceType = VisibilityDistanceType.Normal;
}
creatureTemplateAddonStorage.Add(entry, creatureAddon); creatureTemplateAddonStorage.Add(entry, creatureAddon);
count++; count++;
} }
@@ -2013,8 +2020,8 @@ namespace Game
public void LoadCreatureAddons() public void LoadCreatureAddons()
{ {
var time = Time.GetMSTime(); var time = Time.GetMSTime();
// 0 1 2 3 4 5 6 7 8 9 // 0 1 2 3 4 5 6 7 8 9 10
SQLResult result = DB.World.Query("SELECT guid, path_id, mount, bytes1, bytes2, emote, aiAnimKit, movementAnimKit, meleeAnimKit, auras FROM creature_addon"); SQLResult result = DB.World.Query("SELECT guid, path_id, mount, bytes1, bytes2, emote, aiAnimKit, movementAnimKit, meleeAnimKit, visibilityDistanceType, auras FROM creature_addon");
if (result.IsEmpty()) if (result.IsEmpty())
{ {
@@ -2049,8 +2056,9 @@ namespace Game
creatureAddon.aiAnimKit = result.Read<ushort>(6); creatureAddon.aiAnimKit = result.Read<ushort>(6);
creatureAddon.movementAnimKit = result.Read<ushort>(7); creatureAddon.movementAnimKit = result.Read<ushort>(7);
creatureAddon.meleeAnimKit = result.Read<ushort>(8); creatureAddon.meleeAnimKit = result.Read<ushort>(8);
creatureAddon.visibilityDistanceType = (VisibilityDistanceType)result.Read<byte>(9);
var tokens = new StringArray(result.Read<string>(9), ' '); var tokens = new StringArray(result.Read<string>(10), ' ');
byte i = 0; byte i = 0;
creatureAddon.auras = new uint[tokens.Length]; creatureAddon.auras = new uint[tokens.Length];
for (var c = 0; c < tokens.Length; ++c) for (var c = 0; c < tokens.Length; ++c)
@@ -2112,6 +2120,12 @@ namespace Game
creatureAddon.meleeAnimKit = 0; creatureAddon.meleeAnimKit = 0;
} }
if (creatureAddon.visibilityDistanceType >= VisibilityDistanceType.Max)
{
Log.outError(LogFilter.Sql, $"Creature (GUID: {guid}) has invalid visibilityDistanceType ({creatureAddon.visibilityDistanceType}) defined in `creature_addon`.");
creatureAddon.visibilityDistanceType = VisibilityDistanceType.Normal;
}
creatureAddonStorage.Add(guid, creatureAddon); creatureAddonStorage.Add(guid, creatureAddon);
count++; count++;
} while (result.NextRow()); } while (result.NextRow());
+3 -3
View File
@@ -1907,15 +1907,15 @@ Visibility.GroupMode = 1
# Visibility.Distance.Instances # Visibility.Distance.Instances
# Visibility.Distance.BGArenas # Visibility.Distance.BGArenas
# Description: Visibility distance to see other players or gameobjects. # Description: Visibility distance to see other players or gameobjects.
# Visibility on continents on retail ~90 yards. In BG/Arenas ~533. # Visibility on continents on retail ~100 yards. In BG/Arenas ~533.
# For instances default ~170. # For instances default ~170.
# Max limited by grid size: 533.33333 # Max limited by grid size: 533.33333
# Min limit is max aggro radius (45) * Rate.Creature.Aggro # Min limit is max aggro radius (45) * Rate.Creature.Aggro
# Default: 90 - (Visibility.Distance.Continents) # Default: 100 - (Visibility.Distance.Continents)
# 170 - (Visibility.Distance.Instances) # 170 - (Visibility.Distance.Instances)
# 533 - (Visibility.Distance.BGArenas) # 533 - (Visibility.Distance.BGArenas)
Visibility.Distance.Continents = 90 Visibility.Distance.Continents = 100
Visibility.Distance.Instances = 170 Visibility.Distance.Instances = 170
Visibility.Distance.BGArenas = 533 Visibility.Distance.BGArenas = 533
File diff suppressed because one or more lines are too long