2013-09-10 21:09:31 +00:00
# pragma once
# include "BlockHandler.h"
class cBlockPumpkinHandler :
public cBlockHandler
{
public :
cBlockPumpkinHandler ( BLOCKTYPE a_BlockType )
: cBlockHandler ( a_BlockType )
{
}
2013-12-24 18:25:34 +00:00
2013-12-22 19:15:56 +00:00
virtual void OnPlacedByPlayer ( cWorld * a_World , cPlayer * a_Player , int a_BlockX , int a_BlockY , int a_BlockZ , char a_BlockFace , int a_CursorX , int a_CursorY , int a_CursorZ , BLOCKTYPE a_BlockType , NIBBLETYPE a_BlockMeta ) override
{
2013-12-25 15:59:26 +00:00
virtual void OnPlacedByPlayer ( cWorld * a_World , cPlayer * a_Player , int a_BlockX , int a_BlockY , int a_BlockZ , char a_BlockFace , int a_CursorX , int a_CursorY , int a_CursorZ , BLOCKTYPE a_BlockType , NIBBLETYPE a_BlockMeta ) override
{
if ( ! a_BlockY > 1 ) // Make sure server won't check for inexistent blocks (below y=0).
{
return ;
}
BLOCKTYPE BlockY1 = a_World - > GetBlock ( a_BlockX , a_BlockY - 1 , a_BlockZ ) ;
BLOCKTYPE BlockY2 = a_World - > GetBlock ( a_BlockX , a_BlockY - 2 , a_BlockZ ) ; // We don't need to check this 2 blocks more than 1 time.
if ( ( BlockY1 = = E_BLOCK_SNOW_BLOCK ) & & ( BlockY2 = = E_BLOCK_SNOW_BLOCK ) ) //If the first two blocks below the pumpkin are snow blocks, spawn a snow golem.
{
a_World - > FastSetBlock ( a_BlockX , a_BlockY , a_BlockZ , E_BLOCK_AIR , 0 ) ;
a_World - > FastSetBlock ( a_BlockX , a_BlockY - 1 , a_BlockZ , E_BLOCK_AIR , 0 ) ;
a_World - > FastSetBlock ( a_BlockX , a_BlockY - 2 , a_BlockZ , E_BLOCK_AIR , 0 ) ;
a_World - > SpawnMob ( a_BlockX + 0.5 , a_BlockY - 2 , a_BlockZ + 0.5 , cMonster : : mtSnowGolem ) ;
}
else if ( ( BlockY1 = = E_BLOCK_IRON_BLOCK ) & & ( BlockY2 = = E_BLOCK_IRON_BLOCK ) ) //If the first two blocks below the pumpkin are iron blocks, spawn an iron golem.
2013-12-22 19:15:56 +00:00
{
2013-12-25 15:59:26 +00:00
if ( ( a_World - > GetBlock ( a_BlockX + 1 , a_BlockY - 1 , a_BlockZ ) = = E_BLOCK_IRON_BLOCK ) & & ( a_World - > GetBlock ( a_BlockX - 1 , a_BlockY - 1 , a_BlockZ ) = = E_BLOCK_IRON_BLOCK ) ) //Check the first possible locations for arms.
2013-12-24 11:23:20 +00:00
{
a_World - > FastSetBlock ( a_BlockX , a_BlockY , a_BlockZ , E_BLOCK_AIR , 0 ) ;
a_World - > FastSetBlock ( a_BlockX , a_BlockY - 1 , a_BlockZ , E_BLOCK_AIR , 0 ) ;
2013-12-25 15:59:26 +00:00
a_World - > FastSetBlock ( a_BlockX + 1 , a_BlockY - 1 , a_BlockZ , E_BLOCK_AIR , 0 ) ;
a_World - > FastSetBlock ( a_BlockX - 1 , a_BlockY - 1 , a_BlockZ , E_BLOCK_AIR , 0 ) ;
a_World - > FastSetBlock ( a_BlockX , a_BlockY - 2 , a_BlockZ , E_BLOCK_AIR , 0 ) ; //Set all blocks used for creation to air.
a_World - > SpawnMob ( a_BlockX + 0.5 , a_BlockY - 2 , a_BlockZ + 0.5 , cMonster : : mtIronGolem ) ; //Spawn an iron golem.
2013-12-24 11:23:20 +00:00
}
2013-12-25 15:59:26 +00:00
else if ( ( a_World - > GetBlock ( a_BlockX , a_BlockY - 1 , a_BlockZ + 1 ) = = E_BLOCK_IRON_BLOCK ) & & ( a_World - > GetBlock ( a_BlockX , a_BlockY - 1 , a_BlockZ - 1 ) = = E_BLOCK_IRON_BLOCK ) ) //Check the other possible locations.
2013-12-24 11:23:20 +00:00
{
2013-12-25 15:59:26 +00:00
a_World - > FastSetBlock ( a_BlockX , a_BlockY , a_BlockZ , E_BLOCK_AIR , 0 ) ;
a_World - > FastSetBlock ( a_BlockX , a_BlockY - 1 , a_BlockZ , E_BLOCK_AIR , 0 ) ;
a_World - > FastSetBlock ( a_BlockX , a_BlockY - 1 , a_BlockZ + 1 , E_BLOCK_AIR , 0 ) ;
a_World - > FastSetBlock ( a_BlockX , a_BlockY - 1 , a_BlockZ - 1 , E_BLOCK_AIR , 0 ) ;
a_World - > FastSetBlock ( a_BlockX , a_BlockY - 2 , a_BlockZ , E_BLOCK_AIR , 0 ) ;
a_World - > SpawnMob ( a_BlockX + 0.5 , a_BlockY - 2 , a_BlockZ + 0.5 , cMonster : : mtIronGolem ) ;
2013-12-24 11:23:20 +00:00
}
2013-12-22 19:15:56 +00:00
}
}
2013-12-25 15:59:26 +00:00
}
2013-12-22 19:15:56 +00:00
2013-09-10 21:09:31 +00:00
virtual bool GetPlacementBlockTypeMeta (
cWorld * a_World , cPlayer * a_Player ,
int a_BlockX , int a_BlockY , int a_BlockZ , char a_BlockFace ,
int a_CursorX , int a_CursorY , int a_CursorZ ,
BLOCKTYPE & a_BlockType , NIBBLETYPE & a_BlockMeta
) override
{
a_BlockType = m_BlockType ;
2013-09-11 16:07:54 +00:00
a_BlockMeta = PlayerYawToMetaData ( a_Player - > GetRotation ( ) ) ;
2013-09-10 21:09:31 +00:00
return true ;
}
inline static NIBBLETYPE PlayerYawToMetaData ( double a_Yaw )
{
2013-09-11 16:07:54 +00:00
ASSERT ( ( a_Yaw > = - 180 ) & & ( a_Yaw < 180 ) ) ;
2013-09-11 19:07:51 +00:00
a_Yaw + = 180 + 45 ;
2013-09-10 21:09:31 +00:00
if ( a_Yaw > 360 )
{
a_Yaw - = 360 ;
}
if ( ( a_Yaw > = 0 ) & & ( a_Yaw < 90 ) )
{
return 0x0 ;
}
else if ( ( a_Yaw > = 180 ) & & ( a_Yaw < 270 ) )
{
return 0x2 ;
}
else if ( ( a_Yaw > = 90 ) & & ( a_Yaw < 180 ) )
{
return 0x1 ;
}
else
{
return 0x3 ;
}
}
} ;