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 }