Merge remote-tracking branch 'origin/master' into portals
Conflicts: src/Chunk.cpp src/Entities/Player.cpp src/Root.cpp src/World.cpp
This commit is contained in:
commit
3385ed56b8
1
.gitignore
vendored
1
.gitignore
vendored
@ -65,6 +65,7 @@ lib/tolua++/tolua
|
||||
src/Bindings/Bindings.*
|
||||
src/Bindings/BindingDependecies.txt
|
||||
MCServer.dir/
|
||||
src/AllFiles.lst
|
||||
|
||||
#win32 cmake stuff
|
||||
*.vcxproj
|
||||
|
@ -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" },
|
||||
|
@ -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>";
|
||||
|
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_DEPENDECIES
|
||||
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_DEPENDECIES}
|
||||
)
|
||||
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()
|
@ -25,9 +25,9 @@ static int tolua_get_AllToLua_g_BlockLightValue(lua_State* tolua_S)
|
||||
#ifndef TOLUA_RELEASE
|
||||
{
|
||||
tolua_Error tolua_err;
|
||||
if (!tolua_isnumber(tolua_S,2,0,&tolua_err))
|
||||
if (!tolua_isnumber(tolua_S, 2, 0, &tolua_err))
|
||||
{
|
||||
tolua_error(tolua_S,"#vinvalid type in array indexing.",&tolua_err);
|
||||
tolua_error(tolua_S, "#vinvalid type in array indexing.", &tolua_err);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -36,7 +36,7 @@ static int tolua_get_AllToLua_g_BlockLightValue(lua_State* tolua_S)
|
||||
{
|
||||
tolua_error(tolua_S, "array indexing out of range.", NULL);
|
||||
}
|
||||
tolua_pushnumber(tolua_S,(lua_Number)cBlockInfo::GetLightValue((BLOCKTYPE)BlockType));
|
||||
tolua_pushnumber(tolua_S, (lua_Number)cBlockInfo::GetLightValue((BLOCKTYPE)BlockType));
|
||||
return 1;
|
||||
}
|
||||
#endif // #ifndef TOLUA_DISABLE
|
||||
@ -53,8 +53,8 @@ static int tolua_get_AllToLua_g_BlockSpreadLightFalloff(lua_State* tolua_S)
|
||||
#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);
|
||||
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);
|
||||
@ -79,8 +79,8 @@ static int tolua_get_AllToLua_g_BlockTransparent(lua_State* tolua_S)
|
||||
#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);
|
||||
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);
|
||||
@ -105,8 +105,8 @@ static int tolua_get_AllToLua_g_BlockOneHitDig(lua_State* tolua_S)
|
||||
#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);
|
||||
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);
|
||||
@ -131,8 +131,8 @@ static int tolua_get_AllToLua_g_BlockPistonBreakable(lua_State* tolua_S)
|
||||
#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);
|
||||
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);
|
||||
@ -157,8 +157,8 @@ static int tolua_get_AllToLua_g_BlockIsSnowable(lua_State* tolua_S)
|
||||
#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);
|
||||
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);
|
||||
@ -183,8 +183,8 @@ static int tolua_get_AllToLua_g_BlockRequiresSpecialTool(lua_State* tolua_S)
|
||||
#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);
|
||||
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);
|
||||
@ -209,8 +209,8 @@ static int tolua_get_AllToLua_g_BlockIsSolid(lua_State* tolua_S)
|
||||
#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);
|
||||
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);
|
||||
@ -235,8 +235,8 @@ static int tolua_get_AllToLua_g_BlockFullyOccupiesVoxel(lua_State* tolua_S)
|
||||
#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);
|
||||
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);
|
||||
|
@ -4,5 +4,5 @@ struct lua_State;
|
||||
class DeprecatedBindings
|
||||
{
|
||||
public:
|
||||
static void Bind( lua_State* tolua_S );
|
||||
static void Bind( lua_State* tolua_S);
|
||||
};
|
||||
|
@ -9,7 +9,7 @@ inline unsigned int GetTime()
|
||||
return (unsigned int)time(0);
|
||||
}
|
||||
|
||||
inline std::string GetChar( std::string & a_Str, unsigned int a_Idx )
|
||||
inline std::string GetChar( std::string & a_Str, unsigned int a_Idx)
|
||||
{
|
||||
return std::string(1, a_Str[ a_Idx ]);
|
||||
}
|
||||
|
@ -1336,9 +1336,8 @@ 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:");
|
||||
LOGD("%s", (a_Header != NULL) ? a_Header : "Lua C API Stack contents:");
|
||||
for (int i = lua_gettop(a_LuaState); i > 0; i--)
|
||||
{
|
||||
AString Value;
|
||||
|
@ -319,9 +319,9 @@ static int tolua_DoWith(lua_State* tolua_S)
|
||||
{
|
||||
public:
|
||||
cLuaCallback(lua_State* a_LuaState, int a_FuncRef, int a_TableRef)
|
||||
: LuaState( a_LuaState )
|
||||
, FuncRef( a_FuncRef )
|
||||
, TableRef( a_TableRef )
|
||||
: LuaState( a_LuaState)
|
||||
, FuncRef( a_FuncRef)
|
||||
, TableRef( a_TableRef)
|
||||
{}
|
||||
|
||||
private:
|
||||
@ -358,7 +358,7 @@ static int tolua_DoWith(lua_State* tolua_S)
|
||||
luaL_unref(tolua_S, LUA_REGISTRYINDEX, FuncRef);
|
||||
|
||||
/* Push return value on stack */
|
||||
tolua_pushboolean(tolua_S, bRetVal );
|
||||
tolua_pushboolean(tolua_S, bRetVal);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -448,7 +448,7 @@ static int tolua_DoWithID(lua_State* tolua_S)
|
||||
luaL_unref(tolua_S, LUA_REGISTRYINDEX, FuncRef);
|
||||
|
||||
/* Push return value on stack */
|
||||
tolua_pushboolean(tolua_S, bRetVal );
|
||||
tolua_pushboolean(tolua_S, bRetVal);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -478,7 +478,7 @@ static int tolua_DoWithXYZ(lua_State* tolua_S)
|
||||
int ItemX = ((int)tolua_tonumber(tolua_S, 2, 0));
|
||||
int ItemY = ((int)tolua_tonumber(tolua_S, 3, 0));
|
||||
int ItemZ = ((int)tolua_tonumber(tolua_S, 4, 0));
|
||||
LOG("x %i y %i z %i", ItemX, ItemY, ItemZ );
|
||||
LOG("x %i y %i z %i", ItemX, ItemY, ItemZ);
|
||||
if (!lua_isfunction( tolua_S, 5))
|
||||
{
|
||||
return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a function for parameter #4");
|
||||
@ -506,9 +506,9 @@ static int tolua_DoWithXYZ(lua_State* tolua_S)
|
||||
{
|
||||
public:
|
||||
cLuaCallback(lua_State* a_LuaState, int a_FuncRef, int a_TableRef)
|
||||
: LuaState( a_LuaState )
|
||||
, FuncRef( a_FuncRef )
|
||||
, TableRef( a_TableRef )
|
||||
: LuaState( a_LuaState)
|
||||
, FuncRef( a_FuncRef)
|
||||
, TableRef( a_TableRef)
|
||||
{}
|
||||
|
||||
private:
|
||||
@ -544,7 +544,7 @@ static int tolua_DoWithXYZ(lua_State* tolua_S)
|
||||
luaL_unref(tolua_S, LUA_REGISTRYINDEX, FuncRef);
|
||||
|
||||
/* Push return value on stack */
|
||||
tolua_pushboolean(tolua_S, bRetVal );
|
||||
tolua_pushboolean(tolua_S, bRetVal);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -601,9 +601,9 @@ static int tolua_ForEachInChunk(lua_State * tolua_S)
|
||||
{
|
||||
public:
|
||||
cLuaCallback(lua_State* a_LuaState, int a_FuncRef, int a_TableRef)
|
||||
: LuaState( a_LuaState )
|
||||
, FuncRef( a_FuncRef )
|
||||
, TableRef( a_TableRef )
|
||||
: LuaState( a_LuaState)
|
||||
, FuncRef( a_FuncRef)
|
||||
, TableRef( a_TableRef)
|
||||
{}
|
||||
|
||||
private:
|
||||
@ -640,7 +640,7 @@ static int tolua_ForEachInChunk(lua_State * tolua_S)
|
||||
luaL_unref(tolua_S, LUA_REGISTRYINDEX, FuncRef);
|
||||
|
||||
/* Push return value on stack */
|
||||
tolua_pushboolean(tolua_S, bRetVal );
|
||||
tolua_pushboolean(tolua_S, bRetVal);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -656,12 +656,12 @@ 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);
|
||||
}
|
||||
|
||||
Ty1 * self = (Ty1 *) tolua_tousertype(tolua_S, 1, NULL);
|
||||
Ty1 * self = (Ty1 *)tolua_tousertype(tolua_S, 1, NULL);
|
||||
if (self == NULL)
|
||||
{
|
||||
return lua_do_error(tolua_S, "Error in function call '#funcname#': Not called on an object instance");
|
||||
@ -694,16 +694,16 @@ static int tolua_ForEach(lua_State * tolua_S)
|
||||
{
|
||||
public:
|
||||
cLuaCallback(lua_State* a_LuaState, int a_FuncRef, int a_TableRef)
|
||||
: LuaState( a_LuaState )
|
||||
, FuncRef( a_FuncRef )
|
||||
, TableRef( a_TableRef )
|
||||
: LuaState( a_LuaState)
|
||||
, FuncRef( a_FuncRef)
|
||||
, TableRef( a_TableRef)
|
||||
{}
|
||||
|
||||
private:
|
||||
virtual bool Item(Ty2 * a_Item) override
|
||||
{
|
||||
lua_rawgeti( LuaState, LUA_REGISTRYINDEX, FuncRef); /* Push function reference */
|
||||
tolua_pushusertype( LuaState, a_Item, Ty2::GetClassStatic() );
|
||||
tolua_pushusertype( LuaState, a_Item, Ty2::GetClassStatic());
|
||||
if (TableRef != LUA_REFNIL)
|
||||
{
|
||||
lua_rawgeti( LuaState, LUA_REGISTRYINDEX, TableRef); /* Push table reference */
|
||||
@ -733,7 +733,7 @@ static int tolua_ForEach(lua_State * tolua_S)
|
||||
luaL_unref(tolua_S, LUA_REGISTRYINDEX, FuncRef);
|
||||
|
||||
/* Push return value on stack */
|
||||
tolua_pushboolean(tolua_S, bRetVal );
|
||||
tolua_pushboolean(tolua_S, bRetVal);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
@ -1360,7 +1360,7 @@ static int tolua_cPluginManager_AddHook(lua_State * tolua_S)
|
||||
static int tolua_cPluginManager_ForEachCommand(lua_State * tolua_S)
|
||||
{
|
||||
int NumArgs = lua_gettop(tolua_S) - 1; /* This includes 'self' */
|
||||
if( NumArgs != 1)
|
||||
if (NumArgs != 1)
|
||||
{
|
||||
LOGWARN("Error in function call 'ForEachCommand': Requires 1 argument, got %i", NumArgs);
|
||||
return 0;
|
||||
@ -1390,8 +1390,8 @@ static int tolua_cPluginManager_ForEachCommand(lua_State * tolua_S)
|
||||
{
|
||||
public:
|
||||
cLuaCallback(lua_State * a_LuaState, int a_FuncRef)
|
||||
: LuaState( a_LuaState )
|
||||
, FuncRef( a_FuncRef )
|
||||
: LuaState( a_LuaState)
|
||||
, FuncRef( a_FuncRef)
|
||||
{}
|
||||
|
||||
private:
|
||||
@ -1437,7 +1437,7 @@ static int tolua_cPluginManager_ForEachCommand(lua_State * tolua_S)
|
||||
static int tolua_cPluginManager_ForEachConsoleCommand(lua_State * tolua_S)
|
||||
{
|
||||
int NumArgs = lua_gettop(tolua_S) - 1; /* This includes 'self' */
|
||||
if( NumArgs != 1)
|
||||
if (NumArgs != 1)
|
||||
{
|
||||
LOGWARN("Error in function call 'ForEachConsoleCommand': Requires 1 argument, got %i", NumArgs);
|
||||
return 0;
|
||||
@ -1467,8 +1467,8 @@ static int tolua_cPluginManager_ForEachConsoleCommand(lua_State * tolua_S)
|
||||
{
|
||||
public:
|
||||
cLuaCallback(lua_State * a_LuaState, int a_FuncRef)
|
||||
: LuaState( a_LuaState )
|
||||
, FuncRef( a_FuncRef )
|
||||
: LuaState( a_LuaState)
|
||||
, FuncRef( a_FuncRef)
|
||||
{}
|
||||
|
||||
private:
|
||||
@ -1926,28 +1926,28 @@ static int tolua_cPluginLua_AddWebTab(lua_State * tolua_S)
|
||||
int Reference = LUA_REFNIL;
|
||||
|
||||
if (
|
||||
tolua_isstring(tolua_S, 2, 0, &tolua_err ) &&
|
||||
lua_isfunction(tolua_S, 3 )
|
||||
tolua_isstring(tolua_S, 2, 0, &tolua_err) &&
|
||||
lua_isfunction(tolua_S, 3)
|
||||
)
|
||||
{
|
||||
Reference = luaL_ref(tolua_S, LUA_REGISTRYINDEX);
|
||||
Title = ((std::string) tolua_tocppstring(tolua_S,2,0));
|
||||
Title = ((std::string)tolua_tocppstring(tolua_S, 2, 0));
|
||||
}
|
||||
else
|
||||
{
|
||||
return tolua_do_error(tolua_S, "#ferror calling function '#funcname#'", &tolua_err);
|
||||
}
|
||||
|
||||
if( Reference != LUA_REFNIL )
|
||||
if (Reference != LUA_REFNIL)
|
||||
{
|
||||
if( !self->AddWebTab( Title.c_str(), tolua_S, Reference ) )
|
||||
if (!self->AddWebTab(Title.c_str(), tolua_S, Reference))
|
||||
{
|
||||
luaL_unref( tolua_S, LUA_REGISTRYINDEX, Reference );
|
||||
luaL_unref(tolua_S, LUA_REGISTRYINDEX, Reference);
|
||||
}
|
||||
}
|
||||
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;
|
||||
@ -1963,7 +1963,7 @@ static int tolua_cPluginLua_AddTab(lua_State* tolua_S)
|
||||
LOGWARN("WARNING: Using deprecated function AddTab()! Use AddWebTab() instead. (plugin \"%s\" in folder \"%s\")",
|
||||
self->GetName().c_str(), self->GetDirectory().c_str()
|
||||
);
|
||||
return tolua_cPluginLua_AddWebTab( tolua_S );
|
||||
return tolua_cPluginLua_AddWebTab( tolua_S);
|
||||
}
|
||||
|
||||
|
||||
@ -2011,12 +2011,12 @@ static int tolua_md5(lua_State* tolua_S)
|
||||
|
||||
|
||||
|
||||
static int tolua_push_StringStringMap(lua_State* tolua_S, std::map< std::string, std::string >& a_StringStringMap )
|
||||
static int tolua_push_StringStringMap(lua_State* tolua_S, std::map< std::string, std::string >& a_StringStringMap)
|
||||
{
|
||||
lua_newtable(tolua_S);
|
||||
int top = lua_gettop(tolua_S);
|
||||
|
||||
for( std::map< std::string, std::string >::iterator it = a_StringStringMap.begin(); it != a_StringStringMap.end(); ++it )
|
||||
for (std::map<std::string, std::string>::iterator it = a_StringStringMap.begin(); it != a_StringStringMap.end(); ++it)
|
||||
{
|
||||
const char* key = it->first.c_str();
|
||||
const char* value = it->second.c_str();
|
||||
@ -2060,11 +2060,11 @@ static int tolua_get_HTTPRequest_FormData(lua_State* tolua_S)
|
||||
lua_newtable(tolua_S);
|
||||
int top = lua_gettop(tolua_S);
|
||||
|
||||
for( std::map< std::string, HTTPFormData >::iterator it = FormData.begin(); it != FormData.end(); ++it )
|
||||
for (std::map<std::string, HTTPFormData>::iterator it = FormData.begin(); it != FormData.end(); ++it)
|
||||
{
|
||||
lua_pushstring(tolua_S, it->first.c_str() );
|
||||
tolua_pushusertype(tolua_S, &(it->second), "HTTPFormData" );
|
||||
// lua_pushlstring(tolua_S, it->second.Value.c_str(), it->second.Value.size() ); // Might contain binary data
|
||||
lua_pushstring(tolua_S, it->first.c_str());
|
||||
tolua_pushusertype(tolua_S, &(it->second), "HTTPFormData");
|
||||
// lua_pushlstring(tolua_S, it->second.Value.c_str(), it->second.Value.size()); // Might contain binary data
|
||||
lua_settable(tolua_S, top);
|
||||
}
|
||||
|
||||
@ -2109,12 +2109,12 @@ static int tolua_cWebPlugin_GetTabNames(lua_State * tolua_S)
|
||||
lua_newtable(tolua_S);
|
||||
int index = 1;
|
||||
cWebPlugin::TabNameList::const_iterator iter = TabNames.begin();
|
||||
while(iter != TabNames.end())
|
||||
while (iter != TabNames.end())
|
||||
{
|
||||
const AString & FancyName = iter->first;
|
||||
const AString & WebName = iter->second;
|
||||
tolua_pushstring( tolua_S, WebName.c_str() ); // Because the WebName is supposed to be unique, use it as key
|
||||
tolua_pushstring( tolua_S, FancyName.c_str() );
|
||||
tolua_pushstring( tolua_S, WebName.c_str()); // Because the WebName is supposed to be unique, use it as key
|
||||
tolua_pushstring( tolua_S, FancyName.c_str());
|
||||
//
|
||||
lua_rawset(tolua_S, -3);
|
||||
++iter;
|
||||
@ -2591,7 +2591,7 @@ static int tolua_cBlockArea_LoadFromSchematicFile(lua_State * tolua_S)
|
||||
}
|
||||
|
||||
AString Filename = tolua_tostring(tolua_S, 2, 0);
|
||||
bool res = cSchematicFileSerializer::LoadFromSchematicFile(*self,Filename);
|
||||
bool res = cSchematicFileSerializer::LoadFromSchematicFile(*self, Filename);
|
||||
tolua_pushboolean(tolua_S, res);
|
||||
return 1;
|
||||
}
|
||||
@ -2651,7 +2651,7 @@ static int tolua_cBlockArea_SaveToSchematicFile(lua_State * tolua_S)
|
||||
return 0;
|
||||
}
|
||||
AString Filename = tolua_tostring(tolua_S, 2, 0);
|
||||
bool res = cSchematicFileSerializer::SaveToSchematicFile(*self,Filename);
|
||||
bool res = cSchematicFileSerializer::SaveToSchematicFile(*self, Filename);
|
||||
tolua_pushboolean(tolua_S, res);
|
||||
return 1;
|
||||
}
|
||||
@ -3065,13 +3065,13 @@ void ManualBindings::Bind(lua_State * tolua_S)
|
||||
tolua_function(tolua_S, "AddWebTab", tolua_cPluginLua_AddWebTab);
|
||||
tolua_endmodule(tolua_S);
|
||||
|
||||
tolua_cclass(tolua_S,"HTTPRequest","HTTPRequest","",NULL);
|
||||
tolua_beginmodule(tolua_S,"HTTPRequest");
|
||||
// tolua_variable(tolua_S,"Method",tolua_get_HTTPRequest_Method,tolua_set_HTTPRequest_Method);
|
||||
// tolua_variable(tolua_S,"Path",tolua_get_HTTPRequest_Path,tolua_set_HTTPRequest_Path);
|
||||
tolua_variable(tolua_S,"FormData",tolua_get_HTTPRequest_FormData,0);
|
||||
tolua_variable(tolua_S,"Params",tolua_get_HTTPRequest_Params,0);
|
||||
tolua_variable(tolua_S,"PostParams",tolua_get_HTTPRequest_PostParams,0);
|
||||
tolua_cclass(tolua_S, "HTTPRequest", "HTTPRequest", "", NULL);
|
||||
tolua_beginmodule(tolua_S, "HTTPRequest");
|
||||
// tolua_variable(tolua_S, "Method", tolua_get_HTTPRequest_Method, tolua_set_HTTPRequest_Method);
|
||||
// tolua_variable(tolua_S, "Path", tolua_get_HTTPRequest_Path, tolua_set_HTTPRequest_Path);
|
||||
tolua_variable(tolua_S, "FormData", tolua_get_HTTPRequest_FormData, 0);
|
||||
tolua_variable(tolua_S, "Params", tolua_get_HTTPRequest_Params, 0);
|
||||
tolua_variable(tolua_S, "PostParams", tolua_get_HTTPRequest_PostParams, 0);
|
||||
tolua_endmodule(tolua_S);
|
||||
|
||||
tolua_beginmodule(tolua_S, "cWebAdmin");
|
||||
|
@ -4,5 +4,5 @@ struct lua_State;
|
||||
class ManualBindings
|
||||
{
|
||||
public:
|
||||
static void Bind( lua_State* tolua_S );
|
||||
static void Bind( lua_State* tolua_S);
|
||||
};
|
||||
|
@ -33,7 +33,7 @@ class cPlugin
|
||||
public:
|
||||
// tolua_end
|
||||
|
||||
cPlugin( const AString & a_PluginDirectory );
|
||||
cPlugin( const AString & a_PluginDirectory);
|
||||
virtual ~cPlugin();
|
||||
|
||||
virtual void OnDisable(void) {}
|
||||
@ -141,7 +141,7 @@ public:
|
||||
E_SQUIRREL, // OBSOLETE, but kept in place to remind us of the horrors lurking in the history
|
||||
};
|
||||
PluginLanguage GetLanguage() { return m_Language; }
|
||||
void SetLanguage( PluginLanguage a_Language ) { m_Language = a_Language; }
|
||||
void SetLanguage( PluginLanguage a_Language) { m_Language = a_Language; }
|
||||
|
||||
private:
|
||||
PluginLanguage m_Language;
|
||||
|
@ -1655,7 +1655,7 @@ int cPluginLua::CallFunctionFromForeignState(
|
||||
|
||||
|
||||
|
||||
AString cPluginLua::HandleWebRequest(const HTTPRequest * a_Request )
|
||||
AString cPluginLua::HandleWebRequest(const HTTPRequest * a_Request)
|
||||
{
|
||||
cCSLock Lock(m_CriticalSection);
|
||||
std::string RetVal = "";
|
||||
|
@ -144,7 +144,7 @@ public:
|
||||
virtual const AString GetWebTitle(void) const {return GetName(); }
|
||||
|
||||
// cWebPlugin and WebAdmin stuff
|
||||
virtual AString HandleWebRequest(const HTTPRequest * a_Request ) override;
|
||||
virtual AString HandleWebRequest(const HTTPRequest * a_Request) override;
|
||||
bool AddWebTab(const AString & a_Title, lua_State * a_LuaState, int a_FunctionReference); // >> EXPORTED IN MANUALBINDINGS <<
|
||||
|
||||
/** Binds the command to call the function specified by a Lua function reference. Simply adds to CommandMap. */
|
||||
|
@ -72,7 +72,7 @@ void cPluginManager::FindPlugins(void)
|
||||
{
|
||||
PluginMap::iterator thiz = itr;
|
||||
++thiz;
|
||||
m_Plugins.erase( itr );
|
||||
m_Plugins.erase( itr);
|
||||
itr = thiz;
|
||||
continue;
|
||||
}
|
||||
@ -1432,11 +1432,11 @@ cPluginManager::CommandResult cPluginManager::HandleCommand(cPlayer * a_Player,
|
||||
|
||||
|
||||
|
||||
cPlugin * cPluginManager::GetPlugin( const AString & a_Plugin ) const
|
||||
cPlugin * cPluginManager::GetPlugin( const AString & a_Plugin) const
|
||||
{
|
||||
for( PluginMap::const_iterator itr = m_Plugins.begin(); itr != m_Plugins.end(); ++itr )
|
||||
for (PluginMap::const_iterator itr = m_Plugins.begin(); itr != m_Plugins.end(); ++itr)
|
||||
{
|
||||
if (itr->second == NULL ) continue;
|
||||
if (itr->second == NULL) continue;
|
||||
if (itr->second->GetName().compare(a_Plugin) == 0)
|
||||
{
|
||||
return itr->second;
|
||||
|
@ -163,7 +163,7 @@ public:
|
||||
|
||||
typedef std::map< AString, cPlugin * > PluginMap;
|
||||
typedef std::list< cPlugin * > PluginList;
|
||||
cPlugin * GetPlugin( const AString & a_Plugin ) const; // tolua_export
|
||||
cPlugin * GetPlugin( const AString & a_Plugin) const; // tolua_export
|
||||
const PluginMap & GetAllPlugins() const; // >> EXPORTED IN MANUALBINDINGS <<
|
||||
|
||||
// tolua_begin
|
||||
|
@ -45,12 +45,12 @@ cWebPlugin::~cWebPlugin()
|
||||
std::list<std::pair<AString, AString> > cWebPlugin::GetTabNames(void)
|
||||
{
|
||||
std::list< std::pair< AString, AString > > NameList;
|
||||
for( TabList::iterator itr = GetTabs().begin(); itr != GetTabs().end(); ++itr )
|
||||
for (TabList::iterator itr = GetTabs().begin(); itr != GetTabs().end(); ++itr)
|
||||
{
|
||||
std::pair< AString, AString > StringPair;
|
||||
StringPair.first = (*itr)->Title;
|
||||
StringPair.second = (*itr)->SafeTitle;
|
||||
NameList.push_back( StringPair );
|
||||
NameList.push_back( StringPair);
|
||||
}
|
||||
return NameList;
|
||||
}
|
||||
@ -69,7 +69,7 @@ std::pair< AString, AString > cWebPlugin::GetTabNameForRequest(const HTTPRequest
|
||||
sWebPluginTab * Tab = NULL;
|
||||
if (Split.size() > 2) // If we got the tab name, show that page
|
||||
{
|
||||
for( TabList::iterator itr = GetTabs().begin(); itr != GetTabs().end(); ++itr )
|
||||
for (TabList::iterator itr = GetTabs().begin(); itr != GetTabs().end(); ++itr)
|
||||
{
|
||||
if ((*itr)->SafeTitle.compare(Split[2]) == 0) // This is the one!
|
||||
{
|
||||
@ -80,7 +80,7 @@ std::pair< AString, AString > cWebPlugin::GetTabNameForRequest(const HTTPRequest
|
||||
}
|
||||
else // Otherwise show the first tab
|
||||
{
|
||||
if( GetTabs().size() > 0 )
|
||||
if (GetTabs().size() > 0)
|
||||
Tab = *GetTabs().begin();
|
||||
}
|
||||
|
||||
@ -100,14 +100,14 @@ std::pair< AString, AString > cWebPlugin::GetTabNameForRequest(const HTTPRequest
|
||||
AString cWebPlugin::SafeString(const AString & a_String)
|
||||
{
|
||||
AString RetVal;
|
||||
for( unsigned int i = 0; i < a_String.size(); ++i )
|
||||
for (unsigned int i = 0; i < a_String.size(); ++i)
|
||||
{
|
||||
char c = a_String[i];
|
||||
if( c == ' ' )
|
||||
if (c == ' ')
|
||||
{
|
||||
c = '_';
|
||||
}
|
||||
RetVal.push_back( c );
|
||||
RetVal.push_back( c);
|
||||
}
|
||||
return RetVal;
|
||||
}
|
||||
|
@ -19,9 +19,9 @@ public:
|
||||
// tolua_begin
|
||||
virtual const AString GetWebTitle(void) const = 0;
|
||||
|
||||
virtual AString HandleWebRequest(const HTTPRequest * a_Request ) = 0;
|
||||
virtual AString HandleWebRequest(const HTTPRequest * a_Request) = 0;
|
||||
|
||||
static AString SafeString( const AString & a_String );
|
||||
static AString SafeString( const AString & a_String);
|
||||
// tolua_end
|
||||
|
||||
struct sWebPluginTab
|
||||
@ -37,7 +37,7 @@ public:
|
||||
|
||||
typedef std::list< std::pair<AString, AString> > TabNameList;
|
||||
TabNameList GetTabNames(); // >> EXPORTED IN MANUALBINDINGS <<
|
||||
std::pair< AString, AString > GetTabNameForRequest(const HTTPRequest* a_Request );
|
||||
std::pair< AString, AString > GetTabNameForRequest(const HTTPRequest* a_Request);
|
||||
|
||||
private:
|
||||
TabList m_Tabs;
|
||||
|
@ -10,7 +10,8 @@
|
||||
|
||||
|
||||
// The "map" used for biome <-> string conversions:
|
||||
static struct {
|
||||
static struct
|
||||
{
|
||||
EMCSBiome m_Biome;
|
||||
const char * m_String;
|
||||
} g_BiomeMap[] =
|
||||
|
@ -66,7 +66,7 @@ int cBeaconEntity::GetPyramidLevel(void)
|
||||
|
||||
bool cBeaconEntity::IsMineralBlock(BLOCKTYPE a_BlockType)
|
||||
{
|
||||
switch(a_BlockType)
|
||||
switch (a_BlockType)
|
||||
{
|
||||
case E_BLOCK_DIAMOND_BLOCK:
|
||||
case E_BLOCK_GOLD_BLOCK:
|
||||
|
@ -33,7 +33,7 @@ public:
|
||||
static bool IsMineralBlock(BLOCKTYPE a_BlockType);
|
||||
|
||||
// cBlockEntity overrides:
|
||||
virtual void SaveToJson(Json::Value& a_Value ) override;
|
||||
virtual void SaveToJson(Json::Value& a_Value) override;
|
||||
virtual void SendTo(cClientHandle & a_Client) override;
|
||||
virtual void UsedBy(cPlayer * a_Player) override;
|
||||
virtual bool Tick(float a_Dt, cChunk & /* a_Chunk */) override;
|
||||
|
@ -79,7 +79,7 @@ public:
|
||||
virtual void SaveToJson (Json::Value & a_Value) = 0;
|
||||
|
||||
/// Called when a player uses this entity; should open the UI window
|
||||
virtual void UsedBy( cPlayer * a_Player ) = 0;
|
||||
virtual void UsedBy( cPlayer * a_Player) = 0;
|
||||
|
||||
/** Sends the packet defining the block entity to the client specified.
|
||||
To send to all eligible clients, use cWorld::BroadcastBlockEntity()
|
||||
|
@ -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,
|
||||
} ;
|
||||
|
@ -38,8 +38,8 @@ public:
|
||||
/// Creates a new empty command block entity
|
||||
cCommandBlockEntity(int a_X, int a_Y, int a_Z, cWorld * a_World);
|
||||
|
||||
bool LoadFromJson( const Json::Value& a_Value );
|
||||
virtual void SaveToJson(Json::Value& a_Value ) override;
|
||||
bool LoadFromJson( const Json::Value& a_Value);
|
||||
virtual void SaveToJson(Json::Value& a_Value) override;
|
||||
|
||||
virtual bool Tick(float a_Dt, cChunk & a_Chunk) override;
|
||||
virtual void SendTo(cClientHandle & a_Client) override;
|
||||
|
@ -35,7 +35,8 @@ class cDropSpenserEntity :
|
||||
typedef cBlockEntityWithItems super;
|
||||
|
||||
public:
|
||||
enum {
|
||||
enum
|
||||
{
|
||||
ContentsHeight = 3,
|
||||
ContentsWidth = 3,
|
||||
} ;
|
||||
|
@ -39,8 +39,8 @@ public:
|
||||
/** Creates a new flowerpot entity at the specified block coords. a_World may be NULL */
|
||||
cFlowerPotEntity(int a_BlocX, int a_BlockY, int a_BlockZ, cWorld * a_World);
|
||||
|
||||
bool LoadFromJson( const Json::Value& a_Value );
|
||||
virtual void SaveToJson(Json::Value& a_Value ) override;
|
||||
bool LoadFromJson( const Json::Value& a_Value);
|
||||
virtual void SaveToJson(Json::Value& a_Value) override;
|
||||
|
||||
virtual void Destroy(void) override;
|
||||
|
||||
|
@ -160,7 +160,7 @@ bool cFurnaceEntity::LoadFromJson(const Json::Value & a_Value)
|
||||
|
||||
|
||||
|
||||
void cFurnaceEntity::SaveToJson( Json::Value& a_Value )
|
||||
void cFurnaceEntity::SaveToJson( Json::Value& a_Value)
|
||||
{
|
||||
a_Value["x"] = m_PosX;
|
||||
a_Value["y"] = m_PosY;
|
||||
|
@ -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
|
||||
|
@ -37,8 +37,8 @@ public:
|
||||
/** Creates a new mob head entity at the specified block coords. a_World may be NULL */
|
||||
cMobHeadEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World);
|
||||
|
||||
bool LoadFromJson( const Json::Value& a_Value );
|
||||
virtual void SaveToJson(Json::Value& a_Value ) override;
|
||||
bool LoadFromJson( const Json::Value& a_Value);
|
||||
virtual void SaveToJson(Json::Value& a_Value) override;
|
||||
|
||||
// tolua_begin
|
||||
|
||||
|
@ -37,8 +37,8 @@ public:
|
||||
/// Creates a new empty sign entity at the specified block coords and block type (wall or standing). a_World may be NULL
|
||||
cSignEntity(BLOCKTYPE a_BlockType, int a_X, int a_Y, int a_Z, cWorld * a_World);
|
||||
|
||||
bool LoadFromJson( const Json::Value& a_Value );
|
||||
virtual void SaveToJson(Json::Value& a_Value ) override;
|
||||
bool LoadFromJson( const Json::Value& a_Value);
|
||||
virtual void SaveToJson(Json::Value& a_Value) override;
|
||||
|
||||
// tolua_begin
|
||||
|
||||
|
@ -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,7 @@ void cBlockBedHandler::OnPlacedByPlayer(
|
||||
if (a_BlockMeta < 8)
|
||||
{
|
||||
Vector3i Direction = MetaDataToDirection(a_BlockMeta);
|
||||
a_ChunkInterface.SetBlock(a_WorldInterface,a_BlockX + Direction.x, a_BlockY, a_BlockZ + Direction.z, E_BLOCK_BED, a_BlockMeta | 0x8);
|
||||
a_ChunkInterface.SetBlock(a_WorldInterface, a_BlockX + Direction.x, a_BlockY, a_BlockZ + Direction.z, E_BLOCK_BED, a_BlockMeta | 0x8);
|
||||
}
|
||||
}
|
||||
|
||||
@ -27,8 +27,8 @@ void cBlockBedHandler::OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldInt
|
||||
{
|
||||
NIBBLETYPE OldMeta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
|
||||
|
||||
Vector3i ThisPos( a_BlockX, a_BlockY, a_BlockZ );
|
||||
Vector3i Direction = MetaDataToDirection( OldMeta & 0x7 );
|
||||
Vector3i ThisPos( a_BlockX, a_BlockY, a_BlockZ);
|
||||
Vector3i Direction = MetaDataToDirection( OldMeta & 0x7);
|
||||
if (OldMeta & 0x8)
|
||||
{
|
||||
// Was pillow
|
||||
|
@ -16,7 +16,7 @@ class cBlockBedHandler :
|
||||
{
|
||||
public:
|
||||
cBlockBedHandler(BLOCKTYPE a_BlockType)
|
||||
: cMetaRotator<cBlockHandler, 0x3, 0x02, 0x03, 0x00, 0x01,true>(a_BlockType)
|
||||
: cMetaRotator<cBlockHandler, 0x3, 0x02, 0x03, 0x00, 0x01, true>(a_BlockType)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
||||
@ -174,7 +175,7 @@ public:
|
||||
|
||||
cBlockHandler * cBlockHandler::CreateBlockHandler(BLOCKTYPE a_BlockType)
|
||||
{
|
||||
switch(a_BlockType)
|
||||
switch (a_BlockType)
|
||||
{
|
||||
// Block handlers, alphabetically sorted:
|
||||
case E_BLOCK_ACACIA_WOOD_STAIRS: return new cBlockStairsHandler (a_BlockType);
|
||||
@ -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);
|
||||
|
@ -103,7 +103,7 @@ public:
|
||||
}
|
||||
|
||||
|
||||
virtual bool CanBeAt(cChunkInterface & a_ChunkInterface,int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
|
||||
virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
|
||||
{
|
||||
// TODO: Use AdjustCoordsByMeta(), then cChunk::UnboundedRelGetBlock() and finally some comparison
|
||||
eBlockFace BlockFace = MetaDataToDirection(a_Chunk.GetMeta(a_RelX, a_RelY, a_RelZ));
|
||||
|
@ -11,7 +11,7 @@
|
||||
// Leaves can be this many blocks that away (inclusive) from the log not to decay
|
||||
#define LEAVES_CHECK_DISTANCE 6
|
||||
|
||||
#define PROCESS_NEIGHBOR(x,y,z) \
|
||||
#define PROCESS_NEIGHBOR(x, y, z) \
|
||||
switch (a_Area.GetBlockType(x, y, z)) \
|
||||
{ \
|
||||
case E_BLOCK_LEAVES: a_Area.SetBlockType(x, y, z, (BLOCKTYPE)(E_BLOCK_SPONGE + i + 1)); break; \
|
||||
|
@ -70,7 +70,7 @@ public:
|
||||
} PortalCheck[] =
|
||||
{
|
||||
{ 0, 1, 0},
|
||||
{ 0,-1, 0},
|
||||
{ 0, -1, 0},
|
||||
{ 1, 0, 0},
|
||||
{-1, 0, 0},
|
||||
} ;
|
||||
@ -95,7 +95,7 @@ public:
|
||||
} PortalCheck[] =
|
||||
{
|
||||
{ 0, 1, 0},
|
||||
{ 0,-1, 0},
|
||||
{ 0, -1, 0},
|
||||
{ 0, 0, -1},
|
||||
{ 0, 0, 1},
|
||||
} ;
|
||||
|
@ -9,21 +9,23 @@
|
||||
|
||||
|
||||
|
||||
class cBlockSignHandler :
|
||||
class cBlockSignPostHandler :
|
||||
public cBlockHandler
|
||||
{
|
||||
typedef cBlockHandler super;
|
||||
|
||||
public:
|
||||
cBlockSignHandler(BLOCKTYPE a_BlockType)
|
||||
: cBlockHandler(a_BlockType)
|
||||
cBlockSignPostHandler(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
|
||||
{
|
||||
@ -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
|
||||
@ -43,23 +56,6 @@ public:
|
||||
|
||||
return ((char)a_Rotation) % 16;
|
||||
}
|
||||
|
||||
|
||||
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(
|
||||
@ -84,22 +80,23 @@ public:
|
||||
return (a_Meta + 12) & 0x0f;
|
||||
}
|
||||
|
||||
|
||||
virtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta) override
|
||||
{
|
||||
// Mirrors signs over the XY plane (North-South Mirroring)
|
||||
// Mirrors signs over the XY plane (North-South Mirroring)
|
||||
|
||||
// There are 16 meta values which correspond to different directions.
|
||||
// These values are equated to angles on a circle; 0x08 = 180 degrees.
|
||||
// There are 16 meta values which correspond to different directions.
|
||||
// These values are equated to angles on a circle; 0x08 = 180 degrees.
|
||||
return (a_Meta < 0x08) ? (0x08 + a_Meta) : (0x08 - a_Meta);
|
||||
}
|
||||
|
||||
|
||||
virtual NIBBLETYPE MetaMirrorYZ(NIBBLETYPE a_Meta) override
|
||||
{
|
||||
// Mirrors signs over the YZ plane (East-West Mirroring)
|
||||
// Mirrors signs over the YZ plane (East-West Mirroring)
|
||||
|
||||
// There are 16 meta values which correspond to different directions.
|
||||
// These values are equated to angles on a circle; 0x10 = 360 degrees.
|
||||
// There are 16 meta values which correspond to different directions.
|
||||
// These values are equated to angles on a circle; 0x10 = 360 degrees.
|
||||
return 0x10 - a_Meta;
|
||||
}
|
||||
} ;
|
@ -99,7 +99,7 @@ public:
|
||||
|
||||
static bool CanBePlacedOn(BLOCKTYPE a_BlockType, eBlockFace a_BlockFace)
|
||||
{
|
||||
if ( !cBlockInfo::FullyOccupiesVoxel(a_BlockType) )
|
||||
if (!cBlockInfo::FullyOccupiesVoxel(a_BlockType))
|
||||
{
|
||||
return (a_BlockFace == BLOCK_FACE_TOP); // Allow placement only when torch upright (for glass, etc.); exceptions won't even be sent by client, no need to handle
|
||||
}
|
||||
@ -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) ||
|
||||
@ -167,7 +168,7 @@ public:
|
||||
// No need to check for upright orientation, it was done when the torch was placed
|
||||
return true;
|
||||
}
|
||||
else if ( !cBlockInfo::FullyOccupiesVoxel(BlockInQuestion) )
|
||||
else if (!cBlockInfo::FullyOccupiesVoxel(BlockInQuestion))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -59,7 +59,7 @@ public:
|
||||
|
||||
static char MetaDataToDirection(NIBBLETYPE a_MetaData)
|
||||
{
|
||||
switch(a_MetaData)
|
||||
switch (a_MetaData)
|
||||
{
|
||||
case 0x1: return BLOCK_FACE_NORTH;
|
||||
case 0x4: return BLOCK_FACE_SOUTH;
|
||||
|
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;
|
||||
}
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
@ -6,7 +6,7 @@ class cBroadcastInterface
|
||||
public:
|
||||
virtual ~cBroadcastInterface() {}
|
||||
|
||||
virtual void BroadcastUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ ) = 0;
|
||||
virtual void BroadcastUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) = 0;
|
||||
virtual void BroadcastSoundEffect(const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch, const cClientHandle * a_Exclude = NULL) = 0;
|
||||
virtual void BroadcastEntityAnimation(const cEntity & a_Entity, char a_Animation, const cClientHandle * a_Exclude = NULL) = 0;
|
||||
};
|
||||
|
@ -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()
|
||||
|
@ -18,7 +18,7 @@ public:
|
||||
|
||||
BLOCKTYPE GetBlock(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
{
|
||||
return m_ChunkMap->GetBlock(a_BlockX,a_BlockY,a_BlockZ);
|
||||
return m_ChunkMap->GetBlock(a_BlockX, a_BlockY, a_BlockZ);
|
||||
}
|
||||
BLOCKTYPE GetBlock(const Vector3i & a_Pos)
|
||||
{
|
||||
@ -61,9 +61,9 @@ public:
|
||||
m_ChunkMap->FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, a_BlockType, a_BlockMeta);
|
||||
}
|
||||
|
||||
void FastSetBlock(const Vector3i & a_Pos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta )
|
||||
void FastSetBlock(const Vector3i & a_Pos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
|
||||
{
|
||||
FastSetBlock( a_Pos.x, a_Pos.y, a_Pos.z, a_BlockType, a_BlockMeta );
|
||||
FastSetBlock( a_Pos.x, a_Pos.y, a_Pos.z, a_BlockType, a_BlockMeta);
|
||||
}
|
||||
|
||||
void UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
|
@ -191,7 +191,7 @@ bool cBoundingBox::IsInside(const Vector3d & a_Point)
|
||||
|
||||
|
||||
|
||||
bool cBoundingBox::IsInside(double a_X, double a_Y,double a_Z)
|
||||
bool cBoundingBox::IsInside(double a_X, double a_Y, double a_Z)
|
||||
{
|
||||
return IsInside(m_Min, m_Max, a_X, a_Y, a_Z);
|
||||
}
|
||||
|
@ -49,7 +49,7 @@ public:
|
||||
bool IsInside(const Vector3d & a_Point);
|
||||
|
||||
/// Returns true if the point is inside the bounding box
|
||||
bool IsInside(double a_X, double a_Y,double a_Z);
|
||||
bool IsInside(double a_X, double a_Y, double a_Z);
|
||||
|
||||
/// Returns true if a_Other is inside this bounding box
|
||||
bool IsInside(cBoundingBox & a_Other);
|
||||
|
@ -5,144 +5,148 @@ 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
|
||||
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
|
||||
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 +157,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 +182,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 +228,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_DEPENDECIES}
|
||||
)
|
||||
endif()
|
||||
|
||||
add_executable(${EXECUTABLE} ${SOURCE})
|
||||
|
||||
|
||||
@ -261,9 +300,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;
|
||||
|
||||
/** @deprecated use ChatColor::Delimiter instead */
|
||||
static const char * Color;
|
||||
|
||||
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;
|
||||
|
||||
// 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,13 +7,14 @@ 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 ("//")
|
||||
- Spaces after comma, not before (except in #define argument list)
|
||||
- Spaces after comma, not before
|
||||
- Opening braces not at the end of a code line
|
||||
- Spaces after if, for, while
|
||||
- (TODO) Spaces before *, /, &
|
||||
- (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 comments continuation lines
|
||||
- (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)
|
||||
@ -22,26 +24,12 @@ 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 =
|
||||
{
|
||||
@ -52,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
|
||||
@ -79,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
|
||||
|
||||
@ -94,7 +81,7 @@ local function ReportViolationIfFound(a_Line, a_FileName, a_LineNum, a_Pattern,
|
||||
if not(patStart) then
|
||||
return
|
||||
end
|
||||
ReportViolation(a_FileName, a_LineNum, a_Message .. "(" .. patStart .. " .. " .. patEnd .. ")")
|
||||
ReportViolation(a_FileName, a_LineNum, patStart, patEnd, a_Message)
|
||||
end
|
||||
|
||||
|
||||
@ -120,7 +107,26 @@ local g_ViolationPatterns =
|
||||
|
||||
-- Check that all commas have spaces after them and not in front of them:
|
||||
{" ,", "Extra space before a \",\""},
|
||||
{"^\t*[^#].*,[^%s]", "Needs a space after a \",\""}, -- Anywhere except lines starting with "#" - avoid #define params
|
||||
{",[^%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 \")\""},
|
||||
}
|
||||
|
||||
|
||||
@ -145,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
|
||||
|
||||
@ -178,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)
|
||||
@ -199,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)
|
||||
|
@ -44,12 +44,12 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// sSetBlock:
|
||||
|
||||
sSetBlock::sSetBlock( int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta ) // absolute block position
|
||||
: x( a_BlockX )
|
||||
, y( a_BlockY )
|
||||
, z( a_BlockZ )
|
||||
, BlockType( a_BlockType )
|
||||
, BlockMeta( a_BlockMeta )
|
||||
sSetBlock::sSetBlock( int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) // absolute block position
|
||||
: x( a_BlockX)
|
||||
, y( a_BlockY)
|
||||
, z( a_BlockZ)
|
||||
, BlockType( a_BlockType)
|
||||
, BlockMeta( a_BlockMeta)
|
||||
{
|
||||
cChunkDef::AbsoluteToRelative(x, y, z, ChunkX, ChunkZ);
|
||||
}
|
||||
@ -116,7 +116,7 @@ cChunk::~cChunk()
|
||||
{
|
||||
cPluginManager::Get()->CallHookChunkUnloaded(m_World, m_PosX, m_PosZ);
|
||||
|
||||
// LOGINFO("### delete cChunk() (%i, %i) from %p, thread 0x%x ###", m_PosX, m_PosZ, this, GetCurrentThreadId() );
|
||||
// LOGINFO("### delete cChunk() (%i, %i) from %p, thread 0x%x ###", m_PosX, m_PosZ, this, GetCurrentThreadId());
|
||||
|
||||
for (cBlockEntityList::iterator itr = m_BlockEntities.begin(); itr != m_BlockEntities.end(); ++itr)
|
||||
{
|
||||
@ -455,7 +455,7 @@ void cChunk::CollectMobCensus(cMobCensus& toFill)
|
||||
currentPosition = Monster.GetPosition();
|
||||
for (std::list<const Vector3d*>::const_iterator itr2 = playerPositions.begin(); itr2 != playerPositions.end(); ++itr2)
|
||||
{
|
||||
toFill.CollectMob(Monster,*this,(currentPosition-**itr2).SqrLength());
|
||||
toFill.CollectMob(Monster, *this, (currentPosition - **itr2).SqrLength());
|
||||
}
|
||||
}
|
||||
} // for itr - m_Entitites[]
|
||||
@ -464,7 +464,7 @@ void cChunk::CollectMobCensus(cMobCensus& toFill)
|
||||
|
||||
|
||||
|
||||
void cChunk::GetThreeRandomNumbers(int & a_X, int & a_Y, int & a_Z,int a_MaxX, int a_MaxY, int a_MaxZ)
|
||||
void cChunk::GetThreeRandomNumbers(int & a_X, int & a_Y, int & a_Z, int a_MaxX, int a_MaxY, int a_MaxZ)
|
||||
{
|
||||
ASSERT(a_MaxX * a_MaxY * a_MaxZ * 8 < 0x00ffffff);
|
||||
int Random = m_World->GetTickRandomNumber(0x00ffffff);
|
||||
@ -638,7 +638,7 @@ void cChunk::TickBlock(int a_RelX, int a_RelY, int a_RelZ)
|
||||
ASSERT(Handler != NULL); // Happenned on server restart, FS #243
|
||||
cChunkInterface ChunkInterface(this->GetWorld()->GetChunkMap());
|
||||
cBlockInServerPluginInterface PluginInterface(*this->GetWorld());
|
||||
Handler->OnUpdate(ChunkInterface, *this->GetWorld(), PluginInterface,*this, a_RelX, a_RelY, a_RelZ);
|
||||
Handler->OnUpdate(ChunkInterface, *this->GetWorld(), PluginInterface, *this, a_RelX, a_RelY, a_RelZ);
|
||||
}
|
||||
|
||||
|
||||
@ -781,7 +781,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);
|
||||
@ -1393,7 +1393,7 @@ void cChunk::CalculateHeightmap(const BLOCKTYPE * a_BlockTypes)
|
||||
{
|
||||
for (int y = Height - 1; y > -1; y--)
|
||||
{
|
||||
int index = MakeIndex( x, y, z );
|
||||
int index = MakeIndex( x, y, z);
|
||||
if (a_BlockTypes[index] != E_BLOCK_AIR)
|
||||
{
|
||||
m_HeightMap[x + z * Width] = (HEIGHTTYPE)y;
|
||||
@ -1529,11 +1529,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
|
||||
@ -1728,9 +1729,9 @@ void cChunk::CollectPickupsByPlayer(cPlayer * a_Player)
|
||||
{
|
||||
continue; // Only pickups and projectiles can be picked up
|
||||
}
|
||||
float DiffX = (float)((*itr)->GetPosX() - PosX );
|
||||
float DiffY = (float)((*itr)->GetPosY() - PosY );
|
||||
float DiffZ = (float)((*itr)->GetPosZ() - PosZ );
|
||||
float DiffX = (float)((*itr)->GetPosX() - PosX);
|
||||
float DiffY = (float)((*itr)->GetPosY() - PosY);
|
||||
float DiffZ = (float)((*itr)->GetPosZ() - PosZ);
|
||||
float SqrDist = DiffX * DiffX + DiffY * DiffY + DiffZ * DiffZ;
|
||||
if (SqrDist < 1.5f * 1.5f) // 1.5 block
|
||||
{
|
||||
@ -1792,7 +1793,7 @@ bool cChunk::SetSignLines(int a_PosX, int a_PosY, int a_PosZ, const AString & a_
|
||||
|
||||
|
||||
|
||||
void cChunk::RemoveBlockEntity( cBlockEntity* a_BlockEntity )
|
||||
void cChunk::RemoveBlockEntity( cBlockEntity* a_BlockEntity)
|
||||
{
|
||||
MarkDirty();
|
||||
m_BlockEntities.remove(a_BlockEntity);
|
||||
@ -1812,9 +1813,9 @@ bool cChunk::AddClient(cClientHandle * a_Client)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
m_LoadedByClient.push_back( a_Client );
|
||||
m_LoadedByClient.push_back( a_Client);
|
||||
|
||||
for (cEntityList::iterator itr = m_Entities.begin(); itr != m_Entities.end(); ++itr )
|
||||
for (cEntityList::iterator itr = m_Entities.begin(); itr != m_Entities.end(); ++itr)
|
||||
{
|
||||
/*
|
||||
// DEBUG:
|
||||
@ -1866,7 +1867,7 @@ void cChunk::RemoveClient(cClientHandle * a_Client)
|
||||
|
||||
|
||||
|
||||
bool cChunk::HasClient(cClientHandle* a_Client)
|
||||
bool cChunk::HasClient(cClientHandle * a_Client)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
@ -2646,7 +2647,7 @@ cChunk * cChunk::GetRelNeighborChunkAdjustCoords(int & a_RelX, int & a_RelZ) con
|
||||
|
||||
void cChunk::BroadcastAttachEntity(const cEntity & a_Entity, const cEntity * a_Vehicle)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
(*itr)->SendAttachEntity(a_Entity, a_Vehicle);
|
||||
} // for itr - LoadedByClient[]
|
||||
@ -2658,7 +2659,7 @@ void cChunk::BroadcastAttachEntity(const cEntity & a_Entity, const cEntity * a_V
|
||||
|
||||
void cChunk::BroadcastBlockAction(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2674,7 +2675,7 @@ void cChunk::BroadcastBlockAction(int a_BlockX, int a_BlockY, int a_BlockZ, char
|
||||
|
||||
void cChunk::BroadcastBlockBreakAnimation(int a_entityID, int a_blockX, int a_blockY, int a_blockZ, char a_stage, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2696,7 +2697,7 @@ void cChunk::BroadcastBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cons
|
||||
{
|
||||
return;
|
||||
}
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2712,7 +2713,7 @@ void cChunk::BroadcastBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cons
|
||||
|
||||
void cChunk::BroadcastChunkData(cChunkDataSerializer & a_Serializer, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2728,7 +2729,7 @@ void cChunk::BroadcastChunkData(cChunkDataSerializer & a_Serializer, const cClie
|
||||
|
||||
void cChunk::BroadcastCollectEntity(const cEntity & a_Entity, const cPlayer & a_Player, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2744,7 +2745,7 @@ void cChunk::BroadcastCollectEntity(const cEntity & a_Entity, const cPlayer & a_
|
||||
|
||||
void cChunk::BroadcastDestroyEntity(const cEntity & a_Entity, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2760,7 +2761,7 @@ void cChunk::BroadcastDestroyEntity(const cEntity & a_Entity, const cClientHandl
|
||||
|
||||
void cChunk::BroadcastEntityEffect(const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2776,7 +2777,7 @@ void cChunk::BroadcastEntityEffect(const cEntity & a_Entity, int a_EffectID, int
|
||||
|
||||
void cChunk::BroadcastEntityEquipment(const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2792,7 +2793,7 @@ void cChunk::BroadcastEntityEquipment(const cEntity & a_Entity, short a_SlotNum,
|
||||
|
||||
void cChunk::BroadcastEntityHeadLook(const cEntity & a_Entity, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2808,7 +2809,7 @@ void cChunk::BroadcastEntityHeadLook(const cEntity & a_Entity, const cClientHand
|
||||
|
||||
void cChunk::BroadcastEntityLook(const cEntity & a_Entity, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2824,7 +2825,7 @@ void cChunk::BroadcastEntityLook(const cEntity & a_Entity, const cClientHandle *
|
||||
|
||||
void cChunk::BroadcastEntityMetadata(const cEntity & a_Entity, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2840,7 +2841,7 @@ void cChunk::BroadcastEntityMetadata(const cEntity & a_Entity, const cClientHand
|
||||
|
||||
void cChunk::BroadcastEntityRelMove(const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2856,7 +2857,7 @@ void cChunk::BroadcastEntityRelMove(const cEntity & a_Entity, char a_RelX, char
|
||||
|
||||
void cChunk::BroadcastEntityRelMoveLook(const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2872,7 +2873,7 @@ void cChunk::BroadcastEntityRelMoveLook(const cEntity & a_Entity, char a_RelX, c
|
||||
|
||||
void cChunk::BroadcastEntityStatus(const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2888,7 +2889,7 @@ void cChunk::BroadcastEntityStatus(const cEntity & a_Entity, char a_Status, cons
|
||||
|
||||
void cChunk::BroadcastEntityVelocity(const cEntity & a_Entity, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2904,7 +2905,7 @@ void cChunk::BroadcastEntityVelocity(const cEntity & a_Entity, const cClientHand
|
||||
|
||||
void cChunk::BroadcastEntityAnimation(const cEntity & a_Entity, char a_Animation, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2920,7 +2921,7 @@ void cChunk::BroadcastEntityAnimation(const cEntity & a_Entity, char a_Animation
|
||||
|
||||
void cChunk::BroadcastParticleEffect(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, cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2936,7 +2937,7 @@ void cChunk::BroadcastParticleEffect(const AString & a_ParticleName, float a_Src
|
||||
|
||||
void cChunk::BroadcastRemoveEntityEffect(const cEntity & a_Entity, int a_EffectID, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2952,7 +2953,7 @@ void cChunk::BroadcastRemoveEntityEffect(const cEntity & a_Entity, int a_EffectI
|
||||
|
||||
void cChunk::BroadcastSoundEffect(const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2968,7 +2969,7 @@ void cChunk::BroadcastSoundEffect(const AString & a_SoundName, double a_X, doubl
|
||||
|
||||
void cChunk::BroadcastSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -2984,7 +2985,7 @@ void cChunk::BroadcastSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY
|
||||
|
||||
void cChunk::BroadcastSpawnEntity(cEntity & a_Entity, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -3000,7 +3001,7 @@ void cChunk::BroadcastSpawnEntity(cEntity & a_Entity, const cClientHandle * a_Ex
|
||||
|
||||
void cChunk::BroadcastThunderbolt(int a_BlockX, int a_BlockY, int a_BlockZ, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
if (*itr == a_Exclude)
|
||||
{
|
||||
@ -3014,9 +3015,9 @@ void cChunk::BroadcastThunderbolt(int a_BlockX, int a_BlockY, int a_BlockZ, cons
|
||||
|
||||
|
||||
|
||||
void cChunk::BroadcastUseBed(const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ )
|
||||
void cChunk::BroadcastUseBed(const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
{
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
(*itr)->SendUseBed(a_Entity, a_BlockX, a_BlockY, a_BlockZ);
|
||||
} // for itr - LoadedByClient[]
|
||||
|
12
src/Chunk.h
12
src/Chunk.h
@ -82,9 +82,9 @@ public:
|
||||
|
||||
/*
|
||||
To save a chunk, the WSSchema must:
|
||||
1. Mark the chunk as being saved (MarkSaving() )
|
||||
1. Mark the chunk as being saved (MarkSaving())
|
||||
2. Get the chunk's data using GetAllData()
|
||||
3. Mark the chunk as saved (MarkSaved() )
|
||||
3. Mark the chunk as saved (MarkSaved())
|
||||
If anywhere inside this sequence another thread mmodifies the chunk, the chunk will not get marked as saved in MarkSaved()
|
||||
*/
|
||||
void MarkSaving(void); // Marks the chunk as being saved.
|
||||
@ -144,7 +144,7 @@ public:
|
||||
|
||||
void SetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, bool a_SendToClients = true);
|
||||
// SetBlock() does a lot of work (heightmap, tickblocks, blockentities) so a BlockIdx version doesn't make sense
|
||||
void SetBlock( const Vector3i & a_RelBlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta ) { SetBlock( a_RelBlockPos.x, a_RelBlockPos.y, a_RelBlockPos.z, a_BlockType, a_BlockMeta ); }
|
||||
void SetBlock( const Vector3i & a_RelBlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) { SetBlock( a_RelBlockPos.x, a_RelBlockPos.y, a_RelBlockPos.z, a_BlockType, a_BlockMeta); }
|
||||
|
||||
/** Queues a block change till the specified world tick */
|
||||
void QueueSetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Int64 a_Tick, BLOCKTYPE a_PreviousBlockType = E_BLOCK_AIR);
|
||||
@ -195,7 +195,7 @@ public:
|
||||
/** Sets the sign text. Returns true if successful. Also sends update packets to all clients in the chunk */
|
||||
bool SetSignLines(int a_RelX, int a_RelY, int a_RelZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4);
|
||||
|
||||
int GetHeight( int a_X, int a_Z );
|
||||
int GetHeight( int a_X, int a_Z);
|
||||
|
||||
void SendBlockTo(int a_RelX, int a_RelY, int a_RelZ, cClientHandle * a_Client);
|
||||
|
||||
@ -301,7 +301,7 @@ public:
|
||||
void BroadcastSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data, const cClientHandle * a_Exclude = NULL);
|
||||
void BroadcastSpawnEntity (cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
||||
void BroadcastThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ, const cClientHandle * a_Exclude = NULL);
|
||||
void BroadcastUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ );
|
||||
void BroadcastUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
|
||||
void SendBlockEntity (int a_BlockX, int a_BlockY, int a_BlockZ, cClientHandle & a_Client);
|
||||
|
||||
@ -311,7 +311,7 @@ public:
|
||||
}
|
||||
|
||||
void PositionToWorldPosition(int a_RelX, int a_RelY, int a_RelZ, int & a_BlockX, int & a_BlockY, int & a_BlockZ);
|
||||
Vector3i PositionToWorldPosition(int a_RelX, int a_RelY, int a_RelZ );
|
||||
Vector3i PositionToWorldPosition(int a_RelX, int a_RelY, int a_RelZ);
|
||||
|
||||
inline void MarkDirty(void)
|
||||
{
|
||||
|
@ -92,7 +92,7 @@ public:
|
||||
|
||||
|
||||
/// Converts absolute block coords into relative (chunk + block) coords:
|
||||
inline static void AbsoluteToRelative(/* in-out */ int & a_X, int & a_Y, int & a_Z, /* out */ int & a_ChunkX, int & a_ChunkZ )
|
||||
inline static void AbsoluteToRelative(/* in-out */ int & a_X, int & a_Y, int & a_Z, /* out */ int & a_ChunkX, int & a_ChunkZ)
|
||||
{
|
||||
UNUSED(a_Y);
|
||||
BlockToChunk(a_X, a_Z, a_ChunkX, a_ChunkZ);
|
||||
@ -118,7 +118,7 @@ public:
|
||||
}
|
||||
|
||||
|
||||
inline static int MakeIndex(int x, int y, int z )
|
||||
inline static int MakeIndex(int x, int y, int z)
|
||||
{
|
||||
if (
|
||||
(x < Width) && (x > -1) &&
|
||||
@ -145,7 +145,7 @@ public:
|
||||
}
|
||||
|
||||
|
||||
inline static Vector3i IndexToCoordinate( unsigned int index )
|
||||
inline static Vector3i IndexToCoordinate( unsigned int index)
|
||||
{
|
||||
#if AXIS_ORDER == AXIS_ORDER_XZY
|
||||
return Vector3i( // 1.2
|
||||
@ -357,7 +357,7 @@ struct sSetBlock
|
||||
BLOCKTYPE BlockType;
|
||||
NIBBLETYPE BlockMeta;
|
||||
|
||||
sSetBlock( int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta ); // absolute block position
|
||||
sSetBlock( int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta); // absolute block position
|
||||
sSetBlock(int a_ChunkX, int a_ChunkZ, int a_X, int a_Y, int a_Z, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) :
|
||||
x(a_X), y(a_Y), z(a_Z),
|
||||
ChunkX(a_ChunkX), ChunkZ(a_ChunkZ),
|
||||
|
@ -64,7 +64,7 @@ cChunkMap::~cChunkMap()
|
||||
|
||||
|
||||
|
||||
void cChunkMap::RemoveLayer( cChunkLayer* a_Layer )
|
||||
void cChunkMap::RemoveLayer( cChunkLayer* a_Layer)
|
||||
{
|
||||
cCSLock Lock(m_CSLayers);
|
||||
m_Layers.remove(a_Layer);
|
||||
@ -147,7 +147,7 @@ cChunkPtr cChunkMap::GetChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ)
|
||||
// No need to lock m_CSLayers, since it's already locked by the operation that called us
|
||||
ASSERT(m_CSLayers.IsLockedByCurrentThread());
|
||||
|
||||
cChunkLayer * Layer = GetLayerForChunk( a_ChunkX, a_ChunkZ );
|
||||
cChunkLayer * Layer = GetLayerForChunk( a_ChunkX, a_ChunkZ);
|
||||
if (Layer == NULL)
|
||||
{
|
||||
// An error must have occurred, since layers are automatically created if they don't exist
|
||||
@ -170,10 +170,10 @@ cChunkPtr cChunkMap::GetChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ)
|
||||
|
||||
|
||||
|
||||
cChunkPtr cChunkMap::GetChunkNoGen( int a_ChunkX, int a_ChunkY, int a_ChunkZ )
|
||||
cChunkPtr cChunkMap::GetChunkNoGen( int a_ChunkX, int a_ChunkY, int a_ChunkZ)
|
||||
{
|
||||
// No need to lock m_CSLayers, since it's already locked by the operation that called us
|
||||
cChunkLayer * Layer = GetLayerForChunk( a_ChunkX, a_ChunkZ );
|
||||
cChunkLayer * Layer = GetLayerForChunk( a_ChunkX, a_ChunkZ);
|
||||
if (Layer == NULL)
|
||||
{
|
||||
// An error must have occurred, since layers are automatically created if they don't exist
|
||||
@ -197,10 +197,10 @@ cChunkPtr cChunkMap::GetChunkNoGen( int a_ChunkX, int a_ChunkY, int a_ChunkZ )
|
||||
|
||||
|
||||
|
||||
cChunkPtr cChunkMap::GetChunkNoLoad( int a_ChunkX, int a_ChunkY, int a_ChunkZ )
|
||||
cChunkPtr cChunkMap::GetChunkNoLoad( int a_ChunkX, int a_ChunkY, int a_ChunkZ)
|
||||
{
|
||||
// No need to lock m_CSLayers, since it's already locked by the operation that called us
|
||||
cChunkLayer * Layer = GetLayerForChunk( a_ChunkX, a_ChunkZ );
|
||||
cChunkLayer * Layer = GetLayerForChunk( a_ChunkX, a_ChunkZ);
|
||||
if (Layer == NULL)
|
||||
{
|
||||
// An error must have occurred, since layers are automatically created if they don't exist
|
||||
@ -720,7 +720,7 @@ void cChunkMap::BroadcastThunderbolt(int a_BlockX, int a_BlockY, int a_BlockZ, c
|
||||
|
||||
|
||||
|
||||
void cChunkMap::BroadcastUseBed(const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ )
|
||||
void cChunkMap::BroadcastUseBed(const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
{
|
||||
cCSLock Lock(m_CSLayers);
|
||||
int ChunkX, ChunkZ;
|
||||
@ -1154,9 +1154,9 @@ void cChunkMap::CollectPickupsByPlayer(cPlayer * a_Player)
|
||||
GetChunkNoLoad(ChunkX, ChunkY, ChunkZ)->CollectPickupsByPlayer(a_Player);
|
||||
|
||||
// Check the neighboring chunks as well:
|
||||
GetChunkNoLoad(OtherChunkX, ChunkY, ChunkZ )->CollectPickupsByPlayer(a_Player);
|
||||
GetChunkNoLoad(OtherChunkX, ChunkY, ChunkZ)->CollectPickupsByPlayer (a_Player);
|
||||
GetChunkNoLoad(OtherChunkX, ChunkY, OtherChunkZ)->CollectPickupsByPlayer(a_Player);
|
||||
GetChunkNoLoad(ChunkX, ChunkY, ChunkZ )->CollectPickupsByPlayer(a_Player);
|
||||
GetChunkNoLoad(ChunkX, ChunkY, ChunkZ)->CollectPickupsByPlayer (a_Player);
|
||||
GetChunkNoLoad(ChunkX, ChunkY, OtherChunkZ)->CollectPickupsByPlayer(a_Player);
|
||||
}
|
||||
|
||||
@ -1181,7 +1181,7 @@ BLOCKTYPE cChunkMap::GetBlock(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
} // for itr - m_FastSetBlockQueue[]
|
||||
}
|
||||
int ChunkX, ChunkZ;
|
||||
cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ );
|
||||
cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ);
|
||||
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunk(ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
@ -1210,11 +1210,11 @@ NIBBLETYPE cChunkMap::GetBlockMeta(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
} // for itr - m_FastSetBlockQueue[]
|
||||
}
|
||||
int ChunkX, ChunkZ;
|
||||
cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ );
|
||||
cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ);
|
||||
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ );
|
||||
if ((Chunk != NULL) && Chunk->IsValid() )
|
||||
cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk != NULL) && Chunk->IsValid())
|
||||
{
|
||||
return Chunk->GetMeta(a_BlockX, a_BlockY, a_BlockZ);
|
||||
}
|
||||
@ -1228,11 +1228,11 @@ NIBBLETYPE cChunkMap::GetBlockMeta(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
NIBBLETYPE cChunkMap::GetBlockSkyLight(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
{
|
||||
int ChunkX, ChunkZ;
|
||||
cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ );
|
||||
cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ);
|
||||
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ );
|
||||
if ((Chunk != NULL) && Chunk->IsValid() )
|
||||
cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk != NULL) && Chunk->IsValid())
|
||||
{
|
||||
return Chunk->GetSkyLight(a_BlockX, a_BlockY, a_BlockZ);
|
||||
}
|
||||
@ -1246,11 +1246,11 @@ NIBBLETYPE cChunkMap::GetBlockSkyLight(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
NIBBLETYPE cChunkMap::GetBlockBlockLight(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
{
|
||||
int ChunkX, ChunkZ;
|
||||
cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ );
|
||||
cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ);
|
||||
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ );
|
||||
if ((Chunk != NULL) && Chunk->IsValid() )
|
||||
cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk != NULL) && Chunk->IsValid())
|
||||
{
|
||||
return Chunk->GetBlockLight(a_BlockX, a_BlockY, a_BlockZ);
|
||||
}
|
||||
@ -1288,10 +1288,10 @@ void cChunkMap::SetBlock(cWorldInterface & a_WorldInterface, int a_BlockX, int a
|
||||
}
|
||||
|
||||
int ChunkX, ChunkZ, X = a_BlockX, Y = a_BlockY, Z = a_BlockZ;
|
||||
cChunkDef::AbsoluteToRelative( X, Y, Z, ChunkX, ChunkZ );
|
||||
cChunkDef::AbsoluteToRelative( X, Y, Z, ChunkX, ChunkZ);
|
||||
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ );
|
||||
cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk != NULL) && Chunk->IsValid())
|
||||
{
|
||||
Chunk->SetBlock(X, Y, Z, a_BlockType, a_BlockMeta, a_SendToClients);
|
||||
@ -1324,10 +1324,10 @@ void cChunkMap::QueueSetBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYP
|
||||
bool cChunkMap::GetBlockTypeMeta(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta)
|
||||
{
|
||||
int ChunkX, ChunkZ, X = a_BlockX, Y = a_BlockY, Z = a_BlockZ;
|
||||
cChunkDef::AbsoluteToRelative( X, Y, Z, ChunkX, ChunkZ );
|
||||
cChunkDef::AbsoluteToRelative( X, Y, Z, ChunkX, ChunkZ);
|
||||
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ );
|
||||
cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk != NULL) && Chunk->IsValid())
|
||||
{
|
||||
Chunk->GetBlockTypeMeta(X, Y, Z, a_BlockType, a_BlockMeta);
|
||||
@ -1343,10 +1343,10 @@ bool cChunkMap::GetBlockTypeMeta(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCK
|
||||
bool cChunkMap::GetBlockInfo(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight)
|
||||
{
|
||||
int ChunkX, ChunkZ, X = a_BlockX, Y = a_BlockY, Z = a_BlockZ;
|
||||
cChunkDef::AbsoluteToRelative( X, Y, Z, ChunkX, ChunkZ );
|
||||
cChunkDef::AbsoluteToRelative( X, Y, Z, ChunkX, ChunkZ);
|
||||
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ );
|
||||
cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk != NULL) && Chunk->IsValid())
|
||||
{
|
||||
Chunk->GetBlockInfo(X, Y, Z, a_BlockType, a_Meta, a_SkyLight, a_BlockLight);
|
||||
@ -1364,7 +1364,7 @@ void cChunkMap::ReplaceBlocks(const sSetBlockVector & a_Blocks, BLOCKTYPE a_Filt
|
||||
cCSLock Lock(m_CSLayers);
|
||||
for (sSetBlockVector::const_iterator itr = a_Blocks.begin(); itr != a_Blocks.end(); ++itr)
|
||||
{
|
||||
cChunkPtr Chunk = GetChunk(itr->ChunkX, ZERO_CHUNK_Y, itr->ChunkZ );
|
||||
cChunkPtr Chunk = GetChunk(itr->ChunkX, ZERO_CHUNK_Y, itr->ChunkZ);
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
continue;
|
||||
@ -1385,7 +1385,7 @@ void cChunkMap::ReplaceTreeBlocks(const sSetBlockVector & a_Blocks)
|
||||
cCSLock Lock(m_CSLayers);
|
||||
for (sSetBlockVector::const_iterator itr = a_Blocks.begin(); itr != a_Blocks.end(); ++itr)
|
||||
{
|
||||
cChunkPtr Chunk = GetChunk(itr->ChunkX, ZERO_CHUNK_Y, itr->ChunkZ );
|
||||
cChunkPtr Chunk = GetChunk(itr->ChunkX, ZERO_CHUNK_Y, itr->ChunkZ);
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
continue;
|
||||
@ -1498,7 +1498,7 @@ bool cChunkMap::GetBlocks(sSetBlockVector & a_Blocks, bool a_ContinueOnFailure)
|
||||
cCSLock Lock(m_CSLayers);
|
||||
for (sSetBlockVector::iterator itr = a_Blocks.begin(); itr != a_Blocks.end(); ++itr)
|
||||
{
|
||||
cChunkPtr Chunk = GetChunk(itr->ChunkX, ZERO_CHUNK_Y, itr->ChunkZ );
|
||||
cChunkPtr Chunk = GetChunk(itr->ChunkX, ZERO_CHUNK_Y, itr->ChunkZ);
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
if (!a_ContinueOnFailure)
|
||||
@ -1522,17 +1522,17 @@ bool cChunkMap::DigBlock(int a_X, int a_Y, int a_Z)
|
||||
{
|
||||
int PosX = a_X, PosY = a_Y, PosZ = a_Z, ChunkX, ChunkZ;
|
||||
|
||||
cChunkDef::AbsoluteToRelative( PosX, PosY, PosZ, ChunkX, ChunkZ );
|
||||
cChunkDef::AbsoluteToRelative( PosX, PosY, PosZ, ChunkX, ChunkZ);
|
||||
|
||||
{
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr DestChunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ );
|
||||
cChunkPtr DestChunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((DestChunk == NULL) || !DestChunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
DestChunk->SetBlock(PosX, PosY, PosZ, E_BLOCK_AIR, 0 );
|
||||
DestChunk->SetBlock(PosX, PosY, PosZ, E_BLOCK_AIR, 0);
|
||||
m_World->GetSimulatorManager()->WakeUp(a_X, a_Y, a_Z, DestChunk);
|
||||
}
|
||||
|
||||
@ -1951,10 +1951,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
|
||||
{
|
||||
@ -2718,10 +2715,10 @@ cChunkMap::cChunkLayer::cChunkLayer(
|
||||
cChunkMap * a_Parent,
|
||||
cAllocationPool<cChunkData::sChunkSection> & a_Pool
|
||||
)
|
||||
: m_LayerX( a_LayerX )
|
||||
, m_LayerZ( a_LayerZ )
|
||||
, m_Parent( a_Parent )
|
||||
, m_NumChunksLoaded( 0 )
|
||||
: m_LayerX( a_LayerX)
|
||||
, m_LayerZ( a_LayerZ)
|
||||
, m_Parent( a_Parent)
|
||||
, m_NumChunksLoaded( 0)
|
||||
, m_Pool(a_Pool)
|
||||
{
|
||||
memset(m_Chunks, 0, sizeof(m_Chunks));
|
||||
@ -2744,7 +2741,7 @@ cChunkMap::cChunkLayer::~cChunkLayer()
|
||||
|
||||
|
||||
|
||||
cChunkPtr cChunkMap::cChunkLayer::GetChunk( int a_ChunkX, int a_ChunkY, int a_ChunkZ )
|
||||
cChunkPtr cChunkMap::cChunkLayer::GetChunk( int a_ChunkX, int a_ChunkY, int a_ChunkZ)
|
||||
{
|
||||
// Always returns an assigned chunkptr, but the chunk needn't be valid (loaded / generated) - callers must check
|
||||
|
||||
|
@ -60,7 +60,7 @@ public:
|
||||
|
||||
static const int LAYER_SIZE = 32;
|
||||
|
||||
cChunkMap(cWorld* a_World );
|
||||
cChunkMap(cWorld* a_World);
|
||||
~cChunkMap();
|
||||
|
||||
// Broadcast respective packets to all clients of the chunk where the event is taking place
|
||||
@ -89,7 +89,7 @@ public:
|
||||
void BroadcastSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data, const cClientHandle * a_Exclude = NULL);
|
||||
void BroadcastSpawnEntity(cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
||||
void BroadcastThunderbolt(int a_BlockX, int a_BlockY, int a_BlockZ, const cClientHandle * a_Exclude = NULL);
|
||||
void BroadcastUseBed(const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ );
|
||||
void BroadcastUseBed(const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
|
||||
/** Sends the block entity, if it is at the coords specified, to a_Client */
|
||||
void SendBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cClientHandle & a_Client);
|
||||
@ -289,7 +289,7 @@ public:
|
||||
/** Sets the sign text. Returns true if sign text changed. */
|
||||
bool SetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4);
|
||||
|
||||
/** Marks the chunk as being regenerated - all its clients want that chunk again (used by cWorld::RegenerateChunk() ) */
|
||||
/** Marks the chunk as being regenerated - all its clients want that chunk again (used by cWorld::RegenerateChunk()) */
|
||||
void MarkChunkRegenerating(int a_ChunkX, int a_ChunkZ);
|
||||
|
||||
bool IsChunkLighted(int a_ChunkX, int a_ChunkZ);
|
||||
@ -368,7 +368,7 @@ private:
|
||||
~cChunkLayer();
|
||||
|
||||
/** Always returns an assigned chunkptr, but the chunk needn't be valid (loaded / generated) - callers must check */
|
||||
cChunkPtr GetChunk( int a_ChunkX, int a_ChunkY, int a_ChunkZ );
|
||||
cChunkPtr GetChunk( int a_ChunkX, int a_ChunkY, int a_ChunkZ);
|
||||
|
||||
/** Returns the specified chunk, or NULL if not created yet */
|
||||
cChunk * FindChunk(int a_ChunkX, int a_ChunkZ);
|
||||
|
@ -6,7 +6,7 @@
|
||||
/*
|
||||
The whole thing is a thread that runs in a loop, waiting for either:
|
||||
"finished chunks" (ChunkReady()), or
|
||||
"chunks to send" (QueueSendChunkTo() )
|
||||
"chunks to send" (QueueSendChunkTo())
|
||||
to come to a queue.
|
||||
And once they do, it requests the chunk data and sends it all away, either
|
||||
broadcasting (ChunkReady), or
|
||||
|
@ -211,11 +211,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -534,9 +534,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);
|
||||
@ -1071,7 +1071,7 @@ void cClientHandle::HandleBlockDigFinished(int a_BlockX, int a_BlockY, int a_Blo
|
||||
ItemHandler->OnBlockDestroyed(World, m_Player, m_Player->GetEquippedItem(), a_BlockX, a_BlockY, a_BlockZ);
|
||||
// The ItemHandler is also responsible for spawning the pickups
|
||||
cChunkInterface ChunkInterface(World->GetChunkMap());
|
||||
BlockHandler(a_OldBlock)->OnDestroyedByPlayer(ChunkInterface,*World, m_Player, a_BlockX, a_BlockY, a_BlockZ);
|
||||
BlockHandler(a_OldBlock)->OnDestroyedByPlayer(ChunkInterface, *World, m_Player, a_BlockX, a_BlockY, a_BlockZ);
|
||||
World->BroadcastSoundParticleEffect(2001, a_BlockX, a_BlockY, a_BlockZ, a_OldBlock, this);
|
||||
World->DigBlock(a_BlockX, a_BlockY, a_BlockZ);
|
||||
|
||||
@ -1171,7 +1171,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
|
||||
);
|
||||
@ -1362,7 +1362,7 @@ void cClientHandle::HandlePlaceBlock(int a_BlockX, int a_BlockY, int a_BlockZ, e
|
||||
m_Player->GetInventory().RemoveOneEquippedItem();
|
||||
}
|
||||
cChunkInterface ChunkInterface(World->GetChunkMap());
|
||||
NewBlock->OnPlacedByPlayer(ChunkInterface,*World, m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, BlockType, BlockMeta);
|
||||
NewBlock->OnPlacedByPlayer(ChunkInterface, *World, m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, BlockType, BlockMeta);
|
||||
|
||||
// Step sound with 0.8f pitch is used as block placement sound
|
||||
World->BroadcastSoundEffect(NewBlock->GetStepSound(), (double)a_BlockX, (double)a_BlockY, (double)a_BlockZ, 1.0f, 0.8f);
|
||||
@ -2562,7 +2562,7 @@ void cClientHandle::SendUpdateSign(
|
||||
|
||||
|
||||
|
||||
void cClientHandle::SendUseBed(const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ )
|
||||
void cClientHandle::SendUseBed(const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
{
|
||||
m_Protocol->SendUseBed(a_Entity, a_BlockX, a_BlockY, a_BlockZ);
|
||||
}
|
||||
@ -2624,7 +2624,7 @@ const AString & cClientHandle::GetUsername(void) const
|
||||
|
||||
|
||||
|
||||
void cClientHandle::SetUsername( const AString & a_Username )
|
||||
void cClientHandle::SetUsername( const AString & a_Username)
|
||||
{
|
||||
m_Username = a_Username;
|
||||
}
|
||||
|
@ -181,7 +181,7 @@ public:
|
||||
void SendUnloadChunk (int a_ChunkX, int a_ChunkZ);
|
||||
void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity);
|
||||
void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4);
|
||||
void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ );
|
||||
void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
void SendWeather (eWeather a_Weather);
|
||||
void SendWholeInventory (const cWindow & a_Window);
|
||||
void SendWindowClose (const cWindow & a_Window);
|
||||
@ -190,7 +190,7 @@ public:
|
||||
|
||||
// tolua_begin
|
||||
const AString & GetUsername(void) const;
|
||||
void SetUsername( const AString & a_Username );
|
||||
void SetUsername( const AString & a_Username);
|
||||
|
||||
inline short GetPing(void) const { return m_Ping; }
|
||||
|
||||
@ -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. */
|
||||
|
@ -582,7 +582,7 @@ cCraftingRecipes::cRecipe * cCraftingRecipes::FindRecipe(const cItem * a_Craftin
|
||||
// Get the real bounds of the crafting grid:
|
||||
int GridLeft = MAX_GRID_WIDTH, GridTop = MAX_GRID_HEIGHT;
|
||||
int GridRight = 0, GridBottom = 0;
|
||||
for (int y = 0; y < a_GridHeight; y++ ) for(int x = 0; x < a_GridWidth; x++)
|
||||
for (int y = 0; y < a_GridHeight; y++) for (int x = 0; x < a_GridWidth; x++)
|
||||
{
|
||||
if (!a_CraftingGrid[x + y * a_GridWidth].IsEmpty())
|
||||
{
|
||||
|
@ -127,7 +127,7 @@ protected:
|
||||
typedef std::vector<cRecipeSlot> cRecipeSlots;
|
||||
|
||||
/** A single recipe, stored. Each recipe is normalized right after parsing (NormalizeIngredients())
|
||||
A normalized recipe starts at (0,0)
|
||||
A normalized recipe starts at (0, 0)
|
||||
*/
|
||||
struct cRecipe
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -15,10 +15,12 @@ public:
|
||||
Vector3i p1, p2;
|
||||
|
||||
cCuboid(void) {}
|
||||
cCuboid(const cCuboid & a_Cuboid ) : p1(a_Cuboid.p1), p2(a_Cuboid.p2) {}
|
||||
cCuboid(const cCuboid & a_Cuboid) : p1(a_Cuboid.p1), p2(a_Cuboid.p2) {}
|
||||
cCuboid(const Vector3i & a_p1, const Vector3i & a_p2) : p1(a_p1), p2(a_p2) {}
|
||||
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);
|
||||
@ -56,7 +58,7 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
bool IsInside( const Vector3d & v ) const
|
||||
bool IsInside( const Vector3d & v) const
|
||||
{
|
||||
return (
|
||||
(v.x >= p1.x) && (v.x <= p2.x) &&
|
||||
|
@ -470,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);
|
||||
}
|
||||
|
||||
|
||||
@ -490,9 +479,9 @@ inline void AddFaceDirection(int & a_BlockX, unsigned char & a_BlockY, int & a_B
|
||||
|
||||
inline void EulerToVector(double a_Pan, double a_Pitch, double & a_X, double & a_Y, double & a_Z)
|
||||
{
|
||||
// a_X = sinf ( a_Pan / 180 * PI ) * cosf ( a_Pitch / 180 * PI );
|
||||
// a_Y = -sinf ( a_Pitch / 180 * PI );
|
||||
// a_Z = -cosf ( a_Pan / 180 * PI ) * cosf ( a_Pitch / 180 * PI );
|
||||
// a_X = sinf ( a_Pan / 180 * PI) * cosf ( a_Pitch / 180 * PI);
|
||||
// a_Y = -sinf ( a_Pitch / 180 * PI);
|
||||
// a_Z = -cosf ( a_Pan / 180 * PI) * cosf ( a_Pitch / 180 * PI);
|
||||
a_X = cos(a_Pan / 180 * PI) * cos(a_Pitch / 180 * PI);
|
||||
a_Y = sin(a_Pan / 180 * PI) * cos(a_Pitch / 180 * PI);
|
||||
a_Z = sin(a_Pitch / 180 * PI);
|
||||
@ -530,7 +519,7 @@ inline float GetSignf(float a_Val)
|
||||
|
||||
|
||||
|
||||
inline float GetSpecialSignf( float a_Val )
|
||||
inline float GetSpecialSignf( float a_Val)
|
||||
{
|
||||
return (a_Val <= 0.f) ? -1.f : 1.f;
|
||||
}
|
||||
@ -651,11 +640,11 @@ namespace ItemCategory
|
||||
|
||||
inline bool IsTool(short a_ItemID)
|
||||
{
|
||||
return IsPickaxe( a_ItemID )
|
||||
|| IsAxe ( a_ItemID )
|
||||
|| IsSword ( a_ItemID )
|
||||
|| IsHoe ( a_ItemID )
|
||||
|| IsShovel ( a_ItemID );
|
||||
return IsPickaxe( a_ItemID)
|
||||
|| IsAxe ( a_ItemID)
|
||||
|| IsSword ( a_ItemID)
|
||||
|| IsHoe ( a_ItemID)
|
||||
|| IsShovel ( a_ItemID);
|
||||
}
|
||||
|
||||
|
||||
@ -728,7 +717,7 @@ namespace ItemCategory
|
||||
|
||||
inline bool BlockRequiresSpecialTool(BLOCKTYPE a_BlockType)
|
||||
{
|
||||
if(!IsValidBlock(a_BlockType)) return false;
|
||||
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
|
||||
|
@ -11,8 +11,8 @@
|
||||
inline UInt64 HostToNetwork8(const void * a_Value)
|
||||
{
|
||||
unsigned long long __HostToNetwork8;
|
||||
memcpy( &__HostToNetwork8, a_Value, sizeof( __HostToNetwork8 ) );
|
||||
__HostToNetwork8 = (( ( (unsigned long long)htonl((u_long)__HostToNetwork8) ) << 32) + htonl(__HostToNetwork8 >> 32));
|
||||
memcpy( &__HostToNetwork8, a_Value, sizeof( __HostToNetwork8));
|
||||
__HostToNetwork8 = (( ( (unsigned long long)htonl((u_long)__HostToNetwork8)) << 32) + htonl(__HostToNetwork8 >> 32));
|
||||
return __HostToNetwork8;
|
||||
}
|
||||
|
||||
@ -20,11 +20,11 @@ inline UInt64 HostToNetwork8(const void * a_Value)
|
||||
|
||||
|
||||
|
||||
inline UInt32 HostToNetwork4(const void* a_Value )
|
||||
inline UInt32 HostToNetwork4(const void* a_Value)
|
||||
{
|
||||
unsigned int __HostToNetwork4;
|
||||
memcpy( &__HostToNetwork4, a_Value, sizeof( __HostToNetwork4 ) );
|
||||
__HostToNetwork4 = ntohl( __HostToNetwork4 );
|
||||
memcpy( &__HostToNetwork4, a_Value, sizeof( __HostToNetwork4));
|
||||
__HostToNetwork4 = ntohl( __HostToNetwork4);
|
||||
return __HostToNetwork4;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
||||
target_link_libraries(Entities WorldStorage)
|
||||
if(NOT MSVC)
|
||||
add_library(Entities ${SRCS} ${HDRS})
|
||||
|
||||
target_link_libraries(Entities WorldStorage)
|
||||
endif()
|
||||
|
@ -50,6 +50,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)
|
||||
@ -328,10 +329,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
|
||||
{
|
||||
@ -563,6 +561,8 @@ void cEntity::SetHealth(int a_Health)
|
||||
|
||||
void cEntity::Tick(float a_Dt, cChunk & a_Chunk)
|
||||
{
|
||||
m_TicksAlive++;
|
||||
|
||||
if (m_InvulnerableTicks > 0)
|
||||
{
|
||||
m_InvulnerableTicks--;
|
||||
@ -650,7 +650,7 @@ void cEntity::HandlePhysics(float a_Dt, cChunk & a_Chunk)
|
||||
|
||||
int RelBlockX = BlockX - (NextChunk->GetPosX() * cChunkDef::Width);
|
||||
int RelBlockZ = BlockZ - (NextChunk->GetPosZ() * cChunkDef::Width);
|
||||
BLOCKTYPE BlockIn = NextChunk->GetBlock( RelBlockX, BlockY, RelBlockZ );
|
||||
BLOCKTYPE BlockIn = NextChunk->GetBlock( RelBlockX, BlockY, RelBlockZ);
|
||||
BLOCKTYPE BlockBelow = (BlockY > 0) ? NextChunk->GetBlock(RelBlockX, BlockY - 1, RelBlockZ) : E_BLOCK_AIR;
|
||||
if (!cBlockInfo::IsSolid(BlockIn)) // Making sure we are not inside a solid block
|
||||
{
|
||||
@ -760,7 +760,7 @@ void cEntity::HandlePhysics(float a_Dt, cChunk & a_Chunk)
|
||||
|
||||
m_WaterSpeed *= 0.9f; // Reduce speed each tick
|
||||
|
||||
switch(WaterDir)
|
||||
switch (WaterDir)
|
||||
{
|
||||
case X_PLUS:
|
||||
m_WaterSpeed.x = 0.2f;
|
||||
@ -1324,10 +1324,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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -431,6 +431,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; }
|
||||
|
||||
@ -556,6 +559,9 @@ protected:
|
||||
/** Portal delay timer and cooldown boolean data */
|
||||
sPortalCooldownData m_PortalCooldownData;
|
||||
|
||||
/** The number of ticks this entity has been alive for */
|
||||
long int m_TicksAlive;
|
||||
|
||||
private:
|
||||
/** Measured in degrees, [-180, +180) */
|
||||
double m_HeadYaw;
|
||||
|
@ -62,9 +62,9 @@ void cExpOrb::Tick(float a_Dt, cChunk & a_Chunk)
|
||||
}
|
||||
a_Distance.Normalize();
|
||||
a_Distance *= ((float) (5.5 - Distance));
|
||||
SetSpeedX( a_Distance.x );
|
||||
SetSpeedY( a_Distance.y );
|
||||
SetSpeedZ( a_Distance.z );
|
||||
SetSpeedX( a_Distance.x);
|
||||
SetSpeedY( a_Distance.y);
|
||||
SetSpeedZ( a_Distance.z);
|
||||
BroadcastMovementUpdate();
|
||||
}
|
||||
HandlePhysics(a_Dt, a_Chunk);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -23,13 +23,14 @@ class cMinecart :
|
||||
public:
|
||||
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)
|
||||
} ;
|
||||
|
||||
|
@ -165,11 +165,11 @@ void cPlayer::SpawnOn(cClientHandle & a_Client)
|
||||
}
|
||||
a_Client.SendPlayerSpawn(*this);
|
||||
a_Client.SendEntityHeadLook(*this);
|
||||
a_Client.SendEntityEquipment(*this, 0, m_Inventory.GetEquippedItem() );
|
||||
a_Client.SendEntityEquipment(*this, 1, m_Inventory.GetEquippedBoots() );
|
||||
a_Client.SendEntityEquipment(*this, 2, m_Inventory.GetEquippedLeggings() );
|
||||
a_Client.SendEntityEquipment(*this, 3, m_Inventory.GetEquippedChestplate() );
|
||||
a_Client.SendEntityEquipment(*this, 4, m_Inventory.GetEquippedHelmet() );
|
||||
a_Client.SendEntityEquipment(*this, 0, m_Inventory.GetEquippedItem());
|
||||
a_Client.SendEntityEquipment(*this, 1, m_Inventory.GetEquippedBoots());
|
||||
a_Client.SendEntityEquipment(*this, 2, m_Inventory.GetEquippedLeggings());
|
||||
a_Client.SendEntityEquipment(*this, 3, m_Inventory.GetEquippedChestplate());
|
||||
a_Client.SendEntityEquipment(*this, 4, m_Inventory.GetEquippedHelmet());
|
||||
}
|
||||
|
||||
|
||||
@ -278,19 +278,19 @@ void cPlayer::Tick(float a_Dt, cChunk & a_Chunk)
|
||||
short cPlayer::CalcLevelFromXp(short a_XpTotal)
|
||||
{
|
||||
// level 0 to 15
|
||||
if(a_XpTotal <= XP_TO_LEVEL15)
|
||||
if (a_XpTotal <= XP_TO_LEVEL15)
|
||||
{
|
||||
return a_XpTotal / XP_PER_LEVEL_TO15;
|
||||
}
|
||||
|
||||
// level 30+
|
||||
if(a_XpTotal > XP_TO_LEVEL30)
|
||||
if (a_XpTotal > XP_TO_LEVEL30)
|
||||
{
|
||||
return (short) (151.5 + sqrt( 22952.25 - (14 * (2220 - a_XpTotal)))) / 7;
|
||||
}
|
||||
|
||||
// level 16 to 30
|
||||
return (short) ( 29.5 + sqrt( 870.25 - (6 * ( 360 - a_XpTotal )))) / 3;
|
||||
return (short) ( 29.5 + sqrt( 870.25 - (6 * ( 360 - a_XpTotal)))) / 3;
|
||||
}
|
||||
|
||||
|
||||
@ -300,19 +300,19 @@ short cPlayer::CalcLevelFromXp(short a_XpTotal)
|
||||
short cPlayer::XpForLevel(short a_Level)
|
||||
{
|
||||
// level 0 to 15
|
||||
if(a_Level <= 15)
|
||||
if (a_Level <= 15)
|
||||
{
|
||||
return a_Level * XP_PER_LEVEL_TO15;
|
||||
}
|
||||
|
||||
// level 30+
|
||||
if(a_Level >= 31)
|
||||
if (a_Level >= 31)
|
||||
{
|
||||
return (short) ( (3.5 * a_Level * a_Level) - (151.5 * a_Level) + 2220 );
|
||||
return (short) ( (3.5 * a_Level * a_Level) - (151.5 * a_Level) + 2220);
|
||||
}
|
||||
|
||||
// level 16 to 30
|
||||
return (short) ( (1.5 * a_Level * a_Level) - (29.5 * a_Level) + 360 );
|
||||
return (short) ( (1.5 * a_Level * a_Level) - (29.5 * a_Level) + 360);
|
||||
}
|
||||
|
||||
|
||||
@ -343,7 +343,7 @@ float cPlayer::GetXpPercentage()
|
||||
|
||||
bool cPlayer::SetCurrentExperience(short int a_CurrentXp)
|
||||
{
|
||||
if(!(a_CurrentXp >= 0) || (a_CurrentXp > (SHRT_MAX - m_LifetimeTotalXp)))
|
||||
if (!(a_CurrentXp >= 0) || (a_CurrentXp > (SHRT_MAX - m_LifetimeTotalXp)))
|
||||
{
|
||||
LOGWARNING("Tried to update experiece with an invalid Xp value: %d", a_CurrentXp);
|
||||
return false; // oops, they gave us a dodgey number
|
||||
@ -374,10 +374,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)
|
||||
@ -617,7 +614,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);
|
||||
}
|
||||
@ -1001,7 +999,7 @@ double cPlayer::GetEyeHeight(void) const
|
||||
|
||||
Vector3d cPlayer::GetEyePosition(void) const
|
||||
{
|
||||
return Vector3d( GetPosX(), m_Stance, GetPosZ() );
|
||||
return Vector3d( GetPosX(), m_Stance, GetPosZ());
|
||||
}
|
||||
|
||||
|
||||
@ -1163,7 +1161,7 @@ void cPlayer::SetGameMode(eGameMode a_GameMode)
|
||||
|
||||
|
||||
|
||||
void cPlayer::LoginSetGameMode( eGameMode a_GameMode )
|
||||
void cPlayer::LoginSetGameMode( eGameMode a_GameMode)
|
||||
{
|
||||
m_GameMode = a_GameMode;
|
||||
}
|
||||
@ -1299,7 +1297,7 @@ void cPlayer::DoSetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ)
|
||||
|
||||
|
||||
|
||||
void cPlayer::MoveTo( const Vector3d & a_NewPos )
|
||||
void cPlayer::MoveTo( const Vector3d & a_NewPos)
|
||||
{
|
||||
if ((a_NewPos.y < -990) && (GetPosY() > -100))
|
||||
{
|
||||
@ -1322,7 +1320,7 @@ void cPlayer::MoveTo( const Vector3d & a_NewPos )
|
||||
Vector3d DeltaPos = a_NewPos - GetPosition();
|
||||
UpdateMovementStats(DeltaPos);
|
||||
|
||||
SetPosition( a_NewPos );
|
||||
SetPosition( a_NewPos);
|
||||
SetStance(a_NewPos.y + 1.62);
|
||||
}
|
||||
|
||||
@ -1348,11 +1346,11 @@ void cPlayer::SetVisible(bool a_bVisible)
|
||||
|
||||
|
||||
|
||||
void cPlayer::AddToGroup( const AString & a_GroupName )
|
||||
void cPlayer::AddToGroup( const AString & a_GroupName)
|
||||
{
|
||||
cGroup* Group = cRoot::Get()->GetGroupManager()->GetGroup( a_GroupName );
|
||||
m_Groups.push_back( Group );
|
||||
LOGD("Added %s to group %s", GetName().c_str(), a_GroupName.c_str() );
|
||||
cGroup* Group = cRoot::Get()->GetGroupManager()->GetGroup( a_GroupName);
|
||||
m_Groups.push_back( Group);
|
||||
LOGD("Added %s to group %s", GetName().c_str(), a_GroupName.c_str());
|
||||
ResolveGroups();
|
||||
ResolvePermissions();
|
||||
}
|
||||
@ -1361,28 +1359,28 @@ void cPlayer::AddToGroup( const AString & a_GroupName )
|
||||
|
||||
|
||||
|
||||
void cPlayer::RemoveFromGroup( const AString & a_GroupName )
|
||||
void cPlayer::RemoveFromGroup( const AString & a_GroupName)
|
||||
{
|
||||
bool bRemoved = false;
|
||||
for( GroupList::iterator itr = m_Groups.begin(); itr != m_Groups.end(); ++itr )
|
||||
for (GroupList::iterator itr = m_Groups.begin(); itr != m_Groups.end(); ++itr)
|
||||
{
|
||||
if( (*itr)->GetName().compare(a_GroupName ) == 0 )
|
||||
if ((*itr)->GetName().compare(a_GroupName) == 0)
|
||||
{
|
||||
m_Groups.erase( itr );
|
||||
m_Groups.erase( itr);
|
||||
bRemoved = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( bRemoved )
|
||||
if (bRemoved)
|
||||
{
|
||||
LOGD("Removed %s from group %s", GetName().c_str(), a_GroupName.c_str() );
|
||||
LOGD("Removed %s from group %s", GetName().c_str(), a_GroupName.c_str());
|
||||
ResolveGroups();
|
||||
ResolvePermissions();
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGWARN("Tried to remove %s from group %s but was not in that group", GetName().c_str(), a_GroupName.c_str() );
|
||||
LOGWARN("Tried to remove %s from group %s but was not in that group", GetName().c_str(), a_GroupName.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
@ -1398,30 +1396,30 @@ bool cPlayer::HasPermission(const AString & a_Permission)
|
||||
return true;
|
||||
}
|
||||
|
||||
AStringVector Split = StringSplit( a_Permission, "." );
|
||||
AStringVector Split = StringSplit( a_Permission, ".");
|
||||
PermissionMap Possibilities = m_ResolvedPermissions;
|
||||
// Now search the namespaces
|
||||
while( Possibilities.begin() != Possibilities.end() )
|
||||
while (Possibilities.begin() != Possibilities.end())
|
||||
{
|
||||
PermissionMap::iterator itr = Possibilities.begin();
|
||||
if( itr->second )
|
||||
if (itr->second)
|
||||
{
|
||||
AStringVector OtherSplit = StringSplit( itr->first, "." );
|
||||
if( OtherSplit.size() <= Split.size() )
|
||||
AStringVector OtherSplit = StringSplit( itr->first, ".");
|
||||
if (OtherSplit.size() <= Split.size())
|
||||
{
|
||||
unsigned int i;
|
||||
for( i = 0; i < OtherSplit.size(); ++i )
|
||||
for (i = 0; i < OtherSplit.size(); ++i)
|
||||
{
|
||||
if( OtherSplit[i].compare( Split[i] ) != 0 )
|
||||
if (OtherSplit[i].compare( Split[i]) != 0)
|
||||
{
|
||||
if( OtherSplit[i].compare("*") == 0 ) return true; // WildCard man!! WildCard!
|
||||
if (OtherSplit[i].compare("*") == 0) return true; // WildCard man!! WildCard!
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( i == Split.size() ) return true;
|
||||
if (i == Split.size()) return true;
|
||||
}
|
||||
}
|
||||
Possibilities.erase( itr );
|
||||
Possibilities.erase( itr);
|
||||
}
|
||||
|
||||
// Nothing that matched :(
|
||||
@ -1432,11 +1430,11 @@ bool cPlayer::HasPermission(const AString & a_Permission)
|
||||
|
||||
|
||||
|
||||
bool cPlayer::IsInGroup( const AString & a_Group )
|
||||
bool cPlayer::IsInGroup( const AString & a_Group)
|
||||
{
|
||||
for( GroupList::iterator itr = m_ResolvedGroups.begin(); itr != m_ResolvedGroups.end(); ++itr )
|
||||
for (GroupList::iterator itr = m_ResolvedGroups.begin(); itr != m_ResolvedGroups.end(); ++itr)
|
||||
{
|
||||
if( a_Group.compare( (*itr)->GetName().c_str() ) == 0 )
|
||||
if (a_Group.compare( (*itr)->GetName().c_str()) == 0)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -1451,15 +1449,15 @@ void cPlayer::ResolvePermissions()
|
||||
m_ResolvedPermissions.clear(); // Start with an empty map
|
||||
|
||||
// Copy all player specific permissions into the resolved permissions map
|
||||
for( PermissionMap::iterator itr = m_Permissions.begin(); itr != m_Permissions.end(); ++itr )
|
||||
for (PermissionMap::iterator itr = m_Permissions.begin(); itr != m_Permissions.end(); ++itr)
|
||||
{
|
||||
m_ResolvedPermissions[ itr->first ] = itr->second;
|
||||
}
|
||||
|
||||
for( GroupList::iterator GroupItr = m_ResolvedGroups.begin(); GroupItr != m_ResolvedGroups.end(); ++GroupItr )
|
||||
for (GroupList::iterator GroupItr = m_ResolvedGroups.begin(); GroupItr != m_ResolvedGroups.end(); ++GroupItr)
|
||||
{
|
||||
const cGroup::PermissionMap & Permissions = (*GroupItr)->GetPermissions();
|
||||
for( cGroup::PermissionMap::const_iterator itr = Permissions.begin(); itr != Permissions.end(); ++itr )
|
||||
for (cGroup::PermissionMap::const_iterator itr = Permissions.begin(); itr != Permissions.end(); ++itr)
|
||||
{
|
||||
m_ResolvedPermissions[ itr->first ] = itr->second;
|
||||
}
|
||||
@ -1478,14 +1476,14 @@ void cPlayer::ResolveGroups()
|
||||
// Get a complete resolved list of all groups the player is in
|
||||
std::map< cGroup*, bool > AllGroups; // Use a map, because it's faster than iterating through a list to find duplicates
|
||||
GroupList ToIterate;
|
||||
for( GroupList::iterator GroupItr = m_Groups.begin(); GroupItr != m_Groups.end(); ++GroupItr )
|
||||
for (GroupList::iterator GroupItr = m_Groups.begin(); GroupItr != m_Groups.end(); ++GroupItr)
|
||||
{
|
||||
ToIterate.push_back( *GroupItr );
|
||||
ToIterate.push_back( *GroupItr);
|
||||
}
|
||||
while( ToIterate.begin() != ToIterate.end() )
|
||||
while (ToIterate.begin() != ToIterate.end())
|
||||
{
|
||||
cGroup* CurrentGroup = *ToIterate.begin();
|
||||
if( AllGroups.find( CurrentGroup ) != AllGroups.end() )
|
||||
if (AllGroups.find( CurrentGroup) != AllGroups.end())
|
||||
{
|
||||
LOGWARNING("ERROR: Player \"%s\" is in the group multiple times (\"%s\"). Please fix your settings in users.ini!",
|
||||
GetName().c_str(), CurrentGroup->GetName().c_str()
|
||||
@ -1494,19 +1492,19 @@ void cPlayer::ResolveGroups()
|
||||
else
|
||||
{
|
||||
AllGroups[ CurrentGroup ] = true;
|
||||
m_ResolvedGroups.push_back( CurrentGroup ); // Add group to resolved list
|
||||
m_ResolvedGroups.push_back( CurrentGroup); // Add group to resolved list
|
||||
const cGroup::GroupList & Inherits = CurrentGroup->GetInherits();
|
||||
for( cGroup::GroupList::const_iterator itr = Inherits.begin(); itr != Inherits.end(); ++itr )
|
||||
for (cGroup::GroupList::const_iterator itr = Inherits.begin(); itr != Inherits.end(); ++itr)
|
||||
{
|
||||
if( AllGroups.find( *itr ) != AllGroups.end() )
|
||||
if (AllGroups.find( *itr) != AllGroups.end())
|
||||
{
|
||||
LOGERROR("ERROR: Player %s is in the same group multiple times due to inheritance (%s). FIX IT!", GetName().c_str(), (*itr)->GetName().c_str() );
|
||||
LOGERROR("ERROR: Player %s is in the same group multiple times due to inheritance (%s). FIX IT!", GetName().c_str(), (*itr)->GetName().c_str());
|
||||
continue;
|
||||
}
|
||||
ToIterate.push_back( *itr );
|
||||
ToIterate.push_back( *itr);
|
||||
}
|
||||
}
|
||||
ToIterate.erase( ToIterate.begin() );
|
||||
ToIterate.erase( ToIterate.begin());
|
||||
}
|
||||
}
|
||||
|
||||
@ -1516,12 +1514,12 @@ void cPlayer::ResolveGroups()
|
||||
|
||||
AString cPlayer::GetColor(void) const
|
||||
{
|
||||
if ( m_Color != '-' )
|
||||
if (m_Color != '-')
|
||||
{
|
||||
return cChatColor::Color + m_Color;
|
||||
return cChatColor::Delimiter + m_Color;
|
||||
}
|
||||
|
||||
if ( m_Groups.size() < 1 )
|
||||
if (m_Groups.size() < 1)
|
||||
{
|
||||
return cChatColor::White;
|
||||
}
|
||||
@ -1918,11 +1916,11 @@ cPlayer::StringList cPlayer::GetResolvedPermissions()
|
||||
StringList Permissions;
|
||||
|
||||
const PermissionMap& ResolvedPermissions = m_ResolvedPermissions;
|
||||
for( PermissionMap::const_iterator itr = ResolvedPermissions.begin(); itr != ResolvedPermissions.end(); ++itr )
|
||||
for (PermissionMap::const_iterator itr = ResolvedPermissions.begin(); itr != ResolvedPermissions.end(); ++itr)
|
||||
{
|
||||
if (itr->second)
|
||||
{
|
||||
Permissions.push_back( itr->first );
|
||||
Permissions.push_back( itr->first);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -117,8 +117,8 @@ public:
|
||||
/** Returns true if the player is currently charging the bow */
|
||||
bool IsChargingBow(void) const { return m_IsChargingBow; }
|
||||
|
||||
void SetTouchGround( bool a_bTouchGround );
|
||||
inline void SetStance( const double a_Stance ) { m_Stance = a_Stance; }
|
||||
void SetTouchGround( bool a_bTouchGround);
|
||||
inline void SetStance( const double a_Stance) { m_Stance = a_Stance; }
|
||||
double GetEyeHeight(void) const; // tolua_export
|
||||
Vector3d GetEyePosition(void) const; // tolua_export
|
||||
inline bool IsOnGround(void) const {return m_bTouchGround; } // tolua_export
|
||||
@ -239,15 +239,15 @@ public:
|
||||
typedef std::list< std::string > StringList;
|
||||
|
||||
/** Adds a player to existing group or creates a new group when it doesn't exist */
|
||||
void AddToGroup( const AString & a_GroupName ); // tolua_export
|
||||
void AddToGroup( const AString & a_GroupName); // tolua_export
|
||||
|
||||
/** Removes a player from the group, resolves permissions and group inheritance (case sensitive) */
|
||||
void RemoveFromGroup( const AString & a_GroupName ); // tolua_export
|
||||
void RemoveFromGroup( const AString & a_GroupName); // tolua_export
|
||||
|
||||
bool HasPermission( const AString & a_Permission ); // tolua_export
|
||||
bool HasPermission( const AString & a_Permission); // tolua_export
|
||||
const GroupList & GetGroups() { return m_Groups; } // >> EXPORTED IN MANUALBINDINGS <<
|
||||
StringList GetResolvedPermissions(); // >> EXPORTED IN MANUALBINDINGS <<
|
||||
bool IsInGroup( const AString & a_Group ); // tolua_export
|
||||
bool IsInGroup( const AString & a_Group); // tolua_export
|
||||
|
||||
// tolua_begin
|
||||
|
||||
@ -328,7 +328,7 @@ public:
|
||||
|
||||
void Respawn(void); // tolua_export
|
||||
|
||||
void SetVisible( bool a_bVisible ); // tolua_export
|
||||
void SetVisible( bool a_bVisible); // tolua_export
|
||||
bool IsVisible(void) const { return m_bVisible; } // tolua_export
|
||||
|
||||
/** Moves the player to the specified world.
|
||||
|
@ -146,9 +146,11 @@ 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
|
||||
return false;
|
||||
// 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());
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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; }
|
||||
cEntityEffect::eType GetEntityEffectType(void) const { return m_EntityEffectType; }
|
||||
cEntityEffect GetEntityEffect(void) const { return m_EntityEffect; }
|
||||
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
|
||||
|
@ -42,7 +42,7 @@ void cTNTEntity::Explode(void)
|
||||
{
|
||||
m_FuseTicks = 0;
|
||||
Destroy(true);
|
||||
LOGD("BOOM at {%f,%f,%f}", GetPosX(), GetPosY(), GetPosZ());
|
||||
LOGD("BOOM at {%f, %f, %f}", GetPosX(), GetPosY(), GetPosZ());
|
||||
m_World->DoExplosionAt(4.0, GetPosX() + 0.49, GetPosY() + 0.49, GetPosZ() + 0.49, true, esPrimedTNT, this);
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,7 @@ struct cFurnaceRecipe::sFurnaceRecipeState
|
||||
|
||||
|
||||
cFurnaceRecipe::cFurnaceRecipe()
|
||||
: m_pState( new sFurnaceRecipeState )
|
||||
: m_pState( new sFurnaceRecipeState)
|
||||
{
|
||||
ReloadRecipes();
|
||||
}
|
||||
|
@ -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)
|
||||
|
||||
target_link_libraries(Generating OSSupport iniFile Blocks)
|
||||
if(NOT MSVC)
|
||||
add_library(Generating ${SRCS} ${HDRS})
|
||||
|
||||
target_link_libraries(Generating OSSupport iniFile Blocks)
|
||||
endif()
|
||||
|
@ -559,7 +559,7 @@ AString cCaveTunnel::ExportAsSVG(int a_Color, int a_OffsetX, int a_OffsetZ) cons
|
||||
char Prefix = 'M'; // The first point needs "M" prefix, all the others need "L"
|
||||
for (cCaveDefPoints::const_iterator itr = m_Points.begin(); itr != m_Points.end(); ++itr)
|
||||
{
|
||||
AppendPrintf(SVG, "%c %d,%d ", Prefix, a_OffsetX + itr->m_BlockX, a_OffsetZ + itr->m_BlockZ);
|
||||
AppendPrintf(SVG, "%c %d, %d ", Prefix, a_OffsetX + itr->m_BlockX, a_OffsetZ + itr->m_BlockZ);
|
||||
Prefix = 'L';
|
||||
}
|
||||
SVG.append("\"/>\n");
|
||||
@ -703,10 +703,10 @@ cGridStructGen::cStructurePtr cStructGenWormNestCaves::CreateStructure(int a_Gri
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// cStructGenMarbleCaves:
|
||||
|
||||
static float GetMarbleNoise( float x, float y, float z, cNoise & a_Noise )
|
||||
static float GetMarbleNoise( float x, float y, float z, cNoise & a_Noise)
|
||||
{
|
||||
static const float PI_2 = 1.57079633f;
|
||||
float oct1 = (a_Noise.CubicNoise3D(x * 0.1f, y * 0.1f, z * 0.1f )) * 4;
|
||||
float oct1 = (a_Noise.CubicNoise3D(x * 0.1f, y * 0.1f, z * 0.1f)) * 4;
|
||||
|
||||
oct1 = oct1 * oct1 * oct1;
|
||||
if (oct1 < 0.f) oct1 = PI_2;
|
||||
@ -730,7 +730,7 @@ void cStructGenMarbleCaves::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||
const float xx = (float)(a_ChunkDesc.GetChunkX() * cChunkDef::Width + x);
|
||||
|
||||
int Top = a_ChunkDesc.GetHeight(x, z);
|
||||
for (int y = 1; y < Top; ++y )
|
||||
for (int y = 1; y < Top; ++y)
|
||||
{
|
||||
if (a_ChunkDesc.GetBlockType(x, y, z) != E_BLOCK_STONE)
|
||||
{
|
||||
|
@ -180,7 +180,7 @@ BLOCKTYPE cChunkGenerator::GetIniBlock(cIniFile & a_IniFile, const AString & a_S
|
||||
BLOCKTYPE Block = BlockStringToType(BlockType);
|
||||
if (Block < 0)
|
||||
{
|
||||
LOGWARN("[%s].%s Could not parse block value \"%s\". Using default: \"%s\".", a_SectionName.c_str(), a_ValueName.c_str(), BlockType.c_str(),a_Default.c_str());
|
||||
LOGWARN("[%s].%s Could not parse block value \"%s\". Using default: \"%s\".", a_SectionName.c_str(), a_ValueName.c_str(), BlockType.c_str(), a_Default.c_str());
|
||||
return BlockStringToType(a_Default);
|
||||
}
|
||||
return Block;
|
||||
@ -229,7 +229,7 @@ void cChunkGenerator::Execute(void)
|
||||
}
|
||||
|
||||
cChunkCoords coords = m_Queue.front(); // Get next coord from queue
|
||||
m_Queue.erase( m_Queue.begin() ); // Remove coordinate from queue
|
||||
m_Queue.erase( m_Queue.begin()); // Remove coordinate from queue
|
||||
bool SkipEnabled = (m_Queue.size() > QUEUE_SKIP_LIMIT);
|
||||
Lock.Unlock(); // Unlock ASAP
|
||||
m_evtRemoved.Set();
|
||||
|
@ -401,6 +401,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));
|
||||
|
@ -168,6 +168,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:
|
||||
|
||||
@ -248,14 +307,14 @@ void cFinishGenSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||
}
|
||||
|
||||
const float xx = (float)BlockX;
|
||||
float val1 = m_Noise.CubicNoise2D(xx * 0.1f, zz * 0.1f );
|
||||
float val2 = m_Noise.CubicNoise2D(xx * 0.01f, zz * 0.01f );
|
||||
float val1 = m_Noise.CubicNoise2D(xx * 0.1f, zz * 0.1f);
|
||||
float val2 = m_Noise.CubicNoise2D(xx * 0.01f, zz * 0.01f);
|
||||
switch (a_ChunkDesc.GetBlockType(x, Top, z))
|
||||
{
|
||||
case E_BLOCK_GRASS:
|
||||
{
|
||||
float val3 = m_Noise.CubicNoise2D(xx * 0.01f + 10, zz * 0.01f + 10 );
|
||||
float val4 = m_Noise.CubicNoise2D(xx * 0.05f + 20, zz * 0.05f + 20 );
|
||||
float val3 = m_Noise.CubicNoise2D(xx * 0.01f + 10, zz * 0.01f + 10);
|
||||
float val4 = m_Noise.CubicNoise2D(xx * 0.05f + 20, zz * 0.05f + 20);
|
||||
if (val1 + val2 > 0.2f)
|
||||
{
|
||||
a_ChunkDesc.SetBlockType(x, ++Top, z, E_BLOCK_YELLOW_FLOWER);
|
||||
|
@ -69,6 +69,43 @@ 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;
|
||||
}
|
||||
default:
|
||||
{
|
||||
return 20;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class cFinishGenSprinkleFoliage :
|
||||
public cFinishGen
|
||||
{
|
||||
|
@ -253,7 +253,7 @@ float cHeiGenClassic::GetNoise(float x, float y)
|
||||
float oct2 = m_Noise.CubicNoise2D(x * m_HeightFreq2, y * m_HeightFreq2) * m_HeightAmp2;
|
||||
float oct3 = m_Noise.CubicNoise2D(x * m_HeightFreq3, y * m_HeightFreq3) * m_HeightAmp3;
|
||||
|
||||
float height = m_Noise.CubicNoise2D(x * 0.1f, y * 0.1f ) * 2;
|
||||
float height = m_Noise.CubicNoise2D(x * 0.1f, y * 0.1f) * 2;
|
||||
|
||||
float flatness = ((m_Noise.CubicNoise2D(x * 0.5f, y * 0.5f) + 1.f) * 0.5f) * 1.1f; // 0 ... 1.5
|
||||
flatness *= flatness * flatness;
|
||||
|
@ -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)
|
||||
|
||||
target_link_libraries(Generating_Prefabs OSSupport iniFile Blocks)
|
||||
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- */,
|
||||
|
@ -287,34 +287,34 @@ AString cStructGenRavines::cRavine::ExportAsSVG(int a_Color, int a_OffsetX, int
|
||||
char Prefix = 'M'; // The first point needs "M" prefix, all the others need "L"
|
||||
for (cRavDefPoints::const_iterator itr = m_Points.begin(); itr != m_Points.end(); ++itr)
|
||||
{
|
||||
AppendPrintf(SVG, "%c %d,%d ", Prefix, a_OffsetX + itr->m_BlockX, a_OffsetZ + itr->m_BlockZ);
|
||||
AppendPrintf(SVG, "%c %d, %d ", Prefix, a_OffsetX + itr->m_BlockX, a_OffsetZ + itr->m_BlockZ);
|
||||
Prefix = 'L';
|
||||
}
|
||||
SVG.append("\"/>\n");
|
||||
|
||||
// Base point highlight:
|
||||
AppendPrintf(SVG, "<path style=\"fill:none;stroke:#ff0000;stroke-width:1px;\"\nd=\"M %d,%d L %d,%d\"/>\n",
|
||||
AppendPrintf(SVG, "<path style=\"fill:none;stroke:#ff0000;stroke-width:1px;\"\nd=\"M %d, %d L %d, %d\"/>\n",
|
||||
a_OffsetX + m_OriginX - 5, a_OffsetZ + m_OriginZ, a_OffsetX + m_OriginX + 5, a_OffsetZ + m_OriginZ
|
||||
);
|
||||
AppendPrintf(SVG, "<path style=\"fill:none;stroke:#ff0000;stroke-width:1px;\"\nd=\"M %d,%d L %d,%d\"/>\n",
|
||||
AppendPrintf(SVG, "<path style=\"fill:none;stroke:#ff0000;stroke-width:1px;\"\nd=\"M %d, %d L %d, %d\"/>\n",
|
||||
a_OffsetX + m_OriginX, a_OffsetZ + m_OriginZ - 5, a_OffsetX + m_OriginX, a_OffsetZ + m_OriginZ + 5
|
||||
);
|
||||
|
||||
// A gray line from the base point to the first point of the ravine, for identification:
|
||||
AppendPrintf(SVG, "<path style=\"fill:none;stroke:#cfcfcf;stroke-width:1px;\"\nd=\"M %d,%d L %d,%d\"/>\n",
|
||||
AppendPrintf(SVG, "<path style=\"fill:none;stroke:#cfcfcf;stroke-width:1px;\"\nd=\"M %d, %d L %d, %d\"/>\n",
|
||||
a_OffsetX + m_OriginX, a_OffsetZ + m_OriginZ, a_OffsetX + m_Points.front().m_BlockX, a_OffsetZ + m_Points.front().m_BlockZ
|
||||
);
|
||||
|
||||
// Offset guides:
|
||||
if (a_OffsetX > 0)
|
||||
{
|
||||
AppendPrintf(SVG, "<path style=\"fill:none;stroke:#0000ff;stroke-width:1px;\"\nd=\"M %d,0 L %d,1024\"/>\n",
|
||||
AppendPrintf(SVG, "<path style=\"fill:none;stroke:#0000ff;stroke-width:1px;\"\nd=\"M %d, 0 L %d, 1024\"/>\n",
|
||||
a_OffsetX, a_OffsetX
|
||||
);
|
||||
}
|
||||
if (a_OffsetZ > 0)
|
||||
{
|
||||
AppendPrintf(SVG, "<path style=\"fill:none;stroke:#0000ff;stroke-width:1px;\"\nd=\"M 0,%d L 1024,%d\"/>\n",
|
||||
AppendPrintf(SVG, "<path style=\"fill:none;stroke:#0000ff;stroke-width:1px;\"\nd=\"M 0, %d L 1024, %d\"/>\n",
|
||||
a_OffsetZ, a_OffsetZ
|
||||
);
|
||||
}
|
||||
|
@ -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++)
|
||||
|
@ -70,7 +70,7 @@ void GetAcaciaTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noi
|
||||
void GetDarkoakTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||
|
||||
/// Generates an image of a random large birch tree
|
||||
void GetTallBirchTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks,sSetBlockVector & a_OtherBlocks);
|
||||
void GetTallBirchTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||
|
||||
/// Generates an image of a random conifer tree
|
||||
void GetConiferTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||
|
@ -252,7 +252,7 @@ template class SizeChecker<UInt16, 2>;
|
||||
#include "MCLogger.h"
|
||||
#else
|
||||
// Logging functions
|
||||
void inline LOGERROR(const char* a_Format, ...) FORMATSTRING(1,2);
|
||||
void inline LOGERROR(const char* a_Format, ...) FORMATSTRING(1, 2);
|
||||
|
||||
void inline LOGERROR(const char* a_Format, ...)
|
||||
{
|
||||
@ -272,12 +272,12 @@ void inline LOGERROR(const char* a_Format, ...)
|
||||
/// Evaluates to the number of elements in an array (compile-time!)
|
||||
#define ARRAYCOUNT(X) (sizeof(X) / sizeof(*(X)))
|
||||
|
||||
/// Allows arithmetic expressions like "32 KiB" (but consider using parenthesis around it, "(32 KiB)" )
|
||||
/// Allows arithmetic expressions like "32 KiB" (but consider using parenthesis around it, "(32 KiB)")
|
||||
#define KiB * 1024
|
||||
#define MiB * 1024 * 1024
|
||||
|
||||
/// Faster than (int)floorf((float)x / (float)div)
|
||||
#define FAST_FLOOR_DIV( x, div ) (((x) - (((x) < 0) ? ((div) - 1) : 0)) / (div))
|
||||
#define FAST_FLOOR_DIV( x, div) (((x) - (((x) < 0) ? ((div) - 1) : 0)) / (div))
|
||||
|
||||
// Own version of assert() that writes failed assertions to the log for review
|
||||
#ifdef TEST_GLOBALS
|
||||
@ -309,19 +309,19 @@ void inline LOGERROR(const char* a_Format, ...)
|
||||
}
|
||||
#endif
|
||||
#define ASSERT(x) do { if (!(x)) { throw cAssertFailure();} } while (0)
|
||||
#define testassert(x) do { if(!(x)) { REPORT_ERROR("Test failure: %s, file %s, line %d\n", #x, __FILE__, __LINE__); exit(1); } } while (0)
|
||||
#define testassert(x) do { if (!(x)) { REPORT_ERROR("Test failure: %s, file %s, line %d\n", #x, __FILE__, __LINE__); exit(1); } } while (0)
|
||||
#define CheckAsserts(x) do { try {x} catch (cAssertFailure) { break; } REPORT_ERROR("Test failure: assert didn't fire for %s, file %s, line %d\n", #x, __FILE__, __LINE__); exit(1); } while (0)
|
||||
|
||||
#else
|
||||
#ifdef _DEBUG
|
||||
#define ASSERT( x ) ( !!(x) || ( LOGERROR("Assertion failed: %s, file %s, line %i", #x, __FILE__, __LINE__ ), assert(0), 0 ) )
|
||||
#define ASSERT( x) ( !!(x) || ( LOGERROR("Assertion failed: %s, file %s, line %i", #x, __FILE__, __LINE__), assert(0), 0))
|
||||
#else
|
||||
#define ASSERT(x) ((void)(x))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Pretty much the same as ASSERT() but stays in Release builds
|
||||
#define VERIFY( x ) ( !!(x) || ( LOGERROR("Verification failed: %s, file %s, line %i", #x, __FILE__, __LINE__ ), exit(1), 0 ) )
|
||||
#define VERIFY( x) ( !!(x) || ( LOGERROR("Verification failed: %s, file %s, line %i", #x, __FILE__, __LINE__), exit(1), 0))
|
||||
|
||||
// Same as assert but in all Self test builds
|
||||
#ifdef SELF_TEST
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
|
||||
|
||||
void cGroup::AddCommand( const AString & a_Command )
|
||||
void cGroup::AddCommand( const AString & a_Command)
|
||||
{
|
||||
m_Commands[ a_Command ] = true;
|
||||
}
|
||||
@ -16,7 +16,7 @@ void cGroup::AddCommand( const AString & a_Command )
|
||||
|
||||
|
||||
|
||||
void cGroup::AddPermission( const AString & a_Permission )
|
||||
void cGroup::AddPermission( const AString & a_Permission)
|
||||
{
|
||||
m_Permissions[ a_Permission ] = true;
|
||||
}
|
||||
@ -25,10 +25,10 @@ void cGroup::AddPermission( const AString & a_Permission )
|
||||
|
||||
|
||||
|
||||
void cGroup::InheritFrom( cGroup* a_Group )
|
||||
void cGroup::InheritFrom( cGroup* a_Group)
|
||||
{
|
||||
m_Inherits.remove( a_Group );
|
||||
m_Inherits.push_back( a_Group );
|
||||
m_Inherits.remove( a_Group);
|
||||
m_Inherits.push_back( a_Group);
|
||||
}
|
||||
|
||||
|
||||
|
10
src/Group.h
10
src/Group.h
@ -14,12 +14,12 @@ public:
|
||||
~cGroup() {}
|
||||
|
||||
// tolua_begin
|
||||
void SetName( const AString & a_Name ) { m_Name = a_Name; }
|
||||
void SetName( const AString & a_Name) { m_Name = a_Name; }
|
||||
const AString & GetName() const { return m_Name; }
|
||||
void SetColor( const AString & a_Color ) { m_Color = a_Color; }
|
||||
void AddCommand( const AString & a_Command );
|
||||
void AddPermission( const AString & a_Permission );
|
||||
void InheritFrom( cGroup* a_Group );
|
||||
void SetColor( const AString & a_Color) { m_Color = a_Color; }
|
||||
void AddCommand( const AString & a_Command);
|
||||
void AddPermission( const AString & a_Permission);
|
||||
void InheritFrom( cGroup* a_Group);
|
||||
// tolua_end
|
||||
|
||||
typedef std::map< AString, bool > PermissionMap;
|
||||
|
@ -27,7 +27,7 @@ struct cGroupManager::sGroupManagerState
|
||||
|
||||
cGroupManager::~cGroupManager()
|
||||
{
|
||||
for( GroupMap::iterator itr = m_pState->Groups.begin(); itr != m_pState->Groups.end(); ++itr )
|
||||
for (GroupMap::iterator itr = m_pState->Groups.begin(); itr != m_pState->Groups.end(); ++itr)
|
||||
{
|
||||
delete itr->second;
|
||||
itr->second = NULL;
|
||||
@ -43,7 +43,7 @@ cGroupManager::~cGroupManager()
|
||||
|
||||
|
||||
cGroupManager::cGroupManager()
|
||||
: m_pState( new sGroupManagerState )
|
||||
: m_pState( new sGroupManagerState)
|
||||
{
|
||||
LOGD("-- Loading Groups --");
|
||||
|
||||
@ -125,7 +125,7 @@ bool cGroupManager::LoadGroups()
|
||||
IniFile.SetValue("Owner", "Permissions", "*", true);
|
||||
IniFile.SetValue("Owner", "Color", "2", true);
|
||||
|
||||
IniFile.SetValue("Moderator", "Permissions", "core.time,core.item,core.tpa,core.tpaccept,core.ban,core.unban,core.save-all,core.toggledownfall");
|
||||
IniFile.SetValue("Moderator", "Permissions", "core.time, core.item, core.tpa, core.tpaccept, core.ban, core.unban, core.save-all, core.toggledownfall");
|
||||
IniFile.SetValue("Moderator", "Color", "2", true);
|
||||
IniFile.SetValue("Moderator", "Inherits", "Player", true);
|
||||
|
||||
@ -133,7 +133,7 @@ bool cGroupManager::LoadGroups()
|
||||
IniFile.SetValue("Player", "Color", "f", true);
|
||||
IniFile.SetValue("Player", "Inherits", "Default", true);
|
||||
|
||||
IniFile.SetValue("Default", "Permissions", "core.help,core.plugins,core.spawn,core.worlds,core.back,core.motd,core.build,core.locate,core.viewdistance", true);
|
||||
IniFile.SetValue("Default", "Permissions", "core.help, core.plugins, core.spawn, core.worlds, core.back, core.motd, core.build, core.locate, core.viewdistance", true);
|
||||
IniFile.SetValue("Default", "Color", "f", true);
|
||||
|
||||
IniFile.WriteFile("groups.ini");
|
||||
@ -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
|
||||
{
|
||||
@ -198,20 +198,20 @@ bool cGroupManager::LoadGroups()
|
||||
|
||||
|
||||
|
||||
bool cGroupManager::ExistsGroup( const AString & a_Name )
|
||||
bool cGroupManager::ExistsGroup( const AString & a_Name)
|
||||
{
|
||||
GroupMap::iterator itr = m_pState->Groups.find( a_Name );
|
||||
return ( itr != m_pState->Groups.end() );
|
||||
GroupMap::iterator itr = m_pState->Groups.find( a_Name);
|
||||
return ( itr != m_pState->Groups.end());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
cGroup* cGroupManager::GetGroup( const AString & a_Name )
|
||||
cGroup* cGroupManager::GetGroup( const AString & a_Name)
|
||||
{
|
||||
GroupMap::iterator itr = m_pState->Groups.find( a_Name );
|
||||
if( itr != m_pState->Groups.end() )
|
||||
GroupMap::iterator itr = m_pState->Groups.find( a_Name);
|
||||
if (itr != m_pState->Groups.end())
|
||||
{
|
||||
return itr->second;
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -100,7 +100,7 @@ void cHTTPConnection::AwaitNextRequest(void)
|
||||
{
|
||||
case wcsRecvHeaders:
|
||||
{
|
||||
// Nothing has been received yet, or a special response was given (SendStatusAndReason() or SendNeedAuth() )
|
||||
// Nothing has been received yet, or a special response was given (SendStatusAndReason() or SendNeedAuth())
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -151,6 +151,24 @@ int cInventory::AddItems(cItems & a_ItemStackList, bool a_AllowNewStacks, bool a
|
||||
|
||||
|
||||
|
||||
int cInventory::RemoveItem(const cItem & a_ItemStack)
|
||||
{
|
||||
int RemovedItems = m_HotbarSlots.RemoveItem(a_ItemStack);
|
||||
|
||||
if (RemovedItems < a_ItemStack.m_ItemCount)
|
||||
{
|
||||
cItem Temp(a_ItemStack);
|
||||
Temp.m_ItemCount -= RemovedItems;
|
||||
RemovedItems += m_InventorySlots.RemoveItem(Temp);
|
||||
}
|
||||
|
||||
return RemovedItems;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
bool cInventory::RemoveOneEquippedItem(void)
|
||||
{
|
||||
if (m_HotbarSlots.GetSlot(m_EquippedSlotNum).IsEmpty())
|
||||
@ -479,21 +497,21 @@ int cInventory::ArmorSlotNumToEntityEquipmentID(short a_ArmorSlotNum)
|
||||
|
||||
|
||||
#if 0
|
||||
bool cInventory::AddToBar( cItem & a_Item, const int a_Offset, const int a_Size, bool* a_bChangedSlots, int a_Mode /* = 0 */ )
|
||||
bool cInventory::AddToBar( cItem & a_Item, const int a_Offset, const int a_Size, bool* a_bChangedSlots, int a_Mode /* = 0 */)
|
||||
{
|
||||
// Fill already present stacks
|
||||
if( a_Mode < 2 )
|
||||
if (a_Mode < 2)
|
||||
{
|
||||
int MaxStackSize = cItemHandler::GetItemHandler(a_Item.m_ItemType)->GetMaxStackSize();
|
||||
for(int i = 0; i < a_Size; i++)
|
||||
for (int i = 0; i < a_Size; i++)
|
||||
{
|
||||
if( m_Slots[i + a_Offset].m_ItemType == a_Item.m_ItemType && m_Slots[i + a_Offset].m_ItemCount < MaxStackSize && m_Slots[i + a_Offset].m_ItemDamage == a_Item.m_ItemDamage )
|
||||
if (m_Slots[i + a_Offset].m_ItemType == a_Item.m_ItemType && m_Slots[i + a_Offset].m_ItemCount < MaxStackSize && m_Slots[i + a_Offset].m_ItemDamage == a_Item.m_ItemDamage)
|
||||
{
|
||||
int NumFree = MaxStackSize - m_Slots[i + a_Offset].m_ItemCount;
|
||||
if( NumFree >= a_Item.m_ItemCount )
|
||||
if (NumFree >= a_Item.m_ItemCount)
|
||||
{
|
||||
|
||||
// printf("1. Adding %i items ( free: %i )\n", a_Item.m_ItemCount, NumFree );
|
||||
// printf("1. Adding %i items ( free: %i)\n", a_Item.m_ItemCount, NumFree);
|
||||
m_Slots[i + a_Offset].m_ItemCount += a_Item.m_ItemCount;
|
||||
a_Item.m_ItemCount = 0;
|
||||
a_bChangedSlots[i + a_Offset] = true;
|
||||
@ -501,7 +519,7 @@ bool cInventory::AddToBar( cItem & a_Item, const int a_Offset, const int a_Size,
|
||||
}
|
||||
else
|
||||
{
|
||||
// printf("2. Adding %i items\n", NumFree );
|
||||
// printf("2. Adding %i items\n", NumFree);
|
||||
m_Slots[i + a_Offset].m_ItemCount += (char)NumFree;
|
||||
a_Item.m_ItemCount -= (char)NumFree;
|
||||
a_bChangedSlots[i + a_Offset] = true;
|
||||
@ -510,12 +528,12 @@ bool cInventory::AddToBar( cItem & a_Item, const int a_Offset, const int a_Size,
|
||||
}
|
||||
}
|
||||
|
||||
if( a_Mode > 0 )
|
||||
if (a_Mode > 0)
|
||||
{
|
||||
// If we got more left, find first empty slot
|
||||
for(int i = 0; i < a_Size && a_Item.m_ItemCount > 0; i++)
|
||||
for (int i = 0; i < a_Size && a_Item.m_ItemCount > 0; i++)
|
||||
{
|
||||
if( m_Slots[i + a_Offset].m_ItemType == -1 )
|
||||
if (m_Slots[i + a_Offset].m_ItemType == -1)
|
||||
{
|
||||
m_Slots[i + a_Offset] = a_Item;
|
||||
a_Item.m_ItemCount = 0;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user