Skip to content

Commit 7c0e707

Browse files
committedApr 8, 2013
Add param2 field for ores, some minor fixes and misc. code cleanup
1 parent 4468ea8 commit 7c0e707

File tree

5 files changed

+33
-48
lines changed

5 files changed

+33
-48
lines changed
 

‎src/mapgen.cpp

+22-42
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ void Ore::resolveNodeNames(INodeDefManager *ndef) {
9494
}
9595

9696

97-
void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
97+
void Ore::placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
9898
int in_range = 0;
9999

100100
in_range |= (nmin.Y <= height_max && nmax.Y >= height_min);
@@ -105,9 +105,6 @@ void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
105105

106106
resolveNodeNames(mg->ndef);
107107

108-
MapNode n_ore(ore);
109-
ManualMapVoxelManipulator *vm = mg->vm;
110-
PseudoRandom pr(blockseed);
111108
int ymin, ymax;
112109

113110
if (in_range & ORE_RANGE_MIRROR) {
@@ -120,6 +117,17 @@ void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
120117
if (clust_size >= ymax - ymin + 1)
121118
return;
122119

120+
nmin.Y = ymin;
121+
nmax.Y = ymax;
122+
generate(mg->vm, mg->seed, blockseed, nmin, nmax);
123+
}
124+
125+
126+
void OreScatter::generate(ManualMapVoxelManipulator *vm, int seed,
127+
u32 blockseed, v3s16 nmin, v3s16 nmax) {
128+
PseudoRandom pr(blockseed);
129+
MapNode n_ore(ore, 0, ore_param2);
130+
123131
int volume = (nmax.X - nmin.X + 1) *
124132
(nmax.Y - nmin.Y + 1) *
125133
(nmax.Z - nmin.Z + 1);
@@ -129,10 +137,10 @@ void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
129137

130138
for (int i = 0; i != nclusters; i++) {
131139
int x0 = pr.range(nmin.X, nmax.X - csize + 1);
132-
int y0 = pr.range(ymin, ymax - csize + 1);
140+
int y0 = pr.range(nmin.Y, nmax.Y - csize + 1);
133141
int z0 = pr.range(nmin.Z, nmax.Z - csize + 1);
134142

135-
if (np && (NoisePerlin3D(np, x0, y0, z0, mg->seed) < nthresh))
143+
if (np && (NoisePerlin3D(np, x0, y0, z0, seed) < nthresh))
136144
continue;
137145

138146
for (int z1 = 0; z1 != csize; z1++)
@@ -149,53 +157,25 @@ void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
149157
}
150158

151159

152-
void OreSheet::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
153-
int in_range = 0;
154-
155-
in_range |= (nmin.Y <= height_max && nmax.Y >= height_min);
156-
if (flags & OREFLAG_ABSHEIGHT)
157-
in_range |= (nmin.Y >= -height_max && nmax.Y <= -height_min) << 1;
158-
if (!in_range)
159-
return;
160-
161-
resolveNodeNames(mg->ndef);
162-
163-
MapNode n_ore(ore);
164-
ManualMapVoxelManipulator *vm = mg->vm;
160+
void OreSheet::generate(ManualMapVoxelManipulator *vm, int seed,
161+
u32 blockseed, v3s16 nmin, v3s16 nmax) {
165162
PseudoRandom pr(blockseed + 4234);
166-
int ymin, ymax;
167-
168-
if (in_range & ORE_RANGE_MIRROR) {
169-
ymin = MYMAX(nmin.Y, -height_max);
170-
ymax = MYMIN(nmax.Y, -height_min);
171-
} else {
172-
ymin = MYMAX(nmin.Y, height_min);
173-
ymax = MYMIN(nmax.Y, height_max);
174-
}
175-
176-
if (clust_size >= ymax - ymin + 1)
177-
return;
178-
179-
int x0 = nmin.X;
180-
int z0 = nmin.Z;
181-
182-
int x1 = nmax.X;
183-
int z1 = nmax.Z;
163+
MapNode n_ore(ore, 0, ore_param2);
184164

185165
int max_height = clust_size;
186-
int y_start = pr.range(ymin, ymax - max_height);
166+
int y_start = pr.range(nmin.Y, nmax.Y - max_height);
187167

188168
if (!noise) {
189169
int sx = nmax.X - nmin.X + 1;
190170
int sz = nmax.Z - nmin.Z + 1;
191171
noise = new Noise(np, 0, sx, sz);
192172
}
193-
noise->seed = mg->seed + y_start;
194-
noise->perlinMap2D(x0, z0);
173+
noise->seed = seed + y_start;
174+
noise->perlinMap2D(nmin.X, nmin.Z);
195175

196176
int index = 0;
197-
for (int z = z0; z != z1; z++)
198-
for (int x = x0; x != x1; x++) {
177+
for (int z = nmin.Z; z <= nmax.Z; z++)
178+
for (int x = nmin.X; x <= nmax.X; x++) {
199179
float noiseval = noise->result[index++];
200180
if (noiseval < nthresh)
201181
continue;

‎src/mapgen.h

+8-4
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,14 @@ class Ore {
120120
public:
121121
std::string ore_name;
122122
std::string wherein_name;
123-
124123
content_t ore;
125124
content_t wherein; // the node to be replaced
126125
u32 clust_scarcity; // ore cluster has a 1-in-clust_scarcity chance of appearing at a node
127126
s16 clust_num_ores; // how many ore nodes are in a chunk
128127
s16 clust_size; // how large (in nodes) a chunk of ore is
129128
s16 height_min;
130129
s16 height_max;
130+
u8 ore_param2; // to set node-specific attributes
131131
u32 flags; // attributes for this ore
132132
float nthresh; // threshhold for noise at which an ore is placed
133133
NoiseParams *np; // noise for distribution of clusters (NULL for uniform scattering)
@@ -141,15 +141,19 @@ class Ore {
141141
}
142142

143143
void resolveNodeNames(INodeDefManager *ndef);
144-
virtual void generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) = 0;
144+
void placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
145+
virtual void generate(ManualMapVoxelManipulator *vm, int seed,
146+
u32 blockseed, v3s16 nmin, v3s16 nmax) = 0;
145147
};
146148

147149
class OreScatter : public Ore {
148-
void generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
150+
virtual void generate(ManualMapVoxelManipulator *vm, int seed,
151+
u32 blockseed, v3s16 nmin, v3s16 nmax);
149152
};
150153

151154
class OreSheet : public Ore {
152-
void generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
155+
virtual void generate(ManualMapVoxelManipulator *vm, int seed,
156+
u32 blockseed, v3s16 nmin, v3s16 nmax);
153157
};
154158

155159
Ore *createOre(OreType type);

‎src/mapgen_v6.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ void MapgenV6::makeChunk(BlockMakeData *data) {
467467
// Generate the registered ores
468468
for (unsigned int i = 0; i != emerge->ores.size(); i++) {
469469
Ore *ore = emerge->ores[i];
470-
ore->generate(this, blockseed + i, node_min, node_max);
470+
ore->placeOre(this, blockseed + i, node_min, node_max);
471471
}
472472

473473
// Calculate lighting

‎src/mapgen_v7.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ void MapgenV7::makeChunk(BlockMakeData *data) {
180180

181181
for (size_t i = 0; i != emerge->ores.size(); i++) {
182182
Ore *ore = emerge->ores[i];
183-
ore->generate(this, blockseed + i, node_min, node_max);
183+
ore->placeOre(this, blockseed + i, node_min, node_max);
184184
}
185185

186186
//printf("makeChunk: %dms\n", t.stop());

‎src/scriptapi.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -670,6 +670,7 @@ static int l_register_ore(lua_State *L)
670670
}
671671

672672
ore->ore_name = getstringfield_default(L, index, "ore", "");
673+
ore->ore_param2 = (u8)getintfield_default(L, index, "ore_param2", 0);
673674
ore->wherein_name = getstringfield_default(L, index, "wherein", "");
674675
ore->clust_scarcity = getintfield_default(L, index, "clust_scarcity", 1);
675676
ore->clust_num_ores = getintfield_default(L, index, "clust_num_ores", 1);

0 commit comments

Comments
 (0)
Please sign in to comment.