the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 215 lines 6.1 kB view raw
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}