1
0

Added a lot of comments

This commit is contained in:
Christophe Piveteau 2014-08-15 17:54:43 +02:00
parent c473d8cfb8
commit 72c02ceb17

View File

@ -876,7 +876,10 @@ bool cMinecart::TestEntityCollision(NIBBLETYPE a_RailMeta)
Vector3d Distance = MinecartCollisionCallback.GetCollidedEntityPosition() - Vector3d(GetPosX(), 0, GetPosZ()); Vector3d Distance = MinecartCollisionCallback.GetCollidedEntityPosition() - Vector3d(GetPosX(), 0, GetPosZ());
// Prevent division by small numbers // Prevent division by small numbers
Distance.z = std::max(Distance.z, 0.001); if (abs(Distance.z) < 0.001)
{
Distance.z = 0.001;
}
/* Check to which side the minecart is to be pushed. /* Check to which side the minecart is to be pushed.
Let's consider a z-x-coordinate system where the minecart is the center (0/0). Let's consider a z-x-coordinate system where the minecart is the center (0/0).
@ -886,27 +889,27 @@ bool cMinecart::TestEntityCollision(NIBBLETYPE a_RailMeta)
((Distance.z > 0) && ((Distance.x / Distance.z) >= 1)) || ((Distance.z > 0) && ((Distance.x / Distance.z) >= 1)) ||
((Distance.z < 0) && ((Distance.x / Distance.z) <= 1)) ((Distance.z < 0) && ((Distance.x / Distance.z) <= 1))
) )
{ { // Moving -X + Z
if ((-GetSpeedX() * 0.4 / sqrt(2)) < 0.01) if ((-GetSpeedX() * 0.4 / sqrt(2)) < 0.01) // ~ speedX >= 0
{ { // Immobile or not moving in the "right" direction. Give it a bump!
AddSpeedX(-4 / sqrt(2)); AddSpeedX(-4 / sqrt(2));
AddSpeedZ(4 / sqrt(2)); AddSpeedZ(4 / sqrt(2));
} }
else else // ~ SpeedX < 0
{ { // Moving in the "right" direction. Only accelerate it a bit.
SetSpeedX(-GetSpeedX() * 0.4); SetSpeedX(GetSpeedX() * 0.4 / sqrt(2));
SetSpeedZ(GetSpeedZ() * 0.4); SetSpeedZ(GetSpeedZ() * 0.4 / sqrt(2));
} }
} } // Moving +X -Z
else if ((GetSpeedX() * 0.4 / sqrt(2)) < 0.01) else if ((GetSpeedX() * 0.4 / sqrt(2)) < 0.01) // ~ SpeedX <= 0
{ { // Immobile or not moving in the "right" direction
AddSpeedX(4 / sqrt(2)); AddSpeedX(4 / sqrt(2));
AddSpeedZ(-4 / sqrt(2)); AddSpeedZ(-4 / sqrt(2));
} }
else else // ~ SpeedX > 0
{ { // Moving in the "right" direction
SetSpeedX(GetSpeedX() * 0.4); SetSpeedX(GetSpeedX() * 0.4 / sqrt(2));
SetSpeedZ(-GetSpeedZ() * 0.4); SetSpeedZ(GetSpeedZ() * 0.4 / sqrt(2));
} }
break; break;
} }
@ -916,37 +919,40 @@ bool cMinecart::TestEntityCollision(NIBBLETYPE a_RailMeta)
Vector3d Distance = MinecartCollisionCallback.GetCollidedEntityPosition() - Vector3d(GetPosX(), 0, GetPosZ()); Vector3d Distance = MinecartCollisionCallback.GetCollidedEntityPosition() - Vector3d(GetPosX(), 0, GetPosZ());
// Prevent division by small numbers // Prevent division by small numbers
Distance.z = std::max(Distance.z, 0.001); if (abs(Distance.z) < 0.001)
{
Distance.z = 0.001;
}
/* Check to which side the minecart is to be pushed. /* Check to which side the minecart is to be pushed.
Let's consider a z-x-coordinate system where the minecart is the center (0/0). Let's consider a z-x-coordinate system where the minecart is the center (0/0).
The minecart moves along the line x = z, the perpendicular line to this is x = -z. The minecart moves along the line x = z, the perpendicular line to this is x = -z.
In order to decide to which side the minecart is to be pushed, it must be checked on what side of the perpendicular line the pushing entity is located. */ In order to decide to which side the minecart is to be pushed, it must be checked on what side of the perpendicular line the pushing entity is located. */
if ( if ( // Moving +X +Z
((Distance.z > 0) && ((Distance.x / Distance.z) <= -1)) || ((Distance.z > 0) && ((Distance.x / Distance.z) <= -1)) ||
((Distance.z < 0) && ((Distance.x / Distance.z) >= -1)) ((Distance.z < 0) && ((Distance.x / Distance.z) >= -1))
) )
{ {
if ((GetSpeedX() * 0.4) < 0.01) if ((GetSpeedX() * 0.4) < 0.01) // ~ SpeedX <= 0
{ { // Immobile or not moving in the "right" direction
AddSpeedX(4 / sqrt(2)); AddSpeedX(4 / sqrt(2));
AddSpeedZ(4 / sqrt(2)); AddSpeedZ(4 / sqrt(2));
} }
else else // SpeedX > 0
{ { // Moving in the "right" direction
SetSpeedX(GetSpeedX() * 0.4); SetSpeedX(GetSpeedX() * 0.4 / sqrt(2));
SetSpeedZ(GetSpeedZ() * 0.4); SetSpeedZ(GetSpeedZ() * 0.4 / sqrt(2));
} }
} } // Moving -X -Z
else if ((-GetSpeedX() * 0.4) < 0.01) else if ((-GetSpeedX() * 0.4) < 0.01) // ~ SpeedX >= 0
{ { // Immobile or not moving in the "right" direction
AddSpeedX(-4 / sqrt(2)); AddSpeedX(-4 / sqrt(2));
AddSpeedZ(-4 / sqrt(2)); AddSpeedZ(-4 / sqrt(2));
} }
else else // ~ SpeedX < 0
{ { // Moving in the "right" direction
SetSpeedX(-GetSpeedX() * 0.4); SetSpeedX(GetSpeedX() * 0.4 / sqrt(2));
SetSpeedZ(-GetSpeedZ() * 0.4); SetSpeedZ(GetSpeedZ() * 0.4 / sqrt(2));
} }
break; break;
} }