forked from mmccoo/minecraft_mmccoo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ResourceVectors.cpp
84 lines (61 loc) · 2.25 KB
/
ResourceVectors.cpp
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
#include <ResourceVectors.h>
#include <sstream>
#include <fstream>
//https://github.com/nlohmann/json#json-as-first-class-data-type
// this json header is copied from the above github. I don't know how to include
// a single file as a submodule and the git report itself is pretty large.
#include <nlohmann/json.hpp>
std::set<std::string> rare_interesting_resources = {
"minecraft:diamond_ore",
"minecraft:torch",
"minecraft:emerald_ore", // not sure this is the right name.
"minecraft:lapis_ore",
"minecraft:bee_nest",
"minecraft:bell",
};
ResourceVectors::ResourceVectors(MinecraftWorld& world)
{
for (auto scix : world.chunks_by_y) {
int chunkx = scix.first;
UNUSED(chunkx);
for (auto sciz : scix.second) {
int chunkz = sciz.first;
UNUSED(chunkz);
auto &te = world.top_earthly[chunkx][chunkz];
for (auto sciy : sciz.second) {
int chunky = sciy.first;
UNUSED(chunky);
auto sc = sciy.second;
for (auto iter=sc->begin(); iter!=sc->end(); ++iter) {
auto loc = *iter;
BlockType bt = BlockType::get_block_type_by_id(loc.type);
if (rare_interesting_resources.find(bt.get_name()) == rare_interesting_resources.end()) {
continue;
}
int rawx = loc.x - chunkx*16;
int rawz = loc.z - chunkz*16;
resources.push_back({loc.x, loc.y, loc.z, bt, loc.y > te[rawx][rawz]});
}
}
}
}
}
void ResourceVectors::write(std::string filename)
{
nlohmann::json top;
top["type"] = "FeatureCollection";
for(auto res : resources) {
nlohmann::json feature;
feature["type"] = "Feature";
feature["properties"]["coords"] = { res.x, res.y, res.z };
feature["properties"]["name"] = res.bt.get_name();
feature["properties"]["surface"] = res.isSurface;
feature["geometry"]["type"] = "Point";
feature["geometry"]["coordinates"] = { res.x, res.z };
top["features"].push_back(feature);
}
std::ofstream file;
file.open(filename);
file << top.dump(2);
file.close();
}