diff --git a/CONTRIBUTORS b/CONTRIBUTORS index ff2f47ca3..660746445 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -22,6 +22,7 @@ derouinw dImrich (Damian Imrich) Diusrex Duralex +dyexlzc Earboxer (Zach DeCook) FakeTruth (founder) feyokorenhof diff --git a/src/Entities/Minecart.cpp b/src/Entities/Minecart.cpp index 9158432cf..030a609ca 100644 --- a/src/Entities/Minecart.cpp +++ b/src/Entities/Minecart.cpp @@ -35,9 +35,12 @@ #define NO_SPEED 0.0 #define MAX_SPEED 8 #define MAX_SPEED_NEGATIVE -MAX_SPEED - - - +#define DIR_NORTH_SOUTH 270 +#define DIR_EAST_WEST 180 +#define DIR_NORTH_WEST 315 +#define DIR_NORTH_EAST 225 +#define DIR_SOUTH_WEST 135 +#define DIR_SOUTH_EAST 45 class cMinecartAttachCallback { @@ -183,7 +186,10 @@ void cMinecart::HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) return; } - auto relPos = cChunkDef::AbsoluteToRelative(GetPosition()); + // pos need floor, then call vec3i overload func + // if use default double -> int, will cast -1.xx -> -1(actually need to be -2) + auto relPos = cChunkDef::AbsoluteToRelative(GetPosition().Floor()); + auto chunk = a_Chunk.GetRelNeighborChunkAdjustCoords(relPos); if (chunk == nullptr) { @@ -284,10 +290,10 @@ void cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::millisecon { case E_META_RAIL_ZM_ZP: // NORTHSOUTH { - SetYaw(270); + SetYaw(DIR_NORTH_SOUTH); SetPosY(floor(GetPosY()) + 0.55); - SetSpeedY(0); // Don't move vertically as on ground - SetSpeedX(0); // Correct diagonal movement from curved rails + SetSpeedY(NO_SPEED); // Don't move vertically as on ground + SetSpeedX(NO_SPEED); // Correct diagonal movement from curved rails // Execute both the entity and block collision checks auto BlckCol = TestBlockCollision(a_RailMeta); @@ -315,7 +321,7 @@ void cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::millisecon } case E_META_RAIL_XM_XP: // EASTWEST { - SetYaw(180); + SetYaw(DIR_EAST_WEST); SetPosY(floor(GetPosY()) + 0.55); SetSpeedY(NO_SPEED); SetSpeedZ(NO_SPEED); @@ -343,8 +349,8 @@ void cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::millisecon } case E_META_RAIL_ASCEND_ZM: // ASCEND NORTH { - SetYaw(270); - SetSpeedX(0); + SetYaw(DIR_NORTH_SOUTH); + SetSpeedX(NO_SPEED); auto BlckCol = TestBlockCollision(a_RailMeta); auto EntCol = TestEntityCollision(a_RailMeta); @@ -370,8 +376,8 @@ void cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::millisecon } case E_META_RAIL_ASCEND_ZP: // ASCEND SOUTH { - SetYaw(270); - SetSpeedX(0); + SetYaw(DIR_NORTH_SOUTH); + SetSpeedX(NO_SPEED); auto BlckCol = TestBlockCollision(a_RailMeta); auto EntCol = TestEntityCollision(a_RailMeta); @@ -397,7 +403,7 @@ void cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::millisecon } case E_META_RAIL_ASCEND_XM: // ASCEND EAST { - SetYaw(180); + SetYaw(DIR_EAST_WEST); SetSpeedZ(NO_SPEED); auto BlckCol = TestBlockCollision(a_RailMeta); @@ -422,8 +428,8 @@ void cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::millisecon } case E_META_RAIL_ASCEND_XP: // ASCEND WEST { - SetYaw(180); - SetSpeedZ(0); + SetYaw(DIR_EAST_WEST); + SetSpeedZ(NO_SPEED); auto BlckCol = TestBlockCollision(a_RailMeta); auto EntCol = TestEntityCollision(a_RailMeta); @@ -447,9 +453,9 @@ void cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::millisecon } case E_META_RAIL_CURVED_ZM_XM: // Ends pointing NORTH and WEST { - SetYaw(315); // Set correct rotation server side + SetYaw(DIR_NORTH_WEST); // Set correct rotation server side SetPosY(floor(GetPosY()) + 0.55); // Levitate dat cart - SetSpeedY(0); + SetSpeedY(NO_SPEED); auto BlckCol = TestBlockCollision(a_RailMeta); auto EntCol = TestEntityCollision(a_RailMeta); @@ -464,9 +470,9 @@ void cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::millisecon } case E_META_RAIL_CURVED_ZM_XP: // Curved NORTH EAST { - SetYaw(225); + SetYaw(DIR_NORTH_EAST); SetPosY(floor(GetPosY()) + 0.55); - SetSpeedY(0); + SetSpeedY(NO_SPEED); auto BlckCol = TestBlockCollision(a_RailMeta); auto EntCol = TestEntityCollision(a_RailMeta); @@ -479,9 +485,9 @@ void cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::millisecon } case E_META_RAIL_CURVED_ZP_XM: // Curved SOUTH WEST { - SetYaw(135); + SetYaw(DIR_SOUTH_WEST); SetPosY(floor(GetPosY()) + 0.55); - SetSpeedY(0); + SetSpeedY(NO_SPEED); auto BlckCol = TestBlockCollision(a_RailMeta); auto EntCol = TestEntityCollision(a_RailMeta); @@ -494,9 +500,9 @@ void cMinecart::HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::millisecon } case E_META_RAIL_CURVED_ZP_XP: // Curved SOUTH EAST { - SetYaw(45); + SetYaw(DIR_SOUTH_EAST); SetPosY(floor(GetPosY()) + 0.55); - SetSpeedY(0); + SetSpeedY(NO_SPEED); auto BlckCol = TestBlockCollision(a_RailMeta); auto EntCol = TestEntityCollision(a_RailMeta); @@ -520,17 +526,18 @@ void cMinecart::HandlePoweredRailPhysics(NIBBLETYPE a_RailMeta) // If the rail is powered set to speed up else slow down. const bool IsRailPowered = ((a_RailMeta & 0x8) == 0x8); const double Acceleration = IsRailPowered ? 1.0 : -2.0; - - switch (a_RailMeta & 0x07) + // PoweredRail only has 5 status in low 3bit. so we need do a logical and to get correct powered rail meta data. + NIBBLETYPE PoweredRailMeta = a_RailMeta & 0x7; + switch (PoweredRailMeta) { case E_META_RAIL_ZM_ZP: // NORTHSOUTH { - SetYaw(270); + SetYaw(DIR_NORTH_SOUTH); SetPosY(floor(GetPosY()) + 0.55); SetSpeedY(0); SetSpeedX(0); - bool BlckCol = TestBlockCollision(a_RailMeta), EntCol = TestEntityCollision(a_RailMeta); + bool BlckCol = TestBlockCollision(PoweredRailMeta), EntCol = TestEntityCollision(PoweredRailMeta); if (EntCol || BlckCol) { return; @@ -566,12 +573,12 @@ void cMinecart::HandlePoweredRailPhysics(NIBBLETYPE a_RailMeta) } case E_META_RAIL_XM_XP: // EASTWEST { - SetYaw(180); + SetYaw(DIR_EAST_WEST); SetPosY(floor(GetPosY()) + 0.55); SetSpeedY(NO_SPEED); SetSpeedZ(NO_SPEED); - bool BlckCol = TestBlockCollision(a_RailMeta), EntCol = TestEntityCollision(a_RailMeta); + bool BlckCol = TestBlockCollision(PoweredRailMeta), EntCol = TestEntityCollision(PoweredRailMeta); if (EntCol || BlckCol) { return; @@ -607,7 +614,7 @@ void cMinecart::HandlePoweredRailPhysics(NIBBLETYPE a_RailMeta) } case E_META_RAIL_ASCEND_XM: // ASCEND EAST { - SetYaw(180); + SetYaw(DIR_EAST_WEST); SetSpeedZ(NO_SPEED); if (GetSpeedX() >= NO_SPEED) @@ -624,7 +631,7 @@ void cMinecart::HandlePoweredRailPhysics(NIBBLETYPE a_RailMeta) } case E_META_RAIL_ASCEND_XP: // ASCEND WEST { - SetYaw(180); + SetYaw(DIR_EAST_WEST); SetSpeedZ(NO_SPEED); if (GetSpeedX() > NO_SPEED) @@ -641,7 +648,7 @@ void cMinecart::HandlePoweredRailPhysics(NIBBLETYPE a_RailMeta) } case E_META_RAIL_ASCEND_ZM: // ASCEND NORTH { - SetYaw(270); + SetYaw(DIR_NORTH_SOUTH); SetSpeedX(NO_SPEED); if (GetSpeedZ() >= NO_SPEED) @@ -658,7 +665,7 @@ void cMinecart::HandlePoweredRailPhysics(NIBBLETYPE a_RailMeta) } case E_META_RAIL_ASCEND_ZP: // ASCEND SOUTH { - SetYaw(270); + SetYaw(DIR_NORTH_SOUTH); SetSpeedX(NO_SPEED); if (GetSpeedZ() > NO_SPEED) @@ -1304,6 +1311,24 @@ void cMinecart::OnRemoveFromWorld(cWorld & a_World) +void cMinecart::HandleSpeedFromAttachee(float a_Forward, float a_Sideways) +{ + // limit normal minecart speed max lower than 4 + // once speed is higher than 4, no more add speed. + if (GetSpeed().Length() > 4) + { + return; + } + Vector3d LookVector = m_Attachee->GetLookVector(); + Vector3d ToAddSpeed = LookVector * (a_Forward * 0.4) ; + ToAddSpeed.y = 0; + AddSpeed(ToAddSpeed); +} + + + + + void cMinecart::ApplyAcceleration(Vector3d a_ForwardDirection, double a_Acceleration) { double CurSpeed = GetSpeed().Dot(a_ForwardDirection); diff --git a/src/Entities/Minecart.h b/src/Entities/Minecart.h index 0efc07836..dd373e367 100644 --- a/src/Entities/Minecart.h +++ b/src/Entities/Minecart.h @@ -58,7 +58,7 @@ public: virtual bool DoTakeDamage(TakeDamageInfo & TDI) override; virtual void KilledBy(TakeDamageInfo & a_TDI) override; virtual void OnRemoveFromWorld(cWorld & a_World) override; - + virtual void HandleSpeedFromAttachee(float a_Forward, float a_Sideways) override; int LastDamage(void) const { return m_LastDamage; } ePayload GetPayload(void) const { return m_Payload; }