97 lines
2.3 KiB
C++
97 lines
2.3 KiB
C++
|
#include "cPawn.h"
|
||
|
#include "cRoot.h"
|
||
|
#include "cServer.h"
|
||
|
#include "cWorld.h"
|
||
|
#include "cPlayer.h"
|
||
|
#include "cChunk.h"
|
||
|
#include "cMCLogger.h"
|
||
|
#include "cPluginManager.h"
|
||
|
|
||
|
#include "packets/cPacket_TeleportEntity.h"
|
||
|
#include "packets/cPacket_EntityStatus.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_Health = 20;
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
cChunk* Chunk = cRoot::Get()->GetWorld()->GetChunkUnreliable( m_ChunkX, m_ChunkY, m_ChunkZ );
|
||
|
if( Chunk )
|
||
|
Chunk->Broadcast( 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;
|
||
|
cChunk* Chunk = cRoot::Get()->GetWorld()->GetChunkUnreliable( m_ChunkX, m_ChunkY, m_ChunkZ );
|
||
|
if( Chunk )
|
||
|
Chunk->Broadcast( Status ); // Die
|
||
|
}
|
||
|
|
||
|
void cPawn::TeleportTo( 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 );
|
||
|
if( IsA("cPlayer") )
|
||
|
{
|
||
|
cPlayer* Player = (cPlayer*)this;
|
||
|
cRoot::Get()->GetServer()->Broadcast( TeleportEntity, Player->GetClientHandle() );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
cRoot::Get()->GetServer()->Broadcast( TeleportEntity );
|
||
|
}
|
||
|
}
|