diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/RegionFileCache.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.World/RegionFileCache.cpp')
| -rw-r--r-- | Minecraft.World/RegionFileCache.cpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/Minecraft.World/RegionFileCache.cpp b/Minecraft.World/RegionFileCache.cpp new file mode 100644 index 00000000..c21a6250 --- /dev/null +++ b/Minecraft.World/RegionFileCache.cpp @@ -0,0 +1,122 @@ +#include "stdafx.h" +#include "File.h" +#include "RegionFileCache.h" +#include "ConsoleSaveFileIO.h" + +RegionFileCache RegionFileCache::s_defaultCache; + +bool RegionFileCache::useSplitSaves(ESavePlatform platform) +{ + switch(platform) + { + case SAVE_FILE_PLATFORM_XBONE: + case SAVE_FILE_PLATFORM_PS4: + return true; + default: + return false; + }; +} + +RegionFile *RegionFileCache::_getRegionFile(ConsoleSaveFile *saveFile, const wstring &prefix, int chunkX, int chunkZ) // 4J - TODO was synchronized +{ + // 4J Jev - changed back to use of the File class. + //char file[MAX_PATH_SIZE]; + //sprintf(file,"%s\\region\\r.%d.%d.mcr",basePath,chunkX >> 5,chunkZ >> 5); + + //File regionDir(basePath, L"region"); + + //File file(regionDir, wstring(L"r.") + _toString(chunkX>>5) + L"." + _toString(chunkZ>>5) + L".mcr" ); + MemSect(31); + File file; + if(useSplitSaves(saveFile->getSavePlatform())) + { + file = File( prefix + wstring(L"r.") + _toString(chunkX>>4) + L"." + _toString(chunkZ>>4) + L".mcr" ); + } + else + { + file = File( prefix + wstring(L"r.") + _toString(chunkX>>5) + L"." + _toString(chunkZ>>5) + L".mcr" ); + } + MemSect(0); + + RegionFile *ref = NULL; + AUTO_VAR(it, cache.find(file)); + if( it != cache.end() ) + ref = it->second; + + // 4J Jev, put back in. + if (ref != NULL) + { + return ref; + } + + // 4J Stu - Remove for new save files + /* + if (!regionDir.exists()) + { + regionDir.mkdirs(); + } + */ + if (cache.size() >= MAX_CACHE_SIZE) + { + _clear(); + } + + RegionFile *reg = new RegionFile(saveFile, &file); + cache[file] = reg; // 4J - this was originally a softReferenc + return reg; + +} + +void RegionFileCache::_clear() // 4J - TODO was synchronized +{ + AUTO_VAR(itEnd, cache.end()); + for( AUTO_VAR(it, cache.begin()); it != itEnd; it++ ) + { + // 4J - removed try/catch +// try { + RegionFile *regionFile = it->second; + if (regionFile != NULL) + { + regionFile->close(); + } + delete regionFile; +// } catch (IOException e) { +// e.printStackTrace(); +// } + } + cache.clear(); +} + +int RegionFileCache::_getSizeDelta(ConsoleSaveFile *saveFile, const wstring &prefix, int chunkX, int chunkZ) +{ + RegionFile *r = _getRegionFile(saveFile, prefix, chunkX, chunkZ); + return r->getSizeDelta(); +} + +DataInputStream *RegionFileCache::_getChunkDataInputStream(ConsoleSaveFile *saveFile, const wstring &prefix, int chunkX, int chunkZ) +{ + RegionFile* r = _getRegionFile(saveFile, prefix, chunkX, chunkZ); + if(useSplitSaves(saveFile->getSavePlatform())) + { + return r->getChunkDataInputStream(chunkX & 15, chunkZ & 15); + } + else + { + + return r->getChunkDataInputStream(chunkX & 31, chunkZ & 31); + } +} + +DataOutputStream *RegionFileCache::_getChunkDataOutputStream(ConsoleSaveFile *saveFile, const wstring &prefix, int chunkX, int chunkZ) +{ + RegionFile* r = _getRegionFile(saveFile, prefix, chunkX, chunkZ); + if(useSplitSaves(saveFile->getSavePlatform())) + { + return r->getChunkDataOutputStream(chunkX & 15, chunkZ & 15); + } + else + { + + return r->getChunkDataOutputStream(chunkX & 31, chunkZ & 31); + } +} |
