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-c427514a06d6master
parent
573480b1fe
commit
12edc53ab5
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
#include "BlockEntity.h"
|
#include "BlockEntity.h"
|
||||||
#include "../World.h"
|
#include "../World.h"
|
||||||
#include "../Piston.h"
|
|
||||||
#include "../Player.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
|
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);
|
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;
|
||||||
|
}
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,25 +3,35 @@
|
||||||
class cStairs //tolua_export
|
class cStairs //tolua_export
|
||||||
{ //tolua_export
|
{ //tolua_export
|
||||||
public:
|
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
|
{ //tolua_export
|
||||||
a_Rotation += 90 + 45; // So its not aligned with axis
|
a_Rotation += 90 + 45; // So its not aligned with axis
|
||||||
char result = 0x0;
|
NIBBLETYPE result = 0x0;
|
||||||
if( a_Direction == 0)
|
if (a_BlockFace == BLOCK_FACE_BOTTOM)
|
||||||
{
|
{
|
||||||
|
|
||||||
result = 0x4;
|
result = 0x4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( a_Rotation > 360.f ) a_Rotation -= 360.f;
|
if (a_Rotation > 360.f)
|
||||||
if( a_Rotation >= 0.f && a_Rotation < 90.f )
|
{
|
||||||
|
a_Rotation -= 360.f;
|
||||||
|
}
|
||||||
|
if ((a_Rotation >= 0.f) && (a_Rotation < 90.f))
|
||||||
|
{
|
||||||
return result;
|
return result;
|
||||||
else if( a_Rotation >= 180 && a_Rotation < 270 )
|
}
|
||||||
|
else if ((a_Rotation >= 180) && (a_Rotation < 270))
|
||||||
|
{
|
||||||
result += 0x1;
|
result += 0x1;
|
||||||
else if( a_Rotation >= 90 && a_Rotation < 180 )
|
}
|
||||||
|
else if ((a_Rotation >= 90) && (a_Rotation < 180))
|
||||||
|
{
|
||||||
result += 0x2;
|
result += 0x2;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
result += 0x3;
|
result += 0x3;
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
} //tolua_export
|
} //tolua_export
|
||||||
|
|
Loading…
Reference in New Issue