@@ -94,7 +94,7 @@ void Ore::resolveNodeNames(INodeDefManager *ndef) {
94
94
}
95
95
96
96
97
- void OreScatter::generate (Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
97
+ void Ore::placeOre (Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
98
98
int in_range = 0 ;
99
99
100
100
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) {
105
105
106
106
resolveNodeNames (mg->ndef );
107
107
108
- MapNode n_ore (ore);
109
- ManualMapVoxelManipulator *vm = mg->vm ;
110
- PseudoRandom pr (blockseed);
111
108
int ymin, ymax;
112
109
113
110
if (in_range & ORE_RANGE_MIRROR) {
@@ -120,6 +117,17 @@ void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
120
117
if (clust_size >= ymax - ymin + 1 )
121
118
return ;
122
119
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
+
123
131
int volume = (nmax.X - nmin.X + 1 ) *
124
132
(nmax.Y - nmin.Y + 1 ) *
125
133
(nmax.Z - nmin.Z + 1 );
@@ -129,10 +137,10 @@ void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
129
137
130
138
for (int i = 0 ; i != nclusters; i++) {
131
139
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 );
133
141
int z0 = pr.range (nmin.Z , nmax.Z - csize + 1 );
134
142
135
- if (np && (NoisePerlin3D (np, x0, y0 , z0, mg-> seed ) < nthresh))
143
+ if (np && (NoisePerlin3D (np, x0, y0 , z0, seed) < nthresh))
136
144
continue ;
137
145
138
146
for (int z1 = 0 ; z1 != csize; z1++)
@@ -149,53 +157,25 @@ void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
149
157
}
150
158
151
159
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) {
165
162
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);
184
164
185
165
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);
187
167
188
168
if (!noise) {
189
169
int sx = nmax.X - nmin.X + 1 ;
190
170
int sz = nmax.Z - nmin.Z + 1 ;
191
171
noise = new Noise (np, 0 , sx, sz);
192
172
}
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 );
195
175
196
176
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++) {
199
179
float noiseval = noise->result [index ++];
200
180
if (noiseval < nthresh)
201
181
continue ;
0 commit comments