Merge branch 'master' into Inventory
This commit is contained in:
commit
ef4d68adfd
2
.gitignore
vendored
2
.gitignore
vendored
@ -15,6 +15,7 @@ cloc.xsl
|
||||
*.suo
|
||||
/EveryNight.cmd
|
||||
/UploadLuaAPI.cmd
|
||||
AllFiles.lst
|
||||
|
||||
# IDE Stuff
|
||||
## Sublime Text
|
||||
@ -65,6 +66,7 @@ lib/tolua++/tolua
|
||||
src/Bindings/Bindings.*
|
||||
src/Bindings/BindingDependecies.txt
|
||||
MCServer.dir/
|
||||
src/AllFiles.lst
|
||||
|
||||
#win32 cmake stuff
|
||||
*.vcxproj
|
||||
|
@ -28,5 +28,6 @@ UltraCoderRU
|
||||
worktycho
|
||||
xoft
|
||||
Yeeeeezus (Donated AlchemistVillage prefabs)
|
||||
Howaner
|
||||
|
||||
Please add yourself to this list if you contribute to MCServer.
|
||||
|
@ -1155,6 +1155,7 @@ These ItemGrids are available in the API and can be manipulated by the plugins,
|
||||
HasItems = { Params = "{{cItem|cItem}}", Return = "bool", Notes = "Returns true if there are at least as many items of the specified type as in the parameter" },
|
||||
HowManyCanFit = { Params = "{{cItem|cItem}}", Return = "number", Notes = "Returns the number of the specified items that can fit in the storage, including empty slots" },
|
||||
HowManyItems = { Params = "{{cItem|cItem}}", Return = "number", Notes = "Returns the number of the specified items that are currently stored" },
|
||||
RemoveItem = { Params = "{{cItem}}", Return = "number", Notes = "Removes the specified item from the inventory, as many as possible, up to the item's m_ItemCount. Returns the number of items that were removed." },
|
||||
RemoveOneEquippedItem = { Params = "", Return = "", Notes = "Removes one item from the hotbar's currently selected slot" },
|
||||
SetArmorSlot = { Params = "ArmorSlotNum, {{cItem|cItem}}", Return = "", Notes = "Sets the specified armor slot contents" },
|
||||
SetEquippedSlotNum = { Params = "EquippedSlotNum", Return = "", Notes = "Sets the currently selected hotbar slot number" },
|
||||
@ -1384,6 +1385,7 @@ local Item5 = cItem(E_ITEM_DIAMOND_CHESTPLATE, 1, 0, "thorns=1;unbreaking=3");
|
||||
{ Params = "SlotNum", Return = "bool", Notes = "Returns true if the specified slot is empty, or an invalid slot is specified" },
|
||||
{ Params = "X, Y", Return = "bool", Notes = "Returns true if the specified slot is empty, or an invalid slot is specified" },
|
||||
},
|
||||
RemoveItem = { Params = "{{cItem}}", Return = "number", Notes = "Removes the specified item from the grid, as many as possible, up to the item's m_ItemCount. Returns the number of items that were removed." },
|
||||
RemoveOneItem =
|
||||
{
|
||||
{ Params = "SlotNum", Return = "{{cItem|cItem}}", Notes = "Removes one item from the stack in the specified slot and returns it as a single cItem. Empty slots are skipped and an empty item is returned" },
|
||||
|
@ -2,7 +2,7 @@ return
|
||||
{
|
||||
HOOK_PLAYER_USED_BLOCK =
|
||||
{
|
||||
CalledWhen = "A player has just used a block (chest, furnace…). Notification only.",
|
||||
CalledWhen = "A player has just used a block (chest, furnace...). Notification only.",
|
||||
DefaultFnName = "OnPlayerUsedBlock", -- also used as pagename
|
||||
Desc = [[
|
||||
This hook is called after a {{cPlayer|player}} has right-clicked a block that can be used, such as a
|
||||
|
@ -60,9 +60,10 @@ function Initialize(Plugin)
|
||||
PM:BindCommand("/ff", "debuggers", HandleFurnaceFuel, "- Shows how long the currently held item would burn in a furnace");
|
||||
PM:BindCommand("/sched", "debuggers", HandleSched, "- Schedules a simple countdown using cWorld:ScheduleTask()");
|
||||
PM:BindCommand("/cs", "debuggers", HandleChunkStay, "- Tests the ChunkStay Lua integration for the specified chunk coords");
|
||||
PM:BindCommand("/compo", "debuggers", HandleCompo, "- Tests the cCompositeChat bindings")
|
||||
PM:BindCommand("/sb", "debuggers", HandleSetBiome, "- Sets the biome around you to the specified one")
|
||||
PM:BindCommand("/wesel", "debuggers", HandleWESel, "- Expands the current WE selection by 1 block in X/Z")
|
||||
PM:BindCommand("/compo", "debuggers", HandleCompo, "- Tests the cCompositeChat bindings");
|
||||
PM:BindCommand("/sb", "debuggers", HandleSetBiome, "- Sets the biome around you to the specified one");
|
||||
PM:BindCommand("/wesel", "debuggers", HandleWESel, "- Expands the current WE selection by 1 block in X/Z");
|
||||
PM:BindCommand("/rmitem", "debuggers", HandleRMItem, "- Remove the specified item from the inventory.");
|
||||
|
||||
Plugin:AddWebTab("Debuggers", HandleRequest_Debuggers)
|
||||
Plugin:AddWebTab("StressTest", HandleRequest_StressTest)
|
||||
@ -533,7 +534,7 @@ function OnTakeDamage(Receiver, TDI)
|
||||
-- Receiver is cPawn
|
||||
-- TDI is TakeDamageInfo
|
||||
|
||||
LOG(Receiver:GetClass() .. " was dealt " .. DamageTypeToString(TDI.DamageType) .. " damage: Raw " .. TDI.RawDamage .. ", Final " .. TDI.FinalDamage .. " (" .. (TDI.RawDamage - TDI.FinalDamage) .. " covered by armor)");
|
||||
-- LOG(Receiver:GetClass() .. " was dealt " .. DamageTypeToString(TDI.DamageType) .. " damage: Raw " .. TDI.RawDamage .. ", Final " .. TDI.FinalDamage .. " (" .. (TDI.RawDamage - TDI.FinalDamage) .. " covered by armor)");
|
||||
return false;
|
||||
end
|
||||
|
||||
@ -1105,6 +1106,41 @@ end
|
||||
|
||||
|
||||
|
||||
function HandleRMItem(a_Split, a_Player)
|
||||
-- Check params:
|
||||
if (a_Split[2] == nil) then
|
||||
a_Player:SendMessage("Usage: /rmitem <Item> [Count]")
|
||||
return true
|
||||
end
|
||||
|
||||
-- Parse the item type:
|
||||
local Item = cItem()
|
||||
if (not StringToItem(a_Split[2], Item)) then
|
||||
a_Player:SendMessageFailure(a_Split[2] .. " isn't a valid item")
|
||||
return true
|
||||
end
|
||||
|
||||
-- Parse the optional item count
|
||||
if (a_Split[3] ~= nil) then
|
||||
local Count = tonumber(a_Split[3])
|
||||
if (Count == nil) then
|
||||
a_Player:SendMessageFailure(a_Split[3] .. " isn't a valid number")
|
||||
return true
|
||||
end
|
||||
|
||||
Item.m_ItemCount = Count
|
||||
end
|
||||
|
||||
-- Remove the item:
|
||||
local NumRemovedItems = a_Player:GetInventory():RemoveItem(Item)
|
||||
a_Player:SendMessageSuccess("Removed " .. NumRemovedItems .. " Items!")
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function HandleRequest_Debuggers(a_Request)
|
||||
local FolderContents = cFile:GetFolderContents("./");
|
||||
return "<p>The following objects have been returned by cFile:GetFolderContents():<ul><li>" .. table.concat(FolderContents, "</li><li>") .. "</li></ul></p>";
|
||||
|
@ -5,7 +5,7 @@ MCServer is a Minecraft server that is written in C++ and designed to be efficie
|
||||
|
||||
MCServer can run on PCs, Macs, and *nix. This includes android phones and tablets as well as Raspberry Pis.
|
||||
|
||||
We currently support the protocol from Minecraft 1.2 all the way up to Minecraft 1.7.9.
|
||||
We currently support the protocol from Minecraft 1.2 all the way up to Minecraft 1.7.10.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
@ -224,14 +224,14 @@ macro(set_exe_flags)
|
||||
# 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("-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=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=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=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()
|
||||
|
||||
|
@ -240,7 +240,7 @@ template <typename Type> class cItemCallback
|
||||
public:
|
||||
/// 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 ~cItemCallback() {};
|
||||
virtual ~cItemCallback() {}
|
||||
} ;
|
||||
|
||||
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 784b04ff9afd5faeaeb15c3fa159ff98adf55182
|
||||
Subproject commit 1ed82759c68f92c4acc7e3f33b850cf9f01c8aba
|
135
src/Bindings/CMakeLists.txt
Normal file
135
src/Bindings/CMakeLists.txt
Normal file
@ -0,0 +1,135 @@
|
||||
cmake_minimum_required (VERSION 2.6)
|
||||
project (MCServer)
|
||||
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/../")
|
||||
include_directories (".")
|
||||
|
||||
SET (SRCS
|
||||
Bindings.cpp
|
||||
DeprecatedBindings.cpp
|
||||
LuaChunkStay.cpp
|
||||
LuaState.cpp
|
||||
LuaWindow.cpp
|
||||
ManualBindings.cpp
|
||||
Plugin.cpp
|
||||
PluginLua.cpp
|
||||
PluginManager.cpp
|
||||
WebPlugin.cpp
|
||||
)
|
||||
|
||||
SET (HDRS
|
||||
Bindings.h
|
||||
DeprecatedBindings.h
|
||||
LuaChunkStay.h
|
||||
LuaFunctions.h
|
||||
LuaState.h
|
||||
LuaWindow.h
|
||||
ManualBindings.h
|
||||
Plugin.h
|
||||
PluginLua.h
|
||||
PluginManager.h
|
||||
WebPlugin.h
|
||||
tolua++.h
|
||||
)
|
||||
|
||||
# List all the files that are generated as part of the Bindings build process
|
||||
set (BINDING_OUTPUTS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Bindings.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Bindings.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/LuaState_Call.inc
|
||||
)
|
||||
|
||||
set(BINDING_DEPENDENCIES
|
||||
tolua
|
||||
../Bindings/virtual_method_hooks.lua
|
||||
../Bindings/AllToLua.pkg
|
||||
../Bindings/gen_LuaState_Call.lua
|
||||
../Bindings/LuaFunctions.h
|
||||
../Bindings/LuaState_Call.inc
|
||||
../Bindings/LuaWindow.h
|
||||
../Bindings/Plugin.h
|
||||
../Bindings/PluginLua.h
|
||||
../Bindings/PluginManager.h
|
||||
../Bindings/WebPlugin.h
|
||||
../BiomeDef.h
|
||||
../BlockArea.h
|
||||
../BlockEntities/BlockEntity.h
|
||||
../BlockEntities/BlockEntityWithItems.h
|
||||
../BlockEntities/ChestEntity.h
|
||||
../BlockEntities/DispenserEntity.h
|
||||
../BlockEntities/DropSpenserEntity.h
|
||||
../BlockEntities/DropperEntity.h
|
||||
../BlockEntities/FurnaceEntity.h
|
||||
../BlockEntities/HopperEntity.h
|
||||
../BlockEntities/JukeboxEntity.h
|
||||
../BlockEntities/NoteEntity.h
|
||||
../BlockEntities/SignEntity.h
|
||||
../BlockEntities/MobHeadEntity.h
|
||||
../BlockEntities/FlowerPotEntity.h
|
||||
../BlockID.h
|
||||
../BoundingBox.h
|
||||
../ChatColor.h
|
||||
../ChunkDef.h
|
||||
../ClientHandle.h
|
||||
../CraftingRecipes.h
|
||||
../Cuboid.h
|
||||
../Defines.h
|
||||
../Enchantments.h
|
||||
../Entities/EntityEffect.h
|
||||
../Entities/Entity.h
|
||||
../Entities/Floater.h
|
||||
../Entities/Pawn.h
|
||||
../Entities/Painting.h
|
||||
../Entities/Pickup.h
|
||||
../Entities/Player.h
|
||||
../Entities/ProjectileEntity.h
|
||||
../Entities/ArrowEntity.h
|
||||
../Entities/ThrownEggEntity.h
|
||||
../Entities/ThrownEnderPearlEntity.h
|
||||
../Entities/ExpBottleEntity.h
|
||||
../Entities/ThrownSnowballEntity.h
|
||||
../Entities/FireChargeEntity.h
|
||||
../Entities/FireworkEntity.h
|
||||
../Entities/GhastFireballEntity.h
|
||||
../Entities/TNTEntity.h
|
||||
../Entities/ExpOrb.h
|
||||
../Entities/HangingEntity.h
|
||||
../Entities/ItemFrame.h
|
||||
../Generating/ChunkDesc.h
|
||||
../Group.h
|
||||
../Inventory.h
|
||||
../Item.h
|
||||
../ItemGrid.h
|
||||
../Mobs/Monster.h
|
||||
../OSSupport/File.h
|
||||
../Root.h
|
||||
../Server.h
|
||||
../StringUtils.h
|
||||
../Tracer.h
|
||||
../UI/Window.h
|
||||
../Vector3.h
|
||||
../WebAdmin.h
|
||||
../World.h
|
||||
)
|
||||
|
||||
if (NOT MSVC)
|
||||
ADD_CUSTOM_COMMAND(
|
||||
# add any new generated bindings here
|
||||
OUTPUT ${BINDING_OUTPUTS}
|
||||
|
||||
# Regenerate bindings:
|
||||
COMMAND tolua -L virtual_method_hooks.lua -o Bindings.cpp -H Bindings.h AllToLua.pkg
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
|
||||
# add any new generation dependencies here
|
||||
DEPENDS ${BINDING_DEPENDENCIES}
|
||||
)
|
||||
endif ()
|
||||
set_source_files_properties(Bindings/Bindings.cpp PROPERTIES GENERATED TRUE)
|
||||
set_source_files_properties(Bindings/Bindings.h PROPERTIES GENERATED TRUE)
|
||||
|
||||
if(NOT MSVC)
|
||||
add_library(Bindings ${SRCS} ${HDRS})
|
||||
|
||||
target_link_libraries(Bindings lua sqlite tolualib polarssl)
|
||||
endif()
|
@ -175,32 +175,6 @@ static int tolua_get_AllToLua_g_BlockIsSnowable(lua_State* tolua_S)
|
||||
|
||||
|
||||
|
||||
/* get function: g_BlockRequiresSpecialTool */
|
||||
#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockRequiresSpecialTool
|
||||
static int tolua_get_AllToLua_g_BlockRequiresSpecialTool(lua_State* tolua_S)
|
||||
{
|
||||
int BlockType;
|
||||
#ifndef TOLUA_RELEASE
|
||||
{
|
||||
tolua_Error tolua_err;
|
||||
if (!tolua_isnumber(tolua_S,2,0,&tolua_err))
|
||||
tolua_error(tolua_S,"#vinvalid type in array indexing.",&tolua_err);
|
||||
}
|
||||
#endif
|
||||
BlockType = (int)tolua_tonumber(tolua_S, 2, 0);
|
||||
if ((BlockType < 0) || (BlockType > E_BLOCK_MAX_TYPE_ID))
|
||||
{
|
||||
tolua_error(tolua_S, "array indexing out of range.", NULL);
|
||||
}
|
||||
tolua_pushboolean(tolua_S, cBlockInfo::RequiresSpecialTool((BLOCKTYPE)BlockType));
|
||||
return 1;
|
||||
}
|
||||
#endif // #ifndef TOLUA_DISABLE
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* get function: g_BlockIsSolid */
|
||||
#ifndef TOLUA_DISABLE_tolua_get_AllToLua_g_BlockIsSolid
|
||||
static int tolua_get_AllToLua_g_BlockIsSolid(lua_State* tolua_S)
|
||||
@ -263,7 +237,6 @@ void DeprecatedBindings::Bind(lua_State * tolua_S)
|
||||
tolua_array(tolua_S, "g_BlockOneHitDig", tolua_get_AllToLua_g_BlockOneHitDig, NULL);
|
||||
tolua_array(tolua_S, "g_BlockPistonBreakable", tolua_get_AllToLua_g_BlockPistonBreakable, NULL);
|
||||
tolua_array(tolua_S, "g_BlockIsSnowable", tolua_get_AllToLua_g_BlockIsSnowable, NULL);
|
||||
tolua_array(tolua_S, "g_BlockRequiresSpecialTool", tolua_get_AllToLua_g_BlockRequiresSpecialTool, NULL);
|
||||
tolua_array(tolua_S, "g_BlockIsSolid", tolua_get_AllToLua_g_BlockIsSolid, NULL);
|
||||
tolua_array(tolua_S, "g_BlockFullyOccupiesVoxel", tolua_get_AllToLua_g_BlockFullyOccupiesVoxel, NULL);
|
||||
|
||||
|
@ -1336,7 +1336,6 @@ void cLuaState::LogStack(lua_State * a_LuaState, const char * a_Header)
|
||||
{
|
||||
UNUSED(a_Header); // The param seems unused when compiling for release, so the compiler warns
|
||||
|
||||
|
||||
// Format string consisting only of %s is used to appease the compiler
|
||||
LOGD("%s", (a_Header != NULL) ? a_Header : "Lua C API Stack contents:");
|
||||
for (int i = lua_gettop(a_LuaState); i > 0; i--)
|
||||
|
@ -656,7 +656,7 @@ template<
|
||||
static int tolua_ForEach(lua_State * tolua_S)
|
||||
{
|
||||
int NumArgs = lua_gettop(tolua_S) - 1; /* This includes 'self' */
|
||||
if( NumArgs != 1 && NumArgs != 2)
|
||||
if ((NumArgs != 1) && (NumArgs != 2))
|
||||
{
|
||||
return lua_do_error(tolua_S, "Error in function call '#funcname#': Requires 1 or 2 arguments, got %i", NumArgs);
|
||||
}
|
||||
@ -958,7 +958,7 @@ tolua_lerror:
|
||||
static int tolua_cWorld_TryGetHeight(lua_State * tolua_S)
|
||||
{
|
||||
// Exported manually, because tolua would require the out-only param a_Height to be used when calling
|
||||
// Takes (a_World,) a_BlockX, a_BlockZ
|
||||
// Takes a_World, a_BlockX, a_BlockZ
|
||||
// Returns Height, IsValid
|
||||
#ifndef TOLUA_RELEASE
|
||||
tolua_Error tolua_err;
|
||||
@ -1947,7 +1947,7 @@ static int tolua_cPluginLua_AddWebTab(lua_State * tolua_S)
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGERROR("ERROR: cPluginLua:AddWebTab invalid function reference in 2nd argument (Title: \"%s\")", Title.c_str() );
|
||||
LOGWARNING("cPluginLua:AddWebTab: invalid function reference in 2nd argument (Title: \"%s\")", Title.c_str());
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -115,10 +115,10 @@ public:
|
||||
virtual bool HandleConsoleCommand(const AStringVector & a_Split, cCommandOutputCallback & a_Output) = 0;
|
||||
|
||||
/// 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
|
||||
virtual void ClearConsoleCommands(void) {} ;
|
||||
virtual void ClearConsoleCommands(void) {}
|
||||
|
||||
// tolua_begin
|
||||
const AString & GetName(void) const { return m_Name; }
|
||||
|
@ -10,7 +10,8 @@
|
||||
|
||||
|
||||
// The "map" used for biome <-> string conversions:
|
||||
static struct {
|
||||
static struct
|
||||
{
|
||||
EMCSBiome m_Biome;
|
||||
const char * m_String;
|
||||
} g_BiomeMap[] =
|
||||
|
@ -38,9 +38,9 @@ protected:
|
||||
public:
|
||||
// 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)
|
||||
{
|
||||
|
@ -4,9 +4,41 @@ project (MCServer)
|
||||
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/../")
|
||||
|
||||
file(GLOB SOURCE
|
||||
"*.cpp"
|
||||
"*.h"
|
||||
)
|
||||
SET (SRCS
|
||||
BeaconEntity.cpp
|
||||
BlockEntity.cpp
|
||||
ChestEntity.cpp
|
||||
CommandBlockEntity.cpp
|
||||
DispenserEntity.cpp
|
||||
DropSpenserEntity.cpp
|
||||
DropperEntity.cpp
|
||||
EnderChestEntity.cpp
|
||||
FlowerPotEntity.cpp
|
||||
FurnaceEntity.cpp
|
||||
HopperEntity.cpp
|
||||
JukeboxEntity.cpp
|
||||
MobHeadEntity.cpp
|
||||
NoteEntity.cpp
|
||||
SignEntity.cpp)
|
||||
|
||||
add_library(BlockEntities ${SOURCE})
|
||||
SET (HDRS
|
||||
BeaconEntity.h
|
||||
BlockEntity.h
|
||||
BlockEntityWithItems.h
|
||||
ChestEntity.h
|
||||
CommandBlockEntity.h
|
||||
DispenserEntity.h
|
||||
DropSpenserEntity.h
|
||||
DropperEntity.h
|
||||
EnderChestEntity.h
|
||||
FlowerPotEntity.h
|
||||
FurnaceEntity.h
|
||||
HopperEntity.h
|
||||
JukeboxEntity.h
|
||||
MobHeadEntity.h
|
||||
NoteEntity.h
|
||||
SignEntity.h)
|
||||
|
||||
if(NOT MSVC)
|
||||
add_library(BlockEntities ${SRCS} ${HDRS})
|
||||
endif()
|
||||
|
@ -27,7 +27,8 @@ class cChestEntity :
|
||||
typedef cBlockEntityWithItems super;
|
||||
|
||||
public:
|
||||
enum {
|
||||
enum
|
||||
{
|
||||
ContentsHeight = 3,
|
||||
ContentsWidth = 9,
|
||||
} ;
|
||||
|
@ -35,7 +35,8 @@ class cDropSpenserEntity :
|
||||
typedef cBlockEntityWithItems super;
|
||||
|
||||
public:
|
||||
enum {
|
||||
enum
|
||||
{
|
||||
ContentsHeight = 3,
|
||||
ContentsWidth = 3,
|
||||
} ;
|
||||
|
@ -22,7 +22,8 @@ class cHopperEntity :
|
||||
typedef cBlockEntityWithItems super;
|
||||
|
||||
public:
|
||||
enum {
|
||||
enum
|
||||
{
|
||||
ContentsHeight = 1,
|
||||
ContentsWidth = 5,
|
||||
TICKS_PER_TRANSFER = 8, ///< How many ticks at minimum between two item transfers to or from the hopper
|
||||
|
@ -58,7 +58,7 @@ public:
|
||||
static const char * GetClassStatic(void) { return "cJukeboxEntity"; }
|
||||
|
||||
virtual void UsedBy(cPlayer * a_Player) override;
|
||||
virtual void SendTo(cClientHandle &) override { };
|
||||
virtual void SendTo(cClientHandle &) override {}
|
||||
|
||||
private:
|
||||
int m_Record;
|
||||
|
@ -52,7 +52,7 @@ public:
|
||||
// tolua_end
|
||||
|
||||
virtual void UsedBy(cPlayer * a_Player) override;
|
||||
virtual void SendTo(cClientHandle &) override { };
|
||||
virtual void SendTo(cClientHandle &) override {}
|
||||
|
||||
static const char * GetClassStatic(void) { return "cNoteEntity"; }
|
||||
|
||||
|
@ -255,7 +255,8 @@ AString ItemToFullString(const cItem & a_Item)
|
||||
|
||||
int StringToMobType(const AString & a_MobString)
|
||||
{
|
||||
static struct {
|
||||
static struct
|
||||
{
|
||||
int m_MobType;
|
||||
const char * m_String;
|
||||
} MobMap [] =
|
||||
|
@ -15,7 +15,6 @@ cBlockInfo::cBlockInfo()
|
||||
, m_OneHitDig(false)
|
||||
, m_PistonBreakable(false)
|
||||
, m_IsSnowable(false)
|
||||
, m_RequiresSpecialTool(false)
|
||||
, m_IsSolid(true)
|
||||
, m_FullyOccupiesVoxel(false)
|
||||
, m_Handler(NULL)
|
||||
@ -440,51 +439,6 @@ void cBlockInfo::Initialize(cBlockInfoArray & a_Info)
|
||||
a_Info[E_BLOCK_TNT ].m_IsSnowable = true;
|
||||
a_Info[E_BLOCK_WOOL ].m_IsSnowable = true;
|
||||
|
||||
|
||||
// Blocks that don't drop without a special tool:
|
||||
a_Info[E_BLOCK_BRICK ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_CAULDRON ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_COAL_ORE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_COBBLESTONE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_COBBLESTONE_WALL ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_COBBLESTONE_STAIRS ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_COBWEB ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_DIAMOND_BLOCK ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_DIAMOND_ORE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_DOUBLE_STONE_SLAB ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_EMERALD_ORE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_END_STONE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_GOLD_BLOCK ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_GOLD_ORE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_IRON_BLOCK ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_IRON_ORE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_LAPIS_BLOCK ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_LAPIS_ORE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_LEAVES ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_MOSSY_COBBLESTONE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_NETHERRACK ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_NETHER_BRICK ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_NETHER_BRICK_STAIRS ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_OBSIDIAN ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_REDSTONE_ORE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_REDSTONE_ORE_GLOWING].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_SANDSTONE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_SANDSTONE_STAIRS ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_SNOW ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_STONE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_STONE_BRICKS ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_STONE_BRICK_STAIRS ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_STONE_PRESSURE_PLATE].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_STONE_SLAB ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_VINES ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_FURNACE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_LIT_FURNACE ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_ANVIL ].m_RequiresSpecialTool = true;
|
||||
a_Info[E_BLOCK_ENCHANTMENT_TABLE ].m_RequiresSpecialTool = true;
|
||||
|
||||
|
||||
// Nonsolid blocks:
|
||||
a_Info[E_BLOCK_ACTIVATOR_RAIL ].m_IsSolid = false;
|
||||
a_Info[E_BLOCK_AIR ].m_IsSolid = false;
|
||||
@ -496,9 +450,6 @@ void cBlockInfo::Initialize(cBlockInfoArray & a_Info)
|
||||
a_Info[E_BLOCK_CROPS ].m_IsSolid = false;
|
||||
a_Info[E_BLOCK_DANDELION ].m_IsSolid = false;
|
||||
a_Info[E_BLOCK_DETECTOR_RAIL ].m_IsSolid = false;
|
||||
a_Info[E_BLOCK_END_PORTAL ].m_IsSolid = false;
|
||||
a_Info[E_BLOCK_FENCE ].m_IsSolid = false;
|
||||
a_Info[E_BLOCK_FENCE_GATE ].m_IsSolid = false;
|
||||
a_Info[E_BLOCK_FIRE ].m_IsSolid = false;
|
||||
a_Info[E_BLOCK_FLOWER ].m_IsSolid = false;
|
||||
a_Info[E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE].m_IsSolid = false;
|
||||
@ -530,7 +481,6 @@ void cBlockInfo::Initialize(cBlockInfoArray & a_Info)
|
||||
a_Info[E_BLOCK_WATER ].m_IsSolid = false;
|
||||
a_Info[E_BLOCK_WOODEN_BUTTON ].m_IsSolid = false;
|
||||
a_Info[E_BLOCK_WOODEN_PRESSURE_PLATE].m_IsSolid = false;
|
||||
a_Info[E_BLOCK_WOODEN_SLAB ].m_IsSolid = false;
|
||||
|
||||
|
||||
// Blocks that fully occupy their voxel - used as a guide for torch placeable blocks, amongst other things:
|
||||
|
@ -39,9 +39,6 @@ public:
|
||||
/** Can this block hold snow atop? */
|
||||
bool m_IsSnowable;
|
||||
|
||||
/** Does this block require a tool to drop? */
|
||||
bool m_RequiresSpecialTool;
|
||||
|
||||
/** Is this block solid (player cannot walk through)? */
|
||||
bool m_IsSolid;
|
||||
|
||||
@ -61,7 +58,6 @@ public:
|
||||
inline static bool IsOneHitDig (BLOCKTYPE a_Type) { return Get(a_Type).m_OneHitDig; }
|
||||
inline static bool IsPistonBreakable (BLOCKTYPE a_Type) { return Get(a_Type).m_PistonBreakable; }
|
||||
inline static bool IsSnowable (BLOCKTYPE a_Type) { return Get(a_Type).m_IsSnowable; }
|
||||
inline static bool RequiresSpecialTool (BLOCKTYPE a_Type) { return Get(a_Type).m_RequiresSpecialTool; }
|
||||
inline static bool IsSolid (BLOCKTYPE a_Type) { return Get(a_Type).m_IsSolid; }
|
||||
inline static bool FullyOccupiesVoxel (BLOCKTYPE a_Type) { return Get(a_Type).m_FullyOccupiesVoxel; }
|
||||
|
||||
|
@ -19,16 +19,16 @@ public:
|
||||
}
|
||||
|
||||
|
||||
virtual void DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ) override
|
||||
virtual void DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, bool a_CanDrop, bool a_DropVerbatim) override
|
||||
{
|
||||
NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
|
||||
if (Meta & 0x8)
|
||||
{
|
||||
super::DropBlock(a_ChunkInterface, a_WorldInterface, a_BlockPluginInterface, a_Digger, a_BlockX, a_BlockY - 1, a_BlockZ);
|
||||
super::DropBlock(a_ChunkInterface, a_WorldInterface, a_BlockPluginInterface, a_Digger, a_BlockX, a_BlockY - 1, a_BlockZ, a_CanDrop, a_DropVerbatim);
|
||||
}
|
||||
else
|
||||
{
|
||||
super::DropBlock(a_ChunkInterface, a_WorldInterface, a_BlockPluginInterface, a_Digger, a_BlockX, a_BlockY, a_BlockZ);
|
||||
super::DropBlock(a_ChunkInterface, a_WorldInterface, a_BlockPluginInterface, a_Digger, a_BlockX, a_BlockY, a_BlockZ, a_CanDrop, a_DropVerbatim);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -70,7 +70,7 @@
|
||||
#include "BlockSand.h"
|
||||
#include "BlockSapling.h"
|
||||
#include "BlockSideways.h"
|
||||
#include "BlockSign.h"
|
||||
#include "BlockSignPost.h"
|
||||
#include "BlockSlab.h"
|
||||
#include "BlockSnow.h"
|
||||
#include "BlockStairs.h"
|
||||
@ -81,6 +81,7 @@
|
||||
#include "BlockTorch.h"
|
||||
#include "BlockTrapdoor.h"
|
||||
#include "BlockVine.h"
|
||||
#include "BlockWallSign.h"
|
||||
#include "BlockWorkbench.h"
|
||||
|
||||
|
||||
@ -253,7 +254,7 @@ cBlockHandler * cBlockHandler::CreateBlockHandler(BLOCKTYPE a_BlockType)
|
||||
case E_BLOCK_NEW_LOG: return new cBlockSidewaysHandler (a_BlockType);
|
||||
case E_BLOCK_NOTE_BLOCK: return new cBlockNoteHandler (a_BlockType);
|
||||
case E_BLOCK_PISTON: return new cBlockPistonHandler (a_BlockType);
|
||||
case E_BLOCK_PISTON_EXTENSION: return new cBlockPistonHeadHandler ( );
|
||||
case E_BLOCK_PISTON_EXTENSION: return new cBlockPistonHeadHandler;
|
||||
case E_BLOCK_PLANKS: return new cBlockPlanksHandler (a_BlockType);
|
||||
case E_BLOCK_POTATOES: return new cBlockCropsHandler (a_BlockType);
|
||||
case E_BLOCK_POWERED_RAIL: return new cBlockRailHandler (a_BlockType);
|
||||
@ -275,7 +276,7 @@ cBlockHandler * cBlockHandler::CreateBlockHandler(BLOCKTYPE a_BlockType)
|
||||
case E_BLOCK_SAND: return new cBlockSandHandler (a_BlockType);
|
||||
case E_BLOCK_SANDSTONE_STAIRS: return new cBlockStairsHandler (a_BlockType);
|
||||
case E_BLOCK_SAPLING: return new cBlockSaplingHandler (a_BlockType);
|
||||
case E_BLOCK_SIGN_POST: return new cBlockSignHandler (a_BlockType);
|
||||
case E_BLOCK_SIGN_POST: return new cBlockSignPostHandler (a_BlockType);
|
||||
case E_BLOCK_SNOW: return new cBlockSnowHandler (a_BlockType);
|
||||
case E_BLOCK_SPRUCE_WOOD_STAIRS: return new cBlockStairsHandler (a_BlockType);
|
||||
case E_BLOCK_STAINED_GLASS: return new cBlockGlassHandler (a_BlockType);
|
||||
@ -297,7 +298,7 @@ cBlockHandler * cBlockHandler::CreateBlockHandler(BLOCKTYPE a_BlockType)
|
||||
case E_BLOCK_TRIPWIRE: return new cBlockTripwireHandler (a_BlockType);
|
||||
case E_BLOCK_TRIPWIRE_HOOK: return new cBlockTripwireHookHandler (a_BlockType);
|
||||
case E_BLOCK_VINES: return new cBlockVineHandler (a_BlockType);
|
||||
case E_BLOCK_WALLSIGN: return new cBlockSignHandler (a_BlockType); // TODO: This needs a special handler
|
||||
case E_BLOCK_WALLSIGN: return new cBlockWallSignHandler (a_BlockType);
|
||||
case E_BLOCK_WATER: return new cBlockFluidHandler (a_BlockType);
|
||||
case E_BLOCK_WOODEN_BUTTON: return new cBlockButtonHandler (a_BlockType);
|
||||
case E_BLOCK_WOODEN_DOOR: return new cBlockDoorHandler (a_BlockType);
|
||||
@ -407,39 +408,6 @@ void cBlockHandler::NeighborChanged(cChunkInterface & a_ChunkInterface, int a_Bl
|
||||
|
||||
|
||||
|
||||
|
||||
void cBlockHandler::OnNeighborChanged(cChunkInterface & a_ChunkInterface, int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cBlockHandler::OnDigging(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer *a_Player, int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cBlockHandler::OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer *a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cBlockHandler::OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer *a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cBlockHandler::ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta)
|
||||
{
|
||||
// Setting the meta to a_BlockMeta keeps most textures. The few other blocks have to override this.
|
||||
@ -450,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;
|
||||
NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
|
||||
|
||||
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:
|
||||
a_BlockPluginInterface.CallHookBlockToPickups(a_Digger, a_BlockX, a_BlockY, a_BlockZ, m_BlockType, Meta, Pickups);
|
||||
|
@ -60,25 +60,29 @@ public:
|
||||
virtual void OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
|
||||
/// Called when a direct neighbor of this block has been changed (The position is the own position, not the neighbor position)
|
||||
virtual void OnNeighborChanged(cChunkInterface & a_ChunkInterface, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
virtual void OnNeighborChanged(cChunkInterface & a_ChunkInterface, int a_BlockX, int a_BlockY, int a_BlockZ) {}
|
||||
|
||||
/// Notifies all neighbors of the given block about a change
|
||||
static void NeighborChanged(cChunkInterface & a_ChunkInterface, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
|
||||
/// Called while the player diggs the block.
|
||||
virtual void OnDigging(cChunkInterface & cChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
virtual void OnDigging(cChunkInterface & cChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) {}
|
||||
|
||||
/// Called if the user right clicks the block and the block is useable
|
||||
virtual void OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ);
|
||||
virtual void OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) {}
|
||||
|
||||
/** Called when a Right Click to this Block is cancelled */
|
||||
virtual void OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace);
|
||||
/** Called when a right click to this block is cancelled */
|
||||
virtual void OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) {}
|
||||
|
||||
/// <summary>Called when the item is mined to convert it into pickups. Pickups may specify multiple items. Appends items to a_Pickups, preserves its original contents</summary>
|
||||
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta);
|
||||
|
||||
/// Handles the dropping of a block based on what ConvertToDrops() returns. This will not destroy the block. a_Digger is the entity causing the drop; it may be NULL
|
||||
virtual void DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
/** Handles the dropping, but not destruction, of a block based on what ConvertTo(Verbatim)Pickups() returns, including the spawning of pickups and alertion of plugins
|
||||
@param a_Digger The entity causing the drop; it may be NULL
|
||||
@param a_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
|
||||
virtual const char * GetStepSound(void);
|
||||
|
@ -40,14 +40,20 @@ public:
|
||||
{
|
||||
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)
|
||||
{
|
||||
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
|
||||
if ((a_BlockMeta & 3) == E_META_LEAVES_APPLE)
|
||||
if ((m_BlockType == E_BLOCK_LEAVES) && ((a_BlockMeta & 0x03) == E_META_LEAVES_APPLE))
|
||||
{
|
||||
if (rand.NextInt(101) == 0)
|
||||
{
|
||||
|
@ -20,8 +20,8 @@ public:
|
||||
|
||||
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
|
||||
{
|
||||
// Only the first 2 bits contain the display information, the others are for growing
|
||||
a_Pickups.push_back(cItem(E_BLOCK_SAPLING, 1, a_BlockMeta & 0x7));
|
||||
// Only the first 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 & 0x07));
|
||||
}
|
||||
|
||||
|
||||
|
@ -9,12 +9,14 @@
|
||||
|
||||
|
||||
|
||||
class cBlockSignHandler :
|
||||
class cBlockSignPostHandler :
|
||||
public cBlockHandler
|
||||
{
|
||||
typedef cBlockHandler super;
|
||||
|
||||
public:
|
||||
cBlockSignHandler(BLOCKTYPE a_BlockType)
|
||||
: cBlockHandler(a_BlockType)
|
||||
cBlockSignPostHandler(BLOCKTYPE a_BlockType) :
|
||||
super(a_BlockType)
|
||||
{
|
||||
}
|
||||
|
||||
@ -31,6 +33,17 @@ public:
|
||||
}
|
||||
|
||||
|
||||
virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
|
||||
{
|
||||
if (a_RelY <= 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return (cBlockInfo::IsSolid(a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ)));
|
||||
}
|
||||
|
||||
|
||||
static NIBBLETYPE RotationToMetaData(double a_Rotation)
|
||||
{
|
||||
a_Rotation += 180 + (180 / 16); // So it's not aligned with axis
|
||||
@ -45,23 +58,6 @@ public:
|
||||
}
|
||||
|
||||
|
||||
static NIBBLETYPE DirectionToMetaData(eBlockFace a_Direction)
|
||||
{
|
||||
switch (a_Direction)
|
||||
{
|
||||
case 0x2: return 0x2;
|
||||
case 0x3: return 0x3;
|
||||
case 0x4: return 0x4;
|
||||
case 0x5: return 0x5;
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0x2;
|
||||
}
|
||||
|
||||
|
||||
virtual void OnPlacedByPlayer(
|
||||
cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player,
|
||||
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace,
|
||||
@ -84,6 +80,7 @@ public:
|
||||
return (a_Meta + 12) & 0x0f;
|
||||
}
|
||||
|
||||
|
||||
virtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta) override
|
||||
{
|
||||
// Mirrors signs over the XY plane (North-South Mirroring)
|
@ -119,7 +119,8 @@ public:
|
||||
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, Face, true);
|
||||
BLOCKTYPE BlockInQuestion = a_ChunkInterface.GetBlock(a_BlockX, a_BlockY, a_BlockZ);
|
||||
|
||||
if ( // If on a block that can only hold a torch if torch is standing on it, return that face
|
||||
// If on a block that can only hold a torch if torch is standing on it, return that face
|
||||
if (
|
||||
((BlockInQuestion == E_BLOCK_GLASS) ||
|
||||
(BlockInQuestion == E_BLOCK_FENCE) ||
|
||||
(BlockInQuestion == E_BLOCK_NETHER_BRICK_FENCE) ||
|
||||
|
89
src/Blocks/BlockWallSign.h
Normal file
89
src/Blocks/BlockWallSign.h
Normal file
@ -0,0 +1,89 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "BlockHandler.h"
|
||||
#include "../Entities/Player.h"
|
||||
#include "Chunk.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class cBlockWallSignHandler :
|
||||
public cBlockHandler
|
||||
{
|
||||
typedef cBlockHandler super;
|
||||
|
||||
public:
|
||||
cBlockWallSignHandler(BLOCKTYPE a_BlockType) :
|
||||
super(a_BlockType)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
|
||||
{
|
||||
a_Pickups.push_back(cItem(E_ITEM_SIGN, 1, 0));
|
||||
}
|
||||
|
||||
|
||||
virtual const char * GetStepSound(void) override
|
||||
{
|
||||
return "step.wood";
|
||||
}
|
||||
|
||||
|
||||
virtual void OnPlacedByPlayer(
|
||||
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,
|
||||
BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta
|
||||
) override
|
||||
{
|
||||
a_Player->GetClientHandle()->SendEditSign(a_BlockX, a_BlockY, a_BlockZ);
|
||||
}
|
||||
|
||||
|
||||
virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
|
||||
{
|
||||
int BlockX = (a_Chunk.GetPosX() * cChunkDef::Width) + a_RelX;
|
||||
int BlockZ = (a_Chunk.GetPosZ() * cChunkDef::Width) + a_RelZ;
|
||||
GetBlockCoordsBehindTheSign(a_Chunk.GetMeta(a_RelX, a_RelY, a_RelZ), BlockX, BlockZ);
|
||||
|
||||
return (cBlockInfo::IsSolid(a_ChunkInterface.GetBlock(BlockX, a_RelY, BlockZ)));
|
||||
}
|
||||
|
||||
|
||||
static void GetBlockCoordsBehindTheSign(NIBBLETYPE a_BlockMeta, int & a_BlockX, int & a_BlockZ)
|
||||
{
|
||||
switch (a_BlockMeta)
|
||||
{
|
||||
case 2: a_BlockZ++; break;
|
||||
case 3: a_BlockZ--; break;
|
||||
case 4: a_BlockX++; break;
|
||||
case 5: a_BlockX--; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static NIBBLETYPE DirectionToMetaData(eBlockFace a_Direction)
|
||||
{
|
||||
switch (a_Direction)
|
||||
{
|
||||
case 0x2: return 0x2;
|
||||
case 0x3: return 0x3;
|
||||
case 0x4: return 0x4;
|
||||
case 0x5: return 0x5;
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0x2;
|
||||
}
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
@ -4,9 +4,99 @@ project (MCServer)
|
||||
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/../")
|
||||
|
||||
file(GLOB SOURCE
|
||||
"*.cpp"
|
||||
"*.h"
|
||||
)
|
||||
SET (SRCS
|
||||
BlockBed.cpp
|
||||
BlockDoor.cpp
|
||||
BlockHandler.cpp
|
||||
BlockPiston.cpp
|
||||
ChunkInterface.cpp)
|
||||
|
||||
add_library(Blocks ${SOURCE})
|
||||
SET (HDRS
|
||||
BlockAnvil.h
|
||||
BlockBed.h
|
||||
BlockBigFlower.h
|
||||
BlockBrewingStand.h
|
||||
BlockButton.h
|
||||
BlockCactus.h
|
||||
BlockCake.h
|
||||
BlockCarpet.h
|
||||
BlockCauldron.h
|
||||
BlockChest.h
|
||||
BlockCloth.h
|
||||
BlockCobWeb.h
|
||||
BlockCommandBlock.h
|
||||
BlockComparator.h
|
||||
BlockCrops.h
|
||||
BlockDeadBush.h
|
||||
BlockDirt.h
|
||||
BlockDoor.h
|
||||
BlockDropSpenser.h
|
||||
BlockEnchantmentTable.h
|
||||
BlockEnderchest.h
|
||||
BlockEntity.h
|
||||
BlockFarmland.h
|
||||
BlockFenceGate.h
|
||||
BlockFire.h
|
||||
BlockFlower.h
|
||||
BlockFlowerPot.h
|
||||
BlockFluid.h
|
||||
BlockFurnace.h
|
||||
BlockGlass.h
|
||||
BlockGlowstone.h
|
||||
BlockGravel.h
|
||||
BlockHandler.h
|
||||
BlockHayBale.h
|
||||
BlockHopper.h
|
||||
BlockIce.h
|
||||
BlockLadder.h
|
||||
BlockLeaves.h
|
||||
BlockLever.h
|
||||
BlockLilypad.h
|
||||
BlockMelon.h
|
||||
BlockMobHead.h
|
||||
BlockMushroom.h
|
||||
BlockMycelium.h
|
||||
BlockNetherWart.h
|
||||
BlockNewLeaves.h
|
||||
BlockNote.h
|
||||
BlockOre.h
|
||||
BlockPiston.h
|
||||
BlockPlanks.h
|
||||
BlockPluginInterface.h
|
||||
BlockPortal.h
|
||||
BlockPressurePlate.h
|
||||
BlockPumpkin.h
|
||||
BlockQuartz.h
|
||||
BlockRail.h
|
||||
BlockRedstone.h
|
||||
BlockRedstoneLamp.h
|
||||
BlockRedstoneRepeater.h
|
||||
BlockRedstoneTorch.h
|
||||
BlockSand.h
|
||||
BlockSapling.h
|
||||
BlockSideways.h
|
||||
BlockSignPost.h
|
||||
BlockSlab.h
|
||||
BlockSnow.h
|
||||
BlockStairs.h
|
||||
BlockStems.h
|
||||
BlockStone.h
|
||||
BlockSugarcane.h
|
||||
BlockTNT.h
|
||||
BlockTallGrass.h
|
||||
BlockTorch.h
|
||||
BlockTrapdoor.h
|
||||
BlockTripwire.h
|
||||
BlockTripwireHook.h
|
||||
BlockVine.h
|
||||
BlockWallSign.h
|
||||
BlockWorkbench.h
|
||||
BroadcastInterface.h
|
||||
ChunkInterface.h
|
||||
ClearMetaOnDrop.h
|
||||
MetaRotator.h
|
||||
WorldInterface.h)
|
||||
|
||||
if(NOT MSVC)
|
||||
add_library(Blocks ${SRCS} ${HDRS})
|
||||
endif()
|
||||
|
@ -5,144 +5,150 @@ include_directories (SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/../lib/")
|
||||
include_directories (SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/../lib/jsoncpp/include")
|
||||
include_directories (SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/../lib/polarssl/include")
|
||||
|
||||
set(FOLDERS OSSupport HTTPServer Items Blocks Protocol Generating PolarSSL++)
|
||||
set(FOLDERS ${FOLDERS} WorldStorage Mobs Entities Simulator UI BlockEntities Generating/Prefabs)
|
||||
set(FOLDERS
|
||||
OSSupport HTTPServer Items Blocks Protocol Generating PolarSSL++ Bindings
|
||||
WorldStorage Mobs Entities Simulator UI BlockEntities Generating/Prefabs
|
||||
)
|
||||
|
||||
set(BINDING_DEPENDECIES
|
||||
tolua
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Bindings/virtual_method_hooks.lua
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Bindings/AllToLua.pkg
|
||||
Bindings/gen_LuaState_Call.lua
|
||||
Bindings/LuaFunctions.h
|
||||
Bindings/LuaWindow.h
|
||||
Bindings/Plugin.h
|
||||
Bindings/PluginLua.h
|
||||
Bindings/PluginManager.h
|
||||
Bindings/WebPlugin.h
|
||||
SET (SRCS
|
||||
BiomeDef.cpp
|
||||
BlockArea.cpp
|
||||
BlockID.cpp
|
||||
BlockInfo.cpp
|
||||
BoundingBox.cpp
|
||||
ByteBuffer.cpp
|
||||
ChatColor.cpp
|
||||
Chunk.cpp
|
||||
ChunkData.cpp
|
||||
ChunkMap.cpp
|
||||
ChunkSender.cpp
|
||||
ChunkStay.cpp
|
||||
ClientHandle.cpp
|
||||
CommandOutput.cpp
|
||||
CompositeChat.cpp
|
||||
CraftingRecipes.cpp
|
||||
Cuboid.cpp
|
||||
DeadlockDetect.cpp
|
||||
Enchantments.cpp
|
||||
FastRandom.cpp
|
||||
FurnaceRecipe.cpp
|
||||
Globals.cpp
|
||||
Group.cpp
|
||||
GroupManager.cpp
|
||||
Inventory.cpp
|
||||
Item.cpp
|
||||
ItemGrid.cpp
|
||||
LightingThread.cpp
|
||||
LineBlockTracer.cpp
|
||||
LinearInterpolation.cpp
|
||||
Log.cpp
|
||||
MCLogger.cpp
|
||||
Map.cpp
|
||||
MapManager.cpp
|
||||
MobCensus.cpp
|
||||
MobFamilyCollecter.cpp
|
||||
MobProximityCounter.cpp
|
||||
MobSpawner.cpp
|
||||
MonsterConfig.cpp
|
||||
Noise.cpp
|
||||
ProbabDistrib.cpp
|
||||
RCONServer.cpp
|
||||
Root.cpp
|
||||
Scoreboard.cpp
|
||||
Server.cpp
|
||||
SetChunkData.cpp
|
||||
Statistics.cpp
|
||||
StringCompression.cpp
|
||||
StringUtils.cpp
|
||||
Tracer.cpp
|
||||
VoronoiMap.cpp
|
||||
WebAdmin.cpp
|
||||
World.cpp
|
||||
main.cpp)
|
||||
|
||||
SET (HDRS
|
||||
AllocationPool.h
|
||||
BiomeDef.h
|
||||
BlockArea.h
|
||||
BlockEntities/BlockEntity.h
|
||||
BlockEntities/BlockEntityWithItems.h
|
||||
BlockEntities/ChestEntity.h
|
||||
BlockEntities/DispenserEntity.h
|
||||
BlockEntities/DropSpenserEntity.h
|
||||
BlockEntities/DropperEntity.h
|
||||
BlockEntities/FurnaceEntity.h
|
||||
BlockEntities/HopperEntity.h
|
||||
BlockEntities/JukeboxEntity.h
|
||||
BlockEntities/NoteEntity.h
|
||||
BlockEntities/SignEntity.h
|
||||
BlockEntities/MobHeadEntity.h
|
||||
BlockEntities/FlowerPotEntity.h
|
||||
BlockID.h
|
||||
BlockInServerPluginInterface.h
|
||||
BlockInfo.h
|
||||
BlockTracer.h
|
||||
BoundingBox.h
|
||||
ByteBuffer.h
|
||||
ChatColor.h
|
||||
Chunk.h
|
||||
ChunkData.h
|
||||
ChunkDataCallback.h
|
||||
ChunkDef.h
|
||||
ChunkMap.h
|
||||
ChunkSender.h
|
||||
ChunkStay.h
|
||||
ClientHandle.h
|
||||
CommandOutput.h
|
||||
CompositeChat.h
|
||||
CraftingRecipes.h
|
||||
Cuboid.h
|
||||
DeadlockDetect.h
|
||||
Defines.h
|
||||
Enchantments.h
|
||||
Entities/EntityEffect.h
|
||||
Entities/Entity.h
|
||||
Entities/Floater.h
|
||||
Entities/Pawn.h
|
||||
Entities/Painting.h
|
||||
Entities/Pickup.h
|
||||
Entities/Player.h
|
||||
Entities/ProjectileEntity.h
|
||||
Entities/ArrowEntity.h
|
||||
Entities/ThrownEggEntity.h
|
||||
Entities/ThrownEnderPearlEntity.h
|
||||
Entities/ExpBottleEntity.h
|
||||
Entities/ThrownSnowballEntity.h
|
||||
Entities/FireChargeEntity.h
|
||||
Entities/FireworkEntity.h
|
||||
Entities/GhastFireballEntity.h
|
||||
Entities/TNTEntity.h
|
||||
Entities/ExpOrb.h
|
||||
Entities/HangingEntity.h
|
||||
Entities/ItemFrame.h
|
||||
Generating/ChunkDesc.h
|
||||
Endianness.h
|
||||
FastRandom.h
|
||||
ForEachChunkProvider.h
|
||||
FurnaceRecipe.h
|
||||
Globals.h
|
||||
Group.h
|
||||
GroupManager.h
|
||||
Inventory.h
|
||||
Item.h
|
||||
ItemGrid.h
|
||||
Mobs/Monster.h
|
||||
OSSupport/File.h
|
||||
LeakFinder.h
|
||||
LightingThread.h
|
||||
LineBlockTracer.h
|
||||
LinearInterpolation.h
|
||||
LinearUpscale.h
|
||||
Log.h
|
||||
MCLogger.h
|
||||
Map.h
|
||||
MapManager.h
|
||||
Matrix4.h
|
||||
MemoryLeak.h
|
||||
MersenneTwister.h
|
||||
MobCensus.h
|
||||
MobFamilyCollecter.h
|
||||
MobProximityCounter.h
|
||||
MobSpawner.h
|
||||
MonsterConfig.h
|
||||
Noise.h
|
||||
ProbabDistrib.h
|
||||
RCONServer.h
|
||||
Root.h
|
||||
Scoreboard.h
|
||||
Server.h
|
||||
SetChunkData.h
|
||||
StackWalker.h
|
||||
Statistics.h
|
||||
StringCompression.h
|
||||
StringUtils.h
|
||||
Tracer.h
|
||||
UI/Window.h
|
||||
Vector3.h
|
||||
VoronoiMap.h
|
||||
WebAdmin.h
|
||||
World.h
|
||||
)
|
||||
XMLParser.h)
|
||||
|
||||
# List all the files that are generated as part of the Bindings build process
|
||||
set (BINDING_OUTPUTS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Bindings/Bindings.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Bindings/Bindings.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Bindings/LuaState_Call.inc
|
||||
)
|
||||
|
||||
include_directories(Bindings)
|
||||
include_directories(.)
|
||||
|
||||
if (WIN32)
|
||||
ADD_CUSTOM_COMMAND(
|
||||
OUTPUT ${BINDING_OUTPUTS}
|
||||
|
||||
# Copy the Lua DLL into the Bindings folder, so that tolua can run from there:
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ../../MCServer/lua51.dll ./lua51.dll
|
||||
|
||||
# Regenerate bindings:
|
||||
COMMAND tolua -L virtual_method_hooks.lua -o Bindings.cpp -H Bindings.h AllToLua.pkg
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Bindings/
|
||||
|
||||
# add any new generation dependencies here
|
||||
DEPENDS ${BINDING_DEPENDECIES}
|
||||
)
|
||||
else ()
|
||||
ADD_CUSTOM_COMMAND(
|
||||
# add any new generated bindings here
|
||||
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/Bindings/Bindings.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Bindings/Bindings.h
|
||||
|
||||
# Regenerate bindings:
|
||||
COMMAND tolua -L virtual_method_hooks.lua -o Bindings.cpp -H Bindings.h AllToLua.pkg
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Bindings/
|
||||
|
||||
# add any new generation dependencies here
|
||||
DEPENDS ${BINDING_DEPENDECIES}
|
||||
)
|
||||
endif ()
|
||||
set_source_files_properties(Bindings/Bindings.cpp PROPERTIES GENERATED TRUE)
|
||||
set_source_files_properties(Bindings/Bindings.h PROPERTIES GENERATED TRUE)
|
||||
include_directories(".")
|
||||
|
||||
if (NOT MSVC)
|
||||
|
||||
# Bindings need to reference other folders, so they are done here instead
|
||||
|
||||
# lib dependencies are not included
|
||||
|
||||
include_directories ("${CMAKE_CURRENT_SOURCE_DIR}/../lib/polarssl/include")
|
||||
|
||||
#add cpp files here
|
||||
add_library(Bindings
|
||||
Bindings/Bindings
|
||||
Bindings/DeprecatedBindings
|
||||
Bindings/LuaChunkStay
|
||||
Bindings/LuaState
|
||||
Bindings/LuaWindow
|
||||
Bindings/ManualBindings
|
||||
Bindings/Plugin
|
||||
Bindings/PluginLua
|
||||
Bindings/PluginManager
|
||||
Bindings/WebPlugin
|
||||
)
|
||||
foreach(folder ${FOLDERS})
|
||||
add_subdirectory(${folder})
|
||||
endforeach(folder)
|
||||
|
||||
target_link_libraries(Bindings lua sqlite tolualib polarssl)
|
||||
get_directory_property(BINDING_DEPENDENCIES DIRECTORY "Bindings" DEFINITION BINDING_DEPENDENCIES)
|
||||
|
||||
#clear file
|
||||
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/Bindings/BindingDependecies.txt)
|
||||
@ -153,43 +159,19 @@ if (NOT MSVC)
|
||||
|
||||
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "Bindings.cpp Bindings.h")
|
||||
|
||||
foreach(folder ${FOLDERS})
|
||||
add_subdirectory(${folder})
|
||||
endforeach(folder)
|
||||
|
||||
file(GLOB SOURCE
|
||||
"*.cpp"
|
||||
"*.h"
|
||||
)
|
||||
|
||||
list(REMOVE_ITEM SOURCE "${PROJECT_SOURCE_DIR}/StackWalker.cpp" "${PROJECT_SOURCE_DIR}/LeakFinder.cpp")
|
||||
list(APPEND SOURCE "${SRCS}")
|
||||
list(APPEND SOURCE "${HDRS}")
|
||||
|
||||
# If building a windows version, but not using MSVC, add the resources directly to the makefile:
|
||||
if (WIN32)
|
||||
FILE(GLOB ResourceFiles
|
||||
"Resources/*.rc"
|
||||
)
|
||||
list(APPEND SOURCE "${ResourceFiles}")
|
||||
list(APPEND SOURCE "Resources/MCServer.rc")
|
||||
endif()
|
||||
|
||||
|
||||
else ()
|
||||
# MSVC-specific handling: Put all files into one project, separate by the folders:
|
||||
|
||||
# Get all files in this folder:
|
||||
file(GLOB_RECURSE SOURCE
|
||||
"*.cpp"
|
||||
"*.h"
|
||||
"*.pkg"
|
||||
)
|
||||
source_group("" FILES ${SOURCE})
|
||||
|
||||
LIST(APPEND SOURCE "Bindings/Bindings.cpp" "Bindings/Bindings.h")
|
||||
source_group(Bindings FILES "Bindings/Bindings.cpp" "Bindings/Bindings.h")
|
||||
|
||||
# Add all subfolders as solution-folders:
|
||||
list(APPEND FOLDERS "Resources")
|
||||
list(APPEND FOLDERS "Bindings")
|
||||
function(includefolder PATH)
|
||||
FILE(GLOB FOLDER_FILES
|
||||
"${PATH}/*.cpp"
|
||||
@ -202,9 +184,29 @@ else ()
|
||||
endfunction(includefolder)
|
||||
|
||||
foreach(folder ${FOLDERS})
|
||||
add_subdirectory(${folder})
|
||||
includefolder(${folder})
|
||||
|
||||
# Get all source files in this folder:
|
||||
get_directory_property(FOLDER_SRCS DIRECTORY ${folder} DEFINITION SRCS)
|
||||
foreach (src ${FOLDER_SRCS})
|
||||
list(APPEND SOURCE "${folder}/${src}")
|
||||
endforeach(src)
|
||||
|
||||
# Get all headers in this folder:
|
||||
get_directory_property(FOLDER_HDRS DIRECTORY ${folder} DEFINITION HDRS)
|
||||
foreach (hdr ${FOLDER_HDRS})
|
||||
list(APPEND SOURCE "${folder}/${hdr}")
|
||||
endforeach(hdr)
|
||||
endforeach(folder)
|
||||
|
||||
list(APPEND SOURCE "${SRCS}")
|
||||
list(APPEND SOURCE "${HDRS}")
|
||||
list(APPEND SOURCE "Bindings/AllToLua.pkg")
|
||||
|
||||
includefolder("Resources")
|
||||
source_group("" FILES ${SOURCE})
|
||||
|
||||
include_directories("${PROJECT_SOURCE_DIR}")
|
||||
|
||||
# Precompiled headers (1st part)
|
||||
@ -228,8 +230,47 @@ else ()
|
||||
set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} /DEBUG")
|
||||
endif()
|
||||
|
||||
|
||||
# Generate a list of all source files:
|
||||
set(ALLFILES "")
|
||||
foreach(folder ${FOLDERS})
|
||||
get_directory_property(FOLDER_SRCS DIRECTORY ${folder} DEFINITION SRCS)
|
||||
foreach (src ${FOLDER_SRCS})
|
||||
list(APPEND ALLFILES "${folder}/${src}")
|
||||
endforeach(src)
|
||||
|
||||
get_directory_property(FOLDER_HDRS DIRECTORY ${folder} DEFINITION HDRS)
|
||||
foreach (hdr ${FOLDER_HDRS})
|
||||
list(APPEND ALLFILES "${folder}/${hdr}")
|
||||
endforeach(hdr)
|
||||
endforeach(folder)
|
||||
foreach(arg ${ALLFILES})
|
||||
set(ALLFILESLINES "${ALLFILESLINES}${arg}\n")
|
||||
endforeach()
|
||||
FILE(WRITE "AllFiles.lst" "${ALLFILESLINES}")
|
||||
|
||||
|
||||
set(EXECUTABLE MCServer)
|
||||
|
||||
if (MSVC)
|
||||
get_directory_property(BINDING_OUTPUTS DIRECTORY "Bindings" DEFINITION BINDING_OUTPUTS)
|
||||
get_directory_property(BINDING_DEPENDENCIES DIRECTORY "Bindings" DEFINITION BINDING_DEPENDENCIES)
|
||||
|
||||
ADD_CUSTOM_COMMAND(
|
||||
OUTPUT ${BINDING_OUTPUTS}
|
||||
|
||||
# Copy the Lua DLL into the Bindings folder, so that tolua can run from there:
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/MCServer/lua51.dll ./lua51.dll
|
||||
|
||||
# Regenerate bindings:
|
||||
COMMAND tolua -L virtual_method_hooks.lua -o Bindings.cpp -H Bindings.h AllToLua.pkg
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Bindings/
|
||||
|
||||
# add any new generation dependencies here
|
||||
DEPENDS ${BINDING_DEPENDENCIES}
|
||||
)
|
||||
endif()
|
||||
|
||||
add_executable(${EXECUTABLE} ${SOURCE})
|
||||
|
||||
|
||||
@ -261,9 +302,11 @@ endif ()
|
||||
|
||||
|
||||
if (NOT MSVC)
|
||||
target_link_libraries(${EXECUTABLE} OSSupport HTTPServer Bindings Items Blocks)
|
||||
target_link_libraries(${EXECUTABLE} Protocol Generating Generating_Prefabs WorldStorage)
|
||||
target_link_libraries(${EXECUTABLE} Mobs Entities Simulator UI BlockEntities PolarSSL++)
|
||||
target_link_libraries(${EXECUTABLE}
|
||||
OSSupport HTTPServer Bindings Items Blocks
|
||||
Protocol Generating Generating_Prefabs WorldStorage
|
||||
Mobs Entities Simulator UI BlockEntities PolarSSL++
|
||||
)
|
||||
endif ()
|
||||
if (WIN32)
|
||||
target_link_libraries(${EXECUTABLE} expat tolualib ws2_32.lib Psapi.lib)
|
||||
|
@ -2,31 +2,31 @@
|
||||
|
||||
#include "ChatColor.h"
|
||||
|
||||
const std::string cChatColor::Color = "\xc2\xa7"; // or in other words: "§" in UTF-8
|
||||
const std::string cChatColor::Delimiter = "\xc2\xa7"; // or in other words: "§" in UTF-8
|
||||
const std::string cChatColor::Black = cChatColor::Color + "0";
|
||||
const std::string cChatColor::Navy = cChatColor::Color + "1";
|
||||
const std::string cChatColor::Green = cChatColor::Color + "2";
|
||||
const std::string cChatColor::Blue = cChatColor::Color + "3";
|
||||
const std::string cChatColor::Red = cChatColor::Color + "4";
|
||||
const std::string cChatColor::Purple = cChatColor::Color + "5";
|
||||
const std::string cChatColor::Gold = cChatColor::Color + "6";
|
||||
const std::string cChatColor::LightGray = cChatColor::Color + "7";
|
||||
const std::string cChatColor::Gray = cChatColor::Color + "8";
|
||||
const std::string cChatColor::DarkPurple = cChatColor::Color + "9";
|
||||
const std::string cChatColor::LightGreen = cChatColor::Color + "a";
|
||||
const std::string cChatColor::LightBlue = cChatColor::Color + "b";
|
||||
const std::string cChatColor::Rose = cChatColor::Color + "c";
|
||||
const std::string cChatColor::LightPurple = cChatColor::Color + "d";
|
||||
const std::string cChatColor::Yellow = cChatColor::Color + "e";
|
||||
const std::string cChatColor::White = cChatColor::Color + "f";
|
||||
const char * cChatColor::Color = "\xc2\xa7"; // or in other words: "§" in UTF-8
|
||||
const char * cChatColor::Delimiter = "\xc2\xa7"; // or in other words: "§" in UTF-8
|
||||
const char * cChatColor::Black = "\xc2\xa7""0";
|
||||
const char * cChatColor::Navy = "\xc2\xa7""1";
|
||||
const char * cChatColor::Green = "\xc2\xa7""2";
|
||||
const char * cChatColor::Blue = "\xc2\xa7""3";
|
||||
const char * cChatColor::Red = "\xc2\xa7""4";
|
||||
const char * cChatColor::Purple = "\xc2\xa7""5";
|
||||
const char * cChatColor::Gold = "\xc2\xa7""6";
|
||||
const char * cChatColor::LightGray = "\xc2\xa7""7";
|
||||
const char * cChatColor::Gray = "\xc2\xa7""8";
|
||||
const char * cChatColor::DarkPurple = "\xc2\xa7""9";
|
||||
const char * cChatColor::LightGreen = "\xc2\xa7""a";
|
||||
const char * cChatColor::LightBlue = "\xc2\xa7""b";
|
||||
const char * cChatColor::Rose = "\xc2\xa7""c";
|
||||
const char * cChatColor::LightPurple = "\xc2\xa7""d";
|
||||
const char * cChatColor::Yellow = "\xc2\xa7""e";
|
||||
const char * cChatColor::White = "\xc2\xa7""f";
|
||||
|
||||
const std::string cChatColor::Random = cChatColor::Color + "k";
|
||||
const std::string cChatColor::Bold = cChatColor::Color + "l";
|
||||
const std::string cChatColor::Strikethrough = cChatColor::Color + "m";
|
||||
const std::string cChatColor::Underlined = cChatColor::Color + "n";
|
||||
const std::string cChatColor::Italic = cChatColor::Color + "o";
|
||||
const std::string cChatColor::Plain = cChatColor::Color + "r";
|
||||
const char * cChatColor::Random = "\xc2\xa7""k";
|
||||
const char * cChatColor::Bold = "\xc2\xa7""l";
|
||||
const char * cChatColor::Strikethrough = "\xc2\xa7""m";
|
||||
const char * cChatColor::Underlined = "\xc2\xa7""n";
|
||||
const char * cChatColor::Italic = "\xc2\xa7""o";
|
||||
const char * cChatColor::Plain = "\xc2\xa7""r";
|
||||
|
||||
|
||||
|
||||
|
@ -9,34 +9,36 @@
|
||||
class cChatColor
|
||||
{
|
||||
public:
|
||||
static const std::string Color;
|
||||
static const std::string Delimiter;
|
||||
static const char * Delimiter;
|
||||
|
||||
static const std::string Black;
|
||||
static const std::string Navy;
|
||||
static const std::string Green;
|
||||
static const std::string Blue;
|
||||
static const std::string Red;
|
||||
static const std::string Purple;
|
||||
static const std::string Gold;
|
||||
static const std::string LightGray;
|
||||
static const std::string Gray;
|
||||
static const std::string DarkPurple;
|
||||
static const std::string LightGreen;
|
||||
static const std::string LightBlue;
|
||||
static const std::string Rose;
|
||||
static const std::string LightPurple;
|
||||
static const std::string Yellow;
|
||||
static const std::string White;
|
||||
/** @deprecated use ChatColor::Delimiter instead */
|
||||
static const char * Color;
|
||||
|
||||
// Styles ( source: http://wiki.vg/Chat )
|
||||
static const std::string Random;
|
||||
static const std::string Bold;
|
||||
static const std::string Strikethrough;
|
||||
static const std::string Underlined;
|
||||
static const std::string Italic;
|
||||
static const std::string Plain;
|
||||
static const char * Black;
|
||||
static const char * Navy;
|
||||
static const char * Green;
|
||||
static const char * Blue;
|
||||
static const char * Red;
|
||||
static const char * Purple;
|
||||
static const char * Gold;
|
||||
static const char * LightGray;
|
||||
static const char * Gray;
|
||||
static const char * DarkPurple;
|
||||
static const char * LightGreen;
|
||||
static const char * LightBlue;
|
||||
static const char * Rose;
|
||||
static const char * LightPurple;
|
||||
static const char * Yellow;
|
||||
static const char * White;
|
||||
|
||||
// Styles
|
||||
// source: http://wiki.vg/Chat
|
||||
static const char * Random;
|
||||
static const char * Bold;
|
||||
static const char * Strikethrough;
|
||||
static const char * Underlined;
|
||||
static const char * Italic;
|
||||
static const char * Plain;
|
||||
};
|
||||
|
||||
// tolua_end
|
||||
|
@ -1,3 +1,4 @@
|
||||
#!/usr/bin/env lua
|
||||
|
||||
-- CheckBasicStyle.lua
|
||||
|
||||
@ -6,39 +7,29 @@ Checks that all source files (*.cpp, *.h) use the basic style requirements of th
|
||||
- Tabs for indentation, spaces for alignment
|
||||
- Trailing whitespace on non-empty lines
|
||||
- Two spaces between code and line-end comment ("//")
|
||||
- (TODO) Spaces around +, -, (cannot check /, * or & due to their other usage - comment, ptr deref, address-of)
|
||||
- Spaces after comma, not before
|
||||
- Opening braces not at the end of a code line
|
||||
- Spaces after if, for, while
|
||||
- (TODO) Spaces before *, /, &
|
||||
- (TODO) Spaces after ,
|
||||
- (TODO) Hex numbers with even digit length
|
||||
- (TODO) Hex numbers in lowercase
|
||||
- (TODO) Braces not on the end of line
|
||||
- (TODO) Line dividers (////...) exactly 80 slashes
|
||||
- (TODO) Not using "* "-style doxy comment continuation lines
|
||||
|
||||
Violations that cannot be checked easily:
|
||||
- Spaces around "+" (there are things like "a++", "++a", "a += 1", "X+", "stack +1" and ascii-drawn tables)
|
||||
|
||||
Reports all violations on stdout in a form that is readable by Visual Studio's parser, so that dblclicking
|
||||
the line brings the editor directly to the violation.
|
||||
|
||||
Returns 0 on success, 1 on internal failure, 2 if any violations found
|
||||
|
||||
This script requires LuaFileSystem to be available in the current Lua interpreter.
|
||||
--]]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- Check that LFS is installed:
|
||||
local hasLfs = pcall(require, "lfs")
|
||||
if not(hasLfs) then
|
||||
print("This script requires LuaFileSystem to be installed")
|
||||
os.exit(1)
|
||||
end
|
||||
local lfs = require("lfs")
|
||||
assert(lfs ~= nil)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- The list of file extensions that are processed:
|
||||
local g_ShouldProcessExt =
|
||||
{
|
||||
@ -49,13 +40,12 @@ local g_ShouldProcessExt =
|
||||
--- The list of files not to be processed:
|
||||
local g_IgnoredFiles =
|
||||
{
|
||||
"./Bindings/Bindings.cpp",
|
||||
"./Bindings/DeprecatedBindings.cpp",
|
||||
"./LeakFinder.cpp",
|
||||
"./LeakFinder.h",
|
||||
"./MersenneTwister.h",
|
||||
"./StackWalker.cpp",
|
||||
"./StackWalker.h",
|
||||
"Bindings/Bindings.cpp",
|
||||
"LeakFinder.cpp",
|
||||
"LeakFinder.h",
|
||||
"MersenneTwister.h",
|
||||
"StackWalker.cpp",
|
||||
"StackWalker.h",
|
||||
}
|
||||
|
||||
--- The list of files not to be processed, as a dictionary (filename => true), built from g_IgnoredFiles
|
||||
@ -76,8 +66,8 @@ local g_NumViolations = 0
|
||||
--- Reports one violation
|
||||
-- Pretty-prints the message
|
||||
-- Also increments g_NumViolations
|
||||
local function ReportViolation(a_FileName, a_LineNumber, a_Message)
|
||||
print(a_FileName .. "(" .. a_LineNumber .. "): " .. a_Message)
|
||||
local function ReportViolation(a_FileName, a_LineNumber, a_PatStart, a_PatEnd, a_Message)
|
||||
print(a_FileName .. "(" .. a_LineNumber .. "): " .. a_PatStart .. " .. " .. a_PatEnd .. ": " .. a_Message)
|
||||
g_NumViolations = g_NumViolations + 1
|
||||
end
|
||||
|
||||
@ -85,6 +75,64 @@ end
|
||||
|
||||
|
||||
|
||||
--- Searches for the specified pattern, if found, reports it as a violation with the given message
|
||||
local function ReportViolationIfFound(a_Line, a_FileName, a_LineNum, a_Pattern, a_Message)
|
||||
local patStart, patEnd = a_Line:find(a_Pattern)
|
||||
if not(patStart) then
|
||||
return
|
||||
end
|
||||
ReportViolation(a_FileName, a_LineNum, patStart, patEnd, a_Message)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
local g_ViolationPatterns =
|
||||
{
|
||||
-- Check against indenting using spaces:
|
||||
{"^\t* +", "Indenting with a space"},
|
||||
|
||||
-- Check against alignment using tabs:
|
||||
{"[^%s]\t+[^%s]", "Aligning with a tab"},
|
||||
|
||||
-- Check against trailing whitespace:
|
||||
{"[^%s]%s+\n", "Trailing whitespace"},
|
||||
|
||||
-- Check that all "//"-style comments have at least two spaces in front (unless alone on line):
|
||||
{"[^%s] //", "Needs at least two spaces in front of a \"//\"-style comment"},
|
||||
|
||||
-- Check that all "//"-style comments have at least one spaces after:
|
||||
{"%s//[^%s/*<]", "Needs a space after a \"//\"-style comment"},
|
||||
|
||||
-- Check that all commas have spaces after them and not in front of them:
|
||||
{" ,", "Extra space before a \",\""},
|
||||
{",[^%s\"%%]", "Needs a space after a \",\""}, -- Report all except >> "," << needed for splitting and >>,%s<< needed for formatting
|
||||
|
||||
-- Check that opening braces are not at the end of a code line:
|
||||
{"[^%s].-{\n?$", "Brace should be on a separate line"},
|
||||
|
||||
-- Space after keywords:
|
||||
{"[^_]if%(", "Needs a space after \"if\""},
|
||||
{"for%(", "Needs a space after \"for\""},
|
||||
{"while%(", "Needs a space after \"while\""},
|
||||
{"switch%(", "Needs a space after \"switch\""},
|
||||
{"catch%(", "Needs a space after \"catch\""},
|
||||
|
||||
-- No space after keyword's parenthesis:
|
||||
{"[^%a#]if %( ", "Remove the space after \"(\""},
|
||||
{"for %( ", "Remove the space after \"(\""},
|
||||
{"while %( ", "Remove the space after \"(\""},
|
||||
{"catch %( ", "Remove the space after \"(\""},
|
||||
|
||||
-- No space before a closing parenthesis:
|
||||
{" %)", "Remove the space before \")\""},
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
--- Processes one file
|
||||
local function ProcessFile(a_FileName)
|
||||
assert(type(a_FileName) == "string")
|
||||
@ -103,7 +151,7 @@ local function ProcessFile(a_FileName)
|
||||
if ((lastChar ~= 13) and (lastChar ~= 10)) then
|
||||
local numLines = 1
|
||||
string.gsub(all, "\n", function() numLines = numLines + 1 end) -- Count the number of line-ends
|
||||
ReportViolation(a_FileName, numLines, "Missing empty line at file end")
|
||||
ReportViolation(a_FileName, numLines, 1, 1, "Missing empty line at file end")
|
||||
return
|
||||
end
|
||||
|
||||
@ -113,26 +161,11 @@ local function ProcessFile(a_FileName)
|
||||
all:gsub("\r\n", "\n") -- normalize CRLF into LF-only
|
||||
string.gsub(all .. "\n", "[^\n]*\n", -- Iterate over each line, while preserving empty lines
|
||||
function(a_Line)
|
||||
-- Check against indenting using spaces:
|
||||
if (a_Line:find("^\t* +")) then -- Find any number of tabs at the start of line (incl 0), followed by a space
|
||||
ReportViolation(a_FileName, lineCounter, "Indenting with a space")
|
||||
end
|
||||
-- Check against alignment using tabs:
|
||||
if (a_Line:find("[^%s]\t+[^%s]")) then -- Find any number of tabs after non-whitespace followed by non-whitespace
|
||||
ReportViolation(a_FileName, lineCounter, "Aligning with a tab")
|
||||
end
|
||||
-- Check against trailing whitespace:
|
||||
if (a_Line:find("[^%s]%s+\n")) then -- Find any whitespace after non-whitespace at the end of line
|
||||
ReportViolation(a_FileName, lineCounter, "Trailing whitespace")
|
||||
end
|
||||
-- Check that all "//"-style comments have at least two spaces in front (unless alone on line):
|
||||
if (a_Line:find("[^%s] //")) then
|
||||
ReportViolation(a_FileName, lineCounter, "Needs at least two spaces in front of a \"//\"-style comment")
|
||||
end
|
||||
-- Check that all "//"-style comments have at least one spaces after:
|
||||
if (a_Line:find("%s//[^%s/*<]")) then
|
||||
ReportViolation(a_FileName, lineCounter, "Needs a space after a \"//\"-style comment")
|
||||
-- Check against each violation pattern:
|
||||
for _, pat in ipairs(g_ViolationPatterns) do
|
||||
ReportViolationIfFound(a_Line, a_FileName, lineCounter, pat[1], pat[2])
|
||||
end
|
||||
|
||||
lineCounter = lineCounter + 1
|
||||
end
|
||||
)
|
||||
@ -151,17 +184,6 @@ local function ProcessItem(a_ItemName)
|
||||
return
|
||||
end
|
||||
|
||||
-- If the item is a folder, recurse:
|
||||
local attrs = lfs.attributes(a_ItemName)
|
||||
if (attrs and (attrs.mode == "directory")) then
|
||||
for fnam in lfs.dir(a_ItemName) do
|
||||
if ((fnam ~= ".") and (fnam ~= "..")) then
|
||||
ProcessItem(a_ItemName .. "/" .. fnam)
|
||||
end
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
local ext = a_ItemName:match("%.([^/%.]-)$")
|
||||
if (g_ShouldProcessExt[ext]) then
|
||||
ProcessFile(a_ItemName)
|
||||
@ -172,8 +194,10 @@ end
|
||||
|
||||
|
||||
|
||||
-- Process the entire current folder:
|
||||
ProcessItem(".")
|
||||
-- Process all files in the AllFiles.lst file (generated by cmake):
|
||||
for fnam in io.lines("AllFiles.lst") do
|
||||
ProcessItem(fnam)
|
||||
end
|
||||
|
||||
-- Report final verdict:
|
||||
print("Number of violations found: " .. g_NumViolations)
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "MobCensus.h"
|
||||
#include "MobSpawner.h"
|
||||
#include "BlockInServerPluginInterface.h"
|
||||
#include "SetChunkData.h"
|
||||
|
||||
#include "json/json.h"
|
||||
|
||||
@ -265,41 +266,34 @@ void cChunk::GetAllData(cChunkDataCallback & a_Callback)
|
||||
|
||||
|
||||
|
||||
void cChunk::SetAllData(
|
||||
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
|
||||
)
|
||||
void cChunk::SetAllData(cSetChunkData & a_SetChunkData)
|
||||
{
|
||||
memcpy(m_BiomeMap, a_BiomeMap, sizeof(m_BiomeMap));
|
||||
ASSERT(a_SetChunkData.IsHeightMapValid());
|
||||
ASSERT(a_SetChunkData.AreBiomesValid());
|
||||
|
||||
if (a_HeightMap != 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())
|
||||
{
|
||||
memcpy(m_HeightMap, a_HeightMap, sizeof(m_HeightMap));
|
||||
m_ChunkData.SetBlockLight(a_SetChunkData.GetBlockLight());
|
||||
m_ChunkData.SetSkyLight(a_SetChunkData.GetSkyLight());
|
||||
m_IsLightValid = true;
|
||||
}
|
||||
|
||||
if (a_HeightMap == NULL)
|
||||
else
|
||||
{
|
||||
CalculateHeightmap(a_BlockTypes);
|
||||
m_IsLightValid = false;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
// 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)
|
||||
{
|
||||
delete *itr;
|
||||
}
|
||||
std::swap(a_BlockEntities, m_BlockEntities);
|
||||
m_BlockEntities.clear();
|
||||
std::swap(a_SetChunkData.GetBlockEntities(), m_BlockEntities);
|
||||
|
||||
// Set all block entities' World variable:
|
||||
for (cBlockEntityList::iterator itr = m_BlockEntities.begin(); itr != m_BlockEntities.end(); ++itr)
|
||||
@ -781,7 +775,7 @@ void cChunk::CheckBlocks()
|
||||
void cChunk::TickBlocks(void)
|
||||
{
|
||||
// Tick dem blocks
|
||||
// _X: We must limit the random number or else we get a nasty int overflow bug ( http://forum.mc-server.org/showthread.php?tid=457 )
|
||||
// _X: We must limit the random number or else we get a nasty int overflow bug - http://forum.mc-server.org/showthread.php?tid=457
|
||||
int RandomX = m_World->GetTickRandomNumber(0x00ffffff);
|
||||
int RandomY = m_World->GetTickRandomNumber(0x00ffffff);
|
||||
int RandomZ = m_World->GetTickRandomNumber(0x00ffffff);
|
||||
@ -1530,11 +1524,12 @@ void cChunk::FastSetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockT
|
||||
|
||||
m_ChunkData.SetBlock(a_RelX, a_RelY, a_RelZ, a_BlockType);
|
||||
|
||||
if ( // Queue block to be sent only if ...
|
||||
// Queue block to be sent only if ...
|
||||
if (
|
||||
a_SendToClients && // ... we are told to do so AND ...
|
||||
(
|
||||
(OldBlockMeta != a_BlockMeta) || // ... the meta value is different OR ...
|
||||
!( // ... the old and new blocktypes AREN'T liquids (because client doesn't need to distinguish betwixt them); see below for specifics:
|
||||
!( // ... the old and new blocktypes AREN'T liquids (because client doesn't need to distinguish betwixt them):
|
||||
((OldBlockType == E_BLOCK_STATIONARY_WATER) && (a_BlockType == E_BLOCK_WATER)) || // Replacing stationary water with water
|
||||
((OldBlockType == E_BLOCK_WATER) && (a_BlockType == E_BLOCK_STATIONARY_WATER)) || // Replacing water with stationary water
|
||||
((OldBlockType == E_BLOCK_STATIONARY_LAVA) && (a_BlockType == E_BLOCK_LAVA)) || // Replacing stationary water with water
|
||||
|
20
src/Chunk.h
20
src/Chunk.h
@ -95,16 +95,10 @@ public:
|
||||
/** Gets all chunk data, calls the a_Callback's methods for each data type */
|
||||
void GetAllData(cChunkDataCallback & a_Callback);
|
||||
|
||||
/** Sets all chunk data */
|
||||
void SetAllData(
|
||||
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
|
||||
);
|
||||
/** Sets all chunk data as either loaded from the storage or generated.
|
||||
BlockLight and BlockSkyLight are optional, if not present, chunk will be marked as unlighted.
|
||||
Modifies the BlockEntity list in a_SetChunkData - moves the block entities into the chunk. */
|
||||
void SetAllData(cSetChunkData & a_SetChunkData);
|
||||
|
||||
void SetLight(
|
||||
const cChunkDef::BlockNibbles & a_BlockLight,
|
||||
@ -386,9 +380,9 @@ public:
|
||||
cRedstoneSimulatorChunkData * GetRedstoneSimulatorData(void) { return &m_RedstoneSimulatorData; }
|
||||
cRedstoneSimulatorChunkData * GetRedstoneSimulatorQueuedData(void) { return &m_RedstoneSimulatorQueuedData; }
|
||||
cIncrementalRedstoneSimulator::PoweredBlocksList * GetRedstoneSimulatorPoweredBlocksList(void) { return &m_RedstoneSimulatorPoweredBlocksList; }
|
||||
cIncrementalRedstoneSimulator::LinkedBlocksList * GetRedstoneSimulatorLinkedBlocksList(void) { return &m_RedstoneSimulatorLinkedBlocksList; };
|
||||
cIncrementalRedstoneSimulator::SimulatedPlayerToggleableList * GetRedstoneSimulatorSimulatedPlayerToggleableList(void) { return &m_RedstoneSimulatorSimulatedPlayerToggleableList; };
|
||||
cIncrementalRedstoneSimulator::RepeatersDelayList * GetRedstoneSimulatorRepeatersDelayList(void) { return &m_RedstoneSimulatorRepeatersDelayList; };
|
||||
cIncrementalRedstoneSimulator::LinkedBlocksList * GetRedstoneSimulatorLinkedBlocksList(void) { return &m_RedstoneSimulatorLinkedBlocksList; }
|
||||
cIncrementalRedstoneSimulator::SimulatedPlayerToggleableList * GetRedstoneSimulatorSimulatedPlayerToggleableList(void) { return &m_RedstoneSimulatorSimulatedPlayerToggleableList; }
|
||||
cIncrementalRedstoneSimulator::RepeatersDelayList * GetRedstoneSimulatorRepeatersDelayList(void) { return &m_RedstoneSimulatorRepeatersDelayList; }
|
||||
bool IsRedstoneDirty(void) const { return m_IsRedstoneDirty; }
|
||||
void SetIsRedstoneDirty(bool a_Flag) { m_IsRedstoneDirty = a_Flag; }
|
||||
|
||||
|
@ -29,25 +29,25 @@ public:
|
||||
(only in processes where multiple chunks can be processed, such as cWorld::ForEachChunkInRect()).
|
||||
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
|
||||
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
|
||||
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
|
||||
virtual void LightIsValid(bool a_IsLightValid) {UNUSED(a_IsLightValid); };
|
||||
virtual void LightIsValid(bool a_IsLightValid) { UNUSED(a_IsLightValid); }
|
||||
|
||||
/// 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
|
||||
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
|
||||
virtual void BlockEntity(cBlockEntity * a_Entity) {UNUSED(a_Entity); };
|
||||
virtual void BlockEntity(cBlockEntity * a_Entity) { UNUSED(a_Entity); }
|
||||
} ;
|
||||
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include "MobCensus.h"
|
||||
#include "MobSpawner.h"
|
||||
#include "BoundingBox.h"
|
||||
#include "SetChunkData.h"
|
||||
|
||||
#include "Entities/Pickup.h"
|
||||
|
||||
@ -912,28 +913,20 @@ void cChunkMap::MarkChunkSaved (int a_ChunkX, int a_ChunkZ)
|
||||
|
||||
|
||||
|
||||
void cChunkMap::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 cChunkMap::SetChunkData(cSetChunkData & a_SetChunkData)
|
||||
{
|
||||
int ChunkX = a_SetChunkData.GetChunkX();
|
||||
int ChunkZ = a_SetChunkData.GetChunkZ();
|
||||
{
|
||||
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)
|
||||
{
|
||||
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();
|
||||
}
|
||||
@ -942,7 +935,7 @@ void cChunkMap::SetChunkData(
|
||||
cChunkStays ToBeDisabled;
|
||||
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:
|
||||
ToBeDisabled.push_back(*itr);
|
||||
@ -957,7 +950,7 @@ void cChunkMap::SetChunkData(
|
||||
}
|
||||
|
||||
// Notify plugins of the chunk becoming available
|
||||
cPluginManager::Get()->CallHookChunkAvailable(m_World, a_ChunkX, a_ChunkZ);
|
||||
cPluginManager::Get()->CallHookChunkAvailable(m_World, ChunkX, ChunkZ);
|
||||
}
|
||||
|
||||
|
||||
@ -1951,10 +1944,7 @@ void cChunkMap::DoExplosionAt(double a_ExplosionSize, double a_BlockX, double a_
|
||||
double FinalDamage = (((1 / AbsoluteEntityPos.x) + (1 / AbsoluteEntityPos.y) + (1 / AbsoluteEntityPos.z)) * 2) * m_ExplosionSize;
|
||||
|
||||
// Clip damage values
|
||||
if (FinalDamage > a_Entity->GetMaxHealth())
|
||||
FinalDamage = a_Entity->GetMaxHealth();
|
||||
else if (FinalDamage < 0)
|
||||
FinalDamage = 0;
|
||||
FinalDamage = Clamp(FinalDamage, 0.0, (double)a_Entity->GetMaxHealth());
|
||||
|
||||
if (!a_Entity->IsTNT() && !a_Entity->IsFallingBlock()) // Don't apply damage to other TNT entities and falling blocks, they should be invincible
|
||||
{
|
||||
|
@ -34,6 +34,7 @@ class cChunkDataSerializer;
|
||||
class cBlockArea;
|
||||
class cMobCensus;
|
||||
class cMobSpawner;
|
||||
class cSetChunkData;
|
||||
|
||||
typedef std::list<cClientHandle *> cClientHandleList;
|
||||
typedef cChunk * cChunkPtr;
|
||||
@ -112,22 +113,11 @@ public:
|
||||
void MarkChunkSaved (int a_ChunkX, int a_ChunkZ);
|
||||
|
||||
/** 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.
|
||||
a_BiomeMap is optional, if not present, biomes will be calculated by the generator
|
||||
a_HeightMap is optional, if not present, will be calculated.
|
||||
If a_MarkDirty is set, the chunk is set as dirty (used after generating)
|
||||
BlockLight and BlockSkyLight are optional, if not present, chunk will be marked as unlighted.
|
||||
If MarkDirty is set, the chunk is set as dirty (used after generating)
|
||||
Modifies the BlockEntity list in a_SetChunkData - moves the block entities into the chunk.
|
||||
*/
|
||||
void 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 SetChunkData(cSetChunkData & a_SetChunkData);
|
||||
|
||||
void ChunkLighted(
|
||||
int a_ChunkX, int a_ChunkZ,
|
||||
|
@ -210,11 +210,11 @@ AString cClientHandle::FormatMessageType(bool ShouldAppendChatPrefixes, eMessage
|
||||
{
|
||||
if (ShouldAppendChatPrefixes)
|
||||
{
|
||||
return Printf("%s[MSG: %s] %s%s", cChatColor::LightBlue.c_str(), a_AdditionalData.c_str(), cChatColor::White.c_str(), cChatColor::Italic.c_str());
|
||||
return Printf("%s[MSG: %s] %s%s", cChatColor::LightBlue, a_AdditionalData.c_str(), cChatColor::White, cChatColor::Italic);
|
||||
}
|
||||
else
|
||||
{
|
||||
return Printf("%s: %s", a_AdditionalData.c_str(), cChatColor::LightBlue.c_str());
|
||||
return Printf("%s: %s", a_AdditionalData.c_str(), cChatColor::LightBlue);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -533,9 +533,9 @@ void cClientHandle::HandlePing(void)
|
||||
|
||||
Printf(Reply, "%s%s%i%s%i",
|
||||
Server.GetDescription().c_str(),
|
||||
cChatColor::Delimiter.c_str(),
|
||||
cChatColor::Delimiter,
|
||||
Server.GetNumPlayers(),
|
||||
cChatColor::Delimiter.c_str(),
|
||||
cChatColor::Delimiter,
|
||||
Server.GetMaxPlayers()
|
||||
);
|
||||
Kick(Reply);
|
||||
@ -1170,7 +1170,7 @@ void cClientHandle::HandleRightClick(int a_BlockX, int a_BlockY, int a_BlockZ, e
|
||||
{
|
||||
// Only compare ItemType, not meta (torches have different metas)
|
||||
// The -1 check is there because sometimes the client sends -1 instead of the held item
|
||||
// ( http://forum.mc-server.org/showthread.php?tid=549&pid=4502#pid4502 )
|
||||
// Ref.: http://forum.mc-server.org/showthread.php?tid=549&pid=4502#pid4502
|
||||
LOGWARN("Player %s tried to place a block that was not equipped (exp %d, got %d)",
|
||||
m_Username.c_str(), Equipped.m_ItemType, a_HeldItem.m_ItemType
|
||||
);
|
||||
@ -1209,11 +1209,12 @@ void cClientHandle::HandleRightClick(int a_BlockX, int a_BlockY, int a_BlockZ, e
|
||||
{
|
||||
HandlePlaceBlock(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, *ItemHandler);
|
||||
}
|
||||
else if ((ItemHandler->IsFood() || ItemHandler->IsDrinkable(EquippedDamage)) && !m_Player->IsGameModeCreative())
|
||||
else if ((ItemHandler->IsFood() || ItemHandler->IsDrinkable(EquippedDamage)))
|
||||
{
|
||||
if (m_Player->IsSatiated() && !ItemHandler->IsDrinkable(EquippedDamage))
|
||||
if ((m_Player->IsSatiated() || m_Player->IsGameModeCreative()) &&
|
||||
ItemHandler->IsFood())
|
||||
{
|
||||
// The player is satiated, they cannot eat
|
||||
// The player is satiated or in creative, and trying to eat
|
||||
return;
|
||||
}
|
||||
m_Player->StartEating();
|
||||
|
@ -56,8 +56,8 @@ public:
|
||||
#else
|
||||
static const int DEFAULT_VIEW_DISTANCE = 10;
|
||||
#endif
|
||||
static const int MAX_VIEW_DISTANCE = 15;
|
||||
static const int MIN_VIEW_DISTANCE = 3;
|
||||
static const int MAX_VIEW_DISTANCE = 32;
|
||||
static const int MIN_VIEW_DISTANCE = 1;
|
||||
|
||||
cClientHandle(const cSocket * a_Socket, int a_ViewDistance);
|
||||
virtual ~cClientHandle();
|
||||
@ -151,7 +151,7 @@ public:
|
||||
void SendMapInfo (int a_ID, unsigned int a_Scale);
|
||||
void SendPaintingSpawn (const cPainting & a_Painting);
|
||||
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 SendPlayerAbilities (void);
|
||||
void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline);
|
||||
@ -274,7 +274,7 @@ private:
|
||||
/** The type used for storing the names of registered plugin channels. */
|
||||
typedef std::set<AString> cChannels;
|
||||
|
||||
/** Number of chunks the player can see in each direction; 4 is the minimum ( http://wiki.vg/Protocol_FAQ#.E2.80.A6all_connecting_clients_spasm_and_jerk_uncontrollably.21 ) */
|
||||
/** Number of chunks the player can see in each direction */
|
||||
int m_ViewDistance;
|
||||
|
||||
/** Server generates this many chunks AHEAD of player sight. */
|
||||
|
@ -14,16 +14,16 @@ Descendants override that function to provide specific processing of the output.
|
||||
class cCommandOutputCallback
|
||||
{
|
||||
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);
|
||||
|
||||
/// Called when the command wants to output anything; may be called multiple times
|
||||
virtual void Out(const AString & a_Text) = 0;
|
||||
|
||||
/// Called when the command processing has been finished
|
||||
virtual void Finished(void) {};
|
||||
virtual void Finished(void) {}
|
||||
} ;
|
||||
|
||||
|
||||
|
@ -24,6 +24,17 @@ static bool DoIntervalsIntersect(int a_Min1, int a_Max1, int a_Min2, int a_Max2)
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// cCuboid:
|
||||
|
||||
cCuboid & cCuboid::operator=(cCuboid a_Other)
|
||||
{
|
||||
std::swap(p1, a_Other.p1);
|
||||
std::swap(p2, a_Other.p2);
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cCuboid::Assign(int a_X1, int a_Y1, int a_Z1, int a_X2, int a_Y2, int a_Z2)
|
||||
{
|
||||
p1.x = a_X1;
|
||||
|
@ -20,6 +20,8 @@ public:
|
||||
cCuboid(int a_X1, int a_Y1, int a_Z1) : p1(a_X1, a_Y1, a_Z1), p2(a_X1, a_Y1, a_Z1) {}
|
||||
cCuboid(int a_X1, int a_Y1, int a_Z1, int a_X2, int a_Y2, int a_Z2) : p1(a_X1, a_Y1, a_Z1), p2(a_X2, a_Y2, a_Z2) {}
|
||||
|
||||
cCuboid & operator=(cCuboid a_Other);
|
||||
|
||||
void Assign(int a_X1, int a_Y1, int a_Z1, int a_X2, int a_Y2, int a_Z2);
|
||||
void Assign(const cCuboid & a_SrcCuboid);
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ChatColor.h"
|
||||
#include <limits>
|
||||
#include <cmath>
|
||||
|
||||
@ -471,18 +470,7 @@ inline void AddFaceDirection(int & a_BlockX, unsigned char & a_BlockY, int & a_B
|
||||
{
|
||||
int Y = a_BlockY;
|
||||
AddFaceDirection(a_BlockX, Y, a_BlockZ, a_BlockFace, a_bInverse);
|
||||
if (Y < 0)
|
||||
{
|
||||
a_BlockY = 0;
|
||||
}
|
||||
else if (Y > 255)
|
||||
{
|
||||
a_BlockY = 255;
|
||||
}
|
||||
else
|
||||
{
|
||||
a_BlockY = (unsigned char)Y;
|
||||
}
|
||||
a_BlockY = Clamp<unsigned char>((unsigned char)Y, 0, 255);
|
||||
}
|
||||
|
||||
|
||||
@ -727,14 +715,5 @@ namespace ItemCategory
|
||||
// tolua_end
|
||||
|
||||
|
||||
inline bool BlockRequiresSpecialTool(BLOCKTYPE a_BlockType)
|
||||
{
|
||||
if(!IsValidBlock(a_BlockType)) return false;
|
||||
return cBlockInfo::RequiresSpecialTool(a_BlockType);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -40,7 +40,7 @@ Serialization will never put zero-level enchantments into the stringspec and wil
|
||||
class cEnchantments
|
||||
{
|
||||
public:
|
||||
/** Individual enchantment IDs, corresponding to their NBT IDs ( http://www.minecraftwiki.net/wiki/Data_Values#Enchantment_IDs )
|
||||
/** Individual enchantment IDs, corresponding to their NBT IDs: http://www.minecraftwiki.net/wiki/Data_Values#Enchantment_IDs
|
||||
*/
|
||||
|
||||
enum
|
||||
|
@ -1,6 +1,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#undef ntohll
|
||||
#define ntohll(x) ((((UInt64)ntohl((u_long)x)) << 32) + ntohl(x >> 32))
|
||||
|
||||
|
||||
|
@ -28,7 +28,7 @@ public:
|
||||
|
||||
// tolua_end
|
||||
|
||||
CLASS_PROTODEF(cArrowEntity);
|
||||
CLASS_PROTODEF(cArrowEntity)
|
||||
|
||||
/// 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);
|
||||
|
@ -21,7 +21,7 @@ class cBoat :
|
||||
typedef cEntity super;
|
||||
|
||||
public:
|
||||
CLASS_PROTODEF(cBoat);
|
||||
CLASS_PROTODEF(cBoat)
|
||||
|
||||
// cEntity overrides:
|
||||
virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
|
||||
|
@ -4,11 +4,64 @@ project (MCServer)
|
||||
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/../")
|
||||
|
||||
file(GLOB SOURCE
|
||||
"*.cpp"
|
||||
"*.h"
|
||||
)
|
||||
SET (SRCS
|
||||
ArrowEntity.cpp
|
||||
Boat.cpp
|
||||
EnderCrystal.cpp
|
||||
Entity.cpp
|
||||
EntityEffect.cpp
|
||||
ExpBottleEntity.cpp
|
||||
ExpOrb.cpp
|
||||
FallingBlock.cpp
|
||||
FireChargeEntity.cpp
|
||||
FireworkEntity.cpp
|
||||
Floater.cpp
|
||||
GhastFireballEntity.cpp
|
||||
HangingEntity.cpp
|
||||
ItemFrame.cpp
|
||||
Minecart.cpp
|
||||
Painting.cpp
|
||||
Pawn.cpp
|
||||
Pickup.cpp
|
||||
Player.cpp
|
||||
ProjectileEntity.cpp
|
||||
SplashPotionEntity.cpp
|
||||
TNTEntity.cpp
|
||||
ThrownEggEntity.cpp
|
||||
ThrownEnderPearlEntity.cpp
|
||||
ThrownSnowballEntity.cpp
|
||||
WitherSkullEntity.cpp)
|
||||
|
||||
add_library(Entities ${SOURCE})
|
||||
SET (HDRS
|
||||
ArrowEntity.h
|
||||
Boat.h
|
||||
EnderCrystal.h
|
||||
Entity.h
|
||||
EntityEffect.h
|
||||
ExpBottleEntity.h
|
||||
ExpOrb.h
|
||||
FallingBlock.h
|
||||
FireChargeEntity.h
|
||||
FireworkEntity.h
|
||||
Floater.h
|
||||
GhastFireballEntity.h
|
||||
HangingEntity.h
|
||||
ItemFrame.h
|
||||
Minecart.h
|
||||
Painting.h
|
||||
Pawn.h
|
||||
Pickup.h
|
||||
Player.h
|
||||
ProjectileEntity.h
|
||||
SplashPotionEntity.h
|
||||
TNTEntity.h
|
||||
ThrownEggEntity.h
|
||||
ThrownEnderPearlEntity.h
|
||||
ThrownSnowballEntity.h
|
||||
WitherSkullEntity.h)
|
||||
|
||||
if(NOT MSVC)
|
||||
add_library(Entities ${SRCS} ${HDRS})
|
||||
|
||||
target_link_libraries(Entities WorldStorage)
|
||||
endif()
|
||||
|
@ -15,7 +15,7 @@ class cEnderCrystal :
|
||||
typedef cEntity super;
|
||||
|
||||
public:
|
||||
CLASS_PROTODEF(cEnderCrystal);
|
||||
CLASS_PROTODEF(cEnderCrystal)
|
||||
|
||||
cEnderCrystal(double a_X, double a_Y, double a_Z);
|
||||
|
||||
|
@ -49,6 +49,7 @@ cEntity::cEntity(eEntityType a_EntityType, double a_X, double a_Y, double a_Z, d
|
||||
, m_IsSubmerged(false)
|
||||
, m_AirLevel(0)
|
||||
, m_AirTickTimer(0)
|
||||
, m_TicksAlive(0)
|
||||
, m_HeadYaw(0.0)
|
||||
, m_Rot(0.0, 0.0, 0.0)
|
||||
, m_Pos(a_X, a_Y, a_Z)
|
||||
@ -327,10 +328,7 @@ bool cEntity::DoTakeDamage(TakeDamageInfo & a_TDI)
|
||||
|
||||
// TODO: Apply damage to armor
|
||||
|
||||
if (m_Health < 0)
|
||||
{
|
||||
m_Health = 0;
|
||||
}
|
||||
m_Health = std::max(m_Health, 0);
|
||||
|
||||
if ((IsMob() || IsPlayer()) && (a_TDI.Attacker != NULL)) // Knockback for only players and mobs
|
||||
{
|
||||
@ -562,6 +560,8 @@ void cEntity::SetHealth(int a_Health)
|
||||
|
||||
void cEntity::Tick(float a_Dt, cChunk & a_Chunk)
|
||||
{
|
||||
m_TicksAlive++;
|
||||
|
||||
if (m_InvulnerableTicks > 0)
|
||||
{
|
||||
m_InvulnerableTicks--;
|
||||
@ -1146,10 +1146,7 @@ void cEntity::SetMaxHealth(int a_MaxHealth)
|
||||
m_MaxHealth = a_MaxHealth;
|
||||
|
||||
// Reset health, if too high:
|
||||
if (m_Health > a_MaxHealth)
|
||||
{
|
||||
m_Health = a_MaxHealth;
|
||||
}
|
||||
m_Health = std::min(m_Health, a_MaxHealth);
|
||||
}
|
||||
|
||||
|
||||
|
@ -416,6 +416,9 @@ public:
|
||||
/** Gets remaining air of a monster */
|
||||
int GetAirLevel(void) const { return m_AirLevel; }
|
||||
|
||||
/** Gets number of ticks this entity has existed for */
|
||||
long int GetTicksAlive(void) const { return m_TicksAlive; }
|
||||
|
||||
/** Gets the invulnerable ticks from the entity */
|
||||
int GetInvulnerableTicks(void) const { return m_InvulnerableTicks; }
|
||||
|
||||
@ -425,7 +428,7 @@ public:
|
||||
// tolua_end
|
||||
|
||||
/// 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().
|
||||
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL)
|
||||
@ -521,6 +524,9 @@ protected:
|
||||
int m_AirLevel;
|
||||
int m_AirTickTimer;
|
||||
|
||||
/** The number of ticks this entity has been alive for */
|
||||
long int m_TicksAlive;
|
||||
|
||||
private:
|
||||
/** Measured in degrees, [-180, +180) */
|
||||
double m_HeadYaw;
|
||||
|
@ -55,7 +55,7 @@ public:
|
||||
@param a_OtherEffect The other effect to copy */
|
||||
cEntityEffect & operator=(cEntityEffect a_OtherEffect);
|
||||
|
||||
virtual ~cEntityEffect(void) {};
|
||||
virtual ~cEntityEffect(void) {}
|
||||
|
||||
/** Creates a pointer to the proper entity effect from the effect type
|
||||
@warning This function creates raw pointers that must be manually managed.
|
||||
|
@ -21,7 +21,7 @@ public:
|
||||
|
||||
// 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);
|
||||
|
||||
|
@ -16,7 +16,7 @@ class cExpOrb :
|
||||
public:
|
||||
// tolua_end
|
||||
|
||||
CLASS_PROTODEF(cExpOrb);
|
||||
CLASS_PROTODEF(cExpOrb)
|
||||
|
||||
cExpOrb(double a_X, double a_Y, double a_Z, int a_Reward);
|
||||
cExpOrb(const Vector3d & a_Pos, int a_Reward);
|
||||
|
@ -20,7 +20,7 @@ class cFallingBlock :
|
||||
typedef cEntity super;
|
||||
|
||||
public:
|
||||
CLASS_PROTODEF(cFallingBlock);
|
||||
CLASS_PROTODEF(cFallingBlock)
|
||||
|
||||
/// Creates a new falling block. a_BlockPosition is expected in world coords
|
||||
cFallingBlock(const Vector3i & a_BlockPosition, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
|
||||
|
@ -21,7 +21,7 @@ public:
|
||||
|
||||
// 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);
|
||||
|
||||
|
@ -21,7 +21,7 @@ public:
|
||||
|
||||
// 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);
|
||||
const cItem & GetItem(void) const { return m_FireworkItem; }
|
||||
|
@ -16,7 +16,7 @@ class cFloater :
|
||||
public:
|
||||
// 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);
|
||||
|
||||
|
@ -21,7 +21,7 @@ public:
|
||||
|
||||
// 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);
|
||||
|
||||
|
@ -16,7 +16,7 @@ class cHangingEntity :
|
||||
|
||||
public:
|
||||
|
||||
CLASS_PROTODEF(cHangingEntity);
|
||||
CLASS_PROTODEF(cHangingEntity)
|
||||
|
||||
cHangingEntity(eEntityType a_EntityType, eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z);
|
||||
|
||||
@ -38,7 +38,7 @@ public:
|
||||
private:
|
||||
|
||||
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;
|
||||
|
||||
|
@ -16,7 +16,7 @@ class cItemFrame :
|
||||
|
||||
public:
|
||||
|
||||
CLASS_PROTODEF(cItemFrame);
|
||||
CLASS_PROTODEF(cItemFrame)
|
||||
|
||||
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
|
||||
|
||||
/** 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 */
|
||||
Byte GetRotation(void) const { return m_Rotation; } // tolua_export
|
||||
|
@ -103,21 +103,7 @@ cMinecart::cMinecart(ePayload a_Payload, double a_X, double a_Y, double a_Z) :
|
||||
|
||||
void cMinecart::SpawnOn(cClientHandle & a_ClientHandle)
|
||||
{
|
||||
char SubType = 0;
|
||||
switch (m_Payload)
|
||||
{
|
||||
case mpNone: SubType = 0; break;
|
||||
case mpChest: SubType = 1; break;
|
||||
case mpFurnace: SubType = 2; break;
|
||||
case mpTNT: SubType = 3; break;
|
||||
case mpHopper: SubType = 5; break;
|
||||
default:
|
||||
{
|
||||
ASSERT(!"Unknown payload, cannot spawn on client");
|
||||
return;
|
||||
}
|
||||
}
|
||||
a_ClientHandle.SendSpawnVehicle(*this, 10, SubType); // 10 = Minecarts, SubType = What type of Minecart
|
||||
a_ClientHandle.SendSpawnVehicle(*this, 10, (char)m_Payload); // 10 = Minecarts
|
||||
a_ClientHandle.SendEntityMetadata(*this);
|
||||
}
|
||||
|
||||
|
@ -21,15 +21,16 @@ class cMinecart :
|
||||
typedef cEntity super;
|
||||
|
||||
public:
|
||||
CLASS_PROTODEF(cMinecart);
|
||||
CLASS_PROTODEF(cMinecart)
|
||||
|
||||
/** Minecart payload, values correspond to packet subtype */
|
||||
enum ePayload
|
||||
{
|
||||
mpNone, // Empty minecart, ridable by player or mobs
|
||||
mpChest, // Minecart-with-chest, can store a grid of 3*8 items
|
||||
mpFurnace, // Minecart-with-furnace, can be powered
|
||||
mpTNT, // Minecart-with-TNT, can be blown up with activator rail
|
||||
mpHopper, // Minecart-with-hopper, can be hopper
|
||||
mpNone = 0, // Empty minecart, ridable by player or mobs
|
||||
mpChest = 1, // Minecart-with-chest, can store a grid of 3*8 items
|
||||
mpFurnace = 2, // Minecart-with-furnace, can be powered
|
||||
mpTNT = 3, // Minecart-with-TNT, can be blown up with activator rail
|
||||
mpHopper = 5, // Minecart-with-hopper, can be hopper
|
||||
// TODO: Spawner minecarts, (and possibly any block in a minecart with NBT editing)
|
||||
} ;
|
||||
|
||||
@ -88,7 +89,7 @@ class cRideableMinecart :
|
||||
typedef cMinecart super;
|
||||
|
||||
public:
|
||||
CLASS_PROTODEF(cRideableMinecart);
|
||||
CLASS_PROTODEF(cRideableMinecart)
|
||||
|
||||
cRideableMinecart(double a_X, double a_Y, double a_Z, const cItem & a_Content, int a_Height);
|
||||
|
||||
@ -112,7 +113,7 @@ class cMinecartWithChest :
|
||||
typedef cMinecart super;
|
||||
|
||||
public:
|
||||
CLASS_PROTODEF(cMinecartWithChest);
|
||||
CLASS_PROTODEF(cMinecartWithChest)
|
||||
|
||||
/// Number of item slots in the chest
|
||||
static const int NumSlots = 9 * 3;
|
||||
@ -143,7 +144,7 @@ class cMinecartWithFurnace :
|
||||
typedef cMinecart super;
|
||||
|
||||
public:
|
||||
CLASS_PROTODEF(cMinecartWithFurnace);
|
||||
CLASS_PROTODEF(cMinecartWithFurnace)
|
||||
|
||||
cMinecartWithFurnace(double a_X, double a_Y, double a_Z);
|
||||
|
||||
@ -175,7 +176,7 @@ class cMinecartWithTNT :
|
||||
typedef cMinecart super;
|
||||
|
||||
public:
|
||||
CLASS_PROTODEF(cMinecartWithTNT);
|
||||
CLASS_PROTODEF(cMinecartWithTNT)
|
||||
|
||||
cMinecartWithTNT(double a_X, double a_Y, double a_Z);
|
||||
} ;
|
||||
@ -190,7 +191,7 @@ class cMinecartWithHopper :
|
||||
typedef cMinecart super;
|
||||
|
||||
public:
|
||||
CLASS_PROTODEF(cMinecartWithHopper);
|
||||
CLASS_PROTODEF(cMinecartWithHopper)
|
||||
|
||||
cMinecartWithHopper(double a_X, double a_Y, double a_Z);
|
||||
} ;
|
||||
|
@ -15,7 +15,7 @@ class cPainting :
|
||||
typedef cEntity super;
|
||||
|
||||
public:
|
||||
CLASS_PROTODEF(cPainting);
|
||||
CLASS_PROTODEF(cPainting)
|
||||
|
||||
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
|
||||
|
@ -16,7 +16,7 @@ class cPawn :
|
||||
typedef cEntity super;
|
||||
|
||||
public:
|
||||
CLASS_PROTODEF(cPawn);
|
||||
CLASS_PROTODEF(cPawn)
|
||||
|
||||
cPawn(eEntityType a_EntityType, double a_Width, double a_Height);
|
||||
|
||||
|
@ -23,7 +23,7 @@ class cPickup :
|
||||
public:
|
||||
// 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);
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
|
||||
|
||||
#include "Player.h"
|
||||
#include "../ChatColor.h"
|
||||
#include "../Server.h"
|
||||
#include "../UI/Window.h"
|
||||
#include "../UI/WindowOwner.h"
|
||||
@ -381,10 +382,7 @@ short cPlayer::DeltaExperience(short a_Xp_delta)
|
||||
m_CurrentXp += a_Xp_delta;
|
||||
|
||||
// Make sure they didn't subtract too much
|
||||
if (m_CurrentXp < 0)
|
||||
{
|
||||
m_CurrentXp = 0;
|
||||
}
|
||||
m_CurrentXp = std::max<short int>(m_CurrentXp, 0);
|
||||
|
||||
// Update total for score calculation
|
||||
if (a_Xp_delta > 0)
|
||||
@ -624,7 +622,8 @@ void cPlayer::FinishEating(void)
|
||||
GetInventory().RemoveOneEquippedItem();
|
||||
|
||||
// if the food is mushroom soup, return a bowl to the inventory
|
||||
if( Item.m_ItemType == E_ITEM_MUSHROOM_SOUP ) {
|
||||
if (Item.m_ItemType == E_ITEM_MUSHROOM_SOUP)
|
||||
{
|
||||
cItem emptyBowl(E_ITEM_BOWL, 1, 0, "");
|
||||
GetInventory().AddItem(emptyBowl, true, true);
|
||||
}
|
||||
@ -1525,7 +1524,7 @@ AString cPlayer::GetColor(void) const
|
||||
{
|
||||
if (m_Color != '-')
|
||||
{
|
||||
return cChatColor::Color + m_Color;
|
||||
return cChatColor::Delimiter + m_Color;
|
||||
}
|
||||
|
||||
if (m_Groups.size() < 1)
|
||||
|
@ -48,7 +48,7 @@ public:
|
||||
|
||||
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 */
|
||||
virtual cItem GetEquippedWeapon(void) const override { return m_Inventory.GetEquippedItem(); }
|
||||
|
@ -146,10 +146,12 @@ public:
|
||||
(a_Entity->GetUniqueID() == m_Projectile->GetCreatorUniqueID()) // Do not check whoever shot the projectile
|
||||
)
|
||||
{
|
||||
// TODO: Don't check creator only for the first 5 ticks
|
||||
// so that arrows stuck in ground and dug up can hurt the player
|
||||
// Don't check creator only for the first 5 ticks so that projectiles can collide with the creator
|
||||
if (m_Projectile->GetTicksAlive() <= 5)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
cBoundingBox EntBox(a_Entity->GetPosition(), a_Entity->GetWidth() / 2, a_Entity->GetHeight());
|
||||
|
||||
|
@ -41,7 +41,7 @@ public:
|
||||
|
||||
// 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, const Vector3d & a_Pos, const Vector3d & a_Speed, double a_Width, double a_Height);
|
||||
|
@ -2,11 +2,15 @@
|
||||
|
||||
#include "SplashPotionEntity.h"
|
||||
#include "Pawn.h"
|
||||
#include "../ClientHandle.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/// Converts an angle in radians into a byte representation used by the network protocol
|
||||
#define ANGLE_TO_PROTO(X) (Byte)(X * 255 / 360)
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// cSplashPotionEntityCallback:
|
||||
|
||||
@ -29,25 +33,23 @@ public:
|
||||
/** Called by cWorld::ForEachEntity(), adds the stored entity effect to the entity, if it is close enough. */
|
||||
virtual bool Item(cEntity * a_Entity) override
|
||||
{
|
||||
double SplashDistance = (a_Entity->GetPosition() - m_HitPos).Length();
|
||||
if (SplashDistance >= 20)
|
||||
{
|
||||
// Too far away
|
||||
return false;
|
||||
}
|
||||
if (!a_Entity->IsPawn())
|
||||
{
|
||||
// Not an entity that can take effects
|
||||
return false;
|
||||
}
|
||||
|
||||
double SplashDistance = (a_Entity->GetPosition() - m_HitPos).Length();
|
||||
if (SplashDistance >= 20)
|
||||
{
|
||||
// Too far away
|
||||
return false;
|
||||
}
|
||||
|
||||
// y = -0.25x + 1, where x is the distance from the player. Approximation for potion splash.
|
||||
// TODO: better equation
|
||||
double Reduction = -0.25 * SplashDistance + 1.0;
|
||||
if (Reduction < 0)
|
||||
{
|
||||
Reduction = 0;
|
||||
}
|
||||
Reduction = std::max(Reduction, 0.0);
|
||||
|
||||
((cPawn *) a_Entity)->AddEntityEffect(m_EntityEffectType, m_EntityEffect.GetDuration(), m_EntityEffect.GetIntensity(), Reduction);
|
||||
return false;
|
||||
@ -72,12 +74,13 @@ cSplashPotionEntity::cSplashPotionEntity(
|
||||
const Vector3d & a_Speed,
|
||||
cEntityEffect::eType a_EntityEffectType,
|
||||
cEntityEffect a_EntityEffect,
|
||||
int a_PotionParticleType
|
||||
int a_PotionColor
|
||||
) :
|
||||
super(pkSplashPotion, a_Creator, a_X, a_Y, a_Z, 0.25, 0.25),
|
||||
m_EntityEffectType(a_EntityEffectType),
|
||||
m_EntityEffect(a_EntityEffect),
|
||||
m_PotionParticleType(a_PotionParticleType)
|
||||
m_PotionColor(a_PotionColor),
|
||||
m_DestroyTimer(-1)
|
||||
{
|
||||
SetSpeed(a_Speed);
|
||||
}
|
||||
@ -89,7 +92,7 @@ cSplashPotionEntity::cSplashPotionEntity(
|
||||
void cSplashPotionEntity::OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace)
|
||||
{
|
||||
Splash(a_HitPos);
|
||||
Destroy();
|
||||
m_DestroyTimer = 2;
|
||||
}
|
||||
|
||||
|
||||
@ -100,7 +103,7 @@ void cSplashPotionEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_
|
||||
{
|
||||
a_EntityHit.TakeDamage(dtRangedAttack, this, 0, 1);
|
||||
Splash(a_HitPos);
|
||||
Destroy(true);
|
||||
m_DestroyTimer = 5;
|
||||
}
|
||||
|
||||
|
||||
@ -112,7 +115,17 @@ void cSplashPotionEntity::Splash(const Vector3d & a_HitPos)
|
||||
cSplashPotionCallback Callback(a_HitPos, m_EntityEffectType, m_EntityEffect);
|
||||
m_World->ForEachEntity(Callback);
|
||||
|
||||
m_World->BroadcastSoundParticleEffect(2002, (int)a_HitPos.x, (int)a_HitPos.y, (int)a_HitPos.z, m_PotionParticleType);
|
||||
m_World->BroadcastSoundParticleEffect(2002, (int)floor(a_HitPos.x), (int)floor(a_HitPos.y), (int)floor(a_HitPos.z), m_PotionColor);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cSplashPotionEntity::SpawnOn(cClientHandle & a_Client)
|
||||
{
|
||||
a_Client.SendSpawnObject(*this, 73, m_PotionColor, ANGLE_TO_PROTO(GetYaw()), ANGLE_TO_PROTO(GetPitch()));
|
||||
a_Client.SendEntityMetadata(*this);
|
||||
}
|
||||
|
||||
|
||||
|
@ -23,7 +23,7 @@ public:
|
||||
|
||||
// tolua_end
|
||||
|
||||
CLASS_PROTODEF(cSplashPotionEntity);
|
||||
CLASS_PROTODEF(cSplashPotionEntity)
|
||||
|
||||
cSplashPotionEntity(
|
||||
cEntity * a_Creator,
|
||||
@ -31,29 +31,51 @@ public:
|
||||
const Vector3d & a_Speed,
|
||||
cEntityEffect::eType a_EntityEffectType,
|
||||
cEntityEffect a_EntityEffect,
|
||||
int a_PotionParticleType
|
||||
int a_PotionColor
|
||||
);
|
||||
|
||||
cEntityEffect::eType GetEntityEffectType(void) const { return m_EntityEffectType; }
|
||||
cEntityEffect GetEntityEffect(void) const { return m_EntityEffect; }
|
||||
int GetPotionParticleType(void) const { return m_PotionParticleType; }
|
||||
int GetPotionColor(void) const { return m_PotionColor; }
|
||||
|
||||
void SetEntityEffectType(cEntityEffect::eType a_EntityEffectType) { m_EntityEffectType = a_EntityEffectType; }
|
||||
void SetEntityEffect(cEntityEffect a_EntityEffect) { m_EntityEffect = a_EntityEffect; }
|
||||
void SetPotionParticleType(int a_PotionParticleType) { m_PotionParticleType = a_PotionParticleType; }
|
||||
void SetPotionColor(int a_PotionColor) { m_PotionColor = a_PotionColor; }
|
||||
|
||||
protected:
|
||||
|
||||
cEntityEffect::eType m_EntityEffectType;
|
||||
cEntityEffect m_EntityEffect;
|
||||
int m_PotionParticleType;
|
||||
int m_PotionColor;
|
||||
|
||||
|
||||
// cProjectileEntity overrides:
|
||||
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override;
|
||||
virtual void OnHitEntity (cEntity & a_EntityHit, const Vector3d & a_HitPos) override;
|
||||
virtual void Tick (float a_Dt, cChunk & a_Chunk) override
|
||||
{
|
||||
if (m_DestroyTimer > 0)
|
||||
{
|
||||
m_DestroyTimer--;
|
||||
if (m_DestroyTimer == 0)
|
||||
{
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
super::Tick(a_Dt, a_Chunk);
|
||||
}
|
||||
}
|
||||
|
||||
/** Splashes the potion, fires its particle effects and sounds
|
||||
@param a_HitPos The position where the potion will splash */
|
||||
void Splash(const Vector3d & a_HitPos);
|
||||
|
||||
virtual void SpawnOn(cClientHandle & a_Client) override;
|
||||
|
||||
private:
|
||||
/** Time in ticks to wait for the hit animation to begin before destroying */
|
||||
int m_DestroyTimer;
|
||||
} ; // tolua_export
|
||||
|
@ -14,7 +14,7 @@ class cTNTEntity :
|
||||
|
||||
public:
|
||||
// tolua_end
|
||||
CLASS_PROTODEF(cTNTEntity);
|
||||
CLASS_PROTODEF(cTNTEntity)
|
||||
|
||||
cTNTEntity(double a_X, double a_Y, double a_Z, int a_FuseTicks = 80);
|
||||
cTNTEntity(const Vector3d & a_Pos, int a_FuseTicks = 80);
|
||||
|
@ -21,7 +21,7 @@ public:
|
||||
|
||||
// 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);
|
||||
|
||||
|
@ -21,7 +21,7 @@ public:
|
||||
|
||||
// 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);
|
||||
|
||||
|
@ -21,7 +21,7 @@ public:
|
||||
|
||||
// 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);
|
||||
|
||||
|
@ -22,7 +22,7 @@ public:
|
||||
|
||||
// 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);
|
||||
|
||||
|
@ -4,11 +4,62 @@ project (MCServer)
|
||||
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/../")
|
||||
|
||||
file(GLOB SOURCE
|
||||
"*.cpp"
|
||||
"*.h"
|
||||
)
|
||||
SET (SRCS
|
||||
BioGen.cpp
|
||||
Caves.cpp
|
||||
ChunkDesc.cpp
|
||||
ChunkGenerator.cpp
|
||||
CompoGen.cpp
|
||||
ComposableGenerator.cpp
|
||||
DistortedHeightmap.cpp
|
||||
EndGen.cpp
|
||||
FinishGen.cpp
|
||||
GridStructGen.cpp
|
||||
HeiGen.cpp
|
||||
MineShafts.cpp
|
||||
NetherFortGen.cpp
|
||||
Noise3DGenerator.cpp
|
||||
POCPieceGenerator.cpp
|
||||
PieceGenerator.cpp
|
||||
Prefab.cpp
|
||||
PrefabPiecePool.cpp
|
||||
RainbowRoadsGen.cpp
|
||||
Ravines.cpp
|
||||
StructGen.cpp
|
||||
TestRailsGen.cpp
|
||||
Trees.cpp
|
||||
UnderwaterBaseGen.cpp
|
||||
VillageGen.cpp)
|
||||
|
||||
add_library(Generating ${SOURCE})
|
||||
SET (HDRS
|
||||
BioGen.h
|
||||
Caves.h
|
||||
ChunkDesc.h
|
||||
ChunkGenerator.h
|
||||
CompoGen.h
|
||||
ComposableGenerator.h
|
||||
DistortedHeightmap.h
|
||||
EndGen.h
|
||||
FinishGen.h
|
||||
GridStructGen.h
|
||||
HeiGen.h
|
||||
MineShafts.h
|
||||
NetherFortGen.h
|
||||
Noise3DGenerator.h
|
||||
POCPieceGenerator.h
|
||||
PieceGenerator.h
|
||||
Prefab.h
|
||||
PrefabPiecePool.h
|
||||
RainbowRoadsGen.h
|
||||
Ravines.h
|
||||
StructGen.h
|
||||
TestRailsGen.h
|
||||
Trees.h
|
||||
UnderwaterBaseGen.h
|
||||
VillageGen.h)
|
||||
|
||||
if(NOT MSVC)
|
||||
add_library(Generating ${SRCS} ${HDRS})
|
||||
|
||||
target_link_libraries(Generating OSSupport iniFile Blocks)
|
||||
endif()
|
||||
|
@ -44,7 +44,7 @@ public:
|
||||
{
|
||||
public:
|
||||
cGenerator(cChunkGenerator & a_ChunkGenerator);
|
||||
virtual ~cGenerator() {} ; // Force a virtual destructor
|
||||
virtual ~cGenerator() {} // Force a virtual destructor
|
||||
|
||||
/// Called to initialize the generator on server startup.
|
||||
virtual void Initialize(cIniFile & a_IniFile);
|
||||
|
@ -415,6 +415,10 @@ void cComposableGenerator::InitFinishGens(cIniFile & a_IniFile)
|
||||
{
|
||||
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)
|
||||
{
|
||||
m_FinishGens.push_back(new cTestRailsGen(Seed, 100, 1, 7, 50));
|
||||
|
@ -675,6 +675,8 @@ void cDistortedHeightmap::ComposeColumn(cChunkDesc & a_ChunkDesc, int a_RelX, in
|
||||
case biForestHills:
|
||||
case biTaigaHills:
|
||||
case biExtremeHillsEdge:
|
||||
case biExtremeHillsPlus:
|
||||
case biExtremeHills:
|
||||
case biJungle:
|
||||
case biJungleHills:
|
||||
case biJungleEdge:
|
||||
@ -750,18 +752,6 @@ void cDistortedHeightmap::ComposeColumn(cChunkDesc & a_ChunkDesc, int a_RelX, in
|
||||
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 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 NoiseY = ((NOISE_DATATYPE)(m_CurChunkZ * cChunkDef::Width + a_RelZ)) / FrequencyZ;
|
||||
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);
|
||||
return;
|
||||
}
|
||||
|
@ -45,42 +45,14 @@ static inline bool IsWater(BLOCKTYPE a_BlockType)
|
||||
|
||||
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.
|
||||
double ChunkZ = a_ChunkDesc.GetChunkZ() + 0.1;
|
||||
int ChunkX = a_ChunkDesc.GetChunkX();
|
||||
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));
|
||||
int Val1 = m_Noise.IntNoise2DInt(ChunkX ^ ChunkZ, ChunkZ + ChunkX);
|
||||
int Val2 = m_Noise.IntNoise2DInt(ChunkZ ^ ChunkX, ChunkZ - ChunkX);
|
||||
|
||||
if (Val1 < 0)
|
||||
{
|
||||
Val1 = -Val1;
|
||||
}
|
||||
|
||||
if (Val2 < 0)
|
||||
{
|
||||
Val2 = -Val2;
|
||||
}
|
||||
|
||||
int PosX, PosZ;
|
||||
// Calculate PosX
|
||||
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);
|
||||
}
|
||||
int PosX = Val1 % 16;
|
||||
int PosZ = Val2 % 16;
|
||||
|
||||
for (int y = 1; y < cChunkDef::Height; y++)
|
||||
{
|
||||
@ -88,12 +60,14 @@ void cFinishGenNetherClumpFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!cBlockInfo::IsSolid(a_ChunkDesc.GetBlockType(PosX, y - 1, PosZ))) // Only place on solid blocks
|
||||
{
|
||||
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)
|
||||
{
|
||||
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++)
|
||||
{
|
||||
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++)
|
||||
{
|
||||
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++)
|
||||
{
|
||||
if ((y < 1) || (y > cChunkDef::Height))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (a_ChunkDesc.GetBlockType(x, y, z) != E_BLOCK_AIR) // Don't replace non air blocks.
|
||||
{
|
||||
continue;
|
||||
@ -144,9 +123,8 @@ void cFinishGenNetherClumpFoliage::TryPlaceClump(cChunkDesc & a_ChunkDesc, int a
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NOISE_DATATYPE Val = m_Noise.CubicNoise2D(xx, zz);
|
||||
if (Val < -0.70)
|
||||
NOISE_DATATYPE Val = m_Noise.IntNoise2D(xx, zz);
|
||||
if (Val < -0.5)
|
||||
{
|
||||
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:
|
||||
|
||||
|
@ -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 :
|
||||
public cFinishGen
|
||||
{
|
||||
|
@ -997,7 +997,6 @@ cMineShaft * cMineShaftCrossing::CreateAndFit(
|
||||
BoundingBox.p2.y -= 4;
|
||||
}
|
||||
}
|
||||
rnd >>= 2;
|
||||
switch (a_Direction)
|
||||
{
|
||||
case dirXP: BoundingBox.p2.x += 4; BoundingBox.p1.z -= 2; BoundingBox.p2.z += 2; break;
|
||||
|
@ -2367,9 +2367,9 @@ const cPrefab::sDef g_AlchemistVillagePrefabs[] =
|
||||
"a: 24: 2\n" /* sandstone */
|
||||
"b: 4: 0\n" /* cobblestone */
|
||||
"c: 24: 0\n" /* sandstone */
|
||||
"d: 12: 0\n" /* sand */
|
||||
"e: 13: 0\n" /* gravel */
|
||||
"f: 5: 0\n" /* wood */
|
||||
"d: 13: 0\n" /* gravel */
|
||||
"e: 5: 0\n" /* wood */
|
||||
"f: 12: 0\n" /* sand */
|
||||
"g: 64: 3\n" /* wooddoorblock */
|
||||
"h: 85: 0\n" /* fence */
|
||||
"i: 64: 0\n" /* wooddoorblock */
|
||||
@ -2392,26 +2392,26 @@ const cPrefab::sDef g_AlchemistVillagePrefabs[] =
|
||||
/* * 012345678901234 */
|
||||
/* 0 */ "mmmabbbammmmmmm"
|
||||
/* 1 */ "mmmmbbbmmmmmmmm"
|
||||
/* 2 */ "acccccccccadddd"
|
||||
/* 3 */ "cccccccccccdddd"
|
||||
/* 4 */ "cccccccccccdddd"
|
||||
/* 5 */ "cccccccccccdddd"
|
||||
/* 6 */ "cccccccccccdddd"
|
||||
/* 7 */ "cccccccccccdddd"
|
||||
/* 8 */ "acccccccccadddd"
|
||||
/* 2 */ "acccccccccacccc"
|
||||
/* 3 */ "ccccccccccccccc"
|
||||
/* 4 */ "ccccccccccccccc"
|
||||
/* 5 */ "ccccccccccccccc"
|
||||
/* 6 */ "ccccccccccccccc"
|
||||
/* 7 */ "ccccccccccccccc"
|
||||
/* 8 */ "acccccccccacccc"
|
||||
|
||||
// Level 1
|
||||
/* z\x* 11111 */
|
||||
/* * 012345678901234 */
|
||||
/* 0 */ "mmmaeeeammmmmmm"
|
||||
/* 1 */ "mmmmeeemmmmmmmm"
|
||||
/* 2 */ "accccfccccadddd"
|
||||
/* 3 */ "cfffffffffcdddd"
|
||||
/* 4 */ "cfffffffffcdddd"
|
||||
/* 5 */ "cffffffffffdddd"
|
||||
/* 6 */ "cfffffffffcdddd"
|
||||
/* 7 */ "cfffffffffcdddd"
|
||||
/* 8 */ "acccccccccadddd"
|
||||
/* 0 */ "mmmadddammmmmmm"
|
||||
/* 1 */ "mmmmdddmmmmmmmm"
|
||||
/* 2 */ "acccceccccaffff"
|
||||
/* 3 */ "ceeeeeeeeecffff"
|
||||
/* 4 */ "ceeeeeeeeecffff"
|
||||
/* 5 */ "ceeeeeeeeeeffff"
|
||||
/* 6 */ "ceeeeeeeeecffff"
|
||||
/* 7 */ "ceeeeeeeeecffff"
|
||||
/* 8 */ "acccccccccaffff"
|
||||
|
||||
// Level 2
|
||||
/* z\x* 11111 */
|
||||
|
@ -4,11 +4,30 @@ project (MCServer)
|
||||
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/../../")
|
||||
|
||||
file(GLOB SOURCE
|
||||
"*.cpp"
|
||||
"*.h"
|
||||
)
|
||||
SET (SRCS
|
||||
AlchemistVillagePrefabs.cpp
|
||||
JapaneseVillagePrefabs.cpp
|
||||
NetherFortPrefabs.cpp
|
||||
PlainsVillagePrefabs.cpp
|
||||
RainbowRoadPrefabs.cpp
|
||||
SandFlatRoofVillagePrefabs.cpp
|
||||
SandVillagePrefabs.cpp
|
||||
TestRailsPrefabs.cpp
|
||||
UnderwaterBasePrefabs.cpp)
|
||||
|
||||
add_library(Generating_Prefabs ${SOURCE})
|
||||
SET (HDRS
|
||||
AlchemistVillagePrefabs.h
|
||||
JapaneseVillagePrefabs.h
|
||||
NetherFortPrefabs.h
|
||||
PlainsVillagePrefabs.h
|
||||
RainbowRoadPrefabs.h
|
||||
SandFlatRoofVillagePrefabs.h
|
||||
SandVillagePrefabs.h
|
||||
TestRailsPrefabs.h
|
||||
UnderwaterBasePrefabs.h)
|
||||
|
||||
if(NOT MSVC)
|
||||
add_library(Generating_Prefabs ${SRCS} ${HDRS})
|
||||
|
||||
target_link_libraries(Generating_Prefabs OSSupport iniFile Blocks)
|
||||
endif()
|
||||
|
@ -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
|
||||
{
|
||||
// Size:
|
||||
11, 7, 13, // SizeX = 11, SizeY = 7, SizeZ = 13
|
||||
11, 8, 13, // SizeX = 11, SizeY = 8, SizeZ = 13
|
||||
|
||||
// Hitbox (relative to bounding box):
|
||||
0, 0, 0, // MinX, MinY, MinZ
|
||||
10, 6, 12, // MaxX, MaxY, MaxZ
|
||||
10, 7, 12, // MaxX, MaxY, MaxZ
|
||||
|
||||
// Block definitions:
|
||||
".: 0: 0\n" /* air */
|
||||
@ -150,6 +150,7 @@ const cPrefab::sDef g_JapaneseVillagePrefabs[] =
|
||||
"f: 59: 7\n" /* crops */
|
||||
"g: 83: 0\n" /* reedblock */
|
||||
"h:113: 0\n" /* netherbrickfence */
|
||||
"i: 50: 5\n" /* torch */
|
||||
"m: 19: 0\n" /* sponge */,
|
||||
|
||||
// Block data:
|
||||
@ -270,7 +271,24 @@ const cPrefab::sDef g_JapaneseVillagePrefabs[] =
|
||||
/* 9 */ "..........."
|
||||
/* 10 */ ".h.......h."
|
||||
/* 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:
|
||||
"-1: 10, 2, 6: 5\n" /* Type -1, direction X+ */,
|
||||
@ -2195,33 +2213,33 @@ const cPrefab::sDef g_JapaneseVillagePrefabs[] =
|
||||
|
||||
// Level 1
|
||||
/* z\x* 0123456 */
|
||||
/* 0 */ "bmmmmmm"
|
||||
/* 1 */ "bmmmmmm"
|
||||
/* 2 */ "bmmmmmm"
|
||||
/* 3 */ "bmmmmmm"
|
||||
/* 4 */ "bmmmmmm"
|
||||
/* 5 */ "bmmmmmm"
|
||||
/* 0 */ "bbbbbbb"
|
||||
/* 1 */ "bbbbbbb"
|
||||
/* 2 */ "bbbbbbb"
|
||||
/* 3 */ "bbbabbb"
|
||||
/* 4 */ "bbbbbbb"
|
||||
/* 5 */ "bbbbbbb"
|
||||
/* 6 */ "bbbbbbb"
|
||||
|
||||
// Level 2
|
||||
/* z\x* 0123456 */
|
||||
/* 0 */ "......."
|
||||
/* 1 */ "..c.c.."
|
||||
/* 0 */ "mm...mm"
|
||||
/* 1 */ "m.c...m"
|
||||
/* 2 */ ".dccdc."
|
||||
/* 3 */ "..cefc."
|
||||
/* 4 */ ".ccfgh."
|
||||
/* 5 */ "..ccc.."
|
||||
/* 6 */ "......."
|
||||
/* 5 */ "m.ccc.m"
|
||||
/* 6 */ "mm...mm"
|
||||
|
||||
// Level 3
|
||||
/* z\x* 0123456 */
|
||||
/* 0 */ "......."
|
||||
/* 0 */ "m.....m"
|
||||
/* 1 */ "......."
|
||||
/* 2 */ "......."
|
||||
/* 3 */ "...e..."
|
||||
/* 4 */ "......."
|
||||
/* 5 */ "......."
|
||||
/* 6 */ "......."
|
||||
/* 6 */ "m.....m"
|
||||
|
||||
// Level 4
|
||||
/* z\x* 0123456 */
|
||||
|
@ -356,8 +356,8 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
"e: 8: 0\n" /* water */
|
||||
"f: 50: 5\n" /* torch */
|
||||
"g: 59: 7\n" /* crops */
|
||||
"h: 59: 0\n" /* crops */
|
||||
"i: 59: 1\n" /* crops */
|
||||
"h: 59: 3\n" /* crops */
|
||||
"i: 59: 5\n" /* crops */
|
||||
"m: 19: 0\n" /* sponge */,
|
||||
|
||||
// Block data:
|
||||
@ -368,7 +368,7 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
/* 1 */ "aaaaaaaaaaaaaaa"
|
||||
/* 2 */ "aaaaaaaaaaaaaaa"
|
||||
/* 3 */ "aaaaaaaaaaaaaaa"
|
||||
/* 4 */ "aaaaaaaaaaaaaaa"
|
||||
/* 4 */ "aaaaaaabaaaaaaa"
|
||||
/* 5 */ "aaaaaaabaaaaaaa"
|
||||
/* 6 */ "aaaaaaabaaaaaaa"
|
||||
/* 7 */ "aaaaaaabaaaaaaa"
|
||||
@ -405,12 +405,12 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
/* * 012345678901234 */
|
||||
/* 0 */ "f.....f.f.....f"
|
||||
/* 1 */ ".gg.gg...gg.gg."
|
||||
/* 2 */ ".gh.hg...gg.gg."
|
||||
/* 3 */ ".gh.ih...gg.gg."
|
||||
/* 4 */ ".gg.hg...gg.gg."
|
||||
/* 5 */ ".gg.hg...gg.gg."
|
||||
/* 6 */ ".ig.hg...gg.gg."
|
||||
/* 7 */ ".hg.gh...gg.gg."
|
||||
/* 2 */ ".gg.hg...gg.gg."
|
||||
/* 3 */ ".gg.gi...gg.gg."
|
||||
/* 4 */ ".gg.gg...gg.gg."
|
||||
/* 5 */ ".gg.gg...gg.gg."
|
||||
/* 6 */ ".gg.gg...gg.gg."
|
||||
/* 7 */ ".gg.gg...gg.gg."
|
||||
/* 8 */ "f.....f.f.....f"
|
||||
|
||||
// Level 4
|
||||
@ -3603,8 +3603,8 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
|
||||
// Block definitions:
|
||||
".: 0: 0\n" /* air */
|
||||
"a: 2: 0\n" /* grass */
|
||||
"b: 3: 0\n" /* dirt */
|
||||
"a: 3: 0\n" /* dirt */
|
||||
"b: 2: 0\n" /* grass */
|
||||
"c: 4: 0\n" /* cobblestone */
|
||||
"d: 67: 0\n" /* stairs */
|
||||
"e: 67: 2\n" /* stairs */
|
||||
@ -3629,19 +3629,19 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
// Level 0
|
||||
/* z\x* 1 */
|
||||
/* * 01234567890 */
|
||||
/* 0 */ "aaaabbbaaaa"
|
||||
/* 1 */ "abbbbbbbbba"
|
||||
/* 2 */ "abbbbbbbbba"
|
||||
/* 3 */ "abbbbbbbbba"
|
||||
/* 4 */ "abbbbbbbbba"
|
||||
/* 5 */ "abbbbbbbbba"
|
||||
/* 6 */ "abbbbbbbbba"
|
||||
/* 7 */ "abbbbbbbbba"
|
||||
/* 8 */ "aabbbbbbbaa"
|
||||
/* 9 */ "aabbbbbbbaa"
|
||||
/* 10 */ "aabbbbbbbaa"
|
||||
/* 11 */ "aabbbbbbbaa"
|
||||
/* 12 */ "aabbbbbbbaa"
|
||||
/* 0 */ "aaaaaaaaaaa"
|
||||
/* 1 */ "aaaaaaaaaaa"
|
||||
/* 2 */ "aaaaaaaaaaa"
|
||||
/* 3 */ "aaaaaaaaaaa"
|
||||
/* 4 */ "aaaaaaaaaab"
|
||||
/* 5 */ "baaaaaaaaab"
|
||||
/* 6 */ "aaaaaaaaaaa"
|
||||
/* 7 */ "baaaaaaaaaa"
|
||||
/* 8 */ "baaaaaaaaaa"
|
||||
/* 9 */ "baaaaaaaaab"
|
||||
/* 10 */ "aaaaaaaaaaa"
|
||||
/* 11 */ "aaaaaaaaaba"
|
||||
/* 12 */ "aaaaaaaaaba"
|
||||
|
||||
// Level 1
|
||||
/* z\x* 1 */
|
||||
@ -3654,11 +3654,11 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
/* 5 */ "mcccccccccm"
|
||||
/* 6 */ "mcccccccccm"
|
||||
/* 7 */ "mcccccccccm"
|
||||
/* 8 */ "mmbbbbbbbmm"
|
||||
/* 9 */ "mmbbbbbbbmm"
|
||||
/* 10 */ "mmbbbbbbbmm"
|
||||
/* 11 */ "mmbbbbbbbmm"
|
||||
/* 12 */ "mmbbbbbbbmm"
|
||||
/* 8 */ "mmaaaaaaamm"
|
||||
/* 9 */ "mmaaaaaaamm"
|
||||
/* 10 */ "mmaaaaaaamm"
|
||||
/* 11 */ "mmaaaaaaamm"
|
||||
/* 12 */ "mmaaaaaaamm"
|
||||
|
||||
// Level 2
|
||||
/* z\x* 1 */
|
||||
@ -3671,11 +3671,11 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
/* 5 */ ".cggggcccc."
|
||||
/* 6 */ ".cggggcccc."
|
||||
/* 7 */ ".ccccccccc."
|
||||
/* 8 */ "..aaaaaaa.."
|
||||
/* 9 */ "..aaaaaaa.."
|
||||
/* 10 */ "..aaaaaaa.."
|
||||
/* 11 */ "..aaaaaaa.."
|
||||
/* 12 */ "..aaaaaaa.."
|
||||
/* 8 */ "..bbbbbbb.."
|
||||
/* 9 */ "mmbbbbbbbmm"
|
||||
/* 10 */ "mmbbbbbbbmm"
|
||||
/* 11 */ "mmbbbbbbbmm"
|
||||
/* 12 */ "mmbbbbbbbmm"
|
||||
|
||||
// Level 3
|
||||
/* z\x* 1 */
|
||||
@ -3689,10 +3689,10 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
/* 6 */ ".i.......i."
|
||||
/* 7 */ ".hiiijiiih."
|
||||
/* 8 */ "..l.....l.."
|
||||
/* 9 */ "..l.....l.."
|
||||
/* 10 */ "..l.....l.."
|
||||
/* 11 */ "..l.....l.."
|
||||
/* 12 */ "..lllllll.."
|
||||
/* 9 */ "mml.....lmm"
|
||||
/* 10 */ "mml.....lmm"
|
||||
/* 11 */ "mml.....lmm"
|
||||
/* 12 */ "mmlllllllmm"
|
||||
|
||||
// Level 4
|
||||
/* z\x* 1 */
|
||||
@ -3706,10 +3706,10 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
/* 6 */ ".o.......o."
|
||||
/* 7 */ ".hooipiooh."
|
||||
/* 8 */ "..........."
|
||||
/* 9 */ "..........."
|
||||
/* 10 */ "..........."
|
||||
/* 11 */ "..........."
|
||||
/* 12 */ "..........."
|
||||
/* 9 */ "mm.......mm"
|
||||
/* 10 */ "mm.......mm"
|
||||
/* 11 */ "mm.......mm"
|
||||
/* 12 */ "mm.......mm"
|
||||
|
||||
// Level 5
|
||||
/* z\x* 1 */
|
||||
@ -3723,10 +3723,10 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
/* 6 */ ".i.......i."
|
||||
/* 7 */ "uiiiiiiiiiu"
|
||||
/* 8 */ "kkkkkkkkkkk"
|
||||
/* 9 */ "..........."
|
||||
/* 10 */ "..........."
|
||||
/* 11 */ "..........."
|
||||
/* 12 */ "..........."
|
||||
/* 9 */ "mm.......mm"
|
||||
/* 10 */ "mm.......mm"
|
||||
/* 11 */ "mm.......mm"
|
||||
/* 12 */ "mm.......mm"
|
||||
|
||||
// Level 6
|
||||
/* z\x* 1 */
|
||||
@ -3740,10 +3740,10 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
/* 6 */ "uiiiiiiiiiu"
|
||||
/* 7 */ "kkkkkkkkkkk"
|
||||
/* 8 */ "..........."
|
||||
/* 9 */ "..........."
|
||||
/* 10 */ "..........."
|
||||
/* 11 */ "..........."
|
||||
/* 12 */ "..........."
|
||||
/* 9 */ "mm.......mm"
|
||||
/* 10 */ "mm.......mm"
|
||||
/* 11 */ "mm.......mm"
|
||||
/* 12 */ "mm.......mm"
|
||||
|
||||
// Level 7
|
||||
/* z\x* 1 */
|
||||
@ -3757,10 +3757,10 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
/* 6 */ "kkkkkkkkkkk"
|
||||
/* 7 */ "..........."
|
||||
/* 8 */ "..........."
|
||||
/* 9 */ "..........."
|
||||
/* 10 */ "..........."
|
||||
/* 11 */ "..........."
|
||||
/* 12 */ "..........."
|
||||
/* 9 */ "mm.......mm"
|
||||
/* 10 */ "mm.......mm"
|
||||
/* 11 */ "mm.......mm"
|
||||
/* 12 */ "mm.......mm"
|
||||
|
||||
// Level 8
|
||||
/* z\x* 1 */
|
||||
@ -3774,10 +3774,10 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
/* 6 */ "..........."
|
||||
/* 7 */ "..........."
|
||||
/* 8 */ "..........."
|
||||
/* 9 */ "..........."
|
||||
/* 10 */ "..........."
|
||||
/* 11 */ "..........."
|
||||
/* 12 */ "...........",
|
||||
/* 9 */ "mm.......mm"
|
||||
/* 10 */ "mm.......mm"
|
||||
/* 11 */ "mm.......mm"
|
||||
/* 12 */ "mm.......mm",
|
||||
|
||||
// Connectors:
|
||||
"-1: 5, 2, 0: 2\n" /* Type -1, direction Z- */,
|
||||
@ -4237,30 +4237,29 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
// Block definitions:
|
||||
".: 0: 0\n" /* air */
|
||||
"a: 4: 0\n" /* cobblestone */
|
||||
"b: 2: 0\n" /* grass */
|
||||
"c: 67: 0\n" /* stairs */
|
||||
"d: 67: 2\n" /* stairs */
|
||||
"e: 67: 1\n" /* stairs */
|
||||
"f: 5: 0\n" /* wood */
|
||||
"g: 67: 3\n" /* stairs */
|
||||
"h: 17: 0\n" /* tree */
|
||||
"i: 64: 7\n" /* wooddoorblock */
|
||||
"j: 64: 5\n" /* wooddoorblock */
|
||||
"k:102: 0\n" /* glasspane */
|
||||
"l: 64:12\n" /* wooddoorblock */
|
||||
"b: 67: 0\n" /* stairs */
|
||||
"c: 67: 2\n" /* stairs */
|
||||
"d: 67: 1\n" /* stairs */
|
||||
"e: 5: 0\n" /* wood */
|
||||
"f: 67: 3\n" /* stairs */
|
||||
"g: 17: 0\n" /* tree */
|
||||
"h: 64: 7\n" /* wooddoorblock */
|
||||
"i: 64: 5\n" /* wooddoorblock */
|
||||
"j:102: 0\n" /* glasspane */
|
||||
"k: 64:12\n" /* wooddoorblock */
|
||||
"l: 53: 2\n" /* woodstairs */
|
||||
"m: 19: 0\n" /* sponge */
|
||||
"n: 53: 2\n" /* woodstairs */
|
||||
"o: 53: 1\n" /* woodstairs */
|
||||
"p: 53: 7\n" /* woodstairs */
|
||||
"q: 53: 6\n" /* woodstairs */
|
||||
"r: 53: 3\n" /* woodstairs */
|
||||
"s: 53: 0\n" /* woodstairs */
|
||||
"t: 53: 5\n" /* woodstairs */
|
||||
"u: 53: 4\n" /* woodstairs */
|
||||
"v: 50: 3\n" /* torch */
|
||||
"w: 50: 2\n" /* torch */
|
||||
"x: 50: 4\n" /* torch */
|
||||
"y: 50: 1\n" /* torch */,
|
||||
"n: 53: 1\n" /* woodstairs */
|
||||
"o: 53: 7\n" /* woodstairs */
|
||||
"p: 53: 6\n" /* woodstairs */
|
||||
"q: 53: 3\n" /* woodstairs */
|
||||
"r: 53: 0\n" /* woodstairs */
|
||||
"s: 53: 5\n" /* woodstairs */
|
||||
"t: 53: 4\n" /* woodstairs */
|
||||
"u: 50: 3\n" /* torch */
|
||||
"v: 50: 2\n" /* torch */
|
||||
"w: 50: 4\n" /* torch */
|
||||
"x: 50: 1\n" /* torch */,
|
||||
|
||||
// Block data:
|
||||
// Level 0
|
||||
@ -4274,134 +4273,134 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
/* 5 */ "maaaaaaaaaaaaaam"
|
||||
/* 6 */ "maaaaaaaaaaaaaam"
|
||||
/* 7 */ "maaaaaaaaaaaaaam"
|
||||
/* 8 */ "bbbbbaaaaaaaaaam"
|
||||
/* 9 */ "bbbbbbbbaaaaaaam"
|
||||
/* 10 */ "bbbbbbbbaaaaaaam"
|
||||
/* 11 */ "bbbbbbbbaaaaaaam"
|
||||
/* 12 */ "bbbbbbbbaaaaaaam"
|
||||
/* 13 */ "bbbbbbbbaaaaaaam"
|
||||
/* 14 */ "bbbbbbbbaaaaaaam"
|
||||
/* 15 */ "bbbbbbbbmmmmmmmm"
|
||||
/* 8 */ "mmmmmaaaaaaaaaam"
|
||||
/* 9 */ "mmmmmmmmaaaaaaam"
|
||||
/* 10 */ "mmmmmmmmaaaaaaam"
|
||||
/* 11 */ "mmmmmmmmaaaaaaam"
|
||||
/* 12 */ "mmmmmmmmaaaaaaam"
|
||||
/* 13 */ "mmmmmmmmaaaaaaam"
|
||||
/* 14 */ "mmmmmmmmaaaaaaam"
|
||||
/* 15 */ "mmmmmmmmmmmmmmmm"
|
||||
|
||||
// Level 1
|
||||
/* z\x* 111111 */
|
||||
/* * 0123456789012345 */
|
||||
/* 0 */ "........cde....."
|
||||
/* 0 */ "........bcd....."
|
||||
/* 1 */ ".aaaaaaaaaaaaaa."
|
||||
/* 2 */ ".affffffffffffa."
|
||||
/* 3 */ ".affffffffffffa."
|
||||
/* 4 */ ".affffffffffffa."
|
||||
/* 5 */ ".affffffffffffa."
|
||||
/* 6 */ ".affffffffffffa."
|
||||
/* 7 */ ".aaaaaaaafffffa."
|
||||
/* 8 */ ".....cgeafffffa."
|
||||
/* 9 */ "........afffffa."
|
||||
/* 10 */ "........afffffa."
|
||||
/* 11 */ "........afffffa."
|
||||
/* 12 */ "........afffffa."
|
||||
/* 13 */ "........afffffa."
|
||||
/* 14 */ "........aaaaaaa."
|
||||
/* 15 */ "................"
|
||||
/* 2 */ ".aeeeeeeeeeeeea."
|
||||
/* 3 */ ".aeeeeeeeeeeeea."
|
||||
/* 4 */ ".aeeeeeeeeeeeea."
|
||||
/* 5 */ ".aeeeeeeeeeeeea."
|
||||
/* 6 */ ".aeeeeeeeeeeeea."
|
||||
/* 7 */ ".aaaaaaaaeeeeea."
|
||||
/* 8 */ ".....bfdaeeeeea."
|
||||
/* 9 */ "mmmm....aeeeeea."
|
||||
/* 10 */ "mmmmmmm.aeeeeea."
|
||||
/* 11 */ "mmmmmmm.aeeeeea."
|
||||
/* 12 */ "mmmmmmm.aeeeeea."
|
||||
/* 13 */ "mmmmmmm.aeeeeea."
|
||||
/* 14 */ "mmmmmmm.aaaaaaa."
|
||||
/* 15 */ "mmmmmmm........."
|
||||
|
||||
// Level 2
|
||||
/* z\x* 111111 */
|
||||
/* * 0123456789012345 */
|
||||
/* 0 */ "................"
|
||||
/* 1 */ ".hffffffhihfffh."
|
||||
/* 2 */ ".f............f."
|
||||
/* 3 */ ".f............f."
|
||||
/* 4 */ ".f............f."
|
||||
/* 5 */ ".f............f."
|
||||
/* 6 */ ".f............f."
|
||||
/* 7 */ ".hffffjfh.....f."
|
||||
/* 8 */ "........f.....f."
|
||||
/* 9 */ "........f.....f."
|
||||
/* 10 */ "........f.....f."
|
||||
/* 11 */ "........f.....f."
|
||||
/* 12 */ "........f.....f."
|
||||
/* 13 */ "........f.....f."
|
||||
/* 14 */ "........hfffffh."
|
||||
/* 15 */ "................"
|
||||
/* 1 */ ".geeeeeeghgeeeg."
|
||||
/* 2 */ ".e............e."
|
||||
/* 3 */ ".e............e."
|
||||
/* 4 */ ".e............e."
|
||||
/* 5 */ ".e............e."
|
||||
/* 6 */ ".e............e."
|
||||
/* 7 */ ".geeeeieg.....e."
|
||||
/* 8 */ "........e.....e."
|
||||
/* 9 */ "mmmm....e.....e."
|
||||
/* 10 */ "mmmmmmm.e.....e."
|
||||
/* 11 */ "mmmmmmm.e.....e."
|
||||
/* 12 */ "mmmmmmm.e.....e."
|
||||
/* 13 */ "mmmmmmm.e.....e."
|
||||
/* 14 */ "mmmmmmm.geeeeeg."
|
||||
/* 15 */ "mmmmmmm........."
|
||||
|
||||
// Level 3
|
||||
/* z\x* 111111 */
|
||||
/* * 0123456789012345 */
|
||||
/* 0 */ "................"
|
||||
/* 1 */ ".hfkkfkkhlhkkfh."
|
||||
/* 2 */ ".k............f."
|
||||
/* 3 */ ".k............k."
|
||||
/* 4 */ ".k............k."
|
||||
/* 5 */ ".k............f."
|
||||
/* 6 */ ".k............k."
|
||||
/* 7 */ ".hfkkflfh.....k."
|
||||
/* 8 */ "........f.....f."
|
||||
/* 9 */ "........k.....k."
|
||||
/* 10 */ "........k.....k."
|
||||
/* 11 */ "........f.....f."
|
||||
/* 12 */ "........k.....k."
|
||||
/* 13 */ "........k.....k."
|
||||
/* 14 */ "........hkkkkkh."
|
||||
/* 15 */ "................"
|
||||
/* 1 */ ".gejjejjgkgjjeg."
|
||||
/* 2 */ ".j............e."
|
||||
/* 3 */ ".j............j."
|
||||
/* 4 */ ".j............j."
|
||||
/* 5 */ ".j............e."
|
||||
/* 6 */ ".j............j."
|
||||
/* 7 */ ".gejjekeg.....j."
|
||||
/* 8 */ "........e.....e."
|
||||
/* 9 */ "mmmm....j.....j."
|
||||
/* 10 */ "mmmmmmm.j.....j."
|
||||
/* 11 */ "mmmmmmm.e.....e."
|
||||
/* 12 */ "mmmmmmm.j.....j."
|
||||
/* 13 */ "mmmmmmm.j.....j."
|
||||
/* 14 */ "mmmmmmm.gjjjjjg."
|
||||
/* 15 */ "mmmmmmm........."
|
||||
|
||||
// Level 4
|
||||
/* z\x* 111111 */
|
||||
/* * 0123456789012345 */
|
||||
/* 0 */ "nnnnnnnnnnnnnnno"
|
||||
/* 1 */ "phffffffhfhfffho"
|
||||
/* 2 */ ".f............fo"
|
||||
/* 3 */ ".f............fo"
|
||||
/* 4 */ ".f............fo"
|
||||
/* 5 */ ".f............fo"
|
||||
/* 6 */ ".f............fo"
|
||||
/* 7 */ "qhffffffh.....fo"
|
||||
/* 8 */ "rrrrrrrsf.....fo"
|
||||
/* 9 */ ".......sf.....fo"
|
||||
/* 10 */ ".......sf.....fo"
|
||||
/* 11 */ ".......sf.....fo"
|
||||
/* 12 */ ".......sf.....fo"
|
||||
/* 13 */ ".......sf.....fo"
|
||||
/* 14 */ ".......shfffffho"
|
||||
/* 15 */ ".......st.....uo"
|
||||
/* 0 */ "llllllllllllllln"
|
||||
/* 1 */ "ogeeeeeegegeeegn"
|
||||
/* 2 */ ".e............en"
|
||||
/* 3 */ ".e............en"
|
||||
/* 4 */ ".e............en"
|
||||
/* 5 */ ".e............en"
|
||||
/* 6 */ ".e............en"
|
||||
/* 7 */ "pgeeeeeeg.....en"
|
||||
/* 8 */ "qqqqqqqre.....en"
|
||||
/* 9 */ "mmmm...re.....en"
|
||||
/* 10 */ "mmmmmmmre.....en"
|
||||
/* 11 */ "mmmmmmmre.....en"
|
||||
/* 12 */ "mmmmmmmre.....en"
|
||||
/* 13 */ "mmmmmmmre.....en"
|
||||
/* 14 */ "mmmmmmmrgeeeeegn"
|
||||
/* 15 */ "mmmmmmmrs.....tn"
|
||||
|
||||
// Level 5
|
||||
/* z\x* 111111 */
|
||||
/* * 0123456789012345 */
|
||||
/* 0 */ "................"
|
||||
/* 1 */ "nnnnnnnnnnnnnnn."
|
||||
/* 2 */ "pfffffffffffffo."
|
||||
/* 3 */ ".f.........v.fo."
|
||||
/* 4 */ ".f..........wfo."
|
||||
/* 5 */ ".f......x....fo."
|
||||
/* 6 */ "qfffffffff...fo."
|
||||
/* 7 */ "rrrrrrrrsfy..fo."
|
||||
/* 8 */ "........sf...fo."
|
||||
/* 9 */ "........sf...fo."
|
||||
/* 10 */ "........sf...fo."
|
||||
/* 11 */ "........sf...fo."
|
||||
/* 12 */ "........sf...fo."
|
||||
/* 13 */ "........sf...fo."
|
||||
/* 14 */ "........sfffffo."
|
||||
/* 15 */ "........st...uo."
|
||||
/* 1 */ "lllllllllllllll."
|
||||
/* 2 */ "oeeeeeeeeeeeeen."
|
||||
/* 3 */ ".e.........u.en."
|
||||
/* 4 */ ".e..........ven."
|
||||
/* 5 */ ".e......w....en."
|
||||
/* 6 */ "peeeeeeeee...en."
|
||||
/* 7 */ "qqqqqqqqrex..en."
|
||||
/* 8 */ "........re...en."
|
||||
/* 9 */ "mmmm....re...en."
|
||||
/* 10 */ "mmmmmmm.re...en."
|
||||
/* 11 */ "mmmmmmm.re...en."
|
||||
/* 12 */ "mmmmmmm.re...en."
|
||||
/* 13 */ "mmmmmmm.re...en."
|
||||
/* 14 */ "mmmmmmm.reeeeen."
|
||||
/* 15 */ "mmmmmmm.rs...tn."
|
||||
|
||||
// Level 6
|
||||
/* z\x* 111111 */
|
||||
/* * 0123456789012345 */
|
||||
/* 0 */ "................"
|
||||
/* 1 */ "................"
|
||||
/* 2 */ "nnnnnnnnnnnnno.."
|
||||
/* 3 */ "pffffffffffffo.."
|
||||
/* 4 */ ".fy.........fo.."
|
||||
/* 5 */ "qffffffffff.fo.."
|
||||
/* 6 */ "rrrrrrrrrsf.fo.."
|
||||
/* 7 */ ".........sf.fo.."
|
||||
/* 8 */ ".........sf.fo.."
|
||||
/* 9 */ ".........sf.fo.."
|
||||
/* 10 */ ".........sf.fo.."
|
||||
/* 11 */ ".........sf.fo.."
|
||||
/* 12 */ ".........sf.fo.."
|
||||
/* 13 */ ".........sfxfo.."
|
||||
/* 14 */ ".........sfffo.."
|
||||
/* 15 */ ".........st.uo.."
|
||||
/* 2 */ "llllllllllllln.."
|
||||
/* 3 */ "oeeeeeeeeeeeen.."
|
||||
/* 4 */ ".ex.........en.."
|
||||
/* 5 */ "peeeeeeeeee.en.."
|
||||
/* 6 */ "qqqqqqqqqre.en.."
|
||||
/* 7 */ ".........re.en.."
|
||||
/* 8 */ ".........re.en.."
|
||||
/* 9 */ "mmmm.....re.en.."
|
||||
/* 10 */ "mmmmmmm..re.en.."
|
||||
/* 11 */ "mmmmmmm..re.en.."
|
||||
/* 12 */ "mmmmmmm..re.en.."
|
||||
/* 13 */ "mmmmmmm..rewen.."
|
||||
/* 14 */ "mmmmmmm..reeen.."
|
||||
/* 15 */ "mmmmmmm..rs.tn.."
|
||||
|
||||
// Level 7
|
||||
/* z\x* 111111 */
|
||||
@ -4409,19 +4408,19 @@ const cPrefab::sDef g_PlainsVillagePrefabs[] =
|
||||
/* 0 */ "................"
|
||||
/* 1 */ "................"
|
||||
/* 2 */ "................"
|
||||
/* 3 */ "nnnnnnnnnnnnn..."
|
||||
/* 4 */ "ffffffffffffo..."
|
||||
/* 5 */ "rrrrrrrrrrsfo..."
|
||||
/* 6 */ "..........sfo..."
|
||||
/* 7 */ "..........sfo..."
|
||||
/* 8 */ "..........sfo..."
|
||||
/* 9 */ "..........sfo..."
|
||||
/* 10 */ "..........sfo..."
|
||||
/* 11 */ "..........sfo..."
|
||||
/* 12 */ "..........sfo..."
|
||||
/* 13 */ "..........sfo..."
|
||||
/* 14 */ "..........sfo..."
|
||||
/* 15 */ "..........sfo...",
|
||||
/* 3 */ "lllllllllllll..."
|
||||
/* 4 */ "eeeeeeeeeeeen..."
|
||||
/* 5 */ "qqqqqqqqqqren..."
|
||||
/* 6 */ "..........ren..."
|
||||
/* 7 */ "..........ren..."
|
||||
/* 8 */ "..........ren..."
|
||||
/* 9 */ "mmmm......ren..."
|
||||
/* 10 */ "mmmmmmm...ren..."
|
||||
/* 11 */ "mmmmmmm...ren..."
|
||||
/* 12 */ "mmmmmmm...ren..."
|
||||
/* 13 */ "mmmmmmm...ren..."
|
||||
/* 14 */ "mmmmmmm...ren..."
|
||||
/* 15 */ "mmmmmmm...ren...",
|
||||
|
||||
// Connectors:
|
||||
"-1: 9, 1, 0: 2\n" /* Type -1, direction Z- */,
|
||||
|
@ -484,7 +484,6 @@ void cStructGenLakes::CreateLakeImage(int a_ChunkX, int a_ChunkZ, cBlockArea & a
|
||||
const int BubbleY = 4 + (Rnd & 0x01); // 4 .. 5
|
||||
Rnd >>= 1;
|
||||
const int BubbleZ = BubbleR + (Rnd % Range);
|
||||
Rnd >>= 4;
|
||||
const int HalfR = BubbleR / 2; // 1 .. 2
|
||||
const int RSquared = BubbleR * BubbleR;
|
||||
for (int y = -HalfR; y <= HalfR; y++)
|
||||
|
@ -10,13 +10,6 @@
|
||||
|
||||
|
||||
|
||||
// DEBUG:
|
||||
int gTotalLargeJungleTrees = 0;
|
||||
int gOversizeLargeJungleTrees = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@ -113,6 +106,7 @@ inline void PushCoordBlocks(int a_BlockX, int a_Height, int a_BlockZ, sSetBlockV
|
||||
|
||||
|
||||
|
||||
|
||||
inline void PushCornerBlocks(int a_BlockX, int a_Height, int a_BlockZ, int a_Seq, cNoise & a_Noise, int a_Chance, sSetBlockVector & a_Blocks, int a_CornersDist, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta)
|
||||
{
|
||||
for (size_t i = 0; i < ARRAYCOUNT(Corners); i++)
|
||||
|
@ -153,7 +153,7 @@ bool cGroupManager::LoadGroups()
|
||||
AString Color = IniFile.GetValue(KeyName, "Color", "-");
|
||||
if ((Color != "-") && (Color.length() >= 1))
|
||||
{
|
||||
Group->SetColor(cChatColor::Color + Color[0]);
|
||||
Group->SetColor(cChatColor::Delimiter + Color[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -4,9 +4,26 @@ project (MCServer)
|
||||
|
||||
include_directories ("${PROJECT_SOURCE_DIR}/../")
|
||||
|
||||
file(GLOB SOURCE
|
||||
"*.cpp"
|
||||
"*.h"
|
||||
)
|
||||
SET (SRCS
|
||||
EnvelopeParser.cpp
|
||||
HTTPConnection.cpp
|
||||
HTTPFormParser.cpp
|
||||
HTTPMessage.cpp
|
||||
HTTPServer.cpp
|
||||
MultipartParser.cpp
|
||||
NameValueParser.cpp
|
||||
SslHTTPConnection.cpp)
|
||||
|
||||
add_library(HTTPServer ${SOURCE})
|
||||
SET (HDRS
|
||||
EnvelopeParser.h
|
||||
HTTPConnection.h
|
||||
HTTPFormParser.h
|
||||
HTTPMessage.h
|
||||
HTTPServer.h
|
||||
MultipartParser.h
|
||||
NameValueParser.h
|
||||
SslHTTPConnection.h)
|
||||
|
||||
if(NOT MSVC)
|
||||
add_library(HTTPServer ${SRCS} ${HDRS})
|
||||
endif()
|
||||
|
@ -33,7 +33,7 @@ public:
|
||||
cHTTPMessage(eKind a_Kind);
|
||||
|
||||
// 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 */
|
||||
void AddHeader(const AString & a_Key, const AString & a_Value);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user