mirror of
				https://github.com/DarkflameUniverse/DarkflameServer.git
				synced 2025-11-03 22:21:59 +00:00 
			
		
		
		
	gaming
This commit is contained in:
		@@ -28,19 +28,17 @@ FdbToSqlite::Convert::Convert(std::string binaryOutPath) {
 | 
			
		||||
	this->m_BinaryOutPath = binaryOutPath;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool FdbToSqlite::Convert::ConvertDatabase(AssetMemoryBuffer& buffer) {
 | 
			
		||||
bool FdbToSqlite::Convert::ConvertDatabase(AssetStream& buffer) {
 | 
			
		||||
	if (m_ConversionStarted) return false;
 | 
			
		||||
 | 
			
		||||
	std::istream cdClientBuffer(&buffer);
 | 
			
		||||
 | 
			
		||||
	this->m_ConversionStarted = true;
 | 
			
		||||
	try {
 | 
			
		||||
		CDClientDatabase::Connect(m_BinaryOutPath + "/CDServer.sqlite");
 | 
			
		||||
 | 
			
		||||
		CDClientDatabase::ExecuteQuery("BEGIN TRANSACTION;");
 | 
			
		||||
 | 
			
		||||
		int32_t numberOfTables = ReadInt32(cdClientBuffer);
 | 
			
		||||
		ReadTables(numberOfTables, cdClientBuffer);
 | 
			
		||||
		int32_t numberOfTables = ReadInt32(buffer);
 | 
			
		||||
		ReadTables(numberOfTables, buffer);
 | 
			
		||||
 | 
			
		||||
		CDClientDatabase::ExecuteQuery("COMMIT;");
 | 
			
		||||
	} catch (CppSQLite3Exception& e) {
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
#include <iosfwd>
 | 
			
		||||
#include <map>
 | 
			
		||||
 | 
			
		||||
class AssetMemoryBuffer;
 | 
			
		||||
#include "AssetManager.h"
 | 
			
		||||
 | 
			
		||||
enum class eSqliteDataType : int32_t;
 | 
			
		||||
 | 
			
		||||
@@ -27,7 +27,7 @@ namespace FdbToSqlite {
 | 
			
		||||
		 * 
 | 
			
		||||
		 * @return true if the database was converted properly, false otherwise. 
 | 
			
		||||
		 */
 | 
			
		||||
		bool ConvertDatabase(AssetMemoryBuffer& buffer);
 | 
			
		||||
		bool ConvertDatabase(AssetStream& buffer);
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * @brief Reads a 32 bit int from the fdb file.
 | 
			
		||||
 
 | 
			
		||||
@@ -152,13 +152,12 @@ bool AssetManager::GetFile(const char* name, char** data, uint32_t* len) {
 | 
			
		||||
	return success;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AssetMemoryBuffer AssetManager::GetFileAsBuffer(const char* name) {
 | 
			
		||||
	char* buf;
 | 
			
		||||
	uint32_t len;
 | 
			
		||||
AssetStream AssetManager::GetFile(const char* name) {
 | 
			
		||||
	char* buf; uint32_t len;
 | 
			
		||||
 | 
			
		||||
	bool success = this->GetFile(name, &buf, &len);
 | 
			
		||||
 | 
			
		||||
	return AssetMemoryBuffer(buf, len, success);
 | 
			
		||||
	return AssetStream(buf, len, success);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t AssetManager::crc32b(uint32_t base, uint8_t* message, size_t l) {
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,10 @@ struct AssetMemoryBuffer : std::streambuf {
 | 
			
		||||
		this->setg(base, base, base + n);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	~AssetMemoryBuffer() {
 | 
			
		||||
		free(m_Base);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pos_type seekpos(pos_type sp, std::ios_base::openmode which) override {
 | 
			
		||||
		return seekoff(sp - pos_type(off_type(0)), std::ios_base::beg, which);
 | 
			
		||||
	}
 | 
			
		||||
@@ -40,9 +44,17 @@ struct AssetMemoryBuffer : std::streambuf {
 | 
			
		||||
			setg(eback(), eback() + off, egptr());
 | 
			
		||||
		return gptr() - eback();
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
	void close() {
 | 
			
		||||
		free(m_Base);
 | 
			
		||||
struct AssetStream : std::istream {
 | 
			
		||||
	AssetStream(char* base, std::ptrdiff_t n, bool success) : std::istream(new AssetMemoryBuffer(base, n, success)) {}
 | 
			
		||||
 | 
			
		||||
	~AssetStream() {
 | 
			
		||||
		delete rdbuf();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	operator bool() {
 | 
			
		||||
		return reinterpret_cast<AssetMemoryBuffer*>(rdbuf())->m_Success;
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -56,7 +68,7 @@ public:
 | 
			
		||||
 | 
			
		||||
	bool HasFile(const char* name);
 | 
			
		||||
	bool GetFile(const char* name, char** data, uint32_t* len);
 | 
			
		||||
	AssetMemoryBuffer GetFileAsBuffer(const char* name);
 | 
			
		||||
	AssetStream GetFile(const char* name);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	void LoadPackIndex();
 | 
			
		||||
 
 | 
			
		||||
@@ -44,57 +44,53 @@ inline void StripCR(std::string& str) {
 | 
			
		||||
void UserManager::Initialize() {
 | 
			
		||||
	std::string line;
 | 
			
		||||
 | 
			
		||||
	AssetMemoryBuffer fnBuff = Game::assetManager->GetFileAsBuffer("names/minifigname_first.txt");
 | 
			
		||||
	if (!fnBuff.m_Success) {
 | 
			
		||||
	auto fnStream = Game::assetManager->GetFile("names/minifigname_first.txt");
 | 
			
		||||
	if (!fnStream) {
 | 
			
		||||
		LOG("Failed to load %s", (Game::assetManager->GetResPath() / "names/minifigname_first.txt").string().c_str());
 | 
			
		||||
		throw std::runtime_error("Aborting initialization due to missing minifigure name file.");
 | 
			
		||||
	}
 | 
			
		||||
	std::istream fnStream = std::istream(&fnBuff);
 | 
			
		||||
 | 
			
		||||
	while (std::getline(fnStream, line, '\n')) {
 | 
			
		||||
		std::string name = line;
 | 
			
		||||
		StripCR(name);
 | 
			
		||||
		m_FirstNames.push_back(name);
 | 
			
		||||
	}
 | 
			
		||||
	fnBuff.close();
 | 
			
		||||
 | 
			
		||||
	AssetMemoryBuffer mnBuff = Game::assetManager->GetFileAsBuffer("names/minifigname_middle.txt");
 | 
			
		||||
	if (!mnBuff.m_Success) {
 | 
			
		||||
	auto mnStream = Game::assetManager->GetFile("names/minifigname_middle.txt");
 | 
			
		||||
	if (!mnStream) {
 | 
			
		||||
		LOG("Failed to load %s", (Game::assetManager->GetResPath() / "names/minifigname_middle.txt").string().c_str());
 | 
			
		||||
		throw std::runtime_error("Aborting initialization due to missing minifigure name file.");
 | 
			
		||||
	}
 | 
			
		||||
	std::istream mnStream = std::istream(&mnBuff);
 | 
			
		||||
 | 
			
		||||
	while (std::getline(mnStream, line, '\n')) {
 | 
			
		||||
		std::string name = line;
 | 
			
		||||
		StripCR(name);
 | 
			
		||||
		m_MiddleNames.push_back(name);
 | 
			
		||||
	}
 | 
			
		||||
	mnBuff.close();
 | 
			
		||||
 | 
			
		||||
	AssetMemoryBuffer lnBuff = Game::assetManager->GetFileAsBuffer("names/minifigname_last.txt");
 | 
			
		||||
	if (!lnBuff.m_Success) {
 | 
			
		||||
	auto lnStream = Game::assetManager->GetFile("names/minifigname_last.txt");
 | 
			
		||||
	if (!lnStream) {
 | 
			
		||||
		LOG("Failed to load %s", (Game::assetManager->GetResPath() / "names/minifigname_last.txt").string().c_str());
 | 
			
		||||
		throw std::runtime_error("Aborting initialization due to missing minifigure name file.");
 | 
			
		||||
	}
 | 
			
		||||
	std::istream lnStream = std::istream(&lnBuff);
 | 
			
		||||
 | 
			
		||||
	while (std::getline(lnStream, line, '\n')) {
 | 
			
		||||
		std::string name = line;
 | 
			
		||||
		StripCR(name);
 | 
			
		||||
		m_LastNames.push_back(name);
 | 
			
		||||
	}
 | 
			
		||||
	lnBuff.close();
 | 
			
		||||
 | 
			
		||||
	//Load our pre-approved names:
 | 
			
		||||
	AssetMemoryBuffer chatListBuff = Game::assetManager->GetFileAsBuffer("chatplus_en_us.txt");
 | 
			
		||||
	if (!chatListBuff.m_Success) {
 | 
			
		||||
	// Load our pre-approved names:
 | 
			
		||||
	auto chatListStream = Game::assetManager->GetFile("chatplus_en_us.txt");
 | 
			
		||||
	if (!chatListStream) {
 | 
			
		||||
		LOG("Failed to load %s", (Game::assetManager->GetResPath() / "chatplus_en_us.txt").string().c_str());
 | 
			
		||||
		throw std::runtime_error("Aborting initialization due to missing chat whitelist file.");
 | 
			
		||||
	}
 | 
			
		||||
	std::istream chatListStream = std::istream(&chatListBuff);
 | 
			
		||||
 | 
			
		||||
	while (std::getline(chatListStream, line, '\n')) {
 | 
			
		||||
		StripCR(line);
 | 
			
		||||
		m_PreapprovedNames.push_back(line);
 | 
			
		||||
	}
 | 
			
		||||
	chatListBuff.close();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
UserManager::~UserManager() {
 | 
			
		||||
@@ -207,7 +203,7 @@ void UserManager::RequestCharacterList(const SystemAddress& sysAddr) {
 | 
			
		||||
		chars[i]->SaveXMLToDatabase();
 | 
			
		||||
 | 
			
		||||
		chars[i]->GetEntity()->SetCharacter(nullptr);
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		delete chars[i];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -423,25 +423,16 @@ void Item::DisassembleModel(uint32_t numToDismantle) {
 | 
			
		||||
	if (renderAssetSplit.empty()) return;
 | 
			
		||||
 | 
			
		||||
	std::string lxfmlPath = "BrickModels" + lxfmlFolderName + "/" + GeneralUtils::SplitString(renderAssetSplit.back(), '.').at(0) + ".lxfml";
 | 
			
		||||
	auto buffer = Game::assetManager->GetFileAsBuffer(lxfmlPath.c_str());
 | 
			
		||||
	auto file = Game::assetManager->GetFile(lxfmlPath.c_str());
 | 
			
		||||
 | 
			
		||||
	if (!buffer.m_Success) {
 | 
			
		||||
	if (!file) {
 | 
			
		||||
		LOG("Failed to load %s to disassemble model into bricks, check that this file exists", lxfmlPath.c_str());
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::istream file(&buffer);
 | 
			
		||||
 | 
			
		||||
	if (!file.good()) {
 | 
			
		||||
		buffer.close();
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::stringstream data;
 | 
			
		||||
	data << file.rdbuf();
 | 
			
		||||
 | 
			
		||||
	buffer.close();
 | 
			
		||||
 | 
			
		||||
	uint32_t fileSize;
 | 
			
		||||
	file.seekg(0, std::ios::end);
 | 
			
		||||
	fileSize = static_cast<uint32_t>(file.tellg());
 | 
			
		||||
 
 | 
			
		||||
@@ -324,14 +324,9 @@ void ControlBehaviors::ProcessCommand(Entity* modelEntity, const SystemAddress&
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ControlBehaviors::ControlBehaviors() {
 | 
			
		||||
	auto blocksDefStreamBuffer = Game::assetManager->GetFileAsBuffer("ui\\ingame\\blocksdef.xml");
 | 
			
		||||
	if (!blocksDefStreamBuffer.m_Success) {
 | 
			
		||||
		LOG("failed to open blocksdef");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	std::istream blocksBuffer(&blocksDefStreamBuffer);
 | 
			
		||||
	if (!blocksBuffer.good()) {
 | 
			
		||||
		LOG("Blocks buffer is not good!");
 | 
			
		||||
	auto blocksBuffer = Game::assetManager->GetFile("ui\\ingame\\blocksdef.xml");
 | 
			
		||||
	if (!blocksBuffer) {
 | 
			
		||||
		LOG("Failed to open blocksdef.xml");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -342,7 +337,7 @@ ControlBehaviors::ControlBehaviors() {
 | 
			
		||||
	std::string buffer{};
 | 
			
		||||
	bool commentBlockStart = false;
 | 
			
		||||
	while (std::getline(blocksBuffer, read)) {
 | 
			
		||||
		// tinyxml2 should handle comment blocks but the client has one that fails the processing.  
 | 
			
		||||
		// tinyxml2 should handle comment blocks but the client has one that fails the processing.
 | 
			
		||||
		// This preprocessing just removes all comments from the read file out of an abundance of caution.
 | 
			
		||||
		if (read.find("<!--") != std::string::npos) {
 | 
			
		||||
			commentBlockStart = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -17,26 +17,18 @@ const BrickList& BrickDatabase::GetBricks(const LxfmlPath& lxfmlPath) {
 | 
			
		||||
		return cached->second;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	AssetMemoryBuffer buffer = Game::assetManager->GetFileAsBuffer((lxfmlPath).c_str());
 | 
			
		||||
	auto file = Game::assetManager->GetFile((lxfmlPath).c_str());
 | 
			
		||||
 | 
			
		||||
	if (!buffer.m_Success) {
 | 
			
		||||
		return emptyCache;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::istream file(&buffer);
 | 
			
		||||
	if (!file.good()) {
 | 
			
		||||
	if (!file) {
 | 
			
		||||
		return emptyCache;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::stringstream data;
 | 
			
		||||
	data << file.rdbuf();
 | 
			
		||||
	if (data.str().empty()) {
 | 
			
		||||
		buffer.close();
 | 
			
		||||
		return emptyCache;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	buffer.close();
 | 
			
		||||
 | 
			
		||||
	auto* doc = new tinyxml2::XMLDocument();
 | 
			
		||||
	if (doc->Parse(data.str().c_str(), data.str().size()) != 0) {
 | 
			
		||||
		delete doc;
 | 
			
		||||
 
 | 
			
		||||
@@ -591,15 +591,13 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit
 | 
			
		||||
		if (args[0].find("/") != std::string::npos) return;
 | 
			
		||||
		if (args[0].find("\\") != std::string::npos) return;
 | 
			
		||||
 | 
			
		||||
		auto buf = Game::assetManager->GetFileAsBuffer(("macros/" + args[0] + ".scm").c_str());
 | 
			
		||||
		auto infile = Game::assetManager->GetFile(("macros/" + args[0] + ".scm").c_str());
 | 
			
		||||
 | 
			
		||||
		if (!buf.m_Success) {
 | 
			
		||||
		if (!infile) {
 | 
			
		||||
			ChatPackets::SendSystemMessage(sysAddr, u"Unknown macro! Is the filename right?");
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		std::istream infile(&buf);
 | 
			
		||||
 | 
			
		||||
		if (infile.good()) {
 | 
			
		||||
			std::string line;
 | 
			
		||||
			while (std::getline(infile, line)) {
 | 
			
		||||
@@ -609,8 +607,6 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit
 | 
			
		||||
			ChatPackets::SendSystemMessage(sysAddr, u"Unknown macro! Is the filename right?");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		buf.close();
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,17 +19,14 @@
 | 
			
		||||
Level::Level(Zone* parentZone, const std::string& filepath) {
 | 
			
		||||
	m_ParentZone = parentZone;
 | 
			
		||||
 | 
			
		||||
	auto buffer = Game::assetManager->GetFileAsBuffer(filepath.c_str());
 | 
			
		||||
	auto stream = Game::assetManager->GetFile(filepath.c_str());
 | 
			
		||||
 | 
			
		||||
	if (!buffer.m_Success) {
 | 
			
		||||
	if (!stream) {
 | 
			
		||||
		LOG("Failed to load %s", filepath.c_str());
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::istream file(&buffer);
 | 
			
		||||
	ReadChunks(file);
 | 
			
		||||
 | 
			
		||||
	buffer.close();
 | 
			
		||||
	
 | 
			
		||||
	ReadChunks(stream);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Level::MakeSpawner(SceneObject obj) {
 | 
			
		||||
 
 | 
			
		||||
@@ -45,14 +45,13 @@ void Zone::LoadZoneIntoMemory() {
 | 
			
		||||
	m_ZonePath = m_ZoneFilePath.substr(0, m_ZoneFilePath.rfind('/') + 1);
 | 
			
		||||
	if (m_ZoneFilePath == "ERR") return;
 | 
			
		||||
 | 
			
		||||
	AssetMemoryBuffer buffer = Game::assetManager->GetFileAsBuffer(m_ZoneFilePath.c_str());
 | 
			
		||||
	auto file = Game::assetManager->GetFile(m_ZoneFilePath.c_str());
 | 
			
		||||
 | 
			
		||||
	if (!buffer.m_Success) {
 | 
			
		||||
	if (!file) {
 | 
			
		||||
		LOG("Failed to load %s", m_ZoneFilePath.c_str());
 | 
			
		||||
		throw std::runtime_error("Aborting Zone loading due to no Zone File.");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::istream file(&buffer);
 | 
			
		||||
	if (file) {
 | 
			
		||||
		BinaryIO::BinaryRead(file, m_FileFormatVersion);
 | 
			
		||||
 | 
			
		||||
@@ -148,9 +147,8 @@ void Zone::LoadZoneIntoMemory() {
 | 
			
		||||
	} else {
 | 
			
		||||
		LOG("Failed to open: %s", m_ZoneFilePath.c_str());
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	m_ZonePath = m_ZoneFilePath.substr(0, m_ZoneFilePath.rfind('/') + 1);
 | 
			
		||||
 | 
			
		||||
	buffer.close();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string Zone::GetFilePathForZoneID() {
 | 
			
		||||
@@ -243,23 +241,33 @@ void Zone::LoadScene(std::istream& file) {
 | 
			
		||||
	m_Scenes.insert(std::make_pair(lwoSceneID, scene));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
<<<<<<< Updated upstream
 | 
			
		||||
void Zone::LoadLUTriggers(std::string triggerFile, SceneRef& scene) {
 | 
			
		||||
	auto buffer = Game::assetManager->GetFileAsBuffer((m_ZonePath + triggerFile).c_str());
 | 
			
		||||
=======
 | 
			
		||||
std::vector<LUTriggers::Trigger*> Zone::LoadLUTriggers(std::string triggerFile, LWOSCENEID sceneID) {
 | 
			
		||||
	std::vector<LUTriggers::Trigger*> lvlTriggers;
 | 
			
		||||
 | 
			
		||||
	if (!buffer.m_Success) {
 | 
			
		||||
	auto file = Game::assetManager->GetFile((m_ZonePath + triggerFile).c_str());
 | 
			
		||||
>>>>>>> Stashed changes
 | 
			
		||||
 | 
			
		||||
	if (!file) {
 | 
			
		||||
		LOG("Failed to load %s from disk. Skipping loading triggers", (m_ZonePath + triggerFile).c_str());
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::istream file(&buffer);
 | 
			
		||||
	
 | 
			
		||||
	std::stringstream data;
 | 
			
		||||
	data << file.rdbuf();
 | 
			
		||||
 | 
			
		||||
<<<<<<< Updated upstream
 | 
			
		||||
	buffer.close();
 | 
			
		||||
 | 
			
		||||
	data.seekg(0, std::ios::end);
 | 
			
		||||
	int32_t size = data.tellg();
 | 
			
		||||
	data.seekg(0, std::ios::beg);
 | 
			
		||||
=======
 | 
			
		||||
	if (data.str().size() == 0) return lvlTriggers;
 | 
			
		||||
>>>>>>> Stashed changes
 | 
			
		||||
 | 
			
		||||
	if (size == 0) return;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user