From 1e452425469e4a0cbf61fce698eb3ad89fb80a77 Mon Sep 17 00:00:00 2001 From: "luksor111@gmail.com" Date: Tue, 23 Oct 2012 18:13:37 +0000 Subject: New Block property g_BlockIsSolid[]; Fixed ladder, torches and vines placement. (Patch contributed by funmaker) git-svn-id: http://mc-server.googlecode.com/svn/trunk@1005 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/Blocks/BlockLadder.h | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) (limited to 'source/Blocks/BlockLadder.h') diff --git a/source/Blocks/BlockLadder.h b/source/Blocks/BlockLadder.h index 92826b721..0b53c4aaf 100644 --- a/source/Blocks/BlockLadder.h +++ b/source/Blocks/BlockLadder.h @@ -21,15 +21,52 @@ 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 { + if (!LadderCanBePlacedAt(a_World, a_BlockX, a_BlockY, a_BlockZ, a_Dir)) + { + a_Dir = FindSuitableDirection(a_World, a_BlockX, a_BlockY, a_BlockZ); + + if (a_Dir == BLOCK_FACE_BOTTOM) + { + return; + } + } + a_World->SetBlock(a_BlockX, a_BlockY, a_BlockZ, m_BlockType, cLadder::DirectionToMetaData(a_Dir)); OnPlacedByPlayer(a_World, a_Player, a_BlockX, a_BlockY, a_BlockZ, a_Dir); } + /// Finds a suitable Direction for the Ladder. Returns BLOCK_FACE_BOTTOM on failure + static char FindSuitableDirection(cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ) + { + for (int i = 2; i <= 5; i++) + { + if (LadderCanBePlacedAt(a_World, a_BlockX, a_BlockY, a_BlockZ, i)) + { + return i; + } + } + return BLOCK_FACE_BOTTOM; + } + - virtual bool CanBePlacedAt(cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Dir) override + static bool LadderCanBePlacedAt(cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Dir) { + if (a_Dir == BLOCK_FACE_BOTTOM || a_Dir == BLOCK_FACE_TOP ) + { + return false; + } + AddDirection( a_BlockX, a_BlockY, a_BlockZ, a_Dir, true ); - return a_World->GetBlock( a_BlockX, a_BlockY, a_BlockZ ) != E_BLOCK_AIR; + + return g_BlockIsSolid[a_World->GetBlock( a_BlockX, a_BlockY, a_BlockZ)]; + } + + + virtual bool CanBePlacedAt(cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Dir) override + { + if (LadderCanBePlacedAt(a_World, a_BlockX, a_BlockY, a_BlockZ, a_Dir)) + return true; + return FindSuitableDirection(a_World, a_BlockX, a_BlockY, a_BlockZ) != BLOCK_FACE_BOTTOM; } -- cgit v1.2.3