aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/RegionFileCache.cpp
blob: bd6405fa324841d0f3512ab64eaa1402eb21deb9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#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;
	case SAVE_FILE_PLATFORM_WIN64:
	{
		LevelGenerationOptions* lgo = app.getLevelGenerationOptions();
		return (lgo != nullptr && lgo->isFromDLC());
	}
	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.") + std::to_wstring(chunkX>>5) + L"." + std::to_wstring(chunkZ>>5) + L".mcr" );
	MemSect(31);
	File file;
	if(useSplitSaves(saveFile->getSavePlatform()))
	{
		file = File( prefix + wstring(L"r.") + std::to_wstring(chunkX>>4) + L"." + std::to_wstring(chunkZ>>4) + 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;
    auto it = cache.find(file);
    if( it != cache.end() )
		ref = it->second;

	// 4J Jev, put back in.
    if (ref != nullptr)
	{
		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
{
	for(auto& it : cache)
	{
        RegionFile *regionFile = it.second;
        if (regionFile != nullptr)
		{
            regionFile->close();
        }
		delete regionFile;
	}
	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);
	}
}


RegionFileCache::~RegionFileCache()
{
	_clear();
}