Core/Spells: fix wrong distance calculations in AoE spells

Port From (https://github.com/TrinityCore/TrinityCore/commit/5d076cfe291980bc5be9d44ffbae887e3dd5ad59)
This commit is contained in:
hondacrx
2020-05-06 14:34:20 -04:00
parent 95cca081de
commit ba885908b7
29 changed files with 202 additions and 118 deletions
+2 -2
View File
@@ -218,9 +218,9 @@ namespace Framework.Constants
/// <summary> /// <summary>
/// Object Const /// Object Const
/// </summary> /// </summary>
public const float DefaultWorldObjectSize = 0.388999998569489f; // player size, also currently used (correctly?) for any non Unit world objects public const float DefaultPlayerBoundingRadius = 0.388999998569489f; // player size, also currently used (correctly?) for any non Unit world objects
public const float AttackDistance = 5.0f; public const float AttackDistance = 5.0f;
public const float DefaultCombatReach = 1.5f; public const float DefaultPlayerCombatReach = 1.5f;
public const float MinMeleeReach = 2.0f; public const float MinMeleeReach = 2.0f;
public const float NominalMeleeRange = 5.0f; public const float NominalMeleeRange = 5.0f;
public const float MeleeRange = NominalMeleeRange - MinMeleeReach * 2; //center to center for players public const float MeleeRange = NominalMeleeRange - MinMeleeReach * 2; //center to center for players
@@ -2349,7 +2349,7 @@ namespace Framework.Constants
UnitDestAreaParty = 34, UnitDestAreaParty = 34,
UnitParty = 35, UnitParty = 35,
DestCasterUnk36 = 36, DestCasterUnk36 = 36,
UnitLastareaParty = 37, UnitLastAreaParty = 37,
UnitNearbyEntry = 38, UnitNearbyEntry = 38,
DestCasterFishing = 39, DestCasterFishing = 39,
GameobjectNearbyEntry = 40, GameobjectNearbyEntry = 40,
+1 -1
View File
@@ -724,7 +724,7 @@ namespace Game.Chat
return false; return false;
float x, y, z, o = handler.GetSession().GetPlayer().GetOrientation(); float x, y, z, o = handler.GetSession().GetPlayer().GetOrientation();
handler.GetSession().GetPlayer().GetClosePoint(out x, out y, out z, handler.GetSession().GetPlayer().GetObjectSize()); handler.GetSession().GetPlayer().GetClosePoint(out x, out y, out z, handler.GetSession().GetPlayer().GetCombatReach());
uint id = args.NextUInt32(); uint id = args.NextUInt32();
if (id == 0) if (id == 0)
+1 -1
View File
@@ -115,7 +115,7 @@ namespace Game.Chat
// before GM // before GM
float x, y, z; float x, y, z;
gmPlayer.GetClosePoint(out x, out y, out z, player.GetObjectSize()); gmPlayer.GetClosePoint(out x, out y, out z, player.GetCombatReach());
player.TeleportTo(gmPlayer.GetMapId(), x, y, z, player.GetOrientation()); player.TeleportTo(gmPlayer.GetMapId(), x, y, z, player.GetOrientation());
} }
+1 -1
View File
@@ -712,7 +712,7 @@ namespace Game.Chat
// before GM // before GM
float x, y, z; float x, y, z;
handler.GetSession().GetPlayer().GetClosePoint(out x, out y, out z, target.GetObjectSize()); handler.GetSession().GetPlayer().GetClosePoint(out x, out y, out z, target.GetCombatReach());
target.TeleportTo(handler.GetSession().GetPlayer().GetMapId(), x, y, z, target.GetOrientation()); target.TeleportTo(handler.GetSession().GetPlayer().GetMapId(), x, y, z, target.GetOrientation());
PhasingHandler.InheritPhaseShift(target, handler.GetSession().GetPlayer()); PhasingHandler.InheritPhaseShift(target, handler.GetSession().GetPlayer());
target.UpdateObjectVisibility(); target.UpdateObjectVisibility();
+1 -1
View File
@@ -392,7 +392,7 @@ namespace Game.Chat
// place pet before player // place pet before player
float x, y, z; float x, y, z;
player.GetClosePoint(out x, out y, out z, creatureTarget.GetObjectSize(), SharedConst.ContactDistance); player.GetClosePoint(out x, out y, out z, creatureTarget.GetCombatReach(), SharedConst.ContactDistance);
pet.Relocate(x, y, z, MathFunctions.PI - player.GetOrientation()); pet.Relocate(x, y, z, MathFunctions.PI - player.GetOrientation());
// set pet to defensive mode by default (some classes can't control controlled pets in fact). // set pet to defensive mode by default (some classes can't control controlled pets in fact).
+3 -3
View File
@@ -2094,7 +2094,7 @@ namespace Game.Entities
else else
{ {
// include sizes for huge npcs // include sizes for huge npcs
dist += GetObjectSize() + victim.GetObjectSize(); dist += GetCombatReach() + victim.GetCombatReach();
// to prevent creatures in air ignore attacks because distance is already too high... // to prevent creatures in air ignore attacks because distance is already too high...
if (GetCreatureTemplate().InhabitType.HasAnyFlag(InhabitType.Air)) if (GetCreatureTemplate().InhabitType.HasAnyFlag(InhabitType.Air))
@@ -2675,7 +2675,7 @@ namespace Game.Entities
if (minfo != null) if (minfo != null)
{ {
SetBoundingRadius((IsPet() ? 1.0f : minfo.BoundingRadius) * scale); SetBoundingRadius((IsPet() ? 1.0f : minfo.BoundingRadius) * scale);
SetCombatReach((IsPet() ? SharedConst.DefaultCombatReach : minfo.CombatReach) * scale); SetCombatReach((IsPet() ? SharedConst.DefaultPlayerCombatReach : minfo.CombatReach) * scale);
} }
} }
@@ -2687,7 +2687,7 @@ namespace Game.Entities
if (minfo != null) if (minfo != null)
{ {
SetBoundingRadius((IsPet() ? 1.0f : minfo.BoundingRadius) * GetObjectScale()); SetBoundingRadius((IsPet() ? 1.0f : minfo.BoundingRadius) * GetObjectScale());
SetCombatReach((IsPet() ? SharedConst.DefaultCombatReach : minfo.CombatReach) * GetObjectScale()); SetCombatReach((IsPet() ? SharedConst.DefaultPlayerCombatReach : minfo.CombatReach) * GetObjectScale());
} }
} }
@@ -2756,7 +2756,7 @@ namespace Game.Entities
public void RelocateStationaryPosition(float x, float y, float z, float o) { StationaryPosition.Relocate(x, y, z, o); } public void RelocateStationaryPosition(float x, float y, float z, float o) { StationaryPosition.Relocate(x, y, z, o); }
//! Object distance/size - overridden from Object._IsWithinDist. Needs to take in account proper GO size. //! Object distance/size - overridden from Object._IsWithinDist. Needs to take in account proper GO size.
public override bool _IsWithinDist(WorldObject obj, float dist2compare, bool is3D) public override bool _IsWithinDist(WorldObject obj, float dist2compare, bool is3D, bool incOwnRadius, bool incTargetRadius)
{ {
//! Following check does check 3d distance //! Following check does check 3d distance
return IsInRange(obj.GetPositionX(), obj.GetPositionY(), obj.GetPositionZ(), dist2compare); return IsInRange(obj.GetPositionX(), obj.GetPositionY(), obj.GetPositionZ(), dist2compare);
+7
View File
@@ -271,6 +271,13 @@ namespace Game.Entities
return true; return true;
} }
public bool IsWithinDoubleVerticalCylinder(Position center, float radius, float height)
{
float verticalDelta = GetPositionZ() - center.GetPositionZ();
return IsInDist2d(center, radius) && Math.Abs(verticalDelta) <= height;
}
public bool HasInArc(float arc, Position obj, float border = 2.0f) public bool HasInArc(float arc, Position obj, float border = 2.0f)
{ {
// always have self in arc // always have self in arc
+39 -51
View File
@@ -1406,7 +1406,7 @@ namespace Game.Entities
{ {
if (x == 0.0f && y == 0.0f && z == 0.0f) if (x == 0.0f && y == 0.0f && z == 0.0f)
{ {
GetClosePoint(out x, out y, out z, GetObjectSize()); GetClosePoint(out x, out y, out z, GetCombatReach());
ang = GetOrientation(); ang = GetOrientation();
} }
Position pos = new Position(); Position pos = new Position();
@@ -1434,7 +1434,7 @@ namespace Game.Entities
{ {
if (x == 0 && y == 0 && z == 0) if (x == 0 && y == 0 && z == 0)
{ {
GetClosePoint(out x, out y, out z, GetObjectSize()); GetClosePoint(out x, out y, out z, GetCombatReach());
ang = GetOrientation(); ang = GetOrientation();
} }
@@ -1569,20 +1569,12 @@ namespace Game.Entities
return playerList; return playerList;
} }
public float GetObjectSize()
{
Unit thisUnit = ToUnit();
if (thisUnit != null)
return thisUnit.m_unitData.CombatReach;
return SharedConst.DefaultWorldObjectSize;
}
public bool IsInPhase(WorldObject obj) public bool IsInPhase(WorldObject obj)
{ {
return GetPhaseShift().CanSee(obj.GetPhaseShift()); return GetPhaseShift().CanSee(obj.GetPhaseShift());
} }
public virtual float GetCombatReach() { return 0.0f; } // overridden (only) in Unit
public PhaseShift GetPhaseShift() { return _phaseShift; } public PhaseShift GetPhaseShift() { return _phaseShift; }
public void SetPhaseShift(PhaseShift phaseShift) { _phaseShift = new PhaseShift(phaseShift); } public void SetPhaseShift(PhaseShift phaseShift) { _phaseShift = new PhaseShift(phaseShift); }
public PhaseShift GetSuppressedPhaseShift() { return _suppressedPhaseShift; } public PhaseShift GetSuppressedPhaseShift() { return _suppressedPhaseShift; }
@@ -1772,39 +1764,32 @@ namespace Game.Entities
public float GetDistanceZ(WorldObject obj) public float GetDistanceZ(WorldObject obj)
{ {
float dz = Math.Abs(GetPositionZ() - obj.GetPositionZ()); float dz = Math.Abs(GetPositionZ() - obj.GetPositionZ());
float sizefactor = GetObjectSize() + obj.GetObjectSize(); float sizefactor = GetCombatReach() + obj.GetCombatReach();
float dist = dz - sizefactor; float dist = dz - sizefactor;
return (dist > 0 ? dist : 0); return (dist > 0 ? dist : 0);
} }
public virtual bool _IsWithinDist(WorldObject obj, float dist2compare, bool is3D) public virtual bool _IsWithinDist(WorldObject obj, float dist2compare, bool is3D, bool incOwnRadius = true, bool incTargetRadius = true)
{ {
float sizefactor = GetObjectSize() + obj.GetObjectSize(); float sizefactor = 0;
sizefactor += incOwnRadius ? GetCombatReach() : 0.0f;
sizefactor += incTargetRadius ? obj.GetCombatReach() : 0.0f;
float maxdist = dist2compare + sizefactor; float maxdist = dist2compare + sizefactor;
Position thisOrTransport = this;
Position objOrObjTransport = obj;
if (GetTransport() && obj.GetTransport() != null && obj.GetTransport().GetGUID() == GetTransport().GetGUID()) if (GetTransport() && obj.GetTransport() != null && obj.GetTransport().GetGUID() == GetTransport().GetGUID())
{ {
float dtx = m_movementInfo.transport.pos.posX - obj.m_movementInfo.transport.pos.posX; thisOrTransport = m_movementInfo.transport.pos;
float dty = m_movementInfo.transport.pos.posY - obj.m_movementInfo.transport.pos.posY; objOrObjTransport = obj.m_movementInfo.transport.pos;
float disttsq = dtx * dtx + dty * dty;
if (is3D)
{
float dtz = m_movementInfo.transport.pos.posZ - obj.m_movementInfo.transport.pos.posZ;
disttsq += dtz * dtz;
}
return disttsq < (maxdist * maxdist);
} }
float dx = GetPositionX() - obj.GetPositionX();
float dy = GetPositionY() - obj.GetPositionY();
float distsq = dx * dx + dy * dy;
if (is3D) if (is3D)
{ return thisOrTransport.IsInDist(objOrObjTransport, maxdist);
float dz = GetPositionZ() - obj.GetPositionZ(); else
distsq += dz * dz; return thisOrTransport.IsInDist2d(objOrObjTransport, maxdist);
}
return distsq < maxdist * maxdist;
} }
public bool IsWithinLOSInMap(WorldObject obj, ModelIgnoreFlags ignoreFlags = ModelIgnoreFlags.Nothing) public bool IsWithinLOSInMap(WorldObject obj, ModelIgnoreFlags ignoreFlags = ModelIgnoreFlags.Nothing)
@@ -1823,31 +1808,31 @@ namespace Game.Entities
public float GetDistance(WorldObject obj) public float GetDistance(WorldObject obj)
{ {
float d = GetExactDist(obj.GetPosition()) - GetObjectSize() - obj.GetObjectSize(); float d = GetExactDist(obj.GetPosition()) - GetCombatReach() - obj.GetCombatReach();
return d > 0.0f ? d : 0.0f; return d > 0.0f ? d : 0.0f;
} }
public float GetDistance(Position pos) public float GetDistance(Position pos)
{ {
float d = GetExactDist(pos) - GetObjectSize(); float d = GetExactDist(pos) - GetCombatReach();
return d > 0.0f ? d : 0.0f; return d > 0.0f ? d : 0.0f;
} }
public float GetDistance(float x, float y, float z) public float GetDistance(float x, float y, float z)
{ {
float d = GetExactDist(x, y, z) - GetObjectSize(); float d = GetExactDist(x, y, z) - GetCombatReach();
return d > 0.0f ? d : 0.0f; return d > 0.0f ? d : 0.0f;
} }
public float GetDistance2d(WorldObject obj) public float GetDistance2d(WorldObject obj)
{ {
float d = GetExactDist2d(obj.GetPosition()) - GetObjectSize() - obj.GetObjectSize(); float d = GetExactDist2d(obj.GetPosition()) - GetCombatReach() - obj.GetCombatReach();
return d > 0.0f ? d : 0.0f; return d > 0.0f ? d : 0.0f;
} }
public float GetDistance2d(float x, float y) public float GetDistance2d(float x, float y)
{ {
float d = GetExactDist2d(x, y) - GetObjectSize(); float d = GetExactDist2d(x, y) - GetCombatReach();
return d > 0.0f ? d : 0.0f; return d > 0.0f ? d : 0.0f;
} }
@@ -1868,22 +1853,22 @@ namespace Game.Entities
public bool IsWithinDist3d(float x, float y, float z, float dist) public bool IsWithinDist3d(float x, float y, float z, float dist)
{ {
return IsInDist(x, y, z, dist + GetObjectSize()); return IsInDist(x, y, z, dist + GetCombatReach());
} }
public bool IsWithinDist3d(Position pos, float dist) public bool IsWithinDist3d(Position pos, float dist)
{ {
return IsInDist(pos, dist + GetObjectSize()); return IsInDist(pos, dist + GetCombatReach());
} }
public bool IsWithinDist2d(float x, float y, float dist) public bool IsWithinDist2d(float x, float y, float dist)
{ {
return IsInDist2d(x, y, dist + GetObjectSize()); return IsInDist2d(x, y, dist + GetCombatReach());
} }
public bool IsWithinDist2d(Position pos, float dist) public bool IsWithinDist2d(Position pos, float dist)
{ {
return IsInDist2d(pos, dist + GetObjectSize()); return IsInDist2d(pos, dist + GetCombatReach());
} }
public bool IsWithinDist(WorldObject obj, float dist2compare, bool is3D = true) public bool IsWithinDist(WorldObject obj, float dist2compare, bool is3D = true)
@@ -1891,9 +1876,9 @@ namespace Game.Entities
return obj != null && _IsWithinDist(obj, dist2compare, is3D); return obj != null && _IsWithinDist(obj, dist2compare, is3D);
} }
public bool IsWithinDistInMap(WorldObject obj, float dist2compare, bool is3D = true) public bool IsWithinDistInMap(WorldObject obj, float dist2compare, bool is3D = true, bool incOwnRadius = true, bool incTargetRadius = true)
{ {
return obj && IsInMap(obj) && IsInPhase(obj) && _IsWithinDist(obj, dist2compare, is3D); return obj && IsInMap(obj) && IsInPhase(obj) && _IsWithinDist(obj, dist2compare, is3D, incOwnRadius, incTargetRadius);
} }
public bool IsWithinLOS(float ox, float oy, float oz, ModelIgnoreFlags ignoreFlags = ModelIgnoreFlags.Nothing) public bool IsWithinLOS(float ox, float oy, float oz, ModelIgnoreFlags ignoreFlags = ModelIgnoreFlags.Nothing)
@@ -1916,7 +1901,7 @@ namespace Game.Entities
{ {
Vector3 vThis = new Vector3(GetPositionX(), GetPositionY(), GetPositionZ()); Vector3 vThis = new Vector3(GetPositionX(), GetPositionY(), GetPositionZ());
Vector3 vObj = new Vector3(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ()); Vector3 vObj = new Vector3(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ());
Vector3 contactPoint = vThis + (vObj - vThis).directionOrZero() * Math.Min(dest.GetExactDist(GetPosition()), GetObjectSize()); Vector3 contactPoint = vThis + (vObj - vThis).directionOrZero() * Math.Min(dest.GetExactDist(GetPosition()), GetCombatReach());
return new Position(contactPoint.X, contactPoint.Y, contactPoint.Z, GetAngle(contactPoint.X, contactPoint.Y)); return new Position(contactPoint.X, contactPoint.Y, contactPoint.Z, GetAngle(contactPoint.X, contactPoint.Y));
} }
@@ -1963,7 +1948,7 @@ namespace Game.Entities
distsq += dz * dz; distsq += dz * dz;
} }
float sizefactor = GetObjectSize() + obj.GetObjectSize(); float sizefactor = GetCombatReach() + obj.GetCombatReach();
// check only for real range // check only for real range
if (minRange > 0.0f) if (minRange > 0.0f)
@@ -1977,7 +1962,10 @@ namespace Game.Entities
return distsq < maxdist * maxdist; return distsq < maxdist * maxdist;
} }
public bool IsInBetween(WorldObject obj1, WorldObject obj2, float size = 0) { return obj1 && obj2 && IsInBetween(obj1.GetPosition(), obj2.GetPosition(), size); } public bool IsInBetween(WorldObject obj1, WorldObject obj2, float size = 0)
{
return obj1 && obj2 && IsInBetween(obj1.GetPosition(), obj2.GetPosition(), size);
}
bool IsInBetween(Position pos1, Position pos2, float size) bool IsInBetween(Position pos1, Position pos2, float size)
{ {
float dist = GetExactDist2d(pos1); float dist = GetExactDist2d(pos1);
@@ -1987,7 +1975,7 @@ namespace Game.Entities
return false; return false;
if (size == 0) if (size == 0)
size = GetObjectSize() / 2; size = GetCombatReach() / 2;
float angle = pos1.GetAngle(pos2); float angle = pos1.GetAngle(pos2);
@@ -2112,8 +2100,8 @@ namespace Game.Entities
public void GetNearPoint2D(out float x, out float y, float distance2d, float absAngle) public void GetNearPoint2D(out float x, out float y, float distance2d, float absAngle)
{ {
x = (float)(GetPositionX() + (GetObjectSize() + distance2d) * Math.Cos(absAngle)); x = (float)(GetPositionX() + (GetCombatReach() + distance2d) * Math.Cos(absAngle));
y = (float)(GetPositionY() + (GetObjectSize() + distance2d) * Math.Sin(absAngle)); y = (float)(GetPositionY() + (GetCombatReach() + distance2d) * Math.Sin(absAngle));
GridDefines.NormalizeMapCoord(ref x); GridDefines.NormalizeMapCoord(ref x);
GridDefines.NormalizeMapCoord(ref y); GridDefines.NormalizeMapCoord(ref y);
@@ -2184,7 +2172,7 @@ namespace Game.Entities
public void GetContactPoint(WorldObject obj, out float x, out float y, out float z, float distance2d = 0.5f) public void GetContactPoint(WorldObject obj, out float x, out float y, out float z, float distance2d = 0.5f)
{ {
// angle to face `obj` to `this` using distance includes size of `obj` // angle to face `obj` to `this` using distance includes size of `obj`
GetNearPoint(obj, out x, out y, out z, obj.GetObjectSize(), distance2d, GetAngle(obj)); GetNearPoint(obj, out x, out y, out z, obj.GetCombatReach(), distance2d, GetAngle(obj));
} }
public void MovePosition(ref Position pos, float dist, float angle) public void MovePosition(ref Position pos, float dist, float angle)
+2 -2
View File
@@ -180,7 +180,7 @@ namespace Game.Entities
float px, py, pz; float px, py, pz;
if (IsCritter()) if (IsCritter())
{ {
owner.GetClosePoint(out px, out py, out pz, GetObjectSize(), SharedConst.PetFollowDist, GetFollowAngle()); owner.GetClosePoint(out px, out py, out pz, GetCombatReach(), SharedConst.PetFollowDist, GetFollowAngle());
Relocate(px, py, pz, owner.GetOrientation()); Relocate(px, py, pz, owner.GetOrientation());
if (!IsPositionValid()) if (!IsPositionValid())
@@ -233,7 +233,7 @@ namespace Game.Entities
SynchronizeLevelWithOwner(); SynchronizeLevelWithOwner();
// Set pet's position after setting level, its size depends on it // Set pet's position after setting level, its size depends on it
owner.GetClosePoint(out px, out py, out pz, GetObjectSize(), SharedConst.PetFollowDist, GetFollowAngle()); owner.GetClosePoint(out px, out py, out pz, GetCombatReach(), SharedConst.PetFollowDist, GetFollowAngle());
Relocate(px, py, pz, owner.GetOrientation()); Relocate(px, py, pz, owner.GetOrientation());
if (!IsPositionValid()) if (!IsPositionValid())
{ {
+2 -2
View File
@@ -6528,8 +6528,8 @@ namespace Game.Entities
public override void SetObjectScale(float scale) public override void SetObjectScale(float scale)
{ {
base.SetObjectScale(scale); base.SetObjectScale(scale);
SetBoundingRadius(scale * SharedConst.DefaultWorldObjectSize); SetBoundingRadius(scale * SharedConst.DefaultPlayerBoundingRadius);
SetCombatReach(scale * SharedConst.DefaultCombatReach); SetCombatReach(scale * SharedConst.DefaultPlayerCombatReach);
if (IsInWorld) if (IsInWorld)
SendMovementSetCollisionHeight(scale * GetCollisionHeight(IsMounted())); SendMovementSetCollisionHeight(scale * GetCollisionHeight(IsMounted()));
} }
+1 -1
View File
@@ -546,7 +546,7 @@ namespace Game.Entities
return attackerList; return attackerList;
} }
public float GetCombatReach() { return m_unitData.CombatReach; } public override float GetCombatReach() { return m_unitData.CombatReach; }
public void SetCombatReach(float combatReach) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.CombatReach), combatReach); } public void SetCombatReach(float combatReach) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.CombatReach), combatReach); }
public float GetBoundingRadius() { return m_unitData.BoundingRadius; } public float GetBoundingRadius() { return m_unitData.BoundingRadius; }
public void SetBoundingRadius(float boundingRadius) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.BoundingRadius), boundingRadius); } public void SetBoundingRadius(float boundingRadius) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.BoundingRadius), boundingRadius); }
+1 -1
View File
@@ -603,7 +603,7 @@ namespace Game.Entities
{ {
float combat_reach = GetCombatReach(); float combat_reach = GetCombatReach();
if (combat_reach < 0.1f) if (combat_reach < 0.1f)
combat_reach = SharedConst.DefaultCombatReach; combat_reach = SharedConst.DefaultPlayerCombatReach;
int attacker_number = GetAttackers().Count; int attacker_number = GetAttackers().Count;
if (attacker_number > 0) if (attacker_number > 0)
+1 -1
View File
@@ -2391,7 +2391,7 @@ namespace Game
} }
if (modelInfo.CombatReach < 0.1f) if (modelInfo.CombatReach < 0.1f)
modelInfo.CombatReach = SharedConst.DefaultCombatReach; modelInfo.CombatReach = SharedConst.DefaultPlayerCombatReach;
CreatureModelDataRecord modelData = CliDB.CreatureModelDataStorage.LookupByKey(creatureDisplay.ModelID); CreatureModelDataRecord modelData = CliDB.CreatureModelDataStorage.LookupByKey(creatureDisplay.ModelID);
if (modelData != null) if (modelData != null)
+1 -1
View File
@@ -120,7 +120,7 @@ namespace Game.Maps
{ {
//we should increase search radius by object's radius, otherwise //we should increase search radius by object's radius, otherwise
//we could have problems with huge creatures, which won't attack nearest players etc //we could have problems with huge creatures, which won't attack nearest players etc
Visit(standing_cell, visitor, map, obj.GetPositionX(), obj.GetPositionY(), radius + obj.GetObjectSize()); Visit(standing_cell, visitor, map, obj.GetPositionX(), obj.GetPositionY(), radius + obj.GetCombatReach());
} }
public void Visit(CellCoord standing_cell, Visitor visitor, Map map, float x_off, float y_off, float radius) public void Visit(CellCoord standing_cell, Visitor visitor, Map map, float x_off, float y_off, float radius)
+53 -8
View File
@@ -1610,37 +1610,55 @@ namespace Game.Maps
public class AnyFriendlyUnitInObjectRangeCheck : ICheck<Unit> public class AnyFriendlyUnitInObjectRangeCheck : ICheck<Unit>
{ {
public AnyFriendlyUnitInObjectRangeCheck(WorldObject obj, Unit funit, float range, bool playerOnly = false) public AnyFriendlyUnitInObjectRangeCheck(WorldObject obj, Unit funit, float range, bool playerOnly = false, bool incOwnRadius = true, bool incTargetRadius = true)
{ {
i_obj = obj; i_obj = obj;
i_funit = funit; i_funit = funit;
i_range = range; i_range = range;
i_playerOnly = playerOnly; i_playerOnly = playerOnly;
i_incOwnRadius = incOwnRadius;
i_incTargetRadius = incTargetRadius;
} }
public bool Invoke(Unit u) public bool Invoke(Unit u)
{ {
if (u.IsAlive() && i_obj.IsWithinDistInMap(u, i_range) && i_funit.IsFriendlyTo(u) && (!i_playerOnly || u.IsTypeId(TypeId.Player))) if (!u.IsAlive())
return true;
else
return false; return false;
float searchRadius = i_range;
if (i_incOwnRadius)
searchRadius += i_obj.GetCombatReach();
if (i_incTargetRadius)
searchRadius += u.GetCombatReach();
if (!u.IsInMap(i_obj) || !u.IsInPhase(i_obj) || !u.IsWithinDoubleVerticalCylinder(i_obj, searchRadius, searchRadius))
return false;
if (!i_funit.IsFriendlyTo(u))
return false;
return !i_playerOnly || u.GetTypeId() == TypeId.Player;
} }
WorldObject i_obj; WorldObject i_obj;
Unit i_funit; Unit i_funit;
float i_range; float i_range;
bool i_playerOnly; bool i_playerOnly;
bool i_incOwnRadius;
bool i_incTargetRadius;
} }
public class AnyGroupedUnitInObjectRangeCheck : ICheck<Unit> public class AnyGroupedUnitInObjectRangeCheck : ICheck<Unit>
{ {
public AnyGroupedUnitInObjectRangeCheck(WorldObject obj, Unit funit, float range, bool raid, bool playerOnly = false) public AnyGroupedUnitInObjectRangeCheck(WorldObject obj, Unit funit, float range, bool raid, bool playerOnly = false, bool incOwnRadius = true, bool incTargetRadius = true)
{ {
_source = obj; _source = obj;
_refUnit = funit; _refUnit = funit;
_range = range; _range = range;
_raid = raid; _raid = raid;
_playerOnly = playerOnly; _playerOnly = playerOnly;
i_incOwnRadius = incOwnRadius;
i_incTargetRadius = incTargetRadius;
} }
public bool Invoke(Unit u) public bool Invoke(Unit u)
@@ -1656,7 +1674,19 @@ namespace Game.Maps
else if (!_refUnit.IsInPartyWith(u)) else if (!_refUnit.IsInPartyWith(u))
return false; return false;
return !_refUnit.IsHostileTo(u) && u.IsAlive() && _source.IsWithinDistInMap(u, _range); if (_refUnit.IsHostileTo(u))
return false;
if (!u.IsAlive())
return false;
float searchRadius = _range;
if (i_incOwnRadius)
searchRadius += _source.GetCombatReach();
if (i_incTargetRadius)
searchRadius += u.GetCombatReach();
return u.IsInMap(_source) && u.IsInPhase(_source) && u.IsWithinDoubleVerticalCylinder(_source, searchRadius, searchRadius);
} }
WorldObject _source; WorldObject _source;
@@ -1664,6 +1694,8 @@ namespace Game.Maps
float _range; float _range;
bool _raid; bool _raid;
bool _playerOnly; bool _playerOnly;
bool i_incOwnRadius;
bool i_incTargetRadius;
} }
public class AnyUnitInObjectRangeCheck : ICheck<Unit> public class AnyUnitInObjectRangeCheck : ICheck<Unit>
@@ -1717,12 +1749,14 @@ namespace Game.Maps
public class AnyAoETargetUnitInObjectRangeCheck : ICheck<Unit> public class AnyAoETargetUnitInObjectRangeCheck : ICheck<Unit>
{ {
public AnyAoETargetUnitInObjectRangeCheck(WorldObject obj, Unit funit, float range, SpellInfo spellInfo = null) public AnyAoETargetUnitInObjectRangeCheck(WorldObject obj, Unit funit, float range, SpellInfo spellInfo = null, bool incOwnRadius = true, bool incTargetRadius = true)
{ {
i_obj = obj; i_obj = obj;
i_funit = funit; i_funit = funit;
_spellInfo = spellInfo; _spellInfo = spellInfo;
i_range = range; i_range = range;
i_incOwnRadius = incOwnRadius;
i_incTargetRadius = incTargetRadius;
if (_spellInfo == null) if (_spellInfo == null)
{ {
@@ -1741,13 +1775,24 @@ namespace Game.Maps
if (_spellInfo != null && _spellInfo.HasAttribute(SpellAttr3.OnlyTargetPlayers) && !u.IsPlayer()) if (_spellInfo != null && _spellInfo.HasAttribute(SpellAttr3.OnlyTargetPlayers) && !u.IsPlayer())
return false; return false;
return i_funit._IsValidAttackTarget(u, _spellInfo, i_obj.IsTypeId(TypeId.DynamicObject) ? i_obj : null) && i_obj.IsWithinDistInMap(u, i_range); if (!i_funit._IsValidAttackTarget(u, _spellInfo, i_obj.GetTypeId() == TypeId.DynamicObject ? i_obj : null))
return false;
float searchRadius = i_range;
if (i_incOwnRadius)
searchRadius += i_obj.GetCombatReach();
if (i_incTargetRadius)
searchRadius += u.GetCombatReach();
return u.IsInMap(i_obj) && u.IsInPhase(i_obj) && u.IsWithinDoubleVerticalCylinder(i_obj, searchRadius, searchRadius);
} }
WorldObject i_obj; WorldObject i_obj;
Unit i_funit; Unit i_funit;
SpellInfo _spellInfo; SpellInfo _spellInfo;
float i_range; float i_range;
bool i_incOwnRadius;
bool i_incTargetRadius;
} }
public class AnyDeadUnitCheck : ICheck<Unit> public class AnyDeadUnitCheck : ICheck<Unit>
@@ -173,7 +173,7 @@ namespace Game.Movement
float size = 0; float size = 0;
// Pets need special handling. // Pets need special handling.
// We need to subtract GetObjectSize() because it gets added back further down the chain // We need to subtract GetCombatReach() because it gets added back further down the chain
// and that makes pets too far away. Subtracting it allows pets to properly // and that makes pets too far away. Subtracting it allows pets to properly
// be (GetCombatReach() + i_offset) away. // be (GetCombatReach() + i_offset) away.
// Only applies when i_target is pet's owner otherwise pets and mobs end up // Only applies when i_target is pet's owner otherwise pets and mobs end up
@@ -181,12 +181,12 @@ namespace Game.Movement
if (owner.IsPet() && Target.IsTypeId(TypeId.Player)) if (owner.IsPet() && Target.IsTypeId(TypeId.Player))
{ {
dist = 1.0f;// target.GetCombatReach(); dist = 1.0f;// target.GetCombatReach();
size = 1.0f;// target.GetCombatReach() - target.GetObjectSize(); size = 1.0f;// target.GetCombatReach() - target.GetCombatReach();
} }
else else
{ {
dist = offset + 1.0f; dist = offset + 1.0f;
size = owner.GetObjectSize(); size = owner.GetCombatReach();
} }
if (Target.IsWithinDistInMap(owner, dist)) if (Target.IsWithinDistInMap(owner, dist))
+2 -2
View File
@@ -359,7 +359,7 @@ namespace Game.Movement
float dist = 2 * moveTimeHalf * speedXY; float dist = 2 * moveTimeHalf * speedXY;
float max_height = -MoveSpline.ComputeFallElevation(moveTimeHalf, false, -speedZ); float max_height = -MoveSpline.ComputeFallElevation(moveTimeHalf, false, -speedZ);
_owner.GetNearPoint(_owner, out x, out y, out z, _owner.GetObjectSize(), dist, _owner.GetAngle(srcX, srcY) + MathFunctions.PI); _owner.GetNearPoint(_owner, out x, out y, out z, _owner.GetCombatReach(), dist, _owner.GetAngle(srcX, srcY) + MathFunctions.PI);
MoveSplineInit init = new MoveSplineInit(_owner); MoveSplineInit init = new MoveSplineInit(_owner);
init.MoveTo(x, y, z); init.MoveTo(x, y, z);
@@ -383,7 +383,7 @@ namespace Game.Movement
float moveTimeHalf = (float)(speedZ / gravity); float moveTimeHalf = (float)(speedZ / gravity);
float dist = 2 * moveTimeHalf * speedXY; float dist = 2 * moveTimeHalf * speedXY;
_owner.GetClosePoint(out x, out y, out z, _owner.GetObjectSize(), dist, angle); _owner.GetClosePoint(out x, out y, out z, _owner.GetCombatReach(), dist, angle);
MoveJump(x, y, z, 0.0f, speedXY, speedZ); MoveJump(x, y, z, 0.0f, speedXY, speedZ);
} }
+2 -2
View File
@@ -377,14 +377,14 @@ namespace Game.Scripting
spellSummaryStorage[i].Targets |= 1 << ((int)SelectTargetType.SingleFriend - 1); spellSummaryStorage[i].Targets |= 1 << ((int)SelectTargetType.SingleFriend - 1);
// Spell targets AoE friends. // Spell targets AoE friends.
if (effect.TargetA.GetTarget() == Targets.UnitCasterAreaParty || effect.TargetA.GetTarget() == Targets.UnitLastareaParty || if (effect.TargetA.GetTarget() == Targets.UnitCasterAreaParty || effect.TargetA.GetTarget() == Targets.UnitLastAreaParty ||
effect.TargetA.GetTarget() == Targets.SrcCaster) effect.TargetA.GetTarget() == Targets.SrcCaster)
spellSummaryStorage[i].Targets |= 1 << ((int)SelectTargetType.AoeFriend - 1); spellSummaryStorage[i].Targets |= 1 << ((int)SelectTargetType.AoeFriend - 1);
// Spell targets any friend (or self). // Spell targets any friend (or self).
if (effect.TargetA.GetTarget() == Targets.UnitCaster || effect.TargetA.GetTarget() == Targets.UnitAlly || if (effect.TargetA.GetTarget() == Targets.UnitCaster || effect.TargetA.GetTarget() == Targets.UnitAlly ||
effect.TargetA.GetTarget() == Targets.UnitParty || effect.TargetA.GetTarget() == Targets.UnitCasterAreaParty || effect.TargetA.GetTarget() == Targets.UnitParty || effect.TargetA.GetTarget() == Targets.UnitCasterAreaParty ||
effect.TargetA.GetTarget() == Targets.UnitLastareaParty || effect.TargetA.GetTarget() == Targets.SrcCaster) effect.TargetA.GetTarget() == Targets.UnitLastAreaParty || effect.TargetA.GetTarget() == Targets.SrcCaster)
spellSummaryStorage[i].Targets |= 1 << ((int)SelectTargetType.AnyFriend - 1); spellSummaryStorage[i].Targets |= 1 << ((int)SelectTargetType.AnyFriend - 1);
// Make sure that this spell includes a damage effect. // Make sure that this spell includes a damage effect.
+5 -5
View File
@@ -2583,7 +2583,7 @@ namespace Game.Spells
case SpellEffectName.ApplyAreaAuraRaid: case SpellEffectName.ApplyAreaAuraRaid:
{ {
targetList.Add(GetUnitOwner()); targetList.Add(GetUnitOwner());
var u_check = new AnyGroupedUnitInObjectRangeCheck(GetUnitOwner(), GetUnitOwner(), radius, effect.Effect == SpellEffectName.ApplyAreaAuraRaid); var u_check = new AnyGroupedUnitInObjectRangeCheck(GetUnitOwner(), GetUnitOwner(), radius, effect.Effect == SpellEffectName.ApplyAreaAuraRaid, GetSpellInfo().HasAttribute(SpellAttr3.OnlyTargetPlayers), false, true);
var searcher = new UnitListSearcher(GetUnitOwner(), targetList, u_check); var searcher = new UnitListSearcher(GetUnitOwner(), targetList, u_check);
Cell.VisitAllObjects(GetUnitOwner(), searcher, radius); Cell.VisitAllObjects(GetUnitOwner(), searcher, radius);
break; break;
@@ -2591,14 +2591,14 @@ namespace Game.Spells
case SpellEffectName.ApplyAreaAuraFriend: case SpellEffectName.ApplyAreaAuraFriend:
{ {
targetList.Add(GetUnitOwner()); targetList.Add(GetUnitOwner());
var u_check = new AnyFriendlyUnitInObjectRangeCheck(GetUnitOwner(), GetUnitOwner(), radius); var u_check = new AnyFriendlyUnitInObjectRangeCheck(GetUnitOwner(), GetUnitOwner(), radius, GetSpellInfo().HasAttribute(SpellAttr3.OnlyTargetPlayers), false, true);
var searcher = new UnitListSearcher(GetUnitOwner(), targetList, u_check); var searcher = new UnitListSearcher(GetUnitOwner(), targetList, u_check);
Cell.VisitAllObjects(GetUnitOwner(), searcher, radius); Cell.VisitAllObjects(GetUnitOwner(), searcher, radius);
break; break;
} }
case SpellEffectName.ApplyAreaAuraEnemy: case SpellEffectName.ApplyAreaAuraEnemy:
{ {
var u_check = new AnyAoETargetUnitInObjectRangeCheck(GetUnitOwner(), GetUnitOwner(), radius); var u_check = new AnyAoETargetUnitInObjectRangeCheck(GetUnitOwner(), GetUnitOwner(), radius, GetSpellInfo(), false, true);
var searcher = new UnitListSearcher(GetUnitOwner(), targetList, u_check); var searcher = new UnitListSearcher(GetUnitOwner(), targetList, u_check);
Cell.VisitAllObjects(GetUnitOwner(), searcher, radius); Cell.VisitAllObjects(GetUnitOwner(), searcher, radius);
break; break;
@@ -2669,13 +2669,13 @@ namespace Game.Spells
List<Unit> targetList = new List<Unit>(); List<Unit> targetList = new List<Unit>();
if (effect.TargetB.GetTarget() == Targets.DestDynobjAlly || effect.TargetB.GetTarget() == Targets.UnitDestAreaAlly) if (effect.TargetB.GetTarget() == Targets.DestDynobjAlly || effect.TargetB.GetTarget() == Targets.UnitDestAreaAlly)
{ {
var u_check = new AnyFriendlyUnitInObjectRangeCheck(GetDynobjOwner(), dynObjOwnerCaster, radius, GetSpellInfo().HasAttribute(SpellAttr3.OnlyTargetPlayers)); var u_check = new AnyFriendlyUnitInObjectRangeCheck(GetDynobjOwner(), dynObjOwnerCaster, radius, GetSpellInfo().HasAttribute(SpellAttr3.OnlyTargetPlayers), false, true);
var searcher = new UnitListSearcher(GetDynobjOwner(), targetList, u_check); var searcher = new UnitListSearcher(GetDynobjOwner(), targetList, u_check);
Cell.VisitAllObjects(GetDynobjOwner(), searcher, radius); Cell.VisitAllObjects(GetDynobjOwner(), searcher, radius);
} }
else else
{ {
var u_check = new AnyAoETargetUnitInObjectRangeCheck(GetDynobjOwner(), dynObjOwnerCaster, radius); var u_check = new AnyAoETargetUnitInObjectRangeCheck(GetDynobjOwner(), dynObjOwnerCaster, radius, null, false, true);
var searcher = new UnitListSearcher(GetDynobjOwner(), targetList, u_check); var searcher = new UnitListSearcher(GetDynobjOwner(), targetList, u_check);
Cell.VisitAllObjects(GetDynobjOwner(), searcher, radius); Cell.VisitAllObjects(GetDynobjOwner(), searcher, radius);
} }
+28 -12
View File
@@ -735,7 +735,12 @@ namespace Game.Spells
SpellEffectInfo effect = GetEffect(effIndex); SpellEffectInfo effect = GetEffect(effIndex);
if (effect == null) if (effect == null)
return; return;
float radius = effect.CalcRadius(m_caster) * m_spellValue.RadiusMod; float radius = effect.CalcRadius(m_caster) * m_spellValue.RadiusMod;
// if this is a proximity based aoe (Frost Nova, Psychic Scream, ...), include the caster's own combat reach
if (targetType.IsProximityBasedAoe())
radius += GetCaster().GetCombatReach();
SearchAreaTargets(targets, radius, center, referer, targetType.GetObjectType(), targetType.GetCheckType(), effect.ImplicitTargetConditions); SearchAreaTargets(targets, radius, center, referer, targetType.GetObjectType(), targetType.GetCheckType(), effect.ImplicitTargetConditions);
CallScriptObjectAreaTargetSelectHandlers(targets, effIndex, targetType); CallScriptObjectAreaTargetSelectHandlers(targets, effIndex, targetType);
@@ -797,7 +802,7 @@ namespace Game.Spells
float dis = (float)RandomHelper.NextDouble() * (maxDist - minDist) + minDist; float dis = (float)RandomHelper.NextDouble() * (maxDist - minDist) + minDist;
float x, y, z; float x, y, z;
float angle = (float)RandomHelper.NextDouble() * (MathFunctions.PI * 35.0f / 180.0f) - (float)(Math.PI * 17.5f / 180.0f); float angle = (float)RandomHelper.NextDouble() * (MathFunctions.PI * 35.0f / 180.0f) - (float)(Math.PI * 17.5f / 180.0f);
m_caster.GetClosePoint(out x, out y, out z, SharedConst.DefaultWorldObjectSize, dis, angle); m_caster.GetClosePoint(out x, out y, out z, SharedConst.DefaultPlayerBoundingRadius, dis, angle);
float ground = m_caster.GetMap().GetHeight(m_caster.GetPhaseShift(), x, y, z, true, 50.0f); float ground = m_caster.GetMap().GetHeight(m_caster.GetPhaseShift(), x, y, z, true, 50.0f);
float liquidLevel = MapConst.VMAPInvalidHeightValue; float liquidLevel = MapConst.VMAPInvalidHeightValue;
@@ -830,7 +835,7 @@ namespace Game.Spells
{ {
float dist = effect.CalcRadius(m_caster); float dist = effect.CalcRadius(m_caster);
float angl = targetType.CalcDirectionAngle(); float angl = targetType.CalcDirectionAngle();
float objSize = m_caster.GetObjectSize(); float objSize = m_caster.GetCombatReach();
switch (targetType.GetTarget()) switch (targetType.GetTarget())
{ {
@@ -885,7 +890,7 @@ namespace Game.Spells
if (effect != null) if (effect != null)
{ {
float angle = targetType.CalcDirectionAngle(); float angle = targetType.CalcDirectionAngle();
float objSize = target.GetObjectSize(); float objSize = target.GetCombatReach();
float dist = effect.CalcRadius(m_caster); float dist = effect.CalcRadius(m_caster);
if (dist < objSize) if (dist < objSize)
dist = objSize; dist = objSize;
@@ -1108,7 +1113,7 @@ namespace Game.Spells
} }
} }
float size = Math.Max(obj.GetObjectSize(), 1.0f); float size = Math.Max(obj.GetCombatReach(), 1.0f);
float objDist2d = srcPos.GetExactDist2d(obj); float objDist2d = srcPos.GetExactDist2d(obj);
float dz = obj.GetPositionZ() - srcPos.posZ; float dz = obj.GetPositionZ() - srcPos.posZ;
@@ -4843,12 +4848,12 @@ namespace Game.Spells
if (!target.IsWithinLOSInMap(m_caster)) //Do full LoS/Path check. Don't exclude m2 if (!target.IsWithinLOSInMap(m_caster)) //Do full LoS/Path check. Don't exclude m2
return SpellCastResult.LineOfSight; return SpellCastResult.LineOfSight;
float objSize = target.GetObjectSize(); float objSize = target.GetCombatReach();
float range = m_spellInfo.GetMaxRange(true, m_caster, this) * 1.5f + objSize; // can't be overly strict float range = m_spellInfo.GetMaxRange(true, m_caster, this) * 1.5f + objSize; // can't be overly strict
m_preGeneratedPath.SetPathLengthLimit(range); m_preGeneratedPath.SetPathLengthLimit(range);
//first try with raycast, if it fails fall back to normal path //first try with raycast, if it fails fall back to normal path
float targetObjectSize = Math.Min(target.GetObjectSize(), 4.0f); float targetObjectSize = Math.Min(target.GetCombatReach(), 4.0f);
bool result = m_preGeneratedPath.CalculatePath(target.GetPositionX(), target.GetPositionY(), target.GetPositionZ() + targetObjectSize, false, true); bool result = m_preGeneratedPath.CalculatePath(target.GetPositionX(), target.GetPositionY(), target.GetPositionZ() + targetObjectSize, false, true);
if (m_preGeneratedPath.GetPathType().HasAnyFlag(PathType.Short)) if (m_preGeneratedPath.GetPathType().HasAnyFlag(PathType.Short))
return SpellCastResult.OutOfRange; return SpellCastResult.OutOfRange;
@@ -7746,8 +7751,7 @@ namespace Game.Spells
{ {
float _range; float _range;
Position _position; Position _position;
public WorldObjectSpellAreaTargetCheck(float range, Position position, Unit caster, public WorldObjectSpellAreaTargetCheck(float range, Position position, Unit caster, Unit referer, SpellInfo spellInfo, SpellTargetCheckTypes selectionType, List<Condition> condList)
Unit referer, SpellInfo spellInfo, SpellTargetCheckTypes selectionType, List<Condition> condList)
: base(caster, referer, spellInfo, selectionType, condList) : base(caster, referer, spellInfo, selectionType, condList)
{ {
_range = range; _range = range;
@@ -7757,8 +7761,20 @@ namespace Game.Spells
public override bool Invoke(WorldObject target) public override bool Invoke(WorldObject target)
{ {
if (!target.IsWithinDist3d(_position, _range) && !(target.IsTypeId(TypeId.GameObject) && target.ToGameObject().IsInRange(_position.posX, _position.posY, _position.posZ, _range))) if (target.ToGameObject())
return false; {
// isInRange including the dimension of the GO
bool isInRange = target.ToGameObject().IsInRange(_position.GetPositionX(), _position.GetPositionY(), _position.GetPositionZ(), _range);
if (!isInRange)
return false;
}
else
{
bool isInsideCylinder = target.IsWithinDist2d(_position, _range) && Math.Abs(target.GetPositionZ() - _position.GetPositionZ()) <= _range;
if (!isInsideCylinder)
return false;
}
return base.Invoke(target); return base.Invoke(target);
} }
} }
@@ -7780,7 +7796,7 @@ namespace Game.Spells
} }
else if (_spellInfo.HasAttribute(SpellCustomAttributes.ConeLine)) else if (_spellInfo.HasAttribute(SpellCustomAttributes.ConeLine))
{ {
if (!_caster.HasInLine(target, target.GetObjectSize(), _caster.GetObjectSize())) if (!_caster.HasInLine(target, target.GetCombatReach(), _caster.GetCombatReach()))
return false; return false;
} }
else else
@@ -7812,7 +7828,7 @@ namespace Game.Spells
public override bool Invoke(WorldObject target) public override bool Invoke(WorldObject target)
{ {
// return all targets on missile trajectory (0 - size of a missile) // return all targets on missile trajectory (0 - size of a missile)
if (!_caster.HasInLine(target, target.GetObjectSize(), SpellConst.TrajectoryMissileSize)) if (!_caster.HasInLine(target, target.GetCombatReach(), SpellConst.TrajectoryMissileSize))
return false; return false;
if (target.GetExactDist2d(_position) > _range) if (target.GetExactDist2d(_position) > _range)
+9 -9
View File
@@ -2034,7 +2034,7 @@ namespace Game.Spells
float dis = effectInfo.CalcRadius(m_caster); float dis = effectInfo.CalcRadius(m_caster);
float fx, fy, fz; float fx, fy, fz;
m_caster.GetClosePoint(out fx, out fy, out fz, unitTarget.GetObjectSize(), dis); m_caster.GetClosePoint(out fx, out fy, out fz, unitTarget.GetCombatReach(), dis);
unitTarget.NearTeleportTo(fx, fy, fz, -m_caster.GetOrientation(), unitTarget == m_caster); unitTarget.NearTeleportTo(fx, fy, fz, -m_caster.GetOrientation(), unitTarget == m_caster);
} }
@@ -2385,7 +2385,7 @@ namespace Game.Spells
Cypher.Assert(OldSummon.GetMap() == owner.GetMap()); Cypher.Assert(OldSummon.GetMap() == owner.GetMap());
float px, py, pz; float px, py, pz;
owner.GetClosePoint(out px, out py, out pz, OldSummon.GetObjectSize()); owner.GetClosePoint(out px, out py, out pz, OldSummon.GetCombatReach());
OldSummon.NearTeleportTo(px, py, pz, OldSummon.GetOrientation()); OldSummon.NearTeleportTo(px, py, pz, OldSummon.GetOrientation());
@@ -2402,7 +2402,7 @@ namespace Game.Spells
} }
float x, y, z; float x, y, z;
owner.GetClosePoint(out x, out y, out z, owner.GetObjectSize()); owner.GetClosePoint(out x, out y, out z, owner.GetCombatReach());
Pet pet = owner.SummonPet(petentry, x, y, z, owner.Orientation, PetType.Summon, 0); Pet pet = owner.SummonPet(petentry, x, y, z, owner.Orientation, PetType.Summon, 0);
if (!pet) if (!pet)
return; return;
@@ -2791,7 +2791,7 @@ namespace Game.Spells
if (m_targets.HasDst()) if (m_targets.HasDst())
destTarget.GetPosition(out x, out y, out z); destTarget.GetPosition(out x, out y, out z);
else else
m_caster.GetClosePoint(out x, out y, out z, SharedConst.DefaultWorldObjectSize); m_caster.GetClosePoint(out x, out y, out z, SharedConst.DefaultPlayerBoundingRadius);
Map map = target.GetMap(); Map map = target.GetMap();
@@ -3790,7 +3790,7 @@ namespace Game.Spells
destTarget.GetPosition(out x, out y, out z); destTarget.GetPosition(out x, out y, out z);
// Summon in random point all other units if location present // Summon in random point all other units if location present
else else
m_caster.GetClosePoint(out x, out y, out z, SharedConst.DefaultWorldObjectSize); m_caster.GetClosePoint(out x, out y, out z, SharedConst.DefaultPlayerBoundingRadius);
Map map = m_caster.GetMap(); Map map = m_caster.GetMap();
Position pos = new Position(x, y, z, m_caster.GetOrientation()); Position pos = new Position(x, y, z, m_caster.GetOrientation());
@@ -4094,7 +4094,7 @@ namespace Game.Spells
// Spell is not using explicit target - no generated path // Spell is not using explicit target - no generated path
if (m_preGeneratedPath.GetPathType() == PathType.Blank) if (m_preGeneratedPath.GetPathType() == PathType.Blank)
{ {
Position pos = unitTarget.GetFirstCollisionPosition(unitTarget.GetObjectSize(), unitTarget.GetRelativeAngle(m_caster.GetPosition())); Position pos = unitTarget.GetFirstCollisionPosition(unitTarget.GetCombatReach(), unitTarget.GetRelativeAngle(m_caster.GetPosition()));
if (MathFunctions.fuzzyGt(m_spellInfo.Speed, 0.0f) && m_spellInfo.HasAttribute(SpellAttr9.SpecialDelayCalculation)) if (MathFunctions.fuzzyGt(m_spellInfo.Speed, 0.0f) && m_spellInfo.HasAttribute(SpellAttr9.SpecialDelayCalculation))
speed = pos.GetExactDist(m_caster) / speed; speed = pos.GetExactDist(m_caster) / speed;
@@ -4530,7 +4530,7 @@ namespace Game.Spells
else if (effectInfo.HasRadius() && m_spellInfo.Speed == 0) else if (effectInfo.HasRadius() && m_spellInfo.Speed == 0)
{ {
float dis = effectInfo.CalcRadius(m_originalCaster); float dis = effectInfo.CalcRadius(m_originalCaster);
m_caster.GetClosePoint(out fx, out fy, out fz, SharedConst.DefaultWorldObjectSize, dis); m_caster.GetClosePoint(out fx, out fy, out fz, SharedConst.DefaultPlayerBoundingRadius, dis);
} }
else else
{ {
@@ -4539,7 +4539,7 @@ namespace Game.Spells
float max_dis = m_spellInfo.GetMaxRange(true); float max_dis = m_spellInfo.GetMaxRange(true);
float dis = (float)RandomHelper.NextDouble() * (max_dis - min_dis) + min_dis; float dis = (float)RandomHelper.NextDouble() * (max_dis - min_dis) + min_dis;
m_caster.GetClosePoint(out fx, out fy, out fz, SharedConst.DefaultWorldObjectSize, dis); m_caster.GetClosePoint(out fx, out fy, out fz, SharedConst.DefaultPlayerBoundingRadius, dis);
} }
Map cMap = m_caster.GetMap(); Map cMap = m_caster.GetMap();
@@ -4938,7 +4938,7 @@ namespace Game.Spells
// relocate // relocate
float px, py, pz; float px, py, pz;
unitTarget.GetClosePoint(out px, out py, out pz, pet.GetObjectSize(), SharedConst.PetFollowDist, pet.GetFollowAngle()); unitTarget.GetClosePoint(out px, out py, out pz, pet.GetCombatReach(), SharedConst.PetFollowDist, pet.GetFollowAngle());
pet.Relocate(px, py, pz, unitTarget.GetOrientation()); pet.Relocate(px, py, pz, unitTarget.GetOrientation());
// add to world // add to world
+28
View File
@@ -4598,6 +4598,34 @@ namespace Game.Spells
return GetSelectionCategory() == SpellTargetSelectionCategories.Area || GetSelectionCategory() == SpellTargetSelectionCategories.Cone; return GetSelectionCategory() == SpellTargetSelectionCategories.Area || GetSelectionCategory() == SpellTargetSelectionCategories.Cone;
} }
public bool IsProximityBasedAoe()
{
switch (_target)
{
case Targets.UnitSrcAreaEntry:
case Targets.UnitSrcAreaEnemy:
case Targets.UnitCasterAreaParty:
case Targets.UnitSrcAreaAlly:
case Targets.UnitSrcAreaParty:
case Targets.UnitLastAreaParty:
case Targets.GameobjectSrcArea:
case Targets.UnitCasterAreaRaid:
case Targets.CorpseSrcAreaEnemy:
return true;
case Targets.UnitDestAreaEntry:
case Targets.UnitDestAreaEnemy:
case Targets.UnitDestAreaAlly:
case Targets.UnitDestAreaParty:
case Targets.GameobjectDestArea:
case Targets.UnitAreaRaidClass:
return false;
default:
Log.outWarn(LogFilter.Spells, "SpellImplicitTargetInfo.IsProximityBasedAoe called a non-aoe spell");
return false;
}
}
public SpellTargetSelectionCategories GetSelectionCategory() public SpellTargetSelectionCategories GetSelectionCategory()
{ {
return _data[(int)_target].SelectionCategory; return _data[(int)_target].SelectionCategory;
@@ -102,7 +102,7 @@ namespace Scripts.Northrend.DraktharonKeep.KingDred
DoCastVictim(SpellIds.RaptorCall); DoCastVictim(SpellIds.RaptorCall);
float x, y, z; float x, y, z;
me.GetClosePoint(out x, out y, out z, me.GetObjectSize() / 3, 10.0f); me.GetClosePoint(out x, out y, out z, me.GetCombatReach() / 3, 10.0f);
me.SummonCreature(RandomHelper.RAND(DTKCreatureIds.DrakkariGutripper, DTKCreatureIds.DrakkariScytheclaw), x, y, z, 0, TempSummonType.DeadDespawn, 1000); me.SummonCreature(RandomHelper.RAND(DTKCreatureIds.DrakkariGutripper, DTKCreatureIds.DrakkariScytheclaw), x, y, z, 0, TempSummonType.DeadDespawn, 1000);
task.Repeat(); task.Repeat();
}); });
@@ -137,7 +137,7 @@ namespace Scripts.Northrend.FrozenHalls.ForgeOfSouls.Bronjahm
{ {
summons.Summon(summon); summons.Summon(summon);
summon.SetReactState(ReactStates.Passive); summon.SetReactState(ReactStates.Passive);
summon.GetMotionMaster().MoveFollow(me, me.GetObjectSize(), 0.0f); summon.GetMotionMaster().MoveFollow(me, me.GetCombatReach(), 0.0f);
summon.CastSpell(summon, SpellIds.PurpleBanishVisual, true); summon.CastSpell(summon, SpellIds.PurpleBanishVisual, true);
} }
} }
@@ -359,7 +359,7 @@ namespace Scripts.Northrend.IcecrownCitadel
{ {
float ang = Position.NormalizeOrientation(pos.GetAngle(me)); float ang = Position.NormalizeOrientation(pos.GetAngle(me));
me.SetOrientation(ang); me.SetOrientation(ang);
owner.GetNearPoint2D(out pos.posX, out pos.posY, 5.0f - owner.GetObjectSize(), ang); owner.GetNearPoint2D(out pos.posX, out pos.posY, 5.0f - owner.GetCombatReach(), ang);
} }
else else
{ {
@@ -372,7 +372,7 @@ namespace Scripts.Northrend.IcecrownCitadel
float ang = Position.NormalizeOrientation(pos.GetAngle(target)); float ang = Position.NormalizeOrientation(pos.GetAngle(target));
me.SetOrientation(ang); me.SetOrientation(ang);
owner.GetNearPoint2D(out pos.posX, out pos.posY, 15.0f - owner.GetObjectSize(), ang); owner.GetNearPoint2D(out pos.posX, out pos.posY, 15.0f - owner.GetCombatReach(), ang);
} }
me.NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), me.GetPositionZ(), me.GetOrientation()); me.NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), me.GetPositionZ(), me.GetOrientation());
@@ -471,7 +471,7 @@ namespace Scripts.Northrend.IcecrownCitadel
{ {
targets.Clear(); targets.Clear();
// select any unit but not the tank (by owners threatlist) // select any unit but not the tank (by owners threatlist)
Unit target = GetCaster().GetAI().SelectTarget(SelectAggroTarget.Random, 1, -GetCaster().GetObjectSize(), true, -(int)Spells.Impaled); Unit target = GetCaster().GetAI().SelectTarget(SelectAggroTarget.Random, 1, -GetCaster().GetCombatReach(), true, -(int)Spells.Impaled);
if (!target) if (!target)
target = GetCaster().GetAI().SelectTarget(SelectAggroTarget.Random, 0, 0.0f, true); // or the tank if its solo target = GetCaster().GetAI().SelectTarget(SelectAggroTarget.Random, 0, 0.0f, true); // or the tank if its solo
if (!target) if (!target)
+1 -1
View File
@@ -452,7 +452,7 @@ namespace Scripts.World
uint BirdEntry = 0; uint BirdEntry = 0;
float fX, fY, fZ; float fX, fY, fZ;
go.GetClosePoint(out fX, out fY, out fZ, go.GetObjectSize(), SharedConst.InteractionDistance); go.GetClosePoint(out fX, out fY, out fZ, go.GetCombatReach(), SharedConst.InteractionDistance);
switch (go.GetEntry()) switch (go.GetEntry())
{ {
+1 -1
View File
@@ -250,7 +250,7 @@ namespace Scripts.World
return true; return true;
float x, y, z; float x, y, z;
go.GetClosePoint(out x, out y, out z, go.GetObjectSize() / 3, 7.0f); go.GetClosePoint(out x, out y, out z, go.GetCombatReach() / 3, 7.0f);
go.SummonGameObject(ItemScriptConst.GoHighQualityFur, go, Quaternion.fromEulerAnglesZYX(go.GetOrientation(), 0.0f, 0.0f), 1); go.SummonGameObject(ItemScriptConst.GoHighQualityFur, go, Quaternion.fromEulerAnglesZYX(go.GetOrientation(), 0.0f, 0.0f), 1);
TempSummon summon = player.SummonCreature(ItemScriptConst.NpcNesingwaryTrapper, x, y, z, go.GetOrientation(), TempSummonType.DeadDespawn, 1000); TempSummon summon = player.SummonCreature(ItemScriptConst.NpcNesingwaryTrapper, x, y, z, go.GetOrientation(), TempSummonType.DeadDespawn, 1000);
if (summon) if (summon)