1
0

Implemented BroadcastMovementUpdate function. Moved m_Pos,m_Rot,m_Speed to private members and made sure that all classes uses the public functions to access these members.

git-svn-id: http://mc-server.googlecode.com/svn/trunk@1294 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
keyboard.osh@gmail.com 2013-03-22 06:33:10 +00:00
parent e8aa03f8df
commit 39e4bd3239
10 changed files with 258 additions and 136 deletions

View File

@ -31,9 +31,16 @@ cEntity::cEntity(eEntityType a_EntityType, double a_X, double a_Y, double a_Z)
, m_ChunkY(0) , m_ChunkY(0)
, m_ChunkZ(0) , m_ChunkZ(0)
, m_Pos(a_X, a_Y, a_Z) , m_Pos(a_X, a_Y, a_Z)
, m_bDirtyPosition(true)
, m_bDirtyOrientation(true) , m_bDirtyOrientation(true)
, m_bDirtyPosition(true)
, m_bDirtySpeed(true)
, m_bDestroyed(false) , m_bDestroyed(false)
, m_LastPosX( 0.0 )
, m_LastPosY( 0.0 )
, m_LastPosZ( 0.0 )
, m_TimeLastTeleportPacket(0)
, m_TimeLastMoveReltPacket(0)
, m_TimeLastSpeedPacket(0)
, m_EntityType(a_EntityType) , m_EntityType(a_EntityType)
, m_World(NULL) , m_World(NULL)
, m_bRemovedFromChunk(false) , m_bRemovedFromChunk(false)
@ -127,6 +134,18 @@ void cEntity::WrapRotation()
while (m_Rot.y < -180.f) m_Rot.y+=360.f; while (m_Rot.y < -180.f) m_Rot.y+=360.f;
} }
void cEntity::WrapSpeed()
{
//There shoudn't be a need for flipping the flag on because this function is called
//after any update, so the flag is already turned on
if (m_Speed.x > 20.0f) m_Speed.x = 20.0f;
else if (m_Speed.x < -20.0f) m_Speed.x = -20.0f;
if (m_Speed.y > 20.0f) m_Speed.y = 20.0f;
else if (m_Speed.y < -20.0f) m_Speed.y = -20.0f;
if (m_Speed.z > 20.0f) m_Speed.z = 20.0f;
else if (m_Speed.z < -20.0f) m_Speed.z = -20.0f;
}
@ -243,6 +262,73 @@ void cEntity::Tick(float a_Dt, MTRand & a_TickRandom)
void cEntity::BroadcastMovementUpdate(const cClientHandle * a_Exclude)
{
if (m_bDirtyOrientation && !m_bDirtyPosition)
{
//LOGD("Sending (rot,yaw,roll) = (%f,%f,%f)",m_Rot.x,m_Rot.y,m_Rot.z);
m_World->BroadcastEntLook(*this,a_Exclude);
m_World->BroadcastEntHeadLook(*this,a_Exclude);
m_bDirtyOrientation = false;
}
if (m_bDirtyPosition)
{
float DiffX = (float)(GetPosX() - m_LastPosX);
float DiffY = (float)(GetPosY() - m_LastPosY);
float DiffZ = (float)(GetPosZ() - m_LastPosZ);
float SqrDist = DiffX * DiffX + DiffY * DiffY + DiffZ * DiffZ;
if (
(SqrDist > 16) // 4 blocks is max Relative Move. 16 = 4 ^ 2
|| (m_World->GetWorldAge() - m_TimeLastTeleportPacket > 400) // Send an absolute position every 20 seconds
)
{
//LOGD("Teleported from (%f,%f,%f) to (%f,%f,%f); Distance square: %f",m_LastPosX,m_LastPosY,m_LastPosZ, m_Pos.x,m_Pos.y,m_Pos.z,SqrDist );
m_World->BroadcastEntHeadLook(*this,a_Exclude);
m_World->BroadcastTeleportEntity(*this,a_Exclude);
m_TimeLastTeleportPacket = m_World->GetWorldAge();
m_LastPosX = GetPosX();
m_LastPosY = GetPosY();
m_LastPosZ = GetPosZ();
m_bDirtyPosition = false;
}
else
{
if ((m_World->GetWorldAge() - m_TimeLastMoveReltPacket > 60)) // Send relative movement every 3 seconds
{
//LOGD("Moved from (%f,%f,%f) to (%f,%f,%f)",m_LastPosX,m_LastPosY,m_LastPosZ, m_Pos.x,m_Pos.y,m_Pos.z );
if (m_bDirtyOrientation)
{
m_World->BroadcastEntHeadLook(*this,a_Exclude);
m_World->BroadcastEntRelMoveLook(*this, (char)(DiffX * 32), (char)(DiffY * 32), (char)(DiffZ * 32),a_Exclude);
m_bDirtyOrientation = false;
}
else
{
m_World->BroadcastEntHeadLook(*this,a_Exclude);
m_World->BroadcastEntRelMove(*this, (char)(DiffX * 32), (char)(DiffY * 32), (char)(DiffZ * 32),a_Exclude);
}
m_TimeLastMoveReltPacket = m_World->GetWorldAge();
m_LastPosX = GetPosX();
m_LastPosY = GetPosY();
m_LastPosZ = GetPosZ();
m_bDirtyPosition = false;
}
}
}
//We need to keep updating the clients when there is movement or if there was a change in speed and after 1 tick
if( (m_Speed.SqrLength() > 0.0004f || m_bDirtySpeed) && (m_World->GetWorldAge() - m_TimeLastSpeedPacket >= 1))
{
m_World->BroadcastEntVelocity(*this,a_Exclude);
m_bDirtySpeed = false;
m_TimeLastSpeedPacket = m_World->GetWorldAge();
}
}
void cEntity::AttachTo(cEntity * a_AttachTo) void cEntity::AttachTo(cEntity * a_AttachTo)
{ {
if (m_AttachedTo == a_AttachTo) if (m_AttachedTo == a_AttachTo)
@ -334,15 +420,48 @@ void cEntity::SetRoll(double a_Roll)
void cEntity::SetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ) void cEntity::SetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ)
{ {
m_Speed.Set(a_SpeedX, a_SpeedY, a_SpeedZ); m_Speed.Set(a_SpeedX, a_SpeedY, a_SpeedZ);
m_bDirtySpeed = true;
WrapSpeed();
} }
void cEntity::SetSpeedX(double a_SpeedX)
{
m_Speed.x = a_SpeedX;
m_bDirtySpeed = true;
WrapSpeed();
}
void cEntity::SetSpeedY(double a_SpeedY)
{
m_Speed.y = a_SpeedY;
m_bDirtySpeed = true;
WrapSpeed();
}
void cEntity::SetSpeedZ(double a_SpeedZ)
{
m_Speed.z = a_SpeedZ;
m_bDirtySpeed = true;
WrapSpeed();
}
void cEntity::AddSpeed(const Vector3d & a_AddSpeed) void cEntity::AddSpeed(const Vector3d & a_AddSpeed)
{ {
m_Speed += a_AddSpeed; m_Speed += a_AddSpeed;
m_bDirtySpeed = true;
WrapSpeed();
} }
@ -365,17 +484,6 @@ Vector3d cEntity::GetLookVector(void) const
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// Set position // Set position
void cEntity::SetPosition(const Vector3d & a_Pos)
{
m_Pos = a_Pos;
MoveToCorrectChunk();
m_bDirtyPosition = true;
}
void cEntity::SetPosition(double a_PosX, double a_PosY, double a_PosZ) void cEntity::SetPosition(double a_PosX, double a_PosY, double a_PosZ)
{ {
m_Pos.Set(a_PosX, a_PosY, a_PosZ); m_Pos.Set(a_PosX, a_PosY, a_PosZ);

View File

@ -127,13 +127,16 @@ public:
void SetPosY (double a_PosY); void SetPosY (double a_PosY);
void SetPosZ (double a_PosZ); void SetPosZ (double a_PosZ);
void SetPosition(double a_PosX, double a_PosY, double a_PosZ); void SetPosition(double a_PosX, double a_PosY, double a_PosZ);
void SetPosition(const Vector3d & a_Pos); void SetPosition(const Vector3d & a_Pos) { SetPosition(a_Pos.x,a_Pos.y,a_Pos.z);}
void SetRot (const Vector3f & a_Rot); void SetRot (const Vector3f & a_Rot);
void SetRotation(double a_Rotation); void SetRotation(double a_Rotation);
void SetPitch (double a_Pitch); void SetPitch (double a_Pitch);
void SetRoll (double a_Roll); void SetRoll (double a_Roll);
void SetSpeed (double a_SpeedX, double a_SpeedY, double a_SpeedZ); void SetSpeed (double a_SpeedX, double a_SpeedY, double a_SpeedZ);
void SetSpeed (const Vector3d & a_Speed) { m_Speed = a_Speed; } void SetSpeed (const Vector3d & a_Speed) { SetSpeed(a_Speed.x,a_Speed.y,a_Speed.z); }
void SetSpeedX (double a_SpeedX);
void SetSpeedY (double a_SpeedY);
void SetSpeedZ (double a_SpeedZ);
void AddSpeed(const Vector3d & a_AddSpeed); void AddSpeed(const Vector3d & a_AddSpeed);
@ -153,6 +156,9 @@ public:
Needs to have a default implementation due to Lua bindings. Needs to have a default implementation due to Lua bindings.
*/ */
virtual void SpawnOn(cClientHandle & a_Client) {ASSERT(!"SpawnOn() unimplemented!"); } virtual void SpawnOn(cClientHandle & a_Client) {ASSERT(!"SpawnOn() unimplemented!"); }
//Updates clients of changes in the entity.
virtual void BroadcastMovementUpdate(const cClientHandle * a_Exclude = NULL);
/// Attaches to the specified entity; detaches from any previous one first /// Attaches to the specified entity; detaches from any previous one first
void AttachTo(cEntity * a_AttachTo); void AttachTo(cEntity * a_AttachTo);
@ -160,7 +166,11 @@ public:
/// Detaches from the currently attached entity, if any /// Detaches from the currently attached entity, if any
void Detach(void); void Detach(void);
//Makes sure rotation is not over the specified range.
void WrapRotation(); void WrapRotation();
//Makes speed is not over 20. Max speed is 20 blocks / second
void WrapSpeed();
// tolua_begin // tolua_begin
@ -192,13 +202,17 @@ protected:
cReferenceManager* m_References; cReferenceManager* m_References;
int m_ChunkX, m_ChunkY, m_ChunkZ; int m_ChunkX, m_ChunkY, m_ChunkZ;
Vector3d m_Pos;
bool m_bDirtyPosition;
Vector3d m_Rot;
bool m_bDirtyOrientation;
Vector3d m_Speed; //Flags that signal that we haven't updated the clients with the latest.
bool m_bDirtyOrientation;
bool m_bDirtyPosition;
bool m_bDirtySpeed;
//Last Position.
double m_LastPosX, m_LastPosY, m_LastPosZ;
//This variables keep track of the last time a packet was sent
Int64 m_TimeLastTeleportPacket,m_TimeLastMoveReltPacket,m_TimeLastSpeedPacket; // In ticks
bool m_bDestroyed; bool m_bDestroyed;
bool m_bRemovedFromChunk; bool m_bRemovedFromChunk;
@ -219,6 +233,10 @@ protected:
void AddReference( cEntity*& a_EntityPtr ); void AddReference( cEntity*& a_EntityPtr );
void ReferencedBy( cEntity*& a_EntityPtr ); void ReferencedBy( cEntity*& a_EntityPtr );
void Dereference( cEntity*& a_EntityPtr ); void Dereference( cEntity*& a_EntityPtr );
private:
Vector3d m_Speed;
Vector3d m_Rot;
Vector3d m_Pos;
} ; // tolua_export } ; // tolua_export
typedef std::list<cEntity *> cEntityList; typedef std::list<cEntity *> cEntityList;

View File

@ -43,13 +43,13 @@ void cFallingBlock::SpawnOn(cClientHandle & a_ClientHandle)
void cFallingBlock::Tick(float a_Dt, MTRand & a_TickRandom) void cFallingBlock::Tick(float a_Dt, MTRand & a_TickRandom)
{ {
float MilliDt = a_Dt * 0.001f; float MilliDt = a_Dt * 0.001f;
m_Speed.y -= MilliDt * 9.8f; SetSpeedY(GetSpeedY() - (MilliDt * 9.8f));
m_Pos.y += m_Speed.y * MilliDt; SetPosY(GetPosY() + (GetSpeedY() * MilliDt));
// GetWorld()->BroadcastTeleportEntity(*this); // Test position // GetWorld()->BroadcastTeleportEntity(*this); // Test position
int BlockX = (int)m_OriginalPosition.x; int BlockX = (int)m_OriginalPosition.x;
int BlockY = (int)(m_Pos.y - 0.5); int BlockY = (int)(GetPosY() - 0.5);
int BlockZ = (int)m_OriginalPosition.z; int BlockZ = (int)m_OriginalPosition.z;
if (BlockY < 0) if (BlockY < 0)

View File

@ -39,7 +39,7 @@ void cAggressiveMonster::InStateChasing(float a_Dt, MTRand & a_TickRandom)
} }
} }
Vector3f Pos = Vector3f( m_Pos ); Vector3f Pos = Vector3f( GetPosition() );
Vector3f Their = Vector3f( m_Target->GetPosition() ); Vector3f Their = Vector3f( m_Target->GetPosition() );
if ((Their - Pos).Length() <= m_AttackRange) if ((Their - Pos).Length() <= m_AttackRange)
{ {

View File

@ -76,7 +76,7 @@ void cMonster::MoveToPosition( const Vector3f & a_Position )
bool cMonster::ReachedDestination() bool cMonster::ReachedDestination()
{ {
Vector3f Distance = (m_Destination) - Vector3f( m_Pos ); Vector3f Distance = (m_Destination) - GetPosition();
if( Distance.SqrLength() < 2.f ) if( Distance.SqrLength() < 2.f )
return true; return true;
@ -106,20 +106,20 @@ void cMonster::Tick(float a_Dt, MTRand & a_TickRandom)
if (m_bMovingToDestination) if (m_bMovingToDestination)
{ {
Vector3f Pos( m_Pos ); Vector3f Pos( GetPosition() );
Vector3f Distance = m_Destination - Pos; Vector3f Distance = m_Destination - Pos;
if( !ReachedDestination() ) if( !ReachedDestination() )
{ {
Distance.y = 0; Distance.y = 0;
Distance.Normalize(); Distance.Normalize();
Distance *= 3; Distance *= 3;
m_Speed.x = Distance.x; SetSpeedX( Distance.x );
m_Speed.z = Distance.z; SetSpeedZ( Distance.z );
if (m_EMState == ESCAPING) if (m_EMState == ESCAPING)
{ //Runs Faster when escaping :D otherwise they just walk away { //Runs Faster when escaping :D otherwise they just walk away
m_Speed.x *= 2.f; SetSpeedX (GetSpeedX() * 2.f);
m_Speed.z *= 2.f; SetSpeedZ (GetSpeedZ() * 2.f);
} }
} }
else else
@ -127,25 +127,23 @@ void cMonster::Tick(float a_Dt, MTRand & a_TickRandom)
m_bMovingToDestination = false; m_bMovingToDestination = false;
} }
if( m_Speed.SqrLength() > 0.f ) if( GetSpeed().SqrLength() > 0.f )
{ {
if( m_bOnGround ) if( m_bOnGround )
{ {
Vector3f NormSpeed = m_Speed.NormalizeCopy(); Vector3f NormSpeed = Vector3f(GetSpeed()).NormalizeCopy();
Vector3f NextBlock = Vector3f( m_Pos ) + NormSpeed; Vector3f NextBlock = Vector3f( GetPosition() ) + NormSpeed;
double NextHeight = (double)GetWorld()->GetHeight( (int)NextBlock.x, (int)NextBlock.z ); double NextHeight = (double)GetWorld()->GetHeight( (int)NextBlock.x, (int)NextBlock.z );
if( NextHeight > m_Pos.y - 1.2 && NextHeight - m_Pos.y < 2.5 ) if( NextHeight > (GetPosY() - 1.0) && (NextHeight - GetPosY()) < 2.5 )
{ {
m_bOnGround = false; m_bOnGround = false;
m_Speed.y = 7.f; // Jump!! SetSpeedY(5.f); // Jump!!
} }
} }
} }
} }
ReplicateMovement();
Vector3d Distance = m_Destination - Vector3f( m_Pos ); Vector3d Distance = m_Destination - GetPosition();
if (Distance.SqrLength() > 0.1f) if (Distance.SqrLength() > 0.1f)
{ {
double Rotation, Pitch; double Rotation, Pitch;
@ -154,7 +152,11 @@ void cMonster::Tick(float a_Dt, MTRand & a_TickRandom)
SetRotation( Rotation ); SetRotation( Rotation );
SetPitch( Pitch ); SetPitch( Pitch );
} }
HandlePhysics(a_Dt);
BroadcastMovementUpdate();
MoveToCorrectChunk();
switch (m_EMState) switch (m_EMState)
{ {
case IDLE: case IDLE:
@ -182,7 +184,7 @@ void cMonster::Tick(float a_Dt, MTRand & a_TickRandom)
//Not used. Will remove later when we implement the AI.
void cMonster::ReplicateMovement() void cMonster::ReplicateMovement()
{ {
if (m_bDirtyOrientation && !m_bDirtyPosition) if (m_bDirtyOrientation && !m_bDirtyPosition)
@ -237,59 +239,59 @@ void cMonster::HandlePhysics(float a_Dt)
if( m_bOnGround ) // check if it's still on the ground if( m_bOnGround ) // check if it's still on the ground
{ {
cWorld* World = GetWorld(); cWorld* World = GetWorld();
if( World->GetBlock( (int)m_Pos.x, (int)m_Pos.y -1, (int)m_Pos.z ) == E_BLOCK_AIR ) if( World->GetBlock( (int)GetPosX(), (int)GetPosY() -1, (int)GetPosZ() ) == E_BLOCK_AIR )
{ {
m_bOnGround = false; m_bOnGround = false;
} }
if( World->GetBlock( (int)m_Pos.x, (int)m_Pos.y, (int)m_Pos.z ) != E_BLOCK_AIR ) // If in ground itself, push it out if( World->GetBlock( (int)GetPosX(), (int)GetPosY(), (int)GetPosZ() ) != E_BLOCK_AIR ) // If in ground itself, push it out
{ {
m_bOnGround = true; m_bOnGround = true;
m_Pos.y += 0.2; SetPosY(GetPosY() + 0.2);
m_bDirtyPosition = true; m_bDirtyPosition = true;
} }
m_Speed.x *= 0.7f/(1+a_Dt); SetSpeedX(GetSpeedX() * 0.7f/(1+a_Dt));
if( fabs(m_Speed.x) < 0.05 ) m_Speed.x = 0; if( fabs(GetSpeedX()) < 0.05 ) SetSpeedX(0);
m_Speed.z *= 0.7f/(1+a_Dt); SetSpeedZ(GetSpeedZ() * 0.7f/(1+a_Dt));
if( fabs(m_Speed.z) < 0.05 ) m_Speed.z = 0; if( fabs(GetSpeedZ()) < 0.05 ) SetSpeedZ(0);
} }
if( !m_bOnGround ) if( !m_bOnGround )
{ {
float Gravity = -9.81f*a_Dt; float Gravity = -9.81f*a_Dt;
m_Speed.y += Gravity; SetSpeedY(GetSpeedY() + Gravity);
} }
if( m_Speed.SqrLength() > 0.f ) if( GetSpeed().SqrLength() > 0.f )
{ {
cTracer Tracer( GetWorld() ); cTracer Tracer( GetWorld() );
int Ret = Tracer.Trace( m_Pos, m_Speed, 2 ); int Ret = Tracer.Trace( GetPosition(), GetSpeed(), 2 );
if( Ret ) // Oh noez! we hit something if( Ret ) // Oh noez! we hit something
{ {
// Set to hit position // Set to hit position
if( (Tracer.RealHit - Vector3f(m_Pos)).SqrLength() <= ( m_Speed * a_Dt ).SqrLength() ) if( (Tracer.RealHit - GetPosition()).SqrLength() <= ( GetSpeed() * a_Dt ).SqrLength() )
{ {
if( Ret == 1 ) if( Ret == 1 )
{ {
if( Tracer.HitNormal.x != 0.f ) m_Speed.x = 0.f; if( Tracer.HitNormal.x != 0.f ) SetSpeedX(0.f);
if( Tracer.HitNormal.y != 0.f ) m_Speed.y = 0.f; if( Tracer.HitNormal.y != 0.f ) SetSpeedY(0.f);
if( Tracer.HitNormal.z != 0.f ) m_Speed.z = 0.f; if( Tracer.HitNormal.z != 0.f ) SetSpeedZ(0.f);
if( Tracer.HitNormal.y > 0 ) // means on ground if( Tracer.HitNormal.y > 0 ) // means on ground
{ {
m_bOnGround = true; m_bOnGround = true;
} }
} }
m_Pos = Tracer.RealHit; SetPosition(Tracer.RealHit);
m_Pos += Tracer.HitNormal * 0.2f; SetPosX(GetPosX() + (Tracer.HitNormal.x * 0.5f));
SetPosZ(GetPosZ() + (Tracer.HitNormal.z * 0.5f));
} }
else else
m_Pos += m_Speed*a_Dt; SetPosition(GetPosition() + (GetSpeed()*a_Dt));
} }
else else
{ // We didn't hit anything, so move =] { // We didn't hit anything, so move =]
m_Pos += m_Speed*a_Dt; SetPosition(GetPosition() + (GetSpeed()*a_Dt));
} }
m_bDirtyPosition = true; m_bDirtyPosition = true;
@ -303,7 +305,7 @@ void cMonster::HandlePhysics(float a_Dt)
void cMonster::DoTakeDamage(TakeDamageInfo & a_TDI) void cMonster::DoTakeDamage(TakeDamageInfo & a_TDI)
{ {
super::DoTakeDamage(a_TDI); super::DoTakeDamage(a_TDI);
if((m_SoundHurt != "") && (m_Health > 0)) m_World->BroadcastSoundEffect(m_SoundHurt, (int)(m_Pos.x * 8), (int)(m_Pos.y * 8), (int)(m_Pos.z * 8), 1.0f, 0.8f); if((m_SoundHurt != "") && (m_Health > 0)) m_World->BroadcastSoundEffect(m_SoundHurt, (int)(GetPosX() * 8), (int)(GetPosY() * 8), (int)(GetPosZ() * 8), 1.0f, 0.8f);
if (a_TDI.Attacker != NULL) if (a_TDI.Attacker != NULL)
{ {
m_Target = a_TDI.Attacker; m_Target = a_TDI.Attacker;
@ -318,7 +320,7 @@ void cMonster::DoTakeDamage(TakeDamageInfo & a_TDI)
void cMonster::KilledBy(cPawn * a_Killer) void cMonster::KilledBy(cPawn * a_Killer)
{ {
super::KilledBy(a_Killer); super::KilledBy(a_Killer);
if(m_SoundHurt != "") m_World->BroadcastSoundEffect(m_SoundDeath, (int)(m_Pos.x * 8), (int)(m_Pos.y * 8), (int)(m_Pos.z * 8), 1.0f, 0.8f); if(m_SoundHurt != "") m_World->BroadcastSoundEffect(m_SoundDeath, (int)(GetPosX() * 8), (int)(GetPosY() * 8), (int)(GetPosZ() * 8), 1.0f, 0.8f);
m_DestroyTimer = 0; m_DestroyTimer = 0;
} }
@ -396,7 +398,7 @@ void cMonster::CheckEventLostPlayer(MTRand & a_TickRandom)
if (m_Target != NULL) if (m_Target != NULL)
{ {
pos = m_Target->GetPosition(); pos = m_Target->GetPosition();
if ((pos - m_Pos).Length() > m_SightDistance || LineOfSight.Trace(m_Pos,(pos - m_Pos), (int)(pos - m_Pos).Length())) if ((pos - GetPosition()).Length() > m_SightDistance || LineOfSight.Trace(GetPosition(),(pos - GetPosition()), (int)(pos - GetPosition()).Length()))
{ {
EventLosePlayer(); EventLosePlayer();
} }
@ -451,8 +453,8 @@ void cMonster::InStateIdle(float a_Dt, MTRand & a_TickRandom)
Dist.z = (float)((a_TickRandom.randInt() % 11) - 5); Dist.z = (float)((a_TickRandom.randInt() % 11) - 5);
if ((Dist.SqrLength() > 2) && (rem >= 3)) if ((Dist.SqrLength() > 2) && (rem >= 3))
{ {
m_Destination.x = (float)(m_Pos.x + Dist.x); m_Destination.x = (float)(GetPosX() + Dist.x);
m_Destination.z = (float)(m_Pos.z + Dist.z); m_Destination.z = (float)(GetPosZ() + Dist.z);
m_Destination.y = (float)GetWorld()->GetHeight((int)m_Destination.x, (int)m_Destination.z) + 1.2f; m_Destination.y = (float)GetWorld()->GetHeight((int)m_Destination.x, (int)m_Destination.z) + 1.2f;
MoveToPosition(m_Destination); MoveToPosition(m_Destination);
} }
@ -483,7 +485,7 @@ void cMonster::InStateEscaping(float a_Dt, MTRand & a_TickRandom)
if (m_Target != NULL) if (m_Target != NULL)
{ {
Vector3d newloc = m_Pos; Vector3d newloc = GetPosition();
newloc.x = (m_Target->GetPosition().x < newloc.x)? (newloc.x + m_SightDistance): (newloc.x - m_SightDistance); newloc.x = (m_Target->GetPosition().x < newloc.x)? (newloc.x + m_SightDistance): (newloc.x - m_SightDistance);
newloc.z = (m_Target->GetPosition().z < newloc.z)? (newloc.z + m_SightDistance): (newloc.z - m_SightDistance); newloc.z = (m_Target->GetPosition().z < newloc.z)? (newloc.z + m_SightDistance): (newloc.z - m_SightDistance);
MoveToPosition(newloc); MoveToPosition(newloc);
@ -518,7 +520,7 @@ void cMonster::Attack(float a_Dt)
// Checks for Players close by and if they are visible return the closest // Checks for Players close by and if they are visible return the closest
cPlayer * cMonster::FindClosestPlayer(void) cPlayer * cMonster::FindClosestPlayer(void)
{ {
return m_World->FindClosestPlayer(m_Pos, m_SightDistance); return m_World->FindClosestPlayer(GetPosition(), m_SightDistance);
} }

View File

@ -19,10 +19,6 @@ cPawn::cPawn(eEntityType a_EntityType)
: cEntity(a_EntityType, 0, 0, 0) : cEntity(a_EntityType, 0, 0, 0)
, m_Health(1) , m_Health(1)
, m_MaxHealth(1) , m_MaxHealth(1)
, m_LastPosX( 0.0 )
, m_LastPosY( 0.0 )
, m_LastPosZ( 0.0 )
, m_TimeLastTeleportPacket(0)
, m_bBurnable(true) , m_bBurnable(true)
, m_MetaData(NORMAL) , m_MetaData(NORMAL)
{ {
@ -74,9 +70,9 @@ void cPawn::TakeDamage(eDamageType a_DamageType, cPawn * a_Attacker, int a_RawDa
TDI.RawDamage = a_RawDamage; TDI.RawDamage = a_RawDamage;
TDI.FinalDamage = a_FinalDamage; TDI.FinalDamage = a_FinalDamage;
Vector3d Heading; Vector3d Heading;
Heading.x = sin(m_Rot.x); Heading.x = sin(GetRotation());
Heading.y = 0.4; // TODO: adjust the amount of "up" knockback when testing Heading.y = 0.4; // TODO: adjust the amount of "up" knockback when testing
Heading.z = cos(m_Rot.x); Heading.z = cos(GetRotation());
TDI.Knockback = Heading * a_KnockbackAmount; TDI.Knockback = Heading * a_KnockbackAmount;
DoTakeDamage(TDI); DoTakeDamage(TDI);
} }
@ -134,7 +130,7 @@ void cPawn::KilledBy(cPawn * a_Killer)
// Drop loot: // Drop loot:
cItems Drops; cItems Drops;
GetDrops(Drops, a_Killer); GetDrops(Drops, a_Killer);
m_World->SpawnItemPickups(Drops, m_Pos.x, m_Pos.y, m_Pos.z); m_World->SpawnItemPickups(Drops, GetPosX(), GetPosY(), GetPosZ());
m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_DEAD); m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_DEAD);
} }
@ -321,9 +317,9 @@ void cPawn::SetMetaData(MetaData a_MetaData)
//----Change Entity MetaData //----Change Entity MetaData
void cPawn::CheckMetaDataBurn() void cPawn::CheckMetaDataBurn()
{ {
BLOCKTYPE Block = GetWorld()->GetBlock((int) m_Pos.x, (int) m_Pos.y, (int) m_Pos.z); BLOCKTYPE Block = GetWorld()->GetBlock((int) GetPosX(), (int) GetPosY(), (int) GetPosZ());
BLOCKTYPE BlockAbove = GetWorld()->GetBlock((int) m_Pos.x, (int) m_Pos.y + 1, (int) m_Pos.z); BLOCKTYPE BlockAbove = GetWorld()->GetBlock((int) GetPosX(), (int) GetPosY() + 1, (int) GetPosZ());
BLOCKTYPE BlockBelow = GetWorld()->GetBlock((int) m_Pos.x, (int) m_Pos.y - 1, (int) m_Pos.z); BLOCKTYPE BlockBelow = GetWorld()->GetBlock((int) GetPosX(), (int) GetPosY() - 1, (int) GetPosZ());
if ( if (
(GetMetaData() == BURNING) && (GetMetaData() == BURNING) &&
@ -359,8 +355,8 @@ void cPawn::InStateBurning(float a_Dt)
return; return;
} }
BLOCKTYPE Block = GetWorld()->GetBlock((int)m_Pos.x, (int)m_Pos.y, (int)m_Pos.z); BLOCKTYPE Block = GetWorld()->GetBlock((int)GetPosX(), (int)GetPosY(), (int)GetPosZ());
BLOCKTYPE BlockAbove = GetWorld()->GetBlock((int)m_Pos.x, (int)m_Pos.y + 1, (int)m_Pos.z); BLOCKTYPE BlockAbove = GetWorld()->GetBlock((int)GetPosX(), (int)GetPosY() + 1, (int)GetPosZ());
m_FireDamageInterval = 0; m_FireDamageInterval = 0;
TakeDamage(dtOnFire, NULL, 1, 0); TakeDamage(dtOnFire, NULL, 1, 0);

View File

@ -163,8 +163,6 @@ protected:
MetaData m_MetaData; MetaData m_MetaData;
double m_LastPosX, m_LastPosY, m_LastPosZ;
Int64 m_TimeLastTeleportPacket; // In ticks
}; // tolua_export }; // tolua_export

View File

@ -33,7 +33,7 @@ cPickup::cPickup(int a_MicroPosX, int a_MicroPosY, int a_MicroPosZ, const cItem
, m_Item(a_Item) , m_Item(a_Item)
, m_bCollected( false ) , m_bCollected( false )
{ {
m_Speed.Set(a_SpeedX, a_SpeedY, a_SpeedZ); SetSpeed(a_SpeedX, a_SpeedY, a_SpeedZ);
} }
@ -80,7 +80,7 @@ void cPickup::Tick(float a_Dt, MTRand & a_TickRandom)
return; return;
} }
if (m_Pos.y < -8) // Out of this world and no more visible! if (GetPosY() < -8) // Out of this world and no more visible!
{ {
Destroy(); Destroy();
return; return;
@ -108,15 +108,15 @@ void cPickup::HandlePhysics(float a_Dt)
if (m_bOnGround) // check if it's still on the ground if (m_bOnGround) // check if it's still on the ground
{ {
int BlockX = (m_Pos.x < 0) ? (int)m_Pos.x - 1 : (int)m_Pos.x; int BlockX = (GetPosX() < 0) ? (int)GetPosX() - 1 : (int)GetPosX();
int BlockZ = (m_Pos.z < 0) ? (int)m_Pos.z - 1 : (int)m_Pos.z; int BlockZ = (GetPosZ() < 0) ? (int)GetPosZ() - 1 : (int)GetPosZ();
char BlockBelow = World->GetBlock(BlockX, (int)m_Pos.y - 1, BlockZ); char BlockBelow = World->GetBlock(BlockX, (int)GetPosY() - 1, BlockZ);
if (BlockBelow == E_BLOCK_AIR || IsBlockWater(BlockBelow)) if (BlockBelow == E_BLOCK_AIR || IsBlockWater(BlockBelow))
{ {
m_bOnGround = false; m_bOnGround = false;
} }
char Block = World->GetBlock(BlockX, (int)m_Pos.y - (int)m_bOnGround, BlockZ ); char Block = World->GetBlock(BlockX, (int)GetPosY() - (int)m_bOnGround, BlockZ );
char BlockIn = World->GetBlock(BlockX, (int)m_Pos.y, BlockZ ); char BlockIn = World->GetBlock(BlockX, (int)GetPosY(), BlockZ );
if( IsBlockLava(Block) || Block == E_BLOCK_FIRE if( IsBlockLava(Block) || Block == E_BLOCK_FIRE
|| IsBlockLava(BlockIn) || BlockIn == E_BLOCK_FIRE) || IsBlockLava(BlockIn) || BlockIn == E_BLOCK_FIRE)
@ -129,17 +129,17 @@ void cPickup::HandlePhysics(float a_Dt)
if( BlockIn != E_BLOCK_AIR && !IsBlockWater(BlockIn) ) // If in ground itself, push it out if( BlockIn != E_BLOCK_AIR && !IsBlockWater(BlockIn) ) // If in ground itself, push it out
{ {
m_bOnGround = true; m_bOnGround = true;
m_Pos.y += 0.2; SetPosY(GetPosY() + 0.2);
m_bReplicated = false; m_bReplicated = false;
} }
m_Speed.x *= 0.7f / (1 + a_Dt); SetSpeedX(GetSpeedX() * 0.7f/(1+a_Dt));
if (fabs(m_Speed.x) < 0.05) m_Speed.x = 0; if( fabs(GetSpeedX()) < 0.05 ) SetSpeedX(0);
m_Speed.z *= 0.7f / (1 + a_Dt); SetSpeedZ(GetSpeedZ() * 0.7f/(1+a_Dt));
if (fabs(m_Speed.z) < 0.05) m_Speed.z = 0; if( fabs(GetSpeedZ()) < 0.05 ) SetSpeedZ(0);
} }
// get flowing direction // get flowing direction
Direction WaterDir = World->GetWaterSimulator()->GetFlowingDirection((int) m_Pos.x - 1, (int) m_Pos.y, (int) m_Pos.z - 1); Direction WaterDir = World->GetWaterSimulator()->GetFlowingDirection((int) GetSpeedX() - 1, (int) GetSpeedY(), (int) GetSpeedZ() - 1);
m_WaterSpeed *= 0.9f; //Keep old speed but lower it m_WaterSpeed *= 0.9f; //Keep old speed but lower it
@ -176,10 +176,10 @@ void cPickup::HandlePhysics(float a_Dt)
{ {
Gravity = -3; Gravity = -3;
} }
m_Speed.y += Gravity; SetSpeedY(GetSpeedY() + Gravity);
// Set to hit position // Set to hit position
m_ResultingSpeed += m_Speed; m_ResultingSpeed += GetSpeed();
/* /*
LOGD("Pickup #%d speed: {%.03f, %.03f, %.03f}, pos {%.02f, %.02f, %.02f}", LOGD("Pickup #%d speed: {%.03f, %.03f, %.03f}, pos {%.02f, %.02f, %.02f}",
@ -190,38 +190,38 @@ void cPickup::HandlePhysics(float a_Dt)
*/ */
cTracer Tracer(GetWorld()); cTracer Tracer(GetWorld());
int Ret = Tracer.Trace(m_Pos, m_Speed, 2); int Ret = Tracer.Trace(GetPosition(), GetSpeed(), 2);
if (Ret) // Oh noez! we hit something if (Ret) // Oh noez! we hit something
{ {
if ((Tracer.RealHit - Vector3f(m_Pos)).SqrLength() <= ( m_ResultingSpeed * a_Dt ).SqrLength()) if ((Tracer.RealHit - Vector3f(GetPosition())).SqrLength() <= ( m_ResultingSpeed * a_Dt ).SqrLength())
{ {
m_bReplicated = false; // It's only interesting to replicate when we actually hit something... m_bReplicated = false; // It's only interesting to replicate when we actually hit something...
if (Ret == 1) if (Ret == 1)
{ {
if (Tracer.HitNormal.x != 0.f ) m_Speed.x = 0.f; if( Tracer.HitNormal.x != 0.f ) SetSpeedX(0.f);
if (Tracer.HitNormal.y != 0.f ) m_Speed.y = 0.f; if( Tracer.HitNormal.y != 0.f ) SetSpeedY(0.f);
if (Tracer.HitNormal.z != 0.f ) m_Speed.z = 0.f; if( Tracer.HitNormal.z != 0.f ) SetSpeedZ(0.f);
if (Tracer.HitNormal.y > 0) // means on ground if (Tracer.HitNormal.y > 0) // means on ground
{ {
m_bOnGround = true; m_bOnGround = true;
} }
} }
m_Pos = Tracer.RealHit; SetPosition(Tracer.RealHit);
m_Pos += Tracer.HitNormal * 0.2f; SetPosition(GetPosition() + (Tracer.HitNormal * 0.2f));
} }
else else
m_Pos += m_ResultingSpeed * a_Dt; SetPosition(GetPosition() + (m_ResultingSpeed*a_Dt));
} }
else else
{ // We didn't hit anything, so move =] { // We didn't hit anything, so move =]
m_Pos += m_ResultingSpeed * a_Dt; SetPosition(GetPosition() + (m_ResultingSpeed*a_Dt));
} }
} }
// Usable for debugging // Usable for debugging
SetPosition(m_Pos.x, m_Pos.y, m_Pos.z); //SetPosition(m_Pos.x, m_Pos.y, m_Pos.z);
} }
@ -255,7 +255,7 @@ bool cPickup::CollectedBy(cPlayer * a_Dest)
{ {
cItems Pickup; cItems Pickup;
Pickup.push_back(cItem(m_Item)); Pickup.push_back(cItem(m_Item));
m_World->SpawnItemPickups(Pickup, m_Pos.x, m_Pos.y, m_Pos.z); m_World->SpawnItemPickups(Pickup, GetPosX(), GetPosY(), GetPosZ());
} }
return true; return true;
} }

View File

@ -80,17 +80,17 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName)
if (!LoadFromDisk()) if (!LoadFromDisk())
{ {
m_Inventory.Clear(); m_Inventory.Clear();
m_Pos.x = cRoot::Get()->GetDefaultWorld()->GetSpawnX(); SetPosX(cRoot::Get()->GetDefaultWorld()->GetSpawnX());
m_Pos.y = cRoot::Get()->GetDefaultWorld()->GetSpawnY(); SetPosY(cRoot::Get()->GetDefaultWorld()->GetSpawnY());
m_Pos.z = cRoot::Get()->GetDefaultWorld()->GetSpawnZ(); SetPosZ(cRoot::Get()->GetDefaultWorld()->GetSpawnZ());
LOGD("Player \"%s\" is connecting for the first time, spawning at default world spawn {%.2f, %.2f, %.2f}", LOGD("Player \"%s\" is connecting for the first time, spawning at default world spawn {%.2f, %.2f, %.2f}",
a_PlayerName.c_str(), m_Pos.x, m_Pos.y, m_Pos.z a_PlayerName.c_str(), GetPosX(), GetPosY(), GetPosZ()
); );
} }
m_LastJumpHeight = (float)(m_Pos.y); m_LastJumpHeight = (float)(GetPosY());
m_LastGroundHeight = (float)(m_Pos.y); m_LastGroundHeight = (float)(GetPosY());
m_Stance = m_Pos.y + 1.62; m_Stance = GetPosY() + 1.62;
} }
@ -267,9 +267,9 @@ void cPlayer::SetTouchGround(bool a_bTouchGround)
if (!m_bTouchGround) if (!m_bTouchGround)
{ {
if(m_Pos.y > m_LastJumpHeight) m_LastJumpHeight = (float)m_Pos.y; if(GetPosY() > m_LastJumpHeight) m_LastJumpHeight = (float)GetPosY();
cWorld* World = GetWorld(); cWorld* World = GetWorld();
char BlockID = World->GetBlock( float2int(m_Pos.x), float2int(m_Pos.y), float2int(m_Pos.z) ); char BlockID = World->GetBlock( float2int(GetPosX()), float2int(GetPosY()), float2int(GetPosZ()) );
if( BlockID != E_BLOCK_AIR ) if( BlockID != E_BLOCK_AIR )
{ {
// LOGD("TouchGround set to true by server"); // LOGD("TouchGround set to true by server");
@ -278,22 +278,22 @@ void cPlayer::SetTouchGround(bool a_bTouchGround)
if( BlockID == E_BLOCK_WATER || BlockID == E_BLOCK_STATIONARY_WATER || BlockID == E_BLOCK_LADDER || BlockID == E_BLOCK_VINES ) if( BlockID == E_BLOCK_WATER || BlockID == E_BLOCK_STATIONARY_WATER || BlockID == E_BLOCK_LADDER || BlockID == E_BLOCK_VINES )
{ {
// LOGD("Water / Ladder / Torch"); // LOGD("Water / Ladder / Torch");
m_LastGroundHeight = (float)m_Pos.y; m_LastGroundHeight = (float)GetPosY();
} }
} }
if (m_bTouchGround) if (m_bTouchGround)
{ {
float Dist = (float)(m_LastGroundHeight - floor(m_Pos.y)); float Dist = (float)(m_LastGroundHeight - floor(GetPosY()));
int Damage = (int)(Dist - 3.f); int Damage = (int)(Dist - 3.f);
if(m_LastJumpHeight > m_LastGroundHeight) Damage++; if(m_LastJumpHeight > m_LastGroundHeight) Damage++;
m_LastJumpHeight = (float)m_Pos.y; m_LastJumpHeight = (float)GetPosY();
if (Damage > 0) if (Damage > 0)
{ {
super::TakeDamage(dtFalling, NULL, Damage, Damage, 0); super::TakeDamage(dtFalling, NULL, Damage, Damage, 0);
} }
m_LastGroundHeight = (float)m_Pos.y; m_LastGroundHeight = (float)GetPosY();
} }
} }
@ -391,7 +391,7 @@ void cPlayer::KilledBy(cPawn * a_Killer)
} }
Items[i].Empty(); Items[i].Empty();
} }
m_World->SpawnItemPickups(Pickups, m_Pos.x, m_Pos.y, m_Pos.z, 10); m_World->SpawnItemPickups(Pickups, GetPosX(), GetPosY(), GetPosZ(), 10);
SaveToDisk(); // Save it, yeah the world is a tough place ! SaveToDisk(); // Save it, yeah the world is a tough place !
} }
@ -424,7 +424,7 @@ double cPlayer::GetEyeHeight()
Vector3d cPlayer::GetEyePosition() Vector3d cPlayer::GetEyePosition()
{ {
return Vector3d( m_Pos.x, m_Stance, m_Pos.z ); return Vector3d( GetPosX(), m_Stance, GetPosZ() );
} }
@ -558,7 +558,7 @@ void cPlayer::TeleportTo(double a_PosX, double a_PosY, double a_PosZ)
void cPlayer::MoveTo( const Vector3d & a_NewPos ) void cPlayer::MoveTo( const Vector3d & a_NewPos )
{ {
if ((a_NewPos.y < -990) && (m_Pos.y > -100)) if ((a_NewPos.y < -990) && (GetPosY() > -100))
{ {
// When attached to an entity, the client sends position packets with weird coords: // When attached to an entity, the client sends position packets with weird coords:
// Y = -999 and X, Z = attempting to create speed, usually up to 0.03 // Y = -999 and X, Z = attempting to create speed, usually up to 0.03
@ -952,17 +952,17 @@ bool cPlayer::LoadFromDisk()
Json::Value & JSON_PlayerPosition = root["position"]; Json::Value & JSON_PlayerPosition = root["position"];
if (JSON_PlayerPosition.size() == 3) if (JSON_PlayerPosition.size() == 3)
{ {
m_Pos.x = JSON_PlayerPosition[(unsigned int)0].asDouble(); SetPosX(JSON_PlayerPosition[(unsigned int)0].asDouble());
m_Pos.y = JSON_PlayerPosition[(unsigned int)1].asDouble(); SetPosY(JSON_PlayerPosition[(unsigned int)1].asDouble());
m_Pos.z = JSON_PlayerPosition[(unsigned int)2].asDouble(); SetPosZ(JSON_PlayerPosition[(unsigned int)2].asDouble());
} }
Json::Value & JSON_PlayerRotation = root["rotation"]; Json::Value & JSON_PlayerRotation = root["rotation"];
if (JSON_PlayerRotation.size() == 3) if (JSON_PlayerRotation.size() == 3)
{ {
m_Rot.x = (float)JSON_PlayerRotation[(unsigned int)0].asDouble(); SetRotation ((float)JSON_PlayerRotation[(unsigned int)0].asDouble());
m_Rot.y = (float)JSON_PlayerRotation[(unsigned int)1].asDouble(); SetPitch ((float)JSON_PlayerRotation[(unsigned int)1].asDouble());
m_Rot.z = (float)JSON_PlayerRotation[(unsigned int)2].asDouble(); SetRoll ((float)JSON_PlayerRotation[(unsigned int)2].asDouble());
} }
m_Health = (short)root.get("health", 0 ).asInt(); m_Health = (short)root.get("health", 0 ).asInt();
@ -976,7 +976,7 @@ bool cPlayer::LoadFromDisk()
m_LoadedWorldName = root.get("world", "world").asString(); m_LoadedWorldName = root.get("world", "world").asString();
LOGD("Player \"%s\" was read from file, spawning at {%.2f, %.2f, %.2f} in world \"%s\"", LOGD("Player \"%s\" was read from file, spawning at {%.2f, %.2f, %.2f} in world \"%s\"",
m_PlayerName.c_str(), m_Pos.x, m_Pos.y, m_Pos.z, m_LoadedWorldName.c_str() m_PlayerName.c_str(), GetPosX(), GetPosY(), GetPosZ(), m_LoadedWorldName.c_str()
); );
return true; return true;
@ -992,14 +992,14 @@ bool cPlayer::SaveToDisk()
// create the JSON data // create the JSON data
Json::Value JSON_PlayerPosition; Json::Value JSON_PlayerPosition;
JSON_PlayerPosition.append( Json::Value( m_Pos.x ) ); JSON_PlayerPosition.append( Json::Value( GetPosX() ) );
JSON_PlayerPosition.append( Json::Value( m_Pos.y ) ); JSON_PlayerPosition.append( Json::Value( GetPosY() ) );
JSON_PlayerPosition.append( Json::Value( m_Pos.z ) ); JSON_PlayerPosition.append( Json::Value( GetPosZ() ) );
Json::Value JSON_PlayerRotation; Json::Value JSON_PlayerRotation;
JSON_PlayerRotation.append( Json::Value( m_Rot.x ) ); JSON_PlayerRotation.append( Json::Value( GetRotation() ) );
JSON_PlayerRotation.append( Json::Value( m_Rot.y ) ); JSON_PlayerRotation.append( Json::Value( GetPitch() ) );
JSON_PlayerRotation.append( Json::Value( m_Rot.z ) ); JSON_PlayerRotation.append( Json::Value( GetRoll() ) );
Json::Value JSON_Inventory; Json::Value JSON_Inventory;
m_Inventory.SaveToJson( JSON_Inventory ); m_Inventory.SaveToJson( JSON_Inventory );

View File

@ -61,7 +61,7 @@ public:
double GetEyeHeight(); // tolua_export double GetEyeHeight(); // tolua_export
Vector3d GetEyePosition(); // tolua_export Vector3d GetEyePosition(); // tolua_export
inline bool IsOnGround(void) const {return m_bTouchGround; } // tolua_export inline bool IsOnGround(void) const {return m_bTouchGround; } // tolua_export
inline const double GetStance(void) const { return m_Pos.y + 1.62; } // tolua_export // TODO: Proper stance when crouching etc. inline const double GetStance(void) const { return GetPosY() + 1.62; } // tolua_export // TODO: Proper stance when crouching etc.
inline cInventory & GetInventory(void) { return m_Inventory; } // tolua_export inline cInventory & GetInventory(void) { return m_Inventory; } // tolua_export
inline const cInventory & GetInventory(void) const { return m_Inventory; } inline const cInventory & GetInventory(void) const { return m_Inventory; }