From 01a100dc97aa27d8cd9a755212e144e326dce0db Mon Sep 17 00:00:00 2001 From: Marvin Kopf Date: Sun, 21 Feb 2016 02:46:36 +0100 Subject: Add speed limit enforcement for minecarts --- src/Entities/Minecart.cpp | 92 ++++++++++++++++++++++++++--------------------- src/Entities/Minecart.h | 3 ++ 2 files changed, 54 insertions(+), 41 deletions(-) diff --git a/src/Entities/Minecart.cpp b/src/Entities/Minecart.cpp index ea51c49c8..1b037e830 100644 --- a/src/Entities/Minecart.cpp +++ b/src/Entities/Minecart.cpp @@ -277,11 +277,8 @@ void cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::millisecon if (GetSpeedZ() >= 0) { // SpeedZ POSITIVE, going SOUTH - if (GetSpeedZ() <= MAX_SPEED) // Speed limit - { - AddSpeedZ(0.5); // Speed up - SetSpeedY(-GetSpeedZ()); // Downward movement is negative (0 minus positive numbers is negative) - } + AddSpeedZ(0.5); // Speed up + SetSpeedY(-GetSpeedZ()); // Downward movement is negative (0 minus positive numbers is negative) } else { @@ -304,12 +301,9 @@ void cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::millisecon } else { - if (GetSpeedZ() >= MAX_SPEED_NEGATIVE) // Speed limit - { - // SpeedZ NEGATIVE, going NORTH - AddSpeedZ(-0.5); // Speed up - SetSpeedY(GetSpeedZ()); // Downward movement negative - } + // SpeedZ NEGATIVE, going NORTH + AddSpeedZ(-0.5); // Speed up + SetSpeedY(GetSpeedZ()); // Downward movement negative } break; } @@ -320,11 +314,8 @@ void cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::millisecon if (GetSpeedX() >= NO_SPEED) { - if (GetSpeedX() <= MAX_SPEED) - { - AddSpeedX(0.5); - SetSpeedY(-GetSpeedX()); - } + AddSpeedX(0.5); + SetSpeedY(-GetSpeedX()); } else { @@ -345,11 +336,8 @@ void cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::millisecon } else { - if (GetSpeedX() >= MAX_SPEED_NEGATIVE) - { - AddSpeedX(-0.5); - SetSpeedY(GetSpeedX()); - } + AddSpeedX(-0.5); + SetSpeedY(GetSpeedX()); } break; } @@ -484,11 +472,8 @@ void cMinecart::HandlePoweredRailPhysics(NIBBLETYPE a_RailMeta) if (GetSpeedX() >= NO_SPEED) { - if (GetSpeedX() <= MAX_SPEED) - { - AddSpeedX(AccelDecelSpeed); - SetSpeedY(-GetSpeedX()); - } + AddSpeedX(AccelDecelSpeed); + SetSpeedY(-GetSpeedX()); } else { @@ -509,11 +494,8 @@ void cMinecart::HandlePoweredRailPhysics(NIBBLETYPE a_RailMeta) } else { - if (GetSpeedX() >= MAX_SPEED_NEGATIVE) - { - AddSpeedX(AccelDecelNegSpeed); - SetSpeedY(GetSpeedX()); - } + AddSpeedX(AccelDecelNegSpeed); + SetSpeedY(GetSpeedX()); } break; } @@ -524,11 +506,8 @@ void cMinecart::HandlePoweredRailPhysics(NIBBLETYPE a_RailMeta) if (GetSpeedZ() >= NO_SPEED) { - if (GetSpeedZ() <= MAX_SPEED) - { - AddSpeedZ(AccelDecelSpeed); - SetSpeedY(-GetSpeedZ()); - } + AddSpeedZ(AccelDecelSpeed); + SetSpeedY(-GetSpeedZ()); } else { @@ -549,11 +528,8 @@ void cMinecart::HandlePoweredRailPhysics(NIBBLETYPE a_RailMeta) } else { - if (GetSpeedZ() >= MAX_SPEED_NEGATIVE) - { - AddSpeedZ(AccelDecelNegSpeed); - SetSpeedY(GetSpeedZ()); - } + AddSpeedZ(AccelDecelNegSpeed); + SetSpeedY(GetSpeedZ()); } break; } @@ -1043,6 +1019,40 @@ bool cMinecart::DoTakeDamage(TakeDamageInfo & TDI) +void cMinecart::DoSetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ) +{ + if (a_SpeedX > MAX_SPEED) + { + a_SpeedX = MAX_SPEED; + } + else if (a_SpeedX < MAX_SPEED_NEGATIVE) + { + a_SpeedX = MAX_SPEED_NEGATIVE; + } + if (a_SpeedY > MAX_SPEED) + { + a_SpeedY = MAX_SPEED; + } + else if (a_SpeedY < MAX_SPEED_NEGATIVE) + { + a_SpeedY = MAX_SPEED_NEGATIVE; + } + if (a_SpeedZ > MAX_SPEED) + { + a_SpeedZ = MAX_SPEED; + } + else if (a_SpeedZ < MAX_SPEED_NEGATIVE) + { + a_SpeedZ = MAX_SPEED_NEGATIVE; + } + + super::DoSetSpeed(a_SpeedX, a_SpeedY, a_SpeedZ); +} + + + + + void cMinecart::Destroyed() { if (m_bIsOnDetectorRail) diff --git a/src/Entities/Minecart.h b/src/Entities/Minecart.h index c4b1d7f6d..0e5c99f80 100644 --- a/src/Entities/Minecart.h +++ b/src/Entities/Minecart.h @@ -51,6 +51,9 @@ protected: Vector3i m_DetectorRailPosition; bool m_bIsOnDetectorRail; + // Overwrite to enforce speed limit + virtual void DoSetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ); + cMinecart(ePayload a_Payload, double a_X, double a_Y, double a_Z); /** Handles physics on normal rails -- cgit v1.2.3