1 /** 2 Copyright: Copyright (c) 2016-2017 Andrey Penechko. 3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0). 4 Authors: Andrey Penechko. 5 */ 6 module voxelman.world.storage.dimensionman; 7 8 import voxelman.log; 9 import voxelman.geometry.box; 10 import std.typecons : Nullable; 11 import voxelman.math; 12 import voxelman.core.config; 13 import voxelman.world.storage; 14 import voxelman.world.gen.generatorman; 15 16 struct DimensionInfo 17 { 18 string name; 19 ClientDimPos spawnPos; 20 21 Box borders = Box(ivec3(-int.max/2, -int.max/2, -int.max/2), ivec3(int.max, int.max, int.max)); 22 } 23 24 struct DimensionManager { 25 DimensionInfo[DimensionId] dimensions; 26 GeneratorManager generatorMan; 27 auto dbKey = IoKey("voxelman.world.storage.dimensionman"); 28 29 void load(ref PluginDataLoader loader) { 30 generatorMan.load(loader); 31 loader.readEntryDecoded(dbKey, dimensions); 32 } 33 34 void save(ref PluginDataSaver saver) { 35 generatorMan.save(saver); 36 saver.writeEntryEncoded(dbKey, dimensions); 37 } 38 39 bool contains(DimensionId dim) { 40 return !!(dim in dimensions); 41 } 42 43 /// returns internal pointer to hashmap. add/remove can invalidate pointers. 44 DimensionInfo* opIndex(DimensionId dim) { 45 return dim in dimensions; 46 } 47 48 DimensionInfo* getOrCreate(DimensionId dim) { 49 auto dimension = dim in dimensions; 50 if (dimension) 51 return dimension; 52 53 dimensions[dim] = DimensionInfo(); 54 return dim in dimensions; 55 } 56 57 void opIndexAssign(DimensionInfo value, DimensionId key) { 58 assert(key !in dimensions); 59 dimensions[key] = value; 60 } 61 62 void remove(DimensionId dim) { 63 dimensions.remove(dim); 64 } 65 66 Box dimensionBorders(DimensionId dim) { 67 auto dimension = dim in dimensions; 68 if (dimension) 69 return dimension.borders; 70 return DimensionInfo.init.borders; 71 } 72 }