summaryrefslogtreecommitdiffstats
path: root/src/Entities/Minecart.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Entities/Minecart.cpp')
-rw-r--r--src/Entities/Minecart.cpp72
1 files changed, 70 insertions, 2 deletions
diff --git a/src/Entities/Minecart.cpp b/src/Entities/Minecart.cpp
index d4eadc5d5..19eaa207f 100644
--- a/src/Entities/Minecart.cpp
+++ b/src/Entities/Minecart.cpp
@@ -871,11 +871,79 @@ bool cMinecart::TestEntityCollision(NIBBLETYPE a_RailMeta)
return true;
}
case E_META_RAIL_CURVED_ZM_XM:
+ case E_META_RAIL_CURVED_ZP_XP:
+ {
+ Vector3d Distance(
+ MinecartCollisionCallback.GetCollidedEntityPosition().x - GetPosX(),
+ 0,
+ MinecartCollisionCallback.GetCollidedEntityPosition().z - GetPosZ()
+ );
+
+ if ( Distance.z == 0. ) Distance.z = 0.0001;
+ if ( ((Distance.z>=0)&&((Distance.x/Distance.z)>=1)) || ((Distance.z<0)&&((Distance.x/Distance.z)<=1)) )
+ {
+ if ( (-GetSpeedX() * 0.4) < 0.01 )
+ {
+ AddSpeedX( -4/sqrt(2) );
+ AddSpeedZ( 4/sqrt(2) );
+ }
+ else
+ {
+ SetSpeedX( -GetSpeedX() * 0.4 );
+ SetSpeedZ( GetSpeedZ() * 0.4 );
+ }
+ }
+ else
+ {
+ if ((GetSpeedX() * 0.4) < 0.01)
+ {
+ AddSpeedX( 4/sqrt(2) );
+ AddSpeedZ( -4/sqrt(2) );
+ }
+ else
+ {
+ SetSpeedX( GetSpeedX() * 0.4 );
+ SetSpeedZ( -GetSpeedZ() * 0.4 );
+ }
+ }
+ break;
+ }
case E_META_RAIL_CURVED_ZM_XP:
case E_META_RAIL_CURVED_ZP_XM:
- case E_META_RAIL_CURVED_ZP_XP:
{
- // TODO - simply can't be bothered right now
+ Vector3d Distance(
+ MinecartCollisionCallback.GetCollidedEntityPosition().x - GetPosX(),
+ 0,
+ MinecartCollisionCallback.GetCollidedEntityPosition().z - GetPosZ()
+ );
+
+ if ( Distance.z == 0. ) Distance.z = 0.0001;
+ if ( ((Distance.z>=0)&&((Distance.x/Distance.z)<=-1)) || ((Distance.z<0)&&((Distance.x/Distance.z)>=-1)) )
+ {
+ if ( (GetSpeedX() * 0.4) < 0.01 )
+ {
+ AddSpeedX( 4/sqrt(2) );
+ AddSpeedZ( 4/sqrt(2) );
+ }
+ else
+ {
+ SetSpeedX( GetSpeedX() * 0.4 );
+ SetSpeedZ( GetSpeedZ() * 0.4 );
+ }
+ }
+ else
+ {
+ if ((-GetSpeedX() * 0.4) < 0.01)
+ {
+ AddSpeedX( -4/sqrt(2) );
+ AddSpeedZ( -4/sqrt(2) );
+ }
+ else
+ {
+ SetSpeedX( -GetSpeedX() * 0.4 );
+ SetSpeedZ( -GetSpeedZ() * 0.4 );
+ }
+ }
break;
}
default: break;