From ca1d98a7baf7d650c02e027c6c15dfc8eeeb171d Mon Sep 17 00:00:00 2001 From: faketruth <faketruth@0a769ca7-a7f5-676a-18bf-c427514a06d6> Date: Sun, 30 Oct 2011 11:41:18 +0000 Subject: [PATCH] Changed long to long long so it works fine on 32bit systems Added printing for Byte array tags (the length is incorrect though) Structured the tags enums a bit more In cConvert.cpp the correct compounds are opened before accessing data Added VS2010 project so the converter can be compiled through VS2010 git-svn-id: http://mc-server.googlecode.com/svn/trunk@27 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- VC2010/Converter.vcxproj | 83 ++++++++++++++++++++++++++++++++ VC2010/Converter.vcxproj.filters | 30 ++++++++++++ VC2010/Converter.vcxproj.user | 11 +++++ VC2010/MCServer.sln | 8 +++ converter/cConvert.cpp | 22 +++++---- converter/cNBTData.cpp | 27 ++++++----- converter/cNBTData.h | 18 ++++--- 7 files changed, 169 insertions(+), 30 deletions(-) create mode 100644 VC2010/Converter.vcxproj create mode 100644 VC2010/Converter.vcxproj.filters create mode 100644 VC2010/Converter.vcxproj.user diff --git a/VC2010/Converter.vcxproj b/VC2010/Converter.vcxproj new file mode 100644 index 000000000..a9a40457f --- /dev/null +++ b/VC2010/Converter.vcxproj @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\converter\cConvert.cpp" /> + <ClCompile Include="..\converter\cNBTData.cpp" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\converter\cNBTData.h" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{9AB1FB82-2148-40E4-919F-3B184B4593C8}</ProjectGuid> + <RootNamespace>Converter</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <OutDir>../converter/</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>../converter/</OutDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>../zlib-1.2.5</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>./Debug/</AdditionalLibraryDirectories> + <AdditionalDependencies>ws2_32.lib;ZLib.lib;%(AdditionalDependencies)</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <AdditionalIncludeDirectories>../zlib-1.2.5</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>./Release/</AdditionalLibraryDirectories> + <AdditionalDependencies>ws2_32.lib;ZLib.lib;%(AdditionalDependencies)</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/VC2010/Converter.vcxproj.filters b/VC2010/Converter.vcxproj.filters new file mode 100644 index 000000000..dbe3b1c28 --- /dev/null +++ b/VC2010/Converter.vcxproj.filters @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\converter\cConvert.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\converter\cNBTData.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\converter\cNBTData.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/VC2010/Converter.vcxproj.user b/VC2010/Converter.vcxproj.user new file mode 100644 index 000000000..90d00fb58 --- /dev/null +++ b/VC2010/Converter.vcxproj.user @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LocalDebuggerWorkingDirectory>$(TargetDir)</LocalDebuggerWorkingDirectory> + <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LocalDebuggerWorkingDirectory>$(TargetDir)</LocalDebuggerWorkingDirectory> + <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> + </PropertyGroup> +</Project> \ No newline at end of file diff --git a/VC2010/MCServer.sln b/VC2010/MCServer.sln index 14e0e8457..322046d33 100644 --- a/VC2010/MCServer.sln +++ b/VC2010/MCServer.sln @@ -17,6 +17,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WebServer", "WebServer.vcxp EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JsonCpp", "JsonCpp.vcxproj", "{ADBF25B9-7192-4E54-B35E-8EC47CA5EF86}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Converter", "Converter.vcxproj", "{9AB1FB82-2148-40E4-919F-3B184B4593C8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -71,6 +73,12 @@ Global {ADBF25B9-7192-4E54-B35E-8EC47CA5EF86}.Release|Win32.ActiveCfg = Release|Win32 {ADBF25B9-7192-4E54-B35E-8EC47CA5EF86}.Release|Win32.Build.0 = Release|Win32 {ADBF25B9-7192-4E54-B35E-8EC47CA5EF86}.Release|x64.ActiveCfg = Release|Win32 + {9AB1FB82-2148-40E4-919F-3B184B4593C8}.Debug|Win32.ActiveCfg = Debug|Win32 + {9AB1FB82-2148-40E4-919F-3B184B4593C8}.Debug|Win32.Build.0 = Debug|Win32 + {9AB1FB82-2148-40E4-919F-3B184B4593C8}.Debug|x64.ActiveCfg = Debug|Win32 + {9AB1FB82-2148-40E4-919F-3B184B4593C8}.Release|Win32.ActiveCfg = Release|Win32 + {9AB1FB82-2148-40E4-919F-3B184B4593C8}.Release|Win32.Build.0 = Release|Win32 + {9AB1FB82-2148-40E4-919F-3B184B4593C8}.Release|x64.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/converter/cConvert.cpp b/converter/cConvert.cpp index 565a6bd6a..e31730bf3 100644 --- a/converter/cConvert.cpp +++ b/converter/cConvert.cpp @@ -7,7 +7,7 @@ #include <ctype.h> #include "zlib.h" #include <time.h> -#include "cNBTData.cpp" +#include "cNBTData.h" void quicksort(int*, int, int); int partition(int*, int, int, int); @@ -32,7 +32,7 @@ int main () { FILE* wf = 0; #ifdef _WIN32 sprintf_s(SourceFile, 128, "region/%s","r.0.0.mcr"); //replace hard coded file with file array variable - sprintf_s(OutputFile, 128, "world/%s","X0_Z0.pak"); //parce x and z from file array variable and place into pak file format + sprintf_s(OutputFile, 128, "world/%s","X0_Z0.pak"); //parce x and z from file array variable and place into pak file format if( fopen_s(&wf, OutputFile, "wb" ) == 0 ) {} else { cout << "uhoh!" << endl; return 0; } //open new pak file for writing #else sprintf(SourceFile, "region/%s","r.0.0.mcr"); //same as above but for linux @@ -48,9 +48,9 @@ int main () { unsigned char byte1 = 0; unsigned char byte2 = 0; unsigned char byte3 = 0; - unsigned char byte4 = 0; - unsigned char byte5 = 0; - unsigned char trash = 0; + unsigned char byte4 = 0; + unsigned char byte5 = 0; + unsigned char trash = 0; unsigned int frloc = 0; int toffset = 0; int compdlength = 0; @@ -107,8 +107,8 @@ int main () { //cout << "frloc: " << frloc << endl; - - char temparr[compdlength]; //can't get fread to read more than one char at a time into a char array... so that's what I'll do. :( At least it works. + // TODO - delete [] temparr after you're done with it, now it's a memory leak + char* temparr = new char[compdlength]; //can't get fread to read more than one char at a time into a char array... so that's what I'll do. :( At least it works. if( fread( temparr, compdlength, 1, f) != 1 ) { cout << "ERROR rf22 READING FROM FILE " << SourceFile; fclose(f); return false; } frloc = frloc + compdlength; /* @@ -173,7 +173,7 @@ int main () { //testing of nbtparser. - cNBTData* NBTData = new cNBTData::cNBTData(BlockData, (testr)); + cNBTData* NBTData = new cNBTData(BlockData, (testr)); //NBTData->m_bDecompressed = true; NBTData->ParseData(); NBTData->PrintData(); @@ -181,10 +181,14 @@ int main () { //NBTData->GetByteArray("Blocks"); //for(unsigned int i = 0; i < 111; i++) {//re //printf("Blocks?: %i\n", NBTData->cNBTCompound::GetByteArray("Blocks")[0]); + NBTData->OpenCompound(""); + NBTData->OpenCompound("Level"); // You need to open the right compounds before you can access the data in it printf("xPos: %i\n", NBTData->GetInteger("xPos") ); //will print //xPos: 0 - printf("test: %i\n", NBTData->cNBTCompound::GetByteArray("Blocks")[0] ); + printf("test: %i\n", NBTData->GetByteArray("Blocks")[0] ); + NBTData->CloseCompound();// Close the compounds after you're done + NBTData->CloseCompound(); //} return 1; fwrite( BlockData, DestSize, 1, wf ); //write contents of uncompressed block data to file to check to see if it's valid... It is! :D diff --git a/converter/cNBTData.cpp b/converter/cNBTData.cpp index 5bc6e3ddf..fc0dd628e 100644 --- a/converter/cNBTData.cpp +++ b/converter/cNBTData.cpp @@ -357,6 +357,11 @@ void cNBTCompound::PrintData( int a_Depth, std::string a_Name ) printf("%s BYTE %s (%i)\n", Prefix, itr->first.c_str(), itr->second ); } + for( ByteArrayMap::iterator itr = m_ByteArrays.begin(); itr != m_ByteArrays.end(); itr++ ) + { + printf("%s BYTE ARRAY %s (length: %i)\n", Prefix, itr->first.c_str(), sizeof(itr->second) ); + } + delete Prefix; } @@ -524,9 +529,9 @@ void cNBTData::ParseLong( bool a_bNamed ) { std::string Name; if( a_bNamed ) Name = ReadName(); - long Value = ReadLong(); + long long Value = ReadLong(); - PutInteger( Name, Value ); + PutInteger( Name, (int)Value ); printf("LONG: %s %li\n", Name.c_str(), Value );//re } @@ -554,12 +559,8 @@ void cNBTData::ParseByteArray( bool a_bNamed ) char* ByteArray = new char[ Length ]; if( Length > 0 ) { - for(int i = 0; i < Length; i++, m_Index++) - { - ByteArray[i] = m_Buffer[ m_Index ]; - //ByteArray[i].push_back( m_Buffer[m_Index] ); - //String.push_back( m_Buffer[m_Index] ); - } + memcpy( ByteArray, &m_Buffer[ m_Index ], Length ); + m_Index += Length; } PutByteArray( Name, ByteArray ); @@ -607,11 +608,11 @@ int cNBTData::ReadInt() return ntohl( Value ); } -long cNBTData::ReadLong() +long long cNBTData::ReadLong() { - long Value = 0; - memcpy( &Value, m_Buffer+m_Index, sizeof(long) ); - m_Index+=sizeof(long); + long long Value = 0; + memcpy( &Value, m_Buffer+m_Index, sizeof(long long) ); + m_Index+=sizeof(long long); return ntohl( Value ); } @@ -757,4 +758,4 @@ void cNBTList::Clear() } } m_List.clear(); -} +} \ No newline at end of file diff --git a/converter/cNBTData.h b/converter/cNBTData.h index a0a40e68b..2ab5b0e21 100644 --- a/converter/cNBTData.h +++ b/converter/cNBTData.h @@ -20,14 +20,16 @@ public: #endif { TAG_End = 0, - TAG_Byte, - TAG_Short, - TAG_Int, - TAG_Long, + TAG_Byte = 1, + TAG_Short = 2, + TAG_Int = 3, + TAG_Long = 4, + TAG_Float = 5, + TAG_Double = 6, TAG_ByteArray = 7, - TAG_String, - TAG_List, - TAG_Compound, + TAG_String = 8, + TAG_List = 9, + TAG_Compound = 10, TAG_NumTags // Not a real tag, but contains number of tags }; @@ -167,7 +169,7 @@ private: std::string ReadName(); char ReadByte(); int ReadInt(); - long ReadLong(); + long long ReadLong(); cNBTCompound* m_CurrentCompound;