Vector clamping fixes
Thank you, @madmaxoft.
This commit is contained in:
parent
85fae0e521
commit
284c1c0514
@ -69,14 +69,18 @@ bool cArrowEntity::CanPickup(const cPlayer & a_Player) const
|
||||
void cArrowEntity::OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace)
|
||||
{
|
||||
Vector3d Hit = a_HitPos;
|
||||
Vector3d SinkMovement = GetSpeed() / 800;
|
||||
SinkMovement.Clamp(0.001, 0.001, 0.001, 0.05, 0.05, 0.05);
|
||||
Vector3d SinkMovement = GetSpeed() / 800; // Base value for arrow penetration
|
||||
SinkMovement = Clamp( // Adjust the movement so that fast arrows don't go through blocks (though in reality they would, in addition to exploding into fragments :P)
|
||||
SinkMovement,
|
||||
(SinkMovement * 0.001) / SinkMovement.Length(),
|
||||
(SinkMovement * 0.05) / SinkMovement.Length()
|
||||
);
|
||||
Hit += SinkMovement; // Make arrow sink into block a little
|
||||
|
||||
super::OnHitSolidBlock(Hit, a_HitFace);
|
||||
Hit.Floor();
|
||||
Vector3i BlockHit = Hit.Floor();
|
||||
|
||||
int X = Hit.x, Y = Hit.y, Z = Hit.z;
|
||||
int X = BlockHit.x, Y = BlockHit.y, Z = BlockHit.z;
|
||||
m_HitBlockPos = Vector3i(X, Y, Z);
|
||||
|
||||
// Broadcast arrow hit sound
|
||||
|
@ -135,19 +135,13 @@ public:
|
||||
}
|
||||
|
||||
/** Runs each value of the vector through std::floor() */
|
||||
inline void Floor(void)
|
||||
inline Vector3<T> Floor(void) const
|
||||
{
|
||||
x = (T)floor(x);
|
||||
y = (T)floor(y);
|
||||
z = (T)floor(z);
|
||||
}
|
||||
|
||||
/** Clamps each value in the vector to within a specified range */
|
||||
inline void Clamp(T a_MinX, T a_MinY, T a_MinZ, T a_MaxX, T a_MaxY, T a_MaxZ)
|
||||
{
|
||||
x = Clamp(x, (T)copysign(a_MinX, x), (T)copysign(a_MaxX, x));
|
||||
y = Clamp(y, (T)copysign(a_MinY, y), (T)copysign(a_MaxY, y));
|
||||
z = Clamp(z, (T)copysign(a_MinZ, z), (T)copysign(a_MaxZ, z));
|
||||
return Vector3<T>(
|
||||
(T)floor(x),
|
||||
(T)floor(y),
|
||||
(T)floor(z)
|
||||
);
|
||||
}
|
||||
|
||||
// tolua_end
|
||||
@ -162,6 +156,16 @@ public:
|
||||
return Equals(a_Rhs);
|
||||
}
|
||||
|
||||
inline bool operator > (const Vector3<T> & a_Rhs) const
|
||||
{
|
||||
return (SqrLength() > a_Rhs.SqrLength());
|
||||
}
|
||||
|
||||
inline bool operator < (const Vector3<T> & a_Rhs) const
|
||||
{
|
||||
return (SqrLength() < a_Rhs.SqrLength());
|
||||
}
|
||||
|
||||
inline void operator += (const Vector3<T> & a_Rhs)
|
||||
{
|
||||
x += a_Rhs.x;
|
||||
@ -305,11 +309,6 @@ protected:
|
||||
return (a_Value < 0) ? -a_Value : a_Value;
|
||||
}
|
||||
|
||||
/** Clamp X to the specified range. */
|
||||
T Clamp(T a_Value, T a_Min, T a_Max)
|
||||
{
|
||||
return (a_Value < a_Min) ? a_Min : ((a_Value > a_Max) ? a_Max : a_Value);
|
||||
}
|
||||
};
|
||||
// tolua_end
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user