1
0

Merge branch 'master' into Inventory2

Conflicts:
	src/BlockInfo.cpp
This commit is contained in:
Howaner 2014-07-26 13:23:11 +02:00
commit ba36e79bc5
108 changed files with 956 additions and 667 deletions

1
.gitignore vendored
View File

@ -15,6 +15,7 @@ cloc.xsl
*.suo *.suo
/EveryNight.cmd /EveryNight.cmd
/UploadLuaAPI.cmd /UploadLuaAPI.cmd
AllFiles.lst
# IDE Stuff # IDE Stuff
## Sublime Text ## Sublime Text

View File

@ -28,7 +28,7 @@ endmacro()
macro(set_flags) macro(set_flags)
# Add coverage processing, if requested: # Add coverage processing, if requested:
if (NOT MSVC) if (NOT MSVC)
if (CMAKE_BUILD_TYPE STREQUAL "COVERAGE") if (CMAKE_BUILD_TYPE STREQUAL "COVERAGE")
message("Including CodeCoverage") message("Including CodeCoverage")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/lib/cmake-coverage/") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/lib/cmake-coverage/")
@ -85,7 +85,7 @@ macro(set_flags)
# We use a signed char (fixes #640 on RasPi) # We use a signed char (fixes #640 on RasPi)
add_flags_cxx("-fsigned-char") add_flags_cxx("-fsigned-char")
endif() endif()
@ -202,7 +202,7 @@ macro(enable_profile)
set(CMAKE_CONFIGURATION_TYPES "Debug;Release;DebugProfile;ReleaseProfile;Coverage" CACHE STRING "" FORCE) set(CMAKE_CONFIGURATION_TYPES "Debug;Release;DebugProfile;ReleaseProfile;Coverage" CACHE STRING "" FORCE)
endif() endif()
endmacro() endmacro()
macro(set_exe_flags) macro(set_exe_flags)
# Remove disabling the maximum warning level: # Remove disabling the maximum warning level:
# clang does not like a command line that reads -Wall -Wextra -w -Wall -Wextra and does not output any warnings # clang does not like a command line that reads -Wall -Wextra -w -Wall -Wextra and does not output any warnings
@ -216,22 +216,22 @@ macro(set_exe_flags)
string(REPLACE "-w" "" CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_COVERAGE}") string(REPLACE "-w" "" CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_COVERAGE}")
string(REPLACE "-w" "" CMAKE_C_FLAGS_COVERAGE "${CMAKE_C_FLAGS_COVERAGE}") string(REPLACE "-w" "" CMAKE_C_FLAGS_COVERAGE "${CMAKE_C_FLAGS_COVERAGE}")
add_flags_cxx("-Wall -Wextra -Wno-unused-parameter -Wno-error=switch") add_flags_cxx("-Wall -Wextra -Wno-unused-parameter -Wno-error=switch")
# we support non-IEEE 754 fpus so can make no guarentees about error # we support non-IEEE 754 fpus so can make no guarentees about error
add_flags_cxx("-ffast-math") add_flags_cxx("-ffast-math")
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
# clang does not provide the __extern_always_inline macro and a part of libm depends on this when using fast-math # clang does not provide the __extern_always_inline macro and a part of libm depends on this when using fast-math
add_flags_cxx("-D__extern_always_inline=inline") add_flags_cxx("-D__extern_always_inline=inline")
add_flags_cxx("-Werror -Weverything -Wno-c++98-compat-pedantic -Wno-string-conversion") add_flags_cxx("-Werror -Weverything -Wno-c++98-compat-pedantic -Wno-string-conversion")
add_flags_cxx("-Wno-extra-semi -Wno-error=switch-enum -Wno-documentation") add_flags_cxx("-Wno-error=switch-enum -Wno-documentation -Wno-exit-time-destructors")
add_flags_cxx("-Wno-error=sign-conversion -Wno-error=conversion -Wno-padded") add_flags_cxx("-Wno-error=sign-conversion -Wno-error=conversion -Wno-padded")
add_flags_cxx("-Wno-error=deprecated -Wno-error=weak-vtables -Wno-error=float-equal") add_flags_cxx("-Wno-error=deprecated -Wno-error=weak-vtables -Wno-error=float-equal")
add_flags_cxx("-Wno-error=missing-prototypes -Wno-error=non-virtual-dtor") add_flags_cxx("-Wno-error=missing-prototypes -Wno-error=non-virtual-dtor")
add_flags_cxx("-Wno-error=covered-switch-default -Wno-error=shadow") add_flags_cxx("-Wno-error=covered-switch-default -Wno-error=shadow -Wno-error=old-style-cast")
add_flags_cxx("-Wno-error=exit-time-destructors -Wno-error=missing-variable-declarations") add_flags_cxx("-Wno-error=exit-time-destructors -Wno-error=missing-variable-declarations")
add_flags_cxx("-Wno-error=global-constructors -Wno-implicit-fallthrough") add_flags_cxx("-Wno-error=global-constructors -Wno-implicit-fallthrough")
add_flags_cxx("-Wno-weak-vtables -Wno-switch-enum -Wno-exit-time-destructors") add_flags_cxx("-Wno-error=extra-semi -Wno-weak-vtables -Wno-switch-enum")
endif() endif()
endif() endif()

View File

@ -240,7 +240,7 @@ template <typename Type> class cItemCallback
public: public:
/// Called for each item in the internal list; return true to stop the loop, or false to continue enumerating /// Called for each item in the internal list; return true to stop the loop, or false to continue enumerating
virtual bool Item(Type * a_Type) = 0; virtual bool Item(Type * a_Type) = 0;
virtual ~cItemCallback() {}; virtual ~cItemCallback() {}
} ; } ;

View File

@ -39,7 +39,7 @@ set (BINDING_OUTPUTS
${CMAKE_CURRENT_SOURCE_DIR}/LuaState_Call.inc ${CMAKE_CURRENT_SOURCE_DIR}/LuaState_Call.inc
) )
set(BINDING_DEPENDECIES set(BINDING_DEPENDENCIES
tolua tolua
../Bindings/virtual_method_hooks.lua ../Bindings/virtual_method_hooks.lua
../Bindings/AllToLua.pkg ../Bindings/AllToLua.pkg
@ -122,7 +122,7 @@ if (NOT MSVC)
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
# add any new generation dependencies here # add any new generation dependencies here
DEPENDS ${BINDING_DEPENDECIES} DEPENDS ${BINDING_DEPENDENCIES}
) )
endif () endif ()
set_source_files_properties(Bindings/Bindings.cpp PROPERTIES GENERATED TRUE) set_source_files_properties(Bindings/Bindings.cpp PROPERTIES GENERATED TRUE)

View File

@ -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 */ /* get function: g_BlockIsSolid */
#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockIsSolid #ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockIsSolid
static int tolua_get_AllToLua_g_BlockIsSolid(lua_State* tolua_S) 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_BlockOneHitDig", tolua_get_AllToLua_g_BlockOneHitDig, NULL);
tolua_array(tolua_S, "g_BlockPistonBreakable", tolua_get_AllToLua_g_BlockPistonBreakable, 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_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_BlockIsSolid", tolua_get_AllToLua_g_BlockIsSolid, NULL);
tolua_array(tolua_S, "g_BlockFullyOccupiesVoxel", tolua_get_AllToLua_g_BlockFullyOccupiesVoxel, NULL); tolua_array(tolua_S, "g_BlockFullyOccupiesVoxel", tolua_get_AllToLua_g_BlockFullyOccupiesVoxel, NULL);

View File

@ -115,10 +115,10 @@ public:
virtual bool HandleConsoleCommand(const AStringVector & a_Split, cCommandOutputCallback & a_Output) = 0; virtual bool HandleConsoleCommand(const AStringVector & a_Split, cCommandOutputCallback & a_Output) = 0;
/// All bound commands are to be removed, do any language-dependent cleanup here /// All bound commands are to be removed, do any language-dependent cleanup here
virtual void ClearCommands(void) {} ; virtual void ClearCommands(void) {}
/// All bound console commands are to be removed, do any language-dependent cleanup here /// All bound console commands are to be removed, do any language-dependent cleanup here
virtual void ClearConsoleCommands(void) {} ; virtual void ClearConsoleCommands(void) {}
// tolua_begin // tolua_begin
const AString & GetName(void) const { return m_Name; } const AString & GetName(void) const { return m_Name; }

View File

@ -38,9 +38,9 @@ protected:
public: public:
// tolua_end // tolua_end
virtual ~cBlockEntity() {}; // force a virtual destructor in all descendants virtual ~cBlockEntity() {} // force a virtual destructor in all descendants
virtual void Destroy(void) {}; virtual void Destroy(void) {}
void SetWorld(cWorld * a_World) void SetWorld(cWorld * a_World)
{ {

View File

@ -58,7 +58,7 @@ public:
static const char * GetClassStatic(void) { return "cJukeboxEntity"; } static const char * GetClassStatic(void) { return "cJukeboxEntity"; }
virtual void UsedBy(cPlayer * a_Player) override; virtual void UsedBy(cPlayer * a_Player) override;
virtual void SendTo(cClientHandle &) override { }; virtual void SendTo(cClientHandle &) override {}
private: private:
int m_Record; int m_Record;

View File

@ -52,7 +52,7 @@ public:
// tolua_end // tolua_end
virtual void UsedBy(cPlayer * a_Player) override; virtual void UsedBy(cPlayer * a_Player) override;
virtual void SendTo(cClientHandle &) override { }; virtual void SendTo(cClientHandle &) override {}
static const char * GetClassStatic(void) { return "cNoteEntity"; } static const char * GetClassStatic(void) { return "cNoteEntity"; }

View File

@ -15,7 +15,6 @@ cBlockInfo::cBlockInfo()
, m_OneHitDig(false) , m_OneHitDig(false)
, m_PistonBreakable(false) , m_PistonBreakable(false)
, m_IsSnowable(false) , m_IsSnowable(false)
, m_RequiresSpecialTool(false)
, m_IsSolid(true) , m_IsSolid(true)
, m_FullyOccupiesVoxel(false) , m_FullyOccupiesVoxel(false)
, m_Handler(NULL) , m_Handler(NULL)
@ -440,52 +439,6 @@ void cBlockInfo::Initialize(cBlockInfoArray & a_Info)
a_Info[E_BLOCK_TNT ].m_IsSnowable = true; a_Info[E_BLOCK_TNT ].m_IsSnowable = true;
a_Info[E_BLOCK_WOOL ].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_VINES ].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: // Nonsolid blocks:
a_Info[E_BLOCK_ACTIVATOR_RAIL ].m_IsSolid = false; a_Info[E_BLOCK_ACTIVATOR_RAIL ].m_IsSolid = false;
a_Info[E_BLOCK_AIR ].m_IsSolid = false; a_Info[E_BLOCK_AIR ].m_IsSolid = false;

View File

@ -39,9 +39,6 @@ public:
/** Can this block hold snow atop? */ /** Can this block hold snow atop? */
bool m_IsSnowable; bool m_IsSnowable;
/** Does this block require a tool to drop? */
bool m_RequiresSpecialTool;
/** Is this block solid (player cannot walk through)? */ /** Is this block solid (player cannot walk through)? */
bool m_IsSolid; bool m_IsSolid;
@ -61,7 +58,6 @@ public:
inline static bool IsOneHitDig (BLOCKTYPE a_Type) { return Get(a_Type).m_OneHitDig; } 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 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 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 IsSolid (BLOCKTYPE a_Type) { return Get(a_Type).m_IsSolid; }
inline static bool FullyOccupiesVoxel (BLOCKTYPE a_Type) { return Get(a_Type).m_FullyOccupiesVoxel; } inline static bool FullyOccupiesVoxel (BLOCKTYPE a_Type) { return Get(a_Type).m_FullyOccupiesVoxel; }

View File

@ -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_CanDrop, bool a_DropVerbatim) override
{ {
NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
if (Meta & 0x8) 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_CanDrop, a_DropVerbatim);
} }
else 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_CanDrop, a_DropVerbatim);
} }
} }

View File

@ -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) 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. // Setting the meta to a_BlockMeta keeps most textures. The few other blocks have to override this.
@ -451,11 +418,23 @@ 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_CanDrop, bool a_DropVerbatim)
{ {
cItems Pickups; cItems Pickups;
NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
ConvertToPickups(Pickups, Meta);
if (a_CanDrop)
{
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: // Allow plugins to modify the pickups:
a_BlockPluginInterface.CallHookBlockToPickups(a_Digger, a_BlockX, a_BlockY, a_BlockZ, m_BlockType, Meta, Pickups); a_BlockPluginInterface.CallHookBlockToPickups(a_Digger, a_BlockX, a_BlockY, a_BlockZ, m_BlockType, Meta, Pickups);

View File

@ -60,25 +60,29 @@ public:
virtual void OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ); 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) /// 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 /// 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); static void NeighborChanged(cChunkInterface & a_ChunkInterface, int a_BlockX, int a_BlockY, int a_BlockZ);
/// Called while the player diggs the block. /// 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 /// 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 */ /** 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); 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> /// <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); 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 /** 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
virtual void DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ); @param a_Digger The entity causing the drop; it may be NULL
@param a_CanDrop Informs the handler whether the block should be dropped at all. One example when this is false is when stone is destroyed by hand
@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_CanDrop = true, bool a_DropVerbatim = false);
/// Returns step sound name of block /// Returns step sound name of block
virtual const char * GetStepSound(void); virtual const char * GetStepSound(void);

View File

@ -40,14 +40,20 @@ public:
{ {
cFastRandom rand; cFastRandom rand;
// Only the first 2 bits contain the display information, the others are for growing // Old leaves - 3 bits contain display; new leaves - 1st bit, shifted left two for saplings to understand
if (rand.NextInt(6) == 0) 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))
)
);
} }
// 1 % chance of dropping an apple, if the leaves' type is Apple Leaves // 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) if (rand.NextInt(101) == 0)
{ {

View File

@ -20,8 +20,8 @@ public:
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
{ {
// Only the first 2 bits contain the display information, the others are for growing // Only the first 2 bits contain the display information and the 4th bit is for the growth indicator, but, we use 0x07 for forward compatibility
a_Pickups.push_back(cItem(E_BLOCK_SAPLING, 1, a_BlockMeta & 0x7)); a_Pickups.push_back(cItem(E_BLOCK_SAPLING, 1, a_BlockMeta & 0x07));
} }

View File

@ -56,6 +56,7 @@ SET (SRCS
Root.cpp Root.cpp
Scoreboard.cpp Scoreboard.cpp
Server.cpp Server.cpp
SetChunkData.cpp
Statistics.cpp Statistics.cpp
StringCompression.cpp StringCompression.cpp
StringUtils.cpp StringUtils.cpp
@ -124,6 +125,7 @@ SET (HDRS
Root.h Root.h
Scoreboard.h Scoreboard.h
Server.h Server.h
SetChunkData.h
StackWalker.h StackWalker.h
Statistics.h Statistics.h
StringCompression.h StringCompression.h
@ -265,7 +267,7 @@ if (MSVC)
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Bindings/ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Bindings/
# add any new generation dependencies here # add any new generation dependencies here
DEPENDS ${BINDING_DEPENDECIES} DEPENDS ${BINDING_DEPENDENCIES}
) )
endif() endif()

View File

@ -34,6 +34,7 @@
#include "MobCensus.h" #include "MobCensus.h"
#include "MobSpawner.h" #include "MobSpawner.h"
#include "BlockInServerPluginInterface.h" #include "BlockInServerPluginInterface.h"
#include "SetChunkData.h"
#include "json/json.h" #include "json/json.h"
@ -265,41 +266,34 @@ void cChunk::GetAllData(cChunkDataCallback & a_Callback)
void cChunk::SetAllData( void cChunk::SetAllData(cSetChunkData & a_SetChunkData)
const BLOCKTYPE * a_BlockTypes,
const NIBBLETYPE * a_BlockMeta,
const NIBBLETYPE * a_BlockLight,
const NIBBLETYPE * a_BlockSkyLight,
const HeightMap * a_HeightMap,
const BiomeMap & a_BiomeMap,
cBlockEntityList & a_BlockEntities
)
{ {
memcpy(m_BiomeMap, a_BiomeMap, sizeof(m_BiomeMap)); ASSERT(a_SetChunkData.IsHeightMapValid());
ASSERT(a_SetChunkData.AreBiomesValid());
if (a_HeightMap != NULL)
{
memcpy(m_HeightMap, a_HeightMap, sizeof(m_HeightMap));
}
if (a_HeightMap == NULL)
{
CalculateHeightmap(a_BlockTypes);
}
m_ChunkData.SetBlockTypes(a_BlockTypes);
m_ChunkData.SetMetas(a_BlockMeta);
m_ChunkData.SetBlockLight(a_BlockLight);
m_ChunkData.SetSkyLight(a_BlockSkyLight);
m_IsLightValid = (a_BlockLight != NULL) && (a_BlockSkyLight != NULL); memcpy(m_BiomeMap, a_SetChunkData.GetBiomes(), sizeof(m_BiomeMap));
memcpy(m_HeightMap, a_SetChunkData.GetHeightMap(), sizeof(m_HeightMap));
m_ChunkData.SetBlockTypes(a_SetChunkData.GetBlockTypes());
m_ChunkData.SetMetas(a_SetChunkData.GetBlockMetas());
if (a_SetChunkData.IsLightValid())
{
m_ChunkData.SetBlockLight(a_SetChunkData.GetBlockLight());
m_ChunkData.SetSkyLight(a_SetChunkData.GetSkyLight());
m_IsLightValid = true;
}
else
{
m_IsLightValid = false;
}
// Clear the block entities present - either the loader / saver has better, or we'll create empty ones: // Clear the block entities present - either the loader / saver has better, or we'll create empty ones:
for (cBlockEntityList::iterator itr = m_BlockEntities.begin(); itr != m_BlockEntities.end(); ++itr) for (cBlockEntityList::iterator itr = m_BlockEntities.begin(); itr != m_BlockEntities.end(); ++itr)
{ {
delete *itr; delete *itr;
} }
std::swap(a_BlockEntities, m_BlockEntities); m_BlockEntities.clear();
std::swap(a_SetChunkData.GetBlockEntities(), m_BlockEntities);
// Set all block entities' World variable: // Set all block entities' World variable:
for (cBlockEntityList::iterator itr = m_BlockEntities.begin(); itr != m_BlockEntities.end(); ++itr) for (cBlockEntityList::iterator itr = m_BlockEntities.begin(); itr != m_BlockEntities.end(); ++itr)

View File

@ -95,16 +95,10 @@ public:
/** Gets all chunk data, calls the a_Callback's methods for each data type */ /** Gets all chunk data, calls the a_Callback's methods for each data type */
void GetAllData(cChunkDataCallback & a_Callback); void GetAllData(cChunkDataCallback & a_Callback);
/** Sets all chunk data */ /** Sets all chunk data as either loaded from the storage or generated.
void SetAllData( BlockLight and BlockSkyLight are optional, if not present, chunk will be marked as unlighted.
const BLOCKTYPE * a_BlockTypes, Modifies the BlockEntity list in a_SetChunkData - moves the block entities into the chunk. */
const NIBBLETYPE * a_BlockMeta, void SetAllData(cSetChunkData & a_SetChunkData);
const NIBBLETYPE * a_BlockLight,
const NIBBLETYPE * a_BlockSkyLight,
const cChunkDef::HeightMap * a_HeightMap,
const cChunkDef::BiomeMap & a_BiomeMap,
cBlockEntityList & a_BlockEntities
);
void SetLight( void SetLight(
const cChunkDef::BlockNibbles & a_BlockLight, const cChunkDef::BlockNibbles & a_BlockLight,
@ -386,9 +380,9 @@ public:
cRedstoneSimulatorChunkData * GetRedstoneSimulatorData(void) { return &m_RedstoneSimulatorData; } cRedstoneSimulatorChunkData * GetRedstoneSimulatorData(void) { return &m_RedstoneSimulatorData; }
cRedstoneSimulatorChunkData * GetRedstoneSimulatorQueuedData(void) { return &m_RedstoneSimulatorQueuedData; } cRedstoneSimulatorChunkData * GetRedstoneSimulatorQueuedData(void) { return &m_RedstoneSimulatorQueuedData; }
cIncrementalRedstoneSimulator::PoweredBlocksList * GetRedstoneSimulatorPoweredBlocksList(void) { return &m_RedstoneSimulatorPoweredBlocksList; } cIncrementalRedstoneSimulator::PoweredBlocksList * GetRedstoneSimulatorPoweredBlocksList(void) { return &m_RedstoneSimulatorPoweredBlocksList; }
cIncrementalRedstoneSimulator::LinkedBlocksList * GetRedstoneSimulatorLinkedBlocksList(void) { return &m_RedstoneSimulatorLinkedBlocksList; }; cIncrementalRedstoneSimulator::LinkedBlocksList * GetRedstoneSimulatorLinkedBlocksList(void) { return &m_RedstoneSimulatorLinkedBlocksList; }
cIncrementalRedstoneSimulator::SimulatedPlayerToggleableList * GetRedstoneSimulatorSimulatedPlayerToggleableList(void) { return &m_RedstoneSimulatorSimulatedPlayerToggleableList; }; cIncrementalRedstoneSimulator::SimulatedPlayerToggleableList * GetRedstoneSimulatorSimulatedPlayerToggleableList(void) { return &m_RedstoneSimulatorSimulatedPlayerToggleableList; }
cIncrementalRedstoneSimulator::RepeatersDelayList * GetRedstoneSimulatorRepeatersDelayList(void) { return &m_RedstoneSimulatorRepeatersDelayList; }; cIncrementalRedstoneSimulator::RepeatersDelayList * GetRedstoneSimulatorRepeatersDelayList(void) { return &m_RedstoneSimulatorRepeatersDelayList; }
bool IsRedstoneDirty(void) const { return m_IsRedstoneDirty; } bool IsRedstoneDirty(void) const { return m_IsRedstoneDirty; }
void SetIsRedstoneDirty(bool a_Flag) { m_IsRedstoneDirty = a_Flag; } void SetIsRedstoneDirty(bool a_Flag) { m_IsRedstoneDirty = a_Flag; }

View File

@ -29,25 +29,25 @@ public:
(only in processes where multiple chunks can be processed, such as cWorld::ForEachChunkInRect()). (only in processes where multiple chunks can be processed, such as cWorld::ForEachChunkInRect()).
If false is returned, the chunk is skipped. If false is returned, the chunk is skipped.
*/ */
virtual bool Coords(int a_ChunkX, int a_ChunkZ) { UNUSED(a_ChunkX); UNUSED(a_ChunkZ); return true; }; virtual bool Coords(int a_ChunkX, int a_ChunkZ) { UNUSED(a_ChunkX); UNUSED(a_ChunkZ); return true; }
/// Called once to provide heightmap data /// Called once to provide heightmap data
virtual void HeightMap(const cChunkDef::HeightMap * a_HeightMap) {UNUSED(a_HeightMap); }; virtual void HeightMap(const cChunkDef::HeightMap * a_HeightMap) { UNUSED(a_HeightMap); }
/// Called once to provide biome data /// Called once to provide biome data
virtual void BiomeData(const cChunkDef::BiomeMap * a_BiomeMap) {UNUSED(a_BiomeMap); }; virtual void BiomeData(const cChunkDef::BiomeMap * a_BiomeMap) { UNUSED(a_BiomeMap); }
/// Called once to let know if the chunk lighting is valid. Return value is ignored /// Called once to let know if the chunk lighting is valid. Return value is ignored
virtual void LightIsValid(bool a_IsLightValid) {UNUSED(a_IsLightValid); }; virtual void LightIsValid(bool a_IsLightValid) { UNUSED(a_IsLightValid); }
/// Called once to export block info /// Called once to export block info
virtual void ChunkData(const cChunkData & a_Buffer) {UNUSED(a_Buffer); }; virtual void ChunkData(const cChunkData & a_Buffer) { UNUSED(a_Buffer); }
/// Called for each entity in the chunk /// Called for each entity in the chunk
virtual void Entity(cEntity * a_Entity) {UNUSED(a_Entity); }; virtual void Entity(cEntity * a_Entity) { UNUSED(a_Entity); }
/// Called for each blockentity in the chunk /// Called for each blockentity in the chunk
virtual void BlockEntity(cBlockEntity * a_Entity) {UNUSED(a_Entity); }; virtual void BlockEntity(cBlockEntity * a_Entity) { UNUSED(a_Entity); }
} ; } ;

View File

@ -16,6 +16,7 @@
#include "MobCensus.h" #include "MobCensus.h"
#include "MobSpawner.h" #include "MobSpawner.h"
#include "BoundingBox.h" #include "BoundingBox.h"
#include "SetChunkData.h"
#include "Entities/Pickup.h" #include "Entities/Pickup.h"
@ -912,28 +913,20 @@ void cChunkMap::MarkChunkSaved (int a_ChunkX, int a_ChunkZ)
void cChunkMap::SetChunkData( void cChunkMap::SetChunkData(cSetChunkData & a_SetChunkData)
int a_ChunkX, int a_ChunkZ,
const BLOCKTYPE * a_BlockTypes,
const NIBBLETYPE * a_BlockMeta,
const NIBBLETYPE * a_BlockLight,
const NIBBLETYPE * a_BlockSkyLight,
const cChunkDef::HeightMap * a_HeightMap,
const cChunkDef::BiomeMap & a_BiomeMap,
cBlockEntityList & a_BlockEntities,
bool a_MarkDirty
)
{ {
int ChunkX = a_SetChunkData.GetChunkX();
int ChunkZ = a_SetChunkData.GetChunkZ();
{ {
cCSLock Lock(m_CSLayers); cCSLock Lock(m_CSLayers);
cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ);
if (Chunk == NULL) if (Chunk == NULL)
{ {
return; return;
} }
Chunk->SetAllData(a_BlockTypes, a_BlockMeta, a_BlockLight, a_BlockSkyLight, a_HeightMap, a_BiomeMap, a_BlockEntities); Chunk->SetAllData(a_SetChunkData);
if (a_MarkDirty) if (a_SetChunkData.ShouldMarkDirty())
{ {
Chunk->MarkDirty(); Chunk->MarkDirty();
} }
@ -942,7 +935,7 @@ void cChunkMap::SetChunkData(
cChunkStays ToBeDisabled; cChunkStays ToBeDisabled;
for (cChunkStays::iterator itr = m_ChunkStays.begin(), end = m_ChunkStays.end(); itr != end; ++itr) for (cChunkStays::iterator itr = m_ChunkStays.begin(), end = m_ChunkStays.end(); itr != end; ++itr)
{ {
if ((*itr)->ChunkAvailable(a_ChunkX, a_ChunkZ)) if ((*itr)->ChunkAvailable(ChunkX, ChunkZ))
{ {
// The chunkstay wants to be disabled, add it to a list of to-be-disabled chunkstays for later processing: // The chunkstay wants to be disabled, add it to a list of to-be-disabled chunkstays for later processing:
ToBeDisabled.push_back(*itr); ToBeDisabled.push_back(*itr);
@ -957,7 +950,7 @@ void cChunkMap::SetChunkData(
} }
// Notify plugins of the chunk becoming available // Notify plugins of the chunk becoming available
cPluginManager::Get()->CallHookChunkAvailable(m_World, a_ChunkX, a_ChunkZ); cPluginManager::Get()->CallHookChunkAvailable(m_World, ChunkX, ChunkZ);
} }

View File

@ -34,6 +34,7 @@ class cChunkDataSerializer;
class cBlockArea; class cBlockArea;
class cMobCensus; class cMobCensus;
class cMobSpawner; class cMobSpawner;
class cSetChunkData;
typedef std::list<cClientHandle *> cClientHandleList; typedef std::list<cClientHandle *> cClientHandleList;
typedef cChunk * cChunkPtr; typedef cChunk * cChunkPtr;
@ -112,22 +113,11 @@ public:
void MarkChunkSaved (int a_ChunkX, int a_ChunkZ); void MarkChunkSaved (int a_ChunkX, int a_ChunkZ);
/** Sets the chunk data as either loaded from the storage or generated. /** Sets the chunk data as either loaded from the storage or generated.
a_BlockLight and a_BlockSkyLight are optional, if not present, chunk will be marked as unlighted. BlockLight and BlockSkyLight are optional, if not present, chunk will be marked as unlighted.
a_BiomeMap is optional, if not present, biomes will be calculated by the generator If MarkDirty is set, the chunk is set as dirty (used after generating)
a_HeightMap is optional, if not present, will be calculated. Modifies the BlockEntity list in a_SetChunkData - moves the block entities into the chunk.
If a_MarkDirty is set, the chunk is set as dirty (used after generating)
*/ */
void SetChunkData( void SetChunkData(cSetChunkData & a_SetChunkData);
int a_ChunkX, int a_ChunkZ,
const BLOCKTYPE * a_BlockTypes,
const NIBBLETYPE * a_BlockMeta,
const NIBBLETYPE * a_BlockLight,
const NIBBLETYPE * a_BlockSkyLight,
const cChunkDef::HeightMap * a_HeightMap,
const cChunkDef::BiomeMap & a_BiomeMap,
cBlockEntityList & a_BlockEntities,
bool a_MarkDirty
);
void ChunkLighted( void ChunkLighted(
int a_ChunkX, int a_ChunkZ, int a_ChunkX, int a_ChunkZ,

View File

@ -56,8 +56,8 @@ public:
#else #else
static const int DEFAULT_VIEW_DISTANCE = 10; static const int DEFAULT_VIEW_DISTANCE = 10;
#endif #endif
static const int MAX_VIEW_DISTANCE = 15; static const int MAX_VIEW_DISTANCE = 32;
static const int MIN_VIEW_DISTANCE = 3; static const int MIN_VIEW_DISTANCE = 1;
cClientHandle(const cSocket * a_Socket, int a_ViewDistance); cClientHandle(const cSocket * a_Socket, int a_ViewDistance);
virtual ~cClientHandle(); virtual ~cClientHandle();
@ -151,7 +151,7 @@ public:
void SendMapInfo (int a_ID, unsigned int a_Scale); void SendMapInfo (int a_ID, unsigned int a_Scale);
void SendPaintingSpawn (const cPainting & a_Painting); void SendPaintingSpawn (const cPainting & a_Painting);
void SendPickupSpawn (const cPickup & a_Pickup); void SendPickupSpawn (const cPickup & a_Pickup);
void SendEntityAnimation (const cEntity & a_Entity, char a_Animation); void SendEntityAnimation (const cEntity & a_Entity, char a_Animation); // tolua_export
void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount); void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount);
void SendPlayerAbilities (void); void SendPlayerAbilities (void);
void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline); void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline);

View File

@ -14,16 +14,16 @@ Descendants override that function to provide specific processing of the output.
class cCommandOutputCallback class cCommandOutputCallback
{ {
public: public:
virtual ~cCommandOutputCallback() {}; // Force a virtual destructor in subclasses virtual ~cCommandOutputCallback() {} // Force a virtual destructor in subclasses
/// Syntax sugar function, calls Out() with Printf()-ed parameters; appends a "\n" /// Syntax sugar function, calls Out() with Printf()-ed parameters; appends a newline"
void Out(const char * a_Fmt, ...) FORMATSTRING(2, 3); void Out(const char * a_Fmt, ...) FORMATSTRING(2, 3);
/// Called when the command wants to output anything; may be called multiple times /// Called when the command wants to output anything; may be called multiple times
virtual void Out(const AString & a_Text) = 0; virtual void Out(const AString & a_Text) = 0;
/// Called when the command processing has been finished /// Called when the command processing has been finished
virtual void Finished(void) {}; virtual void Finished(void) {}
} ; } ;

View File

@ -470,7 +470,7 @@ inline void AddFaceDirection(int & a_BlockX, unsigned char & a_BlockY, int & a_B
{ {
int Y = a_BlockY; int Y = a_BlockY;
AddFaceDirection(a_BlockX, Y, a_BlockZ, a_BlockFace, a_bInverse); AddFaceDirection(a_BlockX, Y, a_BlockZ, a_BlockFace, a_bInverse);
a_BlockY = Clamp<unsigned char>(Y, 0, 255); a_BlockY = Clamp<unsigned char>((unsigned char)Y, 0, 255);
} }
@ -715,14 +715,5 @@ namespace ItemCategory
// tolua_end // tolua_end
inline bool BlockRequiresSpecialTool(BLOCKTYPE a_BlockType)
{
if (!IsValidBlock(a_BlockType)) return false;
return cBlockInfo::RequiresSpecialTool(a_BlockType);
}

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#undef ntohll
#define ntohll(x) ((((UInt64)ntohl((u_long)x)) << 32) + ntohl(x >> 32)) #define ntohll(x) ((((UInt64)ntohl((u_long)x)) << 32) + ntohl(x >> 32))

View File

@ -28,7 +28,7 @@ public:
// tolua_end // tolua_end
CLASS_PROTODEF(cArrowEntity); CLASS_PROTODEF(cArrowEntity)
/// Creates a new arrow with psNoPickup state and default damage modifier coeff /// Creates a new arrow with psNoPickup state and default damage modifier coeff
cArrowEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed); cArrowEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed);

View File

@ -21,7 +21,7 @@ class cBoat :
typedef cEntity super; typedef cEntity super;
public: public:
CLASS_PROTODEF(cBoat); CLASS_PROTODEF(cBoat)
// cEntity overrides: // cEntity overrides:
virtual void SpawnOn(cClientHandle & a_ClientHandle) override; virtual void SpawnOn(cClientHandle & a_ClientHandle) override;

View File

@ -15,7 +15,7 @@ class cEnderCrystal :
typedef cEntity super; typedef cEntity super;
public: public:
CLASS_PROTODEF(cEnderCrystal); CLASS_PROTODEF(cEnderCrystal)
cEnderCrystal(double a_X, double a_Y, double a_Z); cEnderCrystal(double a_X, double a_Y, double a_Z);

View File

@ -428,7 +428,7 @@ public:
// tolua_end // tolua_end
/// Called when the specified player right-clicks this entity /// Called when the specified player right-clicks this entity
virtual void OnRightClicked(cPlayer &) {}; virtual void OnRightClicked(cPlayer &) {}
/// Returns the list of drops for this pawn when it is killed. May check a_Killer for special handling (sword of looting etc.). Called from KilledBy(). /// Returns the list of drops for this pawn when it is killed. May check a_Killer for special handling (sword of looting etc.). Called from KilledBy().
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL)

View File

@ -55,7 +55,7 @@ public:
@param a_OtherEffect The other effect to copy */ @param a_OtherEffect The other effect to copy */
cEntityEffect & operator=(cEntityEffect a_OtherEffect); cEntityEffect & operator=(cEntityEffect a_OtherEffect);
virtual ~cEntityEffect(void) {}; virtual ~cEntityEffect(void) {}
/** Creates a pointer to the proper entity effect from the effect type /** Creates a pointer to the proper entity effect from the effect type
@warning This function creates raw pointers that must be manually managed. @warning This function creates raw pointers that must be manually managed.

View File

@ -21,7 +21,7 @@ public:
// tolua_end // tolua_end
CLASS_PROTODEF(cExpBottleEntity); CLASS_PROTODEF(cExpBottleEntity)
cExpBottleEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed); cExpBottleEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed);

View File

@ -16,7 +16,7 @@ class cExpOrb :
public: public:
// tolua_end // tolua_end
CLASS_PROTODEF(cExpOrb); CLASS_PROTODEF(cExpOrb)
cExpOrb(double a_X, double a_Y, double a_Z, int a_Reward); cExpOrb(double a_X, double a_Y, double a_Z, int a_Reward);
cExpOrb(const Vector3d & a_Pos, int a_Reward); cExpOrb(const Vector3d & a_Pos, int a_Reward);

View File

@ -20,7 +20,7 @@ class cFallingBlock :
typedef cEntity super; typedef cEntity super;
public: public:
CLASS_PROTODEF(cFallingBlock); CLASS_PROTODEF(cFallingBlock)
/// Creates a new falling block. a_BlockPosition is expected in world coords /// Creates a new falling block. a_BlockPosition is expected in world coords
cFallingBlock(const Vector3i & a_BlockPosition, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta); cFallingBlock(const Vector3i & a_BlockPosition, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);

View File

@ -21,7 +21,7 @@ public:
// tolua_end // tolua_end
CLASS_PROTODEF(cFireChargeEntity); CLASS_PROTODEF(cFireChargeEntity)
cFireChargeEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed); cFireChargeEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed);

View File

@ -21,7 +21,7 @@ public:
// tolua_end // tolua_end
CLASS_PROTODEF(cFireworkEntity); CLASS_PROTODEF(cFireworkEntity)
cFireworkEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const cItem & a_Item); cFireworkEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const cItem & a_Item);
const cItem & GetItem(void) const { return m_FireworkItem; } const cItem & GetItem(void) const { return m_FireworkItem; }

View File

@ -16,7 +16,7 @@ class cFloater :
public: public:
// tolua_end // tolua_end
CLASS_PROTODEF(cFloater); CLASS_PROTODEF(cFloater)
cFloater(double a_X, double a_Y, double a_Z, Vector3d a_Speed, int a_PlayerID, int a_CountDownTime); cFloater(double a_X, double a_Y, double a_Z, Vector3d a_Speed, int a_PlayerID, int a_CountDownTime);

View File

@ -21,7 +21,7 @@ public:
// tolua_end // tolua_end
CLASS_PROTODEF(cGhastFireballEntity); CLASS_PROTODEF(cGhastFireballEntity)
cGhastFireballEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed); cGhastFireballEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed);

View File

@ -16,7 +16,7 @@ class cHangingEntity :
public: public:
CLASS_PROTODEF(cHangingEntity); CLASS_PROTODEF(cHangingEntity)
cHangingEntity(eEntityType a_EntityType, eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z); cHangingEntity(eEntityType a_EntityType, eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z);
@ -38,7 +38,7 @@ public:
private: private:
virtual void SpawnOn(cClientHandle & a_ClientHandle) override; virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
virtual void Tick(float a_Dt, cChunk & a_Chunk) override {}; virtual void Tick(float a_Dt, cChunk & a_Chunk) override {}
eBlockFace m_BlockFace; eBlockFace m_BlockFace;

View File

@ -16,7 +16,7 @@ class cItemFrame :
public: public:
CLASS_PROTODEF(cItemFrame); CLASS_PROTODEF(cItemFrame)
cItemFrame(eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z); cItemFrame(eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z);
@ -24,7 +24,7 @@ public:
const cItem & GetItem(void) { return m_Item; } // tolua_export const cItem & GetItem(void) { return m_Item; } // tolua_export
/** Set the item in the frame */ /** Set the item in the frame */
void SetItem(cItem & a_Item) { m_Item = a_Item; }; // tolua_export void SetItem(cItem & a_Item) { m_Item = a_Item; } // tolua_export
/** Returns the rotation from the item in the frame */ /** Returns the rotation from the item in the frame */
Byte GetRotation(void) const { return m_Rotation; } // tolua_export Byte GetRotation(void) const { return m_Rotation; } // tolua_export

View File

@ -21,7 +21,7 @@ class cMinecart :
typedef cEntity super; typedef cEntity super;
public: public:
CLASS_PROTODEF(cMinecart); CLASS_PROTODEF(cMinecart)
/** Minecart payload, values correspond to packet subtype */ /** Minecart payload, values correspond to packet subtype */
enum ePayload enum ePayload
@ -89,7 +89,7 @@ class cRideableMinecart :
typedef cMinecart super; typedef cMinecart super;
public: public:
CLASS_PROTODEF(cRideableMinecart); CLASS_PROTODEF(cRideableMinecart)
cRideableMinecart(double a_X, double a_Y, double a_Z, const cItem & a_Content, int a_Height); cRideableMinecart(double a_X, double a_Y, double a_Z, const cItem & a_Content, int a_Height);
@ -113,7 +113,7 @@ class cMinecartWithChest :
typedef cMinecart super; typedef cMinecart super;
public: public:
CLASS_PROTODEF(cMinecartWithChest); CLASS_PROTODEF(cMinecartWithChest)
/// Number of item slots in the chest /// Number of item slots in the chest
static const int NumSlots = 9 * 3; static const int NumSlots = 9 * 3;
@ -144,7 +144,7 @@ class cMinecartWithFurnace :
typedef cMinecart super; typedef cMinecart super;
public: public:
CLASS_PROTODEF(cMinecartWithFurnace); CLASS_PROTODEF(cMinecartWithFurnace)
cMinecartWithFurnace(double a_X, double a_Y, double a_Z); cMinecartWithFurnace(double a_X, double a_Y, double a_Z);
@ -176,7 +176,7 @@ class cMinecartWithTNT :
typedef cMinecart super; typedef cMinecart super;
public: public:
CLASS_PROTODEF(cMinecartWithTNT); CLASS_PROTODEF(cMinecartWithTNT)
cMinecartWithTNT(double a_X, double a_Y, double a_Z); cMinecartWithTNT(double a_X, double a_Y, double a_Z);
} ; } ;
@ -191,7 +191,7 @@ class cMinecartWithHopper :
typedef cMinecart super; typedef cMinecart super;
public: public:
CLASS_PROTODEF(cMinecartWithHopper); CLASS_PROTODEF(cMinecartWithHopper)
cMinecartWithHopper(double a_X, double a_Y, double a_Z); cMinecartWithHopper(double a_X, double a_Y, double a_Z);
} ; } ;

View File

@ -15,7 +15,7 @@ class cPainting :
typedef cEntity super; typedef cEntity super;
public: public:
CLASS_PROTODEF(cPainting); CLASS_PROTODEF(cPainting)
cPainting(const AString & a_Name, int a_Direction, double a_X, double a_Y, double a_Z); cPainting(const AString & a_Name, int a_Direction, double a_X, double a_Y, double a_Z);
const AString & GetName(void) const { return m_Name; } // tolua_export const AString & GetName(void) const { return m_Name; } // tolua_export

View File

@ -16,7 +16,7 @@ class cPawn :
typedef cEntity super; typedef cEntity super;
public: public:
CLASS_PROTODEF(cPawn); CLASS_PROTODEF(cPawn)
cPawn(eEntityType a_EntityType, double a_Width, double a_Height); cPawn(eEntityType a_EntityType, double a_Width, double a_Height);

View File

@ -23,7 +23,7 @@ class cPickup :
public: public:
// tolua_end // tolua_end
CLASS_PROTODEF(cPickup); CLASS_PROTODEF(cPickup)
cPickup(double a_PosX, double a_PosY, double a_PosZ, const cItem & a_Item, bool IsPlayerCreated, float a_SpeedX = 0.f, float a_SpeedY = 0.f, float a_SpeedZ = 0.f); cPickup(double a_PosX, double a_PosY, double a_PosZ, const cItem & a_Item, bool IsPlayerCreated, float a_SpeedX = 0.f, float a_SpeedY = 0.f, float a_SpeedZ = 0.f);

View File

@ -48,7 +48,7 @@ public:
virtual void Tick(float a_Dt, cChunk & a_Chunk) override; virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
virtual void HandlePhysics(float a_Dt, cChunk &) override { UNUSED(a_Dt); }; virtual void HandlePhysics(float a_Dt, cChunk &) override { UNUSED(a_Dt); }
/** Returns the curently equipped weapon; empty item if none */ /** Returns the curently equipped weapon; empty item if none */
virtual cItem GetEquippedWeapon(void) const override { return m_Inventory.GetEquippedItem(); } virtual cItem GetEquippedWeapon(void) const override { return m_Inventory.GetEquippedItem(); }

View File

@ -41,7 +41,7 @@ public:
// tolua_end // tolua_end
CLASS_PROTODEF(cProjectileEntity); CLASS_PROTODEF(cProjectileEntity)
cProjectileEntity(eKind a_Kind, cEntity * a_Creator, double a_X, double a_Y, double a_Z, double a_Width, double a_Height); cProjectileEntity(eKind a_Kind, cEntity * a_Creator, double a_X, double a_Y, double a_Z, double a_Width, double a_Height);
cProjectileEntity(eKind a_Kind, cEntity * a_Creator, const Vector3d & a_Pos, const Vector3d & a_Speed, double a_Width, double a_Height); cProjectileEntity(eKind a_Kind, cEntity * a_Creator, const Vector3d & a_Pos, const Vector3d & a_Speed, double a_Width, double a_Height);

View File

@ -23,7 +23,7 @@ public:
// tolua_end // tolua_end
CLASS_PROTODEF(cSplashPotionEntity); CLASS_PROTODEF(cSplashPotionEntity)
cSplashPotionEntity( cSplashPotionEntity(
cEntity * a_Creator, cEntity * a_Creator,

View File

@ -14,7 +14,7 @@ class cTNTEntity :
public: public:
// tolua_end // tolua_end
CLASS_PROTODEF(cTNTEntity); CLASS_PROTODEF(cTNTEntity)
cTNTEntity(double a_X, double a_Y, double a_Z, int a_FuseTicks = 80); cTNTEntity(double a_X, double a_Y, double a_Z, int a_FuseTicks = 80);
cTNTEntity(const Vector3d & a_Pos, int a_FuseTicks = 80); cTNTEntity(const Vector3d & a_Pos, int a_FuseTicks = 80);

View File

@ -21,7 +21,7 @@ public:
// tolua_end // tolua_end
CLASS_PROTODEF(cThrownEggEntity); CLASS_PROTODEF(cThrownEggEntity)
cThrownEggEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed); cThrownEggEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed);

View File

@ -21,7 +21,7 @@ public:
// tolua_end // tolua_end
CLASS_PROTODEF(cThrownEnderPearlEntity); CLASS_PROTODEF(cThrownEnderPearlEntity)
cThrownEnderPearlEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed); cThrownEnderPearlEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed);

View File

@ -21,7 +21,7 @@ public:
// tolua_end // tolua_end
CLASS_PROTODEF(cThrownSnowballEntity); CLASS_PROTODEF(cThrownSnowballEntity)
cThrownSnowballEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed); cThrownSnowballEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed);

View File

@ -22,7 +22,7 @@ public:
// tolua_end // tolua_end
CLASS_PROTODEF(cWitherSkullEntity); CLASS_PROTODEF(cWitherSkullEntity)
cWitherSkullEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed); cWitherSkullEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed);

View File

@ -44,7 +44,7 @@ public:
{ {
public: public:
cGenerator(cChunkGenerator & a_ChunkGenerator); cGenerator(cChunkGenerator & a_ChunkGenerator);
virtual ~cGenerator() {} ; // Force a virtual destructor virtual ~cGenerator() {} // Force a virtual destructor
/// Called to initialize the generator on server startup. /// Called to initialize the generator on server startup.
virtual void Initialize(cIniFile & a_IniFile); virtual void Initialize(cIniFile & a_IniFile);

View File

@ -415,6 +415,10 @@ void cComposableGenerator::InitFinishGens(cIniFile & a_IniFile)
{ {
m_FinishGens.push_back(new cFinishGenSprinkleFoliage(Seed)); m_FinishGens.push_back(new cFinishGenSprinkleFoliage(Seed));
} }
else if (NoCaseCompare(*itr, "TallGrass") == 0)
{
m_FinishGens.push_back(new cFinishGenTallGrass(Seed));
}
else if (NoCaseCompare(*itr, "TestRails") == 0) else if (NoCaseCompare(*itr, "TestRails") == 0)
{ {
m_FinishGens.push_back(new cTestRailsGen(Seed, 100, 1, 7, 50)); m_FinishGens.push_back(new cTestRailsGen(Seed, 100, 1, 7, 50));

View File

@ -675,6 +675,8 @@ void cDistortedHeightmap::ComposeColumn(cChunkDesc & a_ChunkDesc, int a_RelX, in
case biForestHills: case biForestHills:
case biTaigaHills: case biTaigaHills:
case biExtremeHillsEdge: case biExtremeHillsEdge:
case biExtremeHillsPlus:
case biExtremeHills:
case biJungle: case biJungle:
case biJungleHills: case biJungleHills:
case biJungleEdge: case biJungleEdge:
@ -750,18 +752,6 @@ void cDistortedHeightmap::ComposeColumn(cChunkDesc & a_ChunkDesc, int a_RelX, in
return; return;
} }
case biExtremeHillsPlus:
case biExtremeHills:
{
// Select the pattern to use - stone or grass:
NOISE_DATATYPE NoiseX = ((NOISE_DATATYPE)(m_CurChunkX * cChunkDef::Width + a_RelX)) / FrequencyX;
NOISE_DATATYPE NoiseY = ((NOISE_DATATYPE)(m_CurChunkZ * cChunkDef::Width + a_RelZ)) / FrequencyZ;
NOISE_DATATYPE Val = m_OceanFloorSelect.CubicNoise2D(NoiseX, NoiseY);
const sBlockInfo * Pattern = (Val < -0.1) ? patStone.Get() : patGrass.Get();
FillColumnPattern(a_ChunkDesc, a_RelX, a_RelZ, Pattern);
return;
}
case biExtremeHillsPlusM: case biExtremeHillsPlusM:
case biExtremeHillsM: case biExtremeHillsM:
{ {
@ -769,7 +759,7 @@ void cDistortedHeightmap::ComposeColumn(cChunkDesc & a_ChunkDesc, int a_RelX, in
NOISE_DATATYPE NoiseX = ((NOISE_DATATYPE)(m_CurChunkX * cChunkDef::Width + a_RelX)) / FrequencyX; NOISE_DATATYPE NoiseX = ((NOISE_DATATYPE)(m_CurChunkX * cChunkDef::Width + a_RelX)) / FrequencyX;
NOISE_DATATYPE NoiseY = ((NOISE_DATATYPE)(m_CurChunkZ * cChunkDef::Width + a_RelZ)) / FrequencyZ; NOISE_DATATYPE NoiseY = ((NOISE_DATATYPE)(m_CurChunkZ * cChunkDef::Width + a_RelZ)) / FrequencyZ;
NOISE_DATATYPE Val = m_OceanFloorSelect.CubicNoise2D(NoiseX, NoiseY); NOISE_DATATYPE Val = m_OceanFloorSelect.CubicNoise2D(NoiseX, NoiseY);
const sBlockInfo * Pattern = (Val < -0.9) ? patStone.Get() : ((Val > 0) ? patGravel.Get() : patGrass.Get()); const sBlockInfo * Pattern = (Val < 0.0) ? patStone.Get() : patGrass.Get();
FillColumnPattern(a_ChunkDesc, a_RelX, a_RelZ, Pattern); FillColumnPattern(a_ChunkDesc, a_RelX, a_RelZ, Pattern);
return; return;
} }

View File

@ -45,42 +45,14 @@ static inline bool IsWater(BLOCKTYPE a_BlockType)
void cFinishGenNetherClumpFoliage::GenFinish(cChunkDesc & a_ChunkDesc) void cFinishGenNetherClumpFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
{ {
double ChunkX = a_ChunkDesc.GetChunkX() + 0.1; // We can't devide through 0 so lets add 0.1 to all the chunk coordinates. int ChunkX = a_ChunkDesc.GetChunkX();
double ChunkZ = a_ChunkDesc.GetChunkZ() + 0.1; int ChunkZ = a_ChunkDesc.GetChunkZ();
NOISE_DATATYPE Val1 = m_Noise.CubicNoise2D((float) (ChunkX * ChunkZ * 0.01f), (float) (ChunkZ / ChunkX * 0.01f));
NOISE_DATATYPE Val2 = m_Noise.CubicNoise2D((float) (ChunkX / ChunkZ / 0.01f), (float) (ChunkZ * ChunkX / 0.01f));
if (Val1 < 0) int Val1 = m_Noise.IntNoise2DInt(ChunkX ^ ChunkZ, ChunkZ + ChunkX);
{ int Val2 = m_Noise.IntNoise2DInt(ChunkZ ^ ChunkX, ChunkZ - ChunkX);
Val1 = -Val1;
}
if (Val2 < 0)
{
Val2 = -Val2;
}
int PosX, PosZ; int PosX = Val1 % 16;
// Calculate PosX int PosZ = Val2 % 16;
if (Val1 <= 1)
{
PosX = (int) floor(Val1 * 16);
}
else
{
PosX = (int) floor(16 / Val1);
}
// Calculate PosZ
if (Val2 <= 1)
{
PosZ = (int) floor(Val2 * 16);
}
else
{
PosZ = (int) floor(16 / Val2);
}
for (int y = 1; y < cChunkDef::Height; y++) for (int y = 1; y < cChunkDef::Height; y++)
{ {
@ -88,12 +60,14 @@ void cFinishGenNetherClumpFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
{ {
continue; continue;
} }
if (!cBlockInfo::IsSolid(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; continue;
} }
NOISE_DATATYPE BlockType = m_Noise.CubicNoise1D((float) (ChunkX * ChunkZ) / (y * 0.1f)); // Choose what block to use.
NOISE_DATATYPE BlockType = m_Noise.IntNoise3D((int) ChunkX, y, (int) ChunkZ);
if (BlockType < -0.7) if (BlockType < -0.7)
{ {
TryPlaceClump(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_BROWN_MUSHROOM); TryPlaceClump(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_BROWN_MUSHROOM);
@ -119,12 +93,17 @@ void cFinishGenNetherClumpFoliage::TryPlaceClump(cChunkDesc & a_ChunkDesc, int a
for (int x = a_RelX - 4; x < a_RelX + 4; x++) for (int x = a_RelX - 4; x < a_RelX + 4; x++)
{ {
float xx = (float) a_ChunkDesc.GetChunkX() * cChunkDef::Width + x; int xx = a_ChunkDesc.GetChunkX() * cChunkDef::Width + x;
for (int z = a_RelZ - 4; z < a_RelZ + 4; z++) for (int z = a_RelZ - 4; z < a_RelZ + 4; z++)
{ {
float zz = (float) a_ChunkDesc.GetChunkZ() * cChunkDef::Width + z; int zz = a_ChunkDesc.GetChunkZ() * cChunkDef::Width + z;
for (int y = a_RelY - 2; y < a_RelY + 2; y++) for (int y = a_RelY - 2; y < a_RelY + 2; y++)
{ {
if ((y < 1) || (y > cChunkDef::Height))
{
continue;
}
if (a_ChunkDesc.GetBlockType(x, y, z) != E_BLOCK_AIR) // Don't replace non air blocks. if (a_ChunkDesc.GetBlockType(x, y, z) != E_BLOCK_AIR) // Don't replace non air blocks.
{ {
continue; continue;
@ -144,9 +123,8 @@ void cFinishGenNetherClumpFoliage::TryPlaceClump(cChunkDesc & a_ChunkDesc, int a
} }
} }
NOISE_DATATYPE Val = m_Noise.IntNoise2D(xx, zz);
NOISE_DATATYPE Val = m_Noise.CubicNoise2D(xx, zz); if (Val < -0.5)
if (Val < -0.70)
{ {
a_ChunkDesc.SetBlockType(x, y, z, a_Block); a_ChunkDesc.SetBlockType(x, y, z, a_Block);
} }
@ -159,6 +137,65 @@ void cFinishGenNetherClumpFoliage::TryPlaceClump(cChunkDesc & a_ChunkDesc, int a
////////////////////////////////////////////////////////////////////////////////
// cFinishGenTallGrass:
void cFinishGenTallGrass::GenFinish(cChunkDesc & a_ChunkDesc)
{
for (int x = 0; x < cChunkDef::Width; x++)
{
int xx = x + a_ChunkDesc.GetChunkX() * cChunkDef::Width;
for (int z = 0; z < cChunkDef::Width; z++)
{
int zz = z + a_ChunkDesc.GetChunkZ() * cChunkDef::Width;
int BiomeDensity = GetBiomeDensity(a_ChunkDesc.GetBiome(x, z));
// Choose if we want to place long grass here. If not then bail out:
if ((m_Noise.IntNoise2DInt(xx + m_Noise.IntNoise1DInt(xx), zz + m_Noise.IntNoise1DInt(zz)) / 7 % 100) > BiomeDensity)
{
continue;
}
// Get the top block + 1. This is the place where the grass would finaly be placed:
int y = a_ChunkDesc.GetHeight(x, z) + 1;
// Check if long grass can be placed:
if (
(a_ChunkDesc.GetBlockType(x, y, z) != E_BLOCK_AIR) ||
((a_ChunkDesc.GetBlockType(x, y - 1, z) != E_BLOCK_GRASS) && (a_ChunkDesc.GetBlockType(x, y - 1, z) != E_BLOCK_DIRT))
)
{
continue;
}
// Choose what long grass meta we should use:
int GrassType = m_Noise.IntNoise2DInt(xx * 50, zz * 50) / 7 % 100;
if (GrassType < 60)
{
a_ChunkDesc.SetBlockTypeMeta(x, y, z, E_BLOCK_TALL_GRASS, 1);
}
else if (GrassType < 90)
{
a_ChunkDesc.SetBlockTypeMeta(x, y, z, E_BLOCK_TALL_GRASS, 2);
}
else
{
// If double long grass we have to choose what type we should use:
if (a_ChunkDesc.GetBlockType(x, y + 1, z) == E_BLOCK_AIR)
{
NIBBLETYPE Meta = (m_Noise.IntNoise2DInt(xx * 100, zz * 100) / 7 % 100) > 25 ? 2 : 3;
a_ChunkDesc.SetBlockTypeMeta(x, y, z, E_BLOCK_BIG_FLOWER, Meta);
a_ChunkDesc.SetBlockTypeMeta(x, y + 1, z, E_BLOCK_BIG_FLOWER, 8);
}
}
}
}
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// cFinishGenSprinkleFoliage: // cFinishGenSprinkleFoliage:

View File

@ -69,6 +69,54 @@ protected:
class cFinishGenTallGrass :
public cFinishGen
{
public:
cFinishGenTallGrass(int a_Seed) : m_Noise(a_Seed), m_Seed(a_Seed) {}
protected:
cNoise m_Noise;
int m_Seed;
// cFinishGen override:
virtual void GenFinish(cChunkDesc & a_ChunkDesc) override;
int GetBiomeDensity(EMCSBiome a_Biome)
{
switch (a_Biome)
{
case biSavanna:
case biSavannaM:
case biSavannaPlateau:
case biSavannaPlateauM:
case biPlains:
{
return 70;
}
case biExtremeHillsEdge:
case biExtremeHillsPlus:
case biExtremeHills:
case biExtremeHillsPlusM:
case biExtremeHillsM:
case biIceMountains:
{
return 3;
}
default:
{
return 20;
}
}
}
};
class cFinishGenSprinkleFoliage : class cFinishGenSprinkleFoliage :
public cFinishGen public cFinishGen
{ {

View File

@ -2367,9 +2367,9 @@ const cPrefab::sDef g_AlchemistVillagePrefabs[] =
"a: 24: 2\n" /* sandstone */ "a: 24: 2\n" /* sandstone */
"b: 4: 0\n" /* cobblestone */ "b: 4: 0\n" /* cobblestone */
"c: 24: 0\n" /* sandstone */ "c: 24: 0\n" /* sandstone */
"d: 12: 0\n" /* sand */ "d: 13: 0\n" /* gravel */
"e: 13: 0\n" /* gravel */ "e: 5: 0\n" /* wood */
"f: 5: 0\n" /* wood */ "f: 12: 0\n" /* sand */
"g: 64: 3\n" /* wooddoorblock */ "g: 64: 3\n" /* wooddoorblock */
"h: 85: 0\n" /* fence */ "h: 85: 0\n" /* fence */
"i: 64: 0\n" /* wooddoorblock */ "i: 64: 0\n" /* wooddoorblock */
@ -2392,26 +2392,26 @@ const cPrefab::sDef g_AlchemistVillagePrefabs[] =
/* * 012345678901234 */ /* * 012345678901234 */
/* 0 */ "mmmabbbammmmmmm" /* 0 */ "mmmabbbammmmmmm"
/* 1 */ "mmmmbbbmmmmmmmm" /* 1 */ "mmmmbbbmmmmmmmm"
/* 2 */ "acccccccccadddd" /* 2 */ "acccccccccacccc"
/* 3 */ "cccccccccccdddd" /* 3 */ "ccccccccccccccc"
/* 4 */ "cccccccccccdddd" /* 4 */ "ccccccccccccccc"
/* 5 */ "cccccccccccdddd" /* 5 */ "ccccccccccccccc"
/* 6 */ "cccccccccccdddd" /* 6 */ "ccccccccccccccc"
/* 7 */ "cccccccccccdddd" /* 7 */ "ccccccccccccccc"
/* 8 */ "acccccccccadddd" /* 8 */ "acccccccccacccc"
// Level 1 // Level 1
/* z\x* 11111 */ /* z\x* 11111 */
/* * 012345678901234 */ /* * 012345678901234 */
/* 0 */ "mmmaeeeammmmmmm" /* 0 */ "mmmadddammmmmmm"
/* 1 */ "mmmmeeemmmmmmmm" /* 1 */ "mmmmdddmmmmmmmm"
/* 2 */ "accccfccccadddd" /* 2 */ "acccceccccaffff"
/* 3 */ "cfffffffffcdddd" /* 3 */ "ceeeeeeeeecffff"
/* 4 */ "cfffffffffcdddd" /* 4 */ "ceeeeeeeeecffff"
/* 5 */ "cffffffffffdddd" /* 5 */ "ceeeeeeeeeeffff"
/* 6 */ "cfffffffffcdddd" /* 6 */ "ceeeeeeeeecffff"
/* 7 */ "cfffffffffcdddd" /* 7 */ "ceeeeeeeeecffff"
/* 8 */ "acccccccccadddd" /* 8 */ "acccccccccaffff"
// Level 2 // Level 2
/* z\x* 11111 */ /* z\x* 11111 */

View File

@ -134,11 +134,11 @@ const cPrefab::sDef g_JapaneseVillagePrefabs[] =
// The data has been exported from the gallery Plains, area index 166, ID 554, created by Aloe_vera // The data has been exported from the gallery Plains, area index 166, ID 554, created by Aloe_vera
{ {
// Size: // Size:
11, 7, 13, // SizeX = 11, SizeY = 7, SizeZ = 13 11, 8, 13, // SizeX = 11, SizeY = 8, SizeZ = 13
// Hitbox (relative to bounding box): // Hitbox (relative to bounding box):
0, 0, 0, // MinX, MinY, MinZ 0, 0, 0, // MinX, MinY, MinZ
10, 6, 12, // MaxX, MaxY, MaxZ 10, 7, 12, // MaxX, MaxY, MaxZ
// Block definitions: // Block definitions:
".: 0: 0\n" /* air */ ".: 0: 0\n" /* air */
@ -150,6 +150,7 @@ const cPrefab::sDef g_JapaneseVillagePrefabs[] =
"f: 59: 7\n" /* crops */ "f: 59: 7\n" /* crops */
"g: 83: 0\n" /* reedblock */ "g: 83: 0\n" /* reedblock */
"h:113: 0\n" /* netherbrickfence */ "h:113: 0\n" /* netherbrickfence */
"i: 50: 5\n" /* torch */
"m: 19: 0\n" /* sponge */, "m: 19: 0\n" /* sponge */,
// Block data: // Block data:
@ -270,7 +271,24 @@ const cPrefab::sDef g_JapaneseVillagePrefabs[] =
/* 9 */ "..........." /* 9 */ "..........."
/* 10 */ ".h.......h." /* 10 */ ".h.......h."
/* 11 */ "hhh.....hhh" /* 11 */ "hhh.....hhh"
/* 12 */ ".h.......h.", /* 12 */ ".h.......h."
// Level 7
/* z\x* 1 */
/* * 01234567890 */
/* 0 */ ".i.......i."
/* 1 */ "i.i.....i.i"
/* 2 */ ".i.......i."
/* 3 */ "..........."
/* 4 */ "..........."
/* 5 */ "..........."
/* 6 */ "..........."
/* 7 */ "..........."
/* 8 */ "..........."
/* 9 */ "..........."
/* 10 */ ".i.......i."
/* 11 */ "i.i.....i.i"
/* 12 */ ".i.......i.",
// Connectors: // Connectors:
"-1: 10, 2, 6: 5\n" /* Type -1, direction X+ */, "-1: 10, 2, 6: 5\n" /* Type -1, direction X+ */,
@ -2195,33 +2213,33 @@ const cPrefab::sDef g_JapaneseVillagePrefabs[] =
// Level 1 // Level 1
/* z\x* 0123456 */ /* z\x* 0123456 */
/* 0 */ "bmmmmmm" /* 0 */ "bbbbbbb"
/* 1 */ "bmmmmmm" /* 1 */ "bbbbbbb"
/* 2 */ "bmmmmmm" /* 2 */ "bbbbbbb"
/* 3 */ "bmmmmmm" /* 3 */ "bbbabbb"
/* 4 */ "bmmmmmm" /* 4 */ "bbbbbbb"
/* 5 */ "bmmmmmm" /* 5 */ "bbbbbbb"
/* 6 */ "bbbbbbb" /* 6 */ "bbbbbbb"
// Level 2 // Level 2
/* z\x* 0123456 */ /* z\x* 0123456 */
/* 0 */ "......." /* 0 */ "mm...mm"
/* 1 */ "..c.c.." /* 1 */ "m.c...m"
/* 2 */ ".dccdc." /* 2 */ ".dccdc."
/* 3 */ "..cefc." /* 3 */ "..cefc."
/* 4 */ ".ccfgh." /* 4 */ ".ccfgh."
/* 5 */ "..ccc.." /* 5 */ "m.ccc.m"
/* 6 */ "......." /* 6 */ "mm...mm"
// Level 3 // Level 3
/* z\x* 0123456 */ /* z\x* 0123456 */
/* 0 */ "......." /* 0 */ "m.....m"
/* 1 */ "......." /* 1 */ "......."
/* 2 */ "......." /* 2 */ "......."
/* 3 */ "...e..." /* 3 */ "...e..."
/* 4 */ "......." /* 4 */ "......."
/* 5 */ "......." /* 5 */ "......."
/* 6 */ "......." /* 6 */ "m.....m"
// Level 4 // Level 4
/* z\x* 0123456 */ /* z\x* 0123456 */

View File

@ -356,8 +356,8 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
"e: 8: 0\n" /* water */ "e: 8: 0\n" /* water */
"f: 50: 5\n" /* torch */ "f: 50: 5\n" /* torch */
"g: 59: 7\n" /* crops */ "g: 59: 7\n" /* crops */
"h: 59: 0\n" /* crops */ "h: 59: 3\n" /* crops */
"i: 59: 1\n" /* crops */ "i: 59: 5\n" /* crops */
"m: 19: 0\n" /* sponge */, "m: 19: 0\n" /* sponge */,
// Block data: // Block data:
@ -368,7 +368,7 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
/* 1 */ "aaaaaaaaaaaaaaa" /* 1 */ "aaaaaaaaaaaaaaa"
/* 2 */ "aaaaaaaaaaaaaaa" /* 2 */ "aaaaaaaaaaaaaaa"
/* 3 */ "aaaaaaaaaaaaaaa" /* 3 */ "aaaaaaaaaaaaaaa"
/* 4 */ "aaaaaaaaaaaaaaa" /* 4 */ "aaaaaaabaaaaaaa"
/* 5 */ "aaaaaaabaaaaaaa" /* 5 */ "aaaaaaabaaaaaaa"
/* 6 */ "aaaaaaabaaaaaaa" /* 6 */ "aaaaaaabaaaaaaa"
/* 7 */ "aaaaaaabaaaaaaa" /* 7 */ "aaaaaaabaaaaaaa"
@ -405,12 +405,12 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
/* * 012345678901234 */ /* * 012345678901234 */
/* 0 */ "f.....f.f.....f" /* 0 */ "f.....f.f.....f"
/* 1 */ ".gg.gg...gg.gg." /* 1 */ ".gg.gg...gg.gg."
/* 2 */ ".gh.hg...gg.gg." /* 2 */ ".gg.hg...gg.gg."
/* 3 */ ".gh.ih...gg.gg." /* 3 */ ".gg.gi...gg.gg."
/* 4 */ ".gg.hg...gg.gg." /* 4 */ ".gg.gg...gg.gg."
/* 5 */ ".gg.hg...gg.gg." /* 5 */ ".gg.gg...gg.gg."
/* 6 */ ".ig.hg...gg.gg." /* 6 */ ".gg.gg...gg.gg."
/* 7 */ ".hg.gh...gg.gg." /* 7 */ ".gg.gg...gg.gg."
/* 8 */ "f.....f.f.....f" /* 8 */ "f.....f.f.....f"
// Level 4 // Level 4
@ -3603,8 +3603,8 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
// Block definitions: // Block definitions:
".: 0: 0\n" /* air */ ".: 0: 0\n" /* air */
"a: 2: 0\n" /* grass */ "a: 3: 0\n" /* dirt */
"b: 3: 0\n" /* dirt */ "b: 2: 0\n" /* grass */
"c: 4: 0\n" /* cobblestone */ "c: 4: 0\n" /* cobblestone */
"d: 67: 0\n" /* stairs */ "d: 67: 0\n" /* stairs */
"e: 67: 2\n" /* stairs */ "e: 67: 2\n" /* stairs */
@ -3629,19 +3629,19 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
// Level 0 // Level 0
/* z\x* 1 */ /* z\x* 1 */
/* * 01234567890 */ /* * 01234567890 */
/* 0 */ "aaaabbbaaaa" /* 0 */ "aaaaaaaaaaa"
/* 1 */ "abbbbbbbbba" /* 1 */ "aaaaaaaaaaa"
/* 2 */ "abbbbbbbbba" /* 2 */ "aaaaaaaaaaa"
/* 3 */ "abbbbbbbbba" /* 3 */ "aaaaaaaaaaa"
/* 4 */ "abbbbbbbbba" /* 4 */ "aaaaaaaaaab"
/* 5 */ "abbbbbbbbba" /* 5 */ "baaaaaaaaab"
/* 6 */ "abbbbbbbbba" /* 6 */ "aaaaaaaaaaa"
/* 7 */ "abbbbbbbbba" /* 7 */ "baaaaaaaaaa"
/* 8 */ "aabbbbbbbaa" /* 8 */ "baaaaaaaaaa"
/* 9 */ "aabbbbbbbaa" /* 9 */ "baaaaaaaaab"
/* 10 */ "aabbbbbbbaa" /* 10 */ "aaaaaaaaaaa"
/* 11 */ "aabbbbbbbaa" /* 11 */ "aaaaaaaaaba"
/* 12 */ "aabbbbbbbaa" /* 12 */ "aaaaaaaaaba"
// Level 1 // Level 1
/* z\x* 1 */ /* z\x* 1 */
@ -3654,11 +3654,11 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
/* 5 */ "mcccccccccm" /* 5 */ "mcccccccccm"
/* 6 */ "mcccccccccm" /* 6 */ "mcccccccccm"
/* 7 */ "mcccccccccm" /* 7 */ "mcccccccccm"
/* 8 */ "mmbbbbbbbmm" /* 8 */ "mmaaaaaaamm"
/* 9 */ "mmbbbbbbbmm" /* 9 */ "mmaaaaaaamm"
/* 10 */ "mmbbbbbbbmm" /* 10 */ "mmaaaaaaamm"
/* 11 */ "mmbbbbbbbmm" /* 11 */ "mmaaaaaaamm"
/* 12 */ "mmbbbbbbbmm" /* 12 */ "mmaaaaaaamm"
// Level 2 // Level 2
/* z\x* 1 */ /* z\x* 1 */
@ -3671,11 +3671,11 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
/* 5 */ ".cggggcccc." /* 5 */ ".cggggcccc."
/* 6 */ ".cggggcccc." /* 6 */ ".cggggcccc."
/* 7 */ ".ccccccccc." /* 7 */ ".ccccccccc."
/* 8 */ "..aaaaaaa.." /* 8 */ "..bbbbbbb.."
/* 9 */ "..aaaaaaa.." /* 9 */ "mmbbbbbbbmm"
/* 10 */ "..aaaaaaa.." /* 10 */ "mmbbbbbbbmm"
/* 11 */ "..aaaaaaa.." /* 11 */ "mmbbbbbbbmm"
/* 12 */ "..aaaaaaa.." /* 12 */ "mmbbbbbbbmm"
// Level 3 // Level 3
/* z\x* 1 */ /* z\x* 1 */
@ -3689,10 +3689,10 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
/* 6 */ ".i.......i." /* 6 */ ".i.......i."
/* 7 */ ".hiiijiiih." /* 7 */ ".hiiijiiih."
/* 8 */ "..l.....l.." /* 8 */ "..l.....l.."
/* 9 */ "..l.....l.." /* 9 */ "mml.....lmm"
/* 10 */ "..l.....l.." /* 10 */ "mml.....lmm"
/* 11 */ "..l.....l.." /* 11 */ "mml.....lmm"
/* 12 */ "..lllllll.." /* 12 */ "mmlllllllmm"
// Level 4 // Level 4
/* z\x* 1 */ /* z\x* 1 */
@ -3706,10 +3706,10 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
/* 6 */ ".o.......o." /* 6 */ ".o.......o."
/* 7 */ ".hooipiooh." /* 7 */ ".hooipiooh."
/* 8 */ "..........." /* 8 */ "..........."
/* 9 */ "..........." /* 9 */ "mm.......mm"
/* 10 */ "..........." /* 10 */ "mm.......mm"
/* 11 */ "..........." /* 11 */ "mm.......mm"
/* 12 */ "..........." /* 12 */ "mm.......mm"
// Level 5 // Level 5
/* z\x* 1 */ /* z\x* 1 */
@ -3723,10 +3723,10 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
/* 6 */ ".i.......i." /* 6 */ ".i.......i."
/* 7 */ "uiiiiiiiiiu" /* 7 */ "uiiiiiiiiiu"
/* 8 */ "kkkkkkkkkkk" /* 8 */ "kkkkkkkkkkk"
/* 9 */ "..........." /* 9 */ "mm.......mm"
/* 10 */ "..........." /* 10 */ "mm.......mm"
/* 11 */ "..........." /* 11 */ "mm.......mm"
/* 12 */ "..........." /* 12 */ "mm.......mm"
// Level 6 // Level 6
/* z\x* 1 */ /* z\x* 1 */
@ -3740,10 +3740,10 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
/* 6 */ "uiiiiiiiiiu" /* 6 */ "uiiiiiiiiiu"
/* 7 */ "kkkkkkkkkkk" /* 7 */ "kkkkkkkkkkk"
/* 8 */ "..........." /* 8 */ "..........."
/* 9 */ "..........." /* 9 */ "mm.......mm"
/* 10 */ "..........." /* 10 */ "mm.......mm"
/* 11 */ "..........." /* 11 */ "mm.......mm"
/* 12 */ "..........." /* 12 */ "mm.......mm"
// Level 7 // Level 7
/* z\x* 1 */ /* z\x* 1 */
@ -3757,10 +3757,10 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
/* 6 */ "kkkkkkkkkkk" /* 6 */ "kkkkkkkkkkk"
/* 7 */ "..........." /* 7 */ "..........."
/* 8 */ "..........." /* 8 */ "..........."
/* 9 */ "..........." /* 9 */ "mm.......mm"
/* 10 */ "..........." /* 10 */ "mm.......mm"
/* 11 */ "..........." /* 11 */ "mm.......mm"
/* 12 */ "..........." /* 12 */ "mm.......mm"
// Level 8 // Level 8
/* z\x* 1 */ /* z\x* 1 */
@ -3774,10 +3774,10 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
/* 6 */ "..........." /* 6 */ "..........."
/* 7 */ "..........." /* 7 */ "..........."
/* 8 */ "..........." /* 8 */ "..........."
/* 9 */ "..........." /* 9 */ "mm.......mm"
/* 10 */ "..........." /* 10 */ "mm.......mm"
/* 11 */ "..........." /* 11 */ "mm.......mm"
/* 12 */ "...........", /* 12 */ "mm.......mm",
// Connectors: // Connectors:
"-1: 5, 2, 0: 2\n" /* Type -1, direction Z- */, "-1: 5, 2, 0: 2\n" /* Type -1, direction Z- */,
@ -4237,30 +4237,29 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
// Block definitions: // Block definitions:
".: 0: 0\n" /* air */ ".: 0: 0\n" /* air */
"a: 4: 0\n" /* cobblestone */ "a: 4: 0\n" /* cobblestone */
"b: 2: 0\n" /* grass */ "b: 67: 0\n" /* stairs */
"c: 67: 0\n" /* stairs */ "c: 67: 2\n" /* stairs */
"d: 67: 2\n" /* stairs */ "d: 67: 1\n" /* stairs */
"e: 67: 1\n" /* stairs */ "e: 5: 0\n" /* wood */
"f: 5: 0\n" /* wood */ "f: 67: 3\n" /* stairs */
"g: 67: 3\n" /* stairs */ "g: 17: 0\n" /* tree */
"h: 17: 0\n" /* tree */ "h: 64: 7\n" /* wooddoorblock */
"i: 64: 7\n" /* wooddoorblock */ "i: 64: 5\n" /* wooddoorblock */
"j: 64: 5\n" /* wooddoorblock */ "j:102: 0\n" /* glasspane */
"k:102: 0\n" /* glasspane */ "k: 64:12\n" /* wooddoorblock */
"l: 64:12\n" /* wooddoorblock */ "l: 53: 2\n" /* woodstairs */
"m: 19: 0\n" /* sponge */ "m: 19: 0\n" /* sponge */
"n: 53: 2\n" /* woodstairs */ "n: 53: 1\n" /* woodstairs */
"o: 53: 1\n" /* woodstairs */ "o: 53: 7\n" /* woodstairs */
"p: 53: 7\n" /* woodstairs */ "p: 53: 6\n" /* woodstairs */
"q: 53: 6\n" /* woodstairs */ "q: 53: 3\n" /* woodstairs */
"r: 53: 3\n" /* woodstairs */ "r: 53: 0\n" /* woodstairs */
"s: 53: 0\n" /* woodstairs */ "s: 53: 5\n" /* woodstairs */
"t: 53: 5\n" /* woodstairs */ "t: 53: 4\n" /* woodstairs */
"u: 53: 4\n" /* woodstairs */ "u: 50: 3\n" /* torch */
"v: 50: 3\n" /* torch */ "v: 50: 2\n" /* torch */
"w: 50: 2\n" /* torch */ "w: 50: 4\n" /* torch */
"x: 50: 4\n" /* torch */ "x: 50: 1\n" /* torch */,
"y: 50: 1\n" /* torch */,
// Block data: // Block data:
// Level 0 // Level 0
@ -4274,134 +4273,134 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
/* 5 */ "maaaaaaaaaaaaaam" /* 5 */ "maaaaaaaaaaaaaam"
/* 6 */ "maaaaaaaaaaaaaam" /* 6 */ "maaaaaaaaaaaaaam"
/* 7 */ "maaaaaaaaaaaaaam" /* 7 */ "maaaaaaaaaaaaaam"
/* 8 */ "bbbbbaaaaaaaaaam" /* 8 */ "mmmmmaaaaaaaaaam"
/* 9 */ "bbbbbbbbaaaaaaam" /* 9 */ "mmmmmmmmaaaaaaam"
/* 10 */ "bbbbbbbbaaaaaaam" /* 10 */ "mmmmmmmmaaaaaaam"
/* 11 */ "bbbbbbbbaaaaaaam" /* 11 */ "mmmmmmmmaaaaaaam"
/* 12 */ "bbbbbbbbaaaaaaam" /* 12 */ "mmmmmmmmaaaaaaam"
/* 13 */ "bbbbbbbbaaaaaaam" /* 13 */ "mmmmmmmmaaaaaaam"
/* 14 */ "bbbbbbbbaaaaaaam" /* 14 */ "mmmmmmmmaaaaaaam"
/* 15 */ "bbbbbbbbmmmmmmmm" /* 15 */ "mmmmmmmmmmmmmmmm"
// Level 1 // Level 1
/* z\x* 111111 */ /* z\x* 111111 */
/* * 0123456789012345 */ /* * 0123456789012345 */
/* 0 */ "........cde....." /* 0 */ "........bcd....."
/* 1 */ ".aaaaaaaaaaaaaa." /* 1 */ ".aaaaaaaaaaaaaa."
/* 2 */ ".affffffffffffa." /* 2 */ ".aeeeeeeeeeeeea."
/* 3 */ ".affffffffffffa." /* 3 */ ".aeeeeeeeeeeeea."
/* 4 */ ".affffffffffffa." /* 4 */ ".aeeeeeeeeeeeea."
/* 5 */ ".affffffffffffa." /* 5 */ ".aeeeeeeeeeeeea."
/* 6 */ ".affffffffffffa." /* 6 */ ".aeeeeeeeeeeeea."
/* 7 */ ".aaaaaaaafffffa." /* 7 */ ".aaaaaaaaeeeeea."
/* 8 */ ".....cgeafffffa." /* 8 */ ".....bfdaeeeeea."
/* 9 */ "........afffffa." /* 9 */ "mmmm....aeeeeea."
/* 10 */ "........afffffa." /* 10 */ "mmmmmmm.aeeeeea."
/* 11 */ "........afffffa." /* 11 */ "mmmmmmm.aeeeeea."
/* 12 */ "........afffffa." /* 12 */ "mmmmmmm.aeeeeea."
/* 13 */ "........afffffa." /* 13 */ "mmmmmmm.aeeeeea."
/* 14 */ "........aaaaaaa." /* 14 */ "mmmmmmm.aaaaaaa."
/* 15 */ "................" /* 15 */ "mmmmmmm........."
// Level 2 // Level 2
/* z\x* 111111 */ /* z\x* 111111 */
/* * 0123456789012345 */ /* * 0123456789012345 */
/* 0 */ "................" /* 0 */ "................"
/* 1 */ ".hffffffhihfffh." /* 1 */ ".geeeeeeghgeeeg."
/* 2 */ ".f............f." /* 2 */ ".e............e."
/* 3 */ ".f............f." /* 3 */ ".e............e."
/* 4 */ ".f............f." /* 4 */ ".e............e."
/* 5 */ ".f............f." /* 5 */ ".e............e."
/* 6 */ ".f............f." /* 6 */ ".e............e."
/* 7 */ ".hffffjfh.....f." /* 7 */ ".geeeeieg.....e."
/* 8 */ "........f.....f." /* 8 */ "........e.....e."
/* 9 */ "........f.....f." /* 9 */ "mmmm....e.....e."
/* 10 */ "........f.....f." /* 10 */ "mmmmmmm.e.....e."
/* 11 */ "........f.....f." /* 11 */ "mmmmmmm.e.....e."
/* 12 */ "........f.....f." /* 12 */ "mmmmmmm.e.....e."
/* 13 */ "........f.....f." /* 13 */ "mmmmmmm.e.....e."
/* 14 */ "........hfffffh." /* 14 */ "mmmmmmm.geeeeeg."
/* 15 */ "................" /* 15 */ "mmmmmmm........."
// Level 3 // Level 3
/* z\x* 111111 */ /* z\x* 111111 */
/* * 0123456789012345 */ /* * 0123456789012345 */
/* 0 */ "................" /* 0 */ "................"
/* 1 */ ".hfkkfkkhlhkkfh." /* 1 */ ".gejjejjgkgjjeg."
/* 2 */ ".k............f." /* 2 */ ".j............e."
/* 3 */ ".k............k." /* 3 */ ".j............j."
/* 4 */ ".k............k." /* 4 */ ".j............j."
/* 5 */ ".k............f." /* 5 */ ".j............e."
/* 6 */ ".k............k." /* 6 */ ".j............j."
/* 7 */ ".hfkkflfh.....k." /* 7 */ ".gejjekeg.....j."
/* 8 */ "........f.....f." /* 8 */ "........e.....e."
/* 9 */ "........k.....k." /* 9 */ "mmmm....j.....j."
/* 10 */ "........k.....k." /* 10 */ "mmmmmmm.j.....j."
/* 11 */ "........f.....f." /* 11 */ "mmmmmmm.e.....e."
/* 12 */ "........k.....k." /* 12 */ "mmmmmmm.j.....j."
/* 13 */ "........k.....k." /* 13 */ "mmmmmmm.j.....j."
/* 14 */ "........hkkkkkh." /* 14 */ "mmmmmmm.gjjjjjg."
/* 15 */ "................" /* 15 */ "mmmmmmm........."
// Level 4 // Level 4
/* z\x* 111111 */ /* z\x* 111111 */
/* * 0123456789012345 */ /* * 0123456789012345 */
/* 0 */ "nnnnnnnnnnnnnnno" /* 0 */ "llllllllllllllln"
/* 1 */ "phffffffhfhfffho" /* 1 */ "ogeeeeeegegeeegn"
/* 2 */ ".f............fo" /* 2 */ ".e............en"
/* 3 */ ".f............fo" /* 3 */ ".e............en"
/* 4 */ ".f............fo" /* 4 */ ".e............en"
/* 5 */ ".f............fo" /* 5 */ ".e............en"
/* 6 */ ".f............fo" /* 6 */ ".e............en"
/* 7 */ "qhffffffh.....fo" /* 7 */ "pgeeeeeeg.....en"
/* 8 */ "rrrrrrrsf.....fo" /* 8 */ "qqqqqqqre.....en"
/* 9 */ ".......sf.....fo" /* 9 */ "mmmm...re.....en"
/* 10 */ ".......sf.....fo" /* 10 */ "mmmmmmmre.....en"
/* 11 */ ".......sf.....fo" /* 11 */ "mmmmmmmre.....en"
/* 12 */ ".......sf.....fo" /* 12 */ "mmmmmmmre.....en"
/* 13 */ ".......sf.....fo" /* 13 */ "mmmmmmmre.....en"
/* 14 */ ".......shfffffho" /* 14 */ "mmmmmmmrgeeeeegn"
/* 15 */ ".......st.....uo" /* 15 */ "mmmmmmmrs.....tn"
// Level 5 // Level 5
/* z\x* 111111 */ /* z\x* 111111 */
/* * 0123456789012345 */ /* * 0123456789012345 */
/* 0 */ "................" /* 0 */ "................"
/* 1 */ "nnnnnnnnnnnnnnn." /* 1 */ "lllllllllllllll."
/* 2 */ "pfffffffffffffo." /* 2 */ "oeeeeeeeeeeeeen."
/* 3 */ ".f.........v.fo." /* 3 */ ".e.........u.en."
/* 4 */ ".f..........wfo." /* 4 */ ".e..........ven."
/* 5 */ ".f......x....fo." /* 5 */ ".e......w....en."
/* 6 */ "qfffffffff...fo." /* 6 */ "peeeeeeeee...en."
/* 7 */ "rrrrrrrrsfy..fo." /* 7 */ "qqqqqqqqrex..en."
/* 8 */ "........sf...fo." /* 8 */ "........re...en."
/* 9 */ "........sf...fo." /* 9 */ "mmmm....re...en."
/* 10 */ "........sf...fo." /* 10 */ "mmmmmmm.re...en."
/* 11 */ "........sf...fo." /* 11 */ "mmmmmmm.re...en."
/* 12 */ "........sf...fo." /* 12 */ "mmmmmmm.re...en."
/* 13 */ "........sf...fo." /* 13 */ "mmmmmmm.re...en."
/* 14 */ "........sfffffo." /* 14 */ "mmmmmmm.reeeeen."
/* 15 */ "........st...uo." /* 15 */ "mmmmmmm.rs...tn."
// Level 6 // Level 6
/* z\x* 111111 */ /* z\x* 111111 */
/* * 0123456789012345 */ /* * 0123456789012345 */
/* 0 */ "................" /* 0 */ "................"
/* 1 */ "................" /* 1 */ "................"
/* 2 */ "nnnnnnnnnnnnno.." /* 2 */ "llllllllllllln.."
/* 3 */ "pffffffffffffo.." /* 3 */ "oeeeeeeeeeeeen.."
/* 4 */ ".fy.........fo.." /* 4 */ ".ex.........en.."
/* 5 */ "qffffffffff.fo.." /* 5 */ "peeeeeeeeee.en.."
/* 6 */ "rrrrrrrrrsf.fo.." /* 6 */ "qqqqqqqqqre.en.."
/* 7 */ ".........sf.fo.." /* 7 */ ".........re.en.."
/* 8 */ ".........sf.fo.." /* 8 */ ".........re.en.."
/* 9 */ ".........sf.fo.." /* 9 */ "mmmm.....re.en.."
/* 10 */ ".........sf.fo.." /* 10 */ "mmmmmmm..re.en.."
/* 11 */ ".........sf.fo.." /* 11 */ "mmmmmmm..re.en.."
/* 12 */ ".........sf.fo.." /* 12 */ "mmmmmmm..re.en.."
/* 13 */ ".........sfxfo.." /* 13 */ "mmmmmmm..rewen.."
/* 14 */ ".........sfffo.." /* 14 */ "mmmmmmm..reeen.."
/* 15 */ ".........st.uo.." /* 15 */ "mmmmmmm..rs.tn.."
// Level 7 // Level 7
/* z\x* 111111 */ /* z\x* 111111 */
@ -4409,19 +4408,19 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
/* 0 */ "................" /* 0 */ "................"
/* 1 */ "................" /* 1 */ "................"
/* 2 */ "................" /* 2 */ "................"
/* 3 */ "nnnnnnnnnnnnn..." /* 3 */ "lllllllllllll..."
/* 4 */ "ffffffffffffo..." /* 4 */ "eeeeeeeeeeeen..."
/* 5 */ "rrrrrrrrrrsfo..." /* 5 */ "qqqqqqqqqqren..."
/* 6 */ "..........sfo..." /* 6 */ "..........ren..."
/* 7 */ "..........sfo..." /* 7 */ "..........ren..."
/* 8 */ "..........sfo..." /* 8 */ "..........ren..."
/* 9 */ "..........sfo..." /* 9 */ "mmmm......ren..."
/* 10 */ "..........sfo..." /* 10 */ "mmmmmmm...ren..."
/* 11 */ "..........sfo..." /* 11 */ "mmmmmmm...ren..."
/* 12 */ "..........sfo..." /* 12 */ "mmmmmmm...ren..."
/* 13 */ "..........sfo..." /* 13 */ "mmmmmmm...ren..."
/* 14 */ "..........sfo..." /* 14 */ "mmmmmmm...ren..."
/* 15 */ "..........sfo...", /* 15 */ "mmmmmmm...ren...",
// Connectors: // Connectors:
"-1: 9, 1, 0: 2\n" /* Type -1, direction Z- */, "-1: 9, 1, 0: 2\n" /* Type -1, direction Z- */,

View File

@ -33,7 +33,7 @@ public:
cHTTPMessage(eKind a_Kind); cHTTPMessage(eKind a_Kind);
// Force a virtual destructor in all descendants // Force a virtual destructor in all descendants
virtual ~cHTTPMessage() {}; virtual ~cHTTPMessage() {}
/** Adds a header into the internal map of headers. Recognizes special headers: Content-Type and Content-Length */ /** Adds a header into the internal map of headers. Recognizes special headers: Content-Type and Content-Length */
void AddHeader(const AString & a_Key, const AString & a_Value); void AddHeader(const AString & a_Key, const AString & a_Value);

View File

@ -328,12 +328,9 @@ void cItemHandler::OnBlockDestroyed(cWorld * a_World, cPlayer * a_Player, const
if (a_Player->IsGameModeSurvival()) if (a_Player->IsGameModeSurvival())
{ {
if (!BlockRequiresSpecialTool(Block) || CanHarvestBlock(Block)) cChunkInterface ChunkInterface(a_World->GetChunkMap());
{ cBlockInServerPluginInterface PluginInterface(*a_World);
cChunkInterface ChunkInterface(a_World->GetChunkMap()); Handler->DropBlock(ChunkInterface, *a_World, PluginInterface, a_Player, a_BlockX, a_BlockY, a_BlockZ, CanHarvestBlock(Block), a_Player->GetEquippedItem().m_Enchantments.GetLevel(cEnchantments::enchSilkTouch) > 0);
cBlockInServerPluginInterface PluginInterface(*a_World);
Handler->DropBlock(ChunkInterface, *a_World, PluginInterface, a_Player, a_BlockX, a_BlockY, a_BlockZ);
}
} }
if (!cBlockInfo::IsOneHitDig(Block)) if (!cBlockInfo::IsOneHitDig(Block))
@ -542,9 +539,50 @@ bool cItemHandler::CanRepairWithRawMaterial(short a_ItemType)
bool cItemHandler::CanHarvestBlock(BLOCKTYPE a_BlockType) bool cItemHandler::CanHarvestBlock(BLOCKTYPE a_BlockType)
{ {
UNUSED(a_BlockType); switch (a_BlockType)
{
return false; case E_BLOCK_ANVIL:
case E_BLOCK_ENCHANTMENT_TABLE:
case E_BLOCK_FURNACE:
case E_BLOCK_LIT_FURNACE:
case E_BLOCK_COAL_ORE:
case E_BLOCK_STONE:
case E_BLOCK_COBBLESTONE:
case E_BLOCK_END_STONE:
case E_BLOCK_MOSSY_COBBLESTONE:
case E_BLOCK_SANDSTONE_STAIRS:
case E_BLOCK_SANDSTONE:
case E_BLOCK_STONE_BRICKS:
case E_BLOCK_NETHER_BRICK:
case E_BLOCK_NETHERRACK:
case E_BLOCK_STONE_SLAB:
case E_BLOCK_DOUBLE_STONE_SLAB:
case E_BLOCK_STONE_PRESSURE_PLATE:
case E_BLOCK_BRICK:
case E_BLOCK_COBBLESTONE_STAIRS:
case E_BLOCK_COBBLESTONE_WALL:
case E_BLOCK_STONE_BRICK_STAIRS:
case E_BLOCK_NETHER_BRICK_STAIRS:
case E_BLOCK_CAULDRON:
case E_BLOCK_OBSIDIAN:
case E_BLOCK_DIAMOND_BLOCK:
case E_BLOCK_DIAMOND_ORE:
case E_BLOCK_GOLD_BLOCK:
case E_BLOCK_GOLD_ORE:
case E_BLOCK_REDSTONE_ORE:
case E_BLOCK_REDSTONE_ORE_GLOWING:
case E_BLOCK_EMERALD_ORE:
case E_BLOCK_IRON_BLOCK:
case E_BLOCK_IRON_ORE:
case E_BLOCK_LAPIS_ORE:
case E_BLOCK_LAPIS_BLOCK:
case E_BLOCK_SNOW:
case E_BLOCK_VINES:
{
return false;
}
default: return true;
}
} }

View File

@ -8,6 +8,7 @@
class cItemPickaxeHandler : class cItemPickaxeHandler :
public cItemHandler public cItemHandler
{ {
typedef cItemHandler super;
public: public:
cItemPickaxeHandler(int a_ItemType) cItemPickaxeHandler(int a_ItemType)
: cItemHandler(a_ItemType) : cItemHandler(a_ItemType)
@ -84,7 +85,7 @@ public:
return PickaxeLevel() >= 1; return PickaxeLevel() >= 1;
} }
} }
return false; return super::CanHarvestBlock(a_BlockType);
} }
virtual bool CanRepairWithRawMaterial(short a_ItemType) override virtual bool CanRepairWithRawMaterial(short a_ItemType) override

View File

@ -59,7 +59,7 @@ public:
return true; return true;
} }
} // switch (a_BlockType) } // switch (a_BlockType)
return false; return super::CanHarvestBlock(a_BlockType);
} }

View File

@ -14,6 +14,7 @@
class cItemShovelHandler : public cItemHandler class cItemShovelHandler : public cItemHandler
{ {
typedef cItemHandler super;
public: public:
cItemShovelHandler(int a_ItemType) cItemShovelHandler(int a_ItemType)
: cItemHandler(a_ItemType) : cItemHandler(a_ItemType)
@ -39,7 +40,11 @@ public:
virtual bool CanHarvestBlock(BLOCKTYPE a_BlockType) override virtual bool CanHarvestBlock(BLOCKTYPE a_BlockType) override
{ {
return (a_BlockType == E_BLOCK_SNOW); if (a_BlockType == E_BLOCK_SNOW)
{
return true;
}
return super::CanHarvestBlock(a_BlockType);
} }
virtual bool CanRepairWithRawMaterial(short a_ItemType) override virtual bool CanRepairWithRawMaterial(short a_ItemType) override

View File

@ -22,7 +22,11 @@ public:
virtual bool CanHarvestBlock(BLOCKTYPE a_BlockType) override virtual bool CanHarvestBlock(BLOCKTYPE a_BlockType) override
{ {
return (a_BlockType == E_BLOCK_COBWEB); if (a_BlockType == E_BLOCK_COBWEB)
{
return true;
}
return super::CanHarvestBlock(a_BlockType);
} }

View File

@ -15,7 +15,7 @@ class cBat :
public: public:
cBat(void); cBat(void);
CLASS_PROTODEF(cBat); CLASS_PROTODEF(cBat)
bool IsHanging(void) const {return false; } bool IsHanging(void) const {return false; }
} ; } ;

View File

@ -15,7 +15,7 @@ class cBlaze :
public: public:
cBlaze(void); cBlaze(void);
CLASS_PROTODEF(cBlaze); CLASS_PROTODEF(cBlaze)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void Attack(float a_Dt) override; virtual void Attack(float a_Dt) override;

View File

@ -14,7 +14,7 @@ class cCaveSpider :
public: public:
cCaveSpider(void); cCaveSpider(void);
CLASS_PROTODEF(cCaveSpider); CLASS_PROTODEF(cCaveSpider)
virtual void Tick(float a_Dt, cChunk & a_Chunk) override; virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
virtual void Attack(float a_Dt) override; virtual void Attack(float a_Dt) override;

View File

@ -14,7 +14,7 @@ class cChicken :
public: public:
cChicken(void); cChicken(void);
CLASS_PROTODEF(cChicken); CLASS_PROTODEF(cChicken)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void Tick(float a_Dt, cChunk & a_Chunk) override; virtual void Tick(float a_Dt, cChunk & a_Chunk) override;

View File

@ -15,7 +15,7 @@ class cCow :
public: public:
cCow(); cCow();
CLASS_PROTODEF(cCow); CLASS_PROTODEF(cCow)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void OnRightClicked(cPlayer & a_Player) override; virtual void OnRightClicked(cPlayer & a_Player) override;

View File

@ -15,7 +15,7 @@ class cCreeper :
public: public:
cCreeper(void); cCreeper(void);
CLASS_PROTODEF(cCreeper); CLASS_PROTODEF(cCreeper)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override; virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;

View File

@ -15,7 +15,7 @@ class cEnderDragon :
public: public:
cEnderDragon(void); cEnderDragon(void);
CLASS_PROTODEF(cEnderDragon); CLASS_PROTODEF(cEnderDragon)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
} ; } ;

View File

@ -15,7 +15,7 @@ class cEnderman :
public: public:
cEnderman(void); cEnderman(void);
CLASS_PROTODEF(cEnderman); CLASS_PROTODEF(cEnderman)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;

View File

@ -15,7 +15,7 @@ class cGhast :
public: public:
cGhast(void); cGhast(void);
CLASS_PROTODEF(cGhast); CLASS_PROTODEF(cGhast)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void Attack(float a_Dt) override; virtual void Attack(float a_Dt) override;

View File

@ -15,7 +15,7 @@ class cGiant :
public: public:
cGiant(void); cGiant(void);
CLASS_PROTODEF(cGiant); CLASS_PROTODEF(cGiant)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
} ; } ;

View File

@ -15,7 +15,7 @@ class cHorse :
public: public:
cHorse(int Type, int Color, int Style, int TameTimes); cHorse(int Type, int Color, int Style, int TameTimes);
CLASS_PROTODEF(cHorse); CLASS_PROTODEF(cHorse)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void Tick(float a_Dt, cChunk & a_Chunk) override; virtual void Tick(float a_Dt, cChunk & a_Chunk) override;

View File

@ -15,7 +15,7 @@ class cIronGolem :
public: public:
cIronGolem(void); cIronGolem(void);
CLASS_PROTODEF(cIronGolem); CLASS_PROTODEF(cIronGolem)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;

View File

@ -15,7 +15,7 @@ public:
/// Creates a MagmaCube of the specified size; size is 1 .. 3, with 1 being the smallest /// Creates a MagmaCube of the specified size; size is 1 .. 3, with 1 being the smallest
cMagmaCube(int a_Size); cMagmaCube(int a_Size);
CLASS_PROTODEF(cMagmaCube); CLASS_PROTODEF(cMagmaCube)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
int GetSize(void) const { return m_Size; } int GetSize(void) const { return m_Size; }

View File

@ -82,7 +82,7 @@ public:
*/ */
cMonster(const AString & a_ConfigName, eType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height); cMonster(const AString & a_ConfigName, eType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height);
CLASS_PROTODEF(cMonster); CLASS_PROTODEF(cMonster)
virtual void SpawnOn(cClientHandle & a_ClientHandle) override; virtual void SpawnOn(cClientHandle & a_ClientHandle) override;

View File

@ -15,7 +15,7 @@ class cMooshroom :
public: public:
cMooshroom(void); cMooshroom(void);
CLASS_PROTODEF(cMooshroom); CLASS_PROTODEF(cMooshroom)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void OnRightClicked(cPlayer & a_Player) override; virtual void OnRightClicked(cPlayer & a_Player) override;

View File

@ -18,7 +18,7 @@ public:
{ {
} }
CLASS_PROTODEF(cOcelot); CLASS_PROTODEF(cOcelot)
} ; } ;

View File

@ -15,7 +15,7 @@ class cPig :
public: public:
cPig(void); cPig(void);
CLASS_PROTODEF(cPig); CLASS_PROTODEF(cPig)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void OnRightClicked(cPlayer & a_Player) override; virtual void OnRightClicked(cPlayer & a_Player) override;

View File

@ -20,7 +20,7 @@ public:
with the GenerateNaturalRandomColor() function. */ with the GenerateNaturalRandomColor() function. */
cSheep(int a_Color = -1); cSheep(int a_Color = -1);
CLASS_PROTODEF(cSheep); CLASS_PROTODEF(cSheep)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void OnRightClicked(cPlayer & a_Player) override; virtual void OnRightClicked(cPlayer & a_Player) override;

View File

@ -18,7 +18,7 @@ public:
{ {
} }
CLASS_PROTODEF(cSilverfish); CLASS_PROTODEF(cSilverfish)
} ; } ;

View File

@ -15,7 +15,7 @@ class cSkeleton :
public: public:
cSkeleton(bool IsWither); cSkeleton(bool IsWither);
CLASS_PROTODEF(cSkeleton); CLASS_PROTODEF(cSkeleton)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void MoveToPosition(const Vector3d & a_Position) override; virtual void MoveToPosition(const Vector3d & a_Position) override;
@ -24,7 +24,7 @@ public:
virtual bool IsUndead(void) override { return true; } virtual bool IsUndead(void) override { return true; }
bool IsWither(void) const { return m_bIsWither; }; bool IsWither(void) const { return m_bIsWither; }
private: private:

View File

@ -16,7 +16,7 @@ public:
/** Creates a slime of the specified size; size can be 1, 2 or 4, with 1 is the smallest and 4 is the tallest. */ /** Creates a slime of the specified size; size can be 1, 2 or 4, with 1 is the smallest and 4 is the tallest. */
cSlime(int a_Size); cSlime(int a_Size);
CLASS_PROTODEF(cSlime); CLASS_PROTODEF(cSlime)
// cAggressiveMonster overrides: // cAggressiveMonster overrides:
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;

View File

@ -15,7 +15,7 @@ class cSnowGolem :
public: public:
cSnowGolem(void); cSnowGolem(void);
CLASS_PROTODEF(cSnowGolem); CLASS_PROTODEF(cSnowGolem)
virtual void Tick(float a_Dt, cChunk & a_Chunk) override; virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;

View File

@ -15,7 +15,7 @@ class cSpider :
public: public:
cSpider(void); cSpider(void);
CLASS_PROTODEF(cSpider); CLASS_PROTODEF(cSpider)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
} ; } ;

View File

@ -17,7 +17,7 @@ public:
virtual void Tick(float a_Dt, cChunk & a_Chunk) override; virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
CLASS_PROTODEF(cSquid); CLASS_PROTODEF(cSquid)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;

View File

@ -27,7 +27,7 @@ public:
cVillager(eVillagerType VillagerType); cVillager(eVillagerType VillagerType);
CLASS_PROTODEF(cVillager); CLASS_PROTODEF(cVillager)
// cEntity overrides // cEntity overrides
virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override; virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;

View File

@ -16,7 +16,7 @@ class cWitch :
public: public:
cWitch(); cWitch();
CLASS_PROTODEF(cWitch); CLASS_PROTODEF(cWitch)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;

View File

@ -15,7 +15,7 @@ class cWither :
public: public:
cWither(void); cWither(void);
CLASS_PROTODEF(cWither); CLASS_PROTODEF(cWither)
unsigned int GetWitherInvulnerableTicks(void) const { return m_WitherInvulnerableTicks; } unsigned int GetWitherInvulnerableTicks(void) const { return m_WitherInvulnerableTicks; }

View File

@ -16,7 +16,7 @@ class cWolf :
public: public:
cWolf(void); cWolf(void);
CLASS_PROTODEF(cWolf); CLASS_PROTODEF(cWolf)
virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override; virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;
virtual void OnRightClicked(cPlayer & a_Player) override; virtual void OnRightClicked(cPlayer & a_Player) override;

View File

@ -14,7 +14,7 @@ class cZombie :
public: public:
cZombie(bool a_IsVillagerZombie); cZombie(bool a_IsVillagerZombie);
CLASS_PROTODEF(cZombie); CLASS_PROTODEF(cZombie)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void MoveToPosition(const Vector3d & a_Position) override; virtual void MoveToPosition(const Vector3d & a_Position) override;

View File

@ -14,7 +14,7 @@ class cZombiePigman :
public: public:
cZombiePigman(void); cZombiePigman(void);
CLASS_PROTODEF(cZombiePigman); CLASS_PROTODEF(cZombiePigman)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void KilledBy(TakeDamageInfo & a_TDI) override; virtual void KilledBy(TakeDamageInfo & a_TDI) override;

View File

@ -26,14 +26,14 @@ struct cQueueFuncs
public: public:
/// Called when an Item is deleted from the queue without being returned /// Called when an Item is deleted from the queue without being returned
static void Delete(T) {}; static void Delete(T) {}
/// Called when an Item is inserted with EnqueueItemIfNotPresent and there is another equal value already inserted /// Called when an Item is inserted with EnqueueItemIfNotPresent and there is another equal value already inserted
static void Combine(T & a_existing, const T & a_new) static void Combine(T & a_existing, const T & a_new)
{ {
UNUSED(a_existing); UNUSED(a_existing);
UNUSED(a_new); UNUSED(a_new);
}; }
}; };

View File

@ -138,7 +138,7 @@ protected:
virtual void SendData(const char * a_Data, size_t a_Size) = 0; virtual void SendData(const char * a_Data, size_t a_Size) = 0;
/// Called after writing each packet, enables descendants to flush their buffers /// Called after writing each packet, enables descendants to flush their buffers
virtual void Flush(void) {}; virtual void Flush(void) {}
// Helpers for writing partial packet data, write using SendData() // Helpers for writing partial packet data, write using SendData()
void WriteByte(Byte a_Value) void WriteByte(Byte a_Value)

View File

@ -90,7 +90,7 @@ public:
virtual void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ) override; virtual void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ) override;
virtual void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay) override; virtual void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay) override;
virtual void SendUnloadChunk (int a_ChunkX, int a_ChunkZ) override; virtual void SendUnloadChunk (int a_ChunkX, int a_ChunkZ) override;
virtual void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity) override {}; virtual void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity) override {}
virtual void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) override; virtual void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) override;
virtual void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) override; virtual void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) override;
virtual void SendWeather (eWeather a_Weather) override; virtual void SendWeather (eWeather a_Weather) override;

115
src/SetChunkData.cpp Normal file
View File

@ -0,0 +1,115 @@
// SetChunkData.cpp
// Implements the cSetChunkData class used for sending loaded / generated chunk
#include "Globals.h"
#include "SetChunkData.h"
cSetChunkData::cSetChunkData(int a_ChunkX, int a_ChunkZ, bool a_ShouldMarkDirty) :
m_ChunkX(a_ChunkX),
m_ChunkZ(a_ChunkZ),
m_ShouldMarkDirty(a_ShouldMarkDirty)
{
}
cSetChunkData::cSetChunkData(
int a_ChunkX, int a_ChunkZ,
const BLOCKTYPE * a_BlockTypes,
const NIBBLETYPE * a_BlockMetas,
const NIBBLETYPE * a_BlockLight,
const NIBBLETYPE * a_SkyLight,
const cChunkDef::HeightMap * a_HeightMap,
const cChunkDef::BiomeMap * a_Biomes,
cEntityList & a_Entities,
cBlockEntityList & a_BlockEntities,
bool a_ShouldMarkDirty
) :
m_ChunkX(a_ChunkX),
m_ChunkZ(a_ChunkZ),
m_ShouldMarkDirty(a_ShouldMarkDirty)
{
// Check the params' validity:
ASSERT(a_BlockTypes != NULL);
ASSERT(a_BlockMetas != NULL);
ASSERT(a_Biomes != NULL);
// Copy block types and metas:
memcpy(m_BlockTypes, a_BlockTypes, sizeof(cChunkDef::BlockTypes));
memcpy(m_BlockMetas, a_BlockMetas, sizeof(cChunkDef::BlockNibbles));
// Copy lights, if both given:
if ((a_BlockLight != NULL) && (a_SkyLight != NULL))
{
memcpy(m_BlockLight, a_BlockLight, sizeof(m_BlockLight));
memcpy(m_SkyLight, a_SkyLight, sizeof(m_SkyLight));
m_IsLightValid = true;
}
else
{
m_IsLightValid = false;
}
// Copy the heightmap, if available:
if (a_HeightMap != NULL)
{
memcpy(m_HeightMap, a_HeightMap, sizeof(m_HeightMap));
m_IsHeightMapValid = true;
}
else
{
m_IsHeightMapValid = false;
}
// Copy biomes, if available:
if (a_Biomes != NULL)
{
memcpy(m_Biomes, a_Biomes, sizeof(m_Biomes));
m_AreBiomesValid = true;
}
else
{
m_AreBiomesValid = false;
}
// Move entities and blockentities:
std::swap(m_Entities, a_Entities);
std::swap(m_BlockEntities, a_BlockEntities);
}
void cSetChunkData::CalculateHeightMap(void)
{
for (int x = 0; x < cChunkDef::Width; x++)
{
for (int z = 0; z < cChunkDef::Width; z++)
{
for (int y = cChunkDef::Height - 1; y > -1; y--)
{
int index = cChunkDef::MakeIndexNoCheck(x, y, z);
if (m_BlockTypes[index] != E_BLOCK_AIR)
{
m_HeightMap[x + z * cChunkDef::Width] = (HEIGHTTYPE)y;
break;
}
} // for y
} // for z
} // for x
m_IsHeightMapValid = true;
}

Some files were not shown because too many files have changed in this diff Show More