2014-03-14 21:45:25 -04:00
# pragma once
# include "Entity.h"
// tolua_begin
class cHangingEntity :
public cEntity
{
typedef cEntity super ;
public :
2014-10-21 16:02:30 -04:00
// tolua_end
2014-07-22 18:36:13 -04:00
CLASS_PROTODEF ( cHangingEntity )
2014-03-14 21:45:25 -04:00
cHangingEntity ( eEntityType a_EntityType , eBlockFace a_BlockFace , double a_X , double a_Y , double a_Z ) ;
2016-02-05 16:45:45 -05:00
2014-10-21 16:02:30 -04:00
// tolua_begin
/** Returns the direction in which the entity is facing. */
2015-03-13 18:29:27 -04:00
eBlockFace GetFacing ( ) const { return cHangingEntity : : ProtocolFaceToBlockFace ( m_Facing ) ; }
2014-10-21 16:02:30 -04:00
/** Set the direction in which the entity is facing. */
2015-04-19 15:34:56 -04:00
void SetFacing ( eBlockFace a_Facing )
{
m_Facing = cHangingEntity : : BlockFaceToProtocolFace ( a_Facing ) ;
}
2014-10-21 16:02:30 -04:00
// tolua_end
2014-03-14 21:45:25 -04:00
2015-03-13 18:29:27 -04:00
/** Returns the direction in which the entity is facing. */
Byte GetProtocolFacing ( ) const { return m_Facing ; }
/** Set the direction in which the entity is facing. */
void SetProtocolFacing ( Byte a_Facing )
{
2015-04-19 15:34:56 -04:00
ASSERT ( a_Facing < = 3 ) ;
2015-03-13 18:29:27 -04:00
m_Facing = a_Facing ;
}
2015-03-13 19:05:06 -04:00
protected :
2014-03-14 21:45:25 -04:00
2015-06-02 06:51:43 -04:00
Byte m_Facing ;
2014-03-14 21:45:25 -04:00
virtual void SpawnOn ( cClientHandle & a_ClientHandle ) override ;
2015-03-13 19:05:06 -04:00
virtual void Tick ( std : : chrono : : milliseconds a_Dt , cChunk & a_Chunk ) override
{
UNUSED ( a_Dt ) ;
UNUSED ( a_Chunk ) ;
}
2014-03-14 21:45:25 -04:00
2015-06-02 06:51:43 -04:00
2015-03-13 18:29:27 -04:00
/** Converts protocol hanging item facing to eBlockFace values */
inline static eBlockFace ProtocolFaceToBlockFace ( Byte a_ProtocolFace )
{
// The client uses different values for item frame directions and block faces. Our constants are for the block faces, so we convert them here to item frame faces
switch ( a_ProtocolFace )
{
2018-02-04 18:07:12 -05:00
case 0 : return BLOCK_FACE_ZP ;
case 2 : return BLOCK_FACE_ZM ;
case 1 : return BLOCK_FACE_XM ;
case 3 : return BLOCK_FACE_XP ;
2015-03-13 18:29:27 -04:00
default :
{
LOGINFO ( " Invalid facing (%d) in a cHangingEntity, adjusting to BLOCK_FACE_XP. " , a_ProtocolFace ) ;
ASSERT ( ! " Tried to convert a bad facing! " ) ;
2018-02-04 18:07:12 -05:00
return cHangingEntity : : ProtocolFaceToBlockFace ( 3 ) ;
2015-03-13 18:29:27 -04:00
}
}
}
2015-06-02 06:51:43 -04:00
2015-03-13 18:29:27 -04:00
/** Converts eBlockFace values to protocol hanging item faces */
inline static Byte BlockFaceToProtocolFace ( eBlockFace a_BlockFace )
{
// The client uses different values for item frame directions and block faces. Our constants are for the block faces, so we convert them here to item frame faces
switch ( a_BlockFace )
{
2018-02-04 18:07:12 -05:00
case BLOCK_FACE_ZP : return 0 ;
case BLOCK_FACE_ZM : return 2 ;
case BLOCK_FACE_XM : return 1 ;
case BLOCK_FACE_XP : return 3 ;
2015-05-19 14:32:10 -04:00
case BLOCK_FACE_YP :
case BLOCK_FACE_YM :
case BLOCK_FACE_NONE :
2015-03-13 18:29:27 -04:00
{
2015-03-13 19:22:09 -04:00
// Uncomment when entities are initialised with their real data, instead of dummy values:
2015-03-13 19:05:06 -04:00
// LOGINFO("Invalid facing (%d) in a cHangingEntity, adjusting to BLOCK_FACE_XP.", a_BlockFace);
// ASSERT(!"Tried to convert a bad facing!");
2015-03-13 18:29:27 -04:00
2018-02-04 18:07:12 -05:00
return cHangingEntity : : BlockFaceToProtocolFace ( BLOCK_FACE_XP ) ;
2015-03-13 18:29:27 -04:00
}
}
2018-02-04 18:07:12 -05:00
UNREACHABLE ( " Unsupported block face " ) ;
2015-03-13 18:29:27 -04:00
}
2014-03-14 21:45:25 -04:00
} ; // tolua_export