cBlockArea can now be saved as a .schematic file.
git-svn-id: http://mc-server.googlecode.com/svn/trunk@1198 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
1ba07a82b6
commit
ed47a8e409
@ -149,6 +149,25 @@ function OnPlayerUsingItem(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, C
|
|||||||
return false;
|
return false;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- Rclk with an ender pearl saves a predefined area around the cursor into a .schematic file
|
||||||
|
if (Player:GetEquippedItem().m_ItemType == E_ITEM_ENDER_PEARL) then
|
||||||
|
local Area = cBlockArea();
|
||||||
|
if not(Area:Read(Player:GetWorld(),
|
||||||
|
BlockX - 8, BlockX + 8, BlockY - 8, BlockY + 8, BlockZ - 8, BlockZ + 8)
|
||||||
|
) then
|
||||||
|
LOG("LUA: Area couldn't be read");
|
||||||
|
return false;
|
||||||
|
end
|
||||||
|
LOG("LUA: Area read, saving now.");
|
||||||
|
if not(Area:SaveToSchematicFile("schematics/out.schematic")) then
|
||||||
|
LOG("LUA: Cannot save schematic file.");
|
||||||
|
return false;
|
||||||
|
end
|
||||||
|
LOG("LUA: Done.");
|
||||||
|
return false;
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
** Lua binding: AllToLua
|
** Lua binding: AllToLua
|
||||||
** Generated automatically by tolua++-1.0.92 on 02/06/13 22:02:40.
|
** Generated automatically by tolua++-1.0.92 on 02/07/13 10:38:08.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __cplusplus
|
#ifndef __cplusplus
|
||||||
@ -17894,6 +17894,41 @@ static int tolua_AllToLua_cBlockArea_LoadFromSchematicFile00(lua_State* tolua_S)
|
|||||||
}
|
}
|
||||||
#endif //#ifndef TOLUA_DISABLE
|
#endif //#ifndef TOLUA_DISABLE
|
||||||
|
|
||||||
|
/* method: SaveToSchematicFile of class cBlockArea */
|
||||||
|
#ifndef TOLUA_DISABLE_tolua_AllToLua_cBlockArea_SaveToSchematicFile00
|
||||||
|
static int tolua_AllToLua_cBlockArea_SaveToSchematicFile00(lua_State* tolua_S)
|
||||||
|
{
|
||||||
|
#ifndef TOLUA_RELEASE
|
||||||
|
tolua_Error tolua_err;
|
||||||
|
if (
|
||||||
|
!tolua_isusertype(tolua_S,1,"cBlockArea",0,&tolua_err) ||
|
||||||
|
!tolua_iscppstring(tolua_S,2,0,&tolua_err) ||
|
||||||
|
!tolua_isnoobj(tolua_S,3,&tolua_err)
|
||||||
|
)
|
||||||
|
goto tolua_lerror;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
cBlockArea* self = (cBlockArea*) tolua_tousertype(tolua_S,1,0);
|
||||||
|
const AString a_FileName = ((const AString) tolua_tocppstring(tolua_S,2,0));
|
||||||
|
#ifndef TOLUA_RELEASE
|
||||||
|
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'SaveToSchematicFile'", NULL);
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
bool tolua_ret = (bool) self->SaveToSchematicFile(a_FileName);
|
||||||
|
tolua_pushboolean(tolua_S,(bool)tolua_ret);
|
||||||
|
tolua_pushcppstring(tolua_S,(const char*)a_FileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 2;
|
||||||
|
#ifndef TOLUA_RELEASE
|
||||||
|
tolua_lerror:
|
||||||
|
tolua_error(tolua_S,"#ferror in function 'SaveToSchematicFile'.",&tolua_err);
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif //#ifndef TOLUA_DISABLE
|
||||||
|
|
||||||
/* method: Crop of class cBlockArea */
|
/* method: Crop of class cBlockArea */
|
||||||
#ifndef TOLUA_DISABLE_tolua_AllToLua_cBlockArea_Crop00
|
#ifndef TOLUA_DISABLE_tolua_AllToLua_cBlockArea_Crop00
|
||||||
static int tolua_AllToLua_cBlockArea_Crop00(lua_State* tolua_S)
|
static int tolua_AllToLua_cBlockArea_Crop00(lua_State* tolua_S)
|
||||||
@ -21776,6 +21811,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
|
|||||||
tolua_function(tolua_S,"Write",tolua_AllToLua_cBlockArea_Write01);
|
tolua_function(tolua_S,"Write",tolua_AllToLua_cBlockArea_Write01);
|
||||||
tolua_function(tolua_S,"DumpToRawFile",tolua_AllToLua_cBlockArea_DumpToRawFile00);
|
tolua_function(tolua_S,"DumpToRawFile",tolua_AllToLua_cBlockArea_DumpToRawFile00);
|
||||||
tolua_function(tolua_S,"LoadFromSchematicFile",tolua_AllToLua_cBlockArea_LoadFromSchematicFile00);
|
tolua_function(tolua_S,"LoadFromSchematicFile",tolua_AllToLua_cBlockArea_LoadFromSchematicFile00);
|
||||||
|
tolua_function(tolua_S,"SaveToSchematicFile",tolua_AllToLua_cBlockArea_SaveToSchematicFile00);
|
||||||
tolua_function(tolua_S,"Crop",tolua_AllToLua_cBlockArea_Crop00);
|
tolua_function(tolua_S,"Crop",tolua_AllToLua_cBlockArea_Crop00);
|
||||||
tolua_function(tolua_S,"SetRelBlockType",tolua_AllToLua_cBlockArea_SetRelBlockType00);
|
tolua_function(tolua_S,"SetRelBlockType",tolua_AllToLua_cBlockArea_SetRelBlockType00);
|
||||||
tolua_function(tolua_S,"SetBlockType",tolua_AllToLua_cBlockArea_SetBlockType00);
|
tolua_function(tolua_S,"SetBlockType",tolua_AllToLua_cBlockArea_SetBlockType00);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
** Lua binding: AllToLua
|
** Lua binding: AllToLua
|
||||||
** Generated automatically by tolua++-1.0.92 on 02/06/13 22:02:40.
|
** Generated automatically by tolua++-1.0.92 on 02/07/13 10:38:08.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Exported function */
|
/* Exported function */
|
||||||
|
@ -223,6 +223,52 @@ bool cBlockArea::LoadFromSchematicFile(const AString & a_FileName)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cBlockArea::SaveToSchematicFile(const AString & a_FileName)
|
||||||
|
{
|
||||||
|
cFastNBTWriter Writer("Schematic");
|
||||||
|
Writer.AddShort("Width", m_SizeX);
|
||||||
|
Writer.AddShort("Height", m_SizeY);
|
||||||
|
Writer.AddShort("Length", m_SizeZ);
|
||||||
|
Writer.AddString("Materials", "Alpha");
|
||||||
|
if (HasBlockTypes())
|
||||||
|
{
|
||||||
|
Writer.AddByteArray("Blocks", (const char *)m_BlockTypes, GetBlockCount());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AString Dummy(GetBlockCount(), 0);
|
||||||
|
Writer.AddByteArray("Blocks", Dummy.data(), Dummy.size());
|
||||||
|
}
|
||||||
|
if (HasBlockMetas())
|
||||||
|
{
|
||||||
|
Writer.AddByteArray("Data", (const char *)m_BlockMetas, GetBlockCount());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AString Dummy(GetBlockCount(), 0);
|
||||||
|
Writer.AddByteArray("Data", Dummy.data(), Dummy.size());
|
||||||
|
}
|
||||||
|
Writer.Finish();
|
||||||
|
|
||||||
|
// TODO: Save to file
|
||||||
|
cGZipFile File;
|
||||||
|
if (!File.Open(a_FileName, cGZipFile::fmWrite))
|
||||||
|
{
|
||||||
|
LOG("Cannot open file \"%s\" for writing.", a_FileName.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!File.Write(Writer.GetResult()))
|
||||||
|
{
|
||||||
|
LOG("Cannot write data to file \"%s\".", a_FileName.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cBlockArea::Crop(int a_AddMinX, int a_SubMaxX, int a_AddMinY, int a_SubMaxY, int a_AddMinZ, int a_SubMaxZ)
|
void cBlockArea::Crop(int a_AddMinX, int a_SubMaxX, int a_AddMinY, int a_SubMaxY, int a_AddMinZ, int a_SubMaxZ)
|
||||||
{
|
{
|
||||||
if (
|
if (
|
||||||
|
@ -65,6 +65,9 @@ public:
|
|||||||
/// Loads an area from a .schematic file. Returns true if successful
|
/// Loads an area from a .schematic file. Returns true if successful
|
||||||
bool LoadFromSchematicFile(const AString & a_FileName);
|
bool LoadFromSchematicFile(const AString & a_FileName);
|
||||||
|
|
||||||
|
/// Saves the area into a .schematic file. Returns true if successful
|
||||||
|
bool SaveToSchematicFile(const AString & a_FileName);
|
||||||
|
|
||||||
/// Crops the internal contents by the specified amount of blocks from each border.
|
/// Crops the internal contents by the specified amount of blocks from each border.
|
||||||
void Crop(int a_AddMinX, int a_SubMaxX, int a_AddMinY, int a_SubMaxY, int a_AddMinZ, int a_SubMaxZ);
|
void Crop(int a_AddMinX, int a_SubMaxX, int a_AddMinY, int a_SubMaxY, int a_AddMinZ, int a_SubMaxZ);
|
||||||
|
|
||||||
|
@ -36,6 +36,7 @@ bool cGZipFile::Open(const AString & a_FileName, eMode a_Mode)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
m_File = gzopen(a_FileName.c_str(), (a_Mode == fmRead) ? "r" : "w");
|
m_File = gzopen(a_FileName.c_str(), (a_Mode == fmRead) ? "r" : "w");
|
||||||
|
m_Mode = a_Mode;
|
||||||
return (m_File != NULL);
|
return (m_File != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,6 +65,12 @@ int cGZipFile::ReadRestOfFile(AString & a_Contents)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_Mode != fmRead)
|
||||||
|
{
|
||||||
|
ASSERT(!"Bad file mode, cannot read");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// Since the gzip format doesn't really support getting the uncompressed length, we need to read incrementally. Yuck!
|
// Since the gzip format doesn't really support getting the uncompressed length, we need to read incrementally. Yuck!
|
||||||
int NumBytesRead = 0;
|
int NumBytesRead = 0;
|
||||||
char Buffer[64 KiB];
|
char Buffer[64 KiB];
|
||||||
@ -77,3 +84,24 @@ int cGZipFile::ReadRestOfFile(AString & a_Contents)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cGZipFile::Write(const AString & a_Contents)
|
||||||
|
{
|
||||||
|
if (m_File == NULL)
|
||||||
|
{
|
||||||
|
ASSERT(!"No file has been opened");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_Mode != fmWrite)
|
||||||
|
{
|
||||||
|
ASSERT(!"Bad file mode, cannot write");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (gzwrite(m_File, a_Contents.data(), a_Contents.size()) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,11 +36,12 @@ public:
|
|||||||
/// Reads the rest of the file and decompresses it into a_Contents. Returns the number of decompressed bytes, <0 for error
|
/// Reads the rest of the file and decompresses it into a_Contents. Returns the number of decompressed bytes, <0 for error
|
||||||
int ReadRestOfFile(AString & a_Contents);
|
int ReadRestOfFile(AString & a_Contents);
|
||||||
|
|
||||||
/// Writes a_Contents into file, compressing it along the way. Returns the number of decompressed bytes, <0 for error. Multiple writes are supported.
|
/// Writes a_Contents into file, compressing it along the way. Returns true if successful. Multiple writes are supported.
|
||||||
int Write(AString & a_Contents);
|
bool Write(const AString & a_Contents);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
gzFile m_File;
|
gzFile m_File;
|
||||||
|
eMode m_Mode;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
@ -327,13 +327,13 @@ int cParsedNBT::FindTagByPath(int a_Tag, const AString & a_Path) const
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// cFastNBTWriter:
|
// cFastNBTWriter:
|
||||||
|
|
||||||
cFastNBTWriter::cFastNBTWriter(void) :
|
cFastNBTWriter::cFastNBTWriter(const AString & a_RootTagName) :
|
||||||
m_CurrentStack(0)
|
m_CurrentStack(0)
|
||||||
{
|
{
|
||||||
m_Stack[0].m_Type = TAG_Compound;
|
m_Stack[0].m_Type = TAG_Compound;
|
||||||
m_Result.reserve(100 * 1024);
|
m_Result.reserve(100 * 1024);
|
||||||
m_Result.push_back(TAG_Compound);
|
m_Result.push_back(TAG_Compound);
|
||||||
WriteString("", 0);
|
WriteString(a_RootTagName.data(), a_RootTagName.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -213,7 +213,7 @@ protected:
|
|||||||
class cFastNBTWriter
|
class cFastNBTWriter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cFastNBTWriter(void);
|
cFastNBTWriter(const AString & a_RootTagName = "");
|
||||||
|
|
||||||
void BeginCompound(const AString & a_Name);
|
void BeginCompound(const AString & a_Name);
|
||||||
void EndCompound(void);
|
void EndCompound(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user