Merge pull request #786 from mc-server/cBlockArea_Offset
Added WE Offset to cBlockArea
This commit is contained in:
commit
79d6e7c4a4
@ -114,7 +114,7 @@ g_APIDesc =
|
||||
GetBlockSkyLight = { Params = "BlockX, BlockY, BlockZ", Return = "NIBBLETYPE", Notes = "Returns the skylight at the specified absolute coords" },
|
||||
GetBlockType = { Params = "BlockX, BlockY, BlockZ", Return = "BLOCKTYPE", Notes = "Returns the block type at the specified absolute coords" },
|
||||
GetBlockTypeMeta = { Params = "BlockX, BlockY, BlockZ", Return = "BLOCKTYPE, NIBBLETYPE", Notes = "Returns the block type and meta at the specified absolute coords" },
|
||||
GetDataTypes = { Params = "", Return = "number", Notes = "Returns the mask of datatypes that the objectis currently holding" },
|
||||
GetDataTypes = { Params = "", Return = "number", Notes = "Returns the mask of datatypes that the object is currently holding" },
|
||||
GetOrigin = { Params = "", Return = "OriginX, OriginY, OriginZ", Notes = "Returns the origin coords of where the area was read from." },
|
||||
GetOriginX = { Params = "", Return = "number", Notes = "Returns the origin x-coord" },
|
||||
GetOriginY = { Params = "", Return = "number", Notes = "Returns the origin y-coord" },
|
||||
@ -129,6 +129,7 @@ g_APIDesc =
|
||||
GetSizeY = { Params = "", Return = "number", Notes = "Returns the size of the held data in the y-axis" },
|
||||
GetSizeZ = { Params = "", Return = "number", Notes = "Returns the size of the held data in the z-axis" },
|
||||
GetVolume = { Params = "", Return = "number", Notes = "Returns the volume of the area - the total number of blocks stored within." },
|
||||
GetWEOffset = { Params = "", Return = "{{Vector3i}}", Notes = "Returns the WE offset, a data value sometimes stored in the schematic files. MCServer doesn't use this value, but provides access to it using this method. The default is {0, 0, 0}."},
|
||||
HasBlockLights = { Params = "", Return = "bool", Notes = "Returns true if current datatypes include blocklight" },
|
||||
HasBlockMetas = { Params = "", Return = "bool", Notes = "Returns true if current datatypes include block metas" },
|
||||
HasBlockSkyLights = { Params = "", Return = "bool", Notes = "Returns true if current datatypes include skylight" },
|
||||
@ -178,6 +179,11 @@ g_APIDesc =
|
||||
SetRelBlockSkyLight = { Params = "RelBlockX, RelBlockY, RelBlockZ, SkyLight", Return = "", Notes = "Sets the skylight at the specified relative coords" },
|
||||
SetRelBlockType = { Params = "RelBlockX, RelBlockY, RelBlockZ, BlockType", Return = "", Notes = "Sets the block type at the specified relative coords" },
|
||||
SetRelBlockTypeMeta = { Params = "RelBlockX, RelBlockY, RelBlockZ, BlockType, BlockMeta", Return = "", Notes = "Sets the block type and meta at the specified relative coords" },
|
||||
SetWEOffset =
|
||||
{
|
||||
{ Params = "{{Vector3i|Offset}}", Return = "", Notes = "Sets the WE offset, a data value sometimes stored in the schematic files. Mostly used for WorldEdit. MCServer doesn't use this value, but provides access to it using this method." },
|
||||
{ Params = "OffsetX, OffsetY, OffsetZ", Return = "", Notes = "Sets the WE offset, a data value sometimes stored in the schematic files. Mostly used for WorldEdit. MCServer doesn't use this value, but provides access to it using this method." },
|
||||
},
|
||||
Write =
|
||||
{
|
||||
{ Params = "World, {{Vector3i|MinPoint}}, DataTypes", Return = "bool", Notes = "Writes the area into World at the specified coords, returns true if successful" },
|
||||
|
@ -168,6 +168,7 @@ cBlockArea::cBlockArea(void) :
|
||||
m_SizeX(0),
|
||||
m_SizeY(0),
|
||||
m_SizeZ(0),
|
||||
m_WEOffset(0, 0, 0),
|
||||
m_BlockTypes(NULL),
|
||||
m_BlockMetas(NULL),
|
||||
m_BlockLight(NULL),
|
||||
@ -254,6 +255,24 @@ void cBlockArea::Create(int a_SizeX, int a_SizeY, int a_SizeZ, int a_DataTypes)
|
||||
|
||||
|
||||
|
||||
void cBlockArea::SetWEOffset(int a_OffsetX, int a_OffsetY, int a_OffsetZ)
|
||||
{
|
||||
m_WEOffset.Set(a_OffsetX, a_OffsetY, a_OffsetZ);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cBlockArea::SetWEOffset(const Vector3i & a_Offset)
|
||||
{
|
||||
m_WEOffset.Set(a_Offset.x, a_Offset.y, a_Offset.z);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cBlockArea::SetOrigin(int a_OriginX, int a_OriginY, int a_OriginZ)
|
||||
{
|
||||
m_OriginX = a_OriginX;
|
||||
|
@ -209,6 +209,8 @@ public:
|
||||
void SetBlockLight (int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_BlockLight);
|
||||
void SetRelBlockSkyLight(int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_BlockSkyLight);
|
||||
void SetBlockSkyLight (int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_BlockSkyLight);
|
||||
void SetWEOffset (int a_OffsetX, int a_OffsetY, int a_OffsetZ);
|
||||
void SetWEOffset (const Vector3i & a_Offset);
|
||||
|
||||
// Getters:
|
||||
BLOCKTYPE GetRelBlockType (int a_RelX, int a_RelY, int a_RelZ) const;
|
||||
@ -219,6 +221,7 @@ public:
|
||||
NIBBLETYPE GetBlockLight (int a_BlockX, int a_BlockY, int a_BlockZ) const;
|
||||
NIBBLETYPE GetRelBlockSkyLight(int a_RelX, int a_RelY, int a_RelZ) const;
|
||||
NIBBLETYPE GetBlockSkyLight (int a_BlockX, int a_BlockY, int a_BlockZ) const;
|
||||
const Vector3i & GetWEOffset (void) const {return m_WEOffset;}
|
||||
|
||||
void SetBlockTypeMeta (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
|
||||
void SetRelBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
|
||||
@ -299,6 +302,10 @@ protected:
|
||||
int m_SizeY;
|
||||
int m_SizeZ;
|
||||
|
||||
/** An extra data value sometimes stored in the .schematic file. Used mainly by the WorldEdit plugin.
|
||||
cBlockArea doesn't use this value in any way. */
|
||||
Vector3i m_WEOffset;
|
||||
|
||||
BLOCKTYPE * m_BlockTypes;
|
||||
NIBBLETYPE * m_BlockMetas; // Each meta is stored as a separate byte for faster access
|
||||
NIBBLETYPE * m_BlockLight; // Each light value is stored as a separate byte for faster access
|
||||
|
@ -177,6 +177,25 @@ bool cSchematicFileSerializer::LoadFromSchematicNBT(cBlockArea & a_BlockArea, cP
|
||||
a_BlockArea.Clear();
|
||||
a_BlockArea.SetSize(SizeX, SizeY, SizeZ, AreMetasPresent ? (cBlockArea::baTypes | cBlockArea::baMetas) : cBlockArea::baTypes);
|
||||
|
||||
int TOffsetX = a_NBT.FindChildByName(a_NBT.GetRoot(), "WEOffsetX");
|
||||
int TOffsetY = a_NBT.FindChildByName(a_NBT.GetRoot(), "WEOffsetY");
|
||||
int TOffsetZ = a_NBT.FindChildByName(a_NBT.GetRoot(), "WEOffsetZ");
|
||||
|
||||
if (
|
||||
(TOffsetX < 0) || (TOffsetY < 0) || (TOffsetZ < 0) ||
|
||||
(a_NBT.GetType(TOffsetX) != TAG_Int) ||
|
||||
(a_NBT.GetType(TOffsetY) != TAG_Int) ||
|
||||
(a_NBT.GetType(TOffsetZ) != TAG_Int)
|
||||
)
|
||||
{
|
||||
// Not every schematic file has an offset, so we shoudn't give a warn message.
|
||||
a_BlockArea.SetWEOffset(0, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
a_BlockArea.SetWEOffset(a_NBT.GetInt(TOffsetX), a_NBT.GetInt(TOffsetY), a_NBT.GetInt(TOffsetZ));
|
||||
}
|
||||
|
||||
// Copy the block types and metas:
|
||||
int NumBytes = a_BlockArea.m_SizeX * a_BlockArea.m_SizeY * a_BlockArea.m_SizeZ;
|
||||
if (a_NBT.GetDataLength(TBlockTypes) < NumBytes)
|
||||
@ -234,6 +253,10 @@ AString cSchematicFileSerializer::SaveToSchematicNBT(const cBlockArea & a_BlockA
|
||||
Writer.AddByteArray("Data", Dummy.data(), Dummy.size());
|
||||
}
|
||||
|
||||
Writer.AddInt("WEOffsetX", a_BlockArea.m_WEOffset.x);
|
||||
Writer.AddInt("WEOffsetY", a_BlockArea.m_WEOffset.y);
|
||||
Writer.AddInt("WEOffsetZ", a_BlockArea.m_WEOffset.z);
|
||||
|
||||
// TODO: Save entities and block entities
|
||||
Writer.BeginList("Entities", TAG_Compound);
|
||||
Writer.EndList();
|
||||
|
Loading…
Reference in New Issue
Block a user