 92c59963f8
			
		
	
	
		92c59963f8
		
	
	
	
	
		
			
			git-svn-id: http://mc-server.googlecode.com/svn/trunk@606 0a769ca7-a7f5-676a-18bf-c427514a06d6
		
			
				
	
	
		
			144 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
 | |
| #include "Globals.h"
 | |
| 
 | |
| #include "cFileFormatUpdater.h"
 | |
| #include "Vector3d.h"
 | |
| #include "Vector3f.h"
 | |
| 
 | |
| #include "cItem.h"
 | |
| #include <json/json.h>
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| void cFileFormatUpdater::UpdateFileFormat()
 | |
| {
 | |
| 	UpdatePlayersOfWorld("world");
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| // Convert player .bin files to JSON
 | |
| void cFileFormatUpdater::UpdatePlayersOfWorld( const char* a_WorldName )
 | |
| {
 | |
| 	AString PlayerDir = AString( a_WorldName ) + "/player/";
 | |
| 
 | |
| 	AStringList AllFiles = GetDirectoryContents( PlayerDir.c_str() );
 | |
| 	for (AStringList::iterator itr = AllFiles.begin(); itr != AllFiles.end(); ++itr )
 | |
| 	{
 | |
| 		AString & FileName = *itr;
 | |
| 		if (FileName.rfind(".bin") != AString::npos) // Get only the files ending in .bin
 | |
| 		{
 | |
| 			PlayerBINtoJSON( (PlayerDir + FileName).c_str() );
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| #define READ(File, Var) \
 | |
| 	if (File.Read(&Var, sizeof(Var)) != sizeof(Var)) \
 | |
| 	{ \
 | |
| 		LOGERROR("ERROR READING \"%s\" FROM FILE \"%s\"", #Var, a_FileName); \
 | |
| 		return; \
 | |
| 	}
 | |
| 
 | |
| // Converts player binary files to human readable JSON
 | |
| void cFileFormatUpdater::PlayerBINtoJSON( const char* a_FileName )
 | |
| {
 | |
| 	Vector3d	PlayerPos;
 | |
| 	Vector3f	PlayerRot;
 | |
| 	short		PlayerHealth = 0;
 | |
| 
 | |
| 	const unsigned int NumInventorySlots = 45; // At this time the player inventory has/had 45 slots
 | |
| 	cItem IventoryItems[ NumInventorySlots ];
 | |
| 
 | |
| 	cFile f;
 | |
| 	if (!f.Open(a_FileName, cFile::fmRead))
 | |
| 	{
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	// First read player position, rotation and health
 | |
| 	READ(f, PlayerPos.x);
 | |
| 	READ(f, PlayerPos.y);
 | |
| 	READ(f, PlayerPos.z);
 | |
| 	READ(f, PlayerRot.x);
 | |
| 	READ(f, PlayerRot.y);
 | |
| 	READ(f, PlayerRot.z);
 | |
| 	READ(f, PlayerHealth);
 | |
| 
 | |
| 
 | |
| 	for(unsigned int i = 0; i < NumInventorySlots; i++)
 | |
| 	{
 | |
| 		cItem & Item = IventoryItems[i];
 | |
| 		READ(f, Item.m_ItemID);
 | |
| 		READ(f, Item.m_ItemCount);
 | |
| 		READ(f, Item.m_ItemHealth);
 | |
| 	}
 | |
| 	f.Close();
 | |
| 
 | |
| 	// Loaded all the data, now create the JSON data
 | |
| 	Json::Value JSON_PlayerPosition;
 | |
| 	JSON_PlayerPosition.append( Json::Value( PlayerPos.x ) );
 | |
| 	JSON_PlayerPosition.append( Json::Value( PlayerPos.y ) );
 | |
| 	JSON_PlayerPosition.append( Json::Value( PlayerPos.z ) );
 | |
| 
 | |
| 	Json::Value JSON_PlayerRotation;
 | |
| 	JSON_PlayerRotation.append( Json::Value( PlayerRot.x ) );
 | |
| 	JSON_PlayerRotation.append( Json::Value( PlayerRot.y ) );
 | |
| 	JSON_PlayerRotation.append( Json::Value( PlayerRot.z ) );
 | |
| 
 | |
| 	Json::Value JSON_Inventory;
 | |
| 	for(unsigned int i = 0; i < NumInventorySlots; i++)
 | |
| 	{
 | |
| 		Json::Value JSON_Item;
 | |
| 		IventoryItems[i].GetJson( JSON_Item );
 | |
| 		JSON_Inventory.append( JSON_Item );
 | |
| 	}
 | |
| 
 | |
| 	Json::Value root;
 | |
| 	root["position"] = JSON_PlayerPosition;
 | |
| 	root["rotation"] = JSON_PlayerRotation;
 | |
| 	root["inventory"] = JSON_Inventory;
 | |
| 	root["health"] = PlayerHealth;
 | |
| 
 | |
| 	Json::StyledWriter writer;
 | |
| 	std::string JsonData = writer.write( root );
 | |
| 
 | |
| 	// Get correct filename
 | |
| 	std::string FileName = a_FileName;
 | |
| 	std::string FileNameWithoutExt = FileName.substr(0, FileName.find_last_of(".") );
 | |
| 	std::string FileNameJson = FileNameWithoutExt + ".json";
 | |
| 
 | |
| 	// Write to file
 | |
| 	if (!f.Open(FileNameJson.c_str(), cFile::fmWrite))
 | |
| 	{
 | |
| 		return;
 | |
| 	}
 | |
| 	if (f.Write(JsonData.c_str(), JsonData.size()) != JsonData.size())
 | |
| 	{
 | |
| 		LOGERROR("ERROR WRITING PLAYER JSON TO FILE \"%s\"", FileNameJson.c_str());
 | |
| 		return;
 | |
| 	}
 | |
| 	f.Close();
 | |
| 
 | |
| 	// Delete old format file, only do this when conversion has succeeded
 | |
| 	if (std::remove(a_FileName) != 0)
 | |
| 	{
 | |
| 		LOGERROR("COULD NOT DELETE old format file \"%s\"", a_FileName);
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	LOGINFO("Successfully converted binary to Json \"%s\"", FileNameJson.c_str() );
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |