summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattes D <github@xoft.cz>2014-03-02 16:13:43 +0100
committerMattes D <github@xoft.cz>2014-03-02 16:13:43 +0100
commitb17d04737d11c5698a6869c70031646723d79f11 (patch)
treed71275553552a16dd2b9ba949cd5abf8baf9fa5a
parentMerge pull request #745 from tonibm19/master (diff)
parentGetById => Get (diff)
downloadcuberite-b17d04737d11c5698a6869c70031646723d79f11.tar
cuberite-b17d04737d11c5698a6869c70031646723d79f11.tar.gz
cuberite-b17d04737d11c5698a6869c70031646723d79f11.tar.bz2
cuberite-b17d04737d11c5698a6869c70031646723d79f11.tar.lz
cuberite-b17d04737d11c5698a6869c70031646723d79f11.tar.xz
cuberite-b17d04737d11c5698a6869c70031646723d79f11.tar.zst
cuberite-b17d04737d11c5698a6869c70031646723d79f11.zip
-rw-r--r--MCServer/Plugins/APIDump/APIDesc.lua32
-rw-r--r--src/Bindings/AllToLua.pkg1
-rw-r--r--src/Bindings/DeprecatedBindings.cpp438
-rw-r--r--src/Bindings/DeprecatedBindings.h8
-rw-r--r--src/Bindings/LuaState.cpp2
-rw-r--r--src/BlockID.cpp399
-rw-r--r--src/BlockID.h14
-rw-r--r--src/BlockInfo.cpp423
-rw-r--r--src/BlockInfo.h76
-rw-r--r--src/Blocks/BlockButton.h2
-rw-r--r--src/Blocks/BlockCactus.h2
-rw-r--r--src/Blocks/BlockDirt.h4
-rw-r--r--src/Blocks/BlockLadder.h2
-rw-r--r--src/Blocks/BlockLever.h2
-rw-r--r--src/Blocks/BlockRail.h4
-rw-r--r--src/Blocks/BlockRedstone.h2
-rw-r--r--src/Blocks/BlockSnow.h2
-rw-r--r--src/Blocks/BlockTorch.h6
-rw-r--r--src/Blocks/BlockTrapdoor.h2
-rw-r--r--src/Blocks/BlockVine.h2
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/Chunk.cpp10
-rw-r--r--src/ClientHandle.cpp2
-rw-r--r--src/Defines.h29
-rw-r--r--src/Entities/Entity.cpp6
-rw-r--r--src/Entities/Minecart.cpp16
-rw-r--r--src/Entities/Player.cpp2
-rw-r--r--src/Entities/ProjectileEntity.cpp4
-rw-r--r--src/Generating/FinishGen.cpp6
-rw-r--r--src/Globals.h1
-rw-r--r--src/Items/ItemRedstoneDust.h2
-rw-r--r--src/LightingThread.cpp4
-rw-r--r--src/LightingThread.h4
-rw-r--r--src/MobSpawner.cpp14
-rw-r--r--src/Mobs/Monster.cpp10
-rw-r--r--src/Mobs/SnowGolem.cpp2
-rw-r--r--src/Piston.cpp2
-rw-r--r--src/Simulator/FireSimulator.cpp2
-rw-r--r--src/Simulator/IncrementalRedstoneSimulator.cpp4
-rw-r--r--src/Simulator/IncrementalRedstoneSimulator.h2
-rw-r--r--src/Tracer.cpp2
41 files changed, 1045 insertions, 503 deletions
diff --git a/MCServer/Plugins/APIDump/APIDesc.lua b/MCServer/Plugins/APIDump/APIDesc.lua
index 4d0113223..0b6f33b37 100644
--- a/MCServer/Plugins/APIDump/APIDesc.lua
+++ b/MCServer/Plugins/APIDump/APIDesc.lua
@@ -290,6 +290,38 @@ g_APIDesc =
}, -- AdditionalInfo
}, -- cBlockArea
+ cBlockInfo =
+ {
+ Desc = [[
+ This class is used to query and register block properties.
+ ]],
+ Functions =
+ {
+ FullyOccupiesVoxel = { Params = "Type", Return = "bool", Notes = "(STATIC) Returns whether the specified block fully occupies its voxel." },
+ Get = { Params = "Type", Return = "{{cBlockInfo}}", Notes = "(STATIC) Returns the {{cBlockInfo}} structure for the specified type." },
+ GetLightValue = { Params = "Type", Return = "number", Notes = "(STATIC) Returns how much light the specified block emits on its own." },
+ GetSpreadLightFalloff = { Params = "Type", Return = "number", Notes = "(STATIC) Returns how much light the specified block consumes." },
+ IsOneHitDig = { Params = "Type", Return = "bool", Notes = "(STATIC) Returns whether the specified block will be destroyed after a single hit." },
+ IsPistonBreakable = { Params = "Type", Return = "bool", Notes = "(STATIC) Returns whether a piston can break the specified block." },
+ IsSnowable = { Params = "Type", Return = "bool", Notes = "(STATIC) Returns whether the specified block can hold snow atop." },
+ IsSolid = { Params = "Type", Return = "bool", Notes = "(STATIC) Returns whether the specified block is solid." },
+ IsTransparent = { Params = "Type", Return = "bool", Notes = "(STATIC) Returns whether the specified block is transparent." },
+ RequiresSpecialTool = { Params = "Type", Return = "bool", Notes = "(STATIC) Returns whether the specified block requires a special tool to drop." },
+ },
+ Variables =
+ {
+ m_FullyOccupiesVoxel = { Type = "bool", Notes = "Does this block fully occupy its voxel - is it a 'full' block?" },
+ m_IsSnowable = { Type = "bool", Notes = "Can this block hold snow atop?" },
+ m_IsSolid = { Type = "bool", Notes = "Is this block solid (player cannot walk through)?" },
+ m_LightValue = { Type = "number", Notes = "How much light do the blocks emit on their own?" },
+ m_OneHitDig = { Type = "bool", Notes = "Is a block destroyed after a single hit?" },
+ m_PistonBreakable = { Type = "bool", Notes = "Can a piston break this block?" },
+ m_RequiresSpecialTool = { Type = "bool", Notes = "Does this block require a tool to drop?" },
+ m_SpreadLightFalloff = { Type = "number", Notes = "How much light do the blocks consume?" },
+ m_Transparent = { Type = "bool", Notes = "Is a block completely transparent? (light doesn't get decreased(?))" },
+ },
+ }, -- cBlockInfo
+
cChatColor =
{
Desc = [[
diff --git a/src/Bindings/AllToLua.pkg b/src/Bindings/AllToLua.pkg
index 1a2140771..6b067b1e5 100644
--- a/src/Bindings/AllToLua.pkg
+++ b/src/Bindings/AllToLua.pkg
@@ -26,6 +26,7 @@ $cfile "WebPlugin.h"
$cfile "LuaWindow.h"
$cfile "../BlockID.h"
+$cfile "../BlockInfo.h"
$cfile "../StringUtils.h"
$cfile "../Defines.h"
$cfile "../ChatColor.h"
diff --git a/src/Bindings/DeprecatedBindings.cpp b/src/Bindings/DeprecatedBindings.cpp
new file mode 100644
index 000000000..7c0d8dca1
--- /dev/null
+++ b/src/Bindings/DeprecatedBindings.cpp
@@ -0,0 +1,438 @@
+
+#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
+
+#include "DeprecatedBindings.h"
+#include "tolua++/include/tolua++.h"
+
+#include "Plugin.h"
+#include "PluginLua.h"
+#include "PluginManager.h"
+#include "LuaWindow.h"
+#include "LuaChunkStay.h"
+
+#include "../BlockInfo.h"
+
+
+
+
+
+/* get function: g_BlockLightValue */
+#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockLightValue
+static int tolua_get_AllToLua_g_BlockLightValue(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ tolua_pushnumber(tolua_S,(lua_Number)cBlockInfo::GetLightValue(tolua_index));
+ return 1;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* set function: g_BlockLightValue */
+#ifndef TOLUA_DISABLE_tolua_set_AllToLua_g_BlockLightValue
+static int tolua_set_AllToLua_g_BlockLightValue(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ cBlockInfo::Get(tolua_index).m_LightValue = ((unsigned char) tolua_tonumber(tolua_S,3,0));
+ return 0;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* get function: g_BlockSpreadLightFalloff */
+#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockSpreadLightFalloff
+static int tolua_get_AllToLua_g_BlockSpreadLightFalloff(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ tolua_pushnumber(tolua_S,(lua_Number)cBlockInfo::GetSpreadLightFalloff(tolua_index));
+ return 1;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* set function: g_BlockSpreadLightFalloff */
+#ifndef TOLUA_DISABLE_tolua_set_AllToLua_g_BlockSpreadLightFalloff
+static int tolua_set_AllToLua_g_BlockSpreadLightFalloff(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ cBlockInfo::Get(tolua_index).m_SpreadLightFalloff = ((unsigned char) tolua_tonumber(tolua_S,3,0));
+ return 0;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* get function: g_BlockTransparent */
+#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockTransparent
+static int tolua_get_AllToLua_g_BlockTransparent(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ tolua_pushboolean(tolua_S,(bool)cBlockInfo::IsTransparent(tolua_index));
+ return 1;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* set function: g_BlockTransparent */
+#ifndef TOLUA_DISABLE_tolua_set_AllToLua_g_BlockTransparent
+static int tolua_set_AllToLua_g_BlockTransparent(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ cBlockInfo::Get(tolua_index).m_Transparent = ((bool) tolua_toboolean(tolua_S,3,0));
+ return 0;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* get function: g_BlockOneHitDig */
+#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockOneHitDig
+static int tolua_get_AllToLua_g_BlockOneHitDig(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ tolua_pushboolean(tolua_S,(bool)cBlockInfo::IsOneHitDig(tolua_index));
+ return 1;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* set function: g_BlockOneHitDig */
+#ifndef TOLUA_DISABLE_tolua_set_AllToLua_g_BlockOneHitDig
+static int tolua_set_AllToLua_g_BlockOneHitDig(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ cBlockInfo::Get(tolua_index).m_OneHitDig = ((bool) tolua_toboolean(tolua_S,3,0));
+ return 0;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* get function: g_BlockPistonBreakable */
+#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockPistonBreakable
+static int tolua_get_AllToLua_g_BlockPistonBreakable(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0 || tolua_index>=256)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ tolua_pushboolean(tolua_S,(bool)cBlockInfo::IsPistonBreakable(tolua_index));
+ return 1;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* set function: g_BlockPistonBreakable */
+#ifndef TOLUA_DISABLE_tolua_set_AllToLua_g_BlockPistonBreakable
+static int tolua_set_AllToLua_g_BlockPistonBreakable(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0 || tolua_index>=256)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ cBlockInfo::Get(tolua_index).m_PistonBreakable = ((bool) tolua_toboolean(tolua_S,3,0));
+ return 0;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* get function: g_BlockIsSnowable */
+#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockIsSnowable
+static int tolua_get_AllToLua_g_BlockIsSnowable(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0 || tolua_index>=256)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ tolua_pushboolean(tolua_S,(bool)cBlockInfo::IsSnowable(tolua_index));
+ return 1;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* set function: g_BlockIsSnowable */
+#ifndef TOLUA_DISABLE_tolua_set_AllToLua_g_BlockIsSnowable
+static int tolua_set_AllToLua_g_BlockIsSnowable(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0 || tolua_index>=256)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ cBlockInfo::Get(tolua_index).m_IsSnowable = ((bool) tolua_toboolean(tolua_S,3,0));
+ return 0;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* get function: g_BlockRequiresSpecialTool */
+#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockRequiresSpecialTool
+static int tolua_get_AllToLua_g_BlockRequiresSpecialTool(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0 || tolua_index>=256)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ tolua_pushboolean(tolua_S,(bool)cBlockInfo::RequiresSpecialTool(tolua_index));
+ return 1;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* set function: g_BlockRequiresSpecialTool */
+#ifndef TOLUA_DISABLE_tolua_set_AllToLua_g_BlockRequiresSpecialTool
+static int tolua_set_AllToLua_g_BlockRequiresSpecialTool(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0 || tolua_index>=256)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ cBlockInfo::Get(tolua_index).m_RequiresSpecialTool = ((bool) tolua_toboolean(tolua_S,3,0));
+ return 0;
+}
+#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)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0 || tolua_index>=256)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ tolua_pushboolean(tolua_S,(bool)cBlockInfo::IsSolid(tolua_index));
+ return 1;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* set function: g_BlockIsSolid */
+#ifndef TOLUA_DISABLE_tolua_set_AllToLua_g_BlockIsSolid
+static int tolua_set_AllToLua_g_BlockIsSolid(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0 || tolua_index>=256)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ cBlockInfo::Get(tolua_index).m_IsSolid = ((bool) tolua_toboolean(tolua_S,3,0));
+ return 0;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* get function: g_BlockFullyOccupiesVoxel */
+#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockFullyOccupiesVoxel
+static int tolua_get_AllToLua_g_BlockFullyOccupiesVoxel(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0 || tolua_index>=256)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ tolua_pushboolean(tolua_S,(bool)cBlockInfo::FullyOccupiesVoxel(tolua_index));
+ return 1;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* set function: g_BlockFullyOccupiesVoxel */
+#ifndef TOLUA_DISABLE_tolua_set_AllToLua_g_BlockFullyOccupiesVoxel
+static int tolua_set_AllToLua_g_BlockFullyOccupiesVoxel(lua_State* tolua_S)
+{
+ int tolua_index;
+ #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
+ tolua_index = (int)tolua_tonumber(tolua_S,2,0);
+ #ifndef TOLUA_RELEASE
+ if (tolua_index<0 || tolua_index>=256)
+ tolua_error(tolua_S,"array indexing out of range.",NULL);
+ #endif
+ cBlockInfo::Get(tolua_index).m_FullyOccupiesVoxel = ((bool) tolua_toboolean(tolua_S,3,0));
+ return 0;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+
+
+
+
+void DeprecatedBindings::Bind(lua_State * tolua_S)
+{
+ tolua_beginmodule(tolua_S, NULL);
+
+ tolua_array(tolua_S, "g_BlockLightValue", tolua_get_AllToLua_g_BlockLightValue, tolua_set_AllToLua_g_BlockLightValue);
+ tolua_array(tolua_S, "g_BlockSpreadLightFalloff", tolua_get_AllToLua_g_BlockSpreadLightFalloff, tolua_set_AllToLua_g_BlockSpreadLightFalloff);
+ tolua_array(tolua_S, "g_BlockTransparent", tolua_get_AllToLua_g_BlockTransparent, tolua_set_AllToLua_g_BlockTransparent);
+ tolua_array(tolua_S, "g_BlockOneHitDig", tolua_get_AllToLua_g_BlockOneHitDig, tolua_set_AllToLua_g_BlockOneHitDig);
+ tolua_array(tolua_S, "g_BlockPistonBreakable", tolua_get_AllToLua_g_BlockPistonBreakable, tolua_set_AllToLua_g_BlockPistonBreakable);
+ tolua_array(tolua_S, "g_BlockIsSnowable", tolua_get_AllToLua_g_BlockIsSnowable, tolua_set_AllToLua_g_BlockIsSnowable);
+ tolua_array(tolua_S, "g_BlockRequiresSpecialTool", tolua_get_AllToLua_g_BlockRequiresSpecialTool, tolua_set_AllToLua_g_BlockRequiresSpecialTool);
+ tolua_array(tolua_S, "g_BlockIsSolid", tolua_get_AllToLua_g_BlockIsSolid, tolua_set_AllToLua_g_BlockIsSolid);
+ tolua_array(tolua_S, "g_BlockFullyOccupiesVoxel", tolua_get_AllToLua_g_BlockFullyOccupiesVoxel, tolua_set_AllToLua_g_BlockFullyOccupiesVoxel);
+
+ tolua_endmodule(tolua_S);
+}
+
+
+
+
diff --git a/src/Bindings/DeprecatedBindings.h b/src/Bindings/DeprecatedBindings.h
new file mode 100644
index 000000000..5fc3cfa80
--- /dev/null
+++ b/src/Bindings/DeprecatedBindings.h
@@ -0,0 +1,8 @@
+#pragma once
+
+struct lua_State;
+class DeprecatedBindings
+{
+public:
+ static void Bind( lua_State* tolua_S );
+};
diff --git a/src/Bindings/LuaState.cpp b/src/Bindings/LuaState.cpp
index 45a066efe..a5540df17 100644
--- a/src/Bindings/LuaState.cpp
+++ b/src/Bindings/LuaState.cpp
@@ -14,6 +14,7 @@ extern "C"
#include "tolua++/include/tolua++.h"
#include "Bindings.h"
#include "ManualBindings.h"
+#include "DeprecatedBindings.h"
// fwd: SQLite/lsqlite3.c
extern "C"
@@ -95,6 +96,7 @@ void cLuaState::Create(void)
luaL_openlibs(m_LuaState);
tolua_AllToLua_open(m_LuaState);
ManualBindings::Bind(m_LuaState);
+ DeprecatedBindings::Bind(m_LuaState);
luaopen_lsqlite3(m_LuaState);
luaopen_lxp(m_LuaState);
m_IsOwned = true;
diff --git a/src/BlockID.cpp b/src/BlockID.cpp
index ff1c54e3f..79e122032 100644
--- a/src/BlockID.cpp
+++ b/src/BlockID.cpp
@@ -12,20 +12,6 @@
-NIBBLETYPE g_BlockLightValue[256];
-NIBBLETYPE g_BlockSpreadLightFalloff[256];
-bool g_BlockTransparent[256];
-bool g_BlockOneHitDig[256];
-bool g_BlockPistonBreakable[256];
-bool g_BlockIsSnowable[256];
-bool g_BlockRequiresSpecialTool[256];
-bool g_BlockIsSolid[256];
-bool g_BlockFullyOccupiesVoxel[256];
-
-
-
-
-
class cBlockIDMap
{
// Making the map case-insensitive:
@@ -481,389 +467,4 @@ cItem GetIniItemSet(cIniFile & a_IniFile, const char * a_Section, const char * a
-// This is actually just some code that needs to run at program startup, so it is wrapped into a global var's constructor:
-class cBlockPropertiesInitializer
-{
-public:
- cBlockPropertiesInitializer(void)
- {
- memset(g_BlockLightValue, 0x00, sizeof(g_BlockLightValue));
- memset(g_BlockSpreadLightFalloff, 0x0f, sizeof(g_BlockSpreadLightFalloff)); // 0x0f means total falloff
- memset(g_BlockTransparent, 0x00, sizeof(g_BlockTransparent));
- memset(g_BlockOneHitDig, 0x00, sizeof(g_BlockOneHitDig));
- memset(g_BlockPistonBreakable, 0x00, sizeof(g_BlockPistonBreakable));
- memset(g_BlockFullyOccupiesVoxel, 0x00, sizeof(g_BlockFullyOccupiesVoxel));
-
- // Setting bools to true must be done manually, see http://forum.mc-server.org/showthread.php?tid=629&pid=5415#pid5415
- for (size_t i = 0; i < ARRAYCOUNT(g_BlockIsSnowable); i++)
- {
- g_BlockIsSnowable[i] = true;
- }
- memset(g_BlockRequiresSpecialTool, 0x00, sizeof(g_BlockRequiresSpecialTool)); // Set all blocks to false
-
- // Setting bools to true must be done manually, see http://forum.mc-server.org/showthread.php?tid=629&pid=5415#pid5415
- for (size_t i = 0; i < ARRAYCOUNT(g_BlockIsSolid); i++)
- {
- g_BlockIsSolid[i] = true;
- }
-
- // Emissive blocks
- g_BlockLightValue[E_BLOCK_FIRE] = 15;
- g_BlockLightValue[E_BLOCK_GLOWSTONE] = 15;
- g_BlockLightValue[E_BLOCK_JACK_O_LANTERN] = 15;
- g_BlockLightValue[E_BLOCK_LAVA] = 15;
- g_BlockLightValue[E_BLOCK_STATIONARY_LAVA] = 15;
- g_BlockLightValue[E_BLOCK_END_PORTAL] = 15;
- g_BlockLightValue[E_BLOCK_REDSTONE_LAMP_ON] = 15;
- g_BlockLightValue[E_BLOCK_TORCH] = 14;
- g_BlockLightValue[E_BLOCK_BURNING_FURNACE] = 13;
- g_BlockLightValue[E_BLOCK_NETHER_PORTAL] = 11;
- g_BlockLightValue[E_BLOCK_REDSTONE_ORE_GLOWING] = 9;
- g_BlockLightValue[E_BLOCK_REDSTONE_REPEATER_ON] = 9;
- g_BlockLightValue[E_BLOCK_REDSTONE_TORCH_ON] = 7;
- g_BlockLightValue[E_BLOCK_BREWING_STAND] = 1;
- g_BlockLightValue[E_BLOCK_BROWN_MUSHROOM] = 1;
- g_BlockLightValue[E_BLOCK_DRAGON_EGG] = 1;
-
- // Spread blocks
- g_BlockSpreadLightFalloff[E_BLOCK_AIR] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_CAKE] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_CHEST] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_COBWEB] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_CROPS] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_FENCE] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_FENCE_GATE] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_FIRE] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_GLASS] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_GLASS_PANE] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_GLOWSTONE] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_IRON_BARS] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_IRON_DOOR] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_LEAVES] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_SIGN_POST] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_TORCH] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_VINES] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_WALLSIGN] = 1;
- g_BlockSpreadLightFalloff[E_BLOCK_WOODEN_DOOR] = 1;
-
- // Light in water and lava dissapears faster:
- g_BlockSpreadLightFalloff[E_BLOCK_LAVA] = 3;
- g_BlockSpreadLightFalloff[E_BLOCK_STATIONARY_LAVA] = 3;
- g_BlockSpreadLightFalloff[E_BLOCK_STATIONARY_WATER] = 3;
- g_BlockSpreadLightFalloff[E_BLOCK_WATER] = 3;
-
- // Transparent blocks
- g_BlockTransparent[E_BLOCK_ACTIVATOR_RAIL] = true;
- g_BlockTransparent[E_BLOCK_AIR] = true;
- g_BlockTransparent[E_BLOCK_BIG_FLOWER] = true;
- g_BlockTransparent[E_BLOCK_BROWN_MUSHROOM] = true;
- g_BlockTransparent[E_BLOCK_CARROTS] = true;
- g_BlockTransparent[E_BLOCK_CHEST] = true;
- g_BlockTransparent[E_BLOCK_COBWEB] = true;
- g_BlockTransparent[E_BLOCK_CROPS] = true;
- g_BlockTransparent[E_BLOCK_DANDELION] = true;
- g_BlockTransparent[E_BLOCK_DETECTOR_RAIL] = true;
- g_BlockTransparent[E_BLOCK_ENDER_CHEST] = true;
- g_BlockTransparent[E_BLOCK_FENCE] = true;
- g_BlockTransparent[E_BLOCK_FENCE_GATE] = true;
- g_BlockTransparent[E_BLOCK_FIRE] = true;
- g_BlockTransparent[E_BLOCK_FLOWER] = true;
- g_BlockTransparent[E_BLOCK_FLOWER_POT] = true;
- g_BlockTransparent[E_BLOCK_GLASS] = true;
- g_BlockTransparent[E_BLOCK_GLASS_PANE] = true;
- g_BlockTransparent[E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE] = true;
- g_BlockTransparent[E_BLOCK_ICE] = true;
- g_BlockTransparent[E_BLOCK_IRON_DOOR] = true;
- g_BlockTransparent[E_BLOCK_LAVA] = true;
- g_BlockTransparent[E_BLOCK_LEAVES] = true;
- g_BlockTransparent[E_BLOCK_LEVER] = true;
- g_BlockTransparent[E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE] = true;
- g_BlockTransparent[E_BLOCK_MELON_STEM] = true;
- g_BlockTransparent[E_BLOCK_NETHER_BRICK_FENCE] = true;
- g_BlockTransparent[E_BLOCK_NEW_LEAVES] = true;
- g_BlockTransparent[E_BLOCK_POTATOES] = true;
- g_BlockTransparent[E_BLOCK_POWERED_RAIL] = true;
- g_BlockTransparent[E_BLOCK_PISTON_EXTENSION] = true;
- g_BlockTransparent[E_BLOCK_PUMPKIN_STEM] = true;
- g_BlockTransparent[E_BLOCK_RAIL] = true;
- g_BlockTransparent[E_BLOCK_RED_MUSHROOM] = true;
- g_BlockTransparent[E_BLOCK_SIGN_POST] = true;
- g_BlockTransparent[E_BLOCK_SNOW] = true;
- g_BlockTransparent[E_BLOCK_STAINED_GLASS] = true;
- g_BlockTransparent[E_BLOCK_STAINED_GLASS_PANE] = true;
- g_BlockTransparent[E_BLOCK_STATIONARY_LAVA] = true;
- g_BlockTransparent[E_BLOCK_STATIONARY_WATER] = true;
- g_BlockTransparent[E_BLOCK_STONE_BUTTON] = true;
- g_BlockTransparent[E_BLOCK_STONE_PRESSURE_PLATE] = true;
- g_BlockTransparent[E_BLOCK_TALL_GRASS] = true;
- g_BlockTransparent[E_BLOCK_TORCH] = true;
- g_BlockTransparent[E_BLOCK_VINES] = true;
- g_BlockTransparent[E_BLOCK_WALLSIGN] = true;
- g_BlockTransparent[E_BLOCK_WATER] = true;
- g_BlockTransparent[E_BLOCK_WOODEN_BUTTON] = true;
- g_BlockTransparent[E_BLOCK_WOODEN_DOOR] = true;
- g_BlockTransparent[E_BLOCK_WOODEN_PRESSURE_PLATE] = true;
-
- // TODO: Any other transparent blocks?
-
- // One hit break blocks:
- g_BlockOneHitDig[E_BLOCK_ACTIVE_COMPARATOR] = true;
- g_BlockOneHitDig[E_BLOCK_BIG_FLOWER] = true;
- g_BlockOneHitDig[E_BLOCK_BROWN_MUSHROOM] = true;
- g_BlockOneHitDig[E_BLOCK_CARROTS] = true;
- g_BlockOneHitDig[E_BLOCK_CROPS] = true;
- g_BlockOneHitDig[E_BLOCK_DANDELION] = true;
- g_BlockOneHitDig[E_BLOCK_FIRE] = true;
- g_BlockOneHitDig[E_BLOCK_FLOWER] = true;
- g_BlockOneHitDig[E_BLOCK_FLOWER_POT] = true;
- g_BlockOneHitDig[E_BLOCK_INACTIVE_COMPARATOR] = true;
- g_BlockOneHitDig[E_BLOCK_MELON_STEM] = true;
- g_BlockOneHitDig[E_BLOCK_POTATOES] = true;
- g_BlockOneHitDig[E_BLOCK_PUMPKIN_STEM] = true;
- g_BlockOneHitDig[E_BLOCK_REDSTONE_REPEATER_OFF] = true;
- g_BlockOneHitDig[E_BLOCK_REDSTONE_REPEATER_ON] = true;
- g_BlockOneHitDig[E_BLOCK_REDSTONE_TORCH_OFF] = true;
- g_BlockOneHitDig[E_BLOCK_REDSTONE_TORCH_ON] = true;
- g_BlockOneHitDig[E_BLOCK_REDSTONE_WIRE] = true;
- g_BlockOneHitDig[E_BLOCK_RED_MUSHROOM] = true;
- g_BlockOneHitDig[E_BLOCK_REEDS] = true;
- g_BlockOneHitDig[E_BLOCK_SAPLING] = true;
- g_BlockOneHitDig[E_BLOCK_TNT] = true;
- g_BlockOneHitDig[E_BLOCK_TALL_GRASS] = true;
- g_BlockOneHitDig[E_BLOCK_TORCH] = true;
-
- // Blocks that break when pushed by piston:
- g_BlockPistonBreakable[E_BLOCK_ACTIVE_COMPARATOR] = true;
- g_BlockPistonBreakable[E_BLOCK_AIR] = true;
- g_BlockPistonBreakable[E_BLOCK_BED] = true;
- g_BlockPistonBreakable[E_BLOCK_BIG_FLOWER] = true;
- g_BlockPistonBreakable[E_BLOCK_BROWN_MUSHROOM] = true;
- g_BlockPistonBreakable[E_BLOCK_COBWEB] = true;
- g_BlockPistonBreakable[E_BLOCK_CROPS] = true;
- g_BlockPistonBreakable[E_BLOCK_DANDELION] = true;
- g_BlockPistonBreakable[E_BLOCK_DEAD_BUSH] = true;
- g_BlockPistonBreakable[E_BLOCK_FIRE] = true;
- g_BlockPistonBreakable[E_BLOCK_FLOWER] = true;
- g_BlockPistonBreakable[E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE] = true;
- g_BlockPistonBreakable[E_BLOCK_INACTIVE_COMPARATOR] = true;
- g_BlockPistonBreakable[E_BLOCK_IRON_DOOR] = true;
- g_BlockPistonBreakable[E_BLOCK_JACK_O_LANTERN] = true;
- g_BlockPistonBreakable[E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE] = true;
- g_BlockPistonBreakable[E_BLOCK_LADDER] = true;
- g_BlockPistonBreakable[E_BLOCK_LAVA] = true;
- g_BlockPistonBreakable[E_BLOCK_LEVER] = true;
- g_BlockPistonBreakable[E_BLOCK_MELON] = true;
- g_BlockPistonBreakable[E_BLOCK_MELON_STEM] = true;
- g_BlockPistonBreakable[E_BLOCK_PUMPKIN] = true;
- g_BlockPistonBreakable[E_BLOCK_PUMPKIN_STEM] = true;
- g_BlockPistonBreakable[E_BLOCK_REDSTONE_REPEATER_OFF] = true;
- g_BlockPistonBreakable[E_BLOCK_REDSTONE_REPEATER_ON] = true;
- g_BlockPistonBreakable[E_BLOCK_REDSTONE_TORCH_OFF] = true;
- g_BlockPistonBreakable[E_BLOCK_REDSTONE_TORCH_ON] = true;
- g_BlockPistonBreakable[E_BLOCK_REDSTONE_WIRE] = true;
- g_BlockPistonBreakable[E_BLOCK_RED_MUSHROOM] = true;
- g_BlockPistonBreakable[E_BLOCK_REEDS] = true;
- g_BlockPistonBreakable[E_BLOCK_SNOW] = true;
- g_BlockPistonBreakable[E_BLOCK_STATIONARY_LAVA] = true;
- g_BlockPistonBreakable[E_BLOCK_STATIONARY_WATER] = true;
- g_BlockPistonBreakable[E_BLOCK_STONE_BUTTON] = true;
- g_BlockPistonBreakable[E_BLOCK_STONE_PRESSURE_PLATE] = true;
- g_BlockPistonBreakable[E_BLOCK_TALL_GRASS] = true;
- g_BlockPistonBreakable[E_BLOCK_TORCH] = true;
- g_BlockPistonBreakable[E_BLOCK_VINES] = true;
- g_BlockPistonBreakable[E_BLOCK_WATER] = true;
- g_BlockPistonBreakable[E_BLOCK_WOODEN_BUTTON] = true;
- g_BlockPistonBreakable[E_BLOCK_WOODEN_DOOR] = true;
- g_BlockPistonBreakable[E_BLOCK_WOODEN_PRESSURE_PLATE] = true;
-
-
- // Blocks that cannot be snowed over:
- g_BlockIsSnowable[E_BLOCK_ACTIVE_COMPARATOR] = false;
- g_BlockIsSnowable[E_BLOCK_AIR] = false;
- g_BlockIsSnowable[E_BLOCK_BIG_FLOWER] = false;
- g_BlockIsSnowable[E_BLOCK_BROWN_MUSHROOM] = false;
- g_BlockIsSnowable[E_BLOCK_CACTUS] = false;
- g_BlockIsSnowable[E_BLOCK_CHEST] = false;
- g_BlockIsSnowable[E_BLOCK_CROPS] = false;
- g_BlockIsSnowable[E_BLOCK_DANDELION] = false;
- g_BlockIsSnowable[E_BLOCK_FIRE] = false;
- g_BlockIsSnowable[E_BLOCK_FLOWER] = false;
- g_BlockIsSnowable[E_BLOCK_GLASS] = false;
- g_BlockIsSnowable[E_BLOCK_ICE] = false;
- g_BlockIsSnowable[E_BLOCK_INACTIVE_COMPARATOR] = false;
- g_BlockIsSnowable[E_BLOCK_LAVA] = false;
- g_BlockIsSnowable[E_BLOCK_LILY_PAD] = false;
- g_BlockIsSnowable[E_BLOCK_REDSTONE_REPEATER_OFF] = false;
- g_BlockIsSnowable[E_BLOCK_REDSTONE_REPEATER_ON] = false;
- g_BlockIsSnowable[E_BLOCK_REDSTONE_TORCH_OFF] = false;
- g_BlockIsSnowable[E_BLOCK_REDSTONE_TORCH_ON] = false;
- g_BlockIsSnowable[E_BLOCK_REDSTONE_WIRE] = false;
- g_BlockIsSnowable[E_BLOCK_RED_MUSHROOM] = false;
- g_BlockIsSnowable[E_BLOCK_REEDS] = false;
- g_BlockIsSnowable[E_BLOCK_SAPLING] = false;
- g_BlockIsSnowable[E_BLOCK_SIGN_POST] = false;
- g_BlockIsSnowable[E_BLOCK_SNOW] = false;
- g_BlockIsSnowable[E_BLOCK_STAINED_GLASS] = false;
- g_BlockIsSnowable[E_BLOCK_STAINED_GLASS_PANE] = false;
- g_BlockIsSnowable[E_BLOCK_STATIONARY_LAVA] = false;
- g_BlockIsSnowable[E_BLOCK_STATIONARY_WATER] = false;
- g_BlockIsSnowable[E_BLOCK_TALL_GRASS] = false;
- g_BlockIsSnowable[E_BLOCK_TNT] = false;
- g_BlockIsSnowable[E_BLOCK_TORCH] = false;
- g_BlockIsSnowable[E_BLOCK_VINES] = false;
- g_BlockIsSnowable[E_BLOCK_WALLSIGN] = false;
- g_BlockIsSnowable[E_BLOCK_WATER] = false;
-
-
- // Blocks that don't drop without a special tool:
- g_BlockRequiresSpecialTool[E_BLOCK_BRICK] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_CAULDRON] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_COAL_ORE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_COBBLESTONE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_COBBLESTONE_STAIRS] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_COBWEB] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_DIAMOND_BLOCK] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_DIAMOND_ORE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_DOUBLE_STONE_SLAB] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_EMERALD_ORE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_END_STONE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_GOLD_BLOCK] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_GOLD_ORE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_IRON_BLOCK] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_IRON_ORE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_LAPIS_BLOCK] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_LAPIS_ORE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_MOSSY_COBBLESTONE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_NETHERRACK] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_NETHER_BRICK] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_NETHER_BRICK_STAIRS] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_OBSIDIAN] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_REDSTONE_ORE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_REDSTONE_ORE_GLOWING] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_SANDSTONE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_SANDSTONE_STAIRS] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_SNOW] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_STONE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_STONE_BRICKS] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_STONE_BRICK_STAIRS] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_STONE_PRESSURE_PLATE] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_STONE_SLAB] = true;
- g_BlockRequiresSpecialTool[E_BLOCK_VINES] = true;
-
- // Nonsolid blocks:
- g_BlockIsSolid[E_BLOCK_ACTIVATOR_RAIL] = false;
- g_BlockIsSolid[E_BLOCK_AIR] = false;
- g_BlockIsSolid[E_BLOCK_BIG_FLOWER] = false;
- g_BlockIsSolid[E_BLOCK_BROWN_MUSHROOM] = false;
- g_BlockIsSolid[E_BLOCK_CARROTS] = false;
- g_BlockIsSolid[E_BLOCK_COBWEB] = false;
- g_BlockIsSolid[E_BLOCK_CROPS] = false;
- g_BlockIsSolid[E_BLOCK_DANDELION] = false;
- g_BlockIsSolid[E_BLOCK_DETECTOR_RAIL] = false;
- g_BlockIsSolid[E_BLOCK_END_PORTAL] = false;
- g_BlockIsSolid[E_BLOCK_FIRE] = false;
- g_BlockIsSolid[E_BLOCK_FLOWER] = false;
- g_BlockIsSolid[E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE] = false;
- g_BlockIsSolid[E_BLOCK_LAVA] = false;
- g_BlockIsSolid[E_BLOCK_LEVER] = false;
- g_BlockIsSolid[E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE] = false;
- g_BlockIsSolid[E_BLOCK_MELON_STEM] = false;
- g_BlockIsSolid[E_BLOCK_NETHER_PORTAL] = false;
- g_BlockIsSolid[E_BLOCK_PISTON_EXTENSION] = false;
- g_BlockIsSolid[E_BLOCK_POTATOES] = false;
- g_BlockIsSolid[E_BLOCK_POWERED_RAIL] = false;
- g_BlockIsSolid[E_BLOCK_RAIL] = false;
- g_BlockIsSolid[E_BLOCK_REDSTONE_TORCH_OFF] = false;
- g_BlockIsSolid[E_BLOCK_REDSTONE_TORCH_ON] = false;
- g_BlockIsSolid[E_BLOCK_REDSTONE_WIRE] = false;
- g_BlockIsSolid[E_BLOCK_RED_MUSHROOM] = false;
- g_BlockIsSolid[E_BLOCK_REEDS] = false;
- g_BlockIsSolid[E_BLOCK_SAPLING] = false;
- g_BlockIsSolid[E_BLOCK_SIGN_POST] = false;
- g_BlockIsSolid[E_BLOCK_SNOW] = false;
- g_BlockIsSolid[E_BLOCK_STATIONARY_LAVA] = false;
- g_BlockIsSolid[E_BLOCK_STATIONARY_WATER] = false;
- g_BlockIsSolid[E_BLOCK_STONE_BUTTON] = false;
- g_BlockIsSolid[E_BLOCK_STONE_PRESSURE_PLATE] = false;
- g_BlockIsSolid[E_BLOCK_TALL_GRASS] = false;
- g_BlockIsSolid[E_BLOCK_TORCH] = false;
- g_BlockIsSolid[E_BLOCK_TRIPWIRE] = false;
- g_BlockIsSolid[E_BLOCK_VINES] = false;
- g_BlockIsSolid[E_BLOCK_WALLSIGN] = false;
- g_BlockIsSolid[E_BLOCK_WATER] = false;
- g_BlockIsSolid[E_BLOCK_WOODEN_BUTTON] = false;
- g_BlockIsSolid[E_BLOCK_WOODEN_PRESSURE_PLATE] = false;
- g_BlockIsSolid[E_BLOCK_WOODEN_SLAB] = false;
-
- // Torch placeable blocks:
- g_BlockFullyOccupiesVoxel[E_BLOCK_NEW_LOG] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_BEDROCK] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_BLOCK_OF_COAL] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_BLOCK_OF_REDSTONE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_BOOKCASE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_BRICK] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_CLAY] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_COAL_ORE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_COBBLESTONE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_COMMAND_BLOCK] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_CRAFTING_TABLE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_DIAMOND_BLOCK] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_DIAMOND_ORE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_DIRT] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_DISPENSER] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_DOUBLE_STONE_SLAB] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_DOUBLE_WOODEN_SLAB] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_DROPPER] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_EMERALD_BLOCK] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_EMERALD_ORE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_END_STONE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_FURNACE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_GLOWSTONE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_GOLD_BLOCK] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_GOLD_ORE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_GRASS] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_GRAVEL] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_HARDENED_CLAY] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_HAY_BALE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_HUGE_BROWN_MUSHROOM] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_HUGE_RED_MUSHROOM] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_IRON_BLOCK] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_IRON_ORE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_JACK_O_LANTERN] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_JUKEBOX] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_LAPIS_BLOCK] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_LAPIS_ORE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_LOG] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_MELON] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_MOSSY_COBBLESTONE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_MYCELIUM] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_NETHERRACK] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_NETHER_BRICK] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_NETHER_QUARTZ_ORE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_NOTE_BLOCK] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_OBSIDIAN] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_PACKED_ICE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_PLANKS] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_PUMPKIN] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_QUARTZ_BLOCK] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_REDSTONE_LAMP_OFF] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_REDSTONE_LAMP_ON] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_REDSTONE_ORE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_REDSTONE_ORE_GLOWING] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_SANDSTONE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_SAND] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_SILVERFISH_EGG] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_SPONGE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_STAINED_CLAY] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_WOOL] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_STONE] = true;
- g_BlockFullyOccupiesVoxel[E_BLOCK_STONE_BRICKS] = true;
- }
-} BlockPropertiesInitializer;
-
-
-
-
diff --git a/src/BlockID.h b/src/BlockID.h
index 861bb8dae..1c454cd23 100644
--- a/src/BlockID.h
+++ b/src/BlockID.h
@@ -909,17 +909,3 @@ extern cItem GetIniItemSet(cIniFile & a_IniFile, const char * a_Section, const c
-// Block properties:
-extern NIBBLETYPE g_BlockLightValue[256];
-extern NIBBLETYPE g_BlockSpreadLightFalloff[256];
-extern bool g_BlockTransparent[256];
-extern bool g_BlockOneHitDig[256];
-extern bool g_BlockPistonBreakable[256];
-extern bool g_BlockIsSnowable[256];
-extern bool g_BlockRequiresSpecialTool[256];
-extern bool g_BlockIsSolid[256];
-extern bool g_BlockFullyOccupiesVoxel[256];
-
-
-
-
diff --git a/src/BlockInfo.cpp b/src/BlockInfo.cpp
new file mode 100644
index 000000000..c73ae18b6
--- /dev/null
+++ b/src/BlockInfo.cpp
@@ -0,0 +1,423 @@
+
+#include "Globals.h"
+
+#include "BlockInfo.h"
+
+
+
+
+
+cBlockInfo cBlockInfo::ms_Info[256];
+
+
+
+
+
+cBlockInfo::cBlockInfo()
+ : m_LightValue(0x00)
+ , m_SpreadLightFalloff(0x0f)
+ , m_Transparent(false)
+ , m_OneHitDig(false)
+ , m_PistonBreakable(false)
+ , m_IsSnowable(true)
+ , m_RequiresSpecialTool(false)
+ , m_IsSolid(true)
+ , m_FullyOccupiesVoxel(false)
+{}
+
+
+
+
+
+cBlockInfo & cBlockInfo::Get(BLOCKTYPE a_Type)
+{
+ ASSERT(a_Type < 256);
+
+ return ms_Info[a_Type];
+}
+
+
+
+
+
+void cBlockInfo::Initialize(void)
+{
+ // Emissive blocks
+ ms_Info[E_BLOCK_FIRE ].m_LightValue = 15;
+ ms_Info[E_BLOCK_GLOWSTONE ].m_LightValue = 15;
+ ms_Info[E_BLOCK_JACK_O_LANTERN ].m_LightValue = 15;
+ ms_Info[E_BLOCK_LAVA ].m_LightValue = 15;
+ ms_Info[E_BLOCK_STATIONARY_LAVA ].m_LightValue = 15;
+ ms_Info[E_BLOCK_END_PORTAL ].m_LightValue = 15;
+ ms_Info[E_BLOCK_REDSTONE_LAMP_ON ].m_LightValue = 15;
+ ms_Info[E_BLOCK_TORCH ].m_LightValue = 14;
+ ms_Info[E_BLOCK_BURNING_FURNACE ].m_LightValue = 13;
+ ms_Info[E_BLOCK_NETHER_PORTAL ].m_LightValue = 11;
+ ms_Info[E_BLOCK_REDSTONE_ORE_GLOWING].m_LightValue = 9;
+ ms_Info[E_BLOCK_REDSTONE_REPEATER_ON].m_LightValue = 9;
+ ms_Info[E_BLOCK_REDSTONE_TORCH_ON ].m_LightValue = 7;
+ ms_Info[E_BLOCK_BREWING_STAND ].m_LightValue = 1;
+ ms_Info[E_BLOCK_BROWN_MUSHROOM ].m_LightValue = 1;
+ ms_Info[E_BLOCK_DRAGON_EGG ].m_LightValue = 1;
+
+
+ // Spread blocks
+ ms_Info[E_BLOCK_AIR ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_CAKE ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_CHEST ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_COBWEB ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_CROPS ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_FENCE ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_FENCE_GATE ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_FIRE ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_GLASS ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_GLASS_PANE ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_GLOWSTONE ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_IRON_BARS ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_IRON_DOOR ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_LEAVES ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_SIGN_POST ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_TORCH ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_VINES ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_WALLSIGN ].m_SpreadLightFalloff = 1;
+ ms_Info[E_BLOCK_WOODEN_DOOR ].m_SpreadLightFalloff = 1;
+
+ // Light in water and lava dissapears faster:
+ ms_Info[E_BLOCK_LAVA ].m_SpreadLightFalloff = 3;
+ ms_Info[E_BLOCK_STATIONARY_LAVA ].m_SpreadLightFalloff = 3;
+ ms_Info[E_BLOCK_STATIONARY_WATER ].m_SpreadLightFalloff = 3;
+ ms_Info[E_BLOCK_WATER ].m_SpreadLightFalloff = 3;
+
+
+ // Transparent blocks
+ ms_Info[E_BLOCK_ACTIVATOR_RAIL ].m_Transparent = true;
+ ms_Info[E_BLOCK_AIR ].m_Transparent = true;
+ ms_Info[E_BLOCK_BIG_FLOWER ].m_Transparent = true;
+ ms_Info[E_BLOCK_BROWN_MUSHROOM ].m_Transparent = true;
+ ms_Info[E_BLOCK_CARROTS ].m_Transparent = true;
+ ms_Info[E_BLOCK_CHEST ].m_Transparent = true;
+ ms_Info[E_BLOCK_COBWEB ].m_Transparent = true;
+ ms_Info[E_BLOCK_CROPS ].m_Transparent = true;
+ ms_Info[E_BLOCK_DANDELION ].m_Transparent = true;
+ ms_Info[E_BLOCK_DETECTOR_RAIL ].m_Transparent = true;
+ ms_Info[E_BLOCK_ENDER_CHEST ].m_Transparent = true;
+ ms_Info[E_BLOCK_FENCE ].m_Transparent = true;
+ ms_Info[E_BLOCK_FENCE_GATE ].m_Transparent = true;
+ ms_Info[E_BLOCK_FIRE ].m_Transparent = true;
+ ms_Info[E_BLOCK_FLOWER ].m_Transparent = true;
+ ms_Info[E_BLOCK_FLOWER_POT ].m_Transparent = true;
+ ms_Info[E_BLOCK_GLASS ].m_Transparent = true;
+ ms_Info[E_BLOCK_GLASS_PANE ].m_Transparent = true;
+ ms_Info[E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE].m_Transparent = true;
+ ms_Info[E_BLOCK_ICE ].m_Transparent = true;
+ ms_Info[E_BLOCK_IRON_DOOR ].m_Transparent = true;
+ ms_Info[E_BLOCK_LAVA ].m_Transparent = true;
+ ms_Info[E_BLOCK_LEAVES ].m_Transparent = true;
+ ms_Info[E_BLOCK_LEVER ].m_Transparent = true;
+ ms_Info[E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE].m_Transparent = true;
+ ms_Info[E_BLOCK_MELON_STEM ].m_Transparent = true;
+ ms_Info[E_BLOCK_NETHER_BRICK_FENCE ].m_Transparent = true;
+ ms_Info[E_BLOCK_NEW_LEAVES ].m_Transparent = true;
+ ms_Info[E_BLOCK_POTATOES ].m_Transparent = true;
+ ms_Info[E_BLOCK_POWERED_RAIL ].m_Transparent = true;
+ ms_Info[E_BLOCK_PISTON_EXTENSION ].m_Transparent = true;
+ ms_Info[E_BLOCK_PUMPKIN_STEM ].m_Transparent = true;
+ ms_Info[E_BLOCK_RAIL ].m_Transparent = true;
+ ms_Info[E_BLOCK_RED_MUSHROOM ].m_Transparent = true;
+ ms_Info[E_BLOCK_SIGN_POST ].m_Transparent = true;
+ ms_Info[E_BLOCK_SNOW ].m_Transparent = true;
+ ms_Info[E_BLOCK_STAINED_GLASS ].m_Transparent = true;
+ ms_Info[E_BLOCK_STAINED_GLASS_PANE ].m_Transparent = true;
+ ms_Info[E_BLOCK_STATIONARY_LAVA ].m_Transparent = true;
+ ms_Info[E_BLOCK_STATIONARY_WATER ].m_Transparent = true;
+ ms_Info[E_BLOCK_STONE_BUTTON ].m_Transparent = true;
+ ms_Info[E_BLOCK_STONE_PRESSURE_PLATE].m_Transparent = true;
+ ms_Info[E_BLOCK_TALL_GRASS ].m_Transparent = true;
+ ms_Info[E_BLOCK_TORCH ].m_Transparent = true;
+ ms_Info[E_BLOCK_VINES ].m_Transparent = true;
+ ms_Info[E_BLOCK_WALLSIGN ].m_Transparent = true;
+ ms_Info[E_BLOCK_WATER ].m_Transparent = true;
+ ms_Info[E_BLOCK_WOODEN_BUTTON ].m_Transparent = true;
+ ms_Info[E_BLOCK_WOODEN_DOOR ].m_Transparent = true;
+ ms_Info[E_BLOCK_WOODEN_PRESSURE_PLATE].m_Transparent = true;
+
+ // TODO: Any other transparent blocks?
+
+
+ // One hit break blocks:
+ ms_Info[E_BLOCK_ACTIVE_COMPARATOR ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_BIG_FLOWER ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_BROWN_MUSHROOM ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_CARROTS ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_CROPS ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_DANDELION ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_FIRE ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_FLOWER ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_FLOWER_POT ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_INACTIVE_COMPARATOR ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_MELON_STEM ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_POTATOES ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_PUMPKIN_STEM ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_REDSTONE_REPEATER_OFF].m_OneHitDig = true;
+ ms_Info[E_BLOCK_REDSTONE_REPEATER_ON].m_OneHitDig = true;
+ ms_Info[E_BLOCK_REDSTONE_TORCH_OFF ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_REDSTONE_TORCH_ON ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_REDSTONE_WIRE ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_RED_MUSHROOM ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_REEDS ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_SAPLING ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_TNT ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_TALL_GRASS ].m_OneHitDig = true;
+ ms_Info[E_BLOCK_TORCH ].m_OneHitDig = true;
+
+
+ // Blocks that break when pushed by piston:
+ ms_Info[E_BLOCK_ACTIVE_COMPARATOR ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_AIR ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_BED ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_BIG_FLOWER ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_BROWN_MUSHROOM ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_COBWEB ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_CROPS ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_DANDELION ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_DEAD_BUSH ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_FIRE ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_FLOWER ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_INACTIVE_COMPARATOR ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_IRON_DOOR ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_JACK_O_LANTERN ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_LADDER ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_LAVA ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_LEVER ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_MELON ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_MELON_STEM ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_PUMPKIN ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_PUMPKIN_STEM ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_REDSTONE_REPEATER_OFF].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_REDSTONE_REPEATER_ON].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_REDSTONE_TORCH_OFF ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_REDSTONE_TORCH_ON ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_REDSTONE_WIRE ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_RED_MUSHROOM ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_REEDS ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_SNOW ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_STATIONARY_LAVA ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_STATIONARY_WATER ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_STONE_BUTTON ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_STONE_PRESSURE_PLATE].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_TALL_GRASS ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_TORCH ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_VINES ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_WATER ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_WOODEN_BUTTON ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_WOODEN_DOOR ].m_PistonBreakable = true;
+ ms_Info[E_BLOCK_WOODEN_PRESSURE_PLATE].m_PistonBreakable = true;
+
+
+ // Blocks that cannot be snowed over:
+ ms_Info[E_BLOCK_ACTIVE_COMPARATOR ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_AIR ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_BIG_FLOWER ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_BROWN_MUSHROOM ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_CACTUS ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_CHEST ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_CROPS ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_DANDELION ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_FIRE ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_FLOWER ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_GLASS ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_ICE ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_INACTIVE_COMPARATOR ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_LAVA ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_LILY_PAD ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_REDSTONE_REPEATER_OFF].m_IsSnowable = false;
+ ms_Info[E_BLOCK_REDSTONE_REPEATER_ON].m_IsSnowable = false;
+ ms_Info[E_BLOCK_REDSTONE_TORCH_OFF ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_REDSTONE_TORCH_ON ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_REDSTONE_WIRE ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_RED_MUSHROOM ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_REEDS ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_SAPLING ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_SIGN_POST ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_SNOW ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_STAINED_GLASS ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_STAINED_GLASS_PANE ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_STATIONARY_LAVA ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_STATIONARY_WATER ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_TALL_GRASS ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_TNT ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_TORCH ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_VINES ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_WALLSIGN ].m_IsSnowable = false;
+ ms_Info[E_BLOCK_WATER ].m_IsSnowable = false;
+
+
+ // Blocks that don't drop without a special tool:
+ ms_Info[E_BLOCK_BRICK ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_CAULDRON ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_COAL_ORE ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_COBBLESTONE ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_COBBLESTONE_STAIRS ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_COBWEB ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_DIAMOND_BLOCK ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_DIAMOND_ORE ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_DOUBLE_STONE_SLAB ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_EMERALD_ORE ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_END_STONE ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_GOLD_BLOCK ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_GOLD_ORE ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_IRON_BLOCK ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_IRON_ORE ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_LAPIS_BLOCK ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_LAPIS_ORE ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_MOSSY_COBBLESTONE ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_NETHERRACK ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_NETHER_BRICK ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_NETHER_BRICK_STAIRS ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_OBSIDIAN ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_REDSTONE_ORE ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_REDSTONE_ORE_GLOWING].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_SANDSTONE ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_SANDSTONE_STAIRS ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_SNOW ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_STONE ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_STONE_BRICKS ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_STONE_BRICK_STAIRS ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_STONE_PRESSURE_PLATE].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_STONE_SLAB ].m_RequiresSpecialTool = true;
+ ms_Info[E_BLOCK_VINES ].m_RequiresSpecialTool = true;
+
+
+ // Nonsolid blocks:
+ ms_Info[E_BLOCK_ACTIVATOR_RAIL ].m_IsSolid = false;
+ ms_Info[E_BLOCK_AIR ].m_IsSolid = false;
+ ms_Info[E_BLOCK_BIG_FLOWER ].m_IsSolid = false;
+ ms_Info[E_BLOCK_BROWN_MUSHROOM ].m_IsSolid = false;
+ ms_Info[E_BLOCK_CARROTS ].m_IsSolid = false;
+ ms_Info[E_BLOCK_COBWEB ].m_IsSolid = false;
+ ms_Info[E_BLOCK_CROPS ].m_IsSolid = false;
+ ms_Info[E_BLOCK_DANDELION ].m_IsSolid = false;
+ ms_Info[E_BLOCK_DETECTOR_RAIL ].m_IsSolid = false;
+ ms_Info[E_BLOCK_END_PORTAL ].m_IsSolid = false;
+ ms_Info[E_BLOCK_FIRE ].m_IsSolid = false;
+ ms_Info[E_BLOCK_FLOWER ].m_IsSolid = false;
+ ms_Info[E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE].m_IsSolid = false;
+ ms_Info[E_BLOCK_LAVA ].m_IsSolid = false;
+ ms_Info[E_BLOCK_LEVER ].m_IsSolid = false;
+ ms_Info[E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE].m_IsSolid = false;
+ ms_Info[E_BLOCK_MELON_STEM ].m_IsSolid = false;
+ ms_Info[E_BLOCK_NETHER_PORTAL ].m_IsSolid = false;
+ ms_Info[E_BLOCK_PISTON_EXTENSION ].m_IsSolid = false;
+ ms_Info[E_BLOCK_POTATOES ].m_IsSolid = false;
+ ms_Info[E_BLOCK_POWERED_RAIL ].m_IsSolid = false;
+ ms_Info[E_BLOCK_RAIL ].m_IsSolid = false;
+ ms_Info[E_BLOCK_REDSTONE_TORCH_OFF ].m_IsSolid = false;
+ ms_Info[E_BLOCK_REDSTONE_TORCH_ON ].m_IsSolid = false;
+ ms_Info[E_BLOCK_REDSTONE_WIRE ].m_IsSolid = false;
+ ms_Info[E_BLOCK_RED_MUSHROOM ].m_IsSolid = false;
+ ms_Info[E_BLOCK_REEDS ].m_IsSolid = false;
+ ms_Info[E_BLOCK_SAPLING ].m_IsSolid = false;
+ ms_Info[E_BLOCK_SIGN_POST ].m_IsSolid = false;
+ ms_Info[E_BLOCK_SNOW ].m_IsSolid = false;
+ ms_Info[E_BLOCK_STATIONARY_LAVA ].m_IsSolid = false;
+ ms_Info[E_BLOCK_STATIONARY_WATER ].m_IsSolid = false;
+ ms_Info[E_BLOCK_STONE_BUTTON ].m_IsSolid = false;
+ ms_Info[E_BLOCK_STONE_PRESSURE_PLATE].m_IsSolid = false;
+ ms_Info[E_BLOCK_TALL_GRASS ].m_IsSolid = false;
+ ms_Info[E_BLOCK_TORCH ].m_IsSolid = false;
+ ms_Info[E_BLOCK_TRIPWIRE ].m_IsSolid = false;
+ ms_Info[E_BLOCK_VINES ].m_IsSolid = false;
+ ms_Info[E_BLOCK_WALLSIGN ].m_IsSolid = false;
+ ms_Info[E_BLOCK_WATER ].m_IsSolid = false;
+ ms_Info[E_BLOCK_WOODEN_BUTTON ].m_IsSolid = false;
+ ms_Info[E_BLOCK_WOODEN_PRESSURE_PLATE].m_IsSolid = false;
+ ms_Info[E_BLOCK_WOODEN_SLAB ].m_IsSolid = false;
+
+
+ // Torch placeable blocks:
+ ms_Info[E_BLOCK_NEW_LOG ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_BEDROCK ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_BLOCK_OF_COAL ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_BLOCK_OF_REDSTONE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_BOOKCASE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_BRICK ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_CLAY ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_COAL_ORE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_COBBLESTONE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_COMMAND_BLOCK ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_CRAFTING_TABLE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_DIAMOND_BLOCK ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_DIAMOND_ORE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_DIRT ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_DISPENSER ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_DOUBLE_STONE_SLAB ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_DOUBLE_WOODEN_SLAB ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_DROPPER ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_EMERALD_BLOCK ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_EMERALD_ORE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_END_STONE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_FURNACE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_GLOWSTONE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_GOLD_BLOCK ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_GOLD_ORE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_GRASS ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_GRAVEL ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_HARDENED_CLAY ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_HAY_BALE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_HUGE_BROWN_MUSHROOM ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_HUGE_RED_MUSHROOM ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_IRON_BLOCK ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_IRON_ORE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_JACK_O_LANTERN ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_JUKEBOX ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_LAPIS_BLOCK ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_LAPIS_ORE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_LOG ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_MELON ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_MOSSY_COBBLESTONE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_MYCELIUM ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_NETHERRACK ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_NETHER_BRICK ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_NETHER_QUARTZ_ORE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_NOTE_BLOCK ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_OBSIDIAN ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_PACKED_ICE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_PLANKS ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_PUMPKIN ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_QUARTZ_BLOCK ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_REDSTONE_LAMP_OFF ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_REDSTONE_LAMP_ON ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_REDSTONE_ORE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_REDSTONE_ORE_GLOWING].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_SANDSTONE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_SAND ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_SILVERFISH_EGG ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_SPONGE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_STAINED_CLAY ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_WOOL ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_STONE ].m_FullyOccupiesVoxel = true;
+ ms_Info[E_BLOCK_STONE_BRICKS ].m_FullyOccupiesVoxel = true;
+}
+
+
+
+
+
+// This is actually just some code that needs to run at program startup, so it is wrapped into a global var's constructor:
+class cBlockInfoInitializer
+{
+public:
+ cBlockInfoInitializer(void)
+ {
+ cBlockInfo::Initialize();
+ }
+} BlockInfoInitializer;
+
+
+
+
+
diff --git a/src/BlockInfo.h b/src/BlockInfo.h
new file mode 100644
index 000000000..34a845b20
--- /dev/null
+++ b/src/BlockInfo.h
@@ -0,0 +1,76 @@
+
+#pragma once
+
+
+
+
+
+// tolua_begin
+class cBlockInfo
+{
+public:
+ // tolua_end
+
+ cBlockInfo();
+
+ /** (Re-)Initializes the internal BlockInfo structures. */
+ static void Initialize(void);
+
+ // tolua_begin
+
+ /** Returns the associated BlockInfo structure. */
+ static cBlockInfo & Get(BLOCKTYPE a_Type);
+
+
+ /** How much light do the blocks emit on their own? */
+ NIBBLETYPE m_LightValue;
+
+ /** How much light do the blocks consume? */
+ NIBBLETYPE m_SpreadLightFalloff;
+
+ /** Is a block completely transparent? (light doesn't get decreased(?)) */
+ bool m_Transparent;
+
+ /** Is a block destroyed after a single hit? */
+ bool m_OneHitDig;
+
+ /** Can a piston break this block? */
+ bool m_PistonBreakable;
+
+ /** 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;
+
+ /** Does this block fully occupy its voxel - is it a 'full' block? */
+ bool m_FullyOccupiesVoxel;
+
+
+ inline static NIBBLETYPE GetLightValue (BLOCKTYPE a_Type) { return Get(a_Type).m_LightValue; }
+ inline static NIBBLETYPE GetSpreadLightFalloff(BLOCKTYPE a_Type) { return Get(a_Type).m_SpreadLightFalloff; }
+ inline static bool IsTransparent (BLOCKTYPE a_Type) { return Get(a_Type).m_Transparent; }
+ 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; }
+
+ // tolua_end
+
+
+protected:
+
+ // TODO xdot: Change to std::vector to support dynamic block IDs
+ static cBlockInfo ms_Info[256];
+
+
+}; // tolua_export
+
+
+
+
diff --git a/src/Blocks/BlockButton.h b/src/Blocks/BlockButton.h
index ca6850ced..2db9b7ec7 100644
--- a/src/Blocks/BlockButton.h
+++ b/src/Blocks/BlockButton.h
@@ -101,7 +101,7 @@ public:
AddFaceDirection(a_RelX, a_RelY, a_RelZ, BlockMetaDataToBlockFace(Meta), true);
BLOCKTYPE BlockIsOn; a_Chunk.UnboundedRelGetBlockType(a_RelX, a_RelY, a_RelZ, BlockIsOn);
- return (a_RelY > 0) && (g_BlockIsSolid[BlockIsOn]);
+ return (a_RelY > 0) && (cBlockInfo::IsSolid(BlockIsOn));
}
} ;
diff --git a/src/Blocks/BlockCactus.h b/src/Blocks/BlockCactus.h
index 83595d2b9..ed441517d 100644
--- a/src/Blocks/BlockCactus.h
+++ b/src/Blocks/BlockCactus.h
@@ -54,7 +54,7 @@ public:
NIBBLETYPE BlockMeta;
if (
a_Chunk.UnboundedRelGetBlock(a_RelX + Coords[i].x, a_RelY, a_RelZ + Coords[i].z, BlockType, BlockMeta) &&
- (g_BlockIsSolid[BlockType])
+ cBlockInfo::IsSolid(BlockType)
)
{
return false;
diff --git a/src/Blocks/BlockDirt.h b/src/Blocks/BlockDirt.h
index 91534c5e5..544424a04 100644
--- a/src/Blocks/BlockDirt.h
+++ b/src/Blocks/BlockDirt.h
@@ -36,7 +36,7 @@ public:
if (a_RelY < cChunkDef::Height - 1)
{
BLOCKTYPE Above = a_Chunk.GetBlock(a_RelX, a_RelY + 1, a_RelZ);
- if ((!g_BlockTransparent[Above] && !g_BlockOneHitDig[Above]) || IsBlockWater(Above))
+ if ((!cBlockInfo::IsTransparent(Above) && !cBlockInfo::IsOneHitDig(Above)) || IsBlockWater(Above))
{
a_Chunk.FastSetBlock(a_RelX, a_RelY, a_RelZ, E_BLOCK_DIRT, E_META_DIRT_NORMAL);
return;
@@ -77,7 +77,7 @@ public:
BLOCKTYPE AboveDest;
NIBBLETYPE AboveMeta;
Chunk->GetBlockTypeMeta(BlockX, BlockY + 1, BlockZ, AboveDest, AboveMeta);
- if ((g_BlockOneHitDig[AboveDest] || g_BlockTransparent[AboveDest]) && !IsBlockWater(AboveDest))
+ if ((cBlockInfo::IsOneHitDig(AboveDest) || cBlockInfo::IsTransparent(AboveDest)) && !IsBlockWater(AboveDest))
{
Chunk->FastSetBlock(BlockX, BlockY, BlockZ, E_BLOCK_GRASS, 0);
}
diff --git a/src/Blocks/BlockLadder.h b/src/Blocks/BlockLadder.h
index 6a105d5c9..a3e9edc6b 100644
--- a/src/Blocks/BlockLadder.h
+++ b/src/Blocks/BlockLadder.h
@@ -91,7 +91,7 @@ public:
AddFaceDirection( a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, true);
- return g_BlockIsSolid[a_ChunkInterface.GetBlock(a_BlockX, a_BlockY, a_BlockZ)];
+ return cBlockInfo::IsSolid(a_ChunkInterface.GetBlock(a_BlockX, a_BlockY, a_BlockZ));
}
diff --git a/src/Blocks/BlockLever.h b/src/Blocks/BlockLever.h
index 48c7e774b..ef6e102cd 100644
--- a/src/Blocks/BlockLever.h
+++ b/src/Blocks/BlockLever.h
@@ -102,7 +102,7 @@ public:
AddFaceDirection(a_RelX, a_RelY, a_RelZ, BlockMetaDataToBlockFace(Meta), true);
BLOCKTYPE BlockIsOn; a_Chunk.UnboundedRelGetBlockType(a_RelX, a_RelY, a_RelZ, BlockIsOn);
- return (a_RelY > 0) && (g_BlockIsSolid[BlockIsOn]);
+ return (a_RelY > 0) && cBlockInfo::IsSolid(BlockIsOn);
}
} ;
diff --git a/src/Blocks/BlockRail.h b/src/Blocks/BlockRail.h
index 52d6f60b3..07e9814cd 100644
--- a/src/Blocks/BlockRail.h
+++ b/src/Blocks/BlockRail.h
@@ -98,7 +98,7 @@ public:
{
return false;
}
- if (!g_BlockIsSolid[a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ)])
+ if (!cBlockInfo::IsSolid(a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ)))
{
return false;
}
@@ -130,7 +130,7 @@ public:
// Too close to the edge, cannot simulate
return true;
}
- return g_BlockIsSolid[BlockType];
+ return cBlockInfo::IsSolid(BlockType);
}
}
return true;
diff --git a/src/Blocks/BlockRedstone.h b/src/Blocks/BlockRedstone.h
index 10de96197..a898c9acb 100644
--- a/src/Blocks/BlockRedstone.h
+++ b/src/Blocks/BlockRedstone.h
@@ -20,7 +20,7 @@ public:
virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
{
- return ((a_RelY > 0) && g_BlockFullyOccupiesVoxel[a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ)]);
+ return ((a_RelY > 0) && cBlockInfo::FullyOccupiesVoxel(a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ)));
}
diff --git a/src/Blocks/BlockSnow.h b/src/Blocks/BlockSnow.h
index a3daf0393..b21995d3c 100644
--- a/src/Blocks/BlockSnow.h
+++ b/src/Blocks/BlockSnow.h
@@ -72,7 +72,7 @@ public:
BLOCKTYPE BlockBelow = a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ);
NIBBLETYPE MetaBelow = a_Chunk.GetMeta(a_RelX, a_RelY - 1, a_RelZ);
- if (g_BlockIsSnowable[BlockBelow] || ((BlockBelow == E_BLOCK_SNOW) && (MetaBelow == 7)))
+ if (cBlockInfo::IsSnowable(BlockBelow) || ((BlockBelow == E_BLOCK_SNOW) && (MetaBelow == 7)))
{
// If block below is snowable, or it is a thin slow block and has a meta of 7 (full thin snow block), say yay
return true;
diff --git a/src/Blocks/BlockTorch.h b/src/Blocks/BlockTorch.h
index f2a4c8665..84bbb37ec 100644
--- a/src/Blocks/BlockTorch.h
+++ b/src/Blocks/BlockTorch.h
@@ -99,7 +99,7 @@ public:
static bool CanBePlacedOn(BLOCKTYPE a_BlockType, eBlockFace a_BlockFace)
{
- if ( !g_BlockFullyOccupiesVoxel[a_BlockType] )
+ if ( !cBlockInfo::FullyOccupiesVoxel(a_BlockType) )
{
return (a_BlockFace == BLOCK_FACE_TOP); // Allow placement only when torch upright (for glass, etc.); exceptions won't even be sent by client, no need to handle
}
@@ -129,7 +129,7 @@ public:
{
return Face;
}
- else if ((g_BlockFullyOccupiesVoxel[BlockInQuestion]) && (i != BLOCK_FACE_BOTTOM))
+ else if (cBlockInfo::FullyOccupiesVoxel(BlockInQuestion) && (i != BLOCK_FACE_BOTTOM))
{
// Otherwise, if block in that direction is torch placeable and we haven't gotten to it via the bottom face, return that face
return Face;
@@ -163,7 +163,7 @@ public:
// No need to check for upright orientation, it was done when the torch was placed
return true;
}
- else if ( !g_BlockFullyOccupiesVoxel[BlockInQuestion] )
+ else if ( !cBlockInfo::FullyOccupiesVoxel(BlockInQuestion) )
{
return false;
}
diff --git a/src/Blocks/BlockTrapdoor.h b/src/Blocks/BlockTrapdoor.h
index 08fc28327..70a369e69 100644
--- a/src/Blocks/BlockTrapdoor.h
+++ b/src/Blocks/BlockTrapdoor.h
@@ -97,7 +97,7 @@ public:
AddFaceDirection(a_RelX, a_RelY, a_RelZ, BlockMetaDataToBlockFace(Meta), true);
BLOCKTYPE BlockIsOn; a_Chunk.UnboundedRelGetBlockType(a_RelX, a_RelY, a_RelZ, BlockIsOn);
- return (a_RelY > 0) && (g_BlockIsSolid[BlockIsOn]);
+ return (a_RelY > 0) && cBlockInfo::IsSolid(BlockIsOn);
}
};
diff --git a/src/Blocks/BlockVine.h b/src/Blocks/BlockVine.h
index ee7dcee8a..d8c114284 100644
--- a/src/Blocks/BlockVine.h
+++ b/src/Blocks/BlockVine.h
@@ -70,7 +70,7 @@ public:
/// Returns true if the specified block type is good for vines to attach to
static bool IsBlockAttachable(BLOCKTYPE a_BlockType)
{
- return (a_BlockType == E_BLOCK_LEAVES) || g_BlockIsSolid[a_BlockType];
+ return (a_BlockType == E_BLOCK_LEAVES) || cBlockInfo::IsSolid(a_BlockType);
}
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 387556775..5e0731264 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -95,6 +95,7 @@ if (NOT MSVC)
#add cpp files here
add_library(Bindings
Bindings/Bindings
+ Bindings/DeprecatedBindings
Bindings/LuaChunkStay
Bindings/LuaState
Bindings/LuaWindow
diff --git a/src/Chunk.cpp b/src/Chunk.cpp
index 8dfbbeef5..a75828461 100644
--- a/src/Chunk.cpp
+++ b/src/Chunk.cpp
@@ -883,7 +883,7 @@ void cChunk::ApplyWeatherToTop()
FastSetBlock(X, Height, Z, E_BLOCK_SNOW, TopMeta - 1);
}
}
- else if (g_BlockIsSnowable[TopBlock])
+ else if (cBlockInfo::IsSnowable(TopBlock))
{
SetBlock(X, Height + 1, Z, E_BLOCK_SNOW, 0);
}
@@ -1540,10 +1540,10 @@ void cChunk::FastSetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockT
SetNibble(m_BlockMeta, index, a_BlockMeta);
// ONLY recalculate lighting if it's necessary!
- if(
- (g_BlockLightValue[OldBlockType ] != g_BlockLightValue[a_BlockType]) ||
- (g_BlockSpreadLightFalloff[OldBlockType] != g_BlockSpreadLightFalloff[a_BlockType]) ||
- (g_BlockTransparent[OldBlockType] != g_BlockTransparent[a_BlockType])
+ if (
+ (cBlockInfo::GetLightValue (OldBlockType) != cBlockInfo::GetLightValue (a_BlockType)) ||
+ (cBlockInfo::GetSpreadLightFalloff(OldBlockType) != cBlockInfo::GetSpreadLightFalloff(a_BlockType)) ||
+ (cBlockInfo::IsTransparent (OldBlockType) != cBlockInfo::IsTransparent (a_BlockType))
)
{
m_IsLightValid = false;
diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp
index dd2116dbf..07a8984c5 100644
--- a/src/ClientHandle.cpp
+++ b/src/ClientHandle.cpp
@@ -819,7 +819,7 @@ void cClientHandle::HandleBlockDigStarted(int a_BlockX, int a_BlockY, int a_Bloc
if (
(m_Player->IsGameModeCreative()) || // In creative mode, digging is done immediately
- g_BlockOneHitDig[a_OldBlock] // One-hit blocks get destroyed immediately, too
+ cBlockInfo::IsOneHitDig(a_OldBlock) // One-hit blocks get destroyed immediately, too
)
{
HandleBlockDigFinished(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_OldBlock, a_OldMeta);
diff --git a/src/Defines.h b/src/Defines.h
index ba2866f83..6d3d28c80 100644
--- a/src/Defines.h
+++ b/src/Defines.h
@@ -17,33 +17,6 @@ typedef std::vector<int> cSlotNums;
// tolua_begin
-/// How much light do the blocks emit on their own?
-extern unsigned char g_BlockLightValue[];
-
-/// How much light do the block consume?
-extern unsigned char g_BlockSpreadLightFalloff[];
-
-/// Is a block completely transparent? (light doesn't get decreased(?))
-extern bool g_BlockTransparent[];
-
-/// Is a block destroyed after a single hit?
-extern bool g_BlockOneHitDig[];
-
-/// Can a piston break this block?
-extern bool g_BlockPistonBreakable[256];
-
-/// Can this block hold snow atop?
-extern bool g_BlockIsSnowable[256];
-
-/// Does this block require a tool to drop?
-extern bool g_BlockRequiresSpecialTool[256];
-
-/// Is this block solid (player cannot walk through)?
-extern bool g_BlockIsSolid[256];
-
-/// Does this block fully occupy it's voxel - is it a 'full' block?
-extern bool g_BlockFullyOccupiesVoxel[256];
-
/// Experience Orb setup
enum
{
@@ -654,7 +627,7 @@ namespace ItemCategory
inline bool BlockRequiresSpecialTool(BLOCKTYPE a_BlockType)
{
if(!IsValidBlock(a_BlockType)) return false;
- return g_BlockRequiresSpecialTool[a_BlockType];
+ return cBlockInfo::RequiresSpecialTool(a_BlockType);
}
diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp
index 8554ab2a5..96e8c15a5 100644
--- a/src/Entities/Entity.cpp
+++ b/src/Entities/Entity.cpp
@@ -582,11 +582,11 @@ void cEntity::HandlePhysics(float a_Dt, cChunk & a_Chunk)
int RelBlockZ = BlockZ - (NextChunk->GetPosZ() * cChunkDef::Width);
BLOCKTYPE BlockIn = NextChunk->GetBlock( RelBlockX, BlockY, RelBlockZ );
BLOCKTYPE BlockBelow = (BlockY > 0) ? NextChunk->GetBlock(RelBlockX, BlockY - 1, RelBlockZ) : E_BLOCK_AIR;
- if (!g_BlockIsSolid[BlockIn]) // Making sure we are not inside a solid block
+ if (!cBlockInfo::IsSolid(BlockIn)) // Making sure we are not inside a solid block
{
if (m_bOnGround) // check if it's still on the ground
{
- if (!g_BlockIsSolid[BlockBelow]) // Check if block below is air or water.
+ if (!cBlockInfo::IsSolid(BlockBelow)) // Check if block below is air or water.
{
m_bOnGround = false;
}
@@ -616,7 +616,7 @@ void cEntity::HandlePhysics(float a_Dt, cChunk & a_Chunk)
// The pickup is too close to an unloaded chunk, bail out of any physics handling
return;
}
- if (!g_BlockIsSolid[GotBlock])
+ if (!cBlockInfo::IsSolid(GotBlock))
{
NextPos.x += gCrossCoords[i].x;
NextPos.z += gCrossCoords[i].z;
diff --git a/src/Entities/Minecart.cpp b/src/Entities/Minecart.cpp
index d854906b7..f52a7b6d9 100644
--- a/src/Entities/Minecart.cpp
+++ b/src/Entities/Minecart.cpp
@@ -720,7 +720,7 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta)
if (GetSpeedZ() > 0)
{
BLOCKTYPE Block = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)ceil(GetPosZ()));
- if (!IsBlockRail(Block) && g_BlockIsSolid[Block])
+ if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block))
{
// We could try to detect a block in front based purely on coordinates, but xoft made a bounding box system - why not use? :P
cBoundingBox bbBlock(Vector3d((int)floor(GetPosX()), (int)floor(GetPosY()), (int)ceil(GetPosZ())), 0.5, 1);
@@ -737,7 +737,7 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta)
else if (GetSpeedZ() < 0)
{
BLOCKTYPE Block = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) - 1);
- if (!IsBlockRail(Block) && g_BlockIsSolid[Block])
+ if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block))
{
cBoundingBox bbBlock(Vector3d((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) - 1), 0.5, 1);
cBoundingBox bbMinecart(Vector3d(GetPosX(), floor(GetPosY()), GetPosZ() - 1), GetWidth() / 2, GetHeight());
@@ -757,7 +757,7 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta)
if (GetSpeedX() > 0)
{
BLOCKTYPE Block = m_World->GetBlock((int)ceil(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()));
- if (!IsBlockRail(Block) && g_BlockIsSolid[Block])
+ if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block))
{
cBoundingBox bbBlock(Vector3d((int)ceil(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ())), 0.5, 1);
cBoundingBox bbMinecart(Vector3d(GetPosX(), floor(GetPosY()), GetPosZ()), GetWidth() / 2, GetHeight());
@@ -773,7 +773,7 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta)
else if (GetSpeedX() < 0)
{
BLOCKTYPE Block = m_World->GetBlock((int)floor(GetPosX()) - 1, (int)floor(GetPosY()), (int)floor(GetPosZ()));
- if (!IsBlockRail(Block) && g_BlockIsSolid[Block])
+ if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block))
{
cBoundingBox bbBlock(Vector3d((int)floor(GetPosX()) - 1, (int)floor(GetPosY()), (int)floor(GetPosZ())), 0.5, 1);
cBoundingBox bbMinecart(Vector3d(GetPosX() - 1, floor(GetPosY()), GetPosZ()), GetWidth() / 2, GetHeight());
@@ -798,10 +798,10 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta)
BLOCKTYPE BlockZM = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) + 1);
BLOCKTYPE BlockZP = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) + 1);
if (
- (!IsBlockRail(BlockXM) && g_BlockIsSolid[BlockXM]) ||
- (!IsBlockRail(BlockXP) && g_BlockIsSolid[BlockXP]) ||
- (!IsBlockRail(BlockZM) && g_BlockIsSolid[BlockZM]) ||
- (!IsBlockRail(BlockZP) && g_BlockIsSolid[BlockZP])
+ (!IsBlockRail(BlockXM) && cBlockInfo::IsSolid(BlockXM)) ||
+ (!IsBlockRail(BlockXP) && cBlockInfo::IsSolid(BlockXP)) ||
+ (!IsBlockRail(BlockZM) && cBlockInfo::IsSolid(BlockZM)) ||
+ (!IsBlockRail(BlockZP) && cBlockInfo::IsSolid(BlockZP))
)
{
SetSpeed(0, 0, 0);
diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp
index 8f94f1feb..42ee14cf3 100644
--- a/src/Entities/Player.cpp
+++ b/src/Entities/Player.cpp
@@ -1904,7 +1904,7 @@ void cPlayer::Detach()
{
for (int z = PosZ - 2; z <= (PosZ + 2); ++z)
{
- if (!g_BlockIsSolid[m_World->GetBlock(x, y, z)] && g_BlockIsSolid[m_World->GetBlock(x, y - 1, z)])
+ if (!cBlockInfo::IsSolid(m_World->GetBlock(x, y, z)) && cBlockInfo::IsSolid(m_World->GetBlock(x, y - 1, z)))
{
TeleportToCoords(x, y, z);
return;
diff --git a/src/Entities/ProjectileEntity.cpp b/src/Entities/ProjectileEntity.cpp
index ef82c6e94..03bc0c99d 100644
--- a/src/Entities/ProjectileEntity.cpp
+++ b/src/Entities/ProjectileEntity.cpp
@@ -50,12 +50,12 @@ protected:
LOGD("Hit block %d:%d at {%d, %d, %d} face %d, %s (%s)",
a_BlockType, a_BlockMeta,
a_BlockX, a_BlockY, a_BlockZ, a_EntryFace,
- g_BlockIsSolid[a_BlockType] ? "solid" : "non-solid",
+ cBlockInfo::IsSolid(a_BlockType) ? "solid" : "non-solid",
ItemToString(cItem(a_BlockType, 1, a_BlockMeta)).c_str()
);
*/
- if (g_BlockIsSolid[a_BlockType])
+ if (cBlockInfo::IsSolid(a_BlockType))
{
// The projectile hit a solid block
// Calculate the exact hit coords:
diff --git a/src/Generating/FinishGen.cpp b/src/Generating/FinishGen.cpp
index 02045f76a..f2d66af70 100644
--- a/src/Generating/FinishGen.cpp
+++ b/src/Generating/FinishGen.cpp
@@ -88,7 +88,7 @@ void cFinishGenNetherClumpFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
{
continue;
}
- if (!g_BlockIsSolid[a_ChunkDesc.GetBlockType(PosX, y - 1, PosZ)]) // Only place on solid blocks
+ if (!cBlockInfo::IsSolid(a_ChunkDesc.GetBlockType(PosX, y - 1, PosZ))) // Only place on solid blocks
{
continue;
}
@@ -131,7 +131,7 @@ void cFinishGenNetherClumpFoliage::TryPlaceClump(cChunkDesc & a_ChunkDesc, int a
}
BLOCKTYPE BlockBelow = a_ChunkDesc.GetBlockType(x, y - 1, z);
- if (!g_BlockIsSolid[BlockBelow]) // Only place on solid blocks
+ if (!cBlockInfo::IsSolid(BlockBelow)) // Only place on solid blocks
{
continue;
}
@@ -329,7 +329,7 @@ void cFinishGenSnow::GenFinish(cChunkDesc & a_ChunkDesc)
case biFrozenOcean:
{
int Height = a_ChunkDesc.GetHeight(x, z);
- if (g_BlockIsSnowable[a_ChunkDesc.GetBlockType(x, Height, z)])
+ if (cBlockInfo::IsSnowable(a_ChunkDesc.GetBlockType(x, Height, z)))
{
a_ChunkDesc.SetBlockType(x, Height + 1, z, E_BLOCK_SNOW);
a_ChunkDesc.SetHeight(x, z, Height + 1);
diff --git a/src/Globals.h b/src/Globals.h
index e4737a98a..28805a83f 100644
--- a/src/Globals.h
+++ b/src/Globals.h
@@ -250,6 +250,7 @@ T Clamp(T a_Value, T a_Min, T a_Max)
#include "ChunkDef.h"
#include "BiomeDef.h"
#include "BlockID.h"
+#include "BlockInfo.h"
#include "Entities/Effects.h"
diff --git a/src/Items/ItemRedstoneDust.h b/src/Items/ItemRedstoneDust.h
index 18c6b8615..274d905a5 100644
--- a/src/Items/ItemRedstoneDust.h
+++ b/src/Items/ItemRedstoneDust.h
@@ -27,7 +27,7 @@ public:
BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta
) override
{
- if (!g_BlockFullyOccupiesVoxel[a_World->GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ)]) // Some solid blocks, such as cocoa beans, are not suitable for dust
+ if (!cBlockInfo::FullyOccupiesVoxel(a_World->GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ))) // Some solid blocks, such as cocoa beans, are not suitable for dust
{
return false;
}
diff --git a/src/LightingThread.cpp b/src/LightingThread.cpp
index 9c81d004d..44dadb8a9 100644
--- a/src/LightingThread.cpp
+++ b/src/LightingThread.cpp
@@ -391,7 +391,7 @@ void cLightingThread::PrepareBlockLight(void)
int idx = BaseZ + x;
for (int y = m_HeightMap[idx], Index = idx + y * BlocksPerYLayer; y >= 0; y--, Index -= BlocksPerYLayer)
{
- if (g_BlockLightValue[m_BlockTypes[Index]] == 0)
+ if (cBlockInfo::GetLightValue(m_BlockTypes[Index]) == 0)
{
continue;
}
@@ -401,7 +401,7 @@ void cLightingThread::PrepareBlockLight(void)
m_SeedIdx1[m_NumSeeds++] = Index;
// Light it up:
- m_BlockLight[Index] = g_BlockLightValue[m_BlockTypes[Index]];
+ m_BlockLight[Index] = cBlockInfo::GetLightValue(m_BlockTypes[Index]);
}
}
}
diff --git a/src/LightingThread.h b/src/LightingThread.h
index 72d561348..198f27248 100644
--- a/src/LightingThread.h
+++ b/src/LightingThread.h
@@ -169,13 +169,13 @@ protected:
ASSERT(a_DstIdx >= 0);
ASSERT(a_DstIdx < (int)ARRAYCOUNT(m_BlockTypes));
- if (a_Light[a_SrcIdx] <= a_Light[a_DstIdx] + g_BlockSpreadLightFalloff[m_BlockTypes[a_DstIdx]])
+ if (a_Light[a_SrcIdx] <= a_Light[a_DstIdx] + cBlockInfo::GetSpreadLightFalloff(m_BlockTypes[a_DstIdx]))
{
// We're not offering more light than the dest block already has
return;
}
- a_Light[a_DstIdx] = a_Light[a_SrcIdx] - g_BlockSpreadLightFalloff[m_BlockTypes[a_DstIdx]];
+ a_Light[a_DstIdx] = a_Light[a_SrcIdx] - cBlockInfo::GetSpreadLightFalloff(m_BlockTypes[a_DstIdx]);
if (!a_IsSeedOut[a_DstIdx])
{
a_IsSeedOut[a_DstIdx] = true;
diff --git a/src/MobSpawner.cpp b/src/MobSpawner.cpp
index c86268e63..7704f6cf3 100644
--- a/src/MobSpawner.cpp
+++ b/src/MobSpawner.cpp
@@ -145,7 +145,7 @@ bool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_R
case cMonster::mtBat:
{
- return (a_RelY <= 63) && (BlockLight <= 4) && (SkyLight <= 4) && (TargetBlock == E_BLOCK_AIR) && (!g_BlockTransparent[BlockAbove]);
+ return (a_RelY <= 63) && (BlockLight <= 4) && (SkyLight <= 4) && (TargetBlock == E_BLOCK_AIR) && !cBlockInfo::IsTransparent(BlockAbove);
}
case cMonster::mtChicken:
@@ -157,7 +157,7 @@ bool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_R
return (
(TargetBlock == E_BLOCK_AIR) &&
(BlockAbove == E_BLOCK_AIR) &&
- (!g_BlockTransparent[BlockBelow]) &&
+ (!cBlockInfo::IsTransparent(BlockBelow)) &&
(BlockBelow == E_BLOCK_GRASS) &&
(SkyLight >= 9)
);
@@ -188,7 +188,7 @@ bool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_R
(TargetBlock == E_BLOCK_AIR) &&
(BlockAbove == E_BLOCK_AIR) &&
(BlockTop == E_BLOCK_AIR) &&
- (!g_BlockTransparent[BlockBelow]) &&
+ (!cBlockInfo::IsTransparent(BlockBelow)) &&
(SkyLight <= 7) &&
(BlockLight <= 7)
);
@@ -215,7 +215,7 @@ bool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_R
HaveFloor ||
(
a_Chunk->UnboundedRelGetBlockType(a_RelX + x, a_RelY - 1, a_RelZ + z, TargetBlock) &&
- !g_BlockTransparent[TargetBlock]
+ !cBlockInfo::IsTransparent(TargetBlock)
)
);
}
@@ -230,7 +230,7 @@ bool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_R
return (
(TargetBlock == E_BLOCK_AIR) &&
(BlockAbove == E_BLOCK_AIR) &&
- (!g_BlockTransparent[BlockBelow]) &&
+ (!cBlockInfo::IsTransparent(BlockBelow)) &&
(SkyLight <= 7) &&
(BlockLight <= 7) &&
(m_Random.NextInt(2, a_Biome) == 0)
@@ -242,7 +242,7 @@ bool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_R
return (
(TargetBlock == E_BLOCK_AIR) &&
(BlockAbove == E_BLOCK_AIR) &&
- (!g_BlockTransparent[BlockBelow]) &&
+ (!cBlockInfo::IsTransparent(BlockBelow)) &&
(
(a_RelY <= 40) || (a_Biome == biSwampland)
)
@@ -255,7 +255,7 @@ bool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_R
return (
(TargetBlock == E_BLOCK_AIR) &&
(BlockAbove == E_BLOCK_AIR) &&
- (!g_BlockTransparent[BlockBelow]) &&
+ (!cBlockInfo::IsTransparent(BlockBelow)) &&
(m_Random.NextInt(20, a_Biome) == 0)
);
}
diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp
index ac9137ccd..6e3c91d58 100644
--- a/src/Mobs/Monster.cpp
+++ b/src/Mobs/Monster.cpp
@@ -148,11 +148,11 @@ void cMonster::TickPathFinding()
BLOCKTYPE BlockAtYPP = m_World->GetBlock(gCrossCoords[i].x + PosX, PosY + 2, gCrossCoords[i].z + PosZ);
BLOCKTYPE BlockAtYM = m_World->GetBlock(gCrossCoords[i].x + PosX, PosY - 1, gCrossCoords[i].z + PosZ);
- if ((!g_BlockIsSolid[BlockAtY]) && (!g_BlockIsSolid[BlockAtYP]) && (!IsBlockLava(BlockAtYM)) && (BlockAtY != E_BLOCK_FENCE) && (BlockAtY != E_BLOCK_FENCE_GATE))
+ if ((!cBlockInfo::IsSolid(BlockAtY)) && (!cBlockInfo::IsSolid(BlockAtYP)) && (!IsBlockLava(BlockAtYM)) && (BlockAtY != E_BLOCK_FENCE) && (BlockAtY != E_BLOCK_FENCE_GATE))
{
m_PotentialCoordinates.push_back(Vector3d((gCrossCoords[i].x + PosX), PosY, gCrossCoords[i].z + PosZ));
}
- else if ((g_BlockIsSolid[BlockAtY]) && (!g_BlockIsSolid[BlockAtYP]) && (!g_BlockIsSolid[BlockAtYPP]) && (!IsBlockLava(BlockAtYM)) && (BlockAtY != E_BLOCK_FENCE) && (BlockAtY != E_BLOCK_FENCE_GATE))
+ else if ((cBlockInfo::IsSolid(BlockAtY)) && (!cBlockInfo::IsSolid(BlockAtYP)) && (!cBlockInfo::IsSolid(BlockAtYPP)) && (!IsBlockLava(BlockAtYM)) && (BlockAtY != E_BLOCK_FENCE) && (BlockAtY != E_BLOCK_FENCE_GATE))
{
m_PotentialCoordinates.push_back(Vector3d((gCrossCoords[i].x + PosX), PosY + 1, gCrossCoords[i].z + PosZ));
}
@@ -416,9 +416,9 @@ int cMonster::FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ)
else if (PosY > cChunkDef::Height)
PosY = cChunkDef::Height;
- if (!g_BlockIsSolid[m_World->GetBlock((int)floor(a_PosX), PosY, (int)floor(a_PosZ))])
+ if (!cBlockInfo::IsSolid(m_World->GetBlock((int)floor(a_PosX), PosY, (int)floor(a_PosZ))))
{
- while (!g_BlockIsSolid[m_World->GetBlock((int)floor(a_PosX), PosY, (int)floor(a_PosZ))] && (PosY > 0))
+ while (!cBlockInfo::IsSolid(m_World->GetBlock((int)floor(a_PosX), PosY, (int)floor(a_PosZ))) && (PosY > 0))
{
PosY--;
}
@@ -427,7 +427,7 @@ int cMonster::FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ)
}
else
{
- while (g_BlockIsSolid[m_World->GetBlock((int)floor(a_PosX), PosY, (int)floor(a_PosZ))] && (PosY < cChunkDef::Height))
+ while (cBlockInfo::IsSolid(m_World->GetBlock((int)floor(a_PosX), PosY, (int)floor(a_PosZ))) && (PosY < cChunkDef::Height))
{
PosY++;
}
diff --git a/src/Mobs/SnowGolem.cpp b/src/Mobs/SnowGolem.cpp
index 67e3a3bb8..c1979a495 100644
--- a/src/Mobs/SnowGolem.cpp
+++ b/src/Mobs/SnowGolem.cpp
@@ -38,7 +38,7 @@ void cSnowGolem::Tick(float a_Dt, cChunk & a_Chunk)
{
BLOCKTYPE BlockBelow = m_World->GetBlock((int) floor(GetPosX()), (int) floor(GetPosY()) - 1, (int) floor(GetPosZ()));
BLOCKTYPE Block = m_World->GetBlock((int) floor(GetPosX()), (int) floor(GetPosY()), (int) floor(GetPosZ()));
- if (Block == E_BLOCK_AIR && g_BlockIsSolid[BlockBelow])
+ if (Block == E_BLOCK_AIR && cBlockInfo::IsSolid(BlockBelow))
{
m_World->SetBlock((int) floor(GetPosX()), (int) floor(GetPosY()), (int) floor(GetPosZ()), E_BLOCK_SNOW, 0);
}
diff --git a/src/Piston.cpp b/src/Piston.cpp
index 5eb14451d..b21d576f3 100644
--- a/src/Piston.cpp
+++ b/src/Piston.cpp
@@ -242,7 +242,7 @@ bool cPiston::CanPush(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
bool cPiston::CanBreakPush(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
{
UNUSED(a_BlockMeta);
- return g_BlockPistonBreakable[a_BlockType];
+ return cBlockInfo::IsPistonBreakable(a_BlockType);
}
diff --git a/src/Simulator/FireSimulator.cpp b/src/Simulator/FireSimulator.cpp
index 85190c82b..4967c83f9 100644
--- a/src/Simulator/FireSimulator.cpp
+++ b/src/Simulator/FireSimulator.cpp
@@ -252,7 +252,7 @@ int cFireSimulator::GetBurnStepTime(cChunk * a_Chunk, int a_RelX, int a_RelY, in
{
return m_BurnStepTimeFuel;
}
- IsBlockBelowSolid = g_BlockIsSolid[BlockBelow];
+ IsBlockBelowSolid = cBlockInfo::IsSolid(BlockBelow);
}
for (size_t i = 0; i < ARRAYCOUNT(gCrossCoords); i++)
diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp
index 91de9e0cc..0640227b0 100644
--- a/src/Simulator/IncrementalRedstoneSimulator.cpp
+++ b/src/Simulator/IncrementalRedstoneSimulator.cpp
@@ -566,14 +566,14 @@ void cIncrementalRedstoneSimulator::HandleRedstoneWire(int a_BlockX, int a_Block
{
if ((i >= 4) && (i <= 7)) // If we are currently checking for wire surrounding ourself one block above...
{
- if (g_BlockIsSolid[m_World.GetBlock(a_BlockX, a_BlockY + 1, a_BlockZ)]) // If there is something solid above us (wire cut off)...
+ if (cBlockInfo::IsSolid(m_World.GetBlock(a_BlockX, a_BlockY + 1, a_BlockZ))) // If there is something solid above us (wire cut off)...
{
continue; // We don't receive power from that wire
}
}
else if ((i >= 8) && (i <= 11)) // See above, but this is for wire below us
{
- if (g_BlockIsSolid[m_World.GetBlock(a_BlockX + gCrossCoords[i].x, a_BlockY + gCrossCoords[i].y + 1, a_BlockZ + gCrossCoords[i].z)])
+ if (cBlockInfo::IsSolid(m_World.GetBlock(a_BlockX + gCrossCoords[i].x, a_BlockY + gCrossCoords[i].y + 1, a_BlockZ + gCrossCoords[i].z)))
{
continue;
}
diff --git a/src/Simulator/IncrementalRedstoneSimulator.h b/src/Simulator/IncrementalRedstoneSimulator.h
index e6bc28621..8b7363366 100644
--- a/src/Simulator/IncrementalRedstoneSimulator.h
+++ b/src/Simulator/IncrementalRedstoneSimulator.h
@@ -170,7 +170,7 @@ private:
/* ====== Misc Functions ====== */
/** Returns if a block is viable to be the MiddleBlock of a SetLinkedPowered operation */
- inline static bool IsViableMiddleBlock(BLOCKTYPE Block) { return g_BlockFullyOccupiesVoxel[Block]; }
+ inline static bool IsViableMiddleBlock(BLOCKTYPE Block) { return cBlockInfo::FullyOccupiesVoxel(Block); }
/** Returns if a block is a mechanism (something that accepts power and does something) */
inline static bool IsMechanism(BLOCKTYPE Block)
diff --git a/src/Tracer.cpp b/src/Tracer.cpp
index ef136302f..968a64439 100644
--- a/src/Tracer.cpp
+++ b/src/Tracer.cpp
@@ -226,7 +226,7 @@ bool cTracer::Trace( const Vector3f & a_Start, const Vector3f & a_Direction, int
BLOCKTYPE BlockID = m_World->GetBlock(pos.x, pos.y, pos.z);
// Block is counted as a collision if we are not doing a line of sight and it is solid,
// or if the block is not air and not water. That way mobs can still see underwater.
- if ((!a_LineOfSight && g_BlockIsSolid[BlockID]) || (a_LineOfSight && (BlockID != E_BLOCK_AIR) && !IsBlockWater(BlockID)))
+ if ((!a_LineOfSight && cBlockInfo::IsSolid(BlockID)) || (a_LineOfSight && (BlockID != E_BLOCK_AIR) && !IsBlockWater(BlockID)))
{
BlockHitPosition = pos;
int Normal = GetHitNormal(a_Start, End, pos );