summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Android/jni/Android.mk28
-rw-r--r--Android/jni/app-android.cpp10
-rw-r--r--Android/res/layout/list_item.xml7
-rw-r--r--MCServer/Plugins/APIDump/APIDesc.lua10
-rw-r--r--MCServer/Plugins/MagicCarpet/plugin.lua7
-rw-r--r--src/Bindings/PluginLua.cpp2
-rw-r--r--src/BlockArea.cpp4
-rw-r--r--src/BlockID.h7
-rw-r--r--src/Blocks/BlockPumpkin.h72
-rw-r--r--src/ChatColor.cpp7
-rw-r--r--src/ChatColor.h17
-rw-r--r--src/Entities/Player.cpp2
-rw-r--r--src/GroupManager.cpp6
-rw-r--r--src/Mobs/Monster.cpp3
-rw-r--r--src/WebAdmin.cpp6
-rw-r--r--src/WebAdmin.h6
-rw-r--r--src/World.h2
-rw-r--r--src/WorldStorage/NBTChunkSerializer.cpp138
-rw-r--r--src/WorldStorage/WSSAnvil.cpp628
-rw-r--r--src/WorldStorage/WSSAnvil.h34
20 files changed, 902 insertions, 94 deletions
diff --git a/Android/jni/Android.mk b/Android/jni/Android.mk
index 23488e359..3542e588b 100644
--- a/Android/jni/Android.mk
+++ b/Android/jni/Android.mk
@@ -5,7 +5,7 @@ LOCAL_MODULE := mcserver
-LOCAL_SRC_FILES := $(shell find ../CryptoPP ../lua-5.1.4 ../jsoncpp-src-0.5.0 ../zlib-1.2.7 ../source ../squirrel_3_0_1_stable ../tolua++-1.0.93 ../iniFile ../WebServer ../expat '(' -name '*.cpp' -o -name '*.c' ')')
+LOCAL_SRC_FILES := $(shell find ../CryptoPP ../lua ../jsoncpp ../zlib ../src ../tolua++ ../iniFile ../expat ../md5 ../sqlite ../luaexpat '(' -name '*.cpp' -o -name '*.c' ')')
LOCAL_SRC_FILES := $(filter-out %SquirrelFunctions.cpp %SquirrelBindings.cpp %cPlugin_Squirrel.cpp %cSquirrelCommandBinder.cpp %minigzip.c %lua.c %tolua.c %toluabind.c %LeakFinder.cpp %StackWalker.cpp %example.c,$(LOCAL_SRC_FILES))
LOCAL_SRC_FILES := $(patsubst %.cpp,../%.cpp,$(LOCAL_SRC_FILES))
LOCAL_SRC_FILES := $(patsubst %.c,../%.c,$(LOCAL_SRC_FILES))
@@ -20,23 +20,21 @@ LOCAL_CFLAGS := -DANDROID_NDK \
LOCAL_STATIC_LIBRARIES := cpufeatures
-LOCAL_C_INCLUDES := ../source \
- ../source/md5 \
- ../WebServer \
- ../source/packets \
- ../source/items \
- ../source/blocks \
- ../tolua++-1.0.93/src/lib \
- ../lua-5.1.4/src \
+LOCAL_C_INCLUDES := ../src \
+ ../src/packets \
+ ../src/items \
+ ../src/blocks \
+ ../tolua++/src/lib \
+ ../lua/src \
../zlib-1.2.7 \
../iniFile \
- ../tolua++-1.0.93/include \
- ../jsoncpp-src-0.5.0/include \
- ../jsoncpp-src-0.5.0/src/lib_json \
- ../squirrel_3_0_1_stable/include \
- ../squirrel_3_0_1_stable \
- ../squirrel_3_0_1_stable/sqrat \
+ ../tolua++/include \
+ ../jsoncpp/include \
+ ../jsoncpp/src/lib_json \
../expat/ \
+ ../md5/ \
+ ../sqlite/ \
+ ../luaexpat/ \
.. \
diff --git a/Android/jni/app-android.cpp b/Android/jni/app-android.cpp
index 197df29c4..386f1b90e 100644
--- a/Android/jni/app-android.cpp
+++ b/Android/jni/app-android.cpp
@@ -11,7 +11,7 @@
#include <assert.h>
#include "OSSupport/CriticalSection.h"
-#include "OSSupport/MakeDir.h"
+#include "OSSupport/File.h"
#include "ToJava.h"
#include "Root.h"
@@ -84,7 +84,7 @@ extern "C" void Java_com_mcserver_MCServerActivity_NativeOnCreate( JNIEnv* env,
//__android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "Logging from C++!");
g_CriticalSection.Unlock();
- mkdir("/sdcard/mcserver", S_IRWXU | S_IRWXG | S_IRWXO);
+ cFile::CreateFolder("/sdcard/mcserver");
pRoot = new cRoot();
pRoot->Start();
@@ -105,7 +105,7 @@ extern "C" void Java_com_mcserver_MCServerActivity_NativeCleanUp( JNIEnv* env,
__android_log_print(ANDROID_LOG_ERROR,"MCServer", "pRoot: %p", pRoot);
if( pRoot != NULL )
{
- pRoot->ExecuteConsoleCommand("stop");
+ pRoot->QueueExecuteConsoleCommand("stop");
}
}
@@ -124,7 +124,7 @@ extern "C" jint Java_com_mcserver_MCServerActivity_NativeGetWebAdminPort( JNIEnv
{
if( pRoot != NULL && pRoot->GetWebAdmin() != NULL )
{
- return pRoot->GetWebAdmin()->GetPort();
+ return atoi(pRoot->GetWebAdmin()->GetIPv4Ports().c_str());
}
return 0;
-} \ No newline at end of file
+}
diff --git a/Android/res/layout/list_item.xml b/Android/res/layout/list_item.xml
new file mode 100644
index 000000000..e77da47db
--- /dev/null
+++ b/Android/res/layout/list_item.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
+
+
+</TextView> \ No newline at end of file
diff --git a/MCServer/Plugins/APIDump/APIDesc.lua b/MCServer/Plugins/APIDump/APIDesc.lua
index 5bc4a5f39..d69dd14cd 100644
--- a/MCServer/Plugins/APIDump/APIDesc.lua
+++ b/MCServer/Plugins/APIDump/APIDesc.lua
@@ -1,4 +1,3 @@
-
-- APIDesc.lua
-- Contains the API objects' descriptions
@@ -308,18 +307,15 @@ g_APIDesc =
A wrapper class for constants representing colors or effects.
]],
- Functions =
- {
- MakeColor = { Params = "ColorCodeConstant", Return = "string", Notes = "Creates the complete color-code-sequence from the color or effect constant" },
- },
+ Functions = {},
Constants =
{
Black = { Notes = "" },
Blue = { Notes = "" },
Bold = { Notes = "" },
- Color = { Notes = "The first character of the color-code-sequence, §" },
+ Color = { Notes = "The first character of the color-code-sequence, �" },
DarkPurple = { Notes = "" },
- Delimiter = { Notes = "The first character of the color-code-sequence, §" },
+ Delimiter = { Notes = "The first character of the color-code-sequence, �" },
Gold = { Notes = "" },
Gray = { Notes = "" },
Green = { Notes = "" },
diff --git a/MCServer/Plugins/MagicCarpet/plugin.lua b/MCServer/Plugins/MagicCarpet/plugin.lua
index 81eb02a9c..b05816e48 100644
--- a/MCServer/Plugins/MagicCarpet/plugin.lua
+++ b/MCServer/Plugins/MagicCarpet/plugin.lua
@@ -1,4 +1,5 @@
local Carpets = {}
+local PLUGIN
function Initialize( Plugin )
Plugin:SetName( "MagicCarpet" )
@@ -9,7 +10,9 @@ function Initialize( Plugin )
local PluginManager = cPluginManager:Get()
PluginManager:BindCommand("/mc", "magiccarpet", HandleCarpetCommand, " - Spawns a magical carpet");
-
+
+ PLUGIN = Plugin
+
LOG( "Initialised " .. Plugin:GetName() .. " v." .. Plugin:GetVersion() )
return true
end
@@ -75,4 +78,4 @@ function OnPlayerMoving(Player)
end
Carpet:moveTo( cLocation:new( Player:GetPosX(), Player:GetPosY(), Player:GetPosZ() ) )
end
-end \ No newline at end of file
+end
diff --git a/src/Bindings/PluginLua.cpp b/src/Bindings/PluginLua.cpp
index 0d17c9ce2..0e5a66cd6 100644
--- a/src/Bindings/PluginLua.cpp
+++ b/src/Bindings/PluginLua.cpp
@@ -386,7 +386,7 @@ bool cPluginLua::OnExploded(cWorld & a_World, double a_ExplosionSize, bool a_Can
{
case esOther: m_LuaState.Call((int)(**itr), &a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, a_SourceData, cLuaState::Return, res); break;
case esPrimedTNT: m_LuaState.Call((int)(**itr), &a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, (cTNTEntity *)a_SourceData, cLuaState::Return, res); break;
- case esCreeper: m_LuaState.Call((int)(**itr), &a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, (cCreeper *)a_SourceData, cLuaState::Return, res); break;
+ case esMonster: m_LuaState.Call((int)(**itr), &a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, (cMonster *)a_SourceData, cLuaState::Return, res); break;
case esBed: m_LuaState.Call((int)(**itr), &a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, (Vector3i *)a_SourceData, cLuaState::Return, res); break;
case esEnderCrystal: m_LuaState.Call((int)(**itr), &a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, (Vector3i *)a_SourceData, cLuaState::Return, res); break;
case esGhastFireball: m_LuaState.Call((int)(**itr), &a_World, a_ExplosionSize, a_CanCauseFire, a_X, a_Y, a_Z, a_Source, a_SourceData, cLuaState::Return, res); break;
diff --git a/src/BlockArea.cpp b/src/BlockArea.cpp
index a5309f995..03ac13207 100644
--- a/src/BlockArea.cpp
+++ b/src/BlockArea.cpp
@@ -301,10 +301,10 @@ bool cBlockArea::Read(cWorld * a_World, int a_MinBlockX, int a_MaxBlockX, int a_
LOGWARNING("%s: MaxBlockY less than zero, adjusting to zero", __FUNCTION__);
a_MaxBlockY = 0;
}
- else if (a_MaxBlockY >= cChunkDef::Height)
+ else if (a_MaxBlockY > cChunkDef::Height)
{
LOGWARNING("%s: MaxBlockY more than chunk height, adjusting to chunk height", __FUNCTION__);
- a_MaxBlockY = cChunkDef::Height - 1;
+ a_MaxBlockY = cChunkDef::Height;
}
// Allocate the needed memory:
diff --git a/src/BlockID.h b/src/BlockID.h
index 9742e9745..288719ccf 100644
--- a/src/BlockID.h
+++ b/src/BlockID.h
@@ -833,14 +833,17 @@ enum eExplosionSource
{
esOther,
esPrimedTNT,
- esCreeper,
+ esMonster,
esBed,
esEnderCrystal,
esGhastFireball,
esWitherSkullBlack,
esWitherSkullBlue,
esWitherBirth,
- esPlugin
+ esPlugin,
+
+ // Obsolete constants, kept for compatibility, will be removed after some time:
+ esCreeper = esMonster,
} ;
// tolua_end
diff --git a/src/Blocks/BlockPumpkin.h b/src/Blocks/BlockPumpkin.h
index 008fb4fed..724241935 100644
--- a/src/Blocks/BlockPumpkin.h
+++ b/src/Blocks/BlockPumpkin.h
@@ -16,42 +16,68 @@ public:
virtual void OnPlacedByPlayer(cWorld * a_World, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override
{
- if (a_BlockY < 2) // Make sure server won't check for inexistent blocks (below y=0).
+ // Check whether the pumpkin is a part of a golem or a snowman
+
+ if (a_BlockY < 2)
{
+ // The pumpkin is too low for a golem / snowman
return;
}
+
BLOCKTYPE BlockY1 = a_World->GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ);
- BLOCKTYPE BlockY2 = a_World->GetBlock(a_BlockX, a_BlockY - 2, a_BlockZ); // We don't need to check this 2 blocks more than 1 time.
- if ((BlockY1 == E_BLOCK_SNOW_BLOCK) && (BlockY2 == E_BLOCK_SNOW_BLOCK)) //If the first two blocks below the pumpkin are snow blocks, spawn a snow golem.
+ BLOCKTYPE BlockY2 = a_World->GetBlock(a_BlockX, a_BlockY - 2, a_BlockZ);
+
+ // Check for a snow golem:
+ if ((BlockY1 == E_BLOCK_SNOW_BLOCK) && (BlockY2 == E_BLOCK_SNOW_BLOCK))
{
- a_World->FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_AIR, 0);
+ a_World->FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_AIR, 0);
a_World->FastSetBlock(a_BlockX, a_BlockY - 1, a_BlockZ, E_BLOCK_AIR, 0);
a_World->FastSetBlock(a_BlockX, a_BlockY - 2, a_BlockZ, E_BLOCK_AIR, 0);
a_World->SpawnMob(a_BlockX + 0.5, a_BlockY - 2, a_BlockZ + 0.5, cMonster::mtSnowGolem);
+ return;
+ }
+
+ // Check for an iron golem. First check only the body and legs, since those are the same for both orientations:
+ if ((BlockY1 != E_BLOCK_IRON_BLOCK) || (BlockY2 != E_BLOCK_IRON_BLOCK))
+ {
+ // One of the blocks is not an iron, no chance of a golem here
+ return;
+ }
+
+ // Now check both orientations for hands:
+ if (
+ (a_World->GetBlock(a_BlockX + 1, a_BlockY - 1, a_BlockZ) == E_BLOCK_IRON_BLOCK) &&
+ (a_World->GetBlock(a_BlockX - 1, a_BlockY - 1, a_BlockZ) == E_BLOCK_IRON_BLOCK)
+ )
+ {
+ // Remove the iron blocks:
+ a_World->FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_AIR, 0);
+ a_World->FastSetBlock(a_BlockX, a_BlockY - 1, a_BlockZ, E_BLOCK_AIR, 0);
+ a_World->FastSetBlock(a_BlockX + 1, a_BlockY - 1, a_BlockZ, E_BLOCK_AIR, 0);
+ a_World->FastSetBlock(a_BlockX - 1, a_BlockY - 1, a_BlockZ, E_BLOCK_AIR, 0);
+ a_World->FastSetBlock(a_BlockX, a_BlockY - 2, a_BlockZ, E_BLOCK_AIR, 0);
+
+ // Spawn the golem:
+ a_World->SpawnMob(a_BlockX + 0.5, a_BlockY - 2, a_BlockZ + 0.5, cMonster::mtIronGolem);
}
- else if ((BlockY1 == E_BLOCK_IRON_BLOCK) && (BlockY2 == E_BLOCK_IRON_BLOCK)) //If the first two blocks below the pumpkin are iron blocks, spawn an iron golem.
+ else if (
+ (a_World->GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ + 1) == E_BLOCK_IRON_BLOCK) &&
+ (a_World->GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ - 1) == E_BLOCK_IRON_BLOCK)
+ )
{
- if ((a_World->GetBlock(a_BlockX + 1, a_BlockY - 1, a_BlockZ) == E_BLOCK_IRON_BLOCK) && (a_World->GetBlock(a_BlockX - 1, a_BlockY - 1, a_BlockZ) == E_BLOCK_IRON_BLOCK)) //Check the first possible locations for arms.
- {
- a_World->FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_AIR, 0);
- a_World->FastSetBlock(a_BlockX, a_BlockY - 1, a_BlockZ, E_BLOCK_AIR, 0);
- a_World->FastSetBlock(a_BlockX + 1, a_BlockY - 1, a_BlockZ, E_BLOCK_AIR, 0);
- a_World->FastSetBlock(a_BlockX - 1, a_BlockY - 1, a_BlockZ, E_BLOCK_AIR, 0);
- a_World->FastSetBlock(a_BlockX, a_BlockY - 2, a_BlockZ, E_BLOCK_AIR, 0); //Set all blocks used for creation to air.
- a_World->SpawnMob(a_BlockX + 0.5, a_BlockY - 2, a_BlockZ + 0.5, cMonster::mtIronGolem); //Spawn an iron golem.
- }
- else if((a_World->GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ + 1) == E_BLOCK_IRON_BLOCK) && (a_World->GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ - 1) == E_BLOCK_IRON_BLOCK)) //Check the other possible locations.
- {
- a_World->FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_AIR, 0);
- a_World->FastSetBlock(a_BlockX, a_BlockY - 1, a_BlockZ, E_BLOCK_AIR, 0);
- a_World->FastSetBlock(a_BlockX, a_BlockY - 1, a_BlockZ + 1, E_BLOCK_AIR, 0);
- a_World->FastSetBlock(a_BlockX, a_BlockY - 1, a_BlockZ - 1, E_BLOCK_AIR, 0);
- a_World->FastSetBlock(a_BlockX, a_BlockY - 2, a_BlockZ, E_BLOCK_AIR, 0);
- a_World->SpawnMob(a_BlockX + 0.5, a_BlockY - 2, a_BlockZ + 0.5, cMonster::mtIronGolem);
- }
+ // Remove the iron blocks:
+ a_World->FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_AIR, 0);
+ a_World->FastSetBlock(a_BlockX, a_BlockY - 1, a_BlockZ, E_BLOCK_AIR, 0);
+ a_World->FastSetBlock(a_BlockX, a_BlockY - 1, a_BlockZ + 1, E_BLOCK_AIR, 0);
+ a_World->FastSetBlock(a_BlockX, a_BlockY - 1, a_BlockZ - 1, E_BLOCK_AIR, 0);
+ a_World->FastSetBlock(a_BlockX, a_BlockY - 2, a_BlockZ, E_BLOCK_AIR, 0);
+
+ // Spawn the golem:
+ a_World->SpawnMob(a_BlockX + 0.5, a_BlockY - 2, a_BlockZ + 0.5, cMonster::mtIronGolem);
}
}
+
virtual bool GetPlacementBlockTypeMeta(
cWorld * a_World, cPlayer * a_Player,
int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace,
diff --git a/src/ChatColor.cpp b/src/ChatColor.cpp
index 2b223ee76..72a0a6928 100644
--- a/src/ChatColor.cpp
+++ b/src/ChatColor.cpp
@@ -1,4 +1,3 @@
-
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
#include "ChatColor.h"
@@ -29,11 +28,5 @@ 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 std::string cChatColor::MakeColor( char a_Color )
-{
- return cChatColor::Color + a_Color;
-}
-
-
diff --git a/src/ChatColor.h b/src/ChatColor.h
index 85b10f400..643c4d5d8 100644
--- a/src/ChatColor.h
+++ b/src/ChatColor.h
@@ -29,15 +29,14 @@ public:
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 std::string MakeColor( char a_Color );
+ // Styles ( source: http://wiki.vg/Chat )
+ static const std::string Random;
+ static const std::string Bold;
+ static const std::string Strikethrough;
+ static const std::string Underlined;
+ static const std::string Italic;
+ static const std::string Plain;
+
};
// tolua_end
diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp
index 948a259ff..b923a094e 100644
--- a/src/Entities/Player.cpp
+++ b/src/Entities/Player.cpp
@@ -1294,7 +1294,7 @@ AString cPlayer::GetColor(void) const
{
if ( m_Color != '-' )
{
- return cChatColor::MakeColor( m_Color );
+ return cChatColor::Color + m_Color;
}
if ( m_Groups.size() < 1 )
diff --git a/src/GroupManager.cpp b/src/GroupManager.cpp
index 1ffe3812f..792acc2c3 100644
--- a/src/GroupManager.cpp
+++ b/src/GroupManager.cpp
@@ -79,11 +79,11 @@ cGroupManager::cGroupManager()
Group->SetName( KeyName );
char Color = IniFile.GetValue( KeyName, "Color", "-" )[0];
if( Color != '-' )
- Group->SetColor( cChatColor::MakeColor(Color) );
+ Group->SetColor( cChatColor::Color + Color );
else
Group->SetColor( cChatColor::White );
- std::string Commands = IniFile.GetValue( KeyName, "Commands", "" );
+ AString Commands = IniFile.GetValue( KeyName, "Commands", "" );
if( Commands.size() > 0 )
{
AStringVector Split = StringSplit( Commands, "," );
@@ -93,7 +93,7 @@ cGroupManager::cGroupManager()
}
}
- std::string Permissions = IniFile.GetValue( KeyName, "Permissions", "" );
+ AString Permissions = IniFile.GetValue( KeyName, "Permissions", "" );
if( Permissions.size() > 0 )
{
AStringVector Split = StringSplit( Permissions, "," );
diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp
index f05d7362a..76df76633 100644
--- a/src/Mobs/Monster.cpp
+++ b/src/Mobs/Monster.cpp
@@ -646,9 +646,10 @@ cMonster::eFamily cMonster::FamilyFromType(eType a_Type)
case mtEnderman: return mfHostile;
case mtGhast: return mfHostile;
case mtHorse: return mfPassive;
+ case mtIronGolem: return mfPassive;
case mtMagmaCube: return mfHostile;
case mtMooshroom: return mfHostile;
- case mtOcelot: return mfHostile;
+ case mtOcelot: return mfPassive;
case mtPig: return mfPassive;
case mtSheep: return mfPassive;
case mtSilverfish: return mfHostile;
diff --git a/src/WebAdmin.cpp b/src/WebAdmin.cpp
index 462702893..a1f0842aa 100644
--- a/src/WebAdmin.cpp
+++ b/src/WebAdmin.cpp
@@ -100,10 +100,10 @@ bool cWebAdmin::Init(void)
LOGD("Initialising WebAdmin...");
- AString PortsIPv4 = m_IniFile.GetValueSet("WebAdmin", "Port", "8080");
- AString PortsIPv6 = m_IniFile.GetValueSet("WebAdmin", "PortsIPv6", "");
+ m_PortsIPv4 = m_IniFile.GetValueSet("WebAdmin", "Port", "8080");
+ m_PortsIPv6 = m_IniFile.GetValueSet("WebAdmin", "PortsIPv6", "");
- if (!m_HTTPServer.Initialize(PortsIPv4, PortsIPv6))
+ if (!m_HTTPServer.Initialize(m_PortsIPv4, m_PortsIPv6))
{
return false;
}
diff --git a/src/WebAdmin.h b/src/WebAdmin.h
index c629d44ff..0907e7bc3 100644
--- a/src/WebAdmin.h
+++ b/src/WebAdmin.h
@@ -132,6 +132,9 @@ public:
/// Escapes text passed into it, so it can be embedded into html.
static AString GetHTMLEscapedString(const AString & a_Input);
+ AString GetIPv4Ports(void) const { return m_PortsIPv4; }
+ AString GetIPv6Ports(void) const { return m_PortsIPv6; }
+
// tolua_end
/// Returns the prefix needed for making a link point to the webadmin root from the given URL ("../../../webadmin"-style)
@@ -180,6 +183,9 @@ protected:
PluginList m_Plugins;
+ AString m_PortsIPv4;
+ AString m_PortsIPv6;
+
/// The Lua template script to provide templates:
cLuaState m_TemplateScript;
diff --git a/src/World.h b/src/World.h
index 4f9bf67e7..c067252d9 100644
--- a/src/World.h
+++ b/src/World.h
@@ -420,7 +420,7 @@ public:
a_SourceData exact type depends on the a_Source:
| esOther | void * |
| esPrimedTNT | cTNTEntity * |
- | esCreeper | cCreeper * |
+ | esMonster | cMonster * |
| esBed | cVector3i * |
| esEnderCrystal | Vector3i * |
| esGhastFireball | cGhastFireball * |
diff --git a/src/WorldStorage/NBTChunkSerializer.cpp b/src/WorldStorage/NBTChunkSerializer.cpp
index 5c87c2679..e5043de1f 100644
--- a/src/WorldStorage/NBTChunkSerializer.cpp
+++ b/src/WorldStorage/NBTChunkSerializer.cpp
@@ -5,6 +5,10 @@
#include "Globals.h"
#include "NBTChunkSerializer.h"
#include "../BlockID.h"
+#include "../ItemGrid.h"
+#include "../StringCompression.h"
+#include "FastNBT.h"
+
#include "../BlockEntities/ChestEntity.h"
#include "../BlockEntities/DispenserEntity.h"
#include "../BlockEntities/DropperEntity.h"
@@ -13,17 +17,27 @@
#include "../BlockEntities/JukeboxEntity.h"
#include "../BlockEntities/NoteEntity.h"
#include "../BlockEntities/SignEntity.h"
-#include "../ItemGrid.h"
-#include "../StringCompression.h"
+
#include "../Entities/Entity.h"
-#include "FastNBT.h"
#include "../Entities/FallingBlock.h"
#include "../Entities/Boat.h"
#include "../Entities/Minecart.h"
-#include "../Mobs/Monster.h"
#include "../Entities/Pickup.h"
#include "../Entities/ProjectileEntity.h"
+#include "../Mobs/Monster.h"
+#include "../Mobs/Bat.h"
+#include "../Mobs/Creeper.h"
+#include "../Mobs/Enderman.h"
+#include "../Mobs/Horse.h"
+#include "../Mobs/Magmacube.h"
+#include "../Mobs/Sheep.h"
+#include "../Mobs/Slime.h"
+#include "../Mobs/Skeleton.h"
+#include "../Mobs/Villager.h"
+#include "../Mobs/Wolf.h"
+#include "../Mobs/Zombie.h"
+
@@ -322,7 +336,120 @@ void cNBTChunkSerializer::AddMinecartEntity(cMinecart * a_Minecart)
void cNBTChunkSerializer::AddMonsterEntity(cMonster * a_Monster)
{
- // TODO
+ const char * EntityClass = NULL;
+ switch (a_Monster->GetMobType())
+ {
+ case cMonster::mtBat: EntityClass = "Bat"; break;
+ case cMonster::mtBlaze: EntityClass = "Blaze"; break;
+ case cMonster::mtCaveSpider: EntityClass = "CaveSpider"; break;
+ case cMonster::mtChicken: EntityClass = "Chicken"; break;
+ case cMonster::mtCow: EntityClass = "Cow"; break;
+ case cMonster::mtCreeper: EntityClass = "Creeper"; break;
+ case cMonster::mtEnderDragon: EntityClass = "EnderDragon"; break;
+ case cMonster::mtEnderman: EntityClass = "Enderman"; break;
+ case cMonster::mtGhast: EntityClass = "Ghast"; break;
+ case cMonster::mtGiant: EntityClass = "Giant"; break;
+ case cMonster::mtHorse: EntityClass = "Horse"; break;
+ case cMonster::mtIronGolem: EntityClass = "VillagerGolem"; break;
+ case cMonster::mtMagmaCube: EntityClass = "LavaSlime"; break;
+ case cMonster::mtMooshroom: EntityClass = "MushroomCow"; break;
+ case cMonster::mtOcelot: EntityClass = "Ozelot"; break;
+ case cMonster::mtPig: EntityClass = "Pig"; break;
+ case cMonster::mtSheep: EntityClass = "Sheep"; break;
+ case cMonster::mtSilverfish: EntityClass = "Silverfish"; break;
+ case cMonster::mtSkeleton: EntityClass = "Skeleton"; break;
+ case cMonster::mtSlime: EntityClass = "Slime"; break;
+ case cMonster::mtSnowGolem: EntityClass = "SnowMan"; break;
+ case cMonster::mtSpider: EntityClass = "Spider"; break;
+ case cMonster::mtSquid: EntityClass = "Squid"; break;
+ case cMonster::mtVillager: EntityClass = "Villager"; break;
+ case cMonster::mtWitch: EntityClass = "Witch"; break;
+ case cMonster::mtWither: EntityClass = "Wither"; break;
+ case cMonster::mtWolf: EntityClass = "Wolf"; break;
+ case cMonster::mtZombie: EntityClass = "Zombie"; break;
+ case cMonster::mtZombiePigman: EntityClass = "PigZombie"; break;
+ default:
+ {
+ ASSERT(!"Unhandled monster type");
+ return;
+ }
+ } // switch (payload)
+
+ m_Writer.BeginCompound("");
+ AddBasicEntity(a_Monster, EntityClass);
+ switch (a_Monster->GetMobType())
+ {
+ case cMonster::mtBat:
+ {
+ m_Writer.AddByte("BatFlags", ((const cBat *)a_Monster)->IsHanging());
+ break;
+ }
+ case cMonster::mtCreeper:
+ {
+ m_Writer.AddByte("powered", ((const cCreeper *)a_Monster)->IsCharged());
+ m_Writer.AddByte("ignited", ((const cCreeper *)a_Monster)->IsBlowing());
+ break;
+ }
+ case cMonster::mtEnderman:
+ {
+ m_Writer.AddShort("carried", (Int16)((const cEnderman *)a_Monster)->GetCarriedBlock());
+ m_Writer.AddShort("carriedData", (Int16)((const cEnderman *)a_Monster)->GetCarriedMeta());
+ break;
+ }
+ case cMonster::mtHorse:
+ {
+ const cHorse & Horse = *((const cHorse *)a_Monster);
+ m_Writer.AddByte("ChestedHorse", Horse.IsChested());
+ m_Writer.AddByte("EatingHaystack", Horse.IsEating());
+ m_Writer.AddByte("Tame", Horse.IsTame());
+ m_Writer.AddInt ("Type", Horse.GetHorseType());
+ m_Writer.AddInt ("Color", Horse.GetHorseColor());
+ m_Writer.AddInt ("Style", Horse.GetHorseStyle());
+ m_Writer.AddInt ("ArmorType", Horse.GetHorseArmour());
+ m_Writer.AddByte("Saddle", Horse.IsSaddled());
+ break;
+ }
+ case cMonster::mtMagmaCube:
+ {
+ m_Writer.AddByte("Size", ((const cMagmaCube *)a_Monster)->GetSize());
+ break;
+ }
+ case cMonster::mtSheep:
+ {
+ m_Writer.AddByte("Sheared", ((const cSheep *)a_Monster)->IsSheared());
+ m_Writer.AddByte("Color", ((const cSheep *)a_Monster)->GetFurColor());
+ break;
+ }
+ case cMonster::mtSlime:
+ {
+ m_Writer.AddInt("Size", ((const cSlime *)a_Monster)->GetSize());
+ break;
+ }
+ case cMonster::mtSkeleton:
+ {
+ m_Writer.AddByte("SkeletonType", (((const cSkeleton *)a_Monster)->IsWither() ? 1 : 0));
+ break;
+ }
+ case cMonster::mtVillager:
+ {
+ m_Writer.AddInt("Profession", ((const cVillager *)a_Monster)->GetVilType());
+ break;
+ }
+ case cMonster::mtWolf:
+ {
+ // TODO:
+ // _X: CopyPasta error: m_Writer.AddInt("Profession", ((const cVillager *)a_Monster)->GetVilType());
+ break;
+ }
+ case cMonster::mtZombie:
+ {
+ m_Writer.AddByte("IsVillager", (((const cZombie *)a_Monster)->IsVillagerZombie() ? 1 : 0));
+ m_Writer.AddByte("IsBaby", (((const cZombie *)a_Monster)->IsBaby() ? 1 : 0));
+ m_Writer.AddByte("IsConverting", (((const cZombie *)a_Monster)->IsConverting() ? 1 : 0));
+ break;
+ }
+ }
+ m_Writer.EndCompound();
}
@@ -479,6 +606,7 @@ void cNBTChunkSerializer::Entity(cEntity * a_Entity)
case cEntity::etMonster: AddMonsterEntity ((cMonster *) a_Entity); break;
case cEntity::etPickup: AddPickupEntity ((cPickup *) a_Entity); break;
case cEntity::etProjectile: AddProjectileEntity ((cProjectileEntity *)a_Entity); break;
+ case cEntity::etExpOrb: /* TODO */ break;
case cEntity::etPlayer: return; // Players aren't saved into the world
default:
{
diff --git a/src/WorldStorage/WSSAnvil.cpp b/src/WorldStorage/WSSAnvil.cpp
index dd06f19fa..8605930b6 100644
--- a/src/WorldStorage/WSSAnvil.cpp
+++ b/src/WorldStorage/WSSAnvil.cpp
@@ -6,9 +6,14 @@
#include "Globals.h"
#include "WSSAnvil.h"
#include "NBTChunkSerializer.h"
-#include "../World.h"
+#include "FastNBT.h"
#include "zlib/zlib.h"
+#include "../World.h"
#include "../BlockID.h"
+#include "../Item.h"
+#include "../ItemGrid.h"
+#include "../StringCompression.h"
+
#include "../BlockEntities/ChestEntity.h"
#include "../BlockEntities/DispenserEntity.h"
#include "../BlockEntities/DropperEntity.h"
@@ -17,11 +22,11 @@
#include "../BlockEntities/JukeboxEntity.h"
#include "../BlockEntities/NoteEntity.h"
#include "../BlockEntities/SignEntity.h"
-#include "../Item.h"
-#include "../ItemGrid.h"
-#include "../StringCompression.h"
-#include "FastNBT.h"
+
+
#include "../Mobs/Monster.h"
+#include "../Mobs/IncludeAllMonsters.h"
+
#include "../Entities/Boat.h"
#include "../Entities/FallingBlock.h"
#include "../Entities/Minecart.h"
@@ -984,6 +989,122 @@ void cWSSAnvil::LoadEntityFromNBT(cEntityList & a_Entities, const cParsedNBT & a
{
LoadThrownEnderpearlFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
+ else if (strncmp(a_IDTag, "Bat", a_IDTagLength) == 0)
+ {
+ LoadBatFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Blaze", a_IDTagLength) == 0)
+ {
+ LoadBlazeFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "CaveSpider", a_IDTagLength) == 0)
+ {
+ LoadCaveSpiderFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Chicken", a_IDTagLength) == 0)
+ {
+ LoadChickenFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Cow", a_IDTagLength) == 0)
+ {
+ LoadCowFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Creeper", a_IDTagLength) == 0)
+ {
+ LoadCreeperFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "EnderDragon", a_IDTagLength) == 0)
+ {
+ LoadEnderDragonFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Enderman", a_IDTagLength) == 0)
+ {
+ LoadEndermanFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Ghast", a_IDTagLength) == 0)
+ {
+ LoadGhastFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Giant", a_IDTagLength) == 0)
+ {
+ LoadGiantFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Horse", a_IDTagLength) == 0)
+ {
+ LoadHorseFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "VillagerGolem", a_IDTagLength) == 0)
+ {
+ LoadIronGolemFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "LavaSlime", a_IDTagLength) == 0)
+ {
+ LoadMagmaCubeFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "MushroomCow", a_IDTagLength) == 0)
+ {
+ LoadMooshroomFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Ozelot", a_IDTagLength) == 0)
+ {
+ LoadOcelotFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Pig", a_IDTagLength) == 0)
+ {
+ LoadPigFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Sheep", a_IDTagLength) == 0)
+ {
+ LoadSheepFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Silverfish", a_IDTagLength) == 0)
+ {
+ LoadSilverfishFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Skeleton", a_IDTagLength) == 0)
+ {
+ LoadSkeletonFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Slime", a_IDTagLength) == 0)
+ {
+ LoadSlimeFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "SnowMan", a_IDTagLength) == 0)
+ {
+ LoadSnowGolemFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Spider", a_IDTagLength) == 0)
+ {
+ LoadSpiderFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Squid", a_IDTagLength) == 0)
+ {
+ LoadSquidFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Villager", a_IDTagLength) == 0)
+ {
+ LoadVillagerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Witch", a_IDTagLength) == 0)
+ {
+ LoadWitchFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Wither", a_IDTagLength) == 0)
+ {
+ LoadWitherFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Wolf", a_IDTagLength) == 0)
+ {
+ LoadWolfFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "Zombie", a_IDTagLength) == 0)
+ {
+ LoadZombieFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
+ else if (strncmp(a_IDTag, "PigZombie", a_IDTagLength) == 0)
+ {
+ LoadPigZombieFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
+ }
// TODO: other entities
}
@@ -1007,7 +1128,20 @@ void cWSSAnvil::LoadBoatFromNBT(cEntityList & a_Entities, const cParsedNBT & a_N
void cWSSAnvil::LoadFallingBlockFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
- // TODO
+ int TypeIdx = a_NBT.FindChildByName(a_TagIdx, "TileID");
+ int MetaIdx = a_NBT.FindChildByName(a_TagIdx, "Data");
+
+ if ((TypeIdx < 0) || (MetaIdx < 0)) { return; }
+
+ int Type = a_NBT.GetInt(TypeIdx);
+ NIBBLETYPE Meta = (NIBBLETYPE)a_NBT.GetByte(MetaIdx);
+
+ std::auto_ptr<cFallingBlock> FallingBlock(new cFallingBlock(Vector3i(0, 0, 0), Type, Meta));
+ if (!LoadEntityBaseFromNBT(*FallingBlock.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+ a_Entities.push_back(FallingBlock.release());
}
@@ -1254,6 +1388,488 @@ void cWSSAnvil::LoadThrownEnderpearlFromNBT(cEntityList & a_Entities, const cPar
+void cWSSAnvil::LoadBatFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cBat> Monster(new cBat());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadBlazeFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cBlaze> Monster(new cBlaze());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadCaveSpiderFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cCavespider> Monster(new cCavespider());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadChickenFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cChicken> Monster(new cChicken());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadCowFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cCow> Monster(new cCow());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadCreeperFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cCreeper> Monster(new cCreeper());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadEnderDragonFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cEnderDragon> Monster(new cEnderDragon());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadEndermanFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cEnderman> Monster(new cEnderman());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadGhastFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cGhast> Monster(new cGhast());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadGiantFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cGiant> Monster(new cGiant());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadHorseFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ int TypeIdx = a_NBT.FindChildByName(a_TagIdx, "Type");
+ int ColorIdx = a_NBT.FindChildByName(a_TagIdx, "Color");
+ int StyleIdx = a_NBT.FindChildByName(a_TagIdx, "Style");
+
+ if ((TypeIdx < 0) || (ColorIdx < 0) || (StyleIdx < 0)) { return; }
+
+ int Type = a_NBT.GetInt(TypeIdx);
+ int Color = a_NBT.GetInt(ColorIdx);
+ int Style = a_NBT.GetInt(StyleIdx);
+
+ std::auto_ptr<cHorse> Monster(new cHorse(Type, Color, Style, 1));
+
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadIronGolemFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cIronGolem> Monster(new cIronGolem());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadMagmaCubeFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ int SizeIdx = a_NBT.FindChildByName(a_TagIdx, "Size");
+
+ if (SizeIdx < 0) { return; }
+
+ int Size = a_NBT.GetInt(SizeIdx);
+
+ std::auto_ptr<cMagmaCube> Monster(new cMagmaCube(Size));
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadMooshroomFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cMooshroom> Monster(new cMooshroom());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadOcelotFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cOcelot> Monster(new cOcelot());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadPigFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cPig> Monster(new cPig());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadSheepFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ int ColorIdx = a_NBT.FindChildByName(a_TagIdx, "Color");
+
+ if (ColorIdx < 0) { return; }
+
+ int Color = (int)a_NBT.GetByte(ColorIdx);
+
+ std::auto_ptr<cSheep> Monster(new cSheep(Color));
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadSilverfishFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cSilverfish> Monster(new cSilverfish());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadSkeletonFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ int TypeIdx = a_NBT.FindChildByName(a_TagIdx, "SkeletonType");
+
+ if (TypeIdx < 0) { return; }
+
+ bool Type = ((a_NBT.GetByte(TypeIdx) == 1) ? true : false);
+
+ std::auto_ptr<cSkeleton> Monster(new cSkeleton(Type));
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadSlimeFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ int SizeIdx = a_NBT.FindChildByName(a_TagIdx, "Size");
+
+ if (SizeIdx < 0) { return; }
+
+ int Size = a_NBT.GetInt(SizeIdx);
+
+ std::auto_ptr<cSlime> Monster(new cSlime(Size));
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadSnowGolemFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cSnowGolem> Monster(new cSnowGolem());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadSpiderFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cSpider> Monster(new cSpider());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadSquidFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cSquid> Monster(new cSquid());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadVillagerFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ int TypeIdx = a_NBT.FindChildByName(a_TagIdx, "Profession");
+
+ if (TypeIdx < 0) { return; }
+
+ int Type = a_NBT.GetInt(TypeIdx);
+
+ std::auto_ptr<cVillager> Monster(new cVillager(cVillager::eVillagerType(Type)));
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadWitchFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cWitch> Monster(new cWitch());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadWitherFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cWither> Monster(new cWither());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadWolfFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cWolf> Monster(new cWolf());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadZombieFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ int IsVillagerIdx = a_NBT.FindChildByName(a_TagIdx, "IsVillager");
+
+ if (IsVillagerIdx < 0) { return; }
+
+ bool IsVillagerZombie = ((a_NBT.GetByte(IsVillagerIdx) == 1) ? true : false);
+
+ std::auto_ptr<cZombie> Monster(new cZombie(IsVillagerZombie));
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
+void cWSSAnvil::LoadPigZombieFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
+{
+ std::auto_ptr<cZombiePigman> Monster(new cZombiePigman());
+ if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
+ {
+ return;
+ }
+
+ a_Entities.push_back(Monster.release());
+}
+
+
+
+
+
bool cWSSAnvil::LoadEntityBaseFromNBT(cEntity & a_Entity, const cParsedNBT & a_NBT, int a_TagIdx)
{
double Pos[3];
diff --git a/src/WorldStorage/WSSAnvil.h b/src/WorldStorage/WSSAnvil.h
index 7685d2236..0a7406267 100644
--- a/src/WorldStorage/WSSAnvil.h
+++ b/src/WorldStorage/WSSAnvil.h
@@ -142,18 +142,50 @@ protected:
void LoadBoatFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadFallingBlockFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadPickupFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+
void LoadMinecartRFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadMinecartCFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadMinecartFFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadMinecartTFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadMinecartHFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
- void LoadPickupFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+
void LoadArrowFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadSnowballFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadEggFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadFireballFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadFireChargeFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadThrownEnderpearlFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+
+ void LoadBatFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadBlazeFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadCaveSpiderFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadChickenFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadCowFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadCreeperFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadEnderDragonFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadEndermanFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadGhastFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadGiantFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadHorseFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadIronGolemFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadMagmaCubeFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadMooshroomFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadOcelotFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadPigFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadSheepFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadSilverfishFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadSkeletonFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadSlimeFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadSnowGolemFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadSpiderFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadSquidFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadVillagerFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadWitchFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadWitherFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadWolfFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadZombieFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
+ void LoadPigZombieFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
/// Loads entity common data from the NBT compound; returns true if successful
bool LoadEntityBaseFromNBT(cEntity & a_Entity, const cParsedNBT & a_NBT, int a_TagIdx);