summaryrefslogtreecommitdiffstats
path: root/source/cPawn.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--source/cPawn.cpp504
1 files changed, 252 insertions, 252 deletions
diff --git a/source/cPawn.cpp b/source/cPawn.cpp
index 986d8904c..0037e56e4 100644
--- a/source/cPawn.cpp
+++ b/source/cPawn.cpp
@@ -1,252 +1,252 @@
-
-#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
-
-#include "cPawn.h"
-#include "cRoot.h"
-#include "cServer.h"
-#include "cWorld.h"
-#include "cPlayer.h"
-#include "cPluginManager.h"
-#include "Vector3d.h"
-#include "BlockID.h"
-
-#include "Defines.h"
-
-#include "packets/cPacket_TeleportEntity.h"
-#include "packets/cPacket_EntityStatus.h"
-#include "packets/cPacket_Metadata.h"
-
-
-
-
-
-CLASS_DEFINITION( cPawn, cEntity )
-
-
-
-
-
-cPawn::cPawn()
- : cEntity( 0, 0, 0 )
- , m_LastPosX( 0.0 )
- , m_LastPosY( 0.0 )
- , m_LastPosZ( 0.0 )
- , m_TimeLastTeleportPacket( 0.f )
- , m_bBurnable(true)
- , m_MetaData(NORMAL)
- , m_FireDamageInterval(0.f)
- , m_BurnPeriod(0.f)
-{
- SetMaxHealth(20);
- SetMaxFoodLevel(125);
-}
-
-
-
-
-
-cPawn::~cPawn()
-{
-
-}
-
-
-
-
-
-void cPawn::Heal( int a_Health )
-{
- (void)a_Health;
-}
-
-
-
-
-
-void cPawn::TakeDamage( int a_Damage, cEntity* a_Instigator )
-{
- TakeDamageInfo TDI;
- TDI.Damage = a_Damage;
- TDI.Instigator = a_Instigator;
- cRoot::Get()->GetPluginManager()->CallHook( cPluginManager::E_PLUGIN_TAKE_DAMAGE, 2, this, &TDI );
-
- if( TDI.Damage == 0 ) return;
- if( m_Health <= 0 ) return; // Can't take damage if already dead
-
- m_Health -= (short)TDI.Damage;
- if( m_Health < 0 ) m_Health = 0;
-
- cPacket_EntityStatus Status;
- Status.m_UniqueID = GetUniqueID();
- Status.m_Status = cPacket_EntityStatus::STATUS_TAKEDAMAGE;
- m_World->BroadcastToChunk(m_ChunkX, m_ChunkY, m_ChunkZ, Status);
-
- if (m_Health <= 0)
- {
- KilledBy( TDI.Instigator );
- }
-}
-
-
-
-
-
-void cPawn::KilledBy( cEntity* a_Killer )
-{
- m_Health = 0;
-
- if( cRoot::Get()->GetPluginManager()->CallHook( cPluginManager::E_PLUGIN_KILLED, 2, this, a_Killer ) )
- {
- return; // Give plugins a chance to 'unkill' the pawn.
- }
-
- cPacket_EntityStatus Status;
- Status.m_UniqueID = GetUniqueID();
- Status.m_Status = cPacket_EntityStatus::STATUS_DIE;
- m_World->BroadcastToChunk(m_ChunkX, m_ChunkY, m_ChunkZ, Status);
-}
-
-
-
-
-
-void cPawn::TeleportToEntity( cEntity* a_Entity )
-{
- TeleportTo( a_Entity->GetPosX(), a_Entity->GetPosY(), a_Entity->GetPosZ() );
-}
-
-
-
-
-
-void cPawn::TeleportTo( const double & a_PosX, const double & a_PosY, const double & a_PosZ )
-{
- SetPosition( a_PosX, a_PosY, a_PosZ );
-
- cPacket_TeleportEntity TeleportEntity( this );
-
- cRoot::Get()->GetServer()->Broadcast( TeleportEntity );
-}
-
-
-
-
-
-void cPawn::Tick(float a_Dt)
-{
- CheckMetaDataBurn(); //Check to see if pawn should burn based on block they are on
-
- if (GetMetaData() == BURNING)
- {
- InStateBurning(a_Dt);
- }
-}
-
-
-
-
-
-
-void cPawn::SetMetaData(MetaData a_MetaData)
-{
- //Broadcast new status to clients in the chunk
- m_MetaData = a_MetaData;
- cPacket_Metadata md(a_MetaData, GetUniqueID());
- m_World->BroadcastToChunk(m_ChunkX, m_ChunkY, m_ChunkZ, md);
-}
-
-
-
-
-
-//----Change Entity MetaData
-void cPawn::CheckMetaDataBurn()
-{
- char Block = GetWorld()->GetBlock((int) m_Pos.x, (int) m_Pos.y, (int) m_Pos.z);
- char BlockAbove = GetWorld()->GetBlock((int) m_Pos.x, (int) m_Pos.y + 1, (int) m_Pos.z);
- char BlockBelow = GetWorld()->GetBlock((int) m_Pos.x, (int) m_Pos.y - 1, (int) m_Pos.z);
-
- if (
- (GetMetaData() == BURNING) &&
- (IsBlockWater(Block) || IsBlockWater(BlockAbove) || IsBlockWater(BlockBelow))
- )
- {
- SetMetaData(NORMAL);
- }
- else if (
- m_bBurnable &&
- (GetMetaData() != BURNING) &&
- (
- IsBlockLava(Block) || (Block == E_BLOCK_FIRE) ||
- IsBlockLava(BlockAbove) || (BlockAbove == E_BLOCK_FIRE) ||
- IsBlockLava(BlockBelow) || (BlockBelow == E_BLOCK_FIRE)
- )
- )
- {
- SetMetaData(BURNING);
- }
-}
-
-
-
-
-
-//What to do if On fire
-void cPawn::InStateBurning(float a_Dt)
-{
- m_FireDamageInterval += a_Dt;
- char Block = GetWorld()->GetBlock( (int)m_Pos.x, (int)m_Pos.y, (int)m_Pos.z );
- char BlockAbove = GetWorld()->GetBlock( (int)m_Pos.x, (int)m_Pos.y + 1, (int)m_Pos.z );
- if (m_FireDamageInterval > 800)
- {
-
- m_FireDamageInterval = 0;
- TakeDamage(1, this);
-
- m_BurnPeriod++;
- if (IsBlockLava(Block) || Block == E_BLOCK_FIRE
- || IsBlockLava(BlockAbove) || BlockAbove == E_BLOCK_FIRE)
- {
- m_BurnPeriod = 0;
- TakeDamage(6, this);
- }
- else
- {
- TakeDamage(1, this);
- }
-
- if (m_BurnPeriod > 7)
- {
- SetMetaData(NORMAL);
- m_BurnPeriod = 0;
- }
- }
-}
-
-
-
-
-
-void cPawn::SetMaxHealth(short a_MaxHealth)
-{
- this->m_MaxHealth = a_MaxHealth;
-
- //Reset health
- m_Health = a_MaxHealth;
-}
-
-
-
-
-
-void cPawn::SetMaxFoodLevel(short a_MaxFoodLevel)
-{
- m_MaxFoodLevel = a_MaxFoodLevel;
-
- //Reset food level
- m_FoodLevel = a_MaxFoodLevel;
-}
-
-
-
-
+
+#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
+
+#include "cPawn.h"
+#include "cRoot.h"
+#include "cServer.h"
+#include "cWorld.h"
+#include "cPlayer.h"
+#include "cPluginManager.h"
+#include "Vector3d.h"
+#include "BlockID.h"
+
+#include "Defines.h"
+
+#include "packets/cPacket_TeleportEntity.h"
+#include "packets/cPacket_EntityStatus.h"
+#include "packets/cPacket_Metadata.h"
+
+
+
+
+
+CLASS_DEFINITION( cPawn, cEntity )
+
+
+
+
+
+cPawn::cPawn()
+ : cEntity( 0, 0, 0 )
+ , m_LastPosX( 0.0 )
+ , m_LastPosY( 0.0 )
+ , m_LastPosZ( 0.0 )
+ , m_TimeLastTeleportPacket( 0.f )
+ , m_bBurnable(true)
+ , m_MetaData(NORMAL)
+ , m_FireDamageInterval(0.f)
+ , m_BurnPeriod(0.f)
+{
+ SetMaxHealth(20);
+ SetMaxFoodLevel(125);
+}
+
+
+
+
+
+cPawn::~cPawn()
+{
+
+}
+
+
+
+
+
+void cPawn::Heal( int a_Health )
+{
+ (void)a_Health;
+}
+
+
+
+
+
+void cPawn::TakeDamage( int a_Damage, cEntity* a_Instigator )
+{
+ TakeDamageInfo TDI;
+ TDI.Damage = a_Damage;
+ TDI.Instigator = a_Instigator;
+ cRoot::Get()->GetPluginManager()->CallHook( cPluginManager::E_PLUGIN_TAKE_DAMAGE, 2, this, &TDI );
+
+ if( TDI.Damage == 0 ) return;
+ if( m_Health <= 0 ) return; // Can't take damage if already dead
+
+ m_Health -= (short)TDI.Damage;
+ if( m_Health < 0 ) m_Health = 0;
+
+ cPacket_EntityStatus Status;
+ Status.m_UniqueID = GetUniqueID();
+ Status.m_Status = cPacket_EntityStatus::STATUS_TAKEDAMAGE;
+ m_World->BroadcastToChunk(m_ChunkX, m_ChunkY, m_ChunkZ, Status);
+
+ if (m_Health <= 0)
+ {
+ KilledBy( TDI.Instigator );
+ }
+}
+
+
+
+
+
+void cPawn::KilledBy( cEntity* a_Killer )
+{
+ m_Health = 0;
+
+ if( cRoot::Get()->GetPluginManager()->CallHook( cPluginManager::E_PLUGIN_KILLED, 2, this, a_Killer ) )
+ {
+ return; // Give plugins a chance to 'unkill' the pawn.
+ }
+
+ cPacket_EntityStatus Status;
+ Status.m_UniqueID = GetUniqueID();
+ Status.m_Status = cPacket_EntityStatus::STATUS_DIE;
+ m_World->BroadcastToChunk(m_ChunkX, m_ChunkY, m_ChunkZ, Status);
+}
+
+
+
+
+
+void cPawn::TeleportToEntity( cEntity* a_Entity )
+{
+ TeleportTo( a_Entity->GetPosX(), a_Entity->GetPosY(), a_Entity->GetPosZ() );
+}
+
+
+
+
+
+void cPawn::TeleportTo( const double & a_PosX, const double & a_PosY, const double & a_PosZ )
+{
+ SetPosition( a_PosX, a_PosY, a_PosZ );
+
+ cPacket_TeleportEntity TeleportEntity( this );
+
+ cRoot::Get()->GetServer()->Broadcast( TeleportEntity );
+}
+
+
+
+
+
+void cPawn::Tick(float a_Dt)
+{
+ CheckMetaDataBurn(); //Check to see if pawn should burn based on block they are on
+
+ if (GetMetaData() == BURNING)
+ {
+ InStateBurning(a_Dt);
+ }
+}
+
+
+
+
+
+
+void cPawn::SetMetaData(MetaData a_MetaData)
+{
+ //Broadcast new status to clients in the chunk
+ m_MetaData = a_MetaData;
+ cPacket_Metadata md(a_MetaData, GetUniqueID());
+ m_World->BroadcastToChunk(m_ChunkX, m_ChunkY, m_ChunkZ, md);
+}
+
+
+
+
+
+//----Change Entity MetaData
+void cPawn::CheckMetaDataBurn()
+{
+ char Block = GetWorld()->GetBlock((int) m_Pos.x, (int) m_Pos.y, (int) m_Pos.z);
+ char BlockAbove = GetWorld()->GetBlock((int) m_Pos.x, (int) m_Pos.y + 1, (int) m_Pos.z);
+ char BlockBelow = GetWorld()->GetBlock((int) m_Pos.x, (int) m_Pos.y - 1, (int) m_Pos.z);
+
+ if (
+ (GetMetaData() == BURNING) &&
+ (IsBlockWater(Block) || IsBlockWater(BlockAbove) || IsBlockWater(BlockBelow))
+ )
+ {
+ SetMetaData(NORMAL);
+ }
+ else if (
+ m_bBurnable &&
+ (GetMetaData() != BURNING) &&
+ (
+ IsBlockLava(Block) || (Block == E_BLOCK_FIRE) ||
+ IsBlockLava(BlockAbove) || (BlockAbove == E_BLOCK_FIRE) ||
+ IsBlockLava(BlockBelow) || (BlockBelow == E_BLOCK_FIRE)
+ )
+ )
+ {
+ SetMetaData(BURNING);
+ }
+}
+
+
+
+
+
+//What to do if On fire
+void cPawn::InStateBurning(float a_Dt)
+{
+ m_FireDamageInterval += a_Dt;
+ char Block = GetWorld()->GetBlock( (int)m_Pos.x, (int)m_Pos.y, (int)m_Pos.z );
+ char BlockAbove = GetWorld()->GetBlock( (int)m_Pos.x, (int)m_Pos.y + 1, (int)m_Pos.z );
+ if (m_FireDamageInterval > 800)
+ {
+
+ m_FireDamageInterval = 0;
+ TakeDamage(1, this);
+
+ m_BurnPeriod++;
+ if (IsBlockLava(Block) || Block == E_BLOCK_FIRE
+ || IsBlockLava(BlockAbove) || BlockAbove == E_BLOCK_FIRE)
+ {
+ m_BurnPeriod = 0;
+ TakeDamage(6, this);
+ }
+ else
+ {
+ TakeDamage(1, this);
+ }
+
+ if (m_BurnPeriod > 7)
+ {
+ SetMetaData(NORMAL);
+ m_BurnPeriod = 0;
+ }
+ }
+}
+
+
+
+
+
+void cPawn::SetMaxHealth(short a_MaxHealth)
+{
+ this->m_MaxHealth = a_MaxHealth;
+
+ //Reset health
+ m_Health = a_MaxHealth;
+}
+
+
+
+
+
+void cPawn::SetMaxFoodLevel(short a_MaxFoodLevel)
+{
+ m_MaxFoodLevel = a_MaxFoodLevel;
+
+ //Reset food level
+ m_FoodLevel = a_MaxFoodLevel;
+}
+
+
+
+