summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristophe Piveteau <chripiveteau@gmail.com>2014-08-15 13:40:56 +0200
committerChristophe Piveteau <chripiveteau@gmail.com>2014-08-15 13:40:56 +0200
commit0f631febfc3f670e8e9eb60ec4f89659ad7d0c71 (patch)
tree9ca34729c04f9d2066876b3b93b461a2097b98f8
parentFurther changes in coding style (diff)
downloadcuberite-0f631febfc3f670e8e9eb60ec4f89659ad7d0c71.tar
cuberite-0f631febfc3f670e8e9eb60ec4f89659ad7d0c71.tar.gz
cuberite-0f631febfc3f670e8e9eb60ec4f89659ad7d0c71.tar.bz2
cuberite-0f631febfc3f670e8e9eb60ec4f89659ad7d0c71.tar.lz
cuberite-0f631febfc3f670e8e9eb60ec4f89659ad7d0c71.tar.xz
cuberite-0f631febfc3f670e8e9eb60ec4f89659ad7d0c71.tar.zst
cuberite-0f631febfc3f670e8e9eb60ec4f89659ad7d0c71.zip
-rw-r--r--src/Entities/Minecart.cpp31
1 files changed, 21 insertions, 10 deletions
diff --git a/src/Entities/Minecart.cpp b/src/Entities/Minecart.cpp
index 8e11d8a07..0455c9ab3 100644
--- a/src/Entities/Minecart.cpp
+++ b/src/Entities/Minecart.cpp
@@ -875,17 +875,23 @@ bool cMinecart::TestEntityCollision(NIBBLETYPE a_RailMeta)
{
Vector3d Distance = MinecartCollisionCallback.GetCollidedEntityPosition() - Vector3d(GetPosX(), 0, GetPosZ());
+ // Prevent division by small numbers
Distance.z = std::max(Distance.z, 0.001);
+ /* 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).
+ The minecart moves along the line z = -x, the perpendicular line to this is z = x.
+ 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 (
((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 / sqrt(2)) < 0.01)
{
- AddSpeedX(-4/sqrt(2));
- AddSpeedZ(4/sqrt(2));
+ AddSpeedX(-4 / sqrt(2));
+ AddSpeedZ(4 / sqrt(2));
}
else
{
@@ -893,10 +899,10 @@ bool cMinecart::TestEntityCollision(NIBBLETYPE a_RailMeta)
SetSpeedZ(GetSpeedZ() * 0.4);
}
}
- else if ((GetSpeedX() * 0.4) < 0.01)
+ else if ((GetSpeedX() * 0.4 / sqrt(2)) < 0.01)
{
- AddSpeedX(4/sqrt(2));
- AddSpeedZ(-4/sqrt(2));
+ AddSpeedX(4 / sqrt(2));
+ AddSpeedZ(-4 / sqrt(2));
}
else
{
@@ -910,8 +916,13 @@ bool cMinecart::TestEntityCollision(NIBBLETYPE a_RailMeta)
{
Vector3d Distance = MinecartCollisionCallback.GetCollidedEntityPosition() - Vector3d(GetPosX(), 0, GetPosZ());
+ // Prevent division by small numbers
Distance.z = std::max(Distance.z, 0.001);
+ /* 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).
+ The minecart moves along the line z = x, the perpendicular line to this is z = -x.
+ 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 (
((Distance.z > 0) && ((Distance.x / Distance.z) <= -1)) ||
((Distance.z < 0) && ((Distance.x / Distance.z) >= -1))
@@ -919,8 +930,8 @@ bool cMinecart::TestEntityCollision(NIBBLETYPE a_RailMeta)
{
if ((GetSpeedX() * 0.4) < 0.01)
{
- AddSpeedX(4/sqrt(2));
- AddSpeedZ(4/sqrt(2));
+ AddSpeedX(4 / sqrt(2));
+ AddSpeedZ(4 / sqrt(2));
}
else
{
@@ -930,8 +941,8 @@ bool cMinecart::TestEntityCollision(NIBBLETYPE a_RailMeta)
}
else if ((-GetSpeedX() * 0.4) < 0.01)
{
- AddSpeedX(-4/sqrt(2));
- AddSpeedZ(-4/sqrt(2));
+ AddSpeedX(-4 / sqrt(2));
+ AddSpeedZ(-4 / sqrt(2));
}
else
{