Simplified and fixed slabs, fixes #835
This commit is contained in:
parent
0836fe9a84
commit
ee07b7ae3e
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include "BlockHandler.h"
|
#include "BlockHandler.h"
|
||||||
#include "../Items/ItemHandler.h"
|
#include "../Items/ItemHandler.h"
|
||||||
|
#include "Root.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -38,41 +39,9 @@ public:
|
|||||||
) override
|
) override
|
||||||
{
|
{
|
||||||
a_BlockType = m_BlockType;
|
a_BlockType = m_BlockType;
|
||||||
BLOCKTYPE Type = (BLOCKTYPE) (a_Player->GetEquippedItem().m_ItemType);
|
|
||||||
NIBBLETYPE Meta = (NIBBLETYPE) a_Player->GetEquippedItem().m_ItemDamage;
|
NIBBLETYPE Meta = (NIBBLETYPE) a_Player->GetEquippedItem().m_ItemDamage;
|
||||||
|
|
||||||
// HandlePlaceBlock wants a cItemHandler pointer thing, so let's give it one
|
// Set the correct metadata based on player equipped item (i.e. a_BlockMeta not initialised yet)
|
||||||
cItemHandler * ItemHandler = cItemHandler::GetItemHandler(GetDoubleSlabType(Type));
|
|
||||||
|
|
||||||
// Check if the block at the coordinates is a slab. Eligibility for combining has already been processed in ClientHandle
|
|
||||||
if (IsAnySlabType(a_ChunkInterface.GetBlock(a_BlockX, a_BlockY, a_BlockZ)))
|
|
||||||
{
|
|
||||||
// Call the function in ClientHandle that places a block when the client sends the packet,
|
|
||||||
// so that plugins may interfere with the placement.
|
|
||||||
|
|
||||||
if ((a_BlockFace == BLOCK_FACE_TOP) || (a_BlockFace == BLOCK_FACE_BOTTOM))
|
|
||||||
{
|
|
||||||
// Top and bottom faces need no parameter modification
|
|
||||||
a_Player->GetClientHandle()->HandlePlaceBlock(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, *ItemHandler);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// The other faces need to distinguish between top and bottom cursor positions
|
|
||||||
if (a_CursorY > 7)
|
|
||||||
{
|
|
||||||
// Edit the call to use BLOCK_FACE_BOTTOM, otherwise it places incorrectly
|
|
||||||
a_Player->GetClientHandle()->HandlePlaceBlock(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_TOP, a_CursorX, a_CursorY, a_CursorZ, *ItemHandler);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Edit the call to use BLOCK_FACE_TOP, otherwise it places incorrectly
|
|
||||||
a_Player->GetClientHandle()->HandlePlaceBlock(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_BOTTOM, a_CursorX, a_CursorY, a_CursorZ, *ItemHandler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false; // Cancel the event, because dblslabs were already placed, nothing else needed
|
|
||||||
}
|
|
||||||
|
|
||||||
// Place the single-slab with correct metas:
|
|
||||||
switch (a_BlockFace)
|
switch (a_BlockFace)
|
||||||
{
|
{
|
||||||
case BLOCK_FACE_TOP:
|
case BLOCK_FACE_TOP:
|
||||||
@ -104,6 +73,14 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // switch (a_BlockFace)
|
} // switch (a_BlockFace)
|
||||||
|
|
||||||
|
// Check if the block at the coordinates is a single slab. Eligibility for combining has already been processed in ClientHandle
|
||||||
|
// Changed to-be-placed to a double slab if we are clicking on a single slab, as opposed to placing one for the first time
|
||||||
|
if (IsAnySlabType(a_ChunkInterface.GetBlock(a_BlockX, a_BlockY, a_BlockZ)))
|
||||||
|
{
|
||||||
|
a_BlockType = GetDoubleSlabType(m_BlockType);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1064,7 +1064,7 @@ void cClientHandle::HandlePlaceBlock(int a_BlockX, int a_BlockY, int a_BlockZ, e
|
|||||||
// If clicked top face and slab occupies the top voxel, we want a slab to be placed above it (therefore increment Y)
|
// If clicked top face and slab occupies the top voxel, we want a slab to be placed above it (therefore increment Y)
|
||||||
// Else if clicked bottom face and slab occupies the bottom voxel, decrement Y for the same reason
|
// Else if clicked bottom face and slab occupies the bottom voxel, decrement Y for the same reason
|
||||||
// Don't touch coordinates if anything else because a dblslab opportunity is present
|
// Don't touch coordinates if anything else because a dblslab opportunity is present
|
||||||
if((ClickedBlockMeta & 0x08) && (a_BlockFace == BLOCK_FACE_TOP))
|
if ((ClickedBlockMeta & 0x08) && (a_BlockFace == BLOCK_FACE_TOP))
|
||||||
{
|
{
|
||||||
++a_BlockY;
|
++a_BlockY;
|
||||||
}
|
}
|
||||||
|
@ -230,10 +230,10 @@ public:
|
|||||||
/** Called when the player moves into a different world; queues sreaming the new chunks */
|
/** Called when the player moves into a different world; queues sreaming the new chunks */
|
||||||
void MoveToWorld(cWorld & a_World, bool a_SendRespawnPacket);
|
void MoveToWorld(cWorld & a_World, bool a_SendRespawnPacket);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
/** Handles the block placing packet when it is a real block placement (not block-using, item-using or eating) */
|
/** Handles the block placing packet when it is a real block placement (not block-using, item-using or eating) */
|
||||||
void HandlePlaceBlock(int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, cItemHandler & a_ItemHandler);
|
void HandlePlaceBlock(int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, cItemHandler & a_ItemHandler);
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
/** The type used for storing the names of registered plugin channels. */
|
/** The type used for storing the names of registered plugin channels. */
|
||||||
typedef std::set<AString> cChannels;
|
typedef std::set<AString> cChannels;
|
||||||
|
Loading…
Reference in New Issue
Block a user