the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "net.minecraft.world.level.saveddata.h"
3#include "net.minecraft.world.level.storage.h"
4#include "net.minecraft.world.entity.ai.village.h"
5#include "com.mojang.nbt.h"
6#include "File.h"
7#include "SavedDataStorage.h"
8
9#include "ConsoleSaveFileIO.h"
10
11SavedDataStorage::SavedDataStorage(LevelStorage *levelStorage)
12{
13 /*
14 cache = new unordered_map<wstring, shared_ptr<SavedData> >;
15 savedDatas = new vector<shared_ptr<SavedData> >;
16 usedAuxIds = new unordered_map<wstring, short*>;
17 */
18
19 this->levelStorage = levelStorage;
20 loadAuxValues();
21}
22
23shared_ptr<SavedData> SavedDataStorage::get(const type_info& clazz, const wstring& id)
24{
25 AUTO_VAR(it, cache.find( id ));
26 if (it != cache.end()) return (*it).second;
27
28 shared_ptr<SavedData> data = nullptr;
29 if (levelStorage != NULL)
30 {
31 //File file = levelStorage->getDataFile(id);
32 ConsoleSavePath file = levelStorage->getDataFile(id);
33 if (!file.getName().empty() && levelStorage->getSaveFile()->doesFileExist( file ) )
34 {
35 // mob = dynamic_pointer_cast<Mob>(Mob::_class->newInstance( level ));
36 //data = clazz.getConstructor(String.class).newInstance(id);
37
38 if( clazz == typeid(MapItemSavedData) )
39 {
40 data = dynamic_pointer_cast<SavedData>( shared_ptr<MapItemSavedData>(new MapItemSavedData(id)) );
41 }
42 else if( clazz == typeid(Villages) )
43 {
44 data = dynamic_pointer_cast<SavedData>( shared_ptr<Villages>(new Villages(id) ) );
45 }
46 else if( clazz == typeid(StructureFeatureSavedData) )
47 {
48 data = dynamic_pointer_cast<SavedData>( shared_ptr<StructureFeatureSavedData>( new StructureFeatureSavedData(id) ) );
49 }
50 else
51 {
52 // Handling of new SavedData class required
53 __debugbreak();
54 }
55
56 ConsoleSaveFileInputStream fis = ConsoleSaveFileInputStream(levelStorage->getSaveFile(), file);
57 CompoundTag *root = NbtIo::readCompressed(&fis);
58 fis.close();
59
60 data->load(root->getCompound(L"data"));
61 }
62 }
63
64 if (data != NULL)
65 {
66 cache.insert( unordered_map<wstring, shared_ptr<SavedData> >::value_type( id , data ) );
67 savedDatas.push_back(data);
68 }
69 return data;
70}
71
72void SavedDataStorage::set(const wstring& id, shared_ptr<SavedData> data)
73{
74 if (data == NULL)
75 {
76 // TODO 4J Stu - throw new RuntimeException("Can't set null data");
77 assert( false );
78 }
79 AUTO_VAR(it, cache.find(id));
80 if ( it != cache.end() )
81 {
82 AUTO_VAR(it2, find( savedDatas.begin(), savedDatas.end(), it->second ));
83 if( it2 != savedDatas.end() )
84 {
85 savedDatas.erase( it2 );
86 }
87 cache.erase( it );
88 }
89 cache.insert( cacheMapType::value_type(id, data) );
90 savedDatas.push_back(data);
91}
92
93void SavedDataStorage::save()
94{
95 AUTO_VAR(itEnd, savedDatas.end());
96 for (AUTO_VAR(it, savedDatas.begin()); it != itEnd; it++)
97 {
98 shared_ptr<SavedData> data = *it; //savedDatas->at(i);
99 if (data->isDirty())
100 {
101 save(data);
102 data->setDirty(false);
103 }
104 }
105}
106
107void SavedDataStorage::save(shared_ptr<SavedData> data)
108{
109 if (levelStorage == NULL) return;
110 //File file = levelStorage->getDataFile(data->id);
111 ConsoleSavePath file = levelStorage->getDataFile(data->id);
112 if (!file.getName().empty())
113 {
114 CompoundTag *dataTag = new CompoundTag();
115 data->save(dataTag);
116
117 CompoundTag *tag = new CompoundTag();
118 tag->putCompound(L"data", dataTag);
119
120 ConsoleSaveFileOutputStream fos = ConsoleSaveFileOutputStream(levelStorage->getSaveFile(), file);
121 NbtIo::writeCompressed(tag, &fos);
122 fos.close();
123
124 delete tag;
125 }
126}
127
128void SavedDataStorage::loadAuxValues()
129{
130 usedAuxIds.clear();
131
132 if (levelStorage == NULL) return;
133 //File file = levelStorage->getDataFile(L"idcounts");
134 ConsoleSavePath file = levelStorage->getDataFile(L"idcounts");
135 if (!file.getName().empty() && levelStorage->getSaveFile()->doesFileExist( file ) )
136 {
137 ConsoleSaveFileInputStream fis = ConsoleSaveFileInputStream(levelStorage->getSaveFile(), file);
138 DataInputStream dis = DataInputStream(&fis);
139 CompoundTag *tags = NbtIo::read(&dis);
140 dis.close();
141
142 Tag *tag;
143 vector<Tag *> *allTags = tags->getAllTags();
144 AUTO_VAR(itEnd, allTags->end());
145 for (AUTO_VAR(it, allTags->begin()); it != itEnd; it++)
146 {
147 tag = *it; //tags->getAllTags()->at(i);
148
149 if (dynamic_cast<ShortTag *>(tag) != NULL)
150 {
151 ShortTag *sTag = (ShortTag *) tag;
152 wstring id = sTag->getName();
153 short val = sTag->data;
154 usedAuxIds.insert( uaiMapType::value_type( id, val ) );
155 }
156 }
157 delete allTags;
158 }
159}
160
161int SavedDataStorage::getFreeAuxValueFor(const wstring& id)
162{
163 AUTO_VAR(it, usedAuxIds.find( id ));
164 short val = 0;
165 if ( it != usedAuxIds.end() )
166 {
167 val = (*it).second;
168 val++;
169 }
170
171 usedAuxIds[id] = val;
172 if (levelStorage == NULL) return val;
173 //File file = levelStorage->getDataFile(L"idcounts");
174 ConsoleSavePath file = levelStorage->getDataFile(L"idcounts");
175 if (!file.getName().empty())
176 {
177 CompoundTag *tag = new CompoundTag();
178
179 // TODO 4J Stu - This was iterating over the keySet in Java, so potentially we are looking at more items?
180 AUTO_VAR(itEndAuxIds, usedAuxIds.end());
181 for(uaiMapType::iterator it2 = usedAuxIds.begin(); it2 != itEndAuxIds; it2++)
182 {
183 short value = it2->second;
184 tag->putShort( (wchar_t *) it2->first.c_str(), value);
185 }
186
187 ConsoleSaveFileOutputStream fos = ConsoleSaveFileOutputStream(levelStorage->getSaveFile(), file);
188 DataOutputStream dos = DataOutputStream(&fos);
189 NbtIo::write(tag, &dos);
190 dos.close();
191 }
192 return val;
193}
194
195// 4J Added
196int SavedDataStorage::getAuxValueForMap(PlayerUID xuid, int dimension, int centreXC, int centreZC, int scale)
197{
198 if( levelStorage == NULL )
199 {
200 switch(dimension)
201 {
202 case -1:
203 return MAP_NETHER_DEFAULT_INDEX;
204 case 1:
205 return MAP_END_DEFAULT_INDEX;
206 case 0:
207 default:
208 return MAP_OVERWORLD_DEFAULT_INDEX;
209 }
210 }
211 else
212 {
213 return levelStorage->getAuxValueForMap(xuid, dimension, centreXC, centreZC, scale);
214 }
215}