From f0a868411aae809de8742e2427ad0daeb0509e88 Mon Sep 17 00:00:00 2001 From: Fireblade <3+fireblade@noreply.neolegacy.dev> Date: Sat, 11 Jul 2026 21:48:52 -0400 Subject: [PATCH 1/2] fix: build failures --- Minecraft.Client/Logger.cpp | 11 ++++++++--- Minecraft.Server/cmake/sources/Common.cmake | 2 ++ Minecraft.World/IglooFeature.cpp | 17 +++++------------ cmake/ServerTarget.cmake | 2 ++ 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Minecraft.Client/Logger.cpp b/Minecraft.Client/Logger.cpp index fff8e1ff..d1a123c9 100644 --- a/Minecraft.Client/Logger.cpp +++ b/Minecraft.Client/Logger.cpp @@ -9,6 +9,11 @@ #include #include +// stop clang from overwriting cpuid +#if defined(__cpuid) +#undef __cpuid +#endif + static FILE *s_logFile = nullptr; static CRITICAL_SECTION s_cs; static bool s_csInit = false; @@ -76,9 +81,9 @@ static void getCpuName(char *buf, size_t size) { int regs[4] = {}; char name[49] = {}; - __cpuid(regs, 0x80000002); memcpy(name, regs, 16); - __cpuid(regs, 0x80000003); memcpy(name + 16, regs, 16); - __cpuid(regs, 0x80000004); memcpy(name + 32, regs, 16); + __cpuidex(regs, 0x80000002, 0); memcpy(name, regs, 16); + __cpuidex(regs, 0x80000003, 0); memcpy(name + 16, regs, 16); + __cpuidex(regs, 0x80000004, 0); memcpy(name + 32, regs, 16); name[48] = '\0'; const char *p = name; while (*p == ' ') p++; diff --git a/Minecraft.Server/cmake/sources/Common.cmake b/Minecraft.Server/cmake/sources/Common.cmake index 52b0e9a9..375aad5e 100644 --- a/Minecraft.Server/cmake/sources/Common.cmake +++ b/Minecraft.Server/cmake/sources/Common.cmake @@ -32,6 +32,8 @@ set(_MINECRAFT_SERVER_COMMON_ROOT "${_MS_SRC}/../Minecraft.Client/CaveSpiderRenderer.cpp" "${_MS_SRC}/../Minecraft.Client/ChatScreen.cpp" "${_MS_SRC}/../Minecraft.Client/ChestModel.cpp" + "${_MS_SRC}/../Minecraft.Client/Logger.cpp" + "${_MS_SRC}/../Minecraft.Client/Logger.h" "${_MS_SRC}/../Minecraft.Client/ChestRenderer.cpp" "${_MS_SRC}/../Minecraft.Client/ChickenModel.cpp" "${_MS_SRC}/../Minecraft.Client/ChickenRenderer.cpp" diff --git a/Minecraft.World/IglooFeature.cpp b/Minecraft.World/IglooFeature.cpp index 99422f2d..f8430da0 100644 --- a/Minecraft.World/IglooFeature.cpp +++ b/Minecraft.World/IglooFeature.cpp @@ -5,6 +5,7 @@ #include "Biome.h" #include "Item.h" #include "ItemInstance.h" +#include "LootTableManager.h" #include "WeighedTreasure.h" #include "Villager.h" #include "Zombie.h" @@ -144,18 +145,10 @@ void IglooFeature::placeBasement(Level *level, Random *random, int x, int y, int auto chestEntity = dynamic_pointer_cast(level->getTileEntity(x + 2, by + 1, rz - 2)); if (chestEntity) { - static WeighedTreasure *iglooTreasure[] = { - new WeighedTreasure(Item::coal_Id, 0, 1, 4, 15), - new WeighedTreasure(Item::apple_Id, 0, 1, 3, 15), - new WeighedTreasure(Item::wheat_Id, 0, 2, 3, 10), - new WeighedTreasure(Item::gold_nugget_Id, 0, 1, 3, 10), - new WeighedTreasure(Item::rotten_flesh_Id,0, 1, 1, 10), - new WeighedTreasure(Item::stone_axe_Id, 0, 1, 1, 2), - new WeighedTreasure(Item::emerald_Id, 0, 1, 1, 1), - }; - WeighedTreasureArray treasureArray(iglooTreasure, 7); - int rolls = 2 + random->nextInt(7); - WeighedTreasure::addChestItems(random, treasureArray, chestEntity, rolls); + std::vector drops = LootTableManager::Get().ResolveDrops( + "chests/igloo_chest", false, 0, + [random](int bound) { return random->nextInt(bound); }); + WeighedTreasure::addChestItems(random, drops, chestEntity); chestEntity->setItem(0, make_shared(Item::golden_apple_Id, 1, 0)); } diff --git a/cmake/ServerTarget.cmake b/cmake/ServerTarget.cmake index cadf0903..8fb7d283 100644 --- a/cmake/ServerTarget.cmake +++ b/cmake/ServerTarget.cmake @@ -83,6 +83,7 @@ function(configure_lce_server_target target) d3dcompiler XInput9_1_0 wsock32 + dbghelp legacy_stdio_definitions 4JLibs.${PLATFORM_NAME}.Input 4JLibs.${PLATFORM_NAME}.Profile @@ -97,6 +98,7 @@ function(configure_lce_server_target target) d3dcompiler XInput9_1_0 wsock32 + dbghelp legacy_stdio_definitions "${CMAKE_SOURCE_DIR}/Minecraft.Client/${PLATFORM_NAME}/4JLibs/libs/4J_Input.lib" "${CMAKE_SOURCE_DIR}/Minecraft.Client/${PLATFORM_NAME}/4JLibs/libs/4J_Storage.lib" From 48b80ba86539b5c48397d2d6f8c1e7571be69216 Mon Sep 17 00:00:00 2001 From: Fireblade <3+fireblade@noreply.neolegacy.dev> Date: Sun, 12 Jul 2026 01:00:58 -0400 Subject: [PATCH 2/2] fix: world format discrepancies --- .../GameRules/LevelGenerationOptions.cpp | 69 +++++++++++++++++++ Minecraft.Client/MinecraftServer.cpp | 6 +- Minecraft.World/ConsoleSaveFileOriginal.cpp | 7 +- Minecraft.World/RegionFileCache.cpp | 16 ++--- 4 files changed, 84 insertions(+), 14 deletions(-) diff --git a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp index b3d7f94f..e6d21735 100644 --- a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp +++ b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp @@ -455,6 +455,74 @@ unordered_map *LevelGenerationOptions::getUnfin void LevelGenerationOptions::loadBaseSaveData() { +#ifdef _WINDOWS64 + + int gameRulesCount = m_parentDLCPack ? m_parentDLCPack->getDLCItemsCount(DLCManager::e_DLCType_GameRulesHeader) : 0; + + wstring baseSave = getBaseSavePath(); + wstring packName = baseSave.substr(0, baseSave.find(L'.')); + + for (int i = 0; i < gameRulesCount; ++i) + { + DLCGameRulesHeader* dlcFile = static_cast(m_parentDLCPack->getFile(DLCManager::e_DLCType_GameRulesHeader, i)); + + if (!dlcFile->getGrfPath().empty()) + { + File grf(L"Windows64Media\\DLC\\" + packName + L"\\Data\\" + dlcFile->getGrfPath()); + + if (grf.exists()) + { + wstring path = grf.getPath(); + HANDLE fileHandle = CreateFileW(path.c_str(), GENERIC_READ, 0, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, nullptr); + + if (fileHandle != INVALID_HANDLE_VALUE) + { + DWORD dwFileSize = grf.length(); + DWORD bytesRead; + PBYTE pbData = new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(fileHandle, pbData, dwFileSize, &bytesRead, nullptr); + CloseHandle(fileHandle); + + if (bSuccess) + { + dlcFile->setGrfData(pbData, dwFileSize, m_stringTable); + app.m_gameRules.setLevelGenerationOptions(dlcFile->lgo); + } + delete[] pbData; + } + } + } + } + + if (requiresBaseSave() && !getBaseSavePath().empty()) + { + File save(L"Windows64Media\\DLC\\" + packName + L"\\Data\\" + baseSave); + + if (save.exists()) + { + wstring path = save.getPath(); + HANDLE fileHandle = CreateFileW(path.c_str(), GENERIC_READ, 0, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, nullptr); + + if (fileHandle != INVALID_HANDLE_VALUE) + { + DWORD dwFileSize = GetFileSize(fileHandle, nullptr); + DWORD bytesRead; + PBYTE pbData = new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(fileHandle, pbData, dwFileSize, &bytesRead, nullptr); + CloseHandle(fileHandle); + + if (bSuccess) + setBaseSaveData(pbData, dwFileSize); + else + delete[] pbData; + } + } + } + + setLoadedData(); + app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadTexturePack); + +#else int mountIndex = -1; if(m_parentDLCPack != nullptr) mountIndex = m_parentDLCPack->GetDLCMountIndex(); @@ -481,6 +549,7 @@ void LevelGenerationOptions::loadBaseSaveData() setLoadedData(); app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadTexturePack); } +#endif } int LevelGenerationOptions::packMounted(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask) diff --git a/Minecraft.Client/MinecraftServer.cpp b/Minecraft.Client/MinecraftServer.cpp index 78048d48..420bba64 100644 --- a/Minecraft.Client/MinecraftServer.cpp +++ b/Minecraft.Client/MinecraftServer.cpp @@ -968,7 +968,11 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring storage = shared_ptr(new McRegionLevelStorage(newFormatSave, File(L"."), name, true)); #else - storage = std::make_shared(new ConsoleSaveFileOriginal(L""), File(L"."), name, true); + ConsoleSaveFileOriginal* pSave = new ConsoleSaveFileOriginal(L""); + + pSave->ConvertToLocalPlatform(); + storage = std::make_shared(pSave, File(L"."), name, true); + #endif } diff --git a/Minecraft.World/ConsoleSaveFileOriginal.cpp b/Minecraft.World/ConsoleSaveFileOriginal.cpp index 4c8bf83a..108e02af 100644 --- a/Minecraft.World/ConsoleSaveFileOriginal.cpp +++ b/Minecraft.World/ConsoleSaveFileOriginal.cpp @@ -222,10 +222,7 @@ ConsoleSaveFileOriginal::ConsoleSaveFileOriginal(const wstring &fileName, LPVOID header.ReadHeader( pvSaveMem, plat ); - if (bLevelGenBaseSave) - { - header.AddFile(L"region_format_16"); - } + // fireblade: removed region_format_16 stamp } else { @@ -1261,4 +1258,4 @@ bool ConsoleSaveFileOriginal::hasPendingBackgroundSave() { return s_bgSaveActive.load(std::memory_order_acquire); } -#endif +#endif \ No newline at end of file diff --git a/Minecraft.World/RegionFileCache.cpp b/Minecraft.World/RegionFileCache.cpp index cc670f91..aabbdf63 100644 --- a/Minecraft.World/RegionFileCache.cpp +++ b/Minecraft.World/RegionFileCache.cpp @@ -11,6 +11,7 @@ bool RegionFileCache::useSplitSaves(ESavePlatform platform) { case SAVE_FILE_PLATFORM_XBONE: case SAVE_FILE_PLATFORM_PS4: + case SAVE_FILE_PLATFORM_WIN64: return true; default: return false; @@ -28,8 +29,11 @@ RegionFile *RegionFileCache::_getRegionFile(ConsoleSaveFile *saveFile, const wst //File file(regionDir, wstring(L"r.") + std::to_wstring(chunkX>>5) + L"." + std::to_wstring(chunkZ>>5) + L".mcr" ); MemSect(31); File file; - if(useSplitSaves(saveFile->getSavePlatform())) { + // fireblade: region format now decided by region_format_16 marker + // this allows dlc worlds to load any format, just like regular worlds can now do + + // perky please dont scream at me for doing such bool isNew = saveFile->doesFileExist(ConsoleSavePath(L"region_format_16")); if (isNew) @@ -37,10 +41,6 @@ RegionFile *RegionFileCache::_getRegionFile(ConsoleSaveFile *saveFile, const wst else file = File(prefix + wstring(L"r.") + std::to_wstring(chunkX >> 5) + L"." + std::to_wstring(chunkZ >> 5) + L".mcr"); } - else - { - file = File( prefix + wstring(L"r.") + std::to_wstring(chunkX>>5) + L"." + std::to_wstring(chunkZ>>5) + L".mcr" ); - } MemSect(0); RegionFile *ref = nullptr; @@ -96,7 +96,7 @@ DataInputStream *RegionFileCache::_getChunkDataInputStream(ConsoleSaveFile *save { RegionFile* r = _getRegionFile(saveFile, prefix, chunkX, chunkZ); bool isNew = saveFile->doesFileExist(ConsoleSavePath(L"region_format_16")); - if (useSplitSaves(saveFile->getSavePlatform()) && isNew) + if (isNew) { return r->getChunkDataInputStream(chunkX & 15, chunkZ & 15); } @@ -111,7 +111,7 @@ DataOutputStream *RegionFileCache::_getChunkDataOutputStream(ConsoleSaveFile *sa { RegionFile* r = _getRegionFile(saveFile, prefix, chunkX, chunkZ); bool isNew = saveFile->doesFileExist(ConsoleSavePath(L"region_format_16")); - if (useSplitSaves(saveFile->getSavePlatform()) && isNew) + if (isNew) { return r->getChunkDataOutputStream(chunkX & 15, chunkZ & 15); } @@ -126,4 +126,4 @@ DataOutputStream *RegionFileCache::_getChunkDataOutputStream(ConsoleSaveFile *sa RegionFileCache::~RegionFileCache() { _clear(); -} +} \ No newline at end of file