Core/Spells: fix wrong distance calculations in AoE spells
Port From (https://github.com/TrinityCore/TrinityCore/commit/5d076cfe291980bc5be9d44ffbae887e3dd5ad59)
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
|
||||||
{
|
|
||||||
float dz = GetPositionZ() - obj.GetPositionZ();
|
|
||||||
distsq += dz * dz;
|
|
||||||
}
|
|
||||||
|
|
||||||
return distsq < maxdist * maxdist;
|
if (is3D)
|
||||||
|
return thisOrTransport.IsInDist(objOrObjTransport, maxdist);
|
||||||
|
else
|
||||||
|
return thisOrTransport.IsInDist2d(objOrObjTransport, 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)
|
||||||
|
|||||||
@@ -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())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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()));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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); }
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
+27
-11
@@ -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())
|
||||||
|
{
|
||||||
|
// isInRange including the dimension of the GO
|
||||||
|
bool isInRange = target.ToGameObject().IsInRange(_position.GetPositionX(), _position.GetPositionY(), _position.GetPositionZ(), _range);
|
||||||
|
if (!isInRange)
|
||||||
return false;
|
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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user