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 ) ;
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 )
{
eBlockFace Dir ;
// 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 )
{
case 0 : Dir = BLOCK_FACE_ZP ; break ;
case 2 : Dir = BLOCK_FACE_ZM ; break ;
case 1 : Dir = BLOCK_FACE_XM ; break ;
case 3 : Dir = BLOCK_FACE_XP ; break ;
default :
{
LOGINFO ( " Invalid facing (%d) in a cHangingEntity, adjusting to BLOCK_FACE_XP. " , a_ProtocolFace ) ;
ASSERT ( ! " Tried to convert a bad facing! " ) ;
Dir = cHangingEntity : : ProtocolFaceToBlockFace ( 3 ) ;
}
}
return Dir ;
}
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 )
{
Byte Dir ;
// 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 )
{
case BLOCK_FACE_ZP : Dir = 0 ; break ;
case BLOCK_FACE_ZM : Dir = 2 ; break ;
case BLOCK_FACE_XM : Dir = 1 ; break ;
case BLOCK_FACE_XP : Dir = 3 ; break ;
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
Dir = cHangingEntity : : BlockFaceToProtocolFace ( BLOCK_FACE_XP ) ;
2015-06-24 07:38:28 -04:00
break ;
2015-03-13 18:29:27 -04:00
}
2015-06-02 06:51:43 -04:00
# if !defined(__clang__)
default :
{
ASSERT ( ! " Unknown BLOCK_FACE " ) ;
return 0 ;
}
# endif
2015-03-13 18:29:27 -04:00
}
return Dir ;
}
2014-03-14 21:45:25 -04:00
} ; // tolua_export