summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--SetFlags.cmake8
-rw-r--r--Tools/ProtoProxy/Connection.cpp35
-rw-r--r--lib/inifile/iniFile.cpp5
-rw-r--r--src/Authenticator.cpp267
-rw-r--r--src/BlockID.h4
-rw-r--r--src/ChunkMap.cpp26
-rw-r--r--src/ChunkStay.cpp8
-rw-r--r--src/ChunkStay.h4
-rw-r--r--src/ClientHandle.cpp62
-rw-r--r--src/ClientHandle.h17
-rw-r--r--src/Defines.h10
-rw-r--r--src/Entities/Entity.cpp127
-rw-r--r--src/Entities/Entity.h54
-rw-r--r--src/Entities/Minecart.cpp38
-rw-r--r--src/Entities/Pickup.cpp63
-rw-r--r--src/Entities/Pickup.h3
-rw-r--r--src/Entities/Player.cpp34
-rw-r--r--src/Entities/ProjectileEntity.cpp2
-rw-r--r--src/Generating/NetherFortGen.cpp53
-rw-r--r--src/Generating/NetherFortGen.h2
-rw-r--r--src/Generating/PieceGenerator.cpp56
-rw-r--r--src/Generating/PieceGenerator.h20
-rw-r--r--src/Generating/Prefab.cpp131
-rw-r--r--src/Generating/Prefab.h68
-rw-r--r--src/Generating/Prefabs/NetherFortPrefabs.cpp5885
-rw-r--r--src/Generating/Prefabs/NetherFortPrefabs.h10
-rw-r--r--src/LightingThread.cpp1
-rw-r--r--src/Mobs/Monster.cpp43
-rw-r--r--src/Mobs/Monster.h4
-rw-r--r--src/Mobs/Sheep.cpp2
-rw-r--r--src/Mobs/Villager.cpp2
-rw-r--r--src/Mobs/Wolf.cpp4
-rw-r--r--src/Protocol/Authenticator.cpp313
-rw-r--r--src/Protocol/Authenticator.h (renamed from src/Authenticator.h)36
-rw-r--r--src/Protocol/Protocol.h1
-rw-r--r--src/Protocol/Protocol125.cpp42
-rw-r--r--src/Protocol/Protocol125.h20
-rw-r--r--src/Protocol/Protocol17x.cpp241
-rw-r--r--src/Protocol/Protocol17x.h22
-rw-r--r--src/Protocol/ProtocolRecognizer.cpp23
-rw-r--r--src/Protocol/ProtocolRecognizer.h6
-rw-r--r--src/Root.cpp4
-rw-r--r--src/Root.h4
-rw-r--r--src/Server.cpp4
-rw-r--r--src/Server.h2
-rw-r--r--src/Simulator/IncrementalRedstoneSimulator.cpp480
-rw-r--r--src/Simulator/IncrementalRedstoneSimulator.h33
-rw-r--r--src/Vector3.h5
-rw-r--r--src/World.cpp14
-rw-r--r--src/WorldStorage/FireworksSerializer.cpp2
-rw-r--r--src/WorldStorage/FireworksSerializer.h2
51 files changed, 5542 insertions, 2760 deletions
diff --git a/SetFlags.cmake b/SetFlags.cmake
index c5a3a0697..6c974ea94 100644
--- a/SetFlags.cmake
+++ b/SetFlags.cmake
@@ -46,6 +46,10 @@ macro(set_flags)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11")
else()
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++0x")
+ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++0x")
+
add_flags_cxx("-pthread")
endif()
@@ -56,6 +60,10 @@ macro(set_flags)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11")
+ else()
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++0x")
+ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++0x")
endif()
# We use a signed char (fixes #640 on RasPi)
diff --git a/Tools/ProtoProxy/Connection.cpp b/Tools/ProtoProxy/Connection.cpp
index d9b8e3dd1..b21d2ae59 100644
--- a/Tools/ProtoProxy/Connection.cpp
+++ b/Tools/ProtoProxy/Connection.cpp
@@ -2197,11 +2197,39 @@ bool cConnection::HandleServerSpawnMob(void)
+struct sSpawnData
+{
+ AString m_Name;
+ AString m_Value;
+ AString m_Signature;
+ sSpawnData(const AString & a_Name, const AString & a_Value, const AString & a_Signature) :
+ m_Name(a_Name),
+ m_Value(a_Value),
+ m_Signature(a_Signature)
+ {
+ }
+};
+
+typedef std::vector<sSpawnData> sSpawnDatas;
+
+
+
+
+
bool cConnection::HandleServerSpawnNamedEntity(void)
{
HANDLE_SERVER_PACKET_READ(ReadVarInt, UInt32, EntityID);
HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, EntityUUID);
HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, EntityName);
+ HANDLE_SERVER_PACKET_READ(ReadVarInt, UInt32, DataCount);
+ sSpawnDatas Data;
+ for (UInt32 i = 0; i < DataCount; i++)
+ {
+ HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Name)
+ HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Value)
+ HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Signature)
+ Data.push_back(sSpawnData(Name, Value, Signature));
+ }
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, PosX);
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, PosY);
HANDLE_SERVER_PACKET_READ(ReadBEInt, int, PosZ);
@@ -2219,6 +2247,13 @@ bool cConnection::HandleServerSpawnNamedEntity(void)
Log(" EntityID = %u (0x%x)", EntityID, EntityID);
Log(" UUID = \"%s\"", EntityUUID.c_str());
Log(" Name = \"%s\"", EntityName.c_str());
+ Log(" NumData = %u", DataCount);
+ for (sSpawnDatas::const_iterator itr = Data.begin(), end = Data.end(); itr != end; ++itr)
+ {
+ Log(" Name = \"%s\", Value = \"%s\", Signature = \"%s\"",
+ itr->m_Name.c_str(), itr->m_Value.c_str(), itr->m_Signature.c_str()
+ );
+ } // for itr - Data[]
Log(" Pos = %s", PrintableAbsIntTriplet(PosX, PosY, PosZ).c_str());
Log(" Rotation = <yaw %d, pitch %d>", Yaw, Pitch);
Log(" CurrentItem = %d", CurrentItem);
diff --git a/lib/inifile/iniFile.cpp b/lib/inifile/iniFile.cpp
index cf8b63987..19db9723a 100644
--- a/lib/inifile/iniFile.cpp
+++ b/lib/inifile/iniFile.cpp
@@ -154,7 +154,7 @@ bool cIniFile::ReadFile(const AString & a_FileName, bool a_AllowExampleRedirect)
case ';':
case '#':
{
- if (names.size() == 0)
+ if (names.empty())
{
AddHeaderComment(line.substr(pLeft + 1));
}
@@ -168,8 +168,9 @@ bool cIniFile::ReadFile(const AString & a_FileName, bool a_AllowExampleRedirect)
} // while (getline())
f.close();
- if (names.size() == 0)
+ if (keys.empty() && names.empty() && comments.empty())
{
+ // File be empty or unreadable, equivalent to nonexistant
return false;
}
diff --git a/src/Authenticator.cpp b/src/Authenticator.cpp
deleted file mode 100644
index bd6db1c11..000000000
--- a/src/Authenticator.cpp
+++ /dev/null
@@ -1,267 +0,0 @@
-
-#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
-
-#include "Authenticator.h"
-#include "OSSupport/BlockingTCPLink.h"
-#include "Root.h"
-#include "Server.h"
-
-#include "inifile/iniFile.h"
-
-#include <sstream>
-
-
-
-
-
-#define DEFAULT_AUTH_SERVER "session.minecraft.net"
-#define DEFAULT_AUTH_ADDRESS "/game/checkserver.jsp?user=%USERNAME%&serverId=%SERVERID%"
-#define MAX_REDIRECTS 10
-
-
-
-
-
-cAuthenticator::cAuthenticator(void) :
- super("cAuthenticator"),
- m_Server(DEFAULT_AUTH_SERVER),
- m_Address(DEFAULT_AUTH_ADDRESS),
- m_ShouldAuthenticate(true)
-{
-}
-
-
-
-
-
-cAuthenticator::~cAuthenticator()
-{
- Stop();
-}
-
-
-
-
-
-void cAuthenticator::ReadINI(cIniFile & IniFile)
-{
- m_Server = IniFile.GetValueSet("Authentication", "Server", DEFAULT_AUTH_SERVER);
- m_Address = IniFile.GetValueSet("Authentication", "Address", DEFAULT_AUTH_ADDRESS);
- m_ShouldAuthenticate = IniFile.GetValueSetB("Authentication", "Authenticate", true);
-}
-
-
-
-
-
-void cAuthenticator::Authenticate(int a_ClientID, const AString & a_UserName, const AString & a_ServerHash)
-{
- if (!m_ShouldAuthenticate)
- {
- cRoot::Get()->AuthenticateUser(a_ClientID);
- return;
- }
-
- cCSLock Lock(m_CS);
- m_Queue.push_back(cUser(a_ClientID, a_UserName, a_ServerHash));
- m_QueueNonempty.Set();
-}
-
-
-
-
-
-void cAuthenticator::Start(cIniFile & IniFile)
-{
- ReadINI(IniFile);
- m_ShouldTerminate = false;
- super::Start();
-}
-
-
-
-
-
-void cAuthenticator::Stop(void)
-{
- m_ShouldTerminate = true;
- m_QueueNonempty.Set();
- Wait();
-}
-
-
-
-
-
-void cAuthenticator::Execute(void)
-{
- for (;;)
- {
- cCSLock Lock(m_CS);
- while (!m_ShouldTerminate && (m_Queue.size() == 0))
- {
- cCSUnlock Unlock(Lock);
- m_QueueNonempty.Wait();
- }
- if (m_ShouldTerminate)
- {
- return;
- }
- ASSERT(!m_Queue.empty());
-
- int ClientID = m_Queue.front().m_ClientID;
- AString UserName = m_Queue.front().m_Name;
- AString ActualAddress = m_Address;
- ReplaceString(ActualAddress, "%USERNAME%", UserName);
- ReplaceString(ActualAddress, "%SERVERID%", m_Queue.front().m_ServerID);
- m_Queue.pop_front();
- Lock.Unlock();
-
- if (!AuthFromAddress(m_Server, ActualAddress, UserName))
- {
- cRoot::Get()->KickUser(ClientID, "Failed to authenticate account!");
- }
- else
- {
- cRoot::Get()->AuthenticateUser(ClientID);
- }
- } // for (-ever)
-}
-
-
-
-
-
-bool cAuthenticator::AuthFromAddress(const AString & a_Server, const AString & a_Address, const AString & a_UserName, int a_Level /* = 1 */)
-{
- // Returns true if the user authenticated okay, false on error; iLevel is the recursion deptht (bails out if too deep)
-
- cBlockingTCPLink Link;
- if (!Link.Connect(a_Server.c_str(), 80))
- {
- LOGWARNING("%s: cannot connect to auth server \"%s\", kicking user \"%s\"",
- __FUNCTION__, a_Server.c_str(), a_UserName.c_str()
- );
- return false;
- }
-
- Link.SendMessage( AString( "GET " + a_Address + " HTTP/1.1\r\n" ).c_str());
- Link.SendMessage( AString( "User-Agent: MCServer\r\n" ).c_str());
- Link.SendMessage( AString( "Host: " + a_Server + "\r\n" ).c_str());
- //Link.SendMessage( AString( "Host: session.minecraft.net\r\n" ).c_str());
- Link.SendMessage( AString( "Accept: */*\r\n" ).c_str());
- Link.SendMessage( AString( "Connection: close\r\n" ).c_str()); //Close so we donīt have to mess with the Content-Length :)
- Link.SendMessage( AString( "\r\n" ).c_str());
- AString DataRecvd;
- Link.ReceiveData(DataRecvd);
- Link.CloseSocket();
-
- std::stringstream ss(DataRecvd);
-
- // Parse the data received:
- std::string temp;
- ss >> temp;
- bool bRedirect = false;
- bool bOK = false;
- if ((temp.compare("HTTP/1.1") == 0) || (temp.compare("HTTP/1.0") == 0))
- {
- int code;
- ss >> code;
- if (code == 302)
- {
- // redirect blabla
- LOGD("%s: Need to redirect, current level %d!", __FUNCTION__, a_Level);
- if (a_Level > MAX_REDIRECTS)
- {
- LOGERROR("cAuthenticator: received too many levels of redirection from auth server \"%s\" for user \"%s\", bailing out and kicking the user", a_Server.c_str(), a_UserName.c_str());
- return false;
- }
- bRedirect = true;
- }
- else if (code == 200)
- {
- LOGD("cAuthenticator: Received status 200 OK! :D");
- bOK = true;
- }
- }
- else
- {
- LOGERROR("cAuthenticator: cannot parse auth reply from server \"%s\" for user \"%s\", kicking the user.", a_Server.c_str(), a_UserName.c_str());
- return false;
- }
-
- if( bRedirect )
- {
- AString Location;
- // Search for "Location:"
- bool bFoundLocation = false;
- while( !bFoundLocation && ss.good() )
- {
- char c = 0;
- while( c != '\n' )
- {
- ss.get( c );
- }
- AString Name;
- ss >> Name;
- if (Name.compare("Location:") == 0)
- {
- bFoundLocation = true;
- ss >> Location;
- }
- }
- if (!bFoundLocation)
- {
- LOGERROR("cAuthenticator: received invalid redirection from auth server \"%s\" for user \"%s\", kicking user.", a_Server.c_str(), a_UserName.c_str());
- return false;
- }
-
- Location = Location.substr(strlen("http://"), std::string::npos); // Strip http://
- std::string Server = Location.substr( 0, Location.find( "/" ) ); // Only leave server address
- Location = Location.substr( Server.length(), std::string::npos);
- return AuthFromAddress(Server, Location, a_UserName, a_Level + 1);
- }
-
- if (!bOK)
- {
- LOGERROR("cAuthenticator: received an error from auth server \"%s\" for user \"%s\", kicking user.", a_Server.c_str(), a_UserName.c_str());
- return false;
- }
-
- // Header says OK, so receive the rest.
- // Go past header, double \n means end of headers
- char c = 0;
- while (ss.good())
- {
- while (c != '\n')
- {
- ss.get(c);
- }
- ss.get(c);
- if( c == '\n' || c == '\r' || ss.peek() == '\r' || ss.peek() == '\n' )
- break;
- }
- if (!ss.good())
- {
- LOGERROR("cAuthenticator: error while parsing response body from auth server \"%s\" for user \"%s\", kicking user.", a_Server.c_str(), a_UserName.c_str());
- return false;
- }
-
- std::string Result;
- ss >> Result;
- LOGD("cAuthenticator: Authentication result was %s", Result.c_str());
-
- if (Result.compare("YES") == 0) //Works well
- {
- LOGINFO("Authentication result \"YES\", player authentication success!");
- return true;
- }
-
-
- LOGINFO("Authentication result was \"%s\", player authentication failure!", Result.c_str());
- return false;
-}
-
-
-
-
diff --git a/src/BlockID.h b/src/BlockID.h
index 2fec512e2..a227245aa 100644
--- a/src/BlockID.h
+++ b/src/BlockID.h
@@ -503,6 +503,10 @@ enum
E_META_PLANKS_CONIFER = 1,
E_META_PLANKS_BIRCH = 2,
E_META_PLANKS_JUNGLE = 3,
+
+ // E_BLOCK_(XXX_WEIGHTED)_PRESSURE_PLATE metas:
+ E_META_PRESSURE_PLATE_RAISED = 0,
+ E_META_PRESSURE_PLATE_DEPRESSED = 1,
// E_BLOCK_QUARTZ_BLOCK metas:
E_META_QUARTZ_NORMAL = 0,
diff --git a/src/ChunkMap.cpp b/src/ChunkMap.cpp
index e695f0ab2..83eae2665 100644
--- a/src/ChunkMap.cpp
+++ b/src/ChunkMap.cpp
@@ -916,19 +916,21 @@ void cChunkMap::SetChunkData(
}
// Notify relevant ChunkStays:
- for (cChunkStays::iterator itr = m_ChunkStays.begin(); itr != m_ChunkStays.end(); )
+ cChunkStays ToBeDisabled;
+ for (cChunkStays::iterator itr = m_ChunkStays.begin(), end = m_ChunkStays.end(); itr != end; ++itr)
{
if ((*itr)->ChunkAvailable(a_ChunkX, a_ChunkZ))
{
- cChunkStays::iterator cur = itr;
- ++itr;
- m_ChunkStays.erase(cur);
- }
- else
- {
- ++itr;
+ // The chunkstay wants to be disabled, add it to a list of to-be-disabled chunkstays for later processing:
+ ToBeDisabled.push_back(*itr);
}
} // for itr - m_ChunkStays[]
+
+ // Disable (and possibly remove) the chunkstays that chose to get disabled:
+ for (cChunkStays::iterator itr = ToBeDisabled.begin(), end = ToBeDisabled.end(); itr != end; ++itr)
+ {
+ (*itr)->Disable();
+ }
}
// Notify plugins of the chunk becoming available
@@ -2974,7 +2976,12 @@ void cChunkMap::AddChunkStay(cChunkStay & a_ChunkStay)
Chunk->Stay(true);
if (Chunk->IsValid())
{
- a_ChunkStay.ChunkAvailable(itr->m_ChunkX, itr->m_ChunkZ);
+ if (a_ChunkStay.ChunkAvailable(itr->m_ChunkX, itr->m_ChunkZ))
+ {
+ // The chunkstay wants to be deactivated, disable it and bail out:
+ a_ChunkStay.Disable();
+ return;
+ }
}
} // for itr - WantedChunks[]
}
@@ -3017,6 +3024,7 @@ void cChunkMap::DelChunkStay(cChunkStay & a_ChunkStay)
}
Chunk->Stay(false);
} // for itr - Chunks[]
+ a_ChunkStay.OnDisabled();
}
diff --git a/src/ChunkStay.cpp b/src/ChunkStay.cpp
index 6b1d5ee34..b5002a63d 100644
--- a/src/ChunkStay.cpp
+++ b/src/ChunkStay.cpp
@@ -31,10 +31,7 @@ cChunkStay::~cChunkStay()
void cChunkStay::Clear(void)
{
- if (m_ChunkMap != NULL)
- {
- Disable();
- }
+ ASSERT(m_ChunkMap == NULL);
m_Chunks.clear();
}
@@ -97,8 +94,9 @@ void cChunkStay::Disable(void)
{
ASSERT(m_ChunkMap != NULL);
- m_ChunkMap->DelChunkStay(*this);
+ cChunkMap * ChunkMap = m_ChunkMap;
m_ChunkMap = NULL;
+ ChunkMap->DelChunkStay(*this);
}
diff --git a/src/ChunkStay.h b/src/ChunkStay.h
index 2510cb490..29893befc 100644
--- a/src/ChunkStay.h
+++ b/src/ChunkStay.h
@@ -36,8 +36,12 @@ class cChunkStay
{
public:
cChunkStay(void);
+
+ /** Deletes the object. Note that this calls Clear(), which means that the ChunkStay needs to be disabled. */
virtual ~cChunkStay();
+ /** Clears all the chunks that have been added.
+ To be used only while the ChunkStay object is not enabled. */
void Clear(void);
/** Adds a chunk to be locked from unloading.
diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp
index 5876e55c7..07e91f59a 100644
--- a/src/ClientHandle.cpp
+++ b/src/ClientHandle.cpp
@@ -24,13 +24,15 @@
#include "Root.h"
-#include "Authenticator.h"
+#include "Protocol/Authenticator.h"
#include "MersenneTwister.h"
#include "Protocol/ProtocolRecognizer.h"
#include "CompositeChat.h"
#include "Items/ItemSword.h"
+#include "md5/md5.h"
+
/** Maximum number of explosions to send this tick, server will start dropping if exceeded */
@@ -175,6 +177,39 @@ void cClientHandle::Destroy(void)
+void cClientHandle::GenerateOfflineUUID(void)
+{
+ m_UUID = GenerateOfflineUUID(m_Username);
+}
+
+
+
+
+
+AString cClientHandle::GenerateOfflineUUID(const AString & a_Username)
+{
+ // Proper format for a version 3 UUID is:
+ // xxxxxxxx-xxxx-3xxx-yxxx-xxxxxxxxxxxx where x is any hexadecimal digit and y is one of 8, 9, A, or B
+
+ // Generate an md5 checksum, and use it as base for the ID:
+ MD5 Checksum(a_Username);
+ AString UUID = Checksum.hexdigest();
+ UUID[12] = '3'; // Version 3 UUID
+ UUID[16] = '8'; // Variant 1 UUID
+
+ // Now the digest doesn't have the UUID slashes, but the client requires them, so add them into the appropriate positions:
+ UUID.insert(8, "-");
+ UUID.insert(13, "-");
+ UUID.insert(18, "-");
+ UUID.insert(23, "-");
+
+ return UUID;
+}
+
+
+
+
+
void cClientHandle::Kick(const AString & a_Reason)
{
if (m_State >= csAuthenticating) // Don't log pings
@@ -188,7 +223,7 @@ void cClientHandle::Kick(const AString & a_Reason)
-void cClientHandle::Authenticate(void)
+void cClientHandle::Authenticate(const AString & a_Name, const AString & a_UUID)
{
if (m_State != csAuthenticating)
{
@@ -197,6 +232,12 @@ void cClientHandle::Authenticate(void)
ASSERT( m_Player == NULL );
+ m_Username = a_Name;
+ m_UUID = a_UUID;
+
+ // Send login success (if the protocol supports it):
+ m_Protocol->SendLoginSuccess();
+
// Spawn player (only serversided, so data is loaded)
m_Player = new cPlayer(this, GetUsername());
@@ -1677,13 +1718,16 @@ void cClientHandle::Tick(float a_Dt)
}
// Send a ping packet:
- cTimer t1;
- if ((m_LastPingTime + cClientHandle::PING_TIME_MS <= t1.GetNowTime()))
+ if (m_State == csPlaying)
{
- m_PingID++;
- m_PingStartTime = t1.GetNowTime();
- m_Protocol->SendKeepAlive(m_PingID);
- m_LastPingTime = m_PingStartTime;
+ cTimer t1;
+ if ((m_LastPingTime + cClientHandle::PING_TIME_MS <= t1.GetNowTime()))
+ {
+ m_PingID++;
+ m_PingStartTime = t1.GetNowTime();
+ m_Protocol->SendKeepAlive(m_PingID);
+ m_LastPingTime = m_PingStartTime;
+ }
}
// Handle block break animation:
@@ -2101,7 +2145,7 @@ void cClientHandle::SendExplosion(double a_BlockX, double a_BlockY, double a_Blo
}
// Update the statistics:
- m_NumExplosionsThisTick += 1;
+ m_NumExplosionsThisTick++;
m_Protocol->SendExplosion(a_BlockX, a_BlockY, a_BlockZ, a_Radius, a_BlocksAffected, a_PlayerMotion);
}
diff --git a/src/ClientHandle.h b/src/ClientHandle.h
index 0c367ec7d..12e0256de 100644
--- a/src/ClientHandle.h
+++ b/src/ClientHandle.h
@@ -62,8 +62,22 @@ public:
cPlayer* GetPlayer() { return m_Player; } // tolua_export
+ const AString & GetUUID(void) const { return m_UUID; } // tolua_export
+ void SetUUID(const AString & a_UUID) { m_UUID = a_UUID; }
+
+ /** Generates an UUID based on the username stored for this client, and stores it in the m_UUID member.
+ This is used for the offline (non-auth) mode, when there's no UUID source.
+ Each username generates a unique and constant UUID, so that when the player reconnects with the same name, their UUID is the same.
+ Internally calls the GenerateOfflineUUID static function. */
+ void GenerateOfflineUUID(void);
+
+ /** Generates an UUID based on the player name provided.
+ This is used for the offline (non-auth) mode, when there's no UUID source.
+ Each username generates a unique and constant UUID, so that when the player reconnects with the same name, their UUID is the same. */
+ static AString GenerateOfflineUUID(const AString & a_Username); // tolua_export
+
void Kick(const AString & a_Reason); // tolua_export
- void Authenticate(void); // Called by cAuthenticator when the user passes authentication
+ void Authenticate(const AString & a_Name, const AString & a_UUID); // Called by cAuthenticator when the user passes authentication
void StreamChunks(void);
@@ -326,6 +340,7 @@ private:
static int s_ClientCount;
int m_UniqueID;
+ AString m_UUID;
/** Set to true when the chunk where the player is is sent to the client. Used for spawning the player */
bool m_HasSentPlayerChunk;
diff --git a/src/Defines.h b/src/Defines.h
index 1a8b3fa4a..9fa3b3a8e 100644
--- a/src/Defines.h
+++ b/src/Defines.h
@@ -493,15 +493,17 @@ inline void EulerToVector(double a_Pan, double a_Pitch, double & a_X, double & a
inline void VectorToEuler(double a_X, double a_Y, double a_Z, double & a_Pan, double & a_Pitch)
{
- if (fabs(a_X) < std::numeric_limits<double>::epsilon())
+ double r = sqrt((a_X * a_X) + (a_Z * a_Z));
+ if (r < std::numeric_limits<double>::epsilon())
{
- a_Pan = atan2(a_Z, a_X) * 180 / PI - 90;
+ a_Pan = 0;
}
else
{
- a_Pan = 0;
+ a_Pan = atan2(a_Z, a_X) * 180 / PI - 90;
}
- a_Pitch = atan2(a_Y, sqrt((a_X * a_X) + (a_Z * a_Z))) * 180 / PI;
+
+ a_Pitch = atan2(a_Y, r) * 180 / PI;
}
diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp
index 8ef45f1a5..56ef36ef8 100644
--- a/src/Entities/Entity.cpp
+++ b/src/Entities/Entity.cpp
@@ -330,7 +330,7 @@ void cEntity::DoTakeDamage(TakeDamageInfo & a_TDI)
AddSpeed(a_TDI.Knockback * 2);
}
- m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_HURT);
+ m_World->BroadcastEntityStatus(*this, esGenericHurt);
if (m_Health <= 0)
{
@@ -479,7 +479,7 @@ void cEntity::KilledBy(cEntity * a_Killer)
GetDrops(Drops, a_Killer);
m_World->SpawnItemPickups(Drops, GetPosX(), GetPosY(), GetPosZ());
- m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_DEAD);
+ m_World->BroadcastEntityStatus(*this, esGenericDead);
}
@@ -519,37 +519,36 @@ void cEntity::Tick(float a_Dt, cChunk & a_Chunk)
}
else
{
- if (a_Chunk.IsValid())
+ if (!a_Chunk.IsValid())
{
- cChunk * NextChunk = a_Chunk.GetNeighborChunk(POSX_TOINT, POSZ_TOINT);
-
- if ((NextChunk == NULL) || !NextChunk->IsValid())
- {
- return;
- }
+ return;
+ }
- TickBurning(*NextChunk);
+ // Position changed -> super::Tick() called
+ GET_AND_VERIFY_CURRENT_CHUNK(NextChunk, POSX_TOINT, POSZ_TOINT)
- if (GetPosY() < VOID_BOUNDARY)
- {
- TickInVoid(*NextChunk);
- }
- else
- {
- m_TicksSinceLastVoidDamage = 0;
- }
+ TickBurning(*NextChunk);
- if (IsMob() || IsPlayer())
- {
- // Set swimming state
- SetSwimState(*NextChunk);
+ if (GetPosY() < VOID_BOUNDARY)
+ {
+ TickInVoid(*NextChunk);
+ }
+ else
+ {
+ m_TicksSinceLastVoidDamage = 0;
+ }
- // Handle drowning
- HandleAir();
- }
+ if (IsMob() || IsPlayer())
+ {
+ // Set swimming state
+ SetSwimState(*NextChunk);
- HandlePhysics(a_Dt, *NextChunk);
+ // Handle drowning
+ HandleAir();
}
+
+ // None of the above functions change position, we remain in the chunk of NextChunk
+ HandlePhysics(a_Dt, *NextChunk);
}
}
@@ -559,34 +558,30 @@ void cEntity::Tick(float a_Dt, cChunk & a_Chunk)
void cEntity::HandlePhysics(float a_Dt, cChunk & a_Chunk)
{
+ int BlockX = POSX_TOINT;
+ int BlockY = POSY_TOINT;
+ int BlockZ = POSZ_TOINT;
+
+ // Position changed -> super::HandlePhysics() called
+ GET_AND_VERIFY_CURRENT_CHUNK(NextChunk, BlockX, BlockZ)
+
// TODO Add collision detection with entities.
a_Dt /= 1000; // Convert from msec to sec
- Vector3d NextPos = Vector3d(GetPosX(),GetPosY(),GetPosZ());
- Vector3d NextSpeed = Vector3d(GetSpeedX(),GetSpeedY(),GetSpeedZ());
- int BlockX = (int) floor(NextPos.x);
- int BlockY = (int) floor(NextPos.y);
- int BlockZ = (int) floor(NextPos.z);
+ Vector3d NextPos = Vector3d(GetPosX(), GetPosY(), GetPosZ());
+ Vector3d NextSpeed = Vector3d(GetSpeedX(), GetSpeedY(), GetSpeedZ());
if ((BlockY >= cChunkDef::Height) || (BlockY < 0))
{
- // Outside of the world
-
- cChunk * NextChunk = a_Chunk.GetNeighborChunk(BlockX, BlockZ);
- // See if we can commit our changes. If not, we will discard them.
- if (NextChunk != NULL)
- {
- SetSpeed(NextSpeed);
- NextPos += (NextSpeed * a_Dt);
- SetPosition(NextPos);
- }
-
+ // Outside of the world
+ AddSpeedY(m_Gravity * a_Dt);
+ AddPosition(GetSpeed() * a_Dt);
return;
}
- int RelBlockX = BlockX - (a_Chunk.GetPosX() * cChunkDef::Width);
- int RelBlockZ = BlockZ - (a_Chunk.GetPosZ() * cChunkDef::Width);
- BLOCKTYPE BlockIn = a_Chunk.GetBlock( RelBlockX, BlockY, RelBlockZ );
- BLOCKTYPE BlockBelow = (BlockY > 0) ? a_Chunk.GetBlock(RelBlockX, BlockY - 1, RelBlockZ) : E_BLOCK_AIR;
+ int RelBlockX = BlockX - (NextChunk->GetPosX() * cChunkDef::Width);
+ int RelBlockZ = BlockZ - (NextChunk->GetPosZ() * cChunkDef::Width);
+ BLOCKTYPE BlockIn = NextChunk->GetBlock( RelBlockX, BlockY, RelBlockZ );
+ BLOCKTYPE BlockBelow = (BlockY > 0) ? NextChunk->GetBlock(RelBlockX, BlockY - 1, RelBlockZ) : E_BLOCK_AIR;
if (!cBlockInfo::IsSolid(BlockIn)) // Making sure we are not inside a solid block
{
if (m_bOnGround) // check if it's still on the ground
@@ -616,7 +611,7 @@ void cEntity::HandlePhysics(float a_Dt, cChunk & a_Chunk)
bool IsNoAirSurrounding = true;
for (size_t i = 0; i < ARRAYCOUNT(gCrossCoords); i++)
{
- if (!a_Chunk.UnboundedRelGetBlockType(RelBlockX + gCrossCoords[i].x, BlockY, RelBlockZ + gCrossCoords[i].z, GotBlock))
+ if (!NextChunk->UnboundedRelGetBlockType(RelBlockX + gCrossCoords[i].x, BlockY, RelBlockZ + gCrossCoords[i].z, GotBlock))
{
// The pickup is too close to an unloaded chunk, bail out of any physics handling
return;
@@ -764,20 +759,8 @@ void cEntity::HandlePhysics(float a_Dt, cChunk & a_Chunk)
}
}
- BlockX = (int) floor(NextPos.x);
- BlockZ = (int) floor(NextPos.z);
-
- cChunk * NextChunk = a_Chunk.GetNeighborChunk(BlockX, BlockZ);
- // See if we can commit our changes. If not, we will discard them.
- if (NextChunk != NULL)
- {
- if (NextPos.x != GetPosX()) SetPosX(NextPos.x);
- if (NextPos.y != GetPosY()) SetPosY(NextPos.y);
- if (NextPos.z != GetPosZ()) SetPosZ(NextPos.z);
- if (NextSpeed.x != GetSpeedX()) SetSpeedX(NextSpeed.x);
- if (NextSpeed.y != GetSpeedY()) SetSpeedY(NextSpeed.y);
- if (NextSpeed.z != GetSpeedZ()) SetSpeedZ(NextSpeed.z);
- }
+ SetPosition(NextPos);
+ SetSpeed(NextSpeed);
}
@@ -788,6 +771,16 @@ void cEntity::TickBurning(cChunk & a_Chunk)
{
// Remember the current burning state:
bool HasBeenBurning = (m_TicksLeftBurning > 0);
+
+ if (GetWorld()->GetWeather() == eWeather_Rain)
+ {
+ if (HasBeenBurning)
+ {
+ m_TicksLeftBurning = 0;
+ OnFinishedBurning();
+ }
+ return;
+ }
// Do the burning damage:
if (m_TicksLeftBurning > 0)
@@ -806,7 +799,7 @@ void cEntity::TickBurning(cChunk & a_Chunk)
int MaxRelX = (int)floor(GetPosX() + m_Width / 2) - a_Chunk.GetPosX() * cChunkDef::Width;
int MinRelZ = (int)floor(GetPosZ() - m_Width / 2) - a_Chunk.GetPosZ() * cChunkDef::Width;
int MaxRelZ = (int)floor(GetPosZ() + m_Width / 2) - a_Chunk.GetPosZ() * cChunkDef::Width;
- int MinY = std::max(0, std::min(cChunkDef::Height - 1, (int)floor(GetPosY())));
+ int MinY = std::max(0, std::min(cChunkDef::Height - 1, POSY_TOINT));
int MaxY = std::max(0, std::min(cChunkDef::Height - 1, (int)ceil (GetPosY() + m_Height)));
bool HasWater = false;
bool HasLava = false;
@@ -981,13 +974,13 @@ void cEntity::HandleAir(void)
}
else
{
- m_AirTickTimer -= 1;
+ m_AirTickTimer--;
}
}
else
{
// Reduce air supply
- m_AirLevel -= 1;
+ m_AirLevel--;
}
}
else
@@ -1099,15 +1092,15 @@ void cEntity::TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ)
void cEntity::BroadcastMovementUpdate(const cClientHandle * a_Exclude)
{
- //We need to keep updating the clients when there is movement or if there was a change in speed and after 2 ticks
- if( (m_Speed.SqrLength() > 0.0004f || m_bDirtySpeed) && (m_World->GetWorldAge() - m_TimeLastSpeedPacket >= 2))
+ // Send velocity packet every two ticks if: speed is not negligible or speed was set (as indicated by the DirtySpeed flag)
+ if (((m_Speed.SqrLength() > 0.0004f) || m_bDirtySpeed) && ((m_World->GetWorldAge() - m_TimeLastSpeedPacket) >= 2))
{
m_World->BroadcastEntityVelocity(*this,a_Exclude);
m_bDirtySpeed = false;
m_TimeLastSpeedPacket = m_World->GetWorldAge();
}
- //Have to process position related packets this every two ticks
+ // Have to process position related packets this every two ticks
if (m_World->GetWorldAge() % 2 == 0)
{
int DiffX = (int) (floor(GetPosX() * 32.0) - floor(m_LastPosX * 32.0));
diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h
index 6e3f8292b..8f3899e2f 100644
--- a/src/Entities/Entity.h
+++ b/src/Entities/Entity.h
@@ -32,6 +32,8 @@
#define POSZ_TOINT (int)floor(GetPosZ())
#define POS_TOINT Vector3i(POSXTOINT, POSYTOINT, POSZTOINT)
+#define GET_AND_VERIFY_CURRENT_CHUNK(ChunkVarName, X, Z) cChunk * ChunkVarName = a_Chunk.GetNeighborChunk(X, Z); if ((ChunkVarName == NULL) || !ChunkVarName->IsValid()) { return; }
+
@@ -88,23 +90,42 @@ public:
} ;
// tolua_end
-
- enum
+
+ enum eEntityStatus
{
- ENTITY_STATUS_HURT = 2,
- ENTITY_STATUS_DEAD = 3,
- ENTITY_STATUS_WOLF_TAMING = 6,
- ENTITY_STATUS_WOLF_TAMED = 7,
- ENTITY_STATUS_WOLF_SHAKING = 8,
- ENTITY_STATUS_EATING_ACCEPTED = 9,
- ENTITY_STATUS_SHEEP_EATING = 10,
- ENTITY_STATUS_GOLEM_ROSING = 11,
- ENTITY_STATUS_VILLAGER_HEARTS = 12,
- ENTITY_STATUS_VILLAGER_ANGRY = 13,
- ENTITY_STATUS_VILLAGER_HAPPY = 14,
- ENTITY_STATUS_WITCH_MAGICKING = 15,
+ // TODO: Investiagate 0, 1, and 5 as Wiki.vg is not certain
+
+ // Entity becomes coloured red
+ esGenericHurt = 2,
+ // Entity plays death animation (entity falls to ground)
+ esGenericDead = 3,
+ // Iron Golem plays attack animation (arms lift and fall)
+ esIronGolemAttacking = 4,
+ // Wolf taming particles spawn (smoke)
+ esWolfTaming = 6,
+ // Wolf tamed particles spawn (hearts)
+ esWolfTamed = 7,
+ // Wolf plays water removal animation (shaking and water particles)
+ esWolfDryingWater = 8,
+ // Informs client that eating was accepted
+ esPlayerEatingAccepted = 9,
+ // Sheep plays eating animation (head lowers to ground)
+ esSheepEating = 10,
+ // Iron Golem holds gift to villager children
+ esIronGolemGivingPlant = 11,
+ // Villager spawns heart particles
+ esVillagerBreeding = 12,
+ // Villager spawns thunderclound particles
+ esVillagerAngry = 13,
+ // Villager spawns green crosses
+ esVillagerHappy = 14,
+ // Witch spawns magic particle (TODO: investigation into what this is)
+ esWitchMagicking = 15,
+
// It seems 16 (zombie conversion) is now done with metadata
- ENTITY_STATUS_FIREWORK_EXPLODE= 17,
+
+ // Informs client to explode a firework based on its metadata
+ esFireworkExploding = 17,
} ;
enum
@@ -118,7 +139,8 @@ public:
BURN_TICKS = 200, ///< How long to keep an entity burning after it has stood in lava / fire
MAX_AIR_LEVEL = 300, ///< Maximum air an entity can have
DROWNING_TICKS = 20, ///< Number of ticks per heart of damage
- VOID_BOUNDARY = -46 ///< At what position Y to begin applying void damage
+ VOID_BOUNDARY = -46, ///< At what position Y to begin applying void damage
+ FALL_DAMAGE_HEIGHT = 4 ///< At what position Y fall damage is applied
} ;
cEntity(eEntityType a_EntityType, double a_X, double a_Y, double a_Z, double a_Width, double a_Height);
diff --git a/src/Entities/Minecart.cpp b/src/Entities/Minecart.cpp
index 7f38aa35a..6db13231d 100644
--- a/src/Entities/Minecart.cpp
+++ b/src/Entities/Minecart.cpp
@@ -132,7 +132,7 @@ void cMinecart::HandlePhysics(float a_Dt, cChunk & a_Chunk)
return;
}
- int PosY = (int)floor(GetPosY());
+ int PosY = POSY_TOINT;
if ((PosY <= 0) || (PosY >= cChunkDef::Height))
{
// Outside the world, just process normal falling physics
@@ -141,8 +141,8 @@ void cMinecart::HandlePhysics(float a_Dt, cChunk & a_Chunk)
return;
}
- int RelPosX = (int)floor(GetPosX()) - a_Chunk.GetPosX() * cChunkDef::Width;
- int RelPosZ = (int)floor(GetPosZ()) - a_Chunk.GetPosZ() * cChunkDef::Width;
+ int RelPosX = POSX_TOINT - a_Chunk.GetPosX() * cChunkDef::Width;
+ int RelPosZ = POSZ_TOINT - a_Chunk.GetPosZ() * cChunkDef::Width;
cChunk * Chunk = a_Chunk.GetRelNeighborChunkAdjustCoords(RelPosX, RelPosZ);
if (Chunk == NULL)
{
@@ -195,7 +195,7 @@ void cMinecart::HandlePhysics(float a_Dt, cChunk & a_Chunk)
super::HandlePhysics(a_Dt, *Chunk);
}
- if (m_bIsOnDetectorRail && !Vector3i((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ())).Equals(m_DetectorRailPosition))
+ if (m_bIsOnDetectorRail && !Vector3i(POSX_TOINT, POSY_TOINT, POSZ_TOINT).Equals(m_DetectorRailPosition))
{
m_World->SetBlock(m_DetectorRailPosition.x, m_DetectorRailPosition.y, m_DetectorRailPosition.z, E_BLOCK_DETECTOR_RAIL, m_World->GetBlockMeta(m_DetectorRailPosition) & 0x07);
m_bIsOnDetectorRail = false;
@@ -203,7 +203,7 @@ void cMinecart::HandlePhysics(float a_Dt, cChunk & a_Chunk)
else if (WasDetectorRail)
{
m_bIsOnDetectorRail = true;
- m_DetectorRailPosition = Vector3i((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()));
+ m_DetectorRailPosition = Vector3i(POSX_TOINT, POSY_TOINT, POSZ_TOINT);
}
// Broadcast positioning changes to client
@@ -719,11 +719,11 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta)
{
if (GetSpeedZ() > 0)
{
- BLOCKTYPE Block = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)ceil(GetPosZ()));
+ BLOCKTYPE Block = m_World->GetBlock(POSX_TOINT, POSY_TOINT, (int)ceil(GetPosZ()));
if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block))
{
// We could try to detect a block in front based purely on coordinates, but xoft made a bounding box system - why not use? :P
- cBoundingBox bbBlock(Vector3d((int)floor(GetPosX()), (int)floor(GetPosY()), (int)ceil(GetPosZ())), 0.5, 1);
+ cBoundingBox bbBlock(Vector3d(POSX_TOINT, POSY_TOINT, (int)ceil(GetPosZ())), 0.5, 1);
cBoundingBox bbMinecart(Vector3d(GetPosX(), floor(GetPosY()), GetPosZ()), GetWidth() / 2, GetHeight());
if (bbBlock.DoesIntersect(bbMinecart))
@@ -736,10 +736,10 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta)
}
else if (GetSpeedZ() < 0)
{
- BLOCKTYPE Block = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) - 1);
+ BLOCKTYPE Block = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT - 1);
if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block))
{
- cBoundingBox bbBlock(Vector3d((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) - 1), 0.5, 1);
+ cBoundingBox bbBlock(Vector3d(POSX_TOINT, POSY_TOINT, POSZ_TOINT - 1), 0.5, 1);
cBoundingBox bbMinecart(Vector3d(GetPosX(), floor(GetPosY()), GetPosZ() - 1), GetWidth() / 2, GetHeight());
if (bbBlock.DoesIntersect(bbMinecart))
@@ -756,10 +756,10 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta)
{
if (GetSpeedX() > 0)
{
- BLOCKTYPE Block = m_World->GetBlock((int)ceil(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()));
+ BLOCKTYPE Block = m_World->GetBlock((int)ceil(GetPosX()), POSY_TOINT, POSZ_TOINT);
if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block))
{
- cBoundingBox bbBlock(Vector3d((int)ceil(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ())), 0.5, 1);
+ cBoundingBox bbBlock(Vector3d((int)ceil(GetPosX()), POSY_TOINT, POSZ_TOINT), 0.5, 1);
cBoundingBox bbMinecart(Vector3d(GetPosX(), floor(GetPosY()), GetPosZ()), GetWidth() / 2, GetHeight());
if (bbBlock.DoesIntersect(bbMinecart))
@@ -772,10 +772,10 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta)
}
else if (GetSpeedX() < 0)
{
- BLOCKTYPE Block = m_World->GetBlock((int)floor(GetPosX()) - 1, (int)floor(GetPosY()), (int)floor(GetPosZ()));
+ BLOCKTYPE Block = m_World->GetBlock(POSX_TOINT - 1, POSY_TOINT, POSZ_TOINT);
if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block))
{
- cBoundingBox bbBlock(Vector3d((int)floor(GetPosX()) - 1, (int)floor(GetPosY()), (int)floor(GetPosZ())), 0.5, 1);
+ cBoundingBox bbBlock(Vector3d(POSX_TOINT - 1, POSY_TOINT, POSZ_TOINT), 0.5, 1);
cBoundingBox bbMinecart(Vector3d(GetPosX() - 1, floor(GetPosY()), GetPosZ()), GetWidth() / 2, GetHeight());
if (bbBlock.DoesIntersect(bbMinecart))
@@ -793,10 +793,10 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta)
case E_META_RAIL_CURVED_ZP_XM:
case E_META_RAIL_CURVED_ZP_XP:
{
- BLOCKTYPE BlockXM = m_World->GetBlock((int)floor(GetPosX()) - 1, (int)floor(GetPosY()), (int)floor(GetPosZ()));
- BLOCKTYPE BlockXP = m_World->GetBlock((int)floor(GetPosX()) + 1, (int)floor(GetPosY()), (int)floor(GetPosZ()));
- BLOCKTYPE BlockZM = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) + 1);
- BLOCKTYPE BlockZP = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) + 1);
+ BLOCKTYPE BlockXM = m_World->GetBlock(POSX_TOINT - 1, POSY_TOINT, POSZ_TOINT);
+ BLOCKTYPE BlockXP = m_World->GetBlock(POSX_TOINT + 1, POSY_TOINT, POSZ_TOINT);
+ BLOCKTYPE BlockZM = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT + 1);
+ BLOCKTYPE BlockZP = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT + 1);
if (
(!IsBlockRail(BlockXM) && cBlockInfo::IsSolid(BlockXM)) ||
(!IsBlockRail(BlockXP) && cBlockInfo::IsSolid(BlockXP)) ||
@@ -805,7 +805,7 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta)
)
{
SetSpeed(0, 0, 0);
- SetPosition((int)floor(GetPosX()) + 0.5, GetPosY(), (int)floor(GetPosZ()) + 0.5);
+ SetPosition(POSX_TOINT + 0.5, GetPosY(), POSZ_TOINT + 0.5);
return true;
}
break;
@@ -822,7 +822,7 @@ bool cMinecart::TestEntityCollision(NIBBLETYPE a_RailMeta)
{
cMinecartCollisionCallback MinecartCollisionCallback(GetPosition(), GetHeight(), GetWidth(), GetUniqueID(), ((m_Attachee == NULL) ? -1 : m_Attachee->GetUniqueID()));
int ChunkX, ChunkZ;
- cChunkDef::BlockToChunk((int)floor(GetPosX()), (int)floor(GetPosZ()), ChunkX, ChunkZ);
+ cChunkDef::BlockToChunk(POSX_TOINT, POSZ_TOINT, ChunkX, ChunkZ);
m_World->ForEachEntityInChunk(ChunkX, ChunkZ, MinecartCollisionCallback);
if (!MinecartCollisionCallback.FoundIntersection())
diff --git a/src/Entities/Pickup.cpp b/src/Entities/Pickup.cpp
index 7fc89b62b..497b41683 100644
--- a/src/Entities/Pickup.cpp
+++ b/src/Entities/Pickup.cpp
@@ -98,45 +98,44 @@ void cPickup::Tick(float a_Dt, cChunk & a_Chunk)
if (!m_bCollected)
{
- int BlockY = (int) floor(GetPosY());
+ int BlockY = POSY_TOINT;
+ int BlockX = POSX_TOINT;
+ int BlockZ = POSZ_TOINT;
+
if ((BlockY >= 0) && (BlockY < cChunkDef::Height)) // Don't do anything except for falling when outside the world
{
- int BlockX = (int) floor(GetPosX());
- int BlockZ = (int) floor(GetPosZ());
// Position might have changed due to physics. So we have to make sure we have the correct chunk.
- cChunk * CurrentChunk = a_Chunk.GetNeighborChunk(BlockX, BlockZ);
- if (CurrentChunk != NULL) // Make sure the chunk is loaded
- {
- int RelBlockX = BlockX - (CurrentChunk->GetPosX() * cChunkDef::Width);
- int RelBlockZ = BlockZ - (CurrentChunk->GetPosZ() * cChunkDef::Width);
+ GET_AND_VERIFY_CURRENT_CHUNK(CurrentChunk, BlockX, BlockZ)
+
+ int RelBlockX = BlockX - (CurrentChunk->GetPosX() * cChunkDef::Width);
+ int RelBlockZ = BlockZ - (CurrentChunk->GetPosZ() * cChunkDef::Width);
- // If the pickup is on the bottommost block position, make it think the void is made of air: (#131)
- BLOCKTYPE BlockBelow = (BlockY > 0) ? CurrentChunk->GetBlock(RelBlockX, BlockY - 1, RelBlockZ) : E_BLOCK_AIR;
- BLOCKTYPE BlockIn = CurrentChunk->GetBlock(RelBlockX, BlockY, RelBlockZ);
-
- if (
- IsBlockLava(BlockBelow) || (BlockBelow == E_BLOCK_FIRE) ||
- IsBlockLava(BlockIn) || (BlockIn == E_BLOCK_FIRE)
- )
+ // If the pickup is on the bottommost block position, make it think the void is made of air: (#131)
+ BLOCKTYPE BlockBelow = (BlockY > 0) ? CurrentChunk->GetBlock(RelBlockX, BlockY - 1, RelBlockZ) : E_BLOCK_AIR;
+ BLOCKTYPE BlockIn = CurrentChunk->GetBlock(RelBlockX, BlockY, RelBlockZ);
+
+ if (
+ IsBlockLava(BlockBelow) || (BlockBelow == E_BLOCK_FIRE) ||
+ IsBlockLava(BlockIn) || (BlockIn == E_BLOCK_FIRE)
+ )
+ {
+ m_bCollected = true;
+ m_Timer = 0; // We have to reset the timer.
+ m_Timer += a_Dt; // In case we have to destroy the pickup in the same tick.
+ if (m_Timer > 500.f)
{
- m_bCollected = true;
- m_Timer = 0; // We have to reset the timer.
- m_Timer += a_Dt; // In case we have to destroy the pickup in the same tick.
- if (m_Timer > 500.f)
- {
- Destroy(true);
- return;
- }
+ Destroy(true);
+ return;
}
+ }
- if (!IsDestroyed()) // Don't try to combine if someone has tried to combine me
+ if (!IsDestroyed()) // Don't try to combine if someone has tried to combine me
+ {
+ cPickupCombiningCallback PickupCombiningCallback(GetPosition(), this);
+ m_World->ForEachEntity(PickupCombiningCallback); // Not ForEachEntityInChunk, otherwise pickups don't combine across chunk boundaries
+ if (PickupCombiningCallback.FoundMatchingPickup())
{
- cPickupCombiningCallback PickupCombiningCallback(GetPosition(), this);
- m_World->ForEachEntity(PickupCombiningCallback); // Not ForEachEntityInChunk, otherwise pickups don't combine across chunk boundaries
- if (PickupCombiningCallback.FoundMatchingPickup())
- {
- m_World->BroadcastEntityMetadata(*this);
- }
+ m_World->BroadcastEntityMetadata(*this);
}
}
}
@@ -156,7 +155,7 @@ void cPickup::Tick(float a_Dt, cChunk & a_Chunk)
return;
}
- if (GetPosY() < -8) // Out of this world and no more visible!
+ if (GetPosY() < VOID_BOUNDARY) // Out of this world and no more visible!
{
Destroy(true);
return;
diff --git a/src/Entities/Pickup.h b/src/Entities/Pickup.h
index 74b917bce..2dcbecaaf 100644
--- a/src/Entities/Pickup.h
+++ b/src/Entities/Pickup.h
@@ -49,9 +49,6 @@ public:
bool IsPlayerCreated(void) const { return m_bIsPlayerCreated; } // tolua_export
private:
- Vector3d m_ResultingSpeed; //Can be used to modify the resulting speed for the current tick ;)
-
- Vector3d m_WaterSpeed;
/** The number of ticks that the entity has existed / timer between collect and destroy; in msec */
float m_Timer;
diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp
index 7f2e5b4c2..2df0711b4 100644
--- a/src/Entities/Player.cpp
+++ b/src/Entities/Player.cpp
@@ -437,7 +437,7 @@ void cPlayer::SetTouchGround(bool a_bTouchGround)
cWorld * World = GetWorld();
if ((GetPosY() >= 0) && (GetPosY() < cChunkDef::Height))
{
- BLOCKTYPE BlockType = World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()));
+ BLOCKTYPE BlockType = World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT);
if (BlockType != E_BLOCK_AIR)
{
m_bTouchGround = true;
@@ -466,7 +466,7 @@ void cPlayer::SetTouchGround(bool a_bTouchGround)
TakeDamage(dtFalling, NULL, Damage, Damage, 0);
// Fall particles
- GetWorld()->BroadcastSoundParticleEffect(2006, (int)floor(GetPosX()), (int)GetPosY() - 1, (int)floor(GetPosZ()), Damage /* Used as particle effect speed modifier */);
+ GetWorld()->BroadcastSoundParticleEffect(2006, POSX_TOINT, (int)GetPosY() - 1, POSZ_TOINT, Damage /* Used as particle effect speed modifier */);
}
m_LastGroundHeight = (float)GetPosY();
@@ -590,7 +590,7 @@ void cPlayer::FinishEating(void)
m_EatingFinishTick = -1;
// Send the packets:
- m_ClientHandle->SendEntityStatus(*this, ENTITY_STATUS_EATING_ACCEPTED);
+ m_ClientHandle->SendEntityStatus(*this, esPlayerEatingAccepted);
m_World->BroadcastEntityAnimation(*this, 0);
m_World->BroadcastEntityMetadata(*this);
@@ -1519,22 +1519,16 @@ void cPlayer::LoadPermissionsFromDisk()
cIniFile IniFile;
if (IniFile.ReadFile("users.ini"))
{
- std::string Groups = IniFile.GetValue(m_PlayerName, "Groups", "");
- if (!Groups.empty())
+ AString Groups = IniFile.GetValueSet(m_PlayerName, "Groups", "Default");
+ AStringVector Split = StringSplitAndTrim(Groups, ",");
+
+ for (AStringVector::const_iterator itr = Split.begin(), end = Split.end(); itr != end; ++itr)
{
- AStringVector Split = StringSplitAndTrim(Groups, ",");
- for (AStringVector::const_iterator itr = Split.begin(), end = Split.end(); itr != end; ++itr)
+ if (!cRoot::Get()->GetGroupManager()->ExistsGroup(*itr))
{
- if (!cRoot::Get()->GetGroupManager()->ExistsGroup(*itr))
- {
- LOGWARNING("The group %s for player %s was not found!", itr->c_str(), m_PlayerName.c_str());
- }
- AddToGroup(*itr);
+ LOGWARNING("The group %s for player %s was not found!", itr->c_str(), m_PlayerName.c_str());
}
- }
- else
- {
- AddToGroup("Default");
+ AddToGroup(*itr);
}
AString Color = IniFile.GetValue(m_PlayerName, "Color", "-");
@@ -1546,8 +1540,10 @@ void cPlayer::LoadPermissionsFromDisk()
else
{
cGroupManager::GenerateDefaultUsersIni(IniFile);
+ IniFile.AddValue("Groups", m_PlayerName, "Default");
AddToGroup("Default");
}
+ IniFile.WriteFile("users.ini");
ResolvePermissions();
}
@@ -1899,9 +1895,9 @@ void cPlayer::ApplyFoodExhaustionFromMovement()
void cPlayer::Detach()
{
super::Detach();
- int PosX = (int)floor(GetPosX());
- int PosY = (int)floor(GetPosY());
- int PosZ = (int)floor(GetPosZ());
+ int PosX = POSX_TOINT;
+ int PosY = POSY_TOINT;
+ int PosZ = POSZ_TOINT;
// Search for a position within an area to teleport player after detachment
// Position must be solid land, and occupied by a nonsolid block
diff --git a/src/Entities/ProjectileEntity.cpp b/src/Entities/ProjectileEntity.cpp
index e86bb48bd..96db17ffd 100644
--- a/src/Entities/ProjectileEntity.cpp
+++ b/src/Entities/ProjectileEntity.cpp
@@ -791,7 +791,7 @@ void cFireworkEntity::Tick(float a_Dt, cChunk & a_Chunk)
if (m_ExplodeTimer == m_FireworkItem.m_FireworkItem.m_FlightTimeInTicks)
{
- m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_FIREWORK_EXPLODE);
+ m_World->BroadcastEntityStatus(*this, esFireworkExploding);
Destroy();
}
diff --git a/src/Generating/NetherFortGen.cpp b/src/Generating/NetherFortGen.cpp
index 02779a8a3..d90fdeb0a 100644
--- a/src/Generating/NetherFortGen.cpp
+++ b/src/Generating/NetherFortGen.cpp
@@ -71,6 +71,40 @@ public:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Performance test of the NetherFort generator:
+
+/*
+#include "OSSupport/Timer.h"
+static class cNetherFortPerfTest
+{
+public:
+ cNetherFortPerfTest(void)
+ {
+ cTimer Timer;
+ long long StartTime = Timer.GetNowTime();
+
+ const int GridSize = 512;
+ const int MaxDepth = 12;
+ const int NumIterations = 100;
+ for (int i = 0; i < NumIterations; i++)
+ {
+ cNetherFortGen FortGen(i, GridSize, MaxDepth);
+ delete new cNetherFortGen::cNetherFort(FortGen, 0, 0, GridSize, MaxDepth, i);
+ }
+
+ long long EndTime = Timer.GetNowTime();
+ printf("%d forts took %lld msec (%f sec) to generate\n", NumIterations, EndTime - StartTime, ((double)(EndTime - StartTime)) / 1000);
+ exit(0);
+ }
+
+} g_PerfTest;
+//*/
+
+
+
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// cNetherFortGen:
cNetherFortGen::cNetherFortGen(int a_Seed, int a_GridSize, int a_MaxDepth) :
@@ -80,9 +114,9 @@ cNetherFortGen::cNetherFortGen(int a_Seed, int a_GridSize, int a_MaxDepth) :
m_MaxDepth(a_MaxDepth)
{
// Initialize the prefabs:
- for (size_t i = 0; i < g_NetherFortPrefabs1Count; i++)
+ for (size_t i = 0; i < g_NetherFortPrefabsCount; i++)
{
- cPrefab * Prefab = new cPrefab(g_NetherFortPrefabs1[i]);
+ cPrefab * Prefab = new cPrefab(g_NetherFortPrefabs[i]);
m_AllPieces.push_back(Prefab);
if (Prefab->HasConnectorType(0))
{
@@ -95,15 +129,17 @@ cNetherFortGen::cNetherFortGen(int a_Seed, int a_GridSize, int a_MaxDepth) :
}
// Initialize the starting piece prefabs:
- for (size_t i = 0; i < g_NetherFortStartingPrefabs1Count; i++)
+ for (size_t i = 0; i < g_NetherFortStartingPrefabsCount; i++)
{
- m_StartingPieces.push_back(new cPrefab(g_NetherFortStartingPrefabs1[i]));
+ m_StartingPieces.push_back(new cPrefab(g_NetherFortStartingPrefabs[i]));
}
+ /*
// DEBUG: Try one round of placement:
cPlacedPieces Pieces;
cBFSPieceGenerator pg(*this, a_Seed);
pg.PlacePieces(0, 64, 0, a_MaxDepth, Pieces);
+ */
}
@@ -256,6 +292,15 @@ cPieces cNetherFortGen::GetStartingPieces(void)
+int cNetherFortGen::GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector, const cPiece & a_NewPiece)
+{
+ return ((const cPrefab &)a_NewPiece).GetPieceWeight(a_PlacedPiece, a_ExistingConnector);
+}
+
+
+
+
+
void cNetherFortGen::PiecePlaced(const cPiece & a_Piece)
{
UNUSED(a_Piece);
diff --git a/src/Generating/NetherFortGen.h b/src/Generating/NetherFortGen.h
index 10ba01396..d51596b9e 100644
--- a/src/Generating/NetherFortGen.h
+++ b/src/Generating/NetherFortGen.h
@@ -26,6 +26,7 @@ public:
virtual ~cNetherFortGen();
protected:
+ friend class cNetherFortPerfTest; // fwd: NetherFortGen.cpp
class cNetherFort; // fwd: NetherFortGen.cpp
typedef std::list<cNetherFort *> cNetherForts;
@@ -77,6 +78,7 @@ protected:
// cPiecePool overrides:
virtual cPieces GetPiecesWithConnector(int a_ConnectorType) override;
virtual cPieces GetStartingPieces(void) override;
+ virtual int GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector, const cPiece & a_NewPiece) override;
virtual void PiecePlaced(const cPiece & a_Piece) override;
virtual void Reset(void) override;
} ;
diff --git a/src/Generating/PieceGenerator.cpp b/src/Generating/PieceGenerator.cpp
index 8999a5ff7..8e9a48be6 100644
--- a/src/Generating/PieceGenerator.cpp
+++ b/src/Generating/PieceGenerator.cpp
@@ -392,14 +392,17 @@ bool cPieceGenerator::TryPlacePieceAtConnector(
Connections.reserve(AvailablePieces.size());
Vector3i ConnPos = a_Connector.m_Pos; // The position at which the new connector should be placed - 1 block away from the connector
AddFaceDirection(ConnPos.x, ConnPos.y, ConnPos.z, a_Connector.m_Direction);
-
- /*
- // DEBUG:
- printf("Placing piece at connector pos {%d, %d, %d}, direction %s\n", ConnPos.x, ConnPos.y, ConnPos.z, BlockFaceToString(a_Connector.m_Direction).c_str());
- //*/
-
+ int WeightTotal = 0;
for (cPieces::iterator itrP = AvailablePieces.begin(), endP = AvailablePieces.end(); itrP != endP; ++itrP)
{
+ // Get the relative chance of this piece being generated in this path:
+ int Weight = m_PiecePool.GetPieceWeight(a_ParentPiece, a_Connector, **itrP);
+ if (Weight <= 0)
+ {
+ continue;
+ }
+
+ // Try fitting each of the piece's connector:
cPiece::cConnectors Connectors = (*itrP)->GetConnectors();
for (cPiece::cConnectors::iterator itrC = Connectors.begin(), endC = Connectors.end(); itrC != endC; ++itrC)
{
@@ -419,7 +422,9 @@ bool cPieceGenerator::TryPlacePieceAtConnector(
// Doesn't fit in this rotation
continue;
}
- Connections.push_back(cConnection(**itrP, *itrC, NumCCWRotations));
+ // Fits, add it to list of possibile connections:
+ Connections.push_back(cConnection(**itrP, *itrC, NumCCWRotations, Weight));
+ WeightTotal += Weight;
} // for itrC - Connectors[]
} // for itrP - AvailablePieces[]
if (Connections.empty())
@@ -427,21 +432,23 @@ bool cPieceGenerator::TryPlacePieceAtConnector(
// No available connections, bail out
return false;
}
+ ASSERT(WeightTotal > 0);
- // Choose a random connection from the list:
- int rnd = m_Noise.IntNoise3DInt(a_Connector.m_Pos.x, a_Connector.m_Pos.y, a_Connector.m_Pos.z) / 7;
- cConnection & Conn = Connections[rnd % Connections.size()];
+ // Choose a random connection from the list, based on the weights:
+ int rnd = (m_Noise.IntNoise3DInt(a_Connector.m_Pos.x, a_Connector.m_Pos.y, a_Connector.m_Pos.z) / 7) % WeightTotal;
+ size_t ChosenIndex = 0;
+ for (cConnections::const_iterator itr = Connections.begin(), end = Connections.end(); itr != end; ++itr, ++ChosenIndex)
+ {
+ rnd -= itr->m_Weight;
+ if (rnd <= 0)
+ {
+ // This is the piece to choose
+ break;
+ }
+ }
+ cConnection & Conn = Connections[ChosenIndex];
// Place the piece:
- /*
- // DEBUG
- printf("Chosen connector at {%d, %d, %d}, direction %s, needs %d rotations\n",
- Conn.m_Connector.m_Pos.x, Conn.m_Connector.m_Pos.y, Conn.m_Connector.m_Pos.z,
- BlockFaceToString(Conn.m_Connector.m_Direction).c_str(),
- Conn.m_NumCCWRotations
- );
- //*/
-
Vector3i NewPos = Conn.m_Piece->RotatePos(Conn.m_Connector.m_Pos, Conn.m_NumCCWRotations);
ConnPos -= NewPos;
cPlacedPiece * PlacedPiece = new cPlacedPiece(&a_ParentPiece, *(Conn.m_Piece), ConnPos, Conn.m_NumCCWRotations);
@@ -449,12 +456,6 @@ bool cPieceGenerator::TryPlacePieceAtConnector(
// Add the new piece's connectors to the list of free connectors:
cPiece::cConnectors Connectors = Conn.m_Piece->GetConnectors();
-
- /*
- // DEBUG:
- printf("Adding %u connectors to the pool\n", Connectors.size() - 1);
- //*/
-
for (cPiece::cConnectors::const_iterator itr = Connectors.begin(), end = Connectors.end(); itr != end; ++itr)
{
if (itr->m_Pos.Equals(Conn.m_Connector.m_Pos))
@@ -524,10 +525,11 @@ void cPieceGenerator::DebugConnectorPool(const cPieceGenerator::cFreeConnectors
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// cPieceGenerator::cConnection:
-cPieceGenerator::cConnection::cConnection(cPiece & a_Piece, cPiece::cConnector & a_Connector, int a_NumCCWRotations) :
+cPieceGenerator::cConnection::cConnection(cPiece & a_Piece, cPiece::cConnector & a_Connector, int a_NumCCWRotations, int a_Weight) :
m_Piece(&a_Piece),
m_Connector(a_Connector),
- m_NumCCWRotations(a_NumCCWRotations)
+ m_NumCCWRotations(a_NumCCWRotations),
+ m_Weight(a_Weight)
{
}
diff --git a/src/Generating/PieceGenerator.h b/src/Generating/PieceGenerator.h
index bef9d3463..f4433b947 100644
--- a/src/Generating/PieceGenerator.h
+++ b/src/Generating/PieceGenerator.h
@@ -85,6 +85,13 @@ typedef std::vector<cPiece *> cPieces;
+// fwd:
+class cPlacedPiece;
+
+
+
+
+
/** This class is an interface that provides pieces for the generator. It can keep track of what pieces were
placed and adjust the returned piece vectors. */
class cPiecePool
@@ -101,6 +108,16 @@ public:
Multiple starting points are supported, one of the returned piece will be chosen. */
virtual cPieces GetStartingPieces(void) = 0;
+ /** Returns the relative weight with which the a_NewPiece is to be selected for placing under a_PlacedPiece through a_ExistingConnector.
+ This allows the pool to tweak the piece's chances, based on the previous pieces in the tree and the connector used.
+ The higher the number returned, the higher the chance the piece will be chosen. 0 means the piece will never be chosen.
+ */
+ virtual int GetPieceWeight(
+ const cPlacedPiece & a_PlacedPiece,
+ const cPiece::cConnector & a_ExistingConnector,
+ const cPiece & a_NewPiece
+ ) { return 1; }
+
/** Called after a piece is placed, to notify the pool that it has been used.
The pool may adjust the pieces it will return the next time. */
virtual void PiecePlaced(const cPiece & a_Piece) = 0;
@@ -157,8 +174,9 @@ protected:
cPiece * m_Piece; // The piece being connected
cPiece::cConnector m_Connector; // The piece's connector being used (relative non-rotated coords)
int m_NumCCWRotations; // Number of rotations necessary to match the two connectors
+ int m_Weight; // Relative chance that this connection will be chosen
- cConnection(cPiece & a_Piece, cPiece::cConnector & a_Connector, int a_NumCCWRotations);
+ cConnection(cPiece & a_Piece, cPiece::cConnector & a_Connector, int a_NumCCWRotations, int a_Weight);
};
typedef std::vector<cConnection> cConnections;
diff --git a/src/Generating/Prefab.cpp b/src/Generating/Prefab.cpp
index 131b6acb2..7d1762036 100644
--- a/src/Generating/Prefab.cpp
+++ b/src/Generating/Prefab.cpp
@@ -91,7 +91,19 @@ static const cPrefab::sDef g_TestPrefabDef =
7, /* 1, 2, 3 CCW rotations */
// Merge strategy:
- cBlockArea::msImprint
+ cBlockArea::msImprint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 10,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 1000,
};
static cPrefab g_TestPrefab(g_TestPrefabDef);
@@ -105,13 +117,17 @@ cPrefab::cPrefab(const cPrefab::sDef & a_Def) :
m_Size(a_Def.m_SizeX, a_Def.m_SizeY, a_Def.m_SizeZ),
m_HitBox(0, 0, 0, a_Def.m_SizeX - 1, a_Def.m_SizeY - 1, a_Def.m_SizeZ - 1),
m_AllowedRotations(a_Def.m_AllowedRotations),
- m_MergeStrategy(a_Def.m_MergeStrategy)
+ m_MergeStrategy(a_Def.m_MergeStrategy),
+ m_ShouldExtendFloor(a_Def.m_ShouldExtendFloor),
+ m_DefaultWeight(a_Def.m_DefaultWeight),
+ m_AddWeightIfSame(a_Def.m_AddWeightIfSame)
{
m_BlockArea[0].Create(m_Size);
CharMap cm;
ParseCharMap(cm, a_Def.m_CharMap);
ParseBlockImage(cm, a_Def.m_Image);
ParseConnectors(a_Def.m_Connectors);
+ ParseDepthWeight(a_Def.m_DepthWeight);
// 1 CCW rotation:
if ((m_AllowedRotations & 0x01) != 0)
@@ -142,12 +158,53 @@ cPrefab::cPrefab(const cPrefab::sDef & a_Def) :
void cPrefab::Draw(cChunkDesc & a_Dest, const cPlacedPiece * a_Placement) const
{
+ // Draw the basic image:
Vector3i Placement = a_Placement->GetCoords();
int ChunkStartX = a_Dest.GetChunkX() * cChunkDef::Width;
int ChunkStartZ = a_Dest.GetChunkZ() * cChunkDef::Width;
Placement.Move(-ChunkStartX, 0, -ChunkStartZ);
- a_Dest.WriteBlockArea(m_BlockArea[a_Placement->GetNumCCWRotations()], Placement.x, Placement.y, Placement.z, m_MergeStrategy);
+ const cBlockArea & Image = m_BlockArea[a_Placement->GetNumCCWRotations()];
+ a_Dest.WriteBlockArea(Image, Placement.x, Placement.y, Placement.z, m_MergeStrategy);
+ // If requested, draw the floor (from the bottom of the prefab down to the nearest non-air)
+ int MaxX = Image.GetSizeX();
+ int MaxZ = Image.GetSizeZ();
+ for (int z = 0; z < MaxZ; z++)
+ {
+ int RelZ = Placement.z + z;
+ if ((RelZ < 0) || (RelZ >= cChunkDef::Width))
+ {
+ // Z coord outside the chunk
+ continue;
+ }
+ for (int x = 0; x < MaxX; x++)
+ {
+ int RelX = Placement.x + x;
+ if ((RelX < 0) || (RelX >= cChunkDef::Width))
+ {
+ // X coord outside the chunk
+ continue;
+ }
+ BLOCKTYPE BlockType;
+ NIBBLETYPE BlockMeta;
+ Image.GetRelBlockTypeMeta(x, 0, z, BlockType, BlockMeta);
+ if ((BlockType == E_BLOCK_AIR) || (BlockType == E_BLOCK_SPONGE))
+ {
+ // Do not expand air nor sponge blocks
+ continue;
+ }
+ for (int y = Placement.y - 1; y >= 0; y--)
+ {
+ BLOCKTYPE ExistingBlock = a_Dest.GetBlockType(RelX, y, RelZ);
+ if (ExistingBlock != E_BLOCK_AIR)
+ {
+ // End the expansion for this column, reached the end
+ break;
+ }
+ a_Dest.SetBlockTypeMeta(RelX, y, RelZ, BlockType, BlockMeta);
+ } // for y
+ } // for x
+ } // for z
}
@@ -170,6 +227,26 @@ bool cPrefab::HasConnectorType(int a_ConnectorType) const
+int cPrefab::GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector) const
+{
+ // Use the default or per-depth weight:
+ cDepthWeight::const_iterator itr = m_DepthWeight.find(a_PlacedPiece.GetDepth() + 1);
+ int res = (itr == m_DepthWeight.end()) ? m_DefaultWeight : itr->second;
+
+ // If the piece is the same as the parent, apply the m_AddWeightIfSame modifier:
+ const cPiece * ParentPiece = &a_PlacedPiece.GetPiece();
+ const cPiece * ThisPiece = this;
+ if (ThisPiece == ParentPiece)
+ {
+ res += m_AddWeightIfSame;
+ }
+ return res;
+}
+
+
+
+
+
void cPrefab::ParseCharMap(CharMap & a_CharMapOut, const char * a_CharMapDef)
{
ASSERT(a_CharMapDef != NULL);
@@ -277,6 +354,54 @@ void cPrefab::ParseConnectors(const char * a_ConnectorsDef)
+void cPrefab::ParseDepthWeight(const char * a_DepthWeightDef)
+{
+ // The member needn't be defined at all, if so, skip:
+ if (a_DepthWeightDef == NULL)
+ {
+ return;
+ }
+
+ // Split into individual records: "Record | Record | Record"
+ AStringVector Defs = StringSplitAndTrim(a_DepthWeightDef, "|");
+
+ // Add each record's contents:
+ for (AStringVector::const_iterator itr = Defs.begin(), end = Defs.end(); itr != end; ++itr)
+ {
+ // Split into components: "Depth : Weight"
+ AStringVector Components = StringSplitAndTrim(*itr, ":");
+ if (Components.size() != 2)
+ {
+ LOGWARNING("Bad prefab DepthWeight record: \"%s\", skipping.", itr->c_str());
+ continue;
+ }
+
+ // Parse depth:
+ int Depth = atoi(Components[0].c_str());
+ if ((Depth == 0) && (Components[0] != "0"))
+ {
+ LOGWARNING("Bad prefab DepthWeight record, cannot parse depth \"%s\", skipping.", Components[0].c_str());
+ continue;
+ }
+
+ // Parse weight:
+ int Weight = atoi(Components[1].c_str());
+ if ((Weight == 0) && (Components[1] != "0"))
+ {
+ LOGWARNING("Bad prefab DepthWeight record, cannot parse weight \"%s\", skipping.", Components[1].c_str());
+ continue;
+ }
+
+ // Save to map:
+ ASSERT(m_DepthWeight.find(Depth) == m_DepthWeight.end()); // Not a duplicate
+ m_DepthWeight[Depth] = Weight;
+ } // for itr - Defs[]
+}
+
+
+
+
+
cPiece::cConnectors cPrefab::GetConnectors(void) const
{
return m_Connectors;
diff --git a/src/Generating/Prefab.h b/src/Generating/Prefab.h
index 04c4f09da..dbf882e21 100644
--- a/src/Generating/Prefab.h
+++ b/src/Generating/Prefab.h
@@ -37,11 +37,47 @@ public:
int m_SizeX;
int m_SizeY;
int m_SizeZ;
+
+ /** The mapping between characters in m_Image and the blocktype / blockmeta.
+ Format: "Char: BlockType: BlockMeta \n Char: BlockType : BlockMeta \n ..." */
const char * m_CharMap;
+
+ /** The actual image to be used for the prefab. Organized YZX (Y changes the least often).
+ Each character represents a single block, the type is mapped through m_CharMap. */
const char * m_Image;
+
+ /** List of connectors.
+ Format: "Type: X, Y, Z : Direction \n Type : X, Y, Z : Direction \n ...".
+ Type is an arbitrary number, Direction is the BlockFace constant value (0 .. 5). */
const char * m_Connectors;
+
+ /** Bitmask specifying the allowed rotations.
+ N rotations CCW are allowed if bit N is set. */
int m_AllowedRotations;
+
+ /** The merge strategy to use while drawing the prefab. */
cBlockArea::eMergeStrategy m_MergeStrategy;
+
+ /** If set to true, the prefab will extend its lowermost blocks until a solid block is found,
+ thus creating a foundation for the prefab. This is used for houses to be "on the ground", as well as
+ nether fortresses not to float. */
+ bool m_ShouldExtendFloor;
+
+ /** Chance of this piece being used, if no other modifier is active. */
+ int m_DefaultWeight;
+
+ /** Chances of this piece being used, per depth of the generated piece tree.
+ The starting piece has a depth of 0, the pieces connected to it are depth 1, etc.
+ The specified depth stands for the depth of the new piece (not the existing already-placed piece),
+ so valid depths start at 1.
+ Format: "Depth : Weight | Depth : Weight | Depth : Weight ..."
+ Depths that are not specified will use the m_DefaultWeight value. */
+ const char * m_DepthWeight;
+
+ /** The weight to add to this piece's base per-depth chance if the previous piece is the same.
+ Can be positive or negative.
+ This is used e. g. to make nether bridges prefer spanning multiple segments or to penalize turrets next to each other. */
+ int m_AddWeightIfSame;
};
cPrefab(const sDef & a_Def);
@@ -51,6 +87,10 @@ public:
/** Returns true if the prefab has any connector of the specified type. */
bool HasConnectorType(int a_ConnectorType) const;
+
+ /** Returns the weight (chance) of this prefab generating as the next piece after the specified placed piece.
+ PiecePool implementations can use this for their GetPieceWeight() implementations. */
+ int GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector) const;
protected:
/** Packs complete definition of a single block, for per-letter assignment. */
@@ -60,9 +100,12 @@ protected:
NIBBLETYPE m_BlockMeta;
};
- /** Maps letters in the sDef::m_Image onto a number, BlockType * 16 | BlockMeta */
+ /** Maps letters in the sDef::m_Image onto a sBlockTypeDef block type definition. */
typedef sBlockTypeDef CharMap[256];
+ /** Maps generator tree depth to weight. */
+ typedef std::map<int, int> cDepthWeight;
+
/** The cBlockArea that contains the block definitions for the prefab.
The index identifies the number of CCW rotations applied (0 = no rotation, 1 = 1 CCW rotation, ...). */
@@ -82,6 +125,26 @@ protected:
/** The merge strategy to use when drawing the prefab into a block area */
cBlockArea::eMergeStrategy m_MergeStrategy;
+
+ /** If set to true, the prefab will extend its lowermost blocks until a solid block is found,
+ thus creating a foundation for the prefab. This is used for houses to be "on the ground", as well as
+ nether fortresses not to float. */
+ bool m_ShouldExtendFloor;
+
+ /** Chance of this piece being used, if no other modifier is active. */
+ int m_DefaultWeight;
+
+ /** Chances of this piece being used, per depth of the generated piece tree.
+ The starting piece has a depth of 0, the pieces connected to it are depth 1, etc.
+ The specified depth stands for the depth of the new piece (not the existing already-placed piece),
+ so valid depths start at 1.
+ Depths that are not specified will use the m_DefaultWeight value. */
+ cDepthWeight m_DepthWeight;
+
+ /** The weight to add to this piece's base per-depth chance if the previous piece is the same.
+ Can be positive or negative.
+ This is used e. g. to make nether bridges prefer spanning multiple segments or to penalize turrets next to each other. */
+ int m_AddWeightIfSame;
// cPiece overrides:
@@ -98,6 +161,9 @@ protected:
/** Parses the connectors definition text into m_Connectors member. */
void ParseConnectors(const char * a_ConnectorsDef);
+
+ /** Parses the per-depth weight into m_DepthWeight member. */
+ void ParseDepthWeight(const char * a_DepthWeightDef);
};
diff --git a/src/Generating/Prefabs/NetherFortPrefabs.cpp b/src/Generating/Prefabs/NetherFortPrefabs.cpp
index 5e8685e32..7a46df5d8 100644
--- a/src/Generating/Prefabs/NetherFortPrefabs.cpp
+++ b/src/Generating/Prefabs/NetherFortPrefabs.cpp
@@ -1,7 +1,10 @@
// NetherFortPrefabs.cpp
-// Defines all the prefabs for nether forts
+// Defines the prefabs in the group NetherFort
+
+// NOTE: This file has been generated automatically by GalExport!
+// Any manual changes will be overwritten by the next automatic export!
#include "Globals.h"
#include "NetherFortPrefabs.h"
@@ -10,256 +13,302 @@
-/*
-The nether fortress has two types of connectors, Outer and Inner. Outer is Type 0, Inner is Type 1.
-*/
-
-
-
-
-
-const cPrefab::sDef g_NetherFortPrefabs1[] =
+const cPrefab::sDef g_NetherFortPrefabs[] =
{
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// BalconyCorridor:
- // The data has been exported from gallery Nether, area index 37, ID 288
+ // The data has been exported from the gallery Nether, area index 37, ID 288, created by Aloe_vera
{
// Size:
13, 7, 9, // SizeX = 13, SizeY = 7, SizeZ = 9
// Block definitions:
+ ".: 0: 0\n" /* air */
"a:112: 0\n" /* netherbrick */
- "b: 19: 0\n" /* sponge */
- "c:114: 4\n" /* netherbrickstairs */
- "d:114: 7\n" /* netherbrickstairs */
- "e:114: 5\n" /* netherbrickstairs */
- "f: 44: 6\n" /* step */
- "g:113: 0\n" /* netherbrickfence */
- "h:114: 2\n" /* netherbrickstairs */
- "i:114: 3\n" /* netherbrickstairs */
- "j:114: 0\n" /* netherbrickstairs */
- "k:114: 1\n" /* netherbrickstairs */
- ".: 0: 0\n" /* air */,
+ "b:114: 4\n" /* netherbrickstairs */
+ "c:114: 7\n" /* netherbrickstairs */
+ "d:114: 5\n" /* netherbrickstairs */
+ "e: 44: 6\n" /* step */
+ "f:113: 0\n" /* netherbrickfence */
+ "g:114: 2\n" /* netherbrickstairs */
+ "h:114: 3\n" /* netherbrickstairs */
+ "i:114: 0\n" /* netherbrickstairs */
+ "j:114: 1\n" /* netherbrickstairs */
+ "m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaa"
+ /* 5 */ "mmmmaaaaammmm"
+ /* 6 */ "mmmmmmmmmmmmm"
+ /* 7 */ "mmmmmmmmmmmmm"
+ /* 8 */ "mmmmmmmmmmmmm"
+
// Level 1
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "bbbbaaaaabbbb"
- "bbbbbbbbbbbbb"
- "bbbbbbbbbbbbb"
- "bbbbbbbbbbbbb"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaa"
+ /* 4 */ "aaaa.aaa.aaaa"
+ /* 5 */ "mmbcaaaaacdmm"
+ /* 6 */ "mmmbcccccdmmm"
+ /* 7 */ "mmmmmmmmmmmmm"
+ /* 8 */ "mmmmmmmmmmmmm"
// Level 2
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaa.aaa.aaaa"
- "bbcdaaaaadebb"
- "bbbcdddddebbb"
- "bbbbbbbbbbbbb"
- "bbbbbbbbbbbbb"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaaaaaa"
+ /* 1 */ "............."
+ /* 2 */ "............."
+ /* 3 */ "............."
+ /* 4 */ "aaaa.eee.aaaa"
+ /* 5 */ "mmaaaaaaaaamm"
+ /* 6 */ "mmaaaaaaaaamm"
+ /* 7 */ "mmaaaaaaaaamm"
+ /* 8 */ "mmaaaaaaaaamm"
// Level 3
- "aaaaaaaaaaaaa"
- "............."
- "............."
- "............."
- "aaaa.fff.aaaa"
- "bbaaaaaaaaabb"
- "bbaaaaaaaaabb"
- "bbaaaaaaaaabb"
- "bbaaaaaaaaabb"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "afafafafafafa"
+ /* 1 */ "............."
+ /* 2 */ "............."
+ /* 3 */ "............."
+ /* 4 */ "afaa.....aafa"
+ /* 5 */ "mmaaa...aaamm"
+ /* 6 */ "mmf.......fmm"
+ /* 7 */ "mmf.......fmm"
+ /* 8 */ "mmfffffffffmm"
// Level 4
- "agagagagagaga"
- "............."
- "............."
- "............."
- "agaa.....aaga"
- "bbaaa...aaabb"
- "bbg.......gbb"
- "bbg.......gbb"
- "bbgggggggggbb"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "afafafafafafa"
+ /* 1 */ "............."
+ /* 2 */ "............."
+ /* 3 */ "............."
+ /* 4 */ "afaa.....aafa"
+ /* 5 */ "mmaaa...aaamm"
+ /* 6 */ "mm.........mm"
+ /* 7 */ "mm.........mm"
+ /* 8 */ "mm.........mm"
// Level 5
- "agagagagagaga"
- "............."
- "............."
- "............."
- "agaa.....aaga"
- "bbaaa...aaabb"
- "bb.........bb"
- "bb.........bb"
- "bb.........bb"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "afafafafafafa"
+ /* 1 */ "............."
+ /* 2 */ "............."
+ /* 3 */ "............."
+ /* 4 */ "afaa.....aafa"
+ /* 5 */ "mmaaa...aaamm"
+ /* 6 */ "mm.........mm"
+ /* 7 */ "mm.........mm"
+ /* 8 */ "mm.........mm"
// Level 6
- "agagagagagaga"
- "............."
- "............."
- "............."
- "agaa.....aaga"
- "bbaaa...aaabb"
- "bb.........bb"
- "bb.........bb"
- "bb.........bb"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "ggggggggggggg"
+ /* 1 */ "aaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaa"
+ /* 4 */ "hhiaaaaaaahhh"
+ /* 5 */ "mmihhhhhhhjmm"
+ /* 6 */ "mmmmmmmmmmmmm"
+ /* 7 */ "mmmmmmmmmmmmm"
+ /* 8 */ "mmmmmmmmmmmmm",
+
+ // Connectors:
+ "1: 12, 2, 2: 5\n" /* Type 1, direction X+ */
+ "1: 0, 2, 2: 4\n" /* Type 1, direction X- */,
- // Level 7
- "hhhhhhhhhhhhh"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "iijaaaaaaaiii"
- "bbjiiiiiiikbb"
- "bbbbbbbbbbbbb"
- "bbbbbbbbbbbbb"
- "bbbbbbbbbbbbb",
-
- // Connections:
- "1: 0, 2, 2: 4\n" /* Type 1, BLOCK_FACE_XM */
- "1: 12, 2, 2: 5\n" /* Type 1, BLOCK_FACE_XP */,
-
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 20,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
}, // BalconyCorridor
+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// BalconyTee2:
- // The data has been exported from gallery Nether, area index 38, ID 289
+ // The data has been exported from the gallery Nether, area index 38, ID 289, created by Aloe_vera
{
// Size:
13, 7, 11, // SizeX = 13, SizeY = 7, SizeZ = 11
// Block definitions:
- "a: 19: 0\n" /* sponge */
- "b:112: 0\n" /* netherbrick */
- "c:114: 4\n" /* netherbrickstairs */
- "d:114: 7\n" /* netherbrickstairs */
- "e:114: 5\n" /* netherbrickstairs */
- "f: 44: 6\n" /* step */
- "g:113: 0\n" /* netherbrickfence */
- "h:114: 0\n" /* netherbrickstairs */
- "i:114: 1\n" /* netherbrickstairs */
- "j:114: 2\n" /* netherbrickstairs */
- "k:114: 3\n" /* netherbrickstairs */
- ".: 0: 0\n" /* air */,
+ ".: 0: 0\n" /* air */
+ "a:112: 0\n" /* netherbrick */
+ "b:114: 4\n" /* netherbrickstairs */
+ "c:114: 7\n" /* netherbrickstairs */
+ "d:114: 5\n" /* netherbrickstairs */
+ "e: 44: 6\n" /* step */
+ "f:113: 0\n" /* netherbrickfence */
+ "g:114: 0\n" /* netherbrickstairs */
+ "h:114: 1\n" /* netherbrickstairs */
+ "i:114: 2\n" /* netherbrickstairs */
+ "j:114: 3\n" /* netherbrickstairs */
+ "m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmmaaaaammmm"
+ /* 1 */ "mmmmaaaaammmm"
+ /* 2 */ "aaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaaa"
+ /* 7 */ "mmmmaaaaammmm"
+ /* 8 */ "mmmmmmmmmmmmm"
+ /* 9 */ "mmmmmmmmmmmmm"
+ /* 10 */ "mmmmmmmmmmmmm"
+
// Level 1
- "aaaabbbbbaaaa"
- "aaaabbbbbaaaa"
- "bbbbbbbbbbbbb"
- "bbbbbbbbbbbbb"
- "bbbbbbbbbbbbb"
- "bbbbbbbbbbbbb"
- "bbbbbbbbbbbbb"
- "aaaabbbbbaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmmaaaaammmm"
+ /* 1 */ "mmmmaaaaammmm"
+ /* 2 */ "aaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaaa"
+ /* 6 */ "aaaa.aaa.aaaa"
+ /* 7 */ "mmbcaaaaacdmm"
+ /* 8 */ "mmmbcccccdmmm"
+ /* 9 */ "mmmmmmmmmmmmm"
+ /* 10 */ "mmmmmmmmmmmmm"
// Level 2
- "aaaabbbbbaaaa"
- "aaaabbbbbaaaa"
- "bbbbbbbbbbbbb"
- "bbbbbbbbbbbbb"
- "bbbbbbbbbbbbb"
- "bbbbbbbbbbbbb"
- "bbbb.bbb.bbbb"
- "aacdbbbbbdeaa"
- "aaacdddddeaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmma...ammmm"
+ /* 1 */ "mmmma...ammmm"
+ /* 2 */ "aaaaa...aaaaa"
+ /* 3 */ "............."
+ /* 4 */ "............."
+ /* 5 */ "............."
+ /* 6 */ "aaaa.eee.aaaa"
+ /* 7 */ "mmaaaaaaaaamm"
+ /* 8 */ "mmaaaaaaaaamm"
+ /* 9 */ "mmaaaaaaaaamm"
+ /* 10 */ "mmaaaaaaaaamm"
// Level 3
- "aaaab...baaaa"
- "aaaab...baaaa"
- "bbbbb...bbbbb"
- "............."
- "............."
- "............."
- "bbbb.fff.bbbb"
- "aabbbbbbbbbaa"
- "aabbbbbbbbbaa"
- "aabbbbbbbbbaa"
- "aabbbbbbbbbaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmma...ammmm"
+ /* 1 */ "mmmmf...fmmmm"
+ /* 2 */ "afafa...afafa"
+ /* 3 */ "............."
+ /* 4 */ "............."
+ /* 5 */ "............."
+ /* 6 */ "afaa.....aafa"
+ /* 7 */ "mmaaa...aaamm"
+ /* 8 */ "mmf.......fmm"
+ /* 9 */ "mmf.......fmm"
+ /* 10 */ "mmfffffffffmm"
// Level 4
- "aaaab...baaaa"
- "aaaag...gaaaa"
- "bgbgb...bgbgb"
- "............."
- "............."
- "............."
- "bgbb.....bbgb"
- "aabbb...bbbaa"
- "aag.......gaa"
- "aag.......gaa"
- "aagggggggggaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmma...ammmm"
+ /* 1 */ "mmmmf...fmmmm"
+ /* 2 */ "afafa...afafa"
+ /* 3 */ "............."
+ /* 4 */ "............."
+ /* 5 */ "............."
+ /* 6 */ "afaa.....aafa"
+ /* 7 */ "mmaaa...aaamm"
+ /* 8 */ "mm.........mm"
+ /* 9 */ "mm.........mm"
+ /* 10 */ "mm.........mm"
// Level 5
- "aaaab...baaaa"
- "aaaag...gaaaa"
- "bgbgb...bgbgb"
- "............."
- "............."
- "............."
- "bgbb.....bbgb"
- "aabbb...bbbaa"
- "aa.........aa"
- "aa.........aa"
- "aa.........aa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmma...ammmm"
+ /* 1 */ "mmmmf...fmmmm"
+ /* 2 */ "afafa...afafa"
+ /* 3 */ "............."
+ /* 4 */ "............."
+ /* 5 */ "............."
+ /* 6 */ "afaa.....aafa"
+ /* 7 */ "mmaaa...aaamm"
+ /* 8 */ "mm.........mm"
+ /* 9 */ "mm.........mm"
+ /* 10 */ "mm.........mm"
// Level 6
- "aaaab...baaaa"
- "aaaag...gaaaa"
- "bgbgb...bgbgb"
- "............."
- "............."
- "............."
- "bgbb.....bbgb"
- "aabbb...bbbaa"
- "aa.........aa"
- "aa.........aa"
- "aa.........aa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmmgaaahmmmm"
+ /* 1 */ "mmmmgaaahmmmm"
+ /* 2 */ "iiiiiaaaiiiii"
+ /* 3 */ "aaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaaa"
+ /* 6 */ "jjgaaaaaaajjj"
+ /* 7 */ "mmgjjjjjjjhmm"
+ /* 8 */ "mmmmmmmmmmmmm"
+ /* 9 */ "mmmmmmmmmmmmm"
+ /* 10 */ "mmmmmmmmmmmmm",
+
+ // Connectors:
+ "1: 12, 2, 4: 5\n" /* Type 1, direction X+ */
+ "1: 6, 2, 0: 2\n" /* Type 1, direction Z- */
+ "1: 0, 2, 4: 4\n" /* Type 1, direction X- */,
- // Level 7
- "aaaahbbbiaaaa"
- "aaaahbbbiaaaa"
- "jjjjjbbbjjjjj"
- "bbbbbbbbbbbbb"
- "bbbbbbbbbbbbb"
- "bbbbbbbbbbbbb"
- "kkhbbbbbbbkkk"
- "aahkkkkkkkiaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa",
-
- // Connections:
- "1: 0, 2, 4: 4\n" /* Type 1, BLOCK_FACE_XM */
- "1: 12, 2, 4: 5\n" /* Type 1, BLOCK_FACE_XP */
- "1: 6, 2, 0: 2\n" /* Type 1, BLOCK_FACE_ZM */,
-
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 20,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
}, // BalconyTee2
+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // BlazePlatform
- // The data has been exported from gallery Nether, area index 26, ID 276
+ // BlazePlatform:
+ // The data has been exported from the gallery Nether, area index 26, ID 276, created by tonibm1999
{
// Size:
10, 7, 7, // SizeX = 10, SizeY = 7, SizeZ = 7
@@ -268,86 +317,114 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
".: 0: 0\n" /* air */
"a:112: 0\n" /* netherbrick */
"b: 52: 0\n" /* mobspawner */
- "c:113: 0\n" /* netherbrickfence */,
+ "c:113: 0\n" /* netherbrickfence */
+ "m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* */
+ /* * 0123456789 */
+ /* 0 */ "mmmmmmmmmm"
+ /* 1 */ "aaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaa"
+ /* 6 */ "mmmmmmmmmm"
+
// Level 1
- ".........."
- "aaaaaaaaaa"
- "aaaaaaaaaa"
- "aaaaaaaaaa"
- "aaaaaaaaaa"
- "aaaaaaaaaa"
- ".........."
+ /* z\x* */
+ /* * 0123456789 */
+ /* 0 */ "mmmmmmmmmm"
+ /* 1 */ "aaaaaaaaaa"
+ /* 2 */ "..aaaaaaaa"
+ /* 3 */ "..aaaaaaaa"
+ /* 4 */ "..aaaaaaaa"
+ /* 5 */ "aaaaaaaaaa"
+ /* 6 */ "mmmmmmmmmm"
// Level 2
- ".........."
- "aaaaaaaaaa"
- "..aaaaaaaa"
- "..aaaaaaaa"
- "..aaaaaaaa"
- "aaaaaaaaaa"
- ".........."
+ /* z\x* */
+ /* * 0123456789 */
+ /* 0 */ "mmmmaaaaaa"
+ /* 1 */ "aaaaaaaaaa"
+ /* 2 */ "...aaaaaaa"
+ /* 3 */ "...aaaaaaa"
+ /* 4 */ "...aaaaaaa"
+ /* 5 */ "aaaaaaaaaa"
+ /* 6 */ "mmmmaaaaaa"
// Level 3
- "....aaaaaa"
- "aaaaaaaaaa"
- "...aaaaaaa"
- "...aaaaaaa"
- "...aaaaaaa"
- "aaaaaaaaaa"
- "....aaaaaa"
+ /* z\x* */
+ /* * 0123456789 */
+ /* 0 */ "mmmmaaaaaa"
+ /* 1 */ "mmaaa....a"
+ /* 2 */ ".........a"
+ /* 3 */ "......b..a"
+ /* 4 */ ".........a"
+ /* 5 */ "mmaaa....a"
+ /* 6 */ "mmmmaaaaaa"
// Level 4
- "....aaaaaa"
- "..aaa....a"
- ".........a"
- "......b..a"
- ".........a"
- "..aaa....a"
- "....aaaaaa"
+ /* z\x* */
+ /* * 0123456789 */
+ /* 0 */ "mmmmcccccc"
+ /* 1 */ "mmmcc....c"
+ /* 2 */ ".........c"
+ /* 3 */ ".........c"
+ /* 4 */ ".........c"
+ /* 5 */ "mmmcc....c"
+ /* 6 */ "mmmmcccccc"
// Level 5
- "....cccccc"
- "...cc....c"
- ".........c"
- ".........c"
- ".........c"
- "...cc....c"
- "....cccccc"
+ /* z\x* */
+ /* * 0123456789 */
+ /* 0 */ "mmmmmmmmmm"
+ /* 1 */ "mmmmm....c"
+ /* 2 */ "m........c"
+ /* 3 */ "m........c"
+ /* 4 */ "m........c"
+ /* 5 */ "mmmmm....c"
+ /* 6 */ "mmmmmmmmmm"
// Level 6
- ".........."
- ".........c"
- ".........c"
- ".........c"
- ".........c"
- ".........c"
- ".........."
+ /* z\x* */
+ /* * 0123456789 */
+ /* 0 */ "mmmmmmmmmm"
+ /* 1 */ "mmmmm....m"
+ /* 2 */ "mm.......c"
+ /* 3 */ "mm.......c"
+ /* 4 */ "mm.......c"
+ /* 5 */ "mmmmm....m"
+ /* 6 */ "mmmmmmmmmm",
+
+ // Connectors:
+ "0: 0, 1, 3: 4\n" /* Type 0, direction X- */,
- // Level 7
- ".........."
- ".........."
- ".........c"
- ".........c"
- ".........c"
- ".........."
- "..........",
-
- // Connections:
- "0: 0, 1, 3: 4\n" /* Type 0, BLOCK_FACE_XM */,
-
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
}, // BlazePlatform
+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// BlazePlatformOverhang:
- // The data has been exported from gallery Nether, area index 20, ID 162
+ // The data has been exported from the gallery Nether, area index 20, ID 162, created by STR_Warrior
{
// Size:
14, 9, 7, // SizeX = 14, SizeY = 9, SizeZ = 7
@@ -366,101 +443,328 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
"m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "mmmmmmmmmmmmmm"
+ /* 1 */ "mmmmmmmmmmmmmm"
+ /* 2 */ "aammmmmmmmmmmm"
+ /* 3 */ "aammmmmmmmmmmm"
+ /* 4 */ "aammmmmmmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmm"
+ /* 6 */ "mmmmmmmmmmmmmm"
+
// Level 1
- "mmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmm"
- "aammmmmmmmmmmm"
- "aammmmmmmmmmmm"
- "aammmmmmmmmmmm"
- "mmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmm"
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "mmmmmmmmmmmmmm"
+ /* 1 */ "mmmmmmmmmmmmmm"
+ /* 2 */ "aabcmmmmmmmmmm"
+ /* 3 */ "aabcmmmmmmmmmm"
+ /* 4 */ "aabcmmmmmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmm"
+ /* 6 */ "mmmmmmmmmmmmmm"
// Level 2
- "mmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmm"
- "aabcmmmmmmmmmm"
- "aabcmmmmmmmmmm"
- "aabcmmmmmmmmmm"
- "mmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmm"
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "mmmmmmmmmmmmmm"
+ /* 1 */ "mmmmmmmmmmmmmm"
+ /* 2 */ "aaaaabmmmmmmmm"
+ /* 3 */ "aaaaabmmmmmmmm"
+ /* 4 */ "aaaaabmmmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmm"
+ /* 6 */ "mmmmmmmmmmmmmm"
// Level 3
- "mmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmm"
- "aaaaabmmmmmmmm"
- "aaaaabmmmmmmmm"
- "aaaaabmmmmmmmm"
- "mmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmm"
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "mmmmmmmmmmmmmm"
+ /* 1 */ "dddddddmmmmmmm"
+ /* 2 */ "aaaaaabmmmmmmm"
+ /* 3 */ "aaaaaabmmmmmmm"
+ /* 4 */ "aaaaaabmmmmmmm"
+ /* 5 */ "eeeeeeemmmmmmm"
+ /* 6 */ "mmmmmmmmmmmmmm"
// Level 4
- "mmmmmmmmmmmmmm"
- "dddddddmmmmmmm"
- "aaaaaabmmmmmmm"
- "aaaaaabmmmmmmm"
- "aaaaaabmmmmmmm"
- "eeeeeeemmmmmmm"
- "mmmmmmmmmmmmmm"
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "mmmmmmmmmmmmmm"
+ /* 1 */ "aaaaaaadmmmmmm"
+ /* 2 */ "aaaaaaabmmmmmm"
+ /* 3 */ "aaaaaaabmmmmmm"
+ /* 4 */ "aaaaaaabmmmmmm"
+ /* 5 */ "aaaaaaaemmmmmm"
+ /* 6 */ "mmmmmmmmmmmmmm"
// Level 5
- "mmmmmmmmmmmmmm"
- "aaaaaaadmmmmmm"
- "aaaaaaabmmmmmm"
- "aaaaaaabmmmmmm"
- "aaaaaaabmmmmmm"
- "aaaaaaaemmmmmm"
- "mmmmmmmmmmmmmm"
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "mmmmmmmmmmmmmm"
+ /* 1 */ "aaaaaaaabddddm"
+ /* 2 */ "......faaaaabm"
+ /* 3 */ "......faaaaabm"
+ /* 4 */ "......faaaaabm"
+ /* 5 */ "aaaaaaaaabeebm"
+ /* 6 */ "mmmmmmmmmmmmmm"
// Level 6
- "mmmmmmmmmmmmmm"
- "aaaaaaaabddddm"
- "......faaaaabm"
- "......faaaaabm"
- "......faaaaabm"
- "aaaaaaaaabeebm"
- "mmmmmmmmmmmmmm"
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "mmmmmmmmgdddbm"
+ /* 1 */ "mmmmmmaaaaaaad"
+ /* 2 */ ".......faaaaab"
+ /* 3 */ ".......faaaaab"
+ /* 4 */ ".......faaaaab"
+ /* 5 */ "mmmmmmaaaaaaae"
+ /* 6 */ "mmmmmmmmgeeebm"
// Level 7
- "mmmmmmmmgdddbm"
- "......aaaaaaad"
- ".......faaaaab"
- ".......faaaaab"
- ".......faaaaab"
- "......aaaaaaae"
- "mmmmmmmmgeeebm"
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "mmmmmmmmaaaaam"
+ /* 1 */ "mmmmmmhaa...aa"
+ /* 2 */ ".............a"
+ /* 3 */ "..........i..a"
+ /* 4 */ ".............a"
+ /* 5 */ "mmmmmmhaa...aa"
+ /* 6 */ "mmmmmmmmaaaaam"
// Level 8
- "mmmmmmmmaaaaam"
- "......haa...aa"
- ".............a"
- "..........i..a"
- ".............a"
- "......haa...aa"
- "mmmmmmmmaaaaam"
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "mmmmmmmmhhhhhm"
+ /* 1 */ "mmmmmmhhh...hh"
+ /* 2 */ ".............h"
+ /* 3 */ ".............h"
+ /* 4 */ ".............h"
+ /* 5 */ "mmmmmmhhh...hh"
+ /* 6 */ "mmmmmmmmhhhhhm",
+
+ // Connectors:
+ "0: 0, 5, 3: 4\n" /* Type 0, direction X- */,
- // Level 9
- "mmmmmmmmhhhhhm"
- "......hhh...hh"
- ".............h"
- ".............h"
- ".............h"
- "......hhh...hh"
- "mmmmmmmmhhhhhm",
+ // AllowedRotations:
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
+ // Merge strategy:
+ cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
+ }, // BlazePlatformOverhang
+
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // BridgeCircleCrossing:
+ // The data has been exported from the gallery Nether, area index 49, ID 308, created by Aloe_vera
+ {
+ // Size:
+ 15, 8, 15, // SizeX = 15, SizeY = 8, SizeZ = 15
+
+ // Block definitions:
+ ".: 0: 0\n" /* air */
+ "a:112: 0\n" /* netherbrick */
+ "b:114: 7\n" /* netherbrickstairs */
+ "c:114: 5\n" /* netherbrickstairs */
+ "d:114: 4\n" /* netherbrickstairs */
+ "e:114: 6\n" /* netherbrickstairs */
+ "m: 19: 0\n" /* sponge */,
- // Connections:
- "0: 0, 5, 3: 4\n" /* Type 0, BLOCK_FACE_XM */,
+ // Block data:
+ // Level 0
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmaaammmmmm"
+ /* 1 */ "mmmmmmaaammmmmm"
+ /* 2 */ "mmmmmmmmmmmmmmm"
+ /* 3 */ "mmmmmmmmmmmmmmm"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmmm"
+ /* 6 */ "aammmmmmmmmmmaa"
+ /* 7 */ "aammmmmmmmmmmaa"
+ /* 8 */ "aammmmmmmmmmmaa"
+ /* 9 */ "mmmmmmmmmmmmmmm"
+ /* 10 */ "mmmmmmmmmmmmmmm"
+ /* 11 */ "mmmmmmmmmmmmmmm"
+ /* 12 */ "mmmmmmmmmmmmmmm"
+ /* 13 */ "mmmmmmaaammmmmm"
+ /* 14 */ "mmmmmmaaammmmmm"
+
+ // Level 1
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmaaammmmmm"
+ /* 1 */ "mmmmmmaaammmmmm"
+ /* 2 */ "mmmmmmbbbmmmmmm"
+ /* 3 */ "mmmmmmmmmmmmmmm"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmmm"
+ /* 6 */ "aacmmmmmmmmmdaa"
+ /* 7 */ "aacmmmmmmmmmdaa"
+ /* 8 */ "aacmmmmmmmmmdaa"
+ /* 9 */ "mmmmmmmmmmmmmmm"
+ /* 10 */ "mmmmmmmmmmmmmmm"
+ /* 11 */ "mmmmmmmmmmmmmmm"
+ /* 12 */ "mmmmmmeeemmmmmm"
+ /* 13 */ "mmmmmmaaammmmmm"
+ /* 14 */ "mmmmmmaaammmmmm"
+
+ // Level 2
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmaaammmmmm"
+ /* 1 */ "mmmmmeaaammmmmm"
+ /* 2 */ "mmmmmdaaammmmmm"
+ /* 3 */ "mmmmmdbbbmmmmmm"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+ /* 5 */ "mdeemmmmmmmeecm"
+ /* 6 */ "aaacmmmmmmmdaaa"
+ /* 7 */ "aaacmmmmmmmdaaa"
+ /* 8 */ "aaacmmmmmmmdaaa"
+ /* 9 */ "mdbcmmmmmmmbbcm"
+ /* 10 */ "mmmmmmmmmmmmmmm"
+ /* 11 */ "mmmmmdeeecmmmmm"
+ /* 12 */ "mmmmmdaaacmmmmm"
+ /* 13 */ "mmmmmbaaabmmmmm"
+ /* 14 */ "mmmmmmaaammmmmm"
+
+ // Level 3
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "deeeedaaaceeeec"
+ /* 1 */ "daaaaaaaaaaaaac"
+ /* 2 */ "daaaaaaaaaaaaac"
+ /* 3 */ "daaaaaaaaaaaaac"
+ /* 4 */ "daaacbbaabdaaac"
+ /* 5 */ "eaaacmmmmmdaaae"
+ /* 6 */ "aaaacmmmmmdaaaa"
+ /* 7 */ "aaaacmmmmmdaaaa"
+ /* 8 */ "aaaacmmmmmdaaaa"
+ /* 9 */ "baaacmmmmmdaaab"
+ /* 10 */ "daaaceeeeedaaac"
+ /* 11 */ "daaaaaaaaaaaaac"
+ /* 12 */ "daaaaaaaaaaaaac"
+ /* 13 */ "daaaaaaaaaaaaac"
+ /* 14 */ "dbbbbdaaacbbbbb"
+
+ // Level 4
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaaaa"
+ /* 5 */ "aaaaammmmmaaaaa"
+ /* 6 */ "aaaaammmmmaaaaa"
+ /* 7 */ "aaaaammmmmaaaaa"
+ /* 8 */ "aaaaammmmmaaaaa"
+ /* 9 */ "aaaaammmmmaaaaa"
+ /* 10 */ "aaaaaaaaaaaaaaa"
+ /* 11 */ "aaaaaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaaaaa"
+ /* 13 */ "aaaaaaaaaaaaaaa"
+ /* 14 */ "aaaaaaaaaaaaaaa"
+
+ // Level 5
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaa...aaaaaa"
+ /* 1 */ "a.............a"
+ /* 2 */ "a.............a"
+ /* 3 */ "a.............a"
+ /* 4 */ "a...aaaaaaa...a"
+ /* 5 */ "a...ammmmma...a"
+ /* 6 */ "....ammmmma...."
+ /* 7 */ "....ammmmma...."
+ /* 8 */ "....ammmmma...."
+ /* 9 */ "a...ammmmma...a"
+ /* 10 */ "a...aaaaaaa...a"
+ /* 11 */ "a.............a"
+ /* 12 */ "a.............a"
+ /* 13 */ "a.............a"
+ /* 14 */ "aaaaaa...aaaaaa"
+
+ // Level 6
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmm...mmmmmm"
+ /* 1 */ "m.............m"
+ /* 2 */ "m.............m"
+ /* 3 */ "m.............m"
+ /* 4 */ "m.............m"
+ /* 5 */ "m....mmmmm....m"
+ /* 6 */ ".....mmmmm....."
+ /* 7 */ ".....mmmmm....."
+ /* 8 */ ".....mmmmm....."
+ /* 9 */ "m....mmmmm....m"
+ /* 10 */ "m.............m"
+ /* 11 */ "m.............m"
+ /* 12 */ "m.............m"
+ /* 13 */ "m.............m"
+ /* 14 */ "mmmmmm...mmmmmm"
+
+ // Level 7
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmm...mmmmmm"
+ /* 1 */ "m.............m"
+ /* 2 */ "m.............m"
+ /* 3 */ "m.............m"
+ /* 4 */ "m.............m"
+ /* 5 */ "m....mmmmm....m"
+ /* 6 */ ".....mmmmm....."
+ /* 7 */ ".....mmmmm....."
+ /* 8 */ ".....mmmmm....."
+ /* 9 */ "m....mmmmm....m"
+ /* 10 */ "m.............m"
+ /* 11 */ "m.............m"
+ /* 12 */ "m.............m"
+ /* 13 */ "m.............m"
+ /* 14 */ "mmmmmm...mmmmmm",
+
+ // Connectors:
+ "0: 0, 5, 7: 4\n" /* Type 0, direction X- */
+ "0: 7, 5, 0: 2\n" /* Type 0, direction Z- */
+ "0: 14, 5, 7: 5\n" /* Type 0, direction X+ */
+ "0: 7, 5, 14: 3\n" /* Type 0, direction Z+ */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
- }, // BlazePlatformOverhang
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 5,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
+ }, // BridgeCircleCrossing
+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// BridgeCrossing:
- // The data has been exported from gallery Nether, area index 17, ID 159
+ // The data has been exported from the gallery Nether, area index 17, ID 159, created by Aloe_vera
{
// Size:
15, 8, 15, // SizeX = 15, SizeY = 8, SizeZ = 15
@@ -476,297 +780,1107 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
"m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmaaammmmmm"
+ /* 1 */ "mmmmmmaaammmmmm"
+ /* 2 */ "mmmmmmmmmmmmmmm"
+ /* 3 */ "mmmmmmmmmmmmmmm"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmmm"
+ /* 6 */ "aammmmmmmmmmmaa"
+ /* 7 */ "aammmmmmmmmmmaa"
+ /* 8 */ "aammmmmmmmmmmaa"
+ /* 9 */ "mmmmmmmmmmmmmmm"
+ /* 10 */ "mmmmmmmmmmmmmmm"
+ /* 11 */ "mmmmmmmmmmmmmmm"
+ /* 12 */ "mmmmmmmmmmmmmmm"
+ /* 13 */ "mmmmmmaaammmmmm"
+ /* 14 */ "mmmmmmaaammmmmm"
+
// Level 1
- "mmmmmmaaammmmmm"
- "mmmmmmaaammmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "aammmmmmmmmmmaa"
- "aammmmmmmmmmmaa"
- "aammmmmmmmmmmaa"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmaaammmmmm"
- "mmmmmmaaammmmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmaaammmmmm"
+ /* 1 */ "mmmmmmaaammmmmm"
+ /* 2 */ "mmmmmmbbbmmmmmm"
+ /* 3 */ "mmmmmmmmmmmmmmm"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmmm"
+ /* 6 */ "aacmmmmmmmmmdaa"
+ /* 7 */ "aacmmmmmmmmmdaa"
+ /* 8 */ "aacmmmmmmmmmdaa"
+ /* 9 */ "mmmmmmmmmmmmmmm"
+ /* 10 */ "mmmmmmmmmmmmmmm"
+ /* 11 */ "mmmmmmmmmmmmmmm"
+ /* 12 */ "mmmmmmeeemmmmmm"
+ /* 13 */ "mmmmmmaaammmmmm"
+ /* 14 */ "mmmmmmaaammmmmm"
// Level 2
- "mmmmmmaaammmmmm"
- "mmmmmmaaammmmmm"
- "mmmmmmbbbmmmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "aacmmmmmmmmmdaa"
- "aacmmmmmmmmmdaa"
- "aacmmmmmmmmmdaa"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmeeemmmmmm"
- "mmmmmmaaammmmmm"
- "mmmmmmaaammmmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmaaammmmmm"
+ /* 1 */ "mmmmmmaaammmmmm"
+ /* 2 */ "mmmmmmaaammmmmm"
+ /* 3 */ "mmmmmmbbbmmmmmm"
+ /* 4 */ "mmmmmmfffmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmmm"
+ /* 6 */ "aaacfmmmmmfdaaa"
+ /* 7 */ "aaacfmmmmmfdaaa"
+ /* 8 */ "aaacfmmmmmfdaaa"
+ /* 9 */ "mmmmmmmmmmmmmmm"
+ /* 10 */ "mmmmmmfffmmmmmm"
+ /* 11 */ "mmmmmmeeemmmmmm"
+ /* 12 */ "mmmmmmaaammmmmm"
+ /* 13 */ "mmmmmmaaammmmmm"
+ /* 14 */ "mmmmmmaaammmmmm"
// Level 3
- "mmmmmmaaammmmmm"
- "mmmmmmaaammmmmm"
- "mmmmmmaaammmmmm"
- "mmmmmmbbbmmmmmm"
- "mmmmmmfffmmmmmm"
- "mmmmmmmmmmmmmmm"
- "aaacfmmmmmfdaaa"
- "aaacfmmmmmfdaaa"
- "aaacfmmmmmfdaaa"
- "mmmmmmmmmmmmmmm"
- "mmmmmmfffmmmmmm"
- "mmmmmmeeemmmmmm"
- "mmmmmmaaammmmmm"
- "mmmmmmaaammmmmm"
- "mmmmmmaaammmmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmdaaacmmmmm"
+ /* 1 */ "mmmmmdaaacmmmmm"
+ /* 2 */ "mmmmmdaaacmmmmm"
+ /* 3 */ "mmmmmdaaacmmmmm"
+ /* 4 */ "mmmmmdaaacmmmmm"
+ /* 5 */ "eeeeeeaaaeeeeee"
+ /* 6 */ "aaaaaaaaaaaaaaa"
+ /* 7 */ "aaaaaaaaaaaaaaa"
+ /* 8 */ "aaaaaaaaaaaaaaa"
+ /* 9 */ "bbbbbdaaacbbbbb"
+ /* 10 */ "mmmmmdaaacmmmmm"
+ /* 11 */ "mmmmmdaaacmmmmm"
+ /* 12 */ "mmmmmdaaacmmmmm"
+ /* 13 */ "mmmmmdaaacmmmmm"
+ /* 14 */ "mmmmmdaaacmmmmm"
// Level 4
- "mmmmmdaaacmmmmm"
- "mmmmmdaaacmmmmm"
- "mmmmmdaaacmmmmm"
- "mmmmmdaaacmmmmm"
- "mmmmmdaaacmmmmm"
- "eeeeeeaaaeeeeee"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "bbbbbdaaacbbbbb"
- "mmmmmdaaacmmmmm"
- "mmmmmdaaacmmmmm"
- "mmmmmdaaacmmmmm"
- "mmmmmdaaacmmmmm"
- "mmmmmdaaacmmmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmaaaaammmmm"
+ /* 1 */ "mmmmmaaaaammmmm"
+ /* 2 */ "mmmmmaaaaammmmm"
+ /* 3 */ "mmmmmaaaaammmmm"
+ /* 4 */ "mmmmmaaaaammmmm"
+ /* 5 */ "aaaaaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaaaaa"
+ /* 7 */ "aaaaaaaaaaaaaaa"
+ /* 8 */ "aaaaaaaaaaaaaaa"
+ /* 9 */ "aaaaaaaaaaaaaaa"
+ /* 10 */ "mmmmmaaaaammmmm"
+ /* 11 */ "mmmmmaaaaammmmm"
+ /* 12 */ "mmmmmaaaaammmmm"
+ /* 13 */ "mmmmmaaaaammmmm"
+ /* 14 */ "mmmmmaaaaammmmm"
// Level 5
- "mmmmmaaaaammmmm"
- "mmmmmaaaaammmmm"
- "mmmmmaaaaammmmm"
- "mmmmmaaaaammmmm"
- "mmmmmaaaaammmmm"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "mmmmmaaaaammmmm"
- "mmmmmaaaaammmmm"
- "mmmmmaaaaammmmm"
- "mmmmmaaaaammmmm"
- "mmmmmaaaaammmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmma...ammmmm"
+ /* 1 */ "mmmmma...ammmmm"
+ /* 2 */ "mmmmma...ammmmm"
+ /* 3 */ "mmmmma...ammmmm"
+ /* 4 */ "mmmmma...ammmmm"
+ /* 5 */ "aaaaaa...aaaaaa"
+ /* 6 */ "..............."
+ /* 7 */ "..............."
+ /* 8 */ "..............."
+ /* 9 */ "aaaaaa...aaaaaa"
+ /* 10 */ "mmmmma...ammmmm"
+ /* 11 */ "mmmmma...ammmmm"
+ /* 12 */ "mmmmma...ammmmm"
+ /* 13 */ "mmmmma...ammmmm"
+ /* 14 */ "mmmmma...ammmmm"
// Level 6
- "mmmmma...ammmmm"
- "mmmmma...ammmmm"
- "mmmmma...ammmmm"
- "mmmmma...ammmmm"
- "mmmmma...ammmmm"
- "aaaaaa...aaaaaa"
- "..............."
- "..............."
- "..............."
- "aaaaaa...aaaaaa"
- "mmmmma...ammmmm"
- "mmmmma...ammmmm"
- "mmmmma...ammmmm"
- "mmmmma...ammmmm"
- "mmmmma...ammmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmm...mmmmmm"
+ /* 1 */ "mmmmmm...mmmmmm"
+ /* 2 */ "mmmmmm...mmmmmm"
+ /* 3 */ "mmmmmm...mmmmmm"
+ /* 4 */ "mmmmmm...mmmmmm"
+ /* 5 */ "mmmmmm...mmmmmm"
+ /* 6 */ "..............."
+ /* 7 */ "..............."
+ /* 8 */ "..............."
+ /* 9 */ "mmmmmm...mmmmmm"
+ /* 10 */ "mmmmmm...mmmmmm"
+ /* 11 */ "mmmmmm...mmmmmm"
+ /* 12 */ "mmmmmm...mmmmmm"
+ /* 13 */ "mmmmmm...mmmmmm"
+ /* 14 */ "mmmmmm...mmmmmm"
// Level 7
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "..............."
- "..............."
- "..............."
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
-
- // Level 8
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "..............."
- "..............."
- "..............."
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm",
-
- // Connections:
- "0: 0, 5, 7: 4\n" /* Type 0, BLOCK_FACE_XM */
- "0: 7, 5, 0: 2\n" /* Type 0, BLOCK_FACE_ZM */
- "0: 14, 5, 7: 5\n" /* Type 0, BLOCK_FACE_XP */
- "0: 7, 5, 14: 3\n" /* Type 0, BLOCK_FACE_ZP */,
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmm...mmmmmm"
+ /* 1 */ "mmmmmm...mmmmmm"
+ /* 2 */ "mmmmmm...mmmmmm"
+ /* 3 */ "mmmmmm...mmmmmm"
+ /* 4 */ "mmmmmm...mmmmmm"
+ /* 5 */ "mmmmmm...mmmmmm"
+ /* 6 */ "..............."
+ /* 7 */ "..............."
+ /* 8 */ "..............."
+ /* 9 */ "mmmmmm...mmmmmm"
+ /* 10 */ "mmmmmm...mmmmmm"
+ /* 11 */ "mmmmmm...mmmmmm"
+ /* 12 */ "mmmmmm...mmmmmm"
+ /* 13 */ "mmmmmm...mmmmmm"
+ /* 14 */ "mmmmmm...mmmmmm",
+
+ // Connectors:
+ "0: 0, 5, 7: 4\n" /* Type 0, direction X- */
+ "0: 7, 5, 0: 2\n" /* Type 0, direction Z- */
+ "0: 7, 5, 14: 3\n" /* Type 0, direction Z+ */
+ "0: 14, 5, 7: 5\n" /* Type 0, direction X+ */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 10,
+
+ // DepthWeight:
+ "1:1000",
+
+ // AddWeightIfSame:
+ 0,
}, // BridgeCrossing
+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// BridgeCrumble1:
- // The data has been exported from gallery Nether, area index 19, ID 161
+ // The data has been exported from the gallery Nether, area index 19, ID 161, created by Aloe_vera
{
// Size:
9, 6, 5, // SizeX = 9, SizeY = 6, SizeZ = 5
// Block definitions:
- ".: 19: 0\n" /* sponge */
+ ".: 0: 0\n" /* air */
"a:112: 0\n" /* netherbrick */
"b:114: 5\n" /* netherbrickstairs */
"c: 44:14\n" /* step */
"d:114: 6\n" /* netherbrickstairs */
- "e:114: 7\n" /* netherbrickstairs */,
+ "e:114: 7\n" /* netherbrickstairs */
+ "m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 012345678 */
+ /* 0 */ "mmmmmmmmm"
+ /* 1 */ "aammmmmmm"
+ /* 2 */ "aammmmmmm"
+ /* 3 */ "aammmmmmm"
+ /* 4 */ "mmmmmmmmm"
+
// Level 1
- "........."
- "aa......."
- "aa......."
- "aa......."
- "........."
+ /* z\x* 012345678 */
+ /* 0 */ "mmmmmmmmm"
+ /* 1 */ "aabmmmmmm"
+ /* 2 */ "aabmmmmmm"
+ /* 3 */ "aabmmmmmm"
+ /* 4 */ "mmmmmmmmm"
// Level 2
- "........."
- "aab......"
- "aab......"
- "aab......"
- "........."
+ /* z\x* 012345678 */
+ /* 0 */ "mmmmmmmmm"
+ /* 1 */ "aaabcmmmm"
+ /* 2 */ "aaabcmmmm"
+ /* 3 */ "aaabcmmmm"
+ /* 4 */ "mmmmmmmmm"
// Level 3
- "........."
- "aaabc...."
- "aaabc...."
- "aaabc...."
- "........."
+ /* z\x* 012345678 */
+ /* 0 */ "dddddddmm"
+ /* 1 */ "aaaaaaaam"
+ /* 2 */ "aaaaaaaaa"
+ /* 3 */ "aaaaaaamm"
+ /* 4 */ "eeeeemmmm"
// Level 4
- "ddddddd.."
- "aaaaaaaa."
- "aaaaaaaaa"
- "aaaaaaa.."
- "eeeee...."
+ /* z\x* 012345678 */
+ /* 0 */ "aaaaaaaaa"
+ /* 1 */ "aaaaammmm"
+ /* 2 */ "aaaaaammm"
+ /* 3 */ "aaaaaammm"
+ /* 4 */ "aaaaaaaam"
// Level 5
- "aaaaaaaaa"
- "aaaaa...."
- "aaaaaa..."
- "aaaaaa..."
- "aaaaaaaa."
-
- // Level 6
- "aaaaaa..."
- "........."
- "........."
- "........."
- "aaaaaaa..",
+ /* z\x* 012345678 */
+ /* 0 */ "aaaaaammm"
+ /* 1 */ "mmmmmmmmm"
+ /* 2 */ "mmmmmmmmm"
+ /* 3 */ "mmmmmmmmm"
+ /* 4 */ "aaaaaaamm",
- // Connections:
- "0: 0, 5, 2: 4\n" /* Type 0, BLOCK_FACE_XM */,
+ // Connectors:
+ "1: 0, 5, 2: 4\n" /* Type 1, direction X- */
+ "0: 0, 5, 2: 4\n" /* Type 0, direction X- */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "1:0",
+
+ // AddWeightIfSame:
+ 0,
}, // BridgeCrumble1
+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // BridgeCrumble2
- // The data has been exported from gallery Nether, area index 18, ID 160
+ // BridgeCrumble2:
+ // The data has been exported from the gallery Nether, area index 18, ID 160, created by Aloe_vera
{
// Size:
13, 6, 5, // SizeX = 13, SizeY = 6, SizeZ = 5
// Block definitions:
- ".: 19: 0\n" /* sponge */
+ ".: 0: 0\n" /* air */
"a:112: 0\n" /* netherbrick */
"b:114: 5\n" /* netherbrickstairs */
"c: 44:14\n" /* step */
"d:114: 6\n" /* netherbrickstairs */
- "e:114: 7\n" /* netherbrickstairs */,
+ "e:114: 7\n" /* netherbrickstairs */
+ "m: 19: 0\n" /* sponge */,
+
+ // Block data:
+ // Level 0
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmmmmmmmmmmm"
+ /* 1 */ "aammmmmmmmmmm"
+ /* 2 */ "aammmmmmmmmmm"
+ /* 3 */ "aammmmmmmmmmm"
+ /* 4 */ "mmmmmmmmmmmmm"
+
+ // Level 1
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmmmmmmmmmmm"
+ /* 1 */ "aabmmmmmmmmmm"
+ /* 2 */ "aabmmmmmmmmmm"
+ /* 3 */ "aabmmmmmmmmmm"
+ /* 4 */ "mmmmmmmmmmmmm"
+
+ // Level 2
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmmmmmmmmmmm"
+ /* 1 */ "aaabcmmmmmmmm"
+ /* 2 */ "aaabcmmmmmmmm"
+ /* 3 */ "aaabcmmmmmmmm"
+ /* 4 */ "mmmmmmmmmmmmm"
+
+ // Level 3
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "dddddddddmmmm"
+ /* 1 */ "aaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaammmm"
+ /* 3 */ "aaaaaaaaaaaam"
+ /* 4 */ "eeeeeeeeemmmm"
+
+ // Level 4
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaaaaam"
+ /* 1 */ "aaaaaaaaaammm"
+ /* 2 */ "aaaaaaaaaaamm"
+ /* 3 */ "aaaaaaaaammmm"
+ /* 4 */ "aaaaaaaaaaaaa"
+
+ // Level 5
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaammmm"
+ /* 1 */ "mmmmmmmmmmmmm"
+ /* 2 */ "mmmmmmmmmmmmm"
+ /* 3 */ "mmmmmmmmmmmmm"
+ /* 4 */ "aaaaaaaaaammm",
+
+ // Connectors:
+ "0: 0, 5, 2: 4\n" /* Type 0, direction X- */
+ "1: 0, 5, 2: 4\n" /* Type 1, direction X- */,
+
+ // AllowedRotations:
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
+ // Merge strategy:
+ cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "1:0",
+
+ // AddWeightIfSame:
+ 0,
+ }, // BridgeCrumble2
+
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // BridgeDoubleCrumble:
+ // The data has been exported from the gallery Nether, area index 46, ID 305, created by STR_Warrior
+ {
+ // Size:
+ 5, 7, 16, // SizeX = 5, SizeY = 7, SizeZ = 16
+
+ // Block definitions:
+ ".: 0: 0\n" /* air */
+ "a:112: 0\n" /* netherbrick */
+ "b:114: 7\n" /* netherbrickstairs */
+ "c:114: 6\n" /* netherbrickstairs */
+ "d:114: 4\n" /* netherbrickstairs */
+ "e:114: 5\n" /* netherbrickstairs */
+ "m: 19: 0\n" /* sponge */,
+
+ // Block data:
+ // Level 0
+ /* z\x* 01234 */
+ /* 0 */ "maaam"
+ /* 1 */ "maaam"
+ /* 2 */ "mmmmm"
+ /* 3 */ "mmmmm"
+ /* 4 */ "mmmmm"
+ /* 5 */ "mmmmm"
+ /* 6 */ "mmmmm"
+ /* 7 */ "mmmmm"
+ /* 8 */ "mmmmm"
+ /* 9 */ "mmmmm"
+ /* 10 */ "mmmmm"
+ /* 11 */ "mmmmm"
+ /* 12 */ "mmmmm"
+ /* 13 */ "mmmmm"
+ /* 14 */ "maaam"
+ /* 15 */ "maaam"
+
+ // Level 1
+ /* z\x* 01234 */
+ /* 0 */ "maaam"
+ /* 1 */ "maaam"
+ /* 2 */ "mbbbm"
+ /* 3 */ "mmmmm"
+ /* 4 */ "mmmmm"
+ /* 5 */ "mmmmm"
+ /* 6 */ "mmmmm"
+ /* 7 */ "mmmmm"
+ /* 8 */ "mmmmm"
+ /* 9 */ "mmmmm"
+ /* 10 */ "mmmmm"
+ /* 11 */ "mmmmm"
+ /* 12 */ "mmmmm"
+ /* 13 */ "mcccm"
+ /* 14 */ "maaam"
+ /* 15 */ "maaam"
+
+ // Level 2
+ /* z\x* 01234 */
+ /* 0 */ "daaae"
+ /* 1 */ "daaae"
+ /* 2 */ "daaae"
+ /* 3 */ "daaae"
+ /* 4 */ "daaae"
+ /* 5 */ "mamae"
+ /* 6 */ "mmmam"
+ /* 7 */ "mmmmm"
+ /* 8 */ "mmmmm"
+ /* 9 */ "mmmmm"
+ /* 10 */ "mmmae"
+ /* 11 */ "dmaae"
+ /* 12 */ "daaae"
+ /* 13 */ "daaae"
+ /* 14 */ "daaae"
+ /* 15 */ "daaae"
+
+ // Level 3
+ /* z\x* 01234 */
+ /* 0 */ "aaaaa"
+ /* 1 */ "aaaaa"
+ /* 2 */ "aaaaa"
+ /* 3 */ "aaama"
+ /* 4 */ "mamaa"
+ /* 5 */ "mmmmm"
+ /* 6 */ "mmmmm"
+ /* 7 */ "mmmmm"
+ /* 8 */ "mmmmm"
+ /* 9 */ "mmmmm"
+ /* 10 */ "mmmma"
+ /* 11 */ "mmmaa"
+ /* 12 */ "amaaa"
+ /* 13 */ "aaaaa"
+ /* 14 */ "aaaaa"
+ /* 15 */ "aaaaa"
+
+ // Level 4
+ /* z\x* 01234 */
+ /* 0 */ "ammma"
+ /* 1 */ "ammma"
+ /* 2 */ "ammma"
+ /* 3 */ "mmmma"
+ /* 4 */ "mmmmm"
+ /* 5 */ "mmmmm"
+ /* 6 */ "mmmmm"
+ /* 7 */ "mmmmm"
+ /* 8 */ "mmmmm"
+ /* 9 */ "mmmmm"
+ /* 10 */ "mmmmm"
+ /* 11 */ "mmmma"
+ /* 12 */ "mmmmm"
+ /* 13 */ "ammma"
+ /* 14 */ "ammma"
+ /* 15 */ "ammma"
+
+ // Level 5
+ /* z\x* 01234 */
+ /* 0 */ "mmmmm"
+ /* 1 */ "mmmmm"
+ /* 2 */ "mmmmm"
+ /* 3 */ "mmmmm"
+ /* 4 */ "mmmmm"
+ /* 5 */ "mmmmm"
+ /* 6 */ "mmmmm"
+ /* 7 */ "mmmmm"
+ /* 8 */ "mmmmm"
+ /* 9 */ "mmmmm"
+ /* 10 */ "mmmmm"
+ /* 11 */ "mmmmm"
+ /* 12 */ "mmmmm"
+ /* 13 */ "mmmmm"
+ /* 14 */ "mmmmm"
+ /* 15 */ "mmmmm"
+
+ // Level 6
+ /* z\x* 01234 */
+ /* 0 */ "mmmmm"
+ /* 1 */ "mmmmm"
+ /* 2 */ "mmmmm"
+ /* 3 */ "mmmmm"
+ /* 4 */ "mmmmm"
+ /* 5 */ "mmmmm"
+ /* 6 */ "mmmmm"
+ /* 7 */ "mmmmm"
+ /* 8 */ "mmmmm"
+ /* 9 */ "mmmmm"
+ /* 10 */ "mmmmm"
+ /* 11 */ "mmmmm"
+ /* 12 */ "mmmmm"
+ /* 13 */ "mmmmm"
+ /* 14 */ "mmmmm"
+ /* 15 */ "mmmmm",
+
+ // Connectors:
+ "0: 2, 4, 0: 2\n" /* Type 0, direction Z- */
+ "0: 2, 4, 15: 3\n" /* Type 0, direction Z+ */,
+
+ // AllowedRotations:
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
+ // Merge strategy:
+ cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 10,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 1000,
+ }, // BridgeDoubleCrumble
+
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // BridgeFunnelDown:
+ // The data has been exported from the gallery Nether, area index 0, ID 2, created by Aloe_vera
+ {
+ // Size:
+ 15, 12, 12, // SizeX = 15, SizeY = 12, SizeZ = 12
+
+ // Block definitions:
+ ".: 0: 0\n" /* air */
+ "a:112: 0\n" /* netherbrick */
+ "b:114: 6\n" /* netherbrickstairs */
+ "c:114: 4\n" /* netherbrickstairs */
+ "d:114: 5\n" /* netherbrickstairs */
+ "e: 44:14\n" /* step */
+ "f:114: 7\n" /* netherbrickstairs */
+ "m: 19: 0\n" /* sponge */,
+
+ // Block data:
+ // Level 0
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "aammmmmmmmmmmaa"
+ /* 2 */ "aammmmmmmmmmmaa"
+ /* 3 */ "aammmmmmmmmmmaa"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmmm"
+ /* 6 */ "mmmmmmmmmmmmmmm"
+ /* 7 */ "mmmmmmmmmmmmmmm"
+ /* 8 */ "mmmmmmmmmmmmmmm"
+ /* 9 */ "mmmmmmaaammmmmm"
+ /* 10 */ "mmmmmmaaammmmmm"
+ /* 11 */ "mmmmmmaaammmmmm"
+
+ // Level 1
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "aammmmmmmmmmmaa"
+ /* 2 */ "aammmmmmmmmmmaa"
+ /* 3 */ "aammmmmmmmmmmaa"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmmm"
+ /* 6 */ "mmmmmmmmmmmmmmm"
+ /* 7 */ "mmmmmmmmmmmmmmm"
+ /* 8 */ "mmmmmmbbbmmmmmm"
+ /* 9 */ "mmmmmmaaammmmmm"
+ /* 10 */ "mmmmmmaaammmmmm"
+ /* 11 */ "mmmmmmaaammmmmm"
+
+ // Level 2
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "aammmmmmmmmmmaa"
+ /* 2 */ "aammmmmmmmmmmaa"
+ /* 3 */ "aammmmmmmmmmmaa"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmmm"
+ /* 6 */ "mmmmmmmmmmmmmmm"
+ /* 7 */ "mmmmmcbbbdmmmmm"
+ /* 8 */ "mmmmmcaaadmmmmm"
+ /* 9 */ "mmmmmcaaadmmmmm"
+ /* 10 */ "mmmmmcaaadmmmmm"
+ /* 11 */ "mmmmmcaaadmmmmm"
+
+ // Level 3
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "aammmmmmmmmmmaa"
+ /* 2 */ "aammmmmmmmmmmaa"
+ /* 3 */ "aammmmmmmmmmmaa"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmmm"
+ /* 6 */ "mmmmmmmmmmmmmmm"
+ /* 7 */ "mmmmmaaaaammmmm"
+ /* 8 */ "mmmmmaaaaammmmm"
+ /* 9 */ "mmmmmaaaaammmmm"
+ /* 10 */ "mmmmmaaaaammmmm"
+ /* 11 */ "mmmmmaaaaammmmm"
+
+ // Level 4
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "aammmmmmmmmmmaa"
+ /* 2 */ "aammmmmmmmmmmaa"
+ /* 3 */ "aammmmmmmmmmmaa"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmmm"
+ /* 6 */ "mmmmcbbbbbdmmmm"
+ /* 7 */ "mmmmaaaaaaammmm"
+ /* 8 */ "mmmma.....ammmm"
+ /* 9 */ "mmmmaa...aammmm"
+ /* 10 */ "mmmmma...ammmmm"
+ /* 11 */ "mmmmma...ammmmm"
+
+ // Level 5
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "aadmmmmmmmmmcaa"
+ /* 2 */ "aadmmmmmmmmmcaa"
+ /* 3 */ "aadmmmmmmmmmcaa"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+ /* 5 */ "mmmcbbbbbbbdmmm"
+ /* 6 */ "mmmaaaaaaaaaamm"
+ /* 7 */ "mmma.......ammm"
+ /* 8 */ "mmmaa.....aammm"
+ /* 9 */ "mmmmam...mammmm"
+ /* 10 */ "mmmmmm...mmmmmm"
+ /* 11 */ "mmmmmm...mmmmmm"
+
+ // Level 6
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "aaademmmmmecaaa"
+ /* 2 */ "aaademmmmmecaaa"
+ /* 3 */ "aaademmmmmecaaa"
+ /* 4 */ "mmaaabbbbbaaaam"
+ /* 5 */ "mmaaaaaaaaaaaam"
+ /* 6 */ "mma.........amm"
+ /* 7 */ "mmaa.......aamm"
+ /* 8 */ "mmmam.....mammm"
+ /* 9 */ "mmmmmm...mmmmmm"
+ /* 10 */ "mmmmmm...mmmmmm"
+ /* 11 */ "mmmmmm...mmmmmm"
+
+ // Level 7
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "bbbbbbbbbbbbbbb"
+ /* 1 */ "aaaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaaa"
+ /* 4 */ "faaaaaaaaaaaaaa"
+ /* 5 */ "ma...........am"
+ /* 6 */ "maa.........aam"
+ /* 7 */ "mmam.......mamm"
+ /* 8 */ "mmmmm.....mmmmm"
+ /* 9 */ "mmmmmmmmmmmmmmm"
+ /* 10 */ "mmmmmmmmmmmmmmm"
+ /* 11 */ "mmmmmmmmmmmmmmm"
+
+ // Level 8
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaaa"
+ /* 4 */ "a.............a"
+ /* 5 */ "aa...........aa"
+ /* 6 */ "mam.........mam"
+ /* 7 */ "mmmm.......mmmm"
+ /* 8 */ "mmmmmmmmmmmmmmm"
+ /* 9 */ "mmmmmmmmmmmmmmm"
+ /* 10 */ "mmmmmmmmmmmmmmm"
+ /* 11 */ "mmmmmmmmmmmmmmm"
+
+ // Level 9
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaaaaaaaaa"
+ /* 1 */ "..............."
+ /* 2 */ "..............."
+ /* 3 */ "..............."
+ /* 4 */ "a.............a"
+ /* 5 */ "am............a"
+ /* 6 */ "mmm.........mmm"
+ /* 7 */ "mmmmmmmmmmmmmmm"
+ /* 8 */ "mmmmmmmmmmmmmmm"
+ /* 9 */ "mmmmmmmmmmmmmmm"
+ /* 10 */ "mmmmmmmmmmmmmmm"
+ /* 11 */ "mmmmmmmmmmmmmmm"
+
+ // Level 10
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "..............."
+ /* 2 */ "..............."
+ /* 3 */ "..............."
+ /* 4 */ "m.............m"
+ /* 5 */ "mm............m"
+ /* 6 */ "mmmmmmmmmmmmmmm"
+ /* 7 */ "mmmmmmmmmmmmmmm"
+ /* 8 */ "mmmmmmmmmmmmmmm"
+ /* 9 */ "mmmmmmmmmmmmmmm"
+ /* 10 */ "mmmmmmmmmmmmmmm"
+ /* 11 */ "mmmmmmmmmmmmmmm"
+
+ // Level 11
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "..............."
+ /* 2 */ "..............."
+ /* 3 */ "..............."
+ /* 4 */ "m.............m"
+ /* 5 */ "mmmmmmmmmmmmmmm"
+ /* 6 */ "mmmmmmmmmmmmmmm"
+ /* 7 */ "mmmmmmmmmmmmmmm"
+ /* 8 */ "mmmmmmmmmmmmmmm"
+ /* 9 */ "mmmmmmmmmmmmmmm"
+ /* 10 */ "mmmmmmmmmmmmmmm"
+ /* 11 */ "mmmmmmmmmmmmmmm",
+
+ // Connectors:
+ "0: 7, 4, 11: 3\n" /* Type 0, direction Z+ */
+ "0: 0, 9, 2: 4\n" /* Type 0, direction X- */
+ "0: 14, 9, 2: 5\n" /* Type 0, direction X+ */,
+
+ // AllowedRotations:
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
+ // Merge strategy:
+ cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 5,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
+ }, // BridgeFunnelDown
+
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // BridgeLevelCrossing:
+ // The data has been exported from the gallery Nether, area index 45, ID 304, created by Aloe_vera
+ {
+ // Size:
+ 15, 14, 16, // SizeX = 15, SizeY = 14, SizeZ = 16
+
+ // Block definitions:
+ ".: 0: 0\n" /* air */
+ "a:112: 0\n" /* netherbrick */
+ "b:114: 6\n" /* netherbrickstairs */
+ "c:114: 4\n" /* netherbrickstairs */
+ "d:114: 5\n" /* netherbrickstairs */
+ "e: 44:14\n" /* step */
+ "f:114: 7\n" /* netherbrickstairs */
+ "m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "...........aaa."
+ /* 1 */ "aa.........aaaa"
+ /* 2 */ "aa...........aa"
+ /* 3 */ "aa...........aa"
+ /* 4 */ "..............."
+ /* 5 */ "..............."
+ /* 6 */ "..............."
+ /* 7 */ "..............."
+ /* 8 */ "..............."
+ /* 9 */ "..............."
+ /* 10 */ "..............."
+ /* 11 */ "..............."
+ /* 12 */ "..............."
+ /* 13 */ "..............."
+ /* 14 */ "...........aaa."
+ /* 15 */ "...........aaa."
+
// Level 1
- "............."
- "aa..........."
- "aa..........."
- "aa..........."
- "............."
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "...........aaa."
+ /* 1 */ "aa.........aaaa"
+ /* 2 */ "aa...........aa"
+ /* 3 */ "aa...........aa"
+ /* 4 */ "..............."
+ /* 5 */ "..............."
+ /* 6 */ "..............."
+ /* 7 */ "..............."
+ /* 8 */ "..............."
+ /* 9 */ "..............."
+ /* 10 */ "..............."
+ /* 11 */ "..............."
+ /* 12 */ "..............."
+ /* 13 */ "..............."
+ /* 14 */ "...........aaa."
+ /* 15 */ "...........aaa."
// Level 2
- "............."
- "aab.........."
- "aab.........."
- "aab.........."
- "............."
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "...........aaa."
+ /* 1 */ "aa.........aaaa"
+ /* 2 */ "aa...........aa"
+ /* 3 */ "aa...........aa"
+ /* 4 */ "..............."
+ /* 5 */ "..............."
+ /* 6 */ "..............."
+ /* 7 */ "..............."
+ /* 8 */ "..............."
+ /* 9 */ "..............."
+ /* 10 */ "..............."
+ /* 11 */ "..............."
+ /* 12 */ "..............."
+ /* 13 */ "...........bbb."
+ /* 14 */ "...........aaa."
+ /* 15 */ "...........aaa."
// Level 3
- "............."
- "aaabc........"
- "aaabc........"
- "aaabc........"
- "............."
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "..........caaad"
+ /* 1 */ "aa........caaaa"
+ /* 2 */ "aa........caaaa"
+ /* 3 */ "aa........caaaa"
+ /* 4 */ "...........aaad"
+ /* 5 */ "...........aaad"
+ /* 6 */ "...........aaad"
+ /* 7 */ "...........aaad"
+ /* 8 */ "...........aaad"
+ /* 9 */ "..........caaad"
+ /* 10 */ "..........caaad"
+ /* 11 */ "..........caaad"
+ /* 12 */ "..........caaad"
+ /* 13 */ "..........caaad"
+ /* 14 */ "..........caaad"
+ /* 15 */ "..........caaad"
// Level 4
- "ddddddddd...."
- "aaaaaaaaaaaaa"
- "aaaaaaaaa...."
- "aaaaaaaaaaaa."
- "eeeeeeeee...."
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "..........aaaaa"
+ /* 1 */ "aa........aaaaa"
+ /* 2 */ "aa........aaaaa"
+ /* 3 */ "aa........aaaaa"
+ /* 4 */ "..........aaaaa"
+ /* 5 */ "..........aaaaa"
+ /* 6 */ "..........aaaaa"
+ /* 7 */ "..........aaaaa"
+ /* 8 */ "..........aaaaa"
+ /* 9 */ "..........aaaaa"
+ /* 10 */ "..........aaaaa"
+ /* 11 */ "..........aaaaa"
+ /* 12 */ "..........aaaaa"
+ /* 13 */ "..........aaaaa"
+ /* 14 */ "..........aaaaa"
+ /* 15 */ "..........aaaaa"
// Level 5
- "aaaaaaaaaaaa."
- "aaaaaaaaaa..."
- "aaaaaaaaaaa.."
- "aaaaaaaaa...."
- "aaaaaaaaaaaaa"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "..........a...a"
+ /* 1 */ "aa........a...a"
+ /* 2 */ "aa........a...a"
+ /* 3 */ "aa........a...a"
+ /* 4 */ "..........a...a"
+ /* 5 */ "..........a...a"
+ /* 6 */ "........aaa...a"
+ /* 7 */ "........aa....a"
+ /* 8 */ "........aa....a"
+ /* 9 */ "........aa....a"
+ /* 10 */ "........aaa...a"
+ /* 11 */ "..........a...a"
+ /* 12 */ "..........a...a"
+ /* 13 */ "..........a...a"
+ /* 14 */ "..........a...a"
+ /* 15 */ "..........a...a"
// Level 6
- "aaaaaaaaa...."
- "............."
- "............."
- "............."
- "aaaaaaaaaa...",
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "..............."
+ /* 1 */ "aa........a...a"
+ /* 2 */ "aa........a...a"
+ /* 3 */ "aa........a...a"
+ /* 4 */ "..............."
+ /* 5 */ "..............."
+ /* 6 */ "........aaa...."
+ /* 7 */ "....aaaaa......"
+ /* 8 */ "....aaaaa......"
+ /* 9 */ "....aaaaa......"
+ /* 10 */ "....aaaaaaa...."
+ /* 11 */ "..............."
+ /* 12 */ "..............."
+ /* 13 */ "..............."
+ /* 14 */ "..............."
+ /* 15 */ "..............."
+
+ // Level 7
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "..............."
+ /* 1 */ "aad.......a...a"
+ /* 2 */ "aad.......a...a"
+ /* 3 */ "aad.......a...a"
+ /* 4 */ "..............."
+ /* 5 */ "..............."
+ /* 6 */ "....aaaaaa....."
+ /* 7 */ "....aaaa......."
+ /* 8 */ "....aaaa......."
+ /* 9 */ "....aaaa......."
+ /* 10 */ "....aaaaaa....."
+ /* 11 */ "..............."
+ /* 12 */ "..............."
+ /* 13 */ "..............."
+ /* 14 */ "..............."
+ /* 15 */ "..............."
- // Connections:
- "0: 0, 5, 2: 4\n" /* Type 0, BLOCK_FACE_XM */,
+ // Level 8
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "..............."
+ /* 1 */ "aaade.....a...a"
+ /* 2 */ "aaade.....a...a"
+ /* 3 */ "aaade.....a...a"
+ /* 4 */ "..............."
+ /* 5 */ "..............."
+ /* 6 */ "....aaaaa......"
+ /* 7 */ "....a.........."
+ /* 8 */ "....a.........."
+ /* 9 */ "....a.........."
+ /* 10 */ "....aaaa......."
+ /* 11 */ "..............."
+ /* 12 */ "..............."
+ /* 13 */ "..............."
+ /* 14 */ "..............."
+ /* 15 */ "..............."
+
+ // Level 9
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "bbbbbbbbbbbbbbb"
+ /* 1 */ "aaaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaaa"
+ /* 4 */ "ffffffaaaffffff"
+ /* 5 */ "....aaaaa......"
+ /* 6 */ "....a...a......"
+ /* 7 */ "....a.........."
+ /* 8 */ "..............."
+ /* 9 */ "..............."
+ /* 10 */ "..............."
+ /* 11 */ "..............."
+ /* 12 */ "..............."
+ /* 13 */ "..............."
+ /* 14 */ "..............."
+ /* 15 */ "..............."
+
+ // Level 10
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaaaa"
+ /* 5 */ "....a...a......"
+ /* 6 */ "....a...a......"
+ /* 7 */ "..............."
+ /* 8 */ "..............."
+ /* 9 */ "..............."
+ /* 10 */ "..............."
+ /* 11 */ "..............."
+ /* 12 */ "..............."
+ /* 13 */ "..............."
+ /* 14 */ "..............."
+ /* 15 */ "..............."
+
+ // Level 11
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaaaaaaaaa"
+ /* 1 */ "..............."
+ /* 2 */ "..............."
+ /* 3 */ "..............."
+ /* 4 */ "aaaaa...aaaaaaa"
+ /* 5 */ "....a...a......"
+ /* 6 */ "..............."
+ /* 7 */ "..............."
+ /* 8 */ "..............."
+ /* 9 */ "..............."
+ /* 10 */ "..............."
+ /* 11 */ "..............."
+ /* 12 */ "..............."
+ /* 13 */ "..............."
+ /* 14 */ "..............."
+ /* 15 */ "..............."
+
+ // Level 12
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "..............."
+ /* 1 */ "..............."
+ /* 2 */ "..............."
+ /* 3 */ "..............."
+ /* 4 */ "..............."
+ /* 5 */ "..............."
+ /* 6 */ "..............."
+ /* 7 */ "..............."
+ /* 8 */ "..............."
+ /* 9 */ "..............."
+ /* 10 */ "..............."
+ /* 11 */ "..............."
+ /* 12 */ "..............."
+ /* 13 */ "..............."
+ /* 14 */ "..............."
+ /* 15 */ "..............."
+
+ // Level 13
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "..............."
+ /* 1 */ "..............."
+ /* 2 */ "..............."
+ /* 3 */ "..............."
+ /* 4 */ "..............."
+ /* 5 */ "..............."
+ /* 6 */ "..............."
+ /* 7 */ "..............."
+ /* 8 */ "..............."
+ /* 9 */ "..............."
+ /* 10 */ "..............."
+ /* 11 */ "..............."
+ /* 12 */ "..............."
+ /* 13 */ "..............."
+ /* 14 */ "..............."
+ /* 15 */ "...............",
+
+ // Connectors:
+ "",
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
- }, // BridgeCrumble2
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
+ }, // BridgeLevelCrossing
+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// BridgeSegment:
- // The data has been exported from gallery Nether, area index 16, ID 158
+ // The data has been exported from the gallery Nether, area index 16, ID 158, created by Aloe_vera
{
// Size:
15, 8, 5, // SizeX = 15, SizeY = 8, SizeZ = 5
@@ -782,76 +1896,106 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
"m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "aammmmmmmmmmmaa"
+ /* 2 */ "aammmmmmmmmmmaa"
+ /* 3 */ "aammmmmmmmmmmaa"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+
// Level 1
- "mmmmmmmmmmmmmmm"
- "aammmmmmmmmmmaa"
- "aammmmmmmmmmmaa"
- "aammmmmmmmmmmaa"
- "mmmmmmmmmmmmmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "aabmmmmmmmmmcaa"
+ /* 2 */ "aabmmmmmmmmmcaa"
+ /* 3 */ "aabmmmmmmmmmcaa"
+ /* 4 */ "mmmmmmmmmmmmmmm"
// Level 2
- "mmmmmmmmmmmmmmm"
- "aabmmmmmmmmmcaa"
- "aabmmmmmmmmmcaa"
- "aabmmmmmmmmmcaa"
- "mmmmmmmmmmmmmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "aaabdmmmmmdcaaa"
+ /* 2 */ "aaabdmmmmmdcaaa"
+ /* 3 */ "aaabdmmmmmdcaaa"
+ /* 4 */ "mmmmmmmmmmmmmmm"
// Level 3
- "mmmmmmmmmmmmmmm"
- "aaabdmmmmmdcaaa"
- "aaabdmmmmmdcaaa"
- "aaabdmmmmmdcaaa"
- "mmmmmmmmmmmmmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "eeeeeeeeeeeeeee"
+ /* 1 */ "aaaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaaa"
+ /* 4 */ "fffffffffffffff"
// Level 4
- "eeeeeeeeeeeeeee"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "fffffffffffffff"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaaaa"
// Level 5
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaaaaaaaaa"
+ /* 1 */ "..............."
+ /* 2 */ "..............."
+ /* 3 */ "..............."
+ /* 4 */ "aaaaaaaaaaaaaaa"
// Level 6
- "aaaaaaaaaaaaaaa"
- "..............."
- "..............."
- "..............."
- "aaaaaaaaaaaaaaa"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "..............."
+ /* 2 */ "..............."
+ /* 3 */ "..............."
+ /* 4 */ "mmmmmmmmmmmmmmm"
// Level 7
- "mmmmmmmmmmmmmmm"
- "..............."
- "..............."
- "..............."
- "mmmmmmmmmmmmmmm"
-
- // Level 8
- "mmmmmmmmmmmmmmm"
- "..............."
- "..............."
- "..............."
- "mmmmmmmmmmmmmmm",
-
- // Connections:
- "0: 0, 5, 2: 4\n" /* Type 0, BLOCK_FACE_XM */
- "0: 14, 5, 2: 5\n" /* Type 0, BLOCK_FACE_XP */,
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "..............."
+ /* 2 */ "..............."
+ /* 3 */ "..............."
+ /* 4 */ "mmmmmmmmmmmmmmm",
+
+ // Connectors:
+ "0: 0, 5, 2: 4\n" /* Type 0, direction X- */
+ "0: 14, 5, 2: 5\n" /* Type 0, direction X+ */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 500,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 1000,
}, // BridgeSegment
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// BridgeTee:
- // The data has been exported from gallery Nether, area index 39, ID 290
+ // The data has been exported from the gallery Nether, area index 39, ID 290, created by STR_Warrior
{
// Size:
15, 8, 10, // SizeX = 15, SizeY = 8, SizeZ = 10
@@ -867,117 +2011,147 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
"m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "aammmmmmmmmmmaa"
+ /* 2 */ "aammmmmmmmmmmaa"
+ /* 3 */ "aammmmmmmmmmmaa"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmmm"
+ /* 6 */ "mmmmmmmmmmmmmmm"
+ /* 7 */ "mmmmmmmmmmmmmmm"
+ /* 8 */ "mmmmmmaaammmmmm"
+ /* 9 */ "mmmmmmaaammmmmm"
+
// Level 1
- "mmmmmmmmmmmmmmm"
- "aammmmmmmmmmmaa"
- "aammmmmmmmmmmaa"
- "aammmmmmmmmmmaa"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmaaammmmmm"
- "mmmmmmaaammmmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "aabmmmmmmmmmcaa"
+ /* 2 */ "aabmmmmmmmmmcaa"
+ /* 3 */ "aabmmmmmmmmmcaa"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+ /* 5 */ "mmmmmmmmmmmmmmm"
+ /* 6 */ "mmmmmmmmmmmmmmm"
+ /* 7 */ "mmmmmmdddmmmmmm"
+ /* 8 */ "mmmmmmaaammmmmm"
+ /* 9 */ "mmmmmmaaammmmmm"
// Level 2
- "mmmmmmmmmmmmmmm"
- "aabmmmmmmmmmcaa"
- "aabmmmmmmmmmcaa"
- "aabmmmmmmmmmcaa"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmmmmmmmmmm"
- "mmmmmmdddmmmmmm"
- "mmmmmmaaammmmmm"
- "mmmmmmaaammmmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "aaabemmmmmecaaa"
+ /* 2 */ "aaabemmmmmecaaa"
+ /* 3 */ "aaabemmmmmecaaa"
+ /* 4 */ "mmmmmmmmmmmmmmm"
+ /* 5 */ "mmmmmmeeemmmmmm"
+ /* 6 */ "mmmmmmdddmmmmmm"
+ /* 7 */ "mmmmmmaaammmmmm"
+ /* 8 */ "mmmmmmaaammmmmm"
+ /* 9 */ "mmmmmmaaammmmmm"
// Level 3
- "mmmmmmmmmmmmmmm"
- "aaabemmmmmecaaa"
- "aaabemmmmmecaaa"
- "aaabemmmmmecaaa"
- "mmmmmmmmmmmmmmm"
- "mmmmmmeeemmmmmm"
- "mmmmmmdddmmmmmm"
- "mmmmmmaaammmmmm"
- "mmmmmmaaammmmmm"
- "mmmmmmaaammmmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "ddddddddddddddd"
+ /* 1 */ "aaaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaaa"
+ /* 4 */ "fffffcaaabfffff"
+ /* 5 */ "mmmmmcaaabmmmmm"
+ /* 6 */ "mmmmmcaaabmmmmm"
+ /* 7 */ "mmmmmcaaabmmmmm"
+ /* 8 */ "mmmmmcaaabmmmmm"
+ /* 9 */ "mmmmmcaaabmmmmm"
// Level 4
- "ddddddddddddddd"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "fffffcaaabfffff"
- "mmmmmcaaabmmmmm"
- "mmmmmcaaabmmmmm"
- "mmmmmcaaabmmmmm"
- "mmmmmcaaabmmmmm"
- "mmmmmcaaabmmmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaaaa"
+ /* 5 */ "mmmmmaaaaammmmm"
+ /* 6 */ "mmmmmaaaaammmmm"
+ /* 7 */ "mmmmmaaaaammmmm"
+ /* 8 */ "mmmmmaaaaammmmm"
+ /* 9 */ "mmmmmaaaaammmmm"
// Level 5
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "mmmmmaaaaammmmm"
- "mmmmmaaaaammmmm"
- "mmmmmaaaaammmmm"
- "mmmmmaaaaammmmm"
- "mmmmmaaaaammmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaaaaaaaaa"
+ /* 1 */ "..............."
+ /* 2 */ "..............."
+ /* 3 */ "..............."
+ /* 4 */ "aaaaaa...aaaaaa"
+ /* 5 */ "mmmmma...ammmmm"
+ /* 6 */ "mmmmma...ammmmm"
+ /* 7 */ "mmmmma...ammmmm"
+ /* 8 */ "mmmmma...ammmmm"
+ /* 9 */ "mmmmma...ammmmm"
// Level 6
- "aaaaaaaaaaaaaaa"
- "..............."
- "..............."
- "..............."
- "aaaaaa...aaaaaa"
- "mmmmma...ammmmm"
- "mmmmma...ammmmm"
- "mmmmma...ammmmm"
- "mmmmma...ammmmm"
- "mmmmma...ammmmm"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "..............."
+ /* 2 */ "..............."
+ /* 3 */ "..............."
+ /* 4 */ "mmmmmm...mmmmmm"
+ /* 5 */ "mmmmmm...mmmmmm"
+ /* 6 */ "mmmmmm...mmmmmm"
+ /* 7 */ "mmmmmm...mmmmmm"
+ /* 8 */ "mmmmmm...mmmmmm"
+ /* 9 */ "mmmmmm...mmmmmm"
// Level 7
- "mmmmmmmmmmmmmmm"
- "..............."
- "..............."
- "..............."
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
-
- // Level 8
- "mmmmmmmmmmmmmmm"
- "..............."
- "..............."
- "..............."
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm"
- "mmmmmm...mmmmmm",
-
- // Connections:
- "0: 0, 5, 2: 4\n" /* Type 0, BLOCK_FACE_XM */
- "0: 14, 5, 2: 5\n" /* Type 0, BLOCK_FACE_XP */
- "0: 7, 5, 9: 3\n" /* Type 0, BLOCK_FACE_ZP */,
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "mmmmmmmmmmmmmmm"
+ /* 1 */ "..............."
+ /* 2 */ "..............."
+ /* 3 */ "..............."
+ /* 4 */ "mmmmmm...mmmmmm"
+ /* 5 */ "mmmmmm...mmmmmm"
+ /* 6 */ "mmmmmm...mmmmmm"
+ /* 7 */ "mmmmmm...mmmmmm"
+ /* 8 */ "mmmmmm...mmmmmm"
+ /* 9 */ "mmmmmm...mmmmmm",
+
+ // Connectors:
+ "0: 0, 5, 2: 4\n" /* Type 0, direction X- */
+ "0: 7, 5, 9: 3\n" /* Type 0, direction Z+ */
+ "0: 14, 5, 2: 5\n" /* Type 0, direction X+ */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 10,
+
+ // DepthWeight:
+ "1:500",
+
+ // AddWeightIfSame:
+ 0,
}, // BridgeTee
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Corridor11:
- // The data has been exported from gallery Nether, area index 36, ID 287
+ // The data has been exported from the gallery Nether, area index 36, ID 287, created by Aloe_vera
{
// Size:
11, 6, 5, // SizeX = 11, SizeY = 6, SizeZ = 5
@@ -987,134 +2161,187 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
"a:112: 0\n" /* netherbrick */
"b:113: 0\n" /* netherbrickfence */
"c:114: 2\n" /* netherbrickstairs */
- "d:114: 3\n" /* netherbrickstairs */,
+ "d:114: 3\n" /* netherbrickstairs */
+ "m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "aaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaa"
+
// Level 1
- "aaaaaaaaaaa"
- "aaaaaaaaaaa"
- "aaaaaaaaaaa"
- "aaaaaaaaaaa"
- "aaaaaaaaaaa"
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "aaaaaaaaaaa"
+ /* 1 */ "..........."
+ /* 2 */ "..........."
+ /* 3 */ "..........."
+ /* 4 */ "aaaaaaaaaaa"
// Level 2
- "aaaaaaaaaaa"
- "..........."
- "..........."
- "..........."
- "aaaaaaaaaaa"
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "abababababa"
+ /* 1 */ "..........."
+ /* 2 */ "..........."
+ /* 3 */ "..........."
+ /* 4 */ "abababababa"
// Level 3
- "abababababa"
- "..........."
- "..........."
- "..........."
- "abababababa"
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "abababababa"
+ /* 1 */ "..........."
+ /* 2 */ "..........."
+ /* 3 */ "..........."
+ /* 4 */ "abababababa"
// Level 4
- "abababababa"
- "..........."
- "..........."
- "..........."
- "abababababa"
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "abababababa"
+ /* 1 */ "..........."
+ /* 2 */ "..........."
+ /* 3 */ "..........."
+ /* 4 */ "abababababa"
// Level 5
- "abababababa"
- "..........."
- "..........."
- "..........."
- "abababababa"
-
- // Level 6
- "ccccccccccc"
- "aaaaaaaaaaa"
- "aaaaaaaaaaa"
- "aaaaaaaaaaa"
- "ddddddddddd",
-
- // Connections:
- "1: 0, 1, 2: 4\n" /* Type 1, BLOCK_FACE_XM */
- "1: 10, 1, 2: 5\n" /* Type 1, BLOCK_FACE_XP */,
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "ccccccccccc"
+ /* 1 */ "aaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaa"
+ /* 4 */ "ddddddddddd",
+
+ // Connectors:
+ "1: 10, 1, 2: 5\n" /* Type 1, direction X+ */
+ "1: 0, 1, 2: 4\n" /* Type 1, direction X- */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 200,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
}, // Corridor11
+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Corridor13:
- // The data has been exported from gallery Nether, area index 35, ID 286
+ // The data has been exported from the gallery Nether, area index 35, ID 286, created by Aloe_vera
{
// Size:
13, 6, 5, // SizeX = 13, SizeY = 6, SizeZ = 5
// Block definitions:
- "a:112: 0\n" /* netherbrick */
".: 0: 0\n" /* air */
- "c:113: 0\n" /* netherbrickfence */
- "d:114: 2\n" /* netherbrickstairs */
- "e:114: 3\n" /* netherbrickstairs */,
+ "a:112: 0\n" /* netherbrick */
+ "b:113: 0\n" /* netherbrickfence */
+ "c:114: 2\n" /* netherbrickstairs */
+ "d:114: 3\n" /* netherbrickstairs */
+ "m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaa"
+
// Level 1
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaaaaaa"
+ /* 1 */ "............."
+ /* 2 */ "............."
+ /* 3 */ "............."
+ /* 4 */ "aaaaaaaaaaaaa"
// Level 2
- "aaaaaaaaaaaaa"
- "............."
- "............."
- "............."
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "ababababababa"
+ /* 1 */ "............."
+ /* 2 */ "............."
+ /* 3 */ "............."
+ /* 4 */ "ababababababa"
// Level 3
- "acacacacacaca"
- "............."
- "............."
- "............."
- "acacacacacaca"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "ababababababa"
+ /* 1 */ "............."
+ /* 2 */ "............."
+ /* 3 */ "............."
+ /* 4 */ "ababababababa"
// Level 4
- "acacacacacaca"
- "............."
- "............."
- "............."
- "acacacacacaca"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "ababababababa"
+ /* 1 */ "............."
+ /* 2 */ "............."
+ /* 3 */ "............."
+ /* 4 */ "ababababababa"
// Level 5
- "acacacacacaca"
- "............."
- "............."
- "............."
- "acacacacacaca"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "ccccccccccccc"
+ /* 1 */ "aaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaa"
+ /* 4 */ "ddddddddddddd",
+
+ // Connectors:
+ "1: 12, 1, 2: 5\n" /* Type 1, direction X+ */
+ "1: 0, 1, 2: 4\n" /* Type 1, direction X- */,
- // Level 6
- "ddddddddddddd"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "eeeeeeeeeeeee",
-
- // Connections:
- "1: 0, 1, 2: 4\n" /* Type 1, BLOCK_FACE_XM */
- "1: 12, 1, 2: 5\n" /* Type 1, BLOCK_FACE_XP */,
-
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 200,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
}, // Corridor13
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CorridorCorner5:
- // The data has been exported from gallery Nether, area index 10, ID 40
+ // The data has been exported from the gallery Nether, area index 10, ID 40, created by xoft
{
// Size:
11, 6, 11, // SizeX = 11, SizeY = 6, SizeZ = 11
@@ -1130,98 +2357,124 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
"m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "aaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaa"
+ /* 5 */ "aaaaa......"
+ /* 6 */ "aaaaa......"
+ /* 7 */ "aaaaa......"
+ /* 8 */ "aaaaa......"
+ /* 9 */ "aaaaa......"
+ /* 10 */ "aaaaa......"
+
// Level 1
- "aaaaaaaaaaa"
- "aaaaaaaaaaa"
- "aaaaaaaaaaa"
- "aaaaaaaaaaa"
- "aaaaaaaaaaa"
- "aaaaammmmmm"
- "aaaaammmmmm"
- "aaaaammmmmm"
- "aaaaammmmmm"
- "aaaaammmmmm"
- "aaaaammmmmm"
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "aaaaaaaaaaa"
+ /* 1 */ "a.........."
+ /* 2 */ "a.........."
+ /* 3 */ "a.........."
+ /* 4 */ "a...aaaaaaa"
+ /* 5 */ "a...a......"
+ /* 6 */ "a...a......"
+ /* 7 */ "a...a......"
+ /* 8 */ "a...a......"
+ /* 9 */ "a...a......"
+ /* 10 */ "a...a......"
// Level 2
- "aaaaaaaaaaa"
- "a.........."
- "a.........."
- "a.........."
- "a...aaaaaaa"
- "a...ammmmmm"
- "a...ammmmmm"
- "a...ammmmmm"
- "a...ammmmmm"
- "a...ammmmmm"
- "a...ammmmmm"
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "abababababa"
+ /* 1 */ "b.........."
+ /* 2 */ "a.........."
+ /* 3 */ "b.........."
+ /* 4 */ "a...abababa"
+ /* 5 */ "b...b......"
+ /* 6 */ "a...a......"
+ /* 7 */ "b...b......"
+ /* 8 */ "a...a......"
+ /* 9 */ "b...b......"
+ /* 10 */ "a...a......"
// Level 3
- "abababababa"
- "b.........."
- "a.........."
- "b.........."
- "a...abababa"
- "b...bmmmmmm"
- "a...ammmmmm"
- "b...bmmmmmm"
- "a...ammmmmm"
- "b...bmmmmmm"
- "a...ammmmmm"
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "abababababa"
+ /* 1 */ "b.........."
+ /* 2 */ "a.........."
+ /* 3 */ "b.........."
+ /* 4 */ "a...abababa"
+ /* 5 */ "b...b......"
+ /* 6 */ "a...a......"
+ /* 7 */ "b...b......"
+ /* 8 */ "a...a......"
+ /* 9 */ "b...b......"
+ /* 10 */ "a...a......"
// Level 4
- "abababababa"
- "b.........."
- "a.........."
- "b.........."
- "a...abababa"
- "b...bmmmmmm"
- "a...ammmmmm"
- "b...bmmmmmm"
- "a...ammmmmm"
- "b...bmmmmmm"
- "a...ammmmmm"
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "abababababa"
+ /* 1 */ "b.........."
+ /* 2 */ "a.........."
+ /* 3 */ "b.........."
+ /* 4 */ "a...abababa"
+ /* 5 */ "b...b......"
+ /* 6 */ "a...a......"
+ /* 7 */ "b...b......"
+ /* 8 */ "a...a......"
+ /* 9 */ "b...b......"
+ /* 10 */ "a...a......"
// Level 5
- "abababababa"
- "b.........."
- "a.........."
- "b.........."
- "a...abababa"
- "b...bmmmmmm"
- "a...ammmmmm"
- "b...bmmmmmm"
- "a...ammmmmm"
- "b...bmmmmmm"
- "a...ammmmmm"
-
- // Level 6
- "ccccccccccc"
- "daaaaaaaaaa"
- "daaaaaaaaaa"
- "daaaaaaaaaa"
- "daaaeeeeeee"
- "daaafmmmmmm"
- "daaafmmmmmm"
- "daaafmmmmmm"
- "daaafmmmmmm"
- "daaafmmmmmm"
- "daaafmmmmmm",
-
- // Connections:
- "1: 10, 1, 2: 5\n" /* Type 1, BLOCK_FACE_XP */
- "1: 2, 1, 10: 3\n" /* Type 1, BLOCK_FACE_ZP */,
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "ccccccccccc"
+ /* 1 */ "daaaaaaaaaa"
+ /* 2 */ "daaaaaaaaaa"
+ /* 3 */ "daaaaaaaaaa"
+ /* 4 */ "daaaeeeeeee"
+ /* 5 */ "daaaf......"
+ /* 6 */ "daaaf......"
+ /* 7 */ "daaaf......"
+ /* 8 */ "daaaf......"
+ /* 9 */ "daaaf......"
+ /* 10 */ "daaaf......",
+
+ // Connectors:
+ "1: 2, 1, 10: 3\n" /* Type 1, direction Z+ */
+ "1: 10, 1, 2: 5\n" /* Type 1, direction X+ */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
}, // CorridorCorner5
- // CorridorCorner5:
- // The data has been exported from gallery Nether, area index 10, ID 40
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // CorridorCornerChest5:
+ // The data has been exported from the gallery Nether, area index 42, ID 293, created by STR_Warrior
{
// Size:
11, 6, 11, // SizeX = 11, SizeY = 6, SizeZ = 11
@@ -1229,108 +2482,133 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
// Block definitions:
".: 0: 0\n" /* air */
"a:112: 0\n" /* netherbrick */
- "b:113: 0\n" /* netherbrickfence */
- "c:114: 2\n" /* netherbrickstairs */
+ "b: 54: 5\n" /* chest */
+ "c:113: 0\n" /* netherbrickfence */
"d:114: 0\n" /* netherbrickstairs */
- "e:114: 3\n" /* netherbrickstairs */
+ "e:114: 2\n" /* netherbrickstairs */
"f:114: 1\n" /* netherbrickstairs */
- "g: 54: 5\n" /* chest */
+ "g:114: 3\n" /* netherbrickstairs */
"m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "aaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaa"
+ /* 5 */ "aaaaammmmmm"
+ /* 6 */ "aaaaammmmmm"
+ /* 7 */ "aaaaammmmmm"
+ /* 8 */ "aaaaammmmmm"
+ /* 9 */ "aaaaammmmmm"
+ /* 10 */ "aaaaammmmmm"
+
// Level 1
- "aaaaaaaaaaa"
- "aaaaaaaaaaa"
- "aaaaaaaaaaa"
- "aaaaaaaaaaa"
- "aaaaaaaaaaa"
- "aaaaammmmmm"
- "aaaaammmmmm"
- "aaaaammmmmm"
- "aaaaammmmmm"
- "aaaaammmmmm"
- "aaaaammmmmm"
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "aaaaaaaaaaa"
+ /* 1 */ "ab........."
+ /* 2 */ "a.........."
+ /* 3 */ "a.........."
+ /* 4 */ "a...aaaaaaa"
+ /* 5 */ "a...ammmmmm"
+ /* 6 */ "a...ammmmmm"
+ /* 7 */ "a...ammmmmm"
+ /* 8 */ "a...ammmmmm"
+ /* 9 */ "a...ammmmmm"
+ /* 10 */ "a...ammmmmm"
// Level 2
- "aaaaaaaaaaa"
- "ag........."
- "a.........."
- "a.........."
- "a...aaaaaaa"
- "a...ammmmmm"
- "a...ammmmmm"
- "a...ammmmmm"
- "a...ammmmmm"
- "a...ammmmmm"
- "a...ammmmmm"
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "acacacacaca"
+ /* 1 */ "c.........."
+ /* 2 */ "a.........."
+ /* 3 */ "c.........."
+ /* 4 */ "a...acacaca"
+ /* 5 */ "c...cmmmmmm"
+ /* 6 */ "a...ammmmmm"
+ /* 7 */ "c...cmmmmmm"
+ /* 8 */ "a...ammmmmm"
+ /* 9 */ "c...cmmmmmm"
+ /* 10 */ "a...ammmmmm"
// Level 3
- "abababababa"
- "b.........."
- "a.........."
- "b.........."
- "a...abababa"
- "b...bmmmmmm"
- "a...ammmmmm"
- "b...bmmmmmm"
- "a...ammmmmm"
- "b...bmmmmmm"
- "a...ammmmmm"
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "acacacacaca"
+ /* 1 */ "c.........."
+ /* 2 */ "a.........."
+ /* 3 */ "c.........."
+ /* 4 */ "a...acacaca"
+ /* 5 */ "c...cmmmmmm"
+ /* 6 */ "a...ammmmmm"
+ /* 7 */ "c...cmmmmmm"
+ /* 8 */ "a...ammmmmm"
+ /* 9 */ "c...cmmmmmm"
+ /* 10 */ "a...ammmmmm"
// Level 4
- "abababababa"
- "b.........."
- "a.........."
- "b.........."
- "a...abababa"
- "b...bmmmmmm"
- "a...ammmmmm"
- "b...bmmmmmm"
- "a...ammmmmm"
- "b...bmmmmmm"
- "a...ammmmmm"
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "acacacacaca"
+ /* 1 */ "c.........."
+ /* 2 */ "a.........."
+ /* 3 */ "c.........."
+ /* 4 */ "a...acacaca"
+ /* 5 */ "c...cmmmmmm"
+ /* 6 */ "a...ammmmmm"
+ /* 7 */ "c...cmmmmmm"
+ /* 8 */ "a...ammmmmm"
+ /* 9 */ "c...cmmmmmm"
+ /* 10 */ "a...ammmmmm"
// Level 5
- "abababababa"
- "b.........."
- "a.........."
- "b.........."
- "a...abababa"
- "b...bmmmmmm"
- "a...ammmmmm"
- "b...bmmmmmm"
- "a...ammmmmm"
- "b...bmmmmmm"
- "a...ammmmmm"
-
- // Level 6
- "ccccccccccc"
- "daaaaaaaaaa"
- "daaaaaaaaaa"
- "daaaaaaaaaa"
- "daaaeeeeeee"
- "daaafmmmmmm"
- "daaafmmmmmm"
- "daaafmmmmmm"
- "daaafmmmmmm"
- "daaafmmmmmm"
- "daaafmmmmmm",
-
- // Connections:
- "1: 10, 1, 2: 5\n" /* Type 1, BLOCK_FACE_XP */
- "1: 2, 1, 10: 3\n" /* Type 1, BLOCK_FACE_ZP */,
+ /* z\x* 1 */
+ /* * 01234567890 */
+ /* 0 */ "deeeeeeeeee"
+ /* 1 */ "daaaaaaaaaa"
+ /* 2 */ "daaaaaaaaaa"
+ /* 3 */ "daaaaaaaaaa"
+ /* 4 */ "daaafgggggg"
+ /* 5 */ "daaafmmmmmm"
+ /* 6 */ "daaafmmmmmm"
+ /* 7 */ "daaafmmmmmm"
+ /* 8 */ "daaafmmmmmm"
+ /* 9 */ "daaafmmmmmm"
+ /* 10 */ "daaafmmmmmm",
+
+ // Connectors:
+ "1: 10, 1, 2: 5\n" /* Type 1, direction X+ */
+ "1: 2, 1, 10: 3\n" /* Type 1, direction Z+ */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
- }, // CorridorCorner5Chest
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
+ }, // CorridorCornerChest5
+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CorridorStairs:
- // The data has been exported from gallery Nether, area index 12, ID 42
+ // The data has been exported from the gallery Nether, area index 12, ID 42, created by xoft
{
// Size:
9, 13, 5, // SizeX = 9, SizeY = 13, SizeZ = 5
@@ -1342,114 +2620,236 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
"c:113: 0\n" /* netherbrickfence */
"d:114: 2\n" /* netherbrickstairs */
"e:114: 3\n" /* netherbrickstairs */
- "f: 19: 0\n" /* sponge */,
+ "m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 012345678 */
+ /* 0 */ "aaaaaaaaa"
+ /* 1 */ "aaaaaaaaa"
+ /* 2 */ "aaaaaaaaa"
+ /* 3 */ "aaaaaaaaa"
+ /* 4 */ "aaaaaaaaa"
+
// Level 1
- "aaaaaaaaa"
- "aaaaaaaaa"
- "aaaaaaaaa"
- "aaaaaaaaa"
- "aaaaaaaaa"
+ /* z\x* 012345678 */
+ /* 0 */ "aaaaaaaaa"
+ /* 1 */ ".baaaaaaa"
+ /* 2 */ ".baaaaaaa"
+ /* 3 */ ".baaaaaaa"
+ /* 4 */ "aaaaaaaaa"
// Level 2
- "aaaaaaaaa"
- ".baaaaaaa"
- ".baaaaaaa"
- ".baaaaaaa"
- "aaaaaaaaa"
+ /* z\x* 012345678 */
+ /* 0 */ "acaaaaaaa"
+ /* 1 */ "..baaaaaa"
+ /* 2 */ "..baaaaaa"
+ /* 3 */ "..baaaaaa"
+ /* 4 */ "acaaaaaaa"
// Level 3
- "acaaaaaaa"
- "..baaaaaa"
- "..baaaaaa"
- "..baaaaaa"
- "acaaaaaaa"
+ /* z\x* 012345678 */
+ /* 0 */ "acaaaaaaa"
+ /* 1 */ "...baaaaa"
+ /* 2 */ "...baaaaa"
+ /* 3 */ "...baaaaa"
+ /* 4 */ "acaaaaaaa"
// Level 4
- "acaaaaaaa"
- "...baaaaa"
- "...baaaaa"
- "...baaaaa"
- "acaaaaaaa"
+ /* z\x* 012345678 */
+ /* 0 */ "acacaaaaa"
+ /* 1 */ "....baaaa"
+ /* 2 */ "....baaaa"
+ /* 3 */ "....baaaa"
+ /* 4 */ "acacaaaaa"
// Level 5
- "acacaaaaa"
- "....baaaa"
- "....baaaa"
- "....baaaa"
- "acacaaaaa"
+ /* z\x* 012345678 */
+ /* 0 */ "aaacaaaaa"
+ /* 1 */ ".....baaa"
+ /* 2 */ ".....baaa"
+ /* 3 */ ".....baaa"
+ /* 4 */ "aaacaaaaa"
// Level 6
- "aaacaaaaa"
- ".....baaa"
- ".....baaa"
- ".....baaa"
- "aaacaaaaa"
+ /* z\x* 012345678 */
+ /* 0 */ "daacacaaa"
+ /* 1 */ "a.....baa"
+ /* 2 */ "a.....baa"
+ /* 3 */ "a.....baa"
+ /* 4 */ "eaacacaaa"
// Level 7
- "daacacaaa"
- "a.....baa"
- "a.....baa"
- "a.....baa"
- "eaacacaaa"
+ /* z\x* 012345678 */
+ /* 0 */ "mdaaacaaa"
+ /* 1 */ "ma.....ba"
+ /* 2 */ "ma.....ba"
+ /* 3 */ "ma.....ba"
+ /* 4 */ "meaaacaaa"
// Level 8
- "fdaaacaaa"
- "fa.....ba"
- "fa.....ba"
- "fa.....ba"
- "feaaacaaa"
+ /* z\x* 012345678 */
+ /* 0 */ "mmdaacaca"
+ /* 1 */ "mma......"
+ /* 2 */ "mma......"
+ /* 3 */ "mma......"
+ /* 4 */ "mmeaacaca"
// Level 9
- "ffdaacaca"
- "ffa......"
- "ffa......"
- "ffa......"
- "ffeaacaca"
+ /* z\x* 012345678 */
+ /* 0 */ "mmmdaaaca"
+ /* 1 */ "mmma....."
+ /* 2 */ "mmma....."
+ /* 3 */ "mmma....."
+ /* 4 */ "mmmeaaaca"
// Level 10
- "fffdaaaca"
- "fffa....."
- "fffa....."
- "fffa....."
- "fffeaaaca"
+ /* z\x* 012345678 */
+ /* 0 */ "mmmmdaaca"
+ /* 1 */ "mmmma...."
+ /* 2 */ "mmmma...."
+ /* 3 */ "mmmma...."
+ /* 4 */ "mmmmeaaca"
// Level 11
- "ffffdaaca"
- "ffffa...."
- "ffffa...."
- "ffffa...."
- "ffffeaaca"
+ /* z\x* 012345678 */
+ /* 0 */ "mmmmmdaaa"
+ /* 1 */ "mmmmma..."
+ /* 2 */ "mmmmma..."
+ /* 3 */ "mmmmma..."
+ /* 4 */ "mmmmmeaaa"
// Level 12
- "fffffdaaa"
- "fffffa..."
- "fffffa..."
- "fffffa..."
- "fffffeaaa"
+ /* z\x* 012345678 */
+ /* 0 */ "mmmmmmddd"
+ /* 1 */ "mmmmmmaaa"
+ /* 2 */ "mmmmmmaaa"
+ /* 3 */ "mmmmmmaaa"
+ /* 4 */ "mmmmmmeee",
+
+ // Connectors:
+ "1: 0, 1, 2: 4\n" /* Type 1, direction X- */
+ "1: 8, 8, 2: 5\n" /* Type 1, direction X+ */,
- // Level 13
- "ffffffddd"
- "ffffffaaa"
- "ffffffaaa"
- "ffffffaaa"
- "ffffffeee",
-
- // Connections:
- "1: 0, 1, 2: 4\n" /* Type 1, BLOCK_FACE_XM */
- "1: 8, 8, 2: 5\n" /* Type 1, BLOCK_FACE_XP */,
-
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
}, // CorridorStairs
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // DarkCorridor:
+ // The data has been exported from the gallery Nether, area index 3, ID 30, created by STR_Warrior
+ {
+ // Size:
+ 14, 6, 5, // SizeX = 14, SizeY = 6, SizeZ = 5
+
+ // Block definitions:
+ ".: 0: 0\n" /* air */
+ "a:112: 0\n" /* netherbrick */
+ "b:113: 0\n" /* netherbrickfence */
+ "c:114: 2\n" /* netherbrickstairs */
+ "d:114: 3\n" /* netherbrickstairs */
+ "m: 19: 0\n" /* sponge */,
+
+ // Block data:
+ // Level 0
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "aaaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaaa"
+
+ // Level 1
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "aaaaaaaaaaaaaa"
+ /* 1 */ ".............."
+ /* 2 */ ".............."
+ /* 3 */ ".............."
+ /* 4 */ "aaaaaaaaaaaaaa"
+
+ // Level 2
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "aabaaaaaaaabaa"
+ /* 1 */ ".............."
+ /* 2 */ ".............."
+ /* 3 */ ".............."
+ /* 4 */ "aabaaaaaaaabaa"
+
+ // Level 3
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "aabaaaaaaaabaa"
+ /* 1 */ ".............."
+ /* 2 */ ".............."
+ /* 3 */ ".............."
+ /* 4 */ "aabaaaaaaaabaa"
+
+ // Level 4
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "aabaaaaaaaabaa"
+ /* 1 */ ".............."
+ /* 2 */ ".............."
+ /* 3 */ ".............."
+ /* 4 */ "aabaaaaaaaabaa"
+
+ // Level 5
+ /* z\x* 1111 */
+ /* * 01234567890123 */
+ /* 0 */ "cccccccccccccc"
+ /* 1 */ "aaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaa"
+ /* 4 */ "dddddddddddddd",
+
+ // Connectors:
+ "1: 0, 1, 2: 4\n" /* Type 1, direction X- */
+ "1: 13, 1, 2: 5\n" /* Type 1, direction X+ */,
+
+ // AllowedRotations:
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
+ // Merge strategy:
+ cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
+ }, // DarkCorridor
+
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// LavaStaircase:
- // The data has been exported from gallery Nether, area index 28, ID 278
+ // The data has been exported from the gallery Nether, area index 28, ID 278, created by Aloe_vera
{
// Size:
15, 11, 15, // SizeX = 15, SizeY = 11, SizeZ = 15
@@ -1458,211 +2858,248 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
".: 0: 0\n" /* air */
"a:112: 0\n" /* netherbrick */
"b:113: 0\n" /* netherbrickfence */
- "c: 11: 0\n" /* lava */,
+ "c: 10: 0\n" /* lava */
+ "m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaaaaa"
+ /* 7 */ "aaaaaaaaaaaaaaa"
+ /* 8 */ "aaaaaaaaaaaaaaa"
+ /* 9 */ "aaaaaaaaaaaaaaa"
+ /* 10 */ "aaaaaaaaaaaaaaa"
+ /* 11 */ "aaaaaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaaaaa"
+ /* 13 */ "aaaaaaaaaaaaaaa"
+ /* 14 */ "aaaaaaaaaaaaaaa"
+
// Level 1
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaa...aaaa"
+ /* 1 */ "aaaaa.........a"
+ /* 2 */ "aaaaa.........a"
+ /* 3 */ "aaaaab........a"
+ /* 4 */ "accca...aaaa..a"
+ /* 5 */ "accca...acca..a"
+ /* 6 */ "acccaaaaacca..a"
+ /* 7 */ "acccccccccca..a"
+ /* 8 */ "acccaaaaacca..a"
+ /* 9 */ "accca...acca..a"
+ /* 10 */ "accca...aaaa..a"
+ /* 11 */ "aaaaab........a"
+ /* 12 */ "aaaaa.........a"
+ /* 13 */ "aaaaa.........a"
+ /* 14 */ "aaaaaaaa...aaaa"
// Level 2
- "aaaaaaaa...aaaa"
- "aaaaa.........a"
- "aaaaa.........a"
- "aaaaab........a"
- "accca...aaaa..a"
- "accca...acca..a"
- "acccaaaaacca..a"
- "acccccccccca..a"
- "acccaaaaacca..a"
- "accca...acca..a"
- "accca...aaaa..a"
- "aaaaab........a"
- "aaaaa.........a"
- "aaaaa.........a"
- "aaaaaaaa...aaaa"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaa...aaaa"
+ /* 1 */ "aaaa..........a"
+ /* 2 */ "aaaa..........a"
+ /* 3 */ "aaaabb........a"
+ /* 4 */ "aaaa..........a"
+ /* 5 */ "a.............a"
+ /* 6 */ "a.............a"
+ /* 7 */ "a.............a"
+ /* 8 */ "a.............a"
+ /* 9 */ "a.............a"
+ /* 10 */ "aaaa..........a"
+ /* 11 */ "aaaabb........a"
+ /* 12 */ "aaaa..........a"
+ /* 13 */ "aaaa..........a"
+ /* 14 */ "aaaaaaaa...aaaa"
// Level 3
- "aaaaaaaa...aaaa"
- "aaaa..........a"
- "aaaa..........a"
- "aaaabb........a"
- "aaaa..........a"
- "a.............a"
- "a.............a"
- "a.............a"
- "a.............a"
- "a.............a"
- "aaaa..........a"
- "aaaabb........a"
- "aaaa..........a"
- "aaaa..........a"
- "aaaaaaaa...aaaa"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaa...aaaa"
+ /* 1 */ "a.............a"
+ /* 2 */ "a.............a"
+ /* 3 */ "a..bb.........a"
+ /* 4 */ "aaaa..........a"
+ /* 5 */ "aaaa..........a"
+ /* 6 */ "a.............a"
+ /* 7 */ "a.............a"
+ /* 8 */ "a.............a"
+ /* 9 */ "aaaa..........a"
+ /* 10 */ "aaaa..........a"
+ /* 11 */ "a..bb.........a"
+ /* 12 */ "a.............a"
+ /* 13 */ "a.............a"
+ /* 14 */ "aaaaaaaa...aaaa"
// Level 4
- "aaaaaaaa...aaaa"
- "a.............a"
- "a.............a"
- "a..bb.........a"
- "aaaa..........a"
- "aaaa..........a"
- "a.............a"
- "a.............a"
- "a.............a"
- "aaaa..........a"
- "aaaa..........a"
- "a..bb.........a"
- "a.............a"
- "a.............a"
- "aaaaaaaa...aaaa"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaa...aaaa"
+ /* 1 */ "a.............a"
+ /* 2 */ "a.............a"
+ /* 3 */ "a..b..........a"
+ /* 4 */ "a..b..........a"
+ /* 5 */ "aaaa..........a"
+ /* 6 */ "aaaa..........a"
+ /* 7 */ "a.............a"
+ /* 8 */ "aaaa..........a"
+ /* 9 */ "aaaa..........a"
+ /* 10 */ "a..b..........a"
+ /* 11 */ "a..b..........a"
+ /* 12 */ "a.............a"
+ /* 13 */ "a.............a"
+ /* 14 */ "aaaaaaaa...aaaa"
// Level 5
- "aaaaaaaabbbaaaa"
- "a.............a"
- "a.............a"
- "a..b..........a"
- "a..b..........a"
- "aaaa..........a"
- "aaaa..........a"
- "a.............a"
- "aaaa..........a"
- "aaaa..........a"
- "a..b..........a"
- "a..b..........a"
- "a.............a"
- "a.............a"
- "aaaaaaaabbbaaaa"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaaaaaaaaa"
+ /* 1 */ "a.............a"
+ /* 2 */ "a.............a"
+ /* 3 */ "a.............a"
+ /* 4 */ "a..b..........a"
+ /* 5 */ "a..b..........a"
+ /* 6 */ "aaaa..........a"
+ /* 7 */ "aaaa..........a"
+ /* 8 */ "aaaa..........a"
+ /* 9 */ "a..b..........a"
+ /* 10 */ "a..b..........a"
+ /* 11 */ "a.............a"
+ /* 12 */ "a.............a"
+ /* 13 */ "a.............a"
+ /* 14 */ "aaaaaaaaaaaaaaa"
// Level 6
- "aaaaaaaaaaaaaaa"
- "a.............a"
- "a.............a"
- "a.............a"
- "a..b..........a"
- "a..b..........a"
- "aaaa..........a"
- "aaaa..........a"
- "aaaa..........a"
- "a..b..........a"
- "a..b..........a"
- "a.............a"
- "a.............a"
- "a.............a"
- "aaaaaaaaaaaaaaa"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaaaaaaaaa"
+ /* 1 */ "a.............a"
+ /* 2 */ "a.............a"
+ /* 3 */ "a.............a"
+ /* 4 */ "a.............a"
+ /* 5 */ "a..b..........a"
+ /* 6 */ "...b..........a"
+ /* 7 */ "...b..........a"
+ /* 8 */ "...b..........a"
+ /* 9 */ "a..b..........a"
+ /* 10 */ "a.............a"
+ /* 11 */ "a.............a"
+ /* 12 */ "a.............a"
+ /* 13 */ "a.............a"
+ /* 14 */ "aaaaaaaaaaaaaaa"
// Level 7
- "aaaaaaaaaaaaaaa"
- "a.............a"
- "a.............a"
- "a.............a"
- "a.............a"
- "a..b..........a"
- "...b..........a"
- "...b..........a"
- "...b..........a"
- "a..b..........a"
- "a.............a"
- "a.............a"
- "a.............a"
- "a.............a"
- "aaaaaaaaaaaaaaa"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aababababababaa"
+ /* 1 */ "a.............a"
+ /* 2 */ "b.............b"
+ /* 3 */ "a.............a"
+ /* 4 */ "b.............b"
+ /* 5 */ "a.............a"
+ /* 6 */ "..............b"
+ /* 7 */ "..............a"
+ /* 8 */ "..............b"
+ /* 9 */ "a.............a"
+ /* 10 */ "b.............b"
+ /* 11 */ "a.............a"
+ /* 12 */ "b.............b"
+ /* 13 */ "a.............a"
+ /* 14 */ "aababababababaa"
// Level 8
- "aababababababaa"
- "a.............a"
- "b.............b"
- "a.............a"
- "b.............b"
- "a.............a"
- "..............b"
- "..............a"
- "..............b"
- "a.............a"
- "b.............b"
- "a.............a"
- "b.............b"
- "a.............a"
- "aababababababaa"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aababababababaa"
+ /* 1 */ "a.............a"
+ /* 2 */ "b.............b"
+ /* 3 */ "a.............a"
+ /* 4 */ "b.............b"
+ /* 5 */ "a.............a"
+ /* 6 */ "..............b"
+ /* 7 */ "..............a"
+ /* 8 */ "..............b"
+ /* 9 */ "a.............a"
+ /* 10 */ "b.............b"
+ /* 11 */ "a.............a"
+ /* 12 */ "b.............b"
+ /* 13 */ "a.............a"
+ /* 14 */ "aababababababaa"
// Level 9
- "aababababababaa"
- "a.............a"
- "b.............b"
- "a.............a"
- "b.............b"
- "a.............a"
- "..............b"
- "..............a"
- "..............b"
- "a.............a"
- "b.............b"
- "a.............a"
- "b.............b"
- "a.............a"
- "aababababababaa"
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aababababababaa"
+ /* 1 */ "a.............a"
+ /* 2 */ "b.............b"
+ /* 3 */ "a.............a"
+ /* 4 */ "b.............b"
+ /* 5 */ "a.............a"
+ /* 6 */ "..............b"
+ /* 7 */ "..............a"
+ /* 8 */ "..............b"
+ /* 9 */ "a.............a"
+ /* 10 */ "b.............b"
+ /* 11 */ "a.............a"
+ /* 12 */ "b.............b"
+ /* 13 */ "a.............a"
+ /* 14 */ "aababababababaa"
// Level 10
- "aababababababaa"
- "a.............a"
- "b.............b"
- "a.............a"
- "b.............b"
- "a.............a"
- "..............b"
- "..............a"
- "..............b"
- "a.............a"
- "b.............b"
- "a.............a"
- "b.............b"
- "a.............a"
- "aababababababaa"
-
- // Level 11
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaa",
-
- // Connections:
- "1: 0, 6, 7: 4\n" /* Type 1, BLOCK_FACE_XM */
- "0: 9, 1, 0: 2\n" /* Type 0, BLOCK_FACE_ZM */
- "0: 9, 1, 14: 3\n" /* Type 0, BLOCK_FACE_ZP */,
+ /* z\x* 11111 */
+ /* * 012345678901234 */
+ /* 0 */ "aaaaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaaaaa"
+ /* 7 */ "aaaaaaaaaaaaaaa"
+ /* 8 */ "aaaaaaaaaaaaaaa"
+ /* 9 */ "aaaaaaaaaaaaaaa"
+ /* 10 */ "aaaaaaaaaaaaaaa"
+ /* 11 */ "aaaaaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaaaaa"
+ /* 13 */ "aaaaaaaaaaaaaaa"
+ /* 14 */ "aaaaaaaaaaaaaaa",
+
+ // Connectors:
+ "1: 0, 6, 7: 4\n" /* Type 1, direction X- */
+ "1: 9, 1, 14: 3\n" /* Type 1, direction Z+ */
+ "1: 9, 1, 0: 2\n" /* Type 1, direction Z- */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
}, // LavaStaircase
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// LavaStaircaseBig:
- // The data has been exported from gallery Nether, area index 31, ID 282
+ // The data has been exported from the gallery Nether, area index 31, ID 282, created by STR_Warrior
{
// Size:
12, 15, 15, // SizeX = 12, SizeY = 15, SizeZ = 15
@@ -1671,278 +3108,597 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
".: 0: 0\n" /* air */
"a:112: 0\n" /* netherbrick */
"b: 10: 0\n" /* lava */
- "c:113: 0\n" /* netherbrickfence */,
+ "c:113: 0\n" /* netherbrickfence */
+ "m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaa"
+ /* 7 */ "aaaaaaaaaaaa"
+ /* 8 */ "aaaaaaaaaaaa"
+ /* 9 */ "aaaaaaaaaaaa"
+ /* 10 */ "aaaaaaaaaaaa"
+ /* 11 */ "aaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaa"
+ /* 13 */ "aaaaaaaaaaaa"
+ /* 14 */ "aaaaaaaaaaaa"
+
// Level 1
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaa"
+ /* 4 */ "abbbbbaaaaaa"
+ /* 5 */ "abbbbbbaaaaa"
+ /* 6 */ "abbbbbba...."
+ /* 7 */ "abbbbbba...."
+ /* 8 */ "abbbbbba...."
+ /* 9 */ "abbbbbbaaaaa"
+ /* 10 */ "abbbbb.aaaaa"
+ /* 11 */ "aaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaa"
+ /* 13 */ "aaaaaaaaaaaa"
+ /* 14 */ "aaaaaaaaaaaa"
// Level 2
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "abbbbbaaaaaa"
- "abbbbbbaaaaa"
- "abbbbbba...."
- "abbbbbba...."
- "abbbbbba...."
- "abbbbbbaaaaa"
- "abbbbb.aaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaa"
+ /* 4 */ "abbbbbaaaaaa"
+ /* 5 */ "abbbbbba...a"
+ /* 6 */ "abbbbbba...."
+ /* 7 */ "abbbbbba...."
+ /* 8 */ "abbbbbba...."
+ /* 9 */ "abbbbbba...a"
+ /* 10 */ "abbbbb.aaaaa"
+ /* 11 */ "aaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaa"
+ /* 13 */ "aaaaaaaaaaaa"
+ /* 14 */ "aaaaaaaaaaaa"
// Level 3
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "abbbbbaaaaaa"
- "abbbbbba...a"
- "abbbbbba...."
- "abbbbbba...."
- "abbbbbba...."
- "abbbbbba...a"
- "abbbbb.aaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaa"
+ /* 4 */ "abbbbbaa...a"
+ /* 5 */ "abbbbbba...a"
+ /* 6 */ "abbbbbba...."
+ /* 7 */ "abbbbbba...."
+ /* 8 */ "abbbbbba...."
+ /* 9 */ "abbbbbba...a"
+ /* 10 */ "abbbbbaa...a"
+ /* 11 */ "aaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaa"
+ /* 13 */ "aaaaaaaaaaaa"
+ /* 14 */ "aaaaaaaaaaaa"
// Level 4
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "abbbbbaa...a"
- "abbbbbba...a"
- "abbbbbba...."
- "abbbbbba...."
- "abbbbbba...."
- "abbbbbba...a"
- "abbbbbaa...a"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "aaaaa......a"
+ /* 2 */ "aaaaa......a"
+ /* 3 */ "aaaaacc....a"
+ /* 4 */ "a.....cc...a"
+ /* 5 */ "a......c...a"
+ /* 6 */ "a......c...a"
+ /* 7 */ "a......c...a"
+ /* 8 */ "a......c...a"
+ /* 9 */ "a......c...a"
+ /* 10 */ "a.....cc...a"
+ /* 11 */ "aaaaacc....a"
+ /* 12 */ "aaaaa......a"
+ /* 13 */ "aaaaa......a"
+ /* 14 */ "aaaaaaaaaaaa"
// Level 5
- "aaaaaaaaaaaa"
- "aaaaa......a"
- "aaaaa......a"
- "aaaaacc....a"
- "a.....cc...a"
- "a......c...a"
- "a......c...."
- "a......c...."
- "a......c...."
- "a......c...a"
- "a.....cc...a"
- "aaaaacc....a"
- "aaaaa......a"
- "aaaaa......a"
- "aaaaaaaaaaaa"
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "aaaa.......a"
+ /* 2 */ "aaaa.......a"
+ /* 3 */ "aaaacc.....a"
+ /* 4 */ "aaaa.......a"
+ /* 5 */ "a..........a"
+ /* 6 */ "a..........a"
+ /* 7 */ "a..........a"
+ /* 8 */ "a..........a"
+ /* 9 */ "a..........a"
+ /* 10 */ "aaaa.......a"
+ /* 11 */ "aaaacc.....a"
+ /* 12 */ "aaaa.......a"
+ /* 13 */ "aaaa.......a"
+ /* 14 */ "aaaaaaaaaaaa"
// Level 6
- "aaaaaaaaaaaa"
- "aaaa.......a"
- "aaaa.......a"
- "aaaacc.....a"
- "aaaa.......a"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "aaaa.......a"
- "aaaacc.....a"
- "aaaa.......a"
- "aaaa.......a"
- "aaaaaaaaaaaa"
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "a..........a"
+ /* 2 */ "a..........a"
+ /* 3 */ "a..cc......a"
+ /* 4 */ "aaaa.......a"
+ /* 5 */ "aaaa.......a"
+ /* 6 */ "a..........a"
+ /* 7 */ "a..........a"
+ /* 8 */ "a..........a"
+ /* 9 */ "aaaa.......a"
+ /* 10 */ "aaaa.......a"
+ /* 11 */ "a..cc......a"
+ /* 12 */ "a..........a"
+ /* 13 */ "a..........a"
+ /* 14 */ "aaaaaaaaaaaa"
// Level 7
- "aaaaaaaaaaaa"
- "a..........a"
- "a..........a"
- "a..cc......a"
- "aaaa.......a"
- "aaaa.......a"
- "a..........a"
- "a..........a"
- "a..........a"
- "aaaa.......a"
- "aaaa.......a"
- "a..cc......a"
- "a..........a"
- "a..........a"
- "aaaaaaaaaaaa"
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "a..........a"
+ /* 2 */ "a..........a"
+ /* 3 */ "a..c.......a"
+ /* 4 */ "a..c.......a"
+ /* 5 */ "aaaa.......a"
+ /* 6 */ "aaaa.......a"
+ /* 7 */ "a..........a"
+ /* 8 */ "aaaa.......a"
+ /* 9 */ "aaaa.......a"
+ /* 10 */ "a..c.......a"
+ /* 11 */ "a..c.......a"
+ /* 12 */ "a..........a"
+ /* 13 */ "a..........a"
+ /* 14 */ "aaaaaaaaaaaa"
// Level 8
- "aaaaaaaaaaaa"
- "a..........a"
- "a..........a"
- "a..c.......a"
- "a..c.......a"
- "aaaa.......a"
- "aaaa.......a"
- "a..........a"
- "aaaa.......a"
- "aaaa.......a"
- "a..c.......a"
- "a..c.......a"
- "a..........a"
- "a..........a"
- "aaaaaaaaaaaa"
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "a..........a"
+ /* 2 */ "a..........a"
+ /* 3 */ "a..........a"
+ /* 4 */ "a..c.......a"
+ /* 5 */ "a..c.......a"
+ /* 6 */ "aaaa.......a"
+ /* 7 */ "aaaa.......a"
+ /* 8 */ "aaaa.......a"
+ /* 9 */ "a..c.......a"
+ /* 10 */ "a..c.......a"
+ /* 11 */ "a..........a"
+ /* 12 */ "a..........a"
+ /* 13 */ "a..........a"
+ /* 14 */ "aaaaaaaaaaaa"
// Level 9
- "aaaaaaaaaaaa"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..c.......a"
- "a..c.......a"
- "aaaa.......a"
- "aaaa.......a"
- "aaaa.......a"
- "a..c.......a"
- "a..c.......a"
- "a..........a"
- "a..........a"
- "a..........a"
- "aaaaaaaaaaaa"
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "a..........a"
+ /* 2 */ "a..........a"
+ /* 3 */ "a..........a"
+ /* 4 */ "a..........a"
+ /* 5 */ "a..c.......a"
+ /* 6 */ "...c.......a"
+ /* 7 */ "...c.......a"
+ /* 8 */ "...c.......a"
+ /* 9 */ "a..c.......a"
+ /* 10 */ "a..........a"
+ /* 11 */ "a..........a"
+ /* 12 */ "a..........a"
+ /* 13 */ "a..........a"
+ /* 14 */ "aaaaaaaaaaaa"
// Level 10
- "aaaaaaaaaaaa"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..c.......a"
- "...c.......a"
- "...c.......a"
- "...c.......a"
- "a..c.......a"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "aaaaaaaaaaaa"
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "a..........a"
+ /* 2 */ "a..........a"
+ /* 3 */ "a..........a"
+ /* 4 */ "a..........a"
+ /* 5 */ "a..........a"
+ /* 6 */ "...........a"
+ /* 7 */ "...........a"
+ /* 8 */ "...........a"
+ /* 9 */ "a..........a"
+ /* 10 */ "a..........a"
+ /* 11 */ "a..........a"
+ /* 12 */ "a..........a"
+ /* 13 */ "a..........a"
+ /* 14 */ "aaaaaaaaaaaa"
// Level 11
- "aaaaaaaaaaaa"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "...........a"
- "...........a"
- "...........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "aaaaaaaaaaaa"
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "a..........a"
+ /* 2 */ "a..........a"
+ /* 3 */ "a..........a"
+ /* 4 */ "a..........a"
+ /* 5 */ "a..........a"
+ /* 6 */ "...........a"
+ /* 7 */ "...........a"
+ /* 8 */ "...........a"
+ /* 9 */ "a..........a"
+ /* 10 */ "a..........a"
+ /* 11 */ "a..........a"
+ /* 12 */ "a..........a"
+ /* 13 */ "a..........a"
+ /* 14 */ "aaaaaaaaaaaa"
// Level 12
- "aaaaaaaaaaaa"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "...........a"
- "...........a"
- "...........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "aaaaaaaaaaaa"
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "a..........a"
+ /* 2 */ "a..........a"
+ /* 3 */ "a..........a"
+ /* 4 */ "a..........a"
+ /* 5 */ "a..........a"
+ /* 6 */ "a..........a"
+ /* 7 */ "a..........a"
+ /* 8 */ "a..........a"
+ /* 9 */ "a..........a"
+ /* 10 */ "a..........a"
+ /* 11 */ "a..........a"
+ /* 12 */ "a..........a"
+ /* 13 */ "a..........a"
+ /* 14 */ "aaaaaaaaaaaa"
// Level 13
- "aaaaaaaaaaaa"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "...........a"
- "...........a"
- "...........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "a..........a"
- "aaaaaaaaaaaa"
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaa"
+ /* 7 */ "aaaaaaaaaaaa"
+ /* 8 */ "aaaaaaaaaaaa"
+ /* 9 */ "aaaaaaaaaaaa"
+ /* 10 */ "aaaaaaaaaaaa"
+ /* 11 */ "aaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaa"
+ /* 13 */ "aaaaaaaaaaaa"
+ /* 14 */ "aaaaaaaaaaaa"
// Level 14
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
- "aaaaaaaaaaaa"
-
- // Level 15
- "aaaaaaaaaaaa"
- "abbbbbbbbbba"
- "abbbbbbbbbba"
- "abbbbbbbbbba"
- "abbbbbbbbbba"
- "abbbbbbbbbba"
- "abbbbbbbbbba"
- "abbbbbbbbbba"
- "abbbbbbbbbba"
- "abbbbbbbbbba"
- "abbbbbbbbbba"
- "abbbbbbbbbba"
- "abbbbbbbbbba"
- "abbbbbbbbbba"
- "aaaaaaaaaaaa",
-
- // Connections:
- "1: 0, 9, 7: 4\n" /* Type 1, BLOCK_FACE_XM */
- "1: 11, 1, 7: 5\n" /* Type 1, BLOCK_FACE_XP */,
+ /* z\x* 11 */
+ /* * 012345678901 */
+ /* 0 */ "aaaaaaaaaaaa"
+ /* 1 */ "abbbbbbbbbba"
+ /* 2 */ "abbbbbbbbbba"
+ /* 3 */ "abbbbbbbbbba"
+ /* 4 */ "abbbbbbbbbba"
+ /* 5 */ "abbbbbbbbbba"
+ /* 6 */ "abbbbbbbbbba"
+ /* 7 */ "abbbbbbbbbba"
+ /* 8 */ "abbbbbbbbbba"
+ /* 9 */ "abbbbbbbbbba"
+ /* 10 */ "abbbbbbbbbba"
+ /* 11 */ "abbbbbbbbbba"
+ /* 12 */ "abbbbbbbbbba"
+ /* 13 */ "abbbbbbbbbba"
+ /* 14 */ "aaaaaaaaaaaa",
+
+ // Connectors:
+ "1: 11, 1, 7: 5\n" /* Type 1, direction X+ */
+ "1: 0, 9, 7: 4\n" /* Type 1, direction X- */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
}, // LavaStaircaseBig
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // LavaStairsBridge:
+ // The data has been exported from the gallery Nether, area index 30, ID 281, created by STR_Warrior
+ {
+ // Size:
+ 16, 12, 15, // SizeX = 16, SizeY = 12, SizeZ = 15
+
+ // Block definitions:
+ ".: 0: 0\n" /* air */
+ "a:112: 0\n" /* netherbrick */
+ "b:113: 0\n" /* netherbrickfence */
+ "c: 10: 0\n" /* lava */
+ "d:114: 2\n" /* netherbrickstairs */
+ "e:114: 3\n" /* netherbrickstairs */
+ "f:114: 7\n" /* netherbrickstairs */
+ "g: 44:14\n" /* step */
+ "h:114: 6\n" /* netherbrickstairs */
+ "i: 44: 6\n" /* step */
+ "j:114: 0\n" /* netherbrickstairs */
+ "m: 19: 0\n" /* sponge */,
+
+ // Block data:
+ // Level 0
+ /* z\x* 111111 */
+ /* * 0123456789012345 */
+ /* 0 */ "aaaaaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaaaaaa"
+ /* 7 */ "aaaaaaaaaaaaaaaa"
+ /* 8 */ "aaaaaaaaaaaaaaaa"
+ /* 9 */ "aaaaaaaaaaaaaaaa"
+ /* 10 */ "aaaaaaaaaaaaaaaa"
+ /* 11 */ "aaaaaaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaaaaaa"
+ /* 13 */ "aaaaaaaaaaaaaaaa"
+ /* 14 */ "aaaaaaaaaaaaaaaa"
+
+ // Level 1
+ /* z\x* 111111 */
+ /* * 0123456789012345 */
+ /* 0 */ "aaaaaaaa...aaaaa"
+ /* 1 */ "aaaaa..........a"
+ /* 2 */ "aaaaa..........a"
+ /* 3 */ "aaaaab.........a"
+ /* 4 */ "accca...ddd.aaaa"
+ /* 5 */ "accca...aaa.acca"
+ /* 6 */ "acccaaaaaaaaacca"
+ /* 7 */ "acccccccccccccca"
+ /* 8 */ "acccaaaaaaaaacca"
+ /* 9 */ "accca...aaa.acca"
+ /* 10 */ "accca...eee.aaaa"
+ /* 11 */ "aaaaab.........a"
+ /* 12 */ "aaaaa..........a"
+ /* 13 */ "aaaaa..........a"
+ /* 14 */ "aaaaaaaa...aaaaa"
+
+ // Level 2
+ /* z\x* 111111 */
+ /* * 0123456789012345 */
+ /* 0 */ "aaaaaaaa...aaaaa"
+ /* 1 */ "aaaa...........a"
+ /* 2 */ "aaaa...........a"
+ /* 3 */ "aaaabb.........a"
+ /* 4 */ "aaaa........b..a"
+ /* 5 */ "a.......ddd....a"
+ /* 6 */ "a.......fff....a"
+ /* 7 */ "a.......ggg....a"
+ /* 8 */ "a.......hhh....a"
+ /* 9 */ "a.......eee....a"
+ /* 10 */ "aaaa........b..a"
+ /* 11 */ "aaaabb.........a"
+ /* 12 */ "aaaa...........a"
+ /* 13 */ "aaaa...........a"
+ /* 14 */ "aaaaaaaa...aaaaa"
+
+ // Level 3
+ /* z\x* 111111 */
+ /* * 0123456789012345 */
+ /* 0 */ "aaaaaaaa...aaaaa"
+ /* 1 */ "a..............a"
+ /* 2 */ "a..............a"
+ /* 3 */ "a..bb..........a"
+ /* 4 */ "aaaa........b..a"
+ /* 5 */ "aaaa...........a"
+ /* 6 */ "a..............a"
+ /* 7 */ "a..............a"
+ /* 8 */ "a..............a"
+ /* 9 */ "aaaa...........a"
+ /* 10 */ "aaaa........b..a"
+ /* 11 */ "a..bb..........a"
+ /* 12 */ "a..............a"
+ /* 13 */ "a..............a"
+ /* 14 */ "aaaaaaaa...aaaaa"
+
+ // Level 4
+ /* z\x* 111111 */
+ /* * 0123456789012345 */
+ /* 0 */ "aaaaaaaabbbaaaaa"
+ /* 1 */ "a..............a"
+ /* 2 */ "a..............a"
+ /* 3 */ "a..b...........a"
+ /* 4 */ "a..b........b..a"
+ /* 5 */ "aaaa...........a"
+ /* 6 */ "aaaa...........a"
+ /* 7 */ "a..............a"
+ /* 8 */ "aaaa...........a"
+ /* 9 */ "aaaa...........a"
+ /* 10 */ "a..b........b..a"
+ /* 11 */ "a..b...........a"
+ /* 12 */ "a..............a"
+ /* 13 */ "a..............a"
+ /* 14 */ "aaaaaaaabbbaaaaa"
+
+ // Level 5
+ /* z\x* 111111 */
+ /* * 0123456789012345 */
+ /* 0 */ "aaaaaaaaaaaaaaaa"
+ /* 1 */ "a..............a"
+ /* 2 */ "a..............a"
+ /* 3 */ "a...........ggga"
+ /* 4 */ "a..b........iija"
+ /* 5 */ "a..b........iija"
+ /* 6 */ "aaaa........iija"
+ /* 7 */ "aaaa........iija"
+ /* 8 */ "aaaa........iija"
+ /* 9 */ "a..b........iija"
+ /* 10 */ "a..b........iija"
+ /* 11 */ "a...........ggga"
+ /* 12 */ "a..............a"
+ /* 13 */ "a..............a"
+ /* 14 */ "aaaaaaaaaaaaaaaa"
+
+ // Level 6
+ /* z\x* 111111 */
+ /* * 0123456789012345 */
+ /* 0 */ "aaaaaaaaaaaaaaaa"
+ /* 1 */ "a.............ga"
+ /* 2 */ "a............iia"
+ /* 3 */ "a..............a"
+ /* 4 */ "a..............a"
+ /* 5 */ "a..b...........a"
+ /* 6 */ "...b...........a"
+ /* 7 */ "...b...........a"
+ /* 8 */ "...b...........a"
+ /* 9 */ "a..b...........a"
+ /* 10 */ "a..............a"
+ /* 11 */ "a..............a"
+ /* 12 */ "a............iia"
+ /* 13 */ "a.............ga"
+ /* 14 */ "aaaaaaaaaaaaaaaa"
+
+ // Level 7
+ /* z\x* 111111 */
+ /* * 0123456789012345 */
+ /* 0 */ "aaaaaaaaaaaaaaaa"
+ /* 1 */ "a..............a"
+ /* 2 */ "a..............a"
+ /* 3 */ "a..............a"
+ /* 4 */ "a..............a"
+ /* 5 */ "a..............a"
+ /* 6 */ "...............a"
+ /* 7 */ "...............a"
+ /* 8 */ "...............a"
+ /* 9 */ "a..............a"
+ /* 10 */ "a..............a"
+ /* 11 */ "a..............a"
+ /* 12 */ "a..............a"
+ /* 13 */ "a..............a"
+ /* 14 */ "aaaaaaaaaaaaaaaa"
+
+ // Level 8
+ /* z\x* 111111 */
+ /* * 0123456789012345 */
+ /* 0 */ "aaaaaaaaaaaaaaaa"
+ /* 1 */ "a..............a"
+ /* 2 */ "a..............a"
+ /* 3 */ "a..............a"
+ /* 4 */ "a..............a"
+ /* 5 */ "a..............a"
+ /* 6 */ "...............a"
+ /* 7 */ "...............a"
+ /* 8 */ "...............a"
+ /* 9 */ "a..............a"
+ /* 10 */ "a..............a"
+ /* 11 */ "a..............a"
+ /* 12 */ "a..............a"
+ /* 13 */ "a..............a"
+ /* 14 */ "aaaaaaaaaaaaaaaa"
+
+ // Level 9
+ /* z\x* 111111 */
+ /* * 0123456789012345 */
+ /* 0 */ "aaaaaaaaaaaaaaaa"
+ /* 1 */ "a..............a"
+ /* 2 */ "a..............a"
+ /* 3 */ "a..............a"
+ /* 4 */ "a..............a"
+ /* 5 */ "a..............a"
+ /* 6 */ "a..............a"
+ /* 7 */ "a..............a"
+ /* 8 */ "a..............a"
+ /* 9 */ "a..............a"
+ /* 10 */ "a..............a"
+ /* 11 */ "a..............a"
+ /* 12 */ "a..............a"
+ /* 13 */ "a..............a"
+ /* 14 */ "aaaaaaaaaaaaaaaa"
+
+ // Level 10
+ /* z\x* 111111 */
+ /* * 0123456789012345 */
+ /* 0 */ "aaaaaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaaaaaa"
+ /* 7 */ "aaaaaaaaaaaaaaaa"
+ /* 8 */ "aaaaaaaaaaaaaaaa"
+ /* 9 */ "aaaaaaaaaaaaaaaa"
+ /* 10 */ "aaaaaaaaaaaaaaaa"
+ /* 11 */ "aaaaaaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaaaaaa"
+ /* 13 */ "aaaaaaaaaaaaaaaa"
+ /* 14 */ "aaaaaaaaaaaaaaaa"
+
+ // Level 11
+ /* z\x* 111111 */
+ /* * 0123456789012345 */
+ /* 0 */ "abbaabbaabbaabba"
+ /* 1 */ "b..............b"
+ /* 2 */ "a..............a"
+ /* 3 */ "b..............b"
+ /* 4 */ "a..............a"
+ /* 5 */ "b..............b"
+ /* 6 */ "a..............a"
+ /* 7 */ "b..............b"
+ /* 8 */ "a..............a"
+ /* 9 */ "b..............b"
+ /* 10 */ "a..............a"
+ /* 11 */ "b..............b"
+ /* 12 */ "a..............a"
+ /* 13 */ "b..............b"
+ /* 14 */ "abbaabbaabbaabba",
+
+ // Connectors:
+ "",
+
+ // AllowedRotations:
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
+ // Merge strategy:
+ cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
+ }, // LavaStairsBridge
+
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MidStaircase:
- // The data has been exported from gallery Nether, area index 23, ID 165
+ // The data has been exported from the gallery Nether, area index 23, ID 165, created by Aloe_vera
{
// Size:
13, 8, 13, // SizeX = 13, SizeY = 8, SizeZ = 13
@@ -1957,144 +3713,174 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
"f:114: 1\n" /* netherbrickstairs */
"g:114: 2\n" /* netherbrickstairs */
"h: 10: 0\n" /* lava */
- "i:113: 0\n" /* netherbrickfence */,
+ "i:113: 0\n" /* netherbrickfence */
+ "m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaa"
+ /* 3 */ "aaaabbbbbaaaa"
+ /* 4 */ "aaaabbbbbaaaa"
+ /* 5 */ "aaaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaaa"
+ /* 7 */ "aaaaaaaaaaaaa"
+ /* 8 */ "aaaabbbbbaaaa"
+ /* 9 */ "aaaabbbbbaaaa"
+ /* 10 */ "aaaaaaaaaaaaa"
+ /* 11 */ "aaaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaaa"
+
// Level 1
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaabbbbbaaaa"
- "aaaabbbbbaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaabbbbbaaaa"
- "aaaabbbbbaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaa"
+ /* 3 */ "aaaacccccaaaa"
+ /* 4 */ "addecccccfdda"
+ /* 5 */ "...eaaaaad..."
+ /* 6 */ "...eaaaaa...."
+ /* 7 */ "...eaaaaag..."
+ /* 8 */ "agggcccccfgga"
+ /* 9 */ "aaaacccccaaaa"
+ /* 10 */ "aaaaaaaaaaaaa"
+ /* 11 */ "aaaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaaa"
// Level 2
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaacccccaaaa"
- "addecccccfdda"
- "...eaaaaad..."
- "...eaaaaa...."
- "...eaaaaag..."
- "agggcccccfgga"
- "aaaacccccaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaaaaaa"
+ /* 1 */ "aha.......aha"
+ /* 2 */ "aaa.......aaa"
+ /* 3 */ "a...........a"
+ /* 4 */ "a...........a"
+ /* 5 */ "....eaaaa...."
+ /* 6 */ "....eaaaa...."
+ /* 7 */ "....eaaaa...."
+ /* 8 */ "a...........a"
+ /* 9 */ "a...........a"
+ /* 10 */ "aaa.......aaa"
+ /* 11 */ "aha.......aha"
+ /* 12 */ "aaaaaaaaaaaaa"
// Level 3
- "aaaaaaaaaaaaa"
- "aha.......aha"
- "aaa.......aaa"
- "a...........a"
- "a...........a"
- "....eaaaa...."
- "....eaaaa...."
- "....eaaaa...."
- "a...........a"
- "a...........a"
- "aaa.......aaa"
- "aha.......aha"
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaiiaaaiiaaa"
+ /* 1 */ "a...........a"
+ /* 2 */ "a...........a"
+ /* 3 */ "a...........a"
+ /* 4 */ "a...........a"
+ /* 5 */ ".....eaaa...."
+ /* 6 */ ".....eaaa...."
+ /* 7 */ ".....eaaa...."
+ /* 8 */ "a...........a"
+ /* 9 */ "a...........a"
+ /* 10 */ "a...........a"
+ /* 11 */ "a...........a"
+ /* 12 */ "aaaiiaaaiiaaa"
// Level 4
- "aaaiiaaaiiaaa"
- "a...........a"
- "a...........a"
- "a...........a"
- "a...........a"
- ".....eaaa...."
- ".....eaaa...."
- ".....eaaa...."
- "a...........a"
- "a...........a"
- "a...........a"
- "a...........a"
- "aaaiiaaaiiaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaiiaaaiiaaa"
+ /* 1 */ "a...........a"
+ /* 2 */ "a...........a"
+ /* 3 */ "a...........a"
+ /* 4 */ "a...........a"
+ /* 5 */ "......eaa...."
+ /* 6 */ "......eaa...."
+ /* 7 */ "......eaa...."
+ /* 8 */ "a...........a"
+ /* 9 */ "a...........a"
+ /* 10 */ "a...........a"
+ /* 11 */ "a...........a"
+ /* 12 */ "aaaiiaaaiiaaa"
// Level 5
- "aaaiiaaaiiaaa"
- "a...........a"
- "a...........a"
- "a...........a"
- "a...........a"
- "......eaa...."
- "......eaa...."
- "......eaa...."
- "a...........a"
- "a...........a"
- "a...........a"
- "a...........a"
- "aaaiiaaaiiaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaaaaaa"
+ /* 1 */ "a...........a"
+ /* 2 */ "a...........a"
+ /* 3 */ "a...........a"
+ /* 4 */ "a...........a"
+ /* 5 */ "a......ea...a"
+ /* 6 */ "a......ea...a"
+ /* 7 */ "a......ea...a"
+ /* 8 */ "a...........a"
+ /* 9 */ "a...........a"
+ /* 10 */ "a...........a"
+ /* 11 */ "a...........a"
+ /* 12 */ "aaaaaaaaaaaaa"
// Level 6
- "aaaaaaaaaaaaa"
- "a...........a"
- "a...........a"
- "a...........a"
- "a...........a"
- "a......ea...a"
- "a......ea...a"
- "a......ea...a"
- "a...........a"
- "a...........a"
- "a...........a"
- "a...........a"
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaa"
+ /* 5 */ "aaaa....eaaaa"
+ /* 6 */ "aaaa....eaaaa"
+ /* 7 */ "aaaa....eaaaa"
+ /* 8 */ "aaaaaaaaaaaaa"
+ /* 9 */ "aaaaaaaaaaaaa"
+ /* 10 */ "aaaaaaaaaaaaa"
+ /* 11 */ "aaaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaaa"
// Level 7
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaa....eaaaa"
- "aaaa....eaaaa"
- "aaaa....eaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
-
- // Level 8
- "iaiaiaiaiaiai"
- "a...........a"
- "i...........i"
- "a...........a"
- "i...........i"
- "a............"
- "i............"
- "a............"
- "i...........i"
- "a...........a"
- "i...........i"
- "a...........a"
- "iaiaiaiaiaiai",
-
- // Connections:
- "1: 0, 1, 6: 4\n" /* Type 1, BLOCK_FACE_XM */
- "1: 12, 1, 6: 5\n" /* Type 1, BLOCK_FACE_XP */
- "1: 12, 7, 6: 5\n" /* Type 1, BLOCK_FACE_XP */,
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "iaiaiaiaiaiai"
+ /* 1 */ "a...........a"
+ /* 2 */ "i...........i"
+ /* 3 */ "a...........a"
+ /* 4 */ "i...........i"
+ /* 5 */ "a...........a"
+ /* 6 */ "i...........i"
+ /* 7 */ "a...........a"
+ /* 8 */ "i...........i"
+ /* 9 */ "a...........a"
+ /* 10 */ "i...........i"
+ /* 11 */ "a...........a"
+ /* 12 */ "iaiaiaiaiaiai",
+
+ // Connectors:
+ "1: 12, 1, 6: 5\n" /* Type 1, direction X+ */
+ "1: 0, 1, 6: 4\n" /* Type 1, direction X- */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
}, // MidStaircase
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// StairsToOpen1:
- // The data has been exported from gallery Nether, area index 27, ID 277
+ // The data has been exported from the gallery Nether, area index 27, ID 277, created by Aloe_vera
{
// Size:
7, 10, 7, // SizeX = 7, SizeY = 10, SizeZ = 7
@@ -2106,110 +3892,134 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
"m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 0123456 */
+ /* 0 */ "aaaaaaa"
+ /* 1 */ "aaaaaaa"
+ /* 2 */ "aaaaaaa"
+ /* 3 */ "aaaaaaa"
+ /* 4 */ "aaaaaaa"
+ /* 5 */ "aaaaaaa"
+ /* 6 */ "aaaaaaa"
+
// Level 1
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
+ /* z\x* 0123456 */
+ /* 0 */ "aa...aa"
+ /* 1 */ "a.....a"
+ /* 2 */ "a.....a"
+ /* 3 */ "a.....a"
+ /* 4 */ "a.....a"
+ /* 5 */ "aaaaaaa"
+ /* 6 */ "aaaaaaa"
// Level 2
- "aa...aa"
- "a.....a"
- "a.....a"
- "a.....a"
- "a.....a"
- "aaaaaaa"
- "aaaaaaa"
+ /* z\x* 0123456 */
+ /* 0 */ "aa...aa"
+ /* 1 */ "a.....a"
+ /* 2 */ "b.....b"
+ /* 3 */ "a.....a"
+ /* 4 */ "b.....b"
+ /* 5 */ "a.aaaaa"
+ /* 6 */ "aabaaba"
// Level 3
- "aa...aa"
- "a.....a"
- "b.....b"
- "a.....a"
- "b.....b"
- "a.aaaaa"
- "aabaaba"
+ /* z\x* 0123456 */
+ /* 0 */ "aa...aa"
+ /* 1 */ "a.....a"
+ /* 2 */ "b.....b"
+ /* 3 */ "a.....a"
+ /* 4 */ "b.....b"
+ /* 5 */ "a..aaaa"
+ /* 6 */ "aabaaba"
// Level 4
- "aa...aa"
- "a.....a"
- "b.....b"
- "a.....a"
- "b.....b"
- "a..aaaa"
- "aabaaba"
+ /* z\x* 0123456 */
+ /* 0 */ "aabbbaa"
+ /* 1 */ "a.....a"
+ /* 2 */ "b.....b"
+ /* 3 */ "a.....a"
+ /* 4 */ "b.....b"
+ /* 5 */ "a...aaa"
+ /* 6 */ "aabaaba"
// Level 5
- "aabbbaa"
- "a.....a"
- "b.....b"
- "a.....a"
- "b.....b"
- "a...aaa"
- "aabaaba"
+ /* z\x* 0123456 */
+ /* 0 */ "aaaaaaa"
+ /* 1 */ "a.....a"
+ /* 2 */ "a.....a"
+ /* 3 */ "a.....a"
+ /* 4 */ "a.....a"
+ /* 5 */ "a....aa"
+ /* 6 */ "aaaaaaa"
// Level 6
- "aaaaaaa"
- "a.....a"
- "a.....a"
- "a.....a"
- "a.....a"
- "a....aa"
- "aaaaaaa"
+ /* z\x* 0123456 */
+ /* 0 */ "aaaaaaa"
+ /* 1 */ "aaaaaaa"
+ /* 2 */ "aaaaaaa"
+ /* 3 */ "aaaaaaa"
+ /* 4 */ "aaaaaaa"
+ /* 5 */ "a.....a"
+ /* 6 */ "aaaaaaa"
// Level 7
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "a.....a"
- "aaaaaaa"
+ /* z\x* 0123456 */
+ /* 0 */ "aaaaaaa"
+ /* 1 */ "a.....a"
+ /* 2 */ "a......"
+ /* 3 */ "a......"
+ /* 4 */ "a......"
+ /* 5 */ "a.....a"
+ /* 6 */ "aaaaaaa"
// Level 8
- "aaaaaaa"
- "a.....a"
- "a......"
- "a......"
- "a......"
- "a.....a"
- "aaaaaaa"
+ /* z\x* 0123456 */
+ /* 0 */ "mmmmmmm"
+ /* 1 */ "m.....m"
+ /* 2 */ "m......"
+ /* 3 */ "m......"
+ /* 4 */ "m......"
+ /* 5 */ "m.....m"
+ /* 6 */ "mmmmmmm"
// Level 9
- "mmmmmmm"
- "m.....m"
- "m......"
- "m......"
- "m......"
- "m.....m"
- "mmmmmmm"
-
- // Level 10
- "mmmmmmm"
- "m.....m"
- "m......"
- "m......"
- "m......"
- "m.....m"
- "mmmmmmm",
-
- // Connections:
- "0: 3, 1, 0: 2\n" /* Type 0, BLOCK_FACE_ZM */
- "0: 6, 7, 3: 5\n" /* Type 0, BLOCK_FACE_XP */,
+ /* z\x* 0123456 */
+ /* 0 */ "mmmmmmm"
+ /* 1 */ "m.....m"
+ /* 2 */ "m......"
+ /* 3 */ "m......"
+ /* 4 */ "m......"
+ /* 5 */ "m.....m"
+ /* 6 */ "mmmmmmm",
+
+ // Connectors:
+ "0: 6, 7, 3: 5\n" /* Type 0, direction X+ */
+ "0: 3, 1, 0: 2\n" /* Type 0, direction Z- */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
}, // StairsToOpen1
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// StairsToOpen2:
- // The data has been exported from gallery Nether, area index 8, ID 35
+ // The data has been exported from the gallery Nether, area index 8, ID 35, created by xoft
{
// Size:
7, 10, 7, // SizeX = 7, SizeY = 10, SizeZ = 7
@@ -2221,110 +4031,134 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
"m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 0123456 */
+ /* 0 */ "aaaaaaa"
+ /* 1 */ "aaaaaaa"
+ /* 2 */ "aaaaaaa"
+ /* 3 */ "aaaaaaa"
+ /* 4 */ "aaaaaaa"
+ /* 5 */ "aaaaaaa"
+ /* 6 */ "aaaaaaa"
+
// Level 1
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
+ /* z\x* 0123456 */
+ /* 0 */ "aa...aa"
+ /* 1 */ "a.....a"
+ /* 2 */ "a.....a"
+ /* 3 */ "a.....a"
+ /* 4 */ "a.....a"
+ /* 5 */ "aaaaaaa"
+ /* 6 */ "aaaaaaa"
// Level 2
- "aa...aa"
- "a.....a"
- "a.....a"
- "a.....a"
- "a.....a"
- "aaaaaaa"
- "aaaaaaa"
+ /* z\x* 0123456 */
+ /* 0 */ "aa...aa"
+ /* 1 */ "a.....a"
+ /* 2 */ "b.....b"
+ /* 3 */ "a.....a"
+ /* 4 */ "b.....b"
+ /* 5 */ "a.aaaaa"
+ /* 6 */ "aabaaba"
// Level 3
- "aa...aa"
- "a.....a"
- "b.....b"
- "a.....a"
- "b.....b"
- "a.aaaaa"
- "aabaaba"
+ /* z\x* 0123456 */
+ /* 0 */ "aa...aa"
+ /* 1 */ "a.....a"
+ /* 2 */ "b.....b"
+ /* 3 */ "a.....a"
+ /* 4 */ "b.....b"
+ /* 5 */ "a..aaaa"
+ /* 6 */ "aabaaba"
// Level 4
- "aa...aa"
- "a.....a"
- "b.....b"
- "a.....a"
- "b.....b"
- "a..aaaa"
- "aabaaba"
+ /* z\x* 0123456 */
+ /* 0 */ "aabbbaa"
+ /* 1 */ "a.....a"
+ /* 2 */ "b.....b"
+ /* 3 */ "a.....a"
+ /* 4 */ "b.....b"
+ /* 5 */ "a...aaa"
+ /* 6 */ "aabaaba"
// Level 5
- "aabbbaa"
- "a.....a"
- "b.....b"
- "a.....a"
- "b.....b"
- "a...aaa"
- "aabaaba"
+ /* z\x* 0123456 */
+ /* 0 */ "aaaaaaa"
+ /* 1 */ "a.....a"
+ /* 2 */ "a.....a"
+ /* 3 */ "a.....a"
+ /* 4 */ "a.....a"
+ /* 5 */ "a....aa"
+ /* 6 */ "aaaaaaa"
// Level 6
- "aaaaaaa"
- "a.....a"
- "a.....a"
- "a.....a"
- "a.....a"
- "a....aa"
- "aaaaaaa"
+ /* z\x* 0123456 */
+ /* 0 */ "aaaaaaa"
+ /* 1 */ "aaaaaaa"
+ /* 2 */ "aaaaaaa"
+ /* 3 */ "aaaaaaa"
+ /* 4 */ "aaaaaaa"
+ /* 5 */ "a.....a"
+ /* 6 */ "aaaaaaa"
// Level 7
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "a.....a"
- "aaaaaaa"
+ /* z\x* 0123456 */
+ /* 0 */ "aaaaaaa"
+ /* 1 */ "a.....a"
+ /* 2 */ "......a"
+ /* 3 */ "......a"
+ /* 4 */ "......a"
+ /* 5 */ "a.....a"
+ /* 6 */ "aaaaaaa"
// Level 8
- "aaaaaaa"
- "a.....a"
- "......a"
- "......a"
- "......a"
- "a.....a"
- "aaaaaaa"
+ /* z\x* 0123456 */
+ /* 0 */ "mmmmmmm"
+ /* 1 */ "m.....m"
+ /* 2 */ "......m"
+ /* 3 */ "......m"
+ /* 4 */ "......m"
+ /* 5 */ "m.....m"
+ /* 6 */ "mmmmmmm"
// Level 9
- "mmmmmmm"
- "m.....m"
- "......m"
- "......m"
- "......m"
- "m.....m"
- "mmmmmmm"
-
- // Level 10
- "mmmmmmm"
- "m.....m"
- "......m"
- "......m"
- "......m"
- "m.....m"
- "mmmmmmm",
-
- // Connections:
- "0: 3, 1, 0: 2\n" /* Type 0, BLOCK_FACE_ZM */
- "0: 0, 7, 3: 4\n" /* Type 0, BLOCK_FACE_XM */,
+ /* z\x* 0123456 */
+ /* 0 */ "mmmmmmm"
+ /* 1 */ "m.....m"
+ /* 2 */ "......m"
+ /* 3 */ "......m"
+ /* 4 */ "......m"
+ /* 5 */ "m.....m"
+ /* 6 */ "mmmmmmm",
+
+ // Connectors:
+ "0: 0, 7, 3: 4\n" /* Type 0, direction X- */
+ "0: 3, 1, 0: 2\n" /* Type 0, direction Z- */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
}, // StairsToOpen2
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Tee2x4:
- // The data has been exported from gallery Nether, area index 40, ID 291
+ // The data has been exported from the gallery Nether, area index 40, ID 291, created by Aloe_vera
{
// Size:
13, 6, 7, // SizeX = 13, SizeY = 6, SizeZ = 7
@@ -2340,75 +4174,101 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
"m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmmaaaaammmm"
+ /* 1 */ "mmmmaaaaammmm"
+ /* 2 */ "aaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaaa"
+
// Level 1
- "mmmmaaaaammmm"
- "mmmmaaaaammmm"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmma...ammmm"
+ /* 1 */ "mmmma...ammmm"
+ /* 2 */ "aaaaa...aaaaa"
+ /* 3 */ "............."
+ /* 4 */ "............."
+ /* 5 */ "............."
+ /* 6 */ "aaaaaaaaaaaaa"
// Level 2
- "mmmma...ammmm"
- "mmmma...ammmm"
- "aaaaa...aaaaa"
- "............."
- "............."
- "............."
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmma...ammmm"
+ /* 1 */ "mmmmb...bmmmm"
+ /* 2 */ "ababa...ababa"
+ /* 3 */ "............."
+ /* 4 */ "............."
+ /* 5 */ "............."
+ /* 6 */ "ababababababa"
// Level 3
- "mmmma...ammmm"
- "mmmmb...bmmmm"
- "ababa...ababa"
- "............."
- "............."
- "............."
- "ababababababa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmma...ammmm"
+ /* 1 */ "mmmmb...bmmmm"
+ /* 2 */ "ababa...ababa"
+ /* 3 */ "............."
+ /* 4 */ "............."
+ /* 5 */ "............."
+ /* 6 */ "ababababababa"
// Level 4
- "mmmma...ammmm"
- "mmmmb...bmmmm"
- "ababa...ababa"
- "............."
- "............."
- "............."
- "ababababababa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmma...ammmm"
+ /* 1 */ "mmmmb...bmmmm"
+ /* 2 */ "ababa...ababa"
+ /* 3 */ "............."
+ /* 4 */ "............."
+ /* 5 */ "............."
+ /* 6 */ "ababababababa"
// Level 5
- "mmmma...ammmm"
- "mmmmb...bmmmm"
- "ababa...ababa"
- "............."
- "............."
- "............."
- "ababababababa"
-
- // Level 6
- "mmmmcaaadmmmm"
- "mmmmcaaadmmmm"
- "eeeecaaadeeee"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "fffffffffffff",
-
- // Connections:
- "1: 0, 1, 4: 4\n" /* Type 1, BLOCK_FACE_XM */
- "1: 6, 1, 0: 2\n" /* Type 1, BLOCK_FACE_ZM */
- "1: 12, 1, 4: 5\n" /* Type 1, BLOCK_FACE_XP */,
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmmcaaadmmmm"
+ /* 1 */ "mmmmcaaadmmmm"
+ /* 2 */ "eeeecaaadeeee"
+ /* 3 */ "aaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaaa"
+ /* 6 */ "fffffffffffff",
+
+ // Connectors:
+ "1: 0, 1, 4: 4\n" /* Type 1, direction X- */
+ "1: 6, 1, 0: 2\n" /* Type 1, direction Z- */
+ "1: 12, 1, 4: 5\n" /* Type 1, direction X+ */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
}, // Tee2x4
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Tee4x4:
- // The data has been exported from gallery Nether, area index 41, ID 292
+ // The data has been exported from the gallery Nether, area index 41, ID 292, created by Aloe_vera
{
// Size:
13, 6, 9, // SizeX = 13, SizeY = 6, SizeZ = 9
@@ -2424,86 +4284,113 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
"m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmmaaaaammmm"
+ /* 1 */ "mmmmaaaaammmm"
+ /* 2 */ "mmmmaaaaammmm"
+ /* 3 */ "mmmmaaaaammmm"
+ /* 4 */ "aaaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaaa"
+ /* 7 */ "aaaaaaaaaaaaa"
+ /* 8 */ "aaaaaaaaaaaaa"
+
// Level 1
- "mmmmaaaaammmm"
- "mmmmaaaaammmm"
- "mmmmaaaaammmm"
- "mmmmaaaaammmm"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmma...ammmm"
+ /* 1 */ "mmmma...ammmm"
+ /* 2 */ "mmmma...ammmm"
+ /* 3 */ "mmmma...ammmm"
+ /* 4 */ "aaaaa...aaaaa"
+ /* 5 */ "............."
+ /* 6 */ "............."
+ /* 7 */ "............."
+ /* 8 */ "aaaaaaaaaaaaa"
// Level 2
- "mmmma...ammmm"
- "mmmma...ammmm"
- "mmmma...ammmm"
- "mmmma...ammmm"
- "aaaaa...aaaaa"
- "............."
- "............."
- "............."
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmma...ammmm"
+ /* 1 */ "mmmmb...bmmmm"
+ /* 2 */ "mmmma...ammmm"
+ /* 3 */ "mmmmb...bmmmm"
+ /* 4 */ "ababa...ababa"
+ /* 5 */ "............."
+ /* 6 */ "............."
+ /* 7 */ "............."
+ /* 8 */ "ababababababa"
// Level 3
- "mmmma...ammmm"
- "mmmmb...bmmmm"
- "mmmma...ammmm"
- "mmmmb...bmmmm"
- "ababa...ababa"
- "............."
- "............."
- "............."
- "ababababababa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmma...ammmm"
+ /* 1 */ "mmmmb...bmmmm"
+ /* 2 */ "mmmma...ammmm"
+ /* 3 */ "mmmmb...bmmmm"
+ /* 4 */ "ababa...ababa"
+ /* 5 */ "............."
+ /* 6 */ "............."
+ /* 7 */ "............."
+ /* 8 */ "ababababababa"
// Level 4
- "mmmma...ammmm"
- "mmmmb...bmmmm"
- "mmmma...ammmm"
- "mmmmb...bmmmm"
- "ababa...ababa"
- "............."
- "............."
- "............."
- "ababababababa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmma...ammmm"
+ /* 1 */ "mmmmb...bmmmm"
+ /* 2 */ "mmmma...ammmm"
+ /* 3 */ "mmmmb...bmmmm"
+ /* 4 */ "ababa...ababa"
+ /* 5 */ "............."
+ /* 6 */ "............."
+ /* 7 */ "............."
+ /* 8 */ "ababababababa"
// Level 5
- "mmmma...ammmm"
- "mmmmb...bmmmm"
- "mmmma...ammmm"
- "mmmmb...bmmmm"
- "ababa...ababa"
- "............."
- "............."
- "............."
- "ababababababa"
-
- // Level 6
- "mmmmcaaadmmmm"
- "mmmmcaaadmmmm"
- "mmmmcaaadmmmm"
- "mmmmcaaadmmmm"
- "eeeecaaadeeee"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "fffffffffffff",
-
- // Connections:
- "1: 0, 1, 6: 4\n" /* Type 1, BLOCK_FACE_XM */
- "1: 12, 1, 6: 5\n" /* Type 1, BLOCK_FACE_XP */
- "1: 6, 1, 0: 2\n" /* Type 1, BLOCK_FACE_ZM */,
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "mmmmcaaadmmmm"
+ /* 1 */ "mmmmcaaadmmmm"
+ /* 2 */ "mmmmcaaadmmmm"
+ /* 3 */ "mmmmcaaadmmmm"
+ /* 4 */ "eeeecaaadeeee"
+ /* 5 */ "aaaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaaa"
+ /* 7 */ "aaaaaaaaaaaaa"
+ /* 8 */ "fffffffffffff",
+
+ // Connectors:
+ "1: 0, 1, 6: 4\n" /* Type 1, direction X- */
+ "1: 6, 1, 0: 2\n" /* Type 1, direction Z- */
+ "1: 12, 1, 6: 5\n" /* Type 1, direction X+ */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
}, // Tee4x4
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Turret:
- // The data has been exported from gallery Nether, area index 7, ID 34
+ // The data has been exported from the gallery Nether, area index 7, ID 34, created by xoft
{
// Size:
7, 6, 7, // SizeX = 7, SizeY = 6, SizeZ = 7
@@ -2511,248 +4398,302 @@ const cPrefab::sDef g_NetherFortPrefabs1[] =
// Block definitions:
".: 0: 0\n" /* air */
"a:112: 0\n" /* netherbrick */
- "b:113: 0\n" /* netherbrickfence */,
+ "b:113: 0\n" /* netherbrickfence */
+ "m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 0123456 */
+ /* 0 */ "aaaaaaa"
+ /* 1 */ "aaaaaaa"
+ /* 2 */ "aaaaaaa"
+ /* 3 */ "aaaaaaa"
+ /* 4 */ "aaaaaaa"
+ /* 5 */ "aaaaaaa"
+ /* 6 */ "aaaaaaa"
+
// Level 1
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
- "aaaaaaa"
+ /* z\x* 0123456 */
+ /* 0 */ "aa...aa"
+ /* 1 */ "a.....a"
+ /* 2 */ "......."
+ /* 3 */ "......."
+ /* 4 */ "......."
+ /* 5 */ "a.....a"
+ /* 6 */ "aa...aa"
// Level 2
- "aa...aa"
- "a.....a"
- "......."
- "......."
- "......."
- "a.....a"
- "aa...aa"
+ /* z\x* 0123456 */
+ /* 0 */ "aa...aa"
+ /* 1 */ "a.....a"
+ /* 2 */ "......."
+ /* 3 */ "......."
+ /* 4 */ "......."
+ /* 5 */ "a.....a"
+ /* 6 */ "aa...aa"
// Level 3
- "aa...aa"
- "a.....a"
- "......."
- "......."
- "......."
- "a.....a"
- "aa...aa"
+ /* z\x* 0123456 */
+ /* 0 */ "aa...aa"
+ /* 1 */ "a.....a"
+ /* 2 */ "......."
+ /* 3 */ "......."
+ /* 4 */ "......."
+ /* 5 */ "a.....a"
+ /* 6 */ "aa...aa"
// Level 4
- "aa...aa"
- "a.....a"
- "......."
- "......."
- "......."
- "a.....a"
- "aa...aa"
+ /* z\x* 0123456 */
+ /* 0 */ "aabbbaa"
+ /* 1 */ "a.....a"
+ /* 2 */ "b.....b"
+ /* 3 */ "b.....b"
+ /* 4 */ "b.....b"
+ /* 5 */ "a.....a"
+ /* 6 */ "aabbbaa"
// Level 5
- "aabbbaa"
- "a.....a"
- "b.....b"
- "b.....b"
- "b.....b"
- "a.....a"
- "aabbbaa"
-
- // Level 6
- "aaaaaaa"
- "a.....a"
- "a.....a"
- "a.....a"
- "a.....a"
- "a.....a"
- "aaaaaaa",
-
- // Connections:
- "0: 0, 1, 3: 4\n" /* Type 0, BLOCK_FACE_XM */
- "0: 3, 1, 0: 2\n" /* Type 0, BLOCK_FACE_ZM */
- "0: 6, 1, 3: 5\n" /* Type 0, BLOCK_FACE_XP */
- "0: 3, 1, 6: 3\n" /* Type 0, BLOCK_FACE_ZP */,
+ /* z\x* 0123456 */
+ /* 0 */ "aaaaaaa"
+ /* 1 */ "a.....a"
+ /* 2 */ "a.....a"
+ /* 3 */ "a.....a"
+ /* 4 */ "a.....a"
+ /* 5 */ "a.....a"
+ /* 6 */ "aaaaaaa",
+
+ // Connectors:
+ "0: 0, 1, 3: 4\n" /* Type 0, direction X- */
+ "0: 3, 1, 0: 2\n" /* Type 0, direction Z- */
+ "0: 6, 1, 3: 5\n" /* Type 0, direction X+ */
+ "0: 3, 1, 6: 3\n" /* Type 0, direction Z+ */,
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
+
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ -99,
}, // Turret
+}; // g_NetherFortPrefabs
-} ; // g_NetherFortPrefabs1
-const cPrefab::sDef g_NetherFortStartingPrefabs1[] =
+const cPrefab::sDef g_NetherFortStartingPrefabs[] =
{
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CentralRoom:
- // The data has been exported from gallery Nether, area index 22, ID 164
+ // The data has been exported from the gallery Nether, area index 22, ID 164, created by Aloe_vera
{
// Size:
13, 9, 13, // SizeX = 13, SizeY = 9, SizeZ = 13
// Block definitions:
+ ".: 0: 0\n" /* air */
"a:112: 0\n" /* netherbrick */
- "b: 0: 0\n" /* air */
- "c: 10: 0\n" /* lava */
- "d:113: 0\n" /* netherbrickfence */,
+ "b: 10: 0\n" /* lava */
+ "c:113: 0\n" /* netherbrickfence */
+ "m: 19: 0\n" /* sponge */,
// Block data:
+ // Level 0
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaaa"
+ /* 7 */ "aaaaaaaaaaaaa"
+ /* 8 */ "aaaaaaaaaaaaa"
+ /* 9 */ "aaaaaaaaaaaaa"
+ /* 10 */ "aaaaaaaaaaaaa"
+ /* 11 */ "aaaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaaa"
+
// Level 1
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaa...aaaaa"
+ /* 1 */ "aaaaa...aaaaa"
+ /* 2 */ "aa.........aa"
+ /* 3 */ "aa.........aa"
+ /* 4 */ "aa.........aa"
+ /* 5 */ "aa...aaa...aa"
+ /* 6 */ "aa...aba...aa"
+ /* 7 */ "aa...aaa...aa"
+ /* 8 */ "aa.........aa"
+ /* 9 */ "aa.........aa"
+ /* 10 */ "aa.........aa"
+ /* 11 */ "aaaaa...aaaaa"
+ /* 12 */ "aaaaa...aaaaa"
// Level 2
- "aaaaabbbaaaaa"
- "aaaaabbbaaaaa"
- "aabbbbbbbbbaa"
- "aabbbbbbbbbaa"
- "aabbbbbbbbbaa"
- "aabbbaaabbbaa"
- "aabbbacabbbaa"
- "aabbbaaabbbaa"
- "aabbbbbbbbbaa"
- "aabbbbbbbbbaa"
- "aabbbbbbbbbaa"
- "aaaaabbbaaaaa"
- "aaaaabbbaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaa...aaaaa"
+ /* 1 */ "aaaca...acaaa"
+ /* 2 */ "aa.........aa"
+ /* 3 */ "ac.........ca"
+ /* 4 */ "aa.........aa"
+ /* 5 */ "ac.........ca"
+ /* 6 */ "aa.........aa"
+ /* 7 */ "ac.........ca"
+ /* 8 */ "aa.........aa"
+ /* 9 */ "ac.........ca"
+ /* 10 */ "aa.........aa"
+ /* 11 */ "aaaca...acaaa"
+ /* 12 */ "aaaaa...aaaaa"
// Level 3
- "aaaaabbbaaaaa"
- "aaadabbbadaaa"
- "aabbbbbbbbbaa"
- "adbbbbbbbbbda"
- "aabbbbbbbbbaa"
- "adbbbbbbbbbda"
- "aabbbbbbbbbaa"
- "adbbbbbbbbbda"
- "aabbbbbbbbbaa"
- "adbbbbbbbbbda"
- "aabbbbbbbbbaa"
- "aaadabbbadaaa"
- "aaaaabbbaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaa...aaaaa"
+ /* 1 */ "aaaca...acaaa"
+ /* 2 */ "aa.........aa"
+ /* 3 */ "ac.........ca"
+ /* 4 */ "aa.........aa"
+ /* 5 */ "ac.........ca"
+ /* 6 */ "aa.........aa"
+ /* 7 */ "ac.........ca"
+ /* 8 */ "aa.........aa"
+ /* 9 */ "ac.........ca"
+ /* 10 */ "aa.........aa"
+ /* 11 */ "aaaca...acaaa"
+ /* 12 */ "aaaaa...aaaaa"
// Level 4
- "aaaaabbbaaaaa"
- "aaadabbbadaaa"
- "aabbbbbbbbbaa"
- "adbbbbbbbbbda"
- "aabbbbbbbbbaa"
- "adbbbbbbbbbda"
- "aabbbbbbbbbaa"
- "adbbbbbbbbbda"
- "aabbbbbbbbbaa"
- "adbbbbbbbbbda"
- "aabbbbbbbbbaa"
- "aaadabbbadaaa"
- "aaaaabbbaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "acacacccacaca"
+ /* 1 */ "caaaa...aaaac"
+ /* 2 */ "aa.........aa"
+ /* 3 */ "ca.........ac"
+ /* 4 */ "aa.........aa"
+ /* 5 */ "ca.........ac"
+ /* 6 */ "aa.........aa"
+ /* 7 */ "ca.........ac"
+ /* 8 */ "aa.........aa"
+ /* 9 */ "ca.........ac"
+ /* 10 */ "aa.........aa"
+ /* 11 */ "caaaa...aaaac"
+ /* 12 */ "acaca...acaca"
// Level 5
- "adadadddadada"
- "daaaabbbaaaad"
- "aabbbbbbbbbaa"
- "dabbbbbbbbbad"
- "aabbbbbbbbbaa"
- "dabbbbbbbbbad"
- "aabbbbbbbbbaa"
- "dabbbbbbbbbad"
- "aabbbbbbbbbaa"
- "dabbbbbbbbbad"
- "aabbbbbbbbbaa"
- "daaaabbbaaaad"
- "adadabbbadada"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "acacaaaaacaca"
+ /* 1 */ "caaaaaaaaaaac"
+ /* 2 */ "aa.........aa"
+ /* 3 */ "ca.........ac"
+ /* 4 */ "aa.........aa"
+ /* 5 */ "ca.........ac"
+ /* 6 */ "aa.........aa"
+ /* 7 */ "ca.........ac"
+ /* 8 */ "aa.........aa"
+ /* 9 */ "ca.........ac"
+ /* 10 */ "aa.........aa"
+ /* 11 */ "caaaaaaaaaaac"
+ /* 12 */ "acacaaaaacaca"
// Level 6
- "adadaaaaadada"
- "daaaaaaaaaaad"
- "aabbbbbbbbbaa"
- "dabbbbbbbbbad"
- "aabbbbbbbbbaa"
- "dabbbbbbbbbad"
- "aabbbbbbbbbaa"
- "dabbbbbbbbbad"
- "aabbbbbbbbbaa"
- "dabbbbbbbbbad"
- "aabbbbbbbbbaa"
- "daaaaaaaaaaad"
- "adadaaaaadada"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaaa"
+ /* 7 */ "aaaaaaaaaaaaa"
+ /* 8 */ "aaaaaaaaaaaaa"
+ /* 9 */ "aaaaaaaaaaaaa"
+ /* 10 */ "aaaaaaaaaaaaa"
+ /* 11 */ "aaaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaaa"
// Level 7
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "aaaaaaaaaaaaa"
+ /* 1 */ "aaaaaaaaaaaaa"
+ /* 2 */ "aaaaaaaaaaaaa"
+ /* 3 */ "aaaaaaaaaaaaa"
+ /* 4 */ "aaaaaaaaaaaaa"
+ /* 5 */ "aaaaaaaaaaaaa"
+ /* 6 */ "aaaaaaaaaaaaa"
+ /* 7 */ "aaaaaaaaaaaaa"
+ /* 8 */ "aaaaaaaaaaaaa"
+ /* 9 */ "aaaaaaaaaaaaa"
+ /* 10 */ "aaaaaaaaaaaaa"
+ /* 11 */ "aaaaaaaaaaaaa"
+ /* 12 */ "aaaaaaaaaaaaa"
// Level 8
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
- "aaaaaaaaaaaaa"
+ /* z\x* 111 */
+ /* * 0123456789012 */
+ /* 0 */ "cacacacacacac"
+ /* 1 */ "a...........a"
+ /* 2 */ "c...........c"
+ /* 3 */ "a...........a"
+ /* 4 */ "c...........c"
+ /* 5 */ "a...........a"
+ /* 6 */ "c...........c"
+ /* 7 */ "a...........a"
+ /* 8 */ "c...........c"
+ /* 9 */ "a...........a"
+ /* 10 */ "c...........c"
+ /* 11 */ "a...........a"
+ /* 12 */ "cacacacacacac",
+
+ // Connectors:
+ "0: 6, 1, 0: 2\n" /* Type 0, direction Z- */
+ "1: 6, 1, 12: 3\n" /* Type 1, direction Z+ */,
- // Level 9
- "dadadadadadad"
- "abbbbbbbbbbba"
- "dbbbbbbbbbbbd"
- "abbbbbbbbbbba"
- "dbbbbbbbbbbbd"
- "abbbbbbbbbbba"
- "dbbbbbbbbbbbd"
- "abbbbbbbbbbba"
- "dbbbbbbbbbbbd"
- "abbbbbbbbbbba"
- "dbbbbbbbbbbbd"
- "abbbbbbbbbbba"
- "dadadadadadad",
-
- // Connections:
- "0: 6, 1, 0: 2\n" /* Type 0, BLOCK_FACE_ZM */
- "1: 6, 1, 12: 3\n" /* Type 1, BLOCK_FACE_ZP */,
-
// AllowedRotations:
- 7, /* 1, 2, 3 CCW rotations */
-
+ 7, /* 1, 2, 3 CCW rotation allowed */
+
// Merge strategy:
cBlockArea::msSpongePrint,
- },
-} ; // g_NetherFortStartingPrefabs1
-const size_t g_NetherFortPrefabs1Count = ARRAYCOUNT(g_NetherFortPrefabs1);
-const size_t g_NetherFortStartingPrefabs1Count = ARRAYCOUNT(g_NetherFortStartingPrefabs1);
+ // ShouldExtendFloor:
+ false,
+
+ // DefaultWeight:
+ 100,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 0,
+ }, // CentralRoom
+};
+
+
+
+
+// The prefab counts:
+const size_t g_NetherFortPrefabsCount = ARRAYCOUNT(g_NetherFortPrefabs);
+const size_t g_NetherFortStartingPrefabsCount = ARRAYCOUNT(g_NetherFortStartingPrefabs);
diff --git a/src/Generating/Prefabs/NetherFortPrefabs.h b/src/Generating/Prefabs/NetherFortPrefabs.h
index 37a91689d..04edc2953 100644
--- a/src/Generating/Prefabs/NetherFortPrefabs.h
+++ b/src/Generating/Prefabs/NetherFortPrefabs.h
@@ -1,7 +1,7 @@
// NetherFortPrefabs.h
-// Declares the data used for nether fortress prefabs
+// Declares the prefabs in the group NetherFort
#include "../Prefab.h"
@@ -9,7 +9,7 @@
-extern const cPrefab::sDef g_NetherFortPrefabs1[];
-extern const cPrefab::sDef g_NetherFortStartingPrefabs1[];
-extern const size_t g_NetherFortPrefabs1Count;
-extern const size_t g_NetherFortStartingPrefabs1Count;
+extern const cPrefab::sDef g_NetherFortPrefabs[];
+extern const cPrefab::sDef g_NetherFortStartingPrefabs[];
+extern const size_t g_NetherFortPrefabsCount;
+extern const size_t g_NetherFortStartingPrefabsCount;
diff --git a/src/LightingThread.cpp b/src/LightingThread.cpp
index 302473d71..5ba2940d2 100644
--- a/src/LightingThread.cpp
+++ b/src/LightingThread.cpp
@@ -286,6 +286,7 @@ void cLightingThread::LightChunk(cLightingChunkStay & a_Item)
{
a_Item.m_CallbackAfter->Call(a_Item.m_ChunkX, a_Item.m_ChunkZ);
}
+ a_Item.Disable();
delete &a_Item;
}
diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp
index 171097aba..248e88f5d 100644
--- a/src/Mobs/Monster.cpp
+++ b/src/Mobs/Monster.cpp
@@ -111,9 +111,9 @@ void cMonster::SpawnOn(cClientHandle & a_Client)
void cMonster::TickPathFinding()
{
- const int PosX = (int)floor(GetPosX());
- const int PosY = (int)floor(GetPosY());
- const int PosZ = (int)floor(GetPosZ());
+ const int PosX = POSX_TOINT;
+ const int PosY = POSY_TOINT;
+ const int PosZ = POSZ_TOINT;
m_FinalDestination.y = (double)FindFirstNonAirBlockPosition(m_FinalDestination.x, m_FinalDestination.z);
@@ -148,13 +148,27 @@ void cMonster::TickPathFinding()
BLOCKTYPE BlockAtY = m_World->GetBlock(gCrossCoords[i].x + PosX, PosY, gCrossCoords[i].z + PosZ);
BLOCKTYPE BlockAtYP = m_World->GetBlock(gCrossCoords[i].x + PosX, PosY + 1, gCrossCoords[i].z + PosZ);
BLOCKTYPE BlockAtYPP = m_World->GetBlock(gCrossCoords[i].x + PosX, PosY + 2, gCrossCoords[i].z + PosZ);
- BLOCKTYPE BlockAtYM = m_World->GetBlock(gCrossCoords[i].x + PosX, PosY - 1, gCrossCoords[i].z + PosZ);
-
- if ((!cBlockInfo::IsSolid(BlockAtY)) && (!cBlockInfo::IsSolid(BlockAtYP)) && (!IsBlockLava(BlockAtYM)) && (BlockAtY != E_BLOCK_FENCE) && (BlockAtY != E_BLOCK_FENCE_GATE))
+ int LowestY = FindFirstNonAirBlockPosition(gCrossCoords[i].x + PosX, gCrossCoords[i].z + PosZ);
+ BLOCKTYPE BlockAtLowestY = m_World->GetBlock(gCrossCoords[i].x + PosX, LowestY, gCrossCoords[i].z + PosZ);
+
+ if (
+ (!cBlockInfo::IsSolid(BlockAtY)) &&
+ (!cBlockInfo::IsSolid(BlockAtYP)) &&
+ (!IsBlockLava(BlockAtLowestY)) &&
+ (BlockAtLowestY != E_BLOCK_CACTUS) &&
+ (PosY - LowestY < FALL_DAMAGE_HEIGHT)
+ )
{
m_PotentialCoordinates.push_back(Vector3d((gCrossCoords[i].x + PosX), PosY, gCrossCoords[i].z + PosZ));
}
- else if ((cBlockInfo::IsSolid(BlockAtY)) && (!cBlockInfo::IsSolid(BlockAtYP)) && (!cBlockInfo::IsSolid(BlockAtYPP)) && (!IsBlockLava(BlockAtYM)) && (BlockAtY != E_BLOCK_FENCE) && (BlockAtY != E_BLOCK_FENCE_GATE))
+ else if (
+ (cBlockInfo::IsSolid(BlockAtY)) &&
+ (BlockAtY != E_BLOCK_CACTUS) &&
+ (!cBlockInfo::IsSolid(BlockAtYP)) &&
+ (!cBlockInfo::IsSolid(BlockAtYPP)) &&
+ (BlockAtY != E_BLOCK_FENCE) &&
+ (BlockAtY != E_BLOCK_FENCE_GATE)
+ )
{
m_PotentialCoordinates.push_back(Vector3d((gCrossCoords[i].x + PosX), PosY + 1, gCrossCoords[i].z + PosZ));
}
@@ -402,7 +416,7 @@ void cMonster::HandleFalling()
GetWorld()->BroadcastSoundParticleEffect(2006, POSX_TOINT, POSY_TOINT - 1, POSZ_TOINT, Damage /* Used as particle effect speed modifier */);
}
- m_LastGroundHeight = (int)floor(GetPosY());
+ m_LastGroundHeight = POSY_TOINT;
}
}
@@ -411,7 +425,7 @@ void cMonster::HandleFalling()
int cMonster::FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ)
{
- int PosY = (int)floor(GetPosY());
+ int PosY = POSY_TOINT;
if (PosY < 0)
PosY = 0;
@@ -526,7 +540,7 @@ void cMonster::KilledBy(cEntity * a_Killer)
break;
}
}
- if (a_Killer != NULL)
+ if ((a_Killer != NULL) && (!IsBaby()))
{
m_World->SpawnExperienceOrb(GetPosX(), GetPosY(), GetPosZ(), Reward);
}
@@ -969,15 +983,15 @@ void cMonster::HandleDaylightBurning(cChunk & a_Chunk)
return;
}
- int RelY = (int)floor(GetPosY());
+ int RelY = POSY_TOINT;
if ((RelY < 0) || (RelY >= cChunkDef::Height))
{
// Outside the world
return;
}
- int RelX = (int)floor(GetPosX()) - GetChunkX() * cChunkDef::Width;
- int RelZ = (int)floor(GetPosZ()) - GetChunkZ() * cChunkDef::Width;
+ int RelX = POSX_TOINT - GetChunkX() * cChunkDef::Width;
+ int RelZ = POSZ_TOINT - GetChunkZ() * cChunkDef::Width;
if (!a_Chunk.IsLightValid())
{
@@ -989,7 +1003,8 @@ void cMonster::HandleDaylightBurning(cChunk & a_Chunk)
(a_Chunk.GetSkyLight(RelX, RelY, RelZ) == 15) && // In the daylight
(a_Chunk.GetBlock(RelX, RelY, RelZ) != E_BLOCK_SOULSAND) && // Not on soulsand
(GetWorld()->GetTimeOfDay() < (12000 + 1000)) && // It is nighttime
- !IsOnFire() // Not already burning
+ !IsOnFire() && // Not already burning
+ (GetWorld()->GetWeather() != eWeather_Rain) // Not raining
)
{
// Burn for 100 ticks, then decide again
diff --git a/src/Mobs/Monster.h b/src/Mobs/Monster.h
index 776426a0d..70b3783fc 100644
--- a/src/Mobs/Monster.h
+++ b/src/Mobs/Monster.h
@@ -185,14 +185,14 @@ protected:
inline bool IsNextYPosReachable(int a_PosY)
{
return (
- (a_PosY <= (int)floor(GetPosY())) ||
+ (a_PosY <= POSY_TOINT) ||
DoesPosYRequireJump(a_PosY)
);
}
/** Returns if a monster can reach a given height by jumping */
inline bool DoesPosYRequireJump(int a_PosY)
{
- return ((a_PosY > (int)floor(GetPosY())) && (a_PosY == (int)floor(GetPosY()) + 1));
+ return ((a_PosY > POSY_TOINT) && (a_PosY == POSY_TOINT + 1));
}
/** A semi-temporary list to store the traversed coordinates during active pathfinding so we don't visit them again */
diff --git a/src/Mobs/Sheep.cpp b/src/Mobs/Sheep.cpp
index c64360153..d599a4cef 100644
--- a/src/Mobs/Sheep.cpp
+++ b/src/Mobs/Sheep.cpp
@@ -101,7 +101,7 @@ void cSheep::Tick(float a_Dt, cChunk & a_Chunk)
{
if (m_World->GetBlock(PosX, PosY, PosZ) == E_BLOCK_GRASS)
{
- m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_SHEEP_EATING);
+ m_World->BroadcastEntityStatus(*this, esSheepEating);
m_TimeToStopEating = 40;
}
}
diff --git a/src/Mobs/Villager.cpp b/src/Mobs/Villager.cpp
index bbd8d6aaa..d049acc1e 100644
--- a/src/Mobs/Villager.cpp
+++ b/src/Mobs/Villager.cpp
@@ -30,7 +30,7 @@ void cVillager::DoTakeDamage(TakeDamageInfo & a_TDI)
{
if (m_World->GetTickRandomNumber(5) == 3)
{
- m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_VILLAGER_ANGRY);
+ m_World->BroadcastEntityStatus(*this, esVillagerAngry);
}
}
}
diff --git a/src/Mobs/Wolf.cpp b/src/Mobs/Wolf.cpp
index 0d3619166..f02b8a4fc 100644
--- a/src/Mobs/Wolf.cpp
+++ b/src/Mobs/Wolf.cpp
@@ -75,12 +75,12 @@ void cWolf::OnRightClicked(cPlayer & a_Player)
SetMaxHealth(20);
SetIsTame(true);
SetOwner(a_Player.GetName());
- m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_WOLF_TAMED);
+ m_World->BroadcastEntityStatus(*this, esWolfTamed);
m_World->BroadcastParticleEffect("heart", (float) GetPosX(), (float) GetPosY(), (float) GetPosZ(), 0, 0, 0, 0, 5);
}
else
{
- m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_WOLF_TAMING);
+ m_World->BroadcastEntityStatus(*this, esWolfTaming);
m_World->BroadcastParticleEffect("smoke", (float) GetPosX(), (float) GetPosY(), (float) GetPosZ(), 0, 0, 0, 0, 5);
}
}
diff --git a/src/Protocol/Authenticator.cpp b/src/Protocol/Authenticator.cpp
new file mode 100644
index 000000000..a30131b36
--- /dev/null
+++ b/src/Protocol/Authenticator.cpp
@@ -0,0 +1,313 @@
+
+#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
+
+#include "Authenticator.h"
+#include "../OSSupport/BlockingTCPLink.h"
+#include "../Root.h"
+#include "../Server.h"
+#include "../ClientHandle.h"
+
+#include "inifile/iniFile.h"
+#include "json/json.h"
+
+#include "polarssl/config.h"
+#include "polarssl/net.h"
+#include "polarssl/ssl.h"
+#include "polarssl/entropy.h"
+#include "polarssl/ctr_drbg.h"
+#include "polarssl/error.h"
+#include "polarssl/certs.h"
+
+#include <sstream>
+#include <iomanip>
+
+
+
+
+
+#define DEFAULT_AUTH_SERVER "sessionserver.mojang.com"
+#define DEFAULT_AUTH_ADDRESS "/session/minecraft/hasJoined?username=%USERNAME%&serverId=%SERVERID%"
+
+
+
+
+
+cAuthenticator::cAuthenticator(void) :
+ super("cAuthenticator"),
+ m_Server(DEFAULT_AUTH_SERVER),
+ m_Address(DEFAULT_AUTH_ADDRESS),
+ m_ShouldAuthenticate(true)
+{
+}
+
+
+
+
+
+cAuthenticator::~cAuthenticator()
+{
+ Stop();
+}
+
+
+
+
+
+void cAuthenticator::ReadINI(cIniFile & IniFile)
+{
+ m_Server = IniFile.GetValueSet("Authentication", "Server", DEFAULT_AUTH_SERVER);
+ m_Address = IniFile.GetValueSet("Authentication", "Address", DEFAULT_AUTH_ADDRESS);
+ m_ShouldAuthenticate = IniFile.GetValueSetB("Authentication", "Authenticate", true);
+}
+
+
+
+
+
+void cAuthenticator::Authenticate(int a_ClientID, const AString & a_UserName, const AString & a_ServerHash)
+{
+ if (!m_ShouldAuthenticate)
+ {
+ cRoot::Get()->AuthenticateUser(a_ClientID, a_UserName, cClientHandle::GenerateOfflineUUID(a_UserName));
+ return;
+ }
+
+ cCSLock LOCK(m_CS);
+ m_Queue.push_back(cUser(a_ClientID, a_UserName, a_ServerHash));
+ m_QueueNonempty.Set();
+}
+
+
+
+
+
+void cAuthenticator::Start(cIniFile & IniFile)
+{
+ ReadINI(IniFile);
+ m_ShouldTerminate = false;
+ super::Start();
+}
+
+
+
+
+
+void cAuthenticator::Stop(void)
+{
+ m_ShouldTerminate = true;
+ m_QueueNonempty.Set();
+ Wait();
+}
+
+
+
+
+
+void cAuthenticator::Execute(void)
+{
+ for (;;)
+ {
+ cCSLock Lock(m_CS);
+ while (!m_ShouldTerminate && (m_Queue.size() == 0))
+ {
+ cCSUnlock Unlock(Lock);
+ m_QueueNonempty.Wait();
+ }
+ if (m_ShouldTerminate)
+ {
+ return;
+ }
+ ASSERT(!m_Queue.empty());
+
+ int ClientID = m_Queue.front().m_ClientID;
+ AString UserName = m_Queue.front().m_Name;
+ AString ServerID = m_Queue.front().m_ServerID;
+ m_Queue.pop_front();
+ Lock.Unlock();
+
+ AString NewUserName = UserName;
+ AString UUID;
+ if (AuthWithYggdrasil(NewUserName, ServerID, UUID))
+ {
+ LOGINFO("User %s authenticated with UUID '%s'", NewUserName.c_str(), UUID.c_str());
+ cRoot::Get()->AuthenticateUser(ClientID, NewUserName, UUID);
+ }
+ else
+ {
+ cRoot::Get()->KickUser(ClientID, "Failed to authenticate account!");
+ }
+ } // for (-ever)
+}
+
+
+
+
+
+bool cAuthenticator::AuthWithYggdrasil(AString & a_UserName, const AString & a_ServerId, AString & a_UUID)
+{
+ LOGD("Trying to auth user %s", a_UserName.c_str());
+
+ int ret, server_fd = -1;
+ unsigned char buf[1024];
+ const char *pers = "cAuthenticator";
+
+ entropy_context entropy;
+ ctr_drbg_context ctr_drbg;
+ ssl_context ssl;
+ x509_crt cacert;
+
+ /* Initialize the RNG and the session data */
+ memset(&ssl, 0, sizeof(ssl_context));
+ x509_crt_init(&cacert);
+
+ entropy_init(&entropy);
+ if ((ret = ctr_drbg_init(&ctr_drbg, entropy_func, &entropy, (const unsigned char *)pers, strlen(pers))) != 0)
+ {
+ LOGWARNING("cAuthenticator: ctr_drbg_init returned %d", ret);
+ return false;
+ }
+
+ /* Initialize certificates */
+ // TODO: Grab the sessionserver's root CA and any intermediates and hard-code them here, instead of test_ca_list
+ ret = x509_crt_parse(&cacert, (const unsigned char *)test_ca_list, strlen(test_ca_list));
+
+ if (ret < 0)
+ {
+ LOGWARNING("cAuthenticator: x509_crt_parse returned -0x%x", -ret);
+ return false;
+ }
+
+ /* Connect */
+ if ((ret = net_connect(&server_fd, m_Server.c_str(), 443)) != 0)
+ {
+ LOGWARNING("cAuthenticator: Can't connect to %s: %d", m_Server.c_str(), ret);
+ return false;
+ }
+
+ /* Setup */
+ if ((ret = ssl_init(&ssl)) != 0)
+ {
+ LOGWARNING("cAuthenticator: ssl_init returned %d", ret);
+ return false;
+ }
+ ssl_set_endpoint(&ssl, SSL_IS_CLIENT);
+ ssl_set_authmode(&ssl, SSL_VERIFY_OPTIONAL);
+ ssl_set_ca_chain(&ssl, &cacert, NULL, "PolarSSL Server 1");
+ ssl_set_rng(&ssl, ctr_drbg_random, &ctr_drbg);
+ ssl_set_bio(&ssl, net_recv, &server_fd, net_send, &server_fd);
+
+ /* Handshake */
+ while ((ret = ssl_handshake(&ssl)) != 0)
+ {
+ if ((ret != POLARSSL_ERR_NET_WANT_READ) && (ret != POLARSSL_ERR_NET_WANT_WRITE))
+ {
+ LOGWARNING("cAuthenticator: ssl_handshake returned -0x%x", -ret);
+ return false;
+ }
+ }
+
+ /* Write the GET request */
+ AString ActualAddress = m_Address;
+ ReplaceString(ActualAddress, "%USERNAME%", a_UserName);
+ ReplaceString(ActualAddress, "%SERVERID%", a_ServerId);
+
+ AString Request;
+ Request += "GET " + ActualAddress + " HTTP/1.1\r\n";
+ Request += "Host: " + m_Server + "\r\n";
+ Request += "User-Agent: MCServer\r\n";
+ Request += "Connection: close\r\n";
+ Request += "\r\n";
+
+ ret = ssl_write(&ssl, (const unsigned char *)Request.c_str(), Request.size());
+ if (ret <= 0)
+ {
+ LOGWARNING("cAuthenticator: ssl_write returned %d", ret);
+ return false;
+ }
+
+ /* Read the HTTP response */
+ std::string Response;
+ for (;;)
+ {
+ memset(buf, 0, sizeof(buf));
+ ret = ssl_read(&ssl, buf, sizeof(buf));
+
+ if ((ret == POLARSSL_ERR_NET_WANT_READ) || (ret == POLARSSL_ERR_NET_WANT_WRITE))
+ {
+ continue;
+ }
+ if (ret == POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY)
+ {
+ break;
+ }
+ if (ret < 0)
+ {
+ LOGWARNING("cAuthenticator: ssl_read returned %d", ret);
+ break;
+ }
+ if (ret == 0)
+ {
+ LOGWARNING("cAuthenticator: EOF");
+ break;
+ }
+
+ Response.append((const char *)buf, ret);
+ }
+
+ ssl_close_notify(&ssl);
+ x509_crt_free(&cacert);
+ net_close(server_fd);
+ ssl_free(&ssl);
+ entropy_free(&entropy);
+ memset(&ssl, 0, sizeof(ssl));
+
+ // Check the HTTP status line:
+ AString prefix("HTTP/1.1 200 OK");
+ AString HexDump;
+ if (Response.compare(0, prefix.size(), prefix))
+ {
+ LOGINFO("User \"%s\" failed to auth, bad http status line received", a_UserName.c_str());
+ LOG("Response: \n%s", CreateHexDump(HexDump, Response.data(), Response.size(), 16).c_str());
+ return false;
+ }
+
+ // Erase the HTTP headers from the response:
+ size_t idxHeadersEnd = Response.find("\r\n\r\n");
+ if (idxHeadersEnd == AString::npos)
+ {
+ LOGINFO("User \"%s\" failed to authenticate, bad http response header received", a_UserName.c_str());
+ LOG("Response: \n%s", CreateHexDump(HexDump, Response.data(), Response.size(), 16).c_str());
+ return false;
+ }
+ Response.erase(0, idxHeadersEnd + 4);
+
+ // Parse the Json response:
+ if (Response.empty())
+ {
+ return false;
+ }
+ Json::Value root;
+ Json::Reader reader;
+ if (!reader.parse(Response, root, false))
+ {
+ LOGWARNING("cAuthenticator: Cannot parse Received Data to json!");
+ return false;
+ }
+ a_UserName = root.get("name", "Unknown").asString();
+ a_UUID = root.get("id", "").asString();
+
+ // If the UUID doesn't contain the hashes, insert them at the proper places:
+ if (a_UUID.size() == 32)
+ {
+ a_UUID.insert(8, "-");
+ a_UUID.insert(13, "-");
+ a_UUID.insert(18, "-");
+ a_UUID.insert(23, "-");
+ }
+ return true;
+}
+
+
+
+
+
diff --git a/src/Authenticator.h b/src/Protocol/Authenticator.h
index 02cd6f4c5..211f51394 100644
--- a/src/Authenticator.h
+++ b/src/Protocol/Authenticator.h
@@ -14,7 +14,7 @@
#ifndef CAUTHENTICATOR_H_INCLUDED
#define CAUTHENTICATOR_H_INCLUDED
-#include "OSSupport/IsThread.h"
+#include "../OSSupport/IsThread.h"
@@ -31,23 +31,23 @@ class cAuthenticator :
public cIsThread
{
typedef cIsThread super;
-
+
public:
cAuthenticator(void);
~cAuthenticator();
- /// (Re-)read server and address from INI:
+ /** (Re-)read server and address from INI: */
void ReadINI(cIniFile & IniFile);
- /// Queues a request for authenticating a user. If the auth fails, the user is kicked
+ /** Queues a request for authenticating a user. If the auth fails, the user will be kicked */
void Authenticate(int a_ClientID, const AString & a_UserName, const AString & a_ServerHash);
- /// Starts the authenticator thread. The thread may be started and stopped repeatedly
+ /** Starts the authenticator thread. The thread may be started and stopped repeatedly */
void Start(cIniFile & IniFile);
-
- /// Stops the authenticator thread. The thread may be started and stopped repeatedly
+
+ /** Stops the authenticator thread. The thread may be started and stopped repeatedly */
void Stop(void);
-
+
private:
class cUser
@@ -56,30 +56,30 @@ private:
int m_ClientID;
AString m_Name;
AString m_ServerID;
-
+
cUser(int a_ClientID, const AString & a_Name, const AString & a_ServerID) :
m_ClientID(a_ClientID),
m_Name(a_Name),
m_ServerID(a_ServerID)
{
}
- } ;
-
+ };
+
typedef std::deque<cUser> cUserList;
-
+
cCriticalSection m_CS;
cUserList m_Queue;
cEvent m_QueueNonempty;
-
+
AString m_Server;
AString m_Address;
bool m_ShouldAuthenticate;
-
- // cIsThread override:
+
+ /** cIsThread override: */
virtual void Execute(void) override;
-
- // Returns true if the user authenticated okay, false on error; iLevel is the recursion deptht (bails out if too deep)
- bool AuthFromAddress(const AString & a_Server, const AString & a_Address, const AString & a_UserName, int a_Level = 1);
+
+ /** Returns true if the user authenticated okay, false on error; iLevel is the recursion deptht (bails out if too deep) */
+ bool AuthWithYggdrasil(AString & a_UserName, const AString & a_ServerId, AString & a_UUID);
};
diff --git a/src/Protocol/Protocol.h b/src/Protocol/Protocol.h
index 939170f0e..2fbeef0fa 100644
--- a/src/Protocol/Protocol.h
+++ b/src/Protocol/Protocol.h
@@ -83,6 +83,7 @@ public:
virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) = 0;
virtual void SendKeepAlive (int a_PingID) = 0;
virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) = 0;
+ virtual void SendLoginSuccess (void) = 0;
virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) = 0;
virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators) = 0;
virtual void SendMapInfo (int a_ID, unsigned int a_Scale) = 0;
diff --git a/src/Protocol/Protocol125.cpp b/src/Protocol/Protocol125.cpp
index bf946ef19..af1b1c604 100644
--- a/src/Protocol/Protocol125.cpp
+++ b/src/Protocol/Protocol125.cpp
@@ -594,6 +594,15 @@ void cProtocol125::SendLogin(const cPlayer & a_Player, const cWorld & a_World)
+void cProtocol125::SendLoginSuccess(void)
+{
+ // Not supported in this protocol version
+}
+
+
+
+
+
void cProtocol125::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length)
{
cCSLock Lock(m_CSPacket);
@@ -642,6 +651,17 @@ void cProtocol125::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decor
+void cProtocol125::SendMapInfo(int a_ID, unsigned int a_Scale)
+{
+ // This protocol doesn't support such message
+ UNUSED(a_ID);
+ UNUSED(a_Scale);
+}
+
+
+
+
+
void cProtocol125::SendPickupSpawn(const cPickup & a_Pickup)
{
cCSLock Lock(m_CSPacket);
@@ -683,6 +703,16 @@ void cProtocol125::SendParticleEffect(const AString & a_ParticleName, float a_Sr
+void cProtocol125::SendPaintingSpawn(const cPainting & a_Painting)
+{
+ // Not implemented in this protocol version
+ UNUSED(a_Painting);
+}
+
+
+
+
+
void cProtocol125::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline)
{
cCSLock Lock(m_CSPacket);
@@ -842,6 +872,18 @@ void cProtocol125::SendExperienceOrb(const cExpOrb & a_ExpOrb)
+void cProtocol125::SendScoreboardObjective(const AString & a_Name, const AString & a_DisplayName, Byte a_Mode)
+{
+ // This protocol version doesn't support such message
+ UNUSED(a_Name);
+ UNUSED(a_DisplayName);
+ UNUSED(a_Mode);
+}
+
+
+
+
+
void cProtocol125::SendSoundEffect(const AString & a_SoundName, int a_SrcX, int a_SrcY, int a_SrcZ, float a_Volume, float a_Pitch)
{
// Not needed in this protocol version
diff --git a/src/Protocol/Protocol125.h b/src/Protocol/Protocol125.h
index 08d3ebbe9..16f31bd0e 100644
--- a/src/Protocol/Protocol125.h
+++ b/src/Protocol/Protocol125.h
@@ -56,19 +56,12 @@ public:
virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) override;
virtual void SendKeepAlive (int a_PingID) override;
virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) override;
+ virtual void SendLoginSuccess (void) override;
virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) override;
virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators) override;
- virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override
- {
- // This protocol doesn't support such message
- UNUSED(a_ID);
- UNUSED(a_Scale);
- }
+ virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override;
virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount) override;
- virtual void SendPaintingSpawn (const cPainting & a_Painting) override
- {
- UNUSED(a_Painting);
- };
+ virtual void SendPaintingSpawn (const cPainting & a_Painting) override;
virtual void SendPickupSpawn (const cPickup & a_Pickup) override;
virtual void SendPlayerAbilities (void) override {} // This protocol doesn't support such message
virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override;
@@ -82,12 +75,7 @@ public:
virtual void SendRespawn (void) override;
virtual void SendExperience (void) override;
virtual void SendExperienceOrb (const cExpOrb & a_ExpOrb) override;
- virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override
- {
- UNUSED(a_Name);
- UNUSED(a_DisplayName);
- UNUSED(a_Mode);
- } // This protocol doesn't support such message
+ virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override;
virtual void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) override {} // This protocol doesn't support such message
virtual void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) override {} // This protocol doesn't support such message
virtual void SendSoundEffect (const AString & a_SoundName, int a_SrcX, int a_SrcY, int a_SrcZ, float a_Volume, float a_Pitch) override; // a_Src coords are Block * 8
diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp
index a4319df37..403046760 100644
--- a/src/Protocol/Protocol17x.cpp
+++ b/src/Protocol/Protocol17x.cpp
@@ -88,8 +88,9 @@ cProtocol172::cProtocol172(cClientHandle * a_Client, const AString & a_ServerAdd
// Create the comm log file, if so requested:
if (g_ShouldLogCommIn || g_ShouldLogCommOut)
{
+ static int sCounter = 0;
cFile::CreateFolder("CommLogs");
- AString FileName = Printf("CommLogs/%x__%s.log", (unsigned)time(NULL), a_Client->GetIPString().c_str());
+ AString FileName = Printf("CommLogs/%x_%d__%s.log", (unsigned)time(NULL), sCounter++, a_Client->GetIPString().c_str());
m_CommLogFile.Open(FileName, cFile::fmWrite);
}
}
@@ -124,6 +125,8 @@ void cProtocol172::DataReceived(const char * a_Data, size_t a_Size)
void cProtocol172::SendAttachEntity(const cEntity & a_Entity, const cEntity * a_Vehicle)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x1b); // Attach Entity packet
Pkt.WriteInt(a_Entity.GetUniqueID());
Pkt.WriteInt((a_Vehicle != NULL) ? a_Vehicle->GetUniqueID() : 0);
@@ -136,6 +139,8 @@ void cProtocol172::SendAttachEntity(const cEntity & a_Entity, const cEntity * a_
void cProtocol172::SendBlockAction(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x24); // Block Action packet
Pkt.WriteInt(a_BlockX);
Pkt.WriteShort(a_BlockY);
@@ -151,6 +156,8 @@ void cProtocol172::SendBlockAction(int a_BlockX, int a_BlockY, int a_BlockZ, cha
void cProtocol172::SendBlockBreakAnim(int a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x25); // Block Break Animation packet
Pkt.WriteVarInt(a_EntityID);
Pkt.WriteInt(a_BlockX);
@@ -165,6 +172,8 @@ void cProtocol172::SendBlockBreakAnim(int a_EntityID, int a_BlockX, int a_BlockY
void cProtocol172::SendBlockChange(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x23); // Block Change packet
Pkt.WriteInt(a_BlockX);
Pkt.WriteByte(a_BlockY);
@@ -179,6 +188,8 @@ void cProtocol172::SendBlockChange(int a_BlockX, int a_BlockY, int a_BlockZ, BLO
void cProtocol172::SendBlockChanges(int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x22); // Multi Block Change packet
Pkt.WriteInt(a_ChunkX);
Pkt.WriteInt(a_ChunkZ);
@@ -198,6 +209,8 @@ void cProtocol172::SendBlockChanges(int a_ChunkX, int a_ChunkZ, const sSetBlockV
void cProtocol172::SendChat(const AString & a_Message)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x02); // Chat Message packet
Pkt.WriteString(Printf("{\"text\":\"%s\"}", EscapeString(a_Message).c_str()));
}
@@ -208,6 +221,8 @@ void cProtocol172::SendChat(const AString & a_Message)
void cProtocol172::SendChat(const cCompositeChat & a_Message)
{
+ ASSERT(m_State == 3); // In game mode?
+
// Compose the complete Json string to send:
Json::Value msg;
msg["text"] = ""; // The client crashes without this
@@ -280,6 +295,8 @@ void cProtocol172::SendChat(const cCompositeChat & a_Message)
void cProtocol172::SendChunkData(int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer)
{
+ ASSERT(m_State == 3); // In game mode?
+
// Serialize first, before creating the Packetizer (the packetizer locks a CS)
// This contains the flags and bitmasks, too
const AString & ChunkData = a_Serializer.Serialize(cChunkDataSerializer::RELEASE_1_3_2);
@@ -296,6 +313,8 @@ void cProtocol172::SendChunkData(int a_ChunkX, int a_ChunkZ, cChunkDataSerialize
void cProtocol172::SendCollectPickup(const cPickup & a_Pickup, const cPlayer & a_Player)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x0d); // Collect Item packet
Pkt.WriteInt(a_Pickup.GetUniqueID());
Pkt.WriteInt(a_Player.GetUniqueID());
@@ -307,6 +326,8 @@ void cProtocol172::SendCollectPickup(const cPickup & a_Pickup, const cPlayer & a
void cProtocol172::SendDestroyEntity(const cEntity & a_Entity)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x13); // Destroy Entities packet
Pkt.WriteByte(1);
Pkt.WriteInt(a_Entity.GetUniqueID());
@@ -343,6 +364,8 @@ void cProtocol172::SendDisconnect(const AString & a_Reason)
void cProtocol172::SendEditSign(int a_BlockX, int a_BlockY, int a_BlockZ)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x36); // Sign Editor Open packet
Pkt.WriteInt(a_BlockX);
Pkt.WriteInt(a_BlockY);
@@ -355,6 +378,8 @@ void cProtocol172::SendEditSign(int a_BlockX, int a_BlockY, int a_BlockZ)
void cProtocol172::SendEntityEffect(const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x1D); // Entity Effect packet
Pkt.WriteInt(a_Entity.GetUniqueID());
Pkt.WriteByte(a_EffectID);
@@ -368,6 +393,8 @@ void cProtocol172::SendEntityEffect(const cEntity & a_Entity, int a_EffectID, in
void cProtocol172::SendEntityEquipment(const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x04); // Entity Equipment packet
Pkt.WriteInt(a_Entity.GetUniqueID());
Pkt.WriteShort(a_SlotNum);
@@ -380,6 +407,8 @@ void cProtocol172::SendEntityEquipment(const cEntity & a_Entity, short a_SlotNum
void cProtocol172::SendEntityHeadLook(const cEntity & a_Entity)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x19); // Entity Head Look packet
Pkt.WriteInt(a_Entity.GetUniqueID());
Pkt.WriteByteAngle(a_Entity.GetHeadYaw());
@@ -391,6 +420,8 @@ void cProtocol172::SendEntityHeadLook(const cEntity & a_Entity)
void cProtocol172::SendEntityLook(const cEntity & a_Entity)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x16); // Entity Look packet
Pkt.WriteInt(a_Entity.GetUniqueID());
Pkt.WriteByteAngle(a_Entity.GetYaw());
@@ -403,6 +434,8 @@ void cProtocol172::SendEntityLook(const cEntity & a_Entity)
void cProtocol172::SendEntityMetadata(const cEntity & a_Entity)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x1c); // Entity Metadata packet
Pkt.WriteInt(a_Entity.GetUniqueID());
Pkt.WriteEntityMetadata(a_Entity);
@@ -415,6 +448,8 @@ void cProtocol172::SendEntityMetadata(const cEntity & a_Entity)
void cProtocol172::SendEntityProperties(const cEntity & a_Entity)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x20); // Entity Properties packet
Pkt.WriteInt(a_Entity.GetUniqueID());
Pkt.WriteEntityProperties(a_Entity);
@@ -426,6 +461,8 @@ void cProtocol172::SendEntityProperties(const cEntity & a_Entity)
void cProtocol172::SendEntityRelMove(const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x15); // Entity Relative Move packet
Pkt.WriteInt(a_Entity.GetUniqueID());
Pkt.WriteByte(a_RelX);
@@ -439,6 +476,8 @@ void cProtocol172::SendEntityRelMove(const cEntity & a_Entity, char a_RelX, char
void cProtocol172::SendEntityRelMoveLook(const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x17); // Entity Look And Relative Move packet
Pkt.WriteInt(a_Entity.GetUniqueID());
Pkt.WriteByte(a_RelX);
@@ -454,6 +493,8 @@ void cProtocol172::SendEntityRelMoveLook(const cEntity & a_Entity, char a_RelX,
void cProtocol172::SendEntityStatus(const cEntity & a_Entity, char a_Status)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x1a); // Entity Status packet
Pkt.WriteInt(a_Entity.GetUniqueID());
Pkt.WriteChar(a_Status);
@@ -465,6 +506,8 @@ void cProtocol172::SendEntityStatus(const cEntity & a_Entity, char a_Status)
void cProtocol172::SendEntityVelocity(const cEntity & a_Entity)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x12); // Entity Velocity packet
Pkt.WriteInt(a_Entity.GetUniqueID());
// 400 = 8000 / 20 ... Conversion from our speed in m/s to 8000 m/tick
@@ -479,6 +522,8 @@ void cProtocol172::SendEntityVelocity(const cEntity & a_Entity)
void cProtocol172::SendExplosion(double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x27); // Explosion packet
Pkt.WriteFloat((float)a_BlockX);
Pkt.WriteFloat((float)a_BlockY);
@@ -502,6 +547,8 @@ void cProtocol172::SendExplosion(double a_BlockX, double a_BlockY, double a_Bloc
void cProtocol172::SendGameMode(eGameMode a_GameMode)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x2b); // Change Game State packet
Pkt.WriteByte(3); // Reason: Change game mode
Pkt.WriteFloat((float)a_GameMode);
@@ -513,6 +560,8 @@ void cProtocol172::SendGameMode(eGameMode a_GameMode)
void cProtocol172::SendHealth(void)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x06); // Update Health packet
Pkt.WriteFloat((float)m_Client->GetPlayer()->GetHealth());
Pkt.WriteShort(m_Client->GetPlayer()->GetFoodLevel());
@@ -525,6 +574,8 @@ void cProtocol172::SendHealth(void)
void cProtocol172::SendInventorySlot(char a_WindowID, short a_SlotNum, const cItem & a_Item)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x2f); // Set Slot packet
Pkt.WriteChar(a_WindowID);
Pkt.WriteShort(a_SlotNum);
@@ -537,6 +588,13 @@ void cProtocol172::SendInventorySlot(char a_WindowID, short a_SlotNum, const cIt
void cProtocol172::SendKeepAlive(int a_PingID)
{
+ // Drop the packet if the protocol is not in the Game state yet (caused a client crash):
+ if (m_State != 3)
+ {
+ LOGWARNING("Trying to send a KeepAlive packet to a player who's not yet fully logged in (%d). The protocol class prevented the packet.", m_State);
+ return;
+ }
+
cPacketizer Pkt(*this, 0x00); // Keep Alive packet
Pkt.WriteInt(a_PingID);
}
@@ -573,8 +631,25 @@ void cProtocol172::SendLogin(const cPlayer & a_Player, const cWorld & a_World)
+void cProtocol172::SendLoginSuccess(void)
+{
+ ASSERT(m_State == 2); // State: login?
+
+ cPacketizer Pkt(*this, 0x02); // Login success packet
+ Pkt.WriteString(m_Client->GetUUID());
+ Pkt.WriteString(m_Client->GetUsername());
+
+ m_State = 3; // State = Game
+}
+
+
+
+
+
void cProtocol172::SendPaintingSpawn(const cPainting & a_Painting)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x10); // Spawn Painting packet
Pkt.WriteVarInt(a_Painting.GetUniqueID());
Pkt.WriteString(a_Painting.GetName().c_str());
@@ -590,6 +665,8 @@ void cProtocol172::SendPaintingSpawn(const cPainting & a_Painting)
void cProtocol172::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x34);
Pkt.WriteVarInt(a_ID);
Pkt.WriteShort (3 + a_Length);
@@ -610,6 +687,8 @@ void cProtocol172::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colo
void cProtocol172::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decorators)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x34);
Pkt.WriteVarInt(a_ID);
Pkt.WriteShort (1 + (3 * a_Decorators.size()));
@@ -630,6 +709,8 @@ void cProtocol172::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decor
void cProtocol172::SendMapInfo(int a_ID, unsigned int a_Scale)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x34);
Pkt.WriteVarInt(a_ID);
Pkt.WriteShort (2);
@@ -645,6 +726,8 @@ void cProtocol172::SendMapInfo(int a_ID, unsigned int a_Scale)
void cProtocol172::SendPickupSpawn(const cPickup & a_Pickup)
{
+ ASSERT(m_State == 3); // In game mode?
+
{
cPacketizer Pkt(*this, 0x0e); // Spawn Object packet
Pkt.WriteVarInt(a_Pickup.GetUniqueID());
@@ -671,6 +754,8 @@ void cProtocol172::SendPickupSpawn(const cPickup & a_Pickup)
void cProtocol172::SendPlayerAbilities(void)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x39); // Player Abilities packet
Byte Flags = 0;
if (m_Client->GetPlayer()->IsGameModeCreative())
@@ -697,6 +782,8 @@ void cProtocol172::SendPlayerAbilities(void)
void cProtocol172::SendEntityAnimation(const cEntity & a_Entity, char a_Animation)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x0b); // Animation packet
Pkt.WriteVarInt(a_Entity.GetUniqueID());
Pkt.WriteChar(a_Animation);
@@ -708,6 +795,8 @@ void cProtocol172::SendEntityAnimation(const cEntity & a_Entity, char a_Animatio
void cProtocol172::SendParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x2A);
Pkt.WriteString(a_ParticleName);
Pkt.WriteFloat(a_SrcX);
@@ -726,6 +815,8 @@ void cProtocol172::SendParticleEffect(const AString & a_ParticleName, float a_Sr
void cProtocol172::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x38); // Playerlist Item packet
Pkt.WriteString(a_Player.GetName());
Pkt.WriteBool(a_IsOnline);
@@ -738,6 +829,8 @@ void cProtocol172::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline)
void cProtocol172::SendPlayerMaxSpeed(void)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x20); // Entity Properties
Pkt.WriteInt(m_Client->GetPlayer()->GetUniqueID());
Pkt.WriteInt(1); // Count
@@ -764,6 +857,8 @@ void cProtocol172::SendPlayerMaxSpeed(void)
void cProtocol172::SendPlayerMoveLook(void)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x08); // Player Position And Look packet
Pkt.WriteDouble(m_Client->GetPlayer()->GetPosX());
@@ -793,10 +888,12 @@ void cProtocol172::SendPlayerPosition(void)
void cProtocol172::SendPlayerSpawn(const cPlayer & a_Player)
{
+ ASSERT(m_State == 3); // In game mode?
+
// Called to spawn another player for the client
cPacketizer Pkt(*this, 0x0c); // Spawn Player packet
Pkt.WriteVarInt(a_Player.GetUniqueID());
- Pkt.WriteString(Printf("%d", a_Player.GetUniqueID())); // TODO: Proper UUID
+ Pkt.WriteString(a_Player.GetClientHandle()->GetUUID());
Pkt.WriteString(a_Player.GetName());
Pkt.WriteFPInt(a_Player.GetPosX());
Pkt.WriteFPInt(a_Player.GetPosY());
@@ -816,6 +913,8 @@ void cProtocol172::SendPlayerSpawn(const cPlayer & a_Player)
void cProtocol172::SendPluginMessage(const AString & a_Channel, const AString & a_Message)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x3f);
Pkt.WriteString(a_Channel);
Pkt.WriteShort((short)a_Message.size());
@@ -828,7 +927,9 @@ void cProtocol172::SendPluginMessage(const AString & a_Channel, const AString &
void cProtocol172::SendRemoveEntityEffect(const cEntity & a_Entity, int a_EffectID)
{
- cPacketizer Pkt(*this, 0x1E);
+ ASSERT(m_State == 3); // In game mode?
+
+ cPacketizer Pkt(*this, 0x1e);
Pkt.WriteInt(a_Entity.GetUniqueID());
Pkt.WriteByte(a_EffectID);
}
@@ -852,7 +953,9 @@ void cProtocol172::SendRespawn(void)
void cProtocol172::SendExperience (void)
{
- cPacketizer Pkt(*this, 0x1F); //Experience Packet
+ ASSERT(m_State == 3); // In game mode?
+
+ cPacketizer Pkt(*this, 0x1f); // Experience Packet
Pkt.WriteFloat(m_Client->GetPlayer()->GetXpPercentage());
Pkt.WriteShort(m_Client->GetPlayer()->GetXpLevel());
Pkt.WriteShort(m_Client->GetPlayer()->GetCurrentXp());
@@ -864,6 +967,8 @@ void cProtocol172::SendExperience (void)
void cProtocol172::SendExperienceOrb(const cExpOrb & a_ExpOrb)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x11);
Pkt.WriteVarInt(a_ExpOrb.GetUniqueID());
Pkt.WriteInt((int) a_ExpOrb.GetPosX());
@@ -878,7 +983,9 @@ void cProtocol172::SendExperienceOrb(const cExpOrb & a_ExpOrb)
void cProtocol172::SendScoreboardObjective(const AString & a_Name, const AString & a_DisplayName, Byte a_Mode)
{
- cPacketizer Pkt(*this, 0x3B);
+ ASSERT(m_State == 3); // In game mode?
+
+ cPacketizer Pkt(*this, 0x3b);
Pkt.WriteString(a_Name);
Pkt.WriteString(a_DisplayName);
Pkt.WriteByte(a_Mode);
@@ -890,7 +997,9 @@ void cProtocol172::SendScoreboardObjective(const AString & a_Name, const AString
void cProtocol172::SendScoreUpdate(const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode)
{
- cPacketizer Pkt(*this, 0x3C);
+ ASSERT(m_State == 3); // In game mode?
+
+ cPacketizer Pkt(*this, 0x3c);
Pkt.WriteString(a_Player);
Pkt.WriteByte(a_Mode);
@@ -907,7 +1016,9 @@ void cProtocol172::SendScoreUpdate(const AString & a_Objective, const AString &
void cProtocol172::SendDisplayObjective(const AString & a_Objective, cScoreboard::eDisplaySlot a_Display)
{
- cPacketizer Pkt(*this, 0x3D);
+ ASSERT(m_State == 3); // In game mode?
+
+ cPacketizer Pkt(*this, 0x3d);
Pkt.WriteByte((int) a_Display);
Pkt.WriteString(a_Objective);
}
@@ -918,6 +1029,8 @@ void cProtocol172::SendDisplayObjective(const AString & a_Objective, cScoreboard
void cProtocol172::SendSoundEffect(const AString & a_SoundName, int a_SrcX, int a_SrcY, int a_SrcZ, float a_Volume, float a_Pitch) // a_Src coords are Block * 8
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x29); // Sound Effect packet
Pkt.WriteString(a_SoundName);
Pkt.WriteInt(a_SrcX);
@@ -933,6 +1046,8 @@ void cProtocol172::SendSoundEffect(const AString & a_SoundName, int a_SrcX, int
void cProtocol172::SendSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x28); // Effect packet
Pkt.WriteInt(a_EffectID);
Pkt.WriteInt(a_SrcX);
@@ -948,6 +1063,8 @@ void cProtocol172::SendSoundParticleEffect(int a_EffectID, int a_SrcX, int a_Src
void cProtocol172::SendSpawnFallingBlock(const cFallingBlock & a_FallingBlock)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x0e); // Spawn Object packet
Pkt.WriteVarInt(a_FallingBlock.GetUniqueID());
Pkt.WriteByte(70); // Falling block
@@ -968,6 +1085,8 @@ void cProtocol172::SendSpawnFallingBlock(const cFallingBlock & a_FallingBlock)
void cProtocol172::SendSpawnMob(const cMonster & a_Mob)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x0f); // Spawn Mob packet
Pkt.WriteVarInt(a_Mob.GetUniqueID());
Pkt.WriteByte((Byte)a_Mob.GetMobType());
@@ -990,6 +1109,8 @@ void cProtocol172::SendSpawnMob(const cMonster & a_Mob)
void cProtocol172::SendSpawnObject(const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0xe); // Spawn Object packet
Pkt.WriteVarInt(a_Entity.GetUniqueID());
Pkt.WriteByte(a_ObjectType);
@@ -1013,6 +1134,8 @@ void cProtocol172::SendSpawnObject(const cEntity & a_Entity, char a_ObjectType,
void cProtocol172::SendSpawnVehicle(const cEntity & a_Vehicle, char a_VehicleType, char a_VehicleSubType)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0xe); // Spawn Object packet
Pkt.WriteVarInt(a_Vehicle.GetUniqueID());
Pkt.WriteByte(a_VehicleType);
@@ -1036,6 +1159,8 @@ void cProtocol172::SendSpawnVehicle(const cEntity & a_Vehicle, char a_VehicleTyp
void cProtocol172::SendTabCompletionResults(const AStringVector & a_Results)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x3a); // Tab-Complete packet
Pkt.WriteVarInt(a_Results.size());
@@ -1051,6 +1176,8 @@ void cProtocol172::SendTabCompletionResults(const AStringVector & a_Results)
void cProtocol172::SendTeleportEntity(const cEntity & a_Entity)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x18);
Pkt.WriteInt(a_Entity.GetUniqueID());
Pkt.WriteFPInt(a_Entity.GetPosX());
@@ -1066,6 +1193,8 @@ void cProtocol172::SendTeleportEntity(const cEntity & a_Entity)
void cProtocol172::SendThunderbolt(int a_BlockX, int a_BlockY, int a_BlockZ)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x2c); // Spawn Global Entity packet
Pkt.WriteVarInt(0); // EntityID = 0, always
Pkt.WriteByte(1); // Type = Thunderbolt
@@ -1080,6 +1209,8 @@ void cProtocol172::SendThunderbolt(int a_BlockX, int a_BlockY, int a_BlockZ)
void cProtocol172::SendTimeUpdate(Int64 a_WorldAge, Int64 a_TimeOfDay)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x03);
Pkt.WriteInt64(a_WorldAge);
Pkt.WriteInt64(a_TimeOfDay);
@@ -1091,6 +1222,8 @@ void cProtocol172::SendTimeUpdate(Int64 a_WorldAge, Int64 a_TimeOfDay)
void cProtocol172::SendUnloadChunk(int a_ChunkX, int a_ChunkZ)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x21); // Chunk Data packet
Pkt.WriteInt(a_ChunkX);
Pkt.WriteInt(a_ChunkZ);
@@ -1105,6 +1238,8 @@ void cProtocol172::SendUnloadChunk(int a_ChunkX, int a_ChunkZ)
void cProtocol172::SendUpdateBlockEntity(cBlockEntity & a_BlockEntity)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x35); // Update tile entity packet
Pkt.WriteInt(a_BlockEntity.GetPosX());
Pkt.WriteShort(a_BlockEntity.GetPosY());
@@ -1130,6 +1265,8 @@ void cProtocol172::SendUpdateBlockEntity(cBlockEntity & a_BlockEntity)
void cProtocol172::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)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x33);
Pkt.WriteInt(a_BlockX);
Pkt.WriteShort((short)a_BlockY);
@@ -1147,6 +1284,8 @@ void cProtocol172::SendUpdateSign(int a_BlockX, int a_BlockY, int a_BlockZ, cons
void cProtocol172::SendUseBed(const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x0a);
Pkt.WriteInt(a_Entity.GetUniqueID());
Pkt.WriteInt(a_BlockX);
@@ -1160,6 +1299,8 @@ void cProtocol172::SendUseBed(const cEntity & a_Entity, int a_BlockX, int a_Bloc
void cProtocol172::SendWeather(eWeather a_Weather)
{
+ ASSERT(m_State == 3); // In game mode?
+
{
cPacketizer Pkt(*this, 0x2b); // Change Game State packet
Pkt.WriteByte((a_Weather == wSunny) ? 1 : 2); // End rain / begin rain
@@ -1175,6 +1316,8 @@ void cProtocol172::SendWeather(eWeather a_Weather)
void cProtocol172::SendWholeInventory(const cWindow & a_Window)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x30); // Window Items packet
Pkt.WriteChar(a_Window.GetWindowID());
Pkt.WriteShort(a_Window.GetNumSlots());
@@ -1192,6 +1335,8 @@ void cProtocol172::SendWholeInventory(const cWindow & a_Window)
void cProtocol172::SendWindowClose(const cWindow & a_Window)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x2e);
Pkt.WriteChar(a_Window.GetWindowID());
}
@@ -1202,6 +1347,8 @@ void cProtocol172::SendWindowClose(const cWindow & a_Window)
void cProtocol172::SendWindowOpen(const cWindow & a_Window)
{
+ ASSERT(m_State == 3); // In game mode?
+
if (a_Window.GetWindowType() < 0)
{
// Do not send this packet for player inventory windows
@@ -1226,6 +1373,8 @@ void cProtocol172::SendWindowOpen(const cWindow & a_Window)
void cProtocol172::SendWindowProperty(const cWindow & a_Window, short a_Property, short a_Value)
{
+ ASSERT(m_State == 3); // In game mode?
+
cPacketizer Pkt(*this, 0x31); // Window Property packet
Pkt.WriteChar(a_Window.GetWindowID());
Pkt.WriteShort(a_Property);
@@ -1555,15 +1704,6 @@ void cProtocol172::HandlePacketLoginEncryptionResponse(cByteBuffer & a_ByteBuffe
}
StartEncryption(DecryptedKey);
-
- // Send login success:
- {
- cPacketizer Pkt(*this, 0x02); // Login success packet
- Pkt.WriteString(Printf("%d", m_Client->GetUniqueID())); // TODO: proper UUID
- Pkt.WriteString(m_Client->GetUsername());
- }
-
- m_State = 3; // State = Game
m_Client->HandleLogin(4, m_Client->GetUsername());
}
@@ -1596,14 +1736,6 @@ void cProtocol172::HandlePacketLoginStart(cByteBuffer & a_ByteBuffer)
return;
}
- // Send login success:
- {
- cPacketizer Pkt(*this, 0x02); // Login success packet
- Pkt.WriteString(Printf("%d", m_Client->GetUniqueID())); // TODO: proper UUID
- Pkt.WriteString(Username);
- }
-
- m_State = 3; // State = Game
m_Client->HandleLogin(4, Username);
}
@@ -2755,3 +2887,64 @@ void cProtocol172::cPacketizer::WriteEntityProperties(const cEntity & a_Entity)
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// cProtocol176:
+
+cProtocol176::cProtocol176(cClientHandle * a_Client, const AString &a_ServerAddress, UInt16 a_ServerPort, UInt32 a_State) :
+ super(a_Client, a_ServerAddress, a_ServerPort, a_State)
+{
+}
+
+
+
+
+
+void cProtocol176::SendPlayerSpawn(const cPlayer & a_Player)
+{
+ // Called to spawn another player for the client
+ cPacketizer Pkt(*this, 0x0c); // Spawn Player packet
+ Pkt.WriteVarInt(a_Player.GetUniqueID());
+ Pkt.WriteString(a_Player.GetClientHandle()->GetUUID());
+ Pkt.WriteString(a_Player.GetName());
+ Pkt.WriteVarInt(0); // We have no data to send here
+ Pkt.WriteFPInt(a_Player.GetPosX());
+ Pkt.WriteFPInt(a_Player.GetPosY());
+ Pkt.WriteFPInt(a_Player.GetPosZ());
+ Pkt.WriteByteAngle(a_Player.GetYaw());
+ Pkt.WriteByteAngle(a_Player.GetPitch());
+ short ItemType = a_Player.GetEquippedItem().IsEmpty() ? 0 : a_Player.GetEquippedItem().m_ItemType;
+ Pkt.WriteShort(ItemType);
+ Pkt.WriteByte((3 << 5) | 6); // Metadata: float + index 6
+ Pkt.WriteFloat((float)a_Player.GetHealth());
+ Pkt.WriteByte(0x7f); // Metadata: end
+}
+
+
+
+
+
+void cProtocol176::HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer)
+{
+ // Send the response:
+ AString Response = "{\"version\":{\"name\":\"1.7.6\",\"protocol\":5},\"players\":{";
+ AppendPrintf(Response, "\"max\":%u,\"online\":%u,\"sample\":[]},",
+ cRoot::Get()->GetServer()->GetMaxPlayers(),
+ cRoot::Get()->GetServer()->GetNumPlayers()
+ );
+ AppendPrintf(Response, "\"description\":{\"text\":\"%s\"},",
+ cRoot::Get()->GetServer()->GetDescription().c_str()
+ );
+ AppendPrintf(Response, "\"favicon\":\"data:image/png;base64,%s\"",
+ cRoot::Get()->GetServer()->GetFaviconData().c_str()
+ );
+ Response.append("}");
+
+ cPacketizer Pkt(*this, 0x00); // Response packet
+ Pkt.WriteString(Response);
+}
+
+
+
+
+
diff --git a/src/Protocol/Protocol17x.h b/src/Protocol/Protocol17x.h
index 91186b270..5cafc4722 100644
--- a/src/Protocol/Protocol17x.h
+++ b/src/Protocol/Protocol17x.h
@@ -87,6 +87,7 @@ public:
virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) override;
virtual void SendKeepAlive (int a_PingID) override;
virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) override;
+ virtual void SendLoginSuccess (void) override;
virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) override;
virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators) override;
virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override;
@@ -252,7 +253,7 @@ protected:
// Packet handlers while in the Status state (m_State == 1):
void HandlePacketStatusPing (cByteBuffer & a_ByteBuffer);
- void HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer);
+ virtual void HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer);
// Packet handlers while in the Login state (m_State == 2):
void HandlePacketLoginEncryptionResponse(cByteBuffer & a_ByteBuffer);
@@ -306,3 +307,22 @@ protected:
+
+/** The version 5 lengthed protocol, used by 1.7.6 through 1.7.9. */
+class cProtocol176 :
+ public cProtocol172
+{
+ typedef cProtocol172 super;
+
+public:
+ cProtocol176(cClientHandle * a_Client, const AString & a_ServerAddress, UInt16 a_ServerPort, UInt32 a_State);
+
+ // cProtocol172 overrides:
+ virtual void SendPlayerSpawn(const cPlayer & a_Player) override;
+ virtual void HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer) override;
+
+} ;
+
+
+
+
diff --git a/src/Protocol/ProtocolRecognizer.cpp b/src/Protocol/ProtocolRecognizer.cpp
index 3f7d7b254..8a97b9713 100644
--- a/src/Protocol/ProtocolRecognizer.cpp
+++ b/src/Protocol/ProtocolRecognizer.cpp
@@ -59,6 +59,7 @@ AString cProtocolRecognizer::GetVersionTextFromInt(int a_ProtocolVersion)
case PROTO_VERSION_1_6_3: return "1.6.3";
case PROTO_VERSION_1_6_4: return "1.6.4";
case PROTO_VERSION_1_7_2: return "1.7.2";
+ case PROTO_VERSION_1_7_6: return "1.7.6";
}
ASSERT(!"Unknown protocol version");
return Printf("Unknown protocol (%d)", a_ProtocolVersion);
@@ -396,6 +397,16 @@ void cProtocolRecognizer::SendLogin(const cPlayer & a_Player, const cWorld & a_W
+void cProtocolRecognizer::SendLoginSuccess(void)
+{
+ ASSERT(m_Protocol != NULL);
+ m_Protocol->SendLoginSuccess();
+}
+
+
+
+
+
void cProtocolRecognizer::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length)
{
ASSERT(m_Protocol != NULL);
@@ -965,6 +976,18 @@ bool cProtocolRecognizer::TryRecognizeLengthedProtocol(UInt32 a_PacketLengthRema
m_Protocol = new cProtocol172(m_Client, ServerAddress, (UInt16)ServerPort, NextState);
return true;
}
+ case PROTO_VERSION_1_7_6:
+ {
+ AString ServerAddress;
+ short ServerPort;
+ UInt32 NextState;
+ m_Buffer.ReadVarUTF8String(ServerAddress);
+ m_Buffer.ReadBEShort(ServerPort);
+ m_Buffer.ReadVarInt(NextState);
+ m_Buffer.CommitRead();
+ m_Protocol = new cProtocol176(m_Client, ServerAddress, (UInt16)ServerPort, NextState);
+ return true;
+ }
}
LOGINFO("Client \"%s\" uses an unsupported protocol (lengthed, version %u)",
m_Client->GetIPString().c_str(), ProtocolVersion
diff --git a/src/Protocol/ProtocolRecognizer.h b/src/Protocol/ProtocolRecognizer.h
index 072d7c2d2..408109ef4 100644
--- a/src/Protocol/ProtocolRecognizer.h
+++ b/src/Protocol/ProtocolRecognizer.h
@@ -18,8 +18,8 @@
// Adjust these if a new protocol is added or an old one is removed:
-#define MCS_CLIENT_VERSIONS "1.2.4, 1.2.5, 1.3.1, 1.3.2, 1.4.2, 1.4.4, 1.4.5, 1.4.6, 1.4.7, 1.5, 1.5.1, 1.5.2, 1.6.1, 1.6.2, 1.6.3, 1.6.4, 1.7.2, 1.7.4"
-#define MCS_PROTOCOL_VERSIONS "29, 39, 47, 49, 51, 60, 61, 73, 74, 77, 78, 4"
+#define MCS_CLIENT_VERSIONS "1.2.4, 1.2.5, 1.3.1, 1.3.2, 1.4.2, 1.4.4, 1.4.5, 1.4.6, 1.4.7, 1.5, 1.5.1, 1.5.2, 1.6.1, 1.6.2, 1.6.3, 1.6.4, 1.7.2, 1.7.4, 1.7.5, 1.7.6, 1.7.7, 1.7.8, 1.7.9"
+#define MCS_PROTOCOL_VERSIONS "29, 39, 47, 49, 51, 60, 61, 73, 74, 77, 78, 4, 5"
@@ -50,6 +50,7 @@ public:
// These will be kept "under" the next / latest, because the next and latest are only needed for previous protocols
PROTO_VERSION_1_7_2 = 4,
+ PROTO_VERSION_1_7_6 = 5,
} ;
cProtocolRecognizer(cClientHandle * a_Client);
@@ -90,6 +91,7 @@ public:
virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) override;
virtual void SendKeepAlive (int a_PingID) override;
virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) override;
+ virtual void SendLoginSuccess (void) override;
virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) override;
virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators) override;
virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override;
diff --git a/src/Root.cpp b/src/Root.cpp
index ba4398b35..5d32bdd87 100644
--- a/src/Root.cpp
+++ b/src/Root.cpp
@@ -499,9 +499,9 @@ void cRoot::KickUser(int a_ClientID, const AString & a_Reason)
-void cRoot::AuthenticateUser(int a_ClientID)
+void cRoot::AuthenticateUser(int a_ClientID, const AString & a_Name, const AString & a_UUID)
{
- m_Server->AuthenticateUser(a_ClientID);
+ m_Server->AuthenticateUser(a_ClientID, a_Name, a_UUID);
}
diff --git a/src/Root.h b/src/Root.h
index 4bbd7586f..d2a4d1eed 100644
--- a/src/Root.h
+++ b/src/Root.h
@@ -1,7 +1,7 @@
#pragma once
-#include "Authenticator.h"
+#include "Protocol/Authenticator.h"
#include "HTTPServer/HTTPServer.h"
#include "Defines.h"
@@ -89,7 +89,7 @@ public:
void KickUser(int a_ClientID, const AString & a_Reason);
/// Called by cAuthenticator to auth the specified user
- void AuthenticateUser(int a_ClientID);
+ void AuthenticateUser(int a_ClientID, const AString & a_Name, const AString & a_UUID);
/// Executes commands queued in the command queue
void TickCommands(void);
diff --git a/src/Server.cpp b/src/Server.cpp
index d1e53bfff..e0feaf0d8 100644
--- a/src/Server.cpp
+++ b/src/Server.cpp
@@ -615,14 +615,14 @@ void cServer::KickUser(int a_ClientID, const AString & a_Reason)
-void cServer::AuthenticateUser(int a_ClientID)
+void cServer::AuthenticateUser(int a_ClientID, const AString & a_Name, const AString & a_UUID)
{
cCSLock Lock(m_CSClients);
for (ClientList::iterator itr = m_Clients.begin(); itr != m_Clients.end(); ++itr)
{
if ((*itr)->GetUniqueID() == a_ClientID)
{
- (*itr)->Authenticate();
+ (*itr)->Authenticate(a_Name, a_UUID);
return;
}
} // for itr - m_Clients[]
diff --git a/src/Server.h b/src/Server.h
index b5280c59d..b5c384a44 100644
--- a/src/Server.h
+++ b/src/Server.h
@@ -83,7 +83,7 @@ public: // tolua_export
void Shutdown(void);
void KickUser(int a_ClientID, const AString & a_Reason);
- void AuthenticateUser(int a_ClientID); // Called by cAuthenticator to auth the specified user
+ void AuthenticateUser(int a_ClientID, const AString & a_Name, const AString & a_UUID); // Called by cAuthenticator to auth the specified user
const AString & GetServerID(void) const { return m_ServerID; } // tolua_export
diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp
index 50cac8d7e..d37d2eecf 100644
--- a/src/Simulator/IncrementalRedstoneSimulator.cpp
+++ b/src/Simulator/IncrementalRedstoneSimulator.cpp
@@ -69,18 +69,19 @@ void cIncrementalRedstoneSimulator::RedstoneAddBlock(int a_BlockX, int a_BlockY,
// Checking only when a block is changed, as opposed to every tick, also improves performance
PoweredBlocksList * PoweredBlocks = a_Chunk->GetRedstoneSimulatorPoweredBlocksList();
- for (PoweredBlocksList::iterator itr = PoweredBlocks->begin(); itr != PoweredBlocks->end(); ++itr)
+ for (PoweredBlocksList::iterator itr = PoweredBlocks->begin(); itr != PoweredBlocks->end();)
{
if (!itr->a_SourcePos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ)))
{
+ ++itr;
continue;
}
if (!IsPotentialSource(Block))
{
LOGD("cIncrementalRedstoneSimulator: Erased block @ {%i, %i, %i} from powered blocks list as it no longer connected to a source", itr->a_BlockPos.x, itr->a_BlockPos.y, itr->a_BlockPos.z);
- PoweredBlocks->erase(itr);
- break;
+ itr = PoweredBlocks->erase(itr);
+ continue;
}
else if (
// Changeable sources
@@ -93,9 +94,10 @@ void cIncrementalRedstoneSimulator::RedstoneAddBlock(int a_BlockX, int a_BlockY,
)
{
LOGD("cIncrementalRedstoneSimulator: Erased block @ {%i, %i, %i} from powered blocks list due to present/past metadata mismatch", itr->a_BlockPos.x, itr->a_BlockPos.y, itr->a_BlockPos.z);
- PoweredBlocks->erase(itr);
- break;
+ itr = PoweredBlocks->erase(itr);
+ continue;
}
+ ++itr;
}
LinkedBlocksList * LinkedPoweredBlocks = a_Chunk->GetRedstoneSimulatorLinkedBlocksList();
@@ -532,128 +534,96 @@ void cIncrementalRedstoneSimulator::HandleRedstoneWire(int a_BlockX, int a_Block
};
// Check to see if directly beside a power source
- if (IsWirePowered(a_BlockX, a_BlockY, a_BlockZ))
+ unsigned char MyPower;
+ if (!IsWirePowered(a_BlockX, a_BlockY, a_BlockZ, MyPower))
{
- m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, 15); // Maximum power
+ m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, 0);
+ m_World.WakeUpSimulators(a_BlockX, a_BlockY, a_BlockZ);
+ return;
}
- else
+
+ m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, MyPower);
+
+ if (MyPower < 1)
{
- NIBBLETYPE MyMeta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
- NIBBLETYPE MetaToSet = MyMeta;
- int TimesMetaSmaller = 0, TimesFoundAWire = 0;
+ return;
+ }
+
+ MyPower--;
- for (size_t i = 0; i < ARRAYCOUNT(gCrossCoords); i++) // Loop through all directions to transfer or receive power
+ for (size_t i = 0; i < ARRAYCOUNT(gCrossCoords); i++) // Loop through all directions to transfer or receive power
+ {
+ if ((i >= 4) && (i <= 7)) // If we are currently checking for wire surrounding ourself one block above...
{
- if ((i >= 4) && (i <= 7)) // If we are currently checking for wire surrounding ourself one block above...
+ if (cBlockInfo::IsSolid(m_World.GetBlock(a_BlockX, a_BlockY + 1, a_BlockZ))) // If there is something solid above us (wire cut off)...
{
- if (cBlockInfo::IsSolid(m_World.GetBlock(a_BlockX, a_BlockY + 1, a_BlockZ))) // If there is something solid above us (wire cut off)...
- {
- continue; // We don't receive power from that wire
- }
+ continue; // We don't receive power from that wire
}
- else if ((i >= 8) && (i <= 11)) // See above, but this is for wire below us
+ }
+ else if ((i >= 8) && (i <= 11)) // See above, but this is for wire below us
+ {
+ if (cBlockInfo::IsSolid(m_World.GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ)))
{
- if (cBlockInfo::IsSolid(m_World.GetBlock(a_BlockX + gCrossCoords[i].x, a_BlockY + gCrossCoords[i].y + 1, a_BlockZ + gCrossCoords[i].z)))
- {
- continue;
- }
+ continue;
}
-
- BLOCKTYPE SurroundType;
- NIBBLETYPE SurroundMeta;
- m_World.GetBlockTypeMeta(a_BlockX + gCrossCoords[i].x, a_BlockY + gCrossCoords[i].y, a_BlockZ + gCrossCoords[i].z, SurroundType, SurroundMeta);
-
- if (SurroundType == E_BLOCK_REDSTONE_WIRE)
- {
- TimesFoundAWire++;
-
- if (SurroundMeta > 1) // Wires of power 1 or 0 cannot transfer power TO ME, don't bother checking
- {
- // Does surrounding wire have a higher power level than the highest so far (MetaToSet)?
- // >= to fix a bug where wires bordering each other with the same power level will appear (in terms of meta) to power each other, when they aren't actually in the powered list
- if (SurroundMeta >= MetaToSet)
- {
- MetaToSet = SurroundMeta - 1; // To improve performance
- }
- }
-
- if (SurroundMeta < MyMeta) // Go through all surroundings to see if self power is larger than everyone else's
- {
- TimesMetaSmaller++;
- }
- }
}
- if ((TimesMetaSmaller == TimesFoundAWire) && (MyMeta != 0))
- {
- // All surrounding metas were smaller - self must have been a wire that was
- // transferring power to other wires around.
- // However, self not directly powered anymore, so source must have been removed,
- // therefore, self must be set to meta zero
- m_World.SetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, 0); // SetMeta & WakeUpSims doesn't seem to work here, so SetBlock
- return; // No need to process block power sets because self not powered
- }
- else if (MyMeta != MetaToSet)
+ if (m_World.GetBlock(a_BlockX + gCrossCoords[i].x, a_BlockY + gCrossCoords[i].y, a_BlockZ + gCrossCoords[i].z) == E_BLOCK_REDSTONE_WIRE)
{
- m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, MetaToSet);
+ SetBlockPowered(a_BlockX + gCrossCoords[i].x, a_BlockY + gCrossCoords[i].y, a_BlockZ + gCrossCoords[i].z, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower);
}
}
- if (m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ) != 0) // A powered wire
+ for (size_t i = 0; i < ARRAYCOUNT(gSideCoords); i++) // Look for repeaters immediately surrounding self and try to power them
{
- for (size_t i = 0; i < ARRAYCOUNT(gSideCoords); i++) // Look for repeaters immediately surrounding self and try to power them
+ if (m_World.GetBlock(a_BlockX + gSideCoords[i].x, a_BlockY + gSideCoords[i].y, a_BlockZ + gSideCoords[i].z) == E_BLOCK_REDSTONE_REPEATER_OFF)
{
- if (m_World.GetBlock(a_BlockX + gSideCoords[i].x, a_BlockY + gSideCoords[i].y, a_BlockZ + gSideCoords[i].z) == E_BLOCK_REDSTONE_REPEATER_OFF)
- {
- SetBlockPowered(a_BlockX + gSideCoords[i].x, a_BlockY + gSideCoords[i].y, a_BlockZ + gSideCoords[i].z, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE);
- }
+ SetBlockPowered(a_BlockX + gSideCoords[i].x, a_BlockY + gSideCoords[i].y, a_BlockZ + gSideCoords[i].z, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower);
}
+ }
- // Wire still powered, power blocks beneath
- SetBlockPowered(a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE);
- SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_YM, E_BLOCK_REDSTONE_WIRE);
+ // Wire still powered, power blocks beneath
+ SetBlockPowered(a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower);
+ SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_YM, E_BLOCK_REDSTONE_WIRE, MyPower);
- switch (GetWireDirection(a_BlockX, a_BlockY, a_BlockZ))
+ switch (GetWireDirection(a_BlockX, a_BlockY, a_BlockZ))
+ {
+ case REDSTONE_NONE:
{
- case REDSTONE_NONE:
- {
- SetBlockPowered(a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE);
- SetBlockPowered(a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE);
- SetBlockPowered(a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE);
- SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE);
- SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE);
-
- SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XM, E_BLOCK_REDSTONE_WIRE);
- SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XP, E_BLOCK_REDSTONE_WIRE);
- SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_YM, E_BLOCK_REDSTONE_WIRE);
- SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZM, E_BLOCK_REDSTONE_WIRE);
- SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZP, E_BLOCK_REDSTONE_WIRE);
- break;
- }
- case REDSTONE_X_POS:
- {
- SetBlockPowered(a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE);
- SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XP, E_BLOCK_REDSTONE_WIRE);
- break;
- }
- case REDSTONE_X_NEG:
- {
- SetBlockPowered(a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE);
- SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XM, E_BLOCK_REDSTONE_WIRE);
- break;
- }
- case REDSTONE_Z_POS:
- {
- SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE);
- SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZP, E_BLOCK_REDSTONE_WIRE);
- break;
- }
- case REDSTONE_Z_NEG:
- {
- SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE);
- SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZM, E_BLOCK_REDSTONE_WIRE);
- break;
- }
+ SetBlockPowered(a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower);
+ SetBlockPowered(a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower);
+ SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower);
+ SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower);
+
+ SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XM, E_BLOCK_REDSTONE_WIRE, MyPower);
+ SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XP, E_BLOCK_REDSTONE_WIRE, MyPower);
+ SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZM, E_BLOCK_REDSTONE_WIRE, MyPower);
+ SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZP, E_BLOCK_REDSTONE_WIRE, MyPower);
+ break;
+ }
+ case REDSTONE_X_POS:
+ {
+ SetBlockPowered(a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower);
+ SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XP, E_BLOCK_REDSTONE_WIRE, MyPower);
+ break;
+ }
+ case REDSTONE_X_NEG:
+ {
+ SetBlockPowered(a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower);
+ SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XM, E_BLOCK_REDSTONE_WIRE, MyPower);
+ break;
+ }
+ case REDSTONE_Z_POS:
+ {
+ SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower);
+ SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZP, E_BLOCK_REDSTONE_WIRE, MyPower);
+ break;
+ }
+ case REDSTONE_Z_NEG:
+ {
+ SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower);
+ SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZM, E_BLOCK_REDSTONE_WIRE, MyPower);
+ break;
}
}
}
@@ -1046,16 +1016,146 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_BlockX, int a_Bloc
break;
}
case E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:
+ {
+ class cPressurePlateCallback :
+ public cEntityCallback
+ {
+ public:
+ cPressurePlateCallback(int a_BlockX, int a_BlockY, int a_BlockZ) :
+ m_NumberOfEntities(0),
+ m_X(a_BlockX),
+ m_Y(a_BlockY),
+ m_Z(a_BlockZ)
+ {
+ }
+
+ virtual bool Item(cEntity * a_Entity) override
+ {
+ Vector3f EntityPos = a_Entity->GetPosition();
+ Vector3f BlockPos(m_X + 0.5f, (float)m_Y, m_Z + 0.5f);
+ double Distance = (EntityPos - BlockPos).Length();
+
+ if (Distance <= 0.7)
+ {
+ m_NumberOfEntities++;
+ }
+ return false;
+ }
+
+ bool GetPowerLevel(unsigned char & a_PowerLevel) const
+ {
+ a_PowerLevel = std::min(m_NumberOfEntities, MAX_POWER_LEVEL);
+ return (a_PowerLevel > 0);
+ }
+
+ protected:
+ int m_NumberOfEntities;
+
+ int m_X;
+ int m_Y;
+ int m_Z;
+ };
+
+ cPressurePlateCallback PressurePlateCallback(a_BlockX, a_BlockY, a_BlockZ);
+ m_World.ForEachEntity(PressurePlateCallback);
+
+ unsigned char Power;
+ NIBBLETYPE Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
+ if (PressurePlateCallback.GetPowerLevel(Power))
+ {
+ if (Meta == E_META_PRESSURE_PLATE_RAISED)
+ {
+ m_World.BroadcastSoundEffect("random.click", (int)((a_BlockX + 0.5) * 8.0), (int)((a_BlockY + 0.1) * 8.0), (int)((a_BlockZ + 0.5) * 8.0), 0.3F, 0.5F);
+ }
+ m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, E_META_PRESSURE_PLATE_DEPRESSED);
+ SetAllDirsAsPowered(a_BlockX, a_BlockY, a_BlockZ, a_MyType, Power);
+ }
+ else
+ {
+ if (Meta == E_META_PRESSURE_PLATE_DEPRESSED)
+ {
+ m_World.BroadcastSoundEffect("random.click", (int)((a_BlockX + 0.5) * 8.0), (int)((a_BlockY + 0.1) * 8.0), (int)((a_BlockZ + 0.5) * 8.0), 0.3F, 0.6F);
+ }
+ m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, E_META_PRESSURE_PLATE_RAISED);
+ m_World.WakeUpSimulators(a_BlockX, a_BlockY, a_BlockZ);
+ }
+
+ break;
+ }
case E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:
+ {class cPressurePlateCallback :
+ public cEntityCallback
+ {
+ public:
+ cPressurePlateCallback(int a_BlockX, int a_BlockY, int a_BlockZ) :
+ m_NumberOfEntities(0),
+ m_X(a_BlockX),
+ m_Y(a_BlockY),
+ m_Z(a_BlockZ)
+ {
+ }
+
+ virtual bool Item(cEntity * a_Entity) override
+ {
+ Vector3f EntityPos = a_Entity->GetPosition();
+ Vector3f BlockPos(m_X + 0.5f, (float)m_Y, m_Z + 0.5f);
+ double Distance = (EntityPos - BlockPos).Length();
+
+ if (Distance <= 0.7)
+ {
+ m_NumberOfEntities++;
+ }
+ return false;
+ }
+
+ bool GetPowerLevel(unsigned char & a_PowerLevel) const
+ {
+ a_PowerLevel = std::min((int)ceil(m_NumberOfEntities / (float)10), MAX_POWER_LEVEL);
+ return (a_PowerLevel > 0);
+ }
+
+ protected:
+ int m_NumberOfEntities;
+
+ int m_X;
+ int m_Y;
+ int m_Z;
+ };
+
+ cPressurePlateCallback PressurePlateCallback(a_BlockX, a_BlockY, a_BlockZ);
+ m_World.ForEachEntity(PressurePlateCallback);
+
+ unsigned char Power;
+ NIBBLETYPE Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
+ if (PressurePlateCallback.GetPowerLevel(Power))
+ {
+ if (Meta == E_META_PRESSURE_PLATE_RAISED)
+ {
+ m_World.BroadcastSoundEffect("random.click", (int)((a_BlockX + 0.5) * 8.0), (int)((a_BlockY + 0.1) * 8.0), (int)((a_BlockZ + 0.5) * 8.0), 0.3F, 0.5F);
+ }
+ m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, E_META_PRESSURE_PLATE_DEPRESSED);
+ SetAllDirsAsPowered(a_BlockX, a_BlockY, a_BlockZ, a_MyType, Power);
+ }
+ else
+ {
+ if (Meta == E_META_PRESSURE_PLATE_DEPRESSED)
+ {
+ m_World.BroadcastSoundEffect("random.click", (int)((a_BlockX + 0.5) * 8.0), (int)((a_BlockY + 0.1) * 8.0), (int)((a_BlockZ + 0.5) * 8.0), 0.3F, 0.6F);
+ }
+ m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, E_META_PRESSURE_PLATE_RAISED);
+ m_World.WakeUpSimulators(a_BlockX, a_BlockY, a_BlockZ);
+ }
+
+ break;
+ }
case E_BLOCK_WOODEN_PRESSURE_PLATE:
{
class cPressurePlateCallback :
public cEntityCallback
{
public:
- cPressurePlateCallback(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World) :
- m_Entity(NULL),
- m_World(a_World),
+ cPressurePlateCallback(int a_BlockX, int a_BlockY, int a_BlockZ) :
+ m_FoundEntity(false),
m_X(a_BlockX),
m_Y(a_BlockY),
m_Z(a_BlockZ)
@@ -1070,7 +1170,7 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_BlockX, int a_Bloc
if (Distance <= 0.7)
{
- m_Entity = a_Entity;
+ m_FoundEntity = true;
return true; // Break out, we only need to know for plates that at least one entity is on top
}
return false;
@@ -1078,45 +1178,46 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_BlockX, int a_Bloc
bool FoundEntity(void) const
{
- return m_Entity != NULL;
+ return m_FoundEntity;
}
protected:
- cEntity * m_Entity;
- cWorld * m_World;
+ bool m_FoundEntity;
int m_X;
int m_Y;
int m_Z;
} ;
- cPressurePlateCallback PressurePlateCallback(a_BlockX, a_BlockY, a_BlockZ, &m_World);
+ cPressurePlateCallback PressurePlateCallback(a_BlockX, a_BlockY, a_BlockZ);
m_World.ForEachEntity(PressurePlateCallback);
NIBBLETYPE Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ);
if (PressurePlateCallback.FoundEntity())
{
- if (Meta == 0x0)
+ if (Meta == E_META_PRESSURE_PLATE_RAISED)
{
m_World.BroadcastSoundEffect("random.click", (int) ((a_BlockX + 0.5) * 8.0), (int) ((a_BlockY + 0.1) * 8.0), (int) ((a_BlockZ + 0.5) * 8.0), 0.3F, 0.5F);
}
- m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, 0x1);
+ m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, E_META_PRESSURE_PLATE_DEPRESSED);
SetAllDirsAsPowered(a_BlockX, a_BlockY, a_BlockZ, a_MyType);
}
else
{
- if (Meta == 0x1)
+ if (Meta == E_META_PRESSURE_PLATE_DEPRESSED)
{
m_World.BroadcastSoundEffect("random.click", (int) ((a_BlockX + 0.5) * 8.0), (int) ((a_BlockY + 0.1) * 8.0), (int) ((a_BlockZ + 0.5) * 8.0), 0.3F, 0.6F);
}
- m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, 0x0);
+ m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, E_META_PRESSURE_PLATE_RAISED);
m_World.WakeUpSimulators(a_BlockX, a_BlockY, a_BlockZ);
}
break;
}
default:
+ {
LOGD("Unimplemented pressure plate type %s in cRedstoneSimulator", ItemToFullString(a_MyType).c_str());
break;
+ }
}
}
@@ -1323,28 +1424,29 @@ bool cIncrementalRedstoneSimulator::IsPistonPowered(int a_BlockX, int a_BlockY,
-bool cIncrementalRedstoneSimulator::IsWirePowered(int a_BlockX, int a_BlockY, int a_BlockZ)
+bool cIncrementalRedstoneSimulator::IsWirePowered(int a_BlockX, int a_BlockY, int a_BlockZ, unsigned char & a_PowerLevel)
{
- for (PoweredBlocksList::const_iterator itr = m_PoweredBlocks->begin(); itr != m_PoweredBlocks->end(); ++itr)
- {
- if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) { continue; }
+ a_PowerLevel = 0;
- if (m_World.GetBlock(itr->a_SourcePos) != E_BLOCK_REDSTONE_WIRE)
+ for (PoweredBlocksList::const_iterator itr = m_PoweredBlocks->begin(); itr != m_PoweredBlocks->end(); ++itr) // Check powered list
+ {
+ if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ)))
{
- return true;
+ continue;
}
+ a_PowerLevel = std::max(a_PowerLevel, itr->a_PowerLevel);
}
- for (LinkedBlocksList::const_iterator itr = m_LinkedPoweredBlocks->begin(); itr != m_LinkedPoweredBlocks->end(); ++itr)
+ for (LinkedBlocksList::const_iterator itr = m_LinkedPoweredBlocks->begin(); itr != m_LinkedPoweredBlocks->end(); ++itr) // Check linked powered list
{
- if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) { continue; }
-
- if (m_World.GetBlock(itr->a_SourcePos) != E_BLOCK_REDSTONE_WIRE)
+ if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ)))
{
- return true;
+ continue;
}
+ a_PowerLevel = std::max(a_PowerLevel, itr->a_PowerLevel);
}
- return false; // Source was in front of the piston's front face
+
+ return (a_PowerLevel != 0); // Source was in front of the piston's front face
}
@@ -1374,7 +1476,7 @@ bool cIncrementalRedstoneSimulator::AreCoordsSimulated(int a_BlockX, int a_Block
-void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Direction, BLOCKTYPE a_SourceType)
+void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Direction, BLOCKTYPE a_SourceType, unsigned char a_PowerLevel)
{
switch (a_Direction)
{
@@ -1382,11 +1484,11 @@ void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int
{
BLOCKTYPE MiddleBlock = m_World.GetBlock(a_BlockX - 1, a_BlockY, a_BlockZ);
- SetBlockLinkedPowered(a_BlockX - 2, a_BlockY, a_BlockZ, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX - 1, a_BlockY + 1, a_BlockZ, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX - 1, a_BlockY - 1, a_BlockZ, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ + 1, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ - 1, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
+ SetBlockLinkedPowered(a_BlockX - 2, a_BlockY, a_BlockZ, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX - 1, a_BlockY + 1, a_BlockZ, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX - 1, a_BlockY - 1, a_BlockZ, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ + 1, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ - 1, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
break;
}
@@ -1394,11 +1496,11 @@ void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int
{
BLOCKTYPE MiddleBlock = m_World.GetBlock(a_BlockX + 1, a_BlockY, a_BlockZ);
- SetBlockLinkedPowered(a_BlockX + 2, a_BlockY, a_BlockZ, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX + 1, a_BlockY + 1, a_BlockZ, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX + 1, a_BlockY - 1, a_BlockZ, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ + 1, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ - 1, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
+ SetBlockLinkedPowered(a_BlockX + 2, a_BlockY, a_BlockZ, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX + 1, a_BlockY + 1, a_BlockZ, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX + 1, a_BlockY - 1, a_BlockZ, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ + 1, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ - 1, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
break;
}
@@ -1406,11 +1508,11 @@ void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int
{
BLOCKTYPE MiddleBlock = m_World.GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ);
- SetBlockLinkedPowered(a_BlockX, a_BlockY - 2, a_BlockZ, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX + 1, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX - 1, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ + 1, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ - 1, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
+ SetBlockLinkedPowered(a_BlockX, a_BlockY - 2, a_BlockZ, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX + 1, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX - 1, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ + 1, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ - 1, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
break;
}
@@ -1418,11 +1520,11 @@ void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int
{
BLOCKTYPE MiddleBlock = m_World.GetBlock(a_BlockX, a_BlockY + 1, a_BlockZ);
- SetBlockLinkedPowered(a_BlockX, a_BlockY + 2, a_BlockZ, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX + 1, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX - 1, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ + 1, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ - 1, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
+ SetBlockLinkedPowered(a_BlockX, a_BlockY + 2, a_BlockZ, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX + 1, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX - 1, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ + 1, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ - 1, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
break;
}
@@ -1430,11 +1532,11 @@ void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int
{
BLOCKTYPE MiddleBlock = m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ - 1);
- SetBlockLinkedPowered(a_BlockX, a_BlockY, a_BlockZ - 2, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
+ SetBlockLinkedPowered(a_BlockX, a_BlockY, a_BlockZ - 2, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
break;
}
@@ -1442,11 +1544,11 @@ void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int
{
BLOCKTYPE MiddleBlock = m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ + 1);
- SetBlockLinkedPowered(a_BlockX, a_BlockY, a_BlockZ + 2, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
- SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock);
+ SetBlockLinkedPowered(a_BlockX, a_BlockY, a_BlockZ + 2, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
+ SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel);
break;
}
@@ -1462,7 +1564,7 @@ void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int
-void cIncrementalRedstoneSimulator::SetAllDirsAsPowered(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_SourceBlock)
+void cIncrementalRedstoneSimulator::SetAllDirsAsPowered(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_SourceBlock, unsigned char a_PowerLevel)
{
static const struct
{
@@ -1479,7 +1581,7 @@ void cIncrementalRedstoneSimulator::SetAllDirsAsPowered(int a_BlockX, int a_Bloc
for (size_t i = 0; i < ARRAYCOUNT(gCrossCoords); i++) // Loop through struct to power all directions
{
- SetBlockPowered(a_BlockX + gCrossCoords[i].x, a_BlockY + gCrossCoords[i].y, a_BlockZ + gCrossCoords[i].z, a_BlockX, a_BlockY, a_BlockZ, a_SourceBlock);
+ SetBlockPowered(a_BlockX + gCrossCoords[i].x, a_BlockY + gCrossCoords[i].y, a_BlockZ + gCrossCoords[i].z, a_BlockX, a_BlockY, a_BlockZ, a_SourceBlock, a_PowerLevel);
}
}
@@ -1487,7 +1589,7 @@ void cIncrementalRedstoneSimulator::SetAllDirsAsPowered(int a_BlockX, int a_Bloc
-void cIncrementalRedstoneSimulator::SetBlockPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock)
+void cIncrementalRedstoneSimulator::SetBlockPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock, unsigned char a_PowerLevel)
{
BLOCKTYPE Block = m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ);
if (Block == E_BLOCK_AIR)
@@ -1497,15 +1599,31 @@ void cIncrementalRedstoneSimulator::SetBlockPowered(int a_BlockX, int a_BlockY,
}
PoweredBlocksList * Powered = m_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ)->GetRedstoneSimulatorPoweredBlocksList();
-
- for (PoweredBlocksList::const_iterator itr = Powered->begin(); itr != Powered->end(); ++itr) // Check powered list
+ for (PoweredBlocksList::iterator itr = Powered->begin(); itr != Powered->end(); ++itr) // Check powered list
{
if (
itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ)) &&
itr->a_SourcePos.Equals(Vector3i(a_SourceX, a_SourceY, a_SourceZ))
- )
+ )
+ {
+ // Check for duplicates, update power level if everything else the same but either way, don't add a new listing
+ if (itr->a_PowerLevel != a_PowerLevel)
+ {
+ itr->a_PowerLevel = a_PowerLevel;
+ }
+ return;
+ }
+ }
+
+ PoweredBlocksList * OtherPowered = m_Chunk->GetNeighborChunk(a_SourceX, a_SourceZ)->GetRedstoneSimulatorPoweredBlocksList();
+ for (PoweredBlocksList::const_iterator itr = OtherPowered->begin(); itr != OtherPowered->end(); ++itr) // Check powered list
+ {
+ if (
+ itr->a_BlockPos.Equals(Vector3i(a_SourceX, a_SourceY, a_SourceZ)) &&
+ itr->a_SourcePos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))
+ )
{
- // Check for duplicates
+ // Powered wires try to power their source - don't let them!
return;
}
}
@@ -1513,6 +1631,7 @@ void cIncrementalRedstoneSimulator::SetBlockPowered(int a_BlockX, int a_BlockY,
sPoweredBlocks RC;
RC.a_BlockPos = Vector3i(a_BlockX, a_BlockY, a_BlockZ);
RC.a_SourcePos = Vector3i(a_SourceX, a_SourceY, a_SourceZ);
+ RC.a_PowerLevel = a_PowerLevel;
Powered->push_back(RC);
}
@@ -1524,7 +1643,7 @@ void cIncrementalRedstoneSimulator::SetBlockLinkedPowered(
int a_BlockX, int a_BlockY, int a_BlockZ,
int a_MiddleX, int a_MiddleY, int a_MiddleZ,
int a_SourceX, int a_SourceY, int a_SourceZ,
- BLOCKTYPE a_SourceBlock, BLOCKTYPE a_MiddleBlock
+ BLOCKTYPE a_SourceBlock, BLOCKTYPE a_MiddleBlock, unsigned char a_PowerLevel
)
{
BLOCKTYPE DestBlock = m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ);
@@ -1539,16 +1658,19 @@ void cIncrementalRedstoneSimulator::SetBlockLinkedPowered(
}
LinkedBlocksList * Linked = m_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ)->GetRedstoneSimulatorLinkedBlocksList();
-
- for (LinkedBlocksList::const_iterator itr = Linked->begin(); itr != Linked->end(); ++itr) // Check linked powered list
+ for (LinkedBlocksList::iterator itr = Linked->begin(); itr != Linked->end(); ++itr) // Check linked powered list
{
if (
itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ)) &&
itr->a_MiddlePos.Equals(Vector3i(a_MiddleX, a_MiddleY, a_MiddleZ)) &&
itr->a_SourcePos.Equals(Vector3i(a_SourceX, a_SourceY, a_SourceZ))
- )
+ )
{
- // Check for duplicates
+ // Check for duplicates, update power level if everything else the same but either way, don't add a new listing
+ if (itr->a_PowerLevel != a_PowerLevel)
+ {
+ itr->a_PowerLevel = a_PowerLevel;
+ }
return;
}
}
@@ -1557,6 +1679,7 @@ void cIncrementalRedstoneSimulator::SetBlockLinkedPowered(
RC.a_BlockPos = Vector3i(a_BlockX, a_BlockY, a_BlockZ);
RC.a_MiddlePos = Vector3i(a_MiddleX, a_MiddleY, a_MiddleZ);
RC.a_SourcePos = Vector3i(a_SourceX, a_SourceY, a_SourceZ);
+ RC.a_PowerLevel = a_PowerLevel;
Linked->push_back(RC);
}
@@ -1621,7 +1744,7 @@ void cIncrementalRedstoneSimulator::QueueRepeaterPowerChange(int a_BlockX, int a
RC.a_BlockPos = Vector3i(a_BlockX, a_BlockY, a_BlockZ);
// Gets the top two bits (delay time), shifts them into the lower two bits, and adds one (meta 0 = 1 tick; 1 = 2 etc.)
- // * 2 because apparently, MCS ticks are way faster than vanilla ticks, so repeater aren't noticeably delayed
+ // * 2 because in MCS, 1 redstone tick = 1 world tick, but in Vanilla, 1 redstone tick = 2 world ticks, and we need to maintain compatibility
RC.a_DelayTicks = (((a_Meta & 0xC) >> 0x2) + 1) * 2;
RC.a_ElapsedTicks = 0;
@@ -1697,12 +1820,3 @@ bool cIncrementalRedstoneSimulator::IsLeverOn(NIBBLETYPE a_BlockMeta)
-
-bool cIncrementalRedstoneSimulator::IsButtonOn(NIBBLETYPE a_BlockMeta)
-{
- return IsLeverOn(a_BlockMeta);
-}
-
-
-
-
diff --git a/src/Simulator/IncrementalRedstoneSimulator.h b/src/Simulator/IncrementalRedstoneSimulator.h
index f93f86898..a42cce79a 100644
--- a/src/Simulator/IncrementalRedstoneSimulator.h
+++ b/src/Simulator/IncrementalRedstoneSimulator.h
@@ -36,31 +36,35 @@ public:
private:
+ #define MAX_POWER_LEVEL 15
+
struct sPoweredBlocks // Define structure of the directly powered blocks list
{
Vector3i a_BlockPos; // Position of powered block
Vector3i a_SourcePos; // Position of source powering the block at a_BlockPos
+ unsigned char a_PowerLevel;
};
struct sLinkedPoweredBlocks // Define structure of the indirectly powered blocks list (i.e. repeaters powering through a block to the block at the other side)
{
Vector3i a_BlockPos;
- Vector3i a_MiddlePos;
+ Vector3i a_MiddlePos; // Position of block that is betwixt a source and the destination
Vector3i a_SourcePos;
+ unsigned char a_PowerLevel;
};
- struct sSimulatedPlayerToggleableList
+ struct sSimulatedPlayerToggleableList // Define structure of the list containing simulate-on-update blocks (such as trapdoors that respond once to a block update, and can be toggled by a player)
{
Vector3i a_BlockPos;
- bool WasLastStatePowered;
+ bool WasLastStatePowered; // Was the last state powered or not? Determines whether a source update has happened and if I should resimulate
};
- struct sRepeatersDelayList
+ struct sRepeatersDelayList // Define structure of list containing repeaters' delay states
{
Vector3i a_BlockPos;
- unsigned char a_DelayTicks;
- unsigned char a_ElapsedTicks;
- bool ShouldPowerOn;
+ unsigned char a_DelayTicks; // For how many ticks should the repeater delay
+ unsigned char a_ElapsedTicks; // How much of the previous has been elapsed?
+ bool ShouldPowerOn; // What happens when the delay time is fulfilled?
};
public:
@@ -132,15 +136,15 @@ private:
/* ====== Helper functions ====== */
/** Marks a block as powered */
- void SetBlockPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock);
+ void SetBlockPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock, unsigned char a_PowerLevel = MAX_POWER_LEVEL);
/** Marks a block as being powered through another block */
- void SetBlockLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_MiddleX, int a_MiddleY, int a_MiddleZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock, BLOCKTYPE a_MiddeBlock);
+ void SetBlockLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_MiddleX, int a_MiddleY, int a_MiddleZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock, BLOCKTYPE a_MiddeBlock, unsigned char a_PowerLevel = MAX_POWER_LEVEL);
/** Marks a block as simulated, who should not be simulated further unless their power state changes, to accomodate a player manually toggling the block without triggering the simulator toggling it back */
void SetPlayerToggleableBlockAsSimulated(int a_BlockX, int a_BlockY, int a_BlockZ, bool WasLastStatePowered);
/** Marks the second block in a direction as linked powered */
- void SetDirectionLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Direction, BLOCKTYPE a_SourceBlock);
+ void SetDirectionLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Direction, BLOCKTYPE a_SourceBlock, unsigned char a_PowerLevel = MAX_POWER_LEVEL);
/** Marks all blocks immediately surrounding a coordinate as powered */
- void SetAllDirsAsPowered(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_SourceBlock);
+ void SetAllDirsAsPowered(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_SourceBlock, unsigned char a_PowerLevel = MAX_POWER_LEVEL);
/** Queues a repeater to be powered or unpowered */
void QueueRepeaterPowerChange(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta, bool ShouldPowerOn);
@@ -159,15 +163,14 @@ private:
/** Returns if a piston is powered */
bool IsPistonPowered(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta);
/** Returns if a wire is powered
- The only diffence between this and a normal AreCoordsPowered is that this function checks for a wire powering another wire
- */
- bool IsWirePowered(int a_BlockX, int a_BlockY, int a_BlockZ);
+ The only diffence between this and a normal AreCoordsPowered is that this function checks for a wire powering another wire */
+ bool IsWirePowered(int a_BlockX, int a_BlockY, int a_BlockZ, unsigned char & a_PowerLevel);
/** Returns if lever metadata marks it as emitting power */
bool IsLeverOn(NIBBLETYPE a_BlockMeta);
/** Returns if button metadata marks it as emitting power */
- bool IsButtonOn(NIBBLETYPE a_BlockMeta);
+ bool IsButtonOn(NIBBLETYPE a_BlockMeta) { return IsLeverOn(a_BlockMeta); }
/* ============================== */
/* ====== Misc Functions ====== */
diff --git a/src/Vector3.h b/src/Vector3.h
index a00e14508..2c79f9ff1 100644
--- a/src/Vector3.h
+++ b/src/Vector3.h
@@ -108,6 +108,11 @@ public:
return x == a_Rhs.x && y == a_Rhs.y && z == a_Rhs.z;
}
+ inline bool operator == (const Vector3<T> & a_Rhs) const
+ {
+ return Equals(a_Rhs);
+ }
+
inline bool operator < (const Vector3<T> & a_Rhs)
{
// return (x < a_Rhs.x) && (y < a_Rhs.y) && (z < a_Rhs.z); ?
diff --git a/src/World.cpp b/src/World.cpp
index c188fd522..800bdde0e 100644
--- a/src/World.cpp
+++ b/src/World.cpp
@@ -574,7 +574,7 @@ void cWorld::Start(void)
m_IsSugarcaneBonemealable = IniFile.GetValueSetB("Plants", "IsSugarcaneBonemealable", false);
m_IsDeepSnowEnabled = IniFile.GetValueSetB("Physics", "DeepSnow", true);
m_ShouldLavaSpawnFire = IniFile.GetValueSetB("Physics", "ShouldLavaSpawnFire", true);
- int TNTShrapnelLevel = IniFile.GetValueSetI("Physics", "TNTShrapnelLevel", (int)slNone);
+ int TNTShrapnelLevel = IniFile.GetValueSetI("Physics", "TNTShrapnelLevel", (int)slAll);
m_bCommandBlocksEnabled = IniFile.GetValueSetB("Mechanics", "CommandBlocksEnabled", false);
m_bEnabledPVP = IniFile.GetValueSetB("Mechanics", "PVPEnabled", true);
m_bUseChatPrefixes = IniFile.GetValueSetB("Mechanics", "UseChatPrefixes", true);
@@ -1632,7 +1632,6 @@ bool cWorld::WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlock
void cWorld::SpawnItemPickups(const cItems & a_Pickups, double a_BlockX, double a_BlockY, double a_BlockZ, double a_FlyAwaySpeed, bool IsPlayerCreated)
{
- MTRand r1;
a_FlyAwaySpeed /= 100; // Pre-divide, so that we don't have to divide each time inside the loop
for (cItems::const_iterator itr = a_Pickups.begin(); itr != a_Pickups.end(); ++itr)
{
@@ -1642,9 +1641,9 @@ void cWorld::SpawnItemPickups(const cItems & a_Pickups, double a_BlockX, double
continue;
}
- float SpeedX = (float)(a_FlyAwaySpeed * (r1.randInt(10) - 5));
- float SpeedY = (float)(a_FlyAwaySpeed * r1.randInt(50));
- float SpeedZ = (float)(a_FlyAwaySpeed * (r1.randInt(10) - 5));
+ float SpeedX = (float)(a_FlyAwaySpeed * (GetTickRandomNumber(10) - 5));
+ float SpeedY = (float)(a_FlyAwaySpeed * GetTickRandomNumber(50));
+ float SpeedZ = (float)(a_FlyAwaySpeed * (GetTickRandomNumber(10) - 5));
cPickup * Pickup = new cPickup(
a_BlockX, a_BlockY, a_BlockZ,
@@ -1692,6 +1691,11 @@ int cWorld::SpawnFallingBlock(int a_X, int a_Y, int a_Z, BLOCKTYPE BlockType, NI
int cWorld::SpawnExperienceOrb(double a_X, double a_Y, double a_Z, int a_Reward)
{
+ if (a_Reward < 1)
+ {
+ return -1;
+ }
+
cExpOrb * ExpOrb = new cExpOrb(a_X, a_Y, a_Z, a_Reward);
ExpOrb->Initialize(this);
return ExpOrb->GetUniqueID();
diff --git a/src/WorldStorage/FireworksSerializer.cpp b/src/WorldStorage/FireworksSerializer.cpp
index 744fc731f..e0cd69634 100644
--- a/src/WorldStorage/FireworksSerializer.cpp
+++ b/src/WorldStorage/FireworksSerializer.cpp
@@ -231,7 +231,7 @@ void cFireworkItem::FadeColoursFromString(const AString & a_String, cFireworkIte
-int cFireworkItem::GetVanillaColourCodeFromDye(short a_DyeMeta)
+int cFireworkItem::GetVanillaColourCodeFromDye(NIBBLETYPE a_DyeMeta)
{
/*
Colours are supposed to be calculated via: R << 16 + G << 8 + B
diff --git a/src/WorldStorage/FireworksSerializer.h b/src/WorldStorage/FireworksSerializer.h
index cbc544a14..59f1b09b0 100644
--- a/src/WorldStorage/FireworksSerializer.h
+++ b/src/WorldStorage/FireworksSerializer.h
@@ -81,7 +81,7 @@ public:
static void FadeColoursFromString(const AString & a_String, cFireworkItem & a_FireworkItem);
/** Returns a colour code for fireworks used by the network code */
- static int GetVanillaColourCodeFromDye(short a_DyeMeta);
+ static int GetVanillaColourCodeFromDye(NIBBLETYPE a_DyeMeta);
bool m_HasFlicker;
bool m_HasTrail;