1
0

Double chests are formed correctly in all situations (meta is adjusted for the neighboring chest)

git-svn-id: http://mc-server.googlecode.com/svn/trunk@991 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
madmaxoft@gmail.com 2012-10-20 20:16:55 +00:00
parent 573480b1fe
commit 12edc53ab5
2 changed files with 88 additions and 10 deletions

View File

@ -3,7 +3,6 @@
#include "BlockEntity.h"
#include "../World.h"
#include "../Piston.h"
#include "../Player.h"
@ -22,7 +21,38 @@ public:
virtual void PlaceBlock(cWorld * a_World, cPlayer * a_Player, NIBBLETYPE a_BlockMeta, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Dir) override
{
a_World->SetBlock(a_BlockX, a_BlockY, a_BlockZ, m_BlockType, cPiston::RotationPitchToMetaData(a_Player->GetRotation(), 0));
// Check if this forms a doublechest, if so, need to adjust the meta:
cBlockArea Area;
if (Area.Read(a_World, a_BlockX - 1, a_BlockX + 1, a_BlockY, a_BlockY, a_BlockZ - 1, a_BlockZ + 1))
{
float rot = a_Player->GetRotation();
// Choose meta from player rotation, choose only between 2 or 3
NIBBLETYPE NewMeta = ((rot >= -90) && (rot < 90)) ? 2 : 3;
if (
CheckAndAdjustNeighbor(a_World, Area, 0, 1, NewMeta) ||
CheckAndAdjustNeighbor(a_World, Area, 2, 1, NewMeta)
)
{
// Forming a double chest in the X direction
a_World->SetBlock(a_BlockX, a_BlockY, a_BlockZ, m_BlockType, NewMeta);
OnPlacedByPlayer(a_World, a_Player, a_BlockX, a_BlockY, a_BlockZ, a_Dir);
return;
}
// Choose meta from player rotation, choose only between 4 or 5
NewMeta = (rot < 0) ? 4 : 5;
if (
CheckAndAdjustNeighbor(a_World, Area, 1, 0, NewMeta) ||
CheckAndAdjustNeighbor(a_World, Area, 2, 2, NewMeta)
)
{
// Forming a double chest in the Z direction
a_World->SetBlock(a_BlockX, a_BlockY, a_BlockZ, m_BlockType, NewMeta);
OnPlacedByPlayer(a_World, a_Player, a_BlockX, a_BlockY, a_BlockZ, a_Dir);
return;
}
}
// Single chest or unable to read neighbors (don't really care, then):
a_World->SetBlock(a_BlockX, a_BlockY, a_BlockZ, m_BlockType, RotationToMetaData(a_Player->GetRotation()));
OnPlacedByPlayer(a_World, a_Player, a_BlockX, a_BlockY, a_BlockZ, a_Dir);
}
@ -99,6 +129,44 @@ public:
}
/// Translates player rotation when placing a chest into the chest block metadata. Valid for single chests only
static NIBBLETYPE RotationToMetaData(float a_Rotation)
{
a_Rotation += 90 + 45; // So its not aligned with axis
if (a_Rotation > 360.f)
{
a_Rotation -= 360.f;
}
if ((a_Rotation >= 0.f) && (a_Rotation < 90.f))
{
return 0x4;
}
else if ((a_Rotation >= 180) && (a_Rotation < 270))
{
return 0x5;
}
else if ((a_Rotation >= 90) && (a_Rotation < 180))
{
return 0x2;
}
else
{
return 0x3;
}
}
/// If there's a chest in the a_Area in the specified coords, modifies its meta to a_NewMeta and returns true.
bool CheckAndAdjustNeighbor(cWorld * a_World, const cBlockArea & a_Area, int a_RelX, int a_RelZ, NIBBLETYPE a_NewMeta)
{
if (a_Area.GetRelBlockType(a_RelX, 0, a_RelZ) != E_BLOCK_CHEST)
{
return false;
}
a_World->SetBlockMeta(a_Area.GetOriginX() + a_RelX, a_Area.GetOriginY(), a_Area.GetOriginZ() + a_RelZ, a_NewMeta);
return true;
}
} ;

View File

@ -3,25 +3,35 @@
class cStairs //tolua_export
{ //tolua_export
public:
static char RotationToMetaData( float a_Rotation, int a_Direction ) //tolua_export
static NIBBLETYPE RotationToMetaData( float a_Rotation, char a_BlockFace) //tolua_export
{ //tolua_export
a_Rotation += 90 + 45; // So its not aligned with axis
char result = 0x0;
if( a_Direction == 0)
NIBBLETYPE result = 0x0;
if (a_BlockFace == BLOCK_FACE_BOTTOM)
{
result = 0x4;
}
if( a_Rotation > 360.f ) a_Rotation -= 360.f;
if( a_Rotation >= 0.f && a_Rotation < 90.f )
if (a_Rotation > 360.f)
{
a_Rotation -= 360.f;
}
if ((a_Rotation >= 0.f) && (a_Rotation < 90.f))
{
return result;
else if( a_Rotation >= 180 && a_Rotation < 270 )
}
else if ((a_Rotation >= 180) && (a_Rotation < 270))
{
result += 0x1;
else if( a_Rotation >= 90 && a_Rotation < 180 )
}
else if ((a_Rotation >= 90) && (a_Rotation < 180))
{
result += 0x2;
}
else
{
result += 0x3;
}
return result;
} //tolua_export