Merge pull request #1844 from DevToaster/master
Modified physics for more vanilla-like behavior
This commit is contained in:
commit
54289aeccb
@ -21,6 +21,8 @@ cArrowEntity::cArrowEntity(cEntity * a_Creator, double a_X, double a_Y, double a
|
||||
{
|
||||
SetSpeed(a_Speed);
|
||||
SetMass(0.1);
|
||||
SetGravity(-20.0f);
|
||||
SetAirDrag(0.2f);
|
||||
SetYawFromSpeed();
|
||||
SetPitchFromSpeed();
|
||||
LOGD("Created arrow %d with speed {%.02f, %.02f, %.02f} and rot {%.02f, %.02f}",
|
||||
@ -48,6 +50,8 @@ cArrowEntity::cArrowEntity(cPlayer & a_Player, double a_Force) :
|
||||
{
|
||||
m_PickupState = psInCreative;
|
||||
}
|
||||
SetGravity(-20.0f);
|
||||
SetAirDrag(0.01f);
|
||||
}
|
||||
|
||||
|
||||
|
@ -16,7 +16,9 @@
|
||||
cBoat::cBoat(double a_X, double a_Y, double a_Z) :
|
||||
super(etBoat, a_X, a_Y, a_Z, 0.98, 0.7)
|
||||
{
|
||||
SetMass(20.f);
|
||||
SetMass(20.0f);
|
||||
SetGravity(-16.0f);
|
||||
SetAirDrag(0.05f);
|
||||
SetMaxHealth(6);
|
||||
SetHealth(6);
|
||||
}
|
||||
|
@ -36,6 +36,7 @@ cEntity::cEntity(eEntityType a_EntityType, double a_X, double a_Y, double a_Z, d
|
||||
m_bHasSentNoSpeed(true),
|
||||
m_bOnGround(false),
|
||||
m_Gravity(-9.81f),
|
||||
m_AirDrag(0.02f),
|
||||
m_LastPos(a_X, a_Y, a_Z),
|
||||
m_IsInitialized(false),
|
||||
m_WorldTravellingFrom(nullptr),
|
||||
@ -943,6 +944,7 @@ void cEntity::HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
|
||||
{
|
||||
// Normal gravity
|
||||
fallspeed = m_Gravity * DtSec.count();
|
||||
NextSpeed -= NextSpeed * (m_AirDrag * 20.0f) * DtSec.count();
|
||||
}
|
||||
NextSpeed.y += static_cast<float>(fallspeed);
|
||||
}
|
||||
@ -999,7 +1001,7 @@ void cEntity::HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
|
||||
|
||||
NextSpeed += m_WaterSpeed;
|
||||
|
||||
if (NextSpeed.SqrLength() > 0.f)
|
||||
if (NextSpeed.SqrLength() > 0.0f)
|
||||
{
|
||||
cTracer Tracer(GetWorld());
|
||||
// Distance traced is an integer, so we round up from the distance we should go (Speed * Delta), else we will encounter collision detection failurse
|
||||
@ -1015,20 +1017,20 @@ void cEntity::HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
|
||||
// Block hit was within our projected path
|
||||
// Begin by stopping movement in the direction that we hit something. The Normal is the line perpendicular to a 2D face and in this case, stores what block face was hit through either -1 or 1.
|
||||
// For example: HitNormal.y = -1 : BLOCK_FACE_YM; HitNormal.y = 1 : BLOCK_FACE_YP
|
||||
if (Tracer.HitNormal.x != 0.f)
|
||||
if (Tracer.HitNormal.x != 0.0f)
|
||||
{
|
||||
NextSpeed.x = 0.f;
|
||||
NextSpeed.x = 0.0f;
|
||||
}
|
||||
if (Tracer.HitNormal.y != 0.f)
|
||||
if (Tracer.HitNormal.y != 0.0f)
|
||||
{
|
||||
NextSpeed.y = 0.f;
|
||||
NextSpeed.y = 0.0f;
|
||||
}
|
||||
if (Tracer.HitNormal.z != 0.f)
|
||||
if (Tracer.HitNormal.z != 0.0f)
|
||||
{
|
||||
NextSpeed.z = 0.f;
|
||||
NextSpeed.z = 0.0f;
|
||||
}
|
||||
|
||||
if (Tracer.HitNormal.y == 1.f) // Hit BLOCK_FACE_YP, we are on the ground
|
||||
if (Tracer.HitNormal.y == 1.0f) // Hit BLOCK_FACE_YP, we are on the ground
|
||||
{
|
||||
m_bOnGround = true;
|
||||
}
|
||||
@ -1971,7 +1973,7 @@ void cEntity::SteerVehicle(float a_Forward, float a_Sideways)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ((a_Forward != 0.f) || (a_Sideways != 0.f))
|
||||
if ((a_Forward != 0.0f) || (a_Sideways != 0.0f))
|
||||
{
|
||||
m_AttachedTo->HandleSpeedFromAttachee(a_Forward, a_Sideways);
|
||||
}
|
||||
|
@ -270,6 +270,10 @@ public:
|
||||
float GetGravity(void) const { return m_Gravity; }
|
||||
|
||||
void SetGravity(float a_Gravity) { m_Gravity = a_Gravity; }
|
||||
|
||||
float GetAirDrag(void) const { return m_AirDrag; }
|
||||
|
||||
void SetAirDrag(float a_AirDrag) { m_AirDrag = a_AirDrag; }
|
||||
|
||||
/// Sets the rotation to match the speed vector (entity goes "face-forward")
|
||||
void SetYawFromSpeed(void);
|
||||
@ -504,6 +508,12 @@ protected:
|
||||
For realistic effects, this should be negative. For spaaaaaaace, this can be zero or even positive */
|
||||
float m_Gravity;
|
||||
|
||||
/** Stores the air drag that is applied to the entity every tick, measured in speed ratio per tick
|
||||
Acts as air friction and slows down flight
|
||||
Will be interpolated if the server tick rate varies
|
||||
Data: http://minecraft.gamepedia.com/Entity#Motion_of_entities */
|
||||
float m_AirDrag;
|
||||
|
||||
/** Last position sent to client via the Relative Move or Teleport packets (not Velocity)
|
||||
Only updated if cEntity::BroadcastMovementUpdate() is called! */
|
||||
Vector3d m_LastPos;
|
||||
|
@ -16,6 +16,8 @@ cFallingBlock::cFallingBlock(const Vector3i & a_BlockPosition, BLOCKTYPE a_Block
|
||||
m_BlockMeta(a_BlockMeta),
|
||||
m_OriginalPosition(a_BlockPosition)
|
||||
{
|
||||
SetGravity(-16.0f);
|
||||
SetAirDrag(0.02f);
|
||||
}
|
||||
|
||||
|
||||
|
@ -12,6 +12,7 @@ cFireChargeEntity::cFireChargeEntity(cEntity * a_Creator, double a_X, double a_Y
|
||||
{
|
||||
SetSpeed(a_Speed);
|
||||
SetGravity(0);
|
||||
SetAirDrag(0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -13,6 +13,8 @@ cFireworkEntity::cFireworkEntity(cEntity * a_Creator, double a_X, double a_Y, do
|
||||
m_TicksToExplosion(a_Item.m_FireworkItem.m_FlightTimeInTicks),
|
||||
m_FireworkItem(a_Item)
|
||||
{
|
||||
SetGravity(0);
|
||||
SetAirDrag(0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -12,6 +12,7 @@ cGhastFireballEntity::cGhastFireballEntity(cEntity * a_Creator, double a_X, doub
|
||||
{
|
||||
SetSpeed(a_Speed);
|
||||
SetGravity(0);
|
||||
SetAirDrag(0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -92,7 +92,9 @@ cMinecart::cMinecart(ePayload a_Payload, double a_X, double a_Y, double a_Z) :
|
||||
m_DetectorRailPosition(0, 0, 0),
|
||||
m_bIsOnDetectorRail(false)
|
||||
{
|
||||
SetMass(20.f);
|
||||
SetMass(20.0f);
|
||||
SetGravity(-16.0f);
|
||||
SetAirDrag(0.05f);
|
||||
SetMaxHealth(6);
|
||||
SetHealth(6);
|
||||
SetWidth(1);
|
||||
|
@ -13,6 +13,8 @@ cPawn::cPawn(eEntityType a_EntityType, double a_Width, double a_Height) :
|
||||
super(a_EntityType, 0, 0, 0, a_Width, a_Height)
|
||||
, m_EntityEffects(tEffectMap())
|
||||
{
|
||||
SetGravity(-32.0f);
|
||||
SetAirDrag(0.02f);
|
||||
}
|
||||
|
||||
|
||||
|
@ -91,7 +91,8 @@ cPickup::cPickup(double a_PosX, double a_PosY, double a_PosZ, const cItem & a_It
|
||||
, m_bCollected(false)
|
||||
, m_bIsPlayerCreated(IsPlayerCreated)
|
||||
{
|
||||
SetGravity(-10.5f);
|
||||
SetGravity(-16.0f);
|
||||
SetAirDrag(0.02f);
|
||||
SetMaxHealth(5);
|
||||
SetHealth(5);
|
||||
SetSpeed(a_SpeedX, a_SpeedY, a_SpeedZ);
|
||||
|
@ -227,6 +227,8 @@ cProjectileEntity::cProjectileEntity(eKind a_Kind, cEntity * a_Creator, double a
|
||||
),
|
||||
m_IsInGround(false)
|
||||
{
|
||||
SetGravity(-12.0f);
|
||||
SetAirDrag(0.01f);
|
||||
}
|
||||
|
||||
|
||||
@ -242,6 +244,8 @@ cProjectileEntity::cProjectileEntity(eKind a_Kind, cEntity * a_Creator, const Ve
|
||||
SetSpeed(a_Speed);
|
||||
SetYawFromSpeed();
|
||||
SetPitchFromSpeed();
|
||||
SetGravity(-12.0f);
|
||||
SetAirDrag(0.01f);
|
||||
}
|
||||
|
||||
|
||||
@ -349,9 +353,11 @@ void cProjectileEntity::HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a
|
||||
return;
|
||||
}
|
||||
|
||||
const Vector3d PerTickSpeed = GetSpeed() / 20;
|
||||
auto DtSec = std::chrono::duration_cast<std::chrono::duration<double>>(a_Dt);
|
||||
|
||||
const Vector3d DeltaSpeed = GetSpeed() * DtSec.count();
|
||||
const Vector3d Pos = GetPosition();
|
||||
const Vector3d NextPos = Pos + PerTickSpeed;
|
||||
const Vector3d NextPos = Pos + DeltaSpeed;
|
||||
|
||||
// Test for entity collisions:
|
||||
cProjectileEntityCollisionCallback EntityCollisionCallback(this, Pos, NextPos);
|
||||
@ -388,8 +394,8 @@ void cProjectileEntity::HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a
|
||||
|
||||
// Add slowdown and gravity effect to the speed:
|
||||
Vector3d NewSpeed(GetSpeed());
|
||||
NewSpeed.y += m_Gravity / 20;
|
||||
NewSpeed *= TracerCallback.GetSlowdownCoeff();
|
||||
NewSpeed.y += m_Gravity * DtSec.count();
|
||||
NewSpeed -= NewSpeed * (m_AirDrag * 20.0f) * DtSec.count();
|
||||
SetSpeed(NewSpeed);
|
||||
SetYawFromSpeed();
|
||||
SetPitchFromSpeed();
|
||||
|
@ -12,6 +12,8 @@ cTNTEntity::cTNTEntity(double a_X, double a_Y, double a_Z, int a_FuseTicks) :
|
||||
super(etTNT, a_X, a_Y, a_Z, 0.98, 0.98),
|
||||
m_FuseTicks(a_FuseTicks)
|
||||
{
|
||||
SetGravity(-16.0f);
|
||||
SetAirDrag(0.02f);
|
||||
}
|
||||
|
||||
|
||||
@ -22,6 +24,8 @@ cTNTEntity::cTNTEntity(const Vector3d & a_Pos, int a_FuseTicks) :
|
||||
super(etTNT, a_Pos.x, a_Pos.y, a_Pos.z, 0.98, 0.98),
|
||||
m_FuseTicks(a_FuseTicks)
|
||||
{
|
||||
SetGravity(-16.0f);
|
||||
SetAirDrag(0.4f);
|
||||
}
|
||||
|
||||
|
||||
|
@ -16,6 +16,8 @@ cWitherSkullEntity::cWitherSkullEntity(cEntity * a_Creator, double a_X, double a
|
||||
super(pkWitherSkull, a_Creator, a_X, a_Y, a_Z, 0.25, 0.25)
|
||||
{
|
||||
SetSpeed(a_Speed);
|
||||
SetGravity(0);
|
||||
SetAirDrag(0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -9,6 +9,8 @@
|
||||
cBat::cBat(void) :
|
||||
super("Bat", mtBat, "mob.bat.hurt", "mob.bat.death", 0.5, 0.9)
|
||||
{
|
||||
SetGravity(-2.0f);
|
||||
SetAirDrag(0.05f);
|
||||
}
|
||||
|
||||
|
||||
|
@ -11,6 +11,8 @@
|
||||
cBlaze::cBlaze(void) :
|
||||
super("Blaze", mtBlaze, "mob.blaze.hit", "mob.blaze.death", 0.6, 1.8)
|
||||
{
|
||||
SetGravity(-8.0f);
|
||||
SetAirDrag(0.05f);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user