Merge pull request #1216 from mc-server/saplingsandleaves
Fixed issues relating to saplings and leaves
This commit is contained in:
commit
b5e5586ab0
@ -175,32 +175,6 @@ static int tolua_get_AllToLua_g_BlockIsSnowable(lua_State* tolua_S)
|
||||
|
||||
|
||||
|
||||
/* get function: g_BlockRequiresSpecialTool */
|
||||
#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockRequiresSpecialTool
|
||||
static int tolua_get_AllToLua_g_BlockRequiresSpecialTool(lua_State* tolua_S)
|
||||
{
|
||||
int BlockType;
|
||||
#ifndef TOLUA_RELEASE
|
||||
{
|
||||
tolua_Error tolua_err;
|
||||
if (!tolua_isnumber(tolua_S, 2, 0, &tolua_err))
|
||||
tolua_error(tolua_S, "#vinvalid type in array indexing.", &tolua_err);
|
||||
}
|
||||
#endif
|
||||
BlockType = (int)tolua_tonumber(tolua_S, 2, 0);
|
||||
if ((BlockType < 0) || (BlockType > E_BLOCK_MAX_TYPE_ID))
|
||||
{
|
||||
tolua_error(tolua_S, "array indexing out of range.", NULL);
|
||||
}
|
||||
tolua_pushboolean(tolua_S, cBlockInfo::RequiresSpecialTool((BLOCKTYPE)BlockType));
|
||||
return 1;
|
||||
}
|
||||
#endif // #ifndef TOLUA_DISABLE
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* get function: g_BlockIsSolid */
|
||||
#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockIsSolid
|
||||
static int tolua_get_AllToLua_g_BlockIsSolid(lua_State* tolua_S)
|
||||
@ -263,7 +237,6 @@ void DeprecatedBindings::Bind(lua_State * tolua_S)
|
||||
tolua_array(tolua_S, "g_BlockOneHitDig", tolua_get_AllToLua_g_BlockOneHitDig, NULL);
|
||||
tolua_array(tolua_S, "g_BlockPistonBreakable", tolua_get_AllToLua_g_BlockPistonBreakable, NULL);
|
||||
tolua_array(tolua_S, "g_BlockIsSnowable", tolua_get_AllToLua_g_BlockIsSnowable, NULL);
|
||||
tolua_array(tolua_S, "g_BlockRequiresSpecialTool", tolua_get_AllToLua_g_BlockRequiresSpecialTool, NULL);
|
||||
tolua_array(tolua_S, "g_BlockIsSolid", tolua_get_AllToLua_g_BlockIsSolid, NULL);
|
||||
tolua_array(tolua_S, "g_BlockFullyOccupiesVoxel", tolua_get_AllToLua_g_BlockFullyOccupiesVoxel, NULL);
|
||||
|
||||
|
@ -15,7 +15,6 @@ cBlockInfo::cBlockInfo()
|
||||
, m_OneHitDig(false)
|
||||
, m_PistonBreakable(false)
|
||||
, m_IsSnowable(false)
|
||||
, m_RequiresSpecialTool(false)
|
||||
, m_IsSolid(true)
|
||||
, m_FullyOccupiesVoxel(false)
|
||||
, m_Handler(NULL)
|
||||
@ -440,51 +439,6 @@ void cBlockInfo::Initialize(cBlockInfoArray & a_Info)
|
||||
a_Info[E_BLOCK_TNT ].m_IsSnowable = true;
|
||||
a_Info[E_BLOCK_WOOL ].m_IsSnowable = true;
|
||||
|
||||
|
||||
// Blocks that don't drop without a special tool:
|
||||
a_Info[E_BLOCK_BRICK ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_CAULDRON ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_COAL_ORE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_COBBLESTONE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_COBBLESTONE_WALL ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_COBBLESTONE_STAIRS ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_COBWEB ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_DIAMOND_BLOCK ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_DIAMOND_ORE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_DOUBLE_STONE_SLAB ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_EMERALD_ORE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_END_STONE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_GOLD_BLOCK ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_GOLD_ORE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_IRON_BLOCK ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_IRON_ORE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_LAPIS_BLOCK ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_LAPIS_ORE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_LEAVES ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_MOSSY_COBBLESTONE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_NETHERRACK ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_NETHER_BRICK ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_NETHER_BRICK_STAIRS ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_OBSIDIAN ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_REDSTONE_ORE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_REDSTONE_ORE_GLOWING].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_SANDSTONE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_SANDSTONE_STAIRS ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_SNOW ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_STONE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_STONE_BRICKS ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_STONE_BRICK_STAIRS ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_STONE_PRESSURE_PLATE].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_STONE_SLAB ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_VINES ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_FURNACE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_LIT_FURNACE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_ANVIL ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_ENCHANTMENT_TABLE ].m_RequiresSpecialTool = true;
|
||||
|
||||
|
||||
// Nonsolid blocks:
|
||||
a_Info[E_BLOCK_ACTIVATOR_RAIL ].m_IsSolid = false;
|
||||
a_Info[E_BLOCK_AIR ].m_IsSolid = false;
|
||||
|
@ -39,9 +39,6 @@ public:
|
||||
/** Can this block hold snow atop? */
|
||||
bool m_IsSnowable;
|
||||
|
||||
/** Does this block require a tool to drop? */
|
||||
bool m_RequiresSpecialTool;
|
||||
|
||||
/** Is this block solid (player cannot walk through)? */
|
||||
bool m_IsSolid;
|
||||
|
||||
@ -61,7 +58,6 @@ public:
|
||||
inline static bool IsOneHitDig (BLOCKTYPE a_Type) { return Get(a_Type).m_OneHitDig; }
|
||||
inline static bool IsPistonBreakable (BLOCKTYPE a_Type) { return Get(a_Type).m_PistonBreakable; }
|
||||
inline static bool IsSnowable (BLOCKTYPE a_Type) { return Get(a_Type).m_IsSnowable; }
|
||||
inline static bool RequiresSpecialTool (BLOCKTYPE a_Type) { return Get(a_Type).m_RequiresSpecialTool; }
|
||||
inline static bool IsSolid (BLOCKTYPE a_Type) { return Get(a_Type).m_IsSolid; }
|
||||
inline static bool FullyOccupiesVoxel (BLOCKTYPE a_Type) { return Get(a_Type).m_FullyOccupiesVoxel; }
|
||||
|
||||
|
@ -19,16 +19,16 @@ public:
|
||||
}
|
||||
|
||||
|
||||
virtual void DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ) override
|
||||
virtual void DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, bool a_DropVerbatim) override
|
||||
{
|
||||
NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
|
||||
if (Meta & 0x8)
|
||||
{
|
||||
super::DropBlock(a_ChunkInterface, a_WorldInterface, a_BlockPluginInterface, a_Digger, a_BlockX, a_BlockY - 1, a_BlockZ);
|
||||
super::DropBlock(a_ChunkInterface, a_WorldInterface, a_BlockPluginInterface, a_Digger, a_BlockX, a_BlockY - 1, a_BlockZ, a_DropVerbatim);
|
||||
}
|
||||
else
|
||||
{
|
||||
super::DropBlock(a_ChunkInterface, a_WorldInterface, a_BlockPluginInterface, a_Digger, a_BlockX, a_BlockY, a_BlockZ);
|
||||
super::DropBlock(a_ChunkInterface, a_WorldInterface, a_BlockPluginInterface, a_Digger, a_BlockX, a_BlockY, a_BlockZ, a_DropVerbatim);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -408,39 +408,6 @@ void cBlockHandler::NeighborChanged(cChunkInterface & a_ChunkInterface, int a_Bl
|
||||
|
||||
|
||||
|
||||
|
||||
void cBlockHandler::OnNeighborChanged(cChunkInterface & a_ChunkInterface, int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cBlockHandler::OnDigging(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer *a_Player, int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cBlockHandler::OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer *a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cBlockHandler::OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer *a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cBlockHandler::ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta)
|
||||
{
|
||||
// Setting the meta to a_BlockMeta keeps most textures. The few other blocks have to override this.
|
||||
@ -451,11 +418,20 @@ void cBlockHandler::ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta)
|
||||
|
||||
|
||||
|
||||
void cBlockHandler::DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
void cBlockHandler::DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, bool a_DropVerbatim)
|
||||
{
|
||||
cItems Pickups;
|
||||
NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
|
||||
ConvertToPickups(Pickups, Meta);
|
||||
|
||||
if (!a_DropVerbatim)
|
||||
{
|
||||
ConvertToPickups(Pickups, Meta);
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO: Add a proper overridable function for this
|
||||
Pickups.Add(m_BlockType, 1, Meta);
|
||||
}
|
||||
|
||||
// Allow plugins to modify the pickups:
|
||||
a_BlockPluginInterface.CallHookBlockToPickups(a_Digger, a_BlockX, a_BlockY, a_BlockZ, m_BlockType, Meta, Pickups);
|
||||
|
@ -60,25 +60,28 @@ public:
|
||||
virtual void OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
|
||||
/// Called when a direct neighbor of this block has been changed (The position is the own position, not the neighbor position)
|
||||
virtual void OnNeighborChanged(cChunkInterface & a_ChunkInterface, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
virtual void OnNeighborChanged(cChunkInterface & a_ChunkInterface, int a_BlockX, int a_BlockY, int a_BlockZ) {};
|
||||
|
||||
/// Notifies all neighbors of the given block about a change
|
||||
static void NeighborChanged(cChunkInterface & a_ChunkInterface, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
|
||||
/// Called while the player diggs the block.
|
||||
virtual void OnDigging(cChunkInterface & cChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
virtual void OnDigging(cChunkInterface & cChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) {};
|
||||
|
||||
/// Called if the user right clicks the block and the block is useable
|
||||
virtual void OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ);
|
||||
virtual void OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) {};
|
||||
|
||||
/** Called when a Right Click to this Block is cancelled */
|
||||
virtual void OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace);
|
||||
/** Called when a right click to this block is cancelled */
|
||||
virtual void OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) {};
|
||||
|
||||
/// <summary>Called when the item is mined to convert it into pickups. Pickups may specify multiple items. Appends items to a_Pickups, preserves its original contents</summary>
|
||||
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta);
|
||||
|
||||
/// Handles the dropping of a block based on what ConvertToDrops() returns. This will not destroy the block. a_Digger is the entity causing the drop; it may be NULL
|
||||
virtual void DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
/** Handles the dropping, but not destruction, of a block based on what ConvertTo(Verbatim)Pickups() returns, including the spawning of pickups and alertion of plugins
|
||||
@param a_Digger The entity causing the drop; it may be NULL
|
||||
@param a_DropVerbatim Calls ConvertToVerbatimPickups() instead of its counterpart, meaning the block itself is dropped by default (due to a speical tool or enchantment)
|
||||
*/
|
||||
virtual void DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, bool a_DropVerbatim = false);
|
||||
|
||||
/// Returns step sound name of block
|
||||
virtual const char * GetStepSound(void);
|
||||
|
@ -43,11 +43,17 @@ public:
|
||||
// Only the first 2 bits contain the display information, the others are for growing
|
||||
if (rand.NextInt(6) == 0)
|
||||
{
|
||||
a_Pickups.push_back(cItem(E_BLOCK_SAPLING, 1, a_BlockMeta & 3));
|
||||
a_Pickups.push_back(
|
||||
cItem(
|
||||
E_BLOCK_SAPLING,
|
||||
1,
|
||||
(m_BlockType == E_BLOCK_LEAVES) ? (a_BlockMeta & 0x03) : (2 << (a_BlockMeta & 0x01)) // Old leaves - 3 bits contain display; new leaves - 1st bit, shifted left two for saplings to understand
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
// 1 % chance of dropping an apple, if the leaves' type is Apple Leaves
|
||||
if ((a_BlockMeta & 3) == E_META_LEAVES_APPLE)
|
||||
if ((m_BlockType == E_BLOCK_LEAVES) && ((a_BlockMeta & 0x03) == E_META_LEAVES_APPLE))
|
||||
{
|
||||
if (rand.NextInt(101) == 0)
|
||||
{
|
||||
|
@ -20,8 +20,8 @@ public:
|
||||
|
||||
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
|
||||
{
|
||||
// Only the first 2 bits contain the display information, the others are for growing
|
||||
a_Pickups.push_back(cItem(E_BLOCK_SAPLING, 1, a_BlockMeta & 0x7));
|
||||
// Only the first 5 bits contain the display information, 8th bit for growth indicator (but we use 0x07 for forward compatibility)
|
||||
a_Pickups.push_back(cItem(E_BLOCK_SAPLING, 1, a_BlockMeta & 0x07));
|
||||
}
|
||||
|
||||
|
||||
|
@ -715,14 +715,5 @@ namespace ItemCategory
|
||||
// tolua_end
|
||||
|
||||
|
||||
inline bool BlockRequiresSpecialTool(BLOCKTYPE a_BlockType)
|
||||
{
|
||||
if (!IsValidBlock(a_BlockType)) return false;
|
||||
return cBlockInfo::RequiresSpecialTool(a_BlockType);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -328,12 +328,9 @@ void cItemHandler::OnBlockDestroyed(cWorld * a_World, cPlayer * a_Player, const
|
||||
|
||||
if (a_Player->IsGameModeSurvival())
|
||||
{
|
||||
if (!BlockRequiresSpecialTool(Block) || CanHarvestBlock(Block))
|
||||
{
|
||||
cChunkInterface ChunkInterface(a_World->GetChunkMap());
|
||||
cBlockInServerPluginInterface PluginInterface(*a_World);
|
||||
Handler->DropBlock(ChunkInterface, *a_World, PluginInterface, a_Player, a_BlockX, a_BlockY, a_BlockZ);
|
||||
}
|
||||
cChunkInterface ChunkInterface(a_World->GetChunkMap());
|
||||
cBlockInServerPluginInterface PluginInterface(*a_World);
|
||||
Handler->DropBlock(ChunkInterface, *a_World, PluginInterface, a_Player, a_BlockX, a_BlockY, a_BlockZ, CanHarvestBlock(Block));
|
||||
}
|
||||
|
||||
a_Player->UseEquippedItem();
|
||||
|
Loading…
Reference in New Issue
Block a user