Skip to content

Commit b67f37f

Browse files
committedDec 27, 2014
Redefine NodeResolver interface and replace with callback mechanism
1 parent 3ea5ed4 commit b67f37f

16 files changed

+264
-350
lines changed
 

‎src/mapgen.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ void GenerateNotifier::getEvents(
384384

385385
GenElementManager::GenElementManager(IGameDef *gamedef)
386386
{
387-
m_resolver = gamedef->getNodeDefManager()->getResolver();
387+
m_ndef = gamedef->getNodeDefManager();
388388
}
389389

390390

‎src/mapgen.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ class GenElementManager {
192192
virtual GenElement *getByName(const std::string &name);
193193

194194
protected:
195-
NodeResolver *m_resolver;
195+
INodeDefManager *m_ndef;
196196
std::vector<GenElement *> m_elements;
197197
};
198198

‎src/mg_biome.cpp

+25-15
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,14 @@ BiomeManager::BiomeManager(IGameDef *gamedef) :
4848
b->heat_point = 0.0;
4949
b->humidity_point = 0.0;
5050

51-
m_resolver->addNode("air", "", CONTENT_AIR, &b->c_top);
52-
m_resolver->addNode("air", "", CONTENT_AIR, &b->c_filler);
53-
m_resolver->addNode("mapgen_stone", "", CONTENT_AIR, &b->c_stone);
54-
m_resolver->addNode("mapgen_water_source", "", CONTENT_AIR, &b->c_water);
55-
m_resolver->addNode("air", "", CONTENT_AIR, &b->c_dust);
56-
m_resolver->addNode("mapgen_water_source", "", CONTENT_AIR, &b->c_dust_water);
51+
NodeResolveInfo *nri = new NodeResolveInfo(b);
52+
nri->nodenames.push_back("air");
53+
nri->nodenames.push_back("air");
54+
nri->nodenames.push_back("mapgen_stone");
55+
nri->nodenames.push_back("mapgen_water_source");
56+
nri->nodenames.push_back("air");
57+
nri->nodenames.push_back("mapgen_water_source");
58+
m_ndef->pendNodeResolve(nri);
5759

5860
add(b);
5961
}
@@ -102,18 +104,26 @@ Biome *BiomeManager::getBiome(float heat, float humidity, s16 y)
102104

103105
void BiomeManager::clear()
104106
{
107+
105108
for (size_t i = 1; i < m_elements.size(); i++) {
106109
Biome *b = (Biome *)m_elements[i];
107-
if (!b)
108-
continue;
109-
110-
m_resolver->cancelNode(&b->c_top);
111-
m_resolver->cancelNode(&b->c_filler);
112-
m_resolver->cancelNode(&b->c_stone);
113-
m_resolver->cancelNode(&b->c_water);
114-
m_resolver->cancelNode(&b->c_dust);
115-
m_resolver->cancelNode(&b->c_dust_water);
110+
delete b;
116111
}
112+
117113
m_elements.resize(1);
118114
}
119115

116+
117+
///////////////////////////////////////////////////////////////////////////////
118+
119+
120+
void Biome::resolveNodeNames(NodeResolveInfo *nri)
121+
{
122+
m_ndef->getIdFromResolveInfo(nri, "mapgen_dirt_with_grass", CONTENT_AIR, c_top);
123+
m_ndef->getIdFromResolveInfo(nri, "mapgen_dirt", CONTENT_AIR, c_filler);
124+
m_ndef->getIdFromResolveInfo(nri, "mapgen_stone", CONTENT_AIR, c_stone);
125+
m_ndef->getIdFromResolveInfo(nri, "mapgen_water_source", CONTENT_AIR, c_water);
126+
m_ndef->getIdFromResolveInfo(nri, "air", CONTENT_IGNORE, c_dust);
127+
m_ndef->getIdFromResolveInfo(nri, "mapgen_water_source", CONTENT_IGNORE, c_dust_water);
128+
}
129+

‎src/mg_biome.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ enum BiomeType
3333
BIOME_TYPE_FLAT
3434
};
3535

36-
class Biome : public GenElement {
36+
class Biome : public GenElement, public NodeResolver {
3737
public:
3838
u32 flags;
3939

@@ -51,6 +51,8 @@ class Biome : public GenElement {
5151
s16 height_max;
5252
float heat_point;
5353
float humidity_point;
54+
55+
virtual void resolveNodeNames(NodeResolveInfo *nri);
5456
};
5557

5658
class BiomeManager : public GenElementManager {

‎src/mg_decoration.cpp

+15-11
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,7 @@ void DecorationManager::clear()
6565
{
6666
for (size_t i = 0; i < m_elements.size(); i++) {
6767
Decoration *deco = (Decoration *)m_elements[i];
68-
if (!deco)
69-
continue;
70-
71-
deco->dropResolverEntries(m_resolver);
68+
delete deco;
7269
}
7370
m_elements.clear();
7471
}
@@ -91,6 +88,12 @@ Decoration::~Decoration()
9188
}
9289

9390

91+
void Decoration::resolveNodeNames(NodeResolveInfo *nri)
92+
{
93+
m_ndef->getIdsFromResolveInfo(nri, c_place_on);
94+
}
95+
96+
9497
size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
9598
{
9699
PseudoRandom ps(blockseed + 53);
@@ -229,6 +232,14 @@ void Decoration::placeCutoffs(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
229232
///////////////////////////////////////////////////////////////////////////////
230233

231234

235+
void DecoSimple::resolveNodeNames(NodeResolveInfo *nri)
236+
{
237+
Decoration::resolveNodeNames(nri);
238+
m_ndef->getIdsFromResolveInfo(nri, c_decos);
239+
m_ndef->getIdsFromResolveInfo(nri, c_spawnby);
240+
}
241+
242+
232243
bool DecoSimple::canPlaceDecoration(ManualMapVoxelManipulator *vm, v3s16 p)
233244
{
234245
// Don't bother if there aren't any decorations to place
@@ -310,13 +321,6 @@ int DecoSimple::getHeight()
310321
}
311322

312323

313-
void DecoSimple::dropResolverEntries(NodeResolver *resolver)
314-
{
315-
resolver->cancelNodeList(&c_decos);
316-
resolver->cancelNodeList(&c_spawnby);
317-
}
318-
319-
320324
///////////////////////////////////////////////////////////////////////////////
321325

322326

‎src/mg_decoration.h

+4-6
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ struct CutoffData {
5858
};
5959
#endif
6060

61-
class Decoration : public GenElement {
61+
class Decoration : public GenElement, public NodeResolver {
6262
public:
6363
INodeDefManager *ndef;
6464

@@ -76,12 +76,13 @@ class Decoration : public GenElement {
7676
Decoration();
7777
virtual ~Decoration();
7878

79+
virtual void resolveNodeNames(NodeResolveInfo *nri);
80+
7981
size_t placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
8082
size_t placeCutoffs(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
8183

8284
virtual size_t generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p) = 0;
8385
virtual int getHeight() = 0;
84-
virtual void dropResolverEntries(NodeResolver *resolver) {}
8586
};
8687

8788
class DecoSimple : public Decoration {
@@ -92,12 +93,11 @@ class DecoSimple : public Decoration {
9293
s16 deco_height_max;
9394
s16 nspawnby;
9495

95-
~DecoSimple() {}
96+
virtual void resolveNodeNames(NodeResolveInfo *nri);
9697

9798
bool canPlaceDecoration(ManualMapVoxelManipulator *vm, v3s16 p);
9899
virtual size_t generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p);
99100
virtual int getHeight();
100-
virtual void dropResolverEntries(NodeResolver *resolver);
101101
};
102102

103103
class DecoSchematic : public Decoration {
@@ -106,8 +106,6 @@ class DecoSchematic : public Decoration {
106106
Schematic *schematic;
107107
std::string filename;
108108

109-
~DecoSchematic() {}
110-
111109
virtual size_t generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p);
112110
virtual int getHeight();
113111
};

‎src/mg_ore.cpp

+20-5
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,7 @@ void OreManager::clear()
6464
{
6565
for (size_t i = 0; i < m_elements.size(); i++) {
6666
Ore *ore = (Ore *)m_elements[i];
67-
if (!ore)
68-
continue;
69-
70-
m_resolver->cancelNodeList(&ore->c_wherein);
71-
m_resolver->cancelNode(&ore->c_ore);
67+
delete ore;
7268
}
7369
m_elements.clear();
7470
}
@@ -84,6 +80,19 @@ Ore::Ore()
8480
}
8581

8682

83+
Ore::~Ore()
84+
{
85+
delete noise;
86+
}
87+
88+
89+
void Ore::resolveNodeNames(NodeResolveInfo *nri)
90+
{
91+
m_ndef->getIdFromResolveInfo(nri, "", CONTENT_AIR, c_ore);
92+
m_ndef->getIdsFromResolveInfo(nri, c_wherein);
93+
}
94+
95+
8796
size_t Ore::placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
8897
{
8998
int in_range = 0;
@@ -113,6 +122,9 @@ size_t Ore::placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
113122
}
114123

115124

125+
///////////////////////////////////////////////////////////////////////////////
126+
127+
116128
void OreScatter::generate(ManualMapVoxelManipulator *vm, int seed,
117129
u32 blockseed, v3s16 nmin, v3s16 nmax)
118130
{
@@ -151,6 +163,9 @@ void OreScatter::generate(ManualMapVoxelManipulator *vm, int seed,
151163
}
152164

153165

166+
///////////////////////////////////////////////////////////////////////////////
167+
168+
154169
void OreSheet::generate(ManualMapVoxelManipulator *vm, int seed,
155170
u32 blockseed, v3s16 nmin, v3s16 nmax)
156171
{

‎src/mg_ore.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ enum OreType {
5454

5555
extern FlagDesc flagdesc_ore[];
5656

57-
class Ore : public GenElement {
57+
class Ore : public GenElement, public NodeResolver {
5858
public:
5959
static const bool NEEDS_NOISE = false;
6060

@@ -72,6 +72,9 @@ class Ore : public GenElement {
7272
Noise *noise;
7373

7474
Ore();
75+
virtual ~Ore();
76+
77+
virtual void resolveNodeNames(NodeResolveInfo *nri);
7578

7679
size_t placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
7780
virtual void generate(ManualMapVoxelManipulator *vm, int seed,

‎src/mg_schematic.cpp

+17-7
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ Schematic::~Schematic()
5858
}
5959

6060

61+
void Schematic::resolveNodeNames(NodeResolveInfo *nri)
62+
{
63+
m_ndef->getIdsFromResolveInfo(nri, c_nodes);
64+
}
65+
66+
6167
void Schematic::updateContentIds()
6268
{
6369
if (flags & SCHEM_CIDS_UPDATED)
@@ -195,8 +201,7 @@ void Schematic::placeStructure(Map *map, v3s16 p, u32 flags,
195201

196202

197203
bool Schematic::loadSchematicFromFile(const char *filename,
198-
NodeResolver *resolver,
199-
std::map<std::string, std::string> &replace_names)
204+
INodeDefManager *ndef, std::map<std::string, std::string> &replace_names)
200205
{
201206
content_t cignore = CONTENT_IGNORE;
202207
bool have_cignore = false;
@@ -224,10 +229,9 @@ bool Schematic::loadSchematicFromFile(const char *filename,
224229
for (int y = 0; y != size.Y; y++)
225230
slice_probs[y] = (version >= 3) ? readU8(is) : MTSCHEM_PROB_ALWAYS;
226231

227-
int nodecount = size.X * size.Y * size.Z;
232+
NodeResolveInfo *nri = new NodeResolveInfo(this);
228233

229234
u16 nidmapcount = readU16(is);
230-
231235
for (int i = 0; i != nidmapcount; i++) {
232236
std::string name = deSerializeString(is);
233237
if (name == "ignore") {
@@ -241,16 +245,22 @@ bool Schematic::loadSchematicFromFile(const char *filename,
241245
if (it != replace_names.end())
242246
name = it->second;
243247

244-
resolver->addNodeList(name.c_str(), &c_nodes);
248+
nri->nodenames.push_back(name);
245249
}
246250

251+
nri->nodename_sizes.push_back(nidmapcount);
252+
ndef->pendNodeResolve(nri);
253+
254+
size_t nodecount = size.X * size.Y * size.Z;
255+
247256
delete []schemdata;
248257
schemdata = new MapNode[nodecount];
258+
249259
MapNode::deSerializeBulk(is, SER_FMT_VER_HIGHEST_READ, schemdata,
250-
nodecount, 2, 2, true);
260+
nodecount, 2, 2, true);
251261

252262
if (version == 1) { // fix up the probability values
253-
for (int i = 0; i != nodecount; i++) {
263+
for (size_t i = 0; i != nodecount; i++) {
254264
if (schemdata[i].param1 == 0)
255265
schemdata[i].param1 = MTSCHEM_PROB_ALWAYS;
256266
if (have_cignore && schemdata[i].getContent() == cignore)

‎src/mg_schematic.h

+6-4
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class NodeResolver;
4242
#define MTSCHEM_PROB_ALWAYS 0xFF
4343

4444

45-
class Schematic : public GenElement {
45+
class Schematic : public GenElement, public NodeResolver {
4646
public:
4747
std::vector<content_t> c_nodes;
4848

@@ -52,14 +52,16 @@ class Schematic : public GenElement {
5252
u8 *slice_probs;
5353

5454
Schematic();
55-
~Schematic();
55+
virtual ~Schematic();
56+
57+
virtual void resolveNodeNames(NodeResolveInfo *nri);
5658

5759
void updateContentIds();
5860

5961
void blitToVManip(v3s16 p, ManualMapVoxelManipulator *vm,
6062
Rotation rot, bool force_placement, INodeDefManager *ndef);
6163

62-
bool loadSchematicFromFile(const char *filename, NodeResolver *resolver,
64+
bool loadSchematicFromFile(const char *filename, INodeDefManager *ndef,
6365
std::map<std::string, std::string> &replace_names);
6466
void saveSchematicToFile(const char *filename, INodeDefManager *ndef);
6567
bool getSchematicFromMap(Map *map, v3s16 p1, v3s16 p2);
@@ -86,7 +88,7 @@ class SchematicManager : public GenElementManager {
8688
};
8789

8890
void build_nnlist_and_update_ids(MapNode *nodes, u32 nodecount,
89-
std::vector<content_t> *usednodes);
91+
std::vector<content_t> *usednodes);
9092

9193

9294
#endif

0 commit comments

Comments
 (0)
Please sign in to comment.