Commits

DerFrZocker authored and md_5 committed e7aab549321
SPIGOT-6765: Pass WorldInfo, Random and coordinates to ChunkGenerator should methods
No tags

src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java

Modified
4 4 import com.mojang.serialization.Codec;
5 5 import java.util.List;
6 6 import java.util.Random;
7 7 import java.util.concurrent.CompletableFuture;
8 8 import java.util.concurrent.Executor;
9 9 import net.minecraft.core.BlockPosition;
10 10 import net.minecraft.core.Holder;
11 11 import net.minecraft.core.IRegistryCustom;
12 12 import net.minecraft.server.level.RegionLimitedWorldAccess;
13 13 import net.minecraft.server.level.WorldServer;
14 +import net.minecraft.util.MathHelper;
14 15 import net.minecraft.util.random.WeightedRandomList;
15 16 import net.minecraft.world.entity.EnumCreatureType;
16 17 import net.minecraft.world.level.BlockColumn;
17 18 import net.minecraft.world.level.GeneratorAccessSeed;
18 19 import net.minecraft.world.level.LevelHeightAccessor;
19 20 import net.minecraft.world.level.StructureManager;
20 21 import net.minecraft.world.level.biome.BiomeBase;
21 22 import net.minecraft.world.level.biome.BiomeManager;
22 23 import net.minecraft.world.level.biome.BiomeSettingsMobs;
23 24 import net.minecraft.world.level.biome.WorldChunkManager;
110 111 return delegate.getMinY();
111 112 }
112 113
113 114 @Override
114 115 public int getSeaLevel() {
115 116 return delegate.getSeaLevel();
116 117 }
117 118
118 119 @Override
119 120 public void createStructures(IRegistryCustom iregistrycustom, RandomState randomstate, StructureManager structuremanager, IChunkAccess ichunkaccess, StructureTemplateManager structuretemplatemanager, long i) {
120 - if (generator.shouldGenerateStructures()) {
121 + SeededRandom random = getSeededRandom();
122 + int x = ichunkaccess.getPos().x;
123 + int z = ichunkaccess.getPos().z;
124 +
125 + random.setSeed(MathHelper.getSeed(x, "should-structures".hashCode(), z) ^ i);
126 + if (generator.shouldGenerateStructures(this.world.getWorld(), new RandomSourceWrapper.RandomWrapper(random), x, z)) {
121 127 super.createStructures(iregistrycustom, randomstate, structuremanager, ichunkaccess, structuretemplatemanager, i);
122 128 }
123 129 }
124 130
125 131 @Override
126 132 public void buildSurface(RegionLimitedWorldAccess regionlimitedworldaccess, StructureManager structuremanager, RandomState randomstate, IChunkAccess ichunkaccess) {
127 - if (generator.shouldGenerateSurface()) {
133 + SeededRandom random = getSeededRandom();
134 + int x = ichunkaccess.getPos().x;
135 + int z = ichunkaccess.getPos().z;
136 +
137 + random.setSeed(MathHelper.getSeed(x, "should-surface".hashCode(), z) ^ regionlimitedworldaccess.getSeed());
138 + if (generator.shouldGenerateSurface(this.world.getWorld(), new RandomSourceWrapper.RandomWrapper(random), x, z)) {
128 139 delegate.buildSurface(regionlimitedworldaccess, structuremanager, randomstate, ichunkaccess);
129 140 }
130 141
131 142 CraftChunkData chunkData = new CraftChunkData(this.world.getWorld(), ichunkaccess);
132 - SeededRandom random = getSeededRandom();
133 - int x = ichunkaccess.getPos().x;
134 - int z = ichunkaccess.getPos().z;
143 +
135 144 random.setSeed((long) x * 341873128712L + (long) z * 132897987541L);
136 145 generator.generateSurface(this.world.getWorld(), new RandomSourceWrapper.RandomWrapper(random), x, z, chunkData);
137 146
138 147 if (generator.shouldGenerateBedrock()) {
139 148 random = getSeededRandom();
140 149 random.setSeed((long) x * 341873128712L + (long) z * 132897987541L);
141 150 // delegate.buildBedrock(ichunkaccess, random);
142 151 }
143 152
144 153 random = getSeededRandom();
215 224 }
216 225
217 226 // Apply captured light blocks
218 227 for (BlockPosition lightPosition : craftData.getLights()) {
219 228 ((ProtoChunk) ichunkaccess).addLight(new BlockPosition((x << 4) + lightPosition.getX(), lightPosition.getY(), (z << 4) + lightPosition.getZ()));
220 229 }
221 230 }
222 231
223 232 @Override
224 233 public void applyCarvers(RegionLimitedWorldAccess regionlimitedworldaccess, long seed, RandomState randomstate, BiomeManager biomemanager, StructureManager structuremanager, IChunkAccess ichunkaccess, WorldGenStage.Features worldgenstage_features) {
225 - if (generator.shouldGenerateCaves()) {
234 + SeededRandom random = getSeededRandom();
235 + int x = ichunkaccess.getPos().x;
236 + int z = ichunkaccess.getPos().z;
237 +
238 + random.setSeed(MathHelper.getSeed(x, "should-caves".hashCode(), z) ^ regionlimitedworldaccess.getSeed());
239 + if (generator.shouldGenerateCaves(this.world.getWorld(), new RandomSourceWrapper.RandomWrapper(random), x, z)) {
226 240 delegate.applyCarvers(regionlimitedworldaccess, seed, randomstate, biomemanager, structuremanager, ichunkaccess, worldgenstage_features);
227 241 }
228 242
229 243 if (worldgenstage_features == WorldGenStage.Features.LIQUID) { // stage check ensures that the method is only called once
230 244 CraftChunkData chunkData = new CraftChunkData(this.world.getWorld(), ichunkaccess);
231 - SeededRandom random = getSeededRandom();
232 - int x = ichunkaccess.getPos().x;
233 - int z = ichunkaccess.getPos().z;
234 245 random.setDecorationSeed(seed, 0, 0);
235 246
236 247 generator.generateCaves(this.world.getWorld(), new RandomSourceWrapper.RandomWrapper(random), x, z, chunkData);
237 248 chunkData.breakLink();
238 249 }
239 250 }
240 251
241 252 @Override
242 253 public CompletableFuture<IChunkAccess> fillFromNoise(Executor executor, Blender blender, RandomState randomstate, StructureManager structuremanager, IChunkAccess ichunkaccess) {
243 254 CompletableFuture<IChunkAccess> future = null;
244 - if (generator.shouldGenerateNoise()) {
255 + SeededRandom random = getSeededRandom();
256 + int x = ichunkaccess.getPos().x;
257 + int z = ichunkaccess.getPos().z;
258 +
259 + random.setSeed(MathHelper.getSeed(x, "should-noise".hashCode(), z) ^ this.world.getSeed());
260 + if (generator.shouldGenerateNoise(this.world.getWorld(), new RandomSourceWrapper.RandomWrapper(random), x, z)) {
245 261 future = delegate.fillFromNoise(executor, blender, randomstate, structuremanager, ichunkaccess);
246 262 }
247 263
248 264 java.util.function.Function<IChunkAccess, IChunkAccess> function = (ichunkaccess1) -> {
249 265 CraftChunkData chunkData = new CraftChunkData(this.world.getWorld(), ichunkaccess1);
250 - SeededRandom random = getSeededRandom();
251 - int x = ichunkaccess1.getPos().x;
252 - int z = ichunkaccess1.getPos().z;
253 266 random.setSeed((long) x * 341873128712L + (long) z * 132897987541L);
254 267
255 268 generator.generateNoise(this.world.getWorld(), new RandomSourceWrapper.RandomWrapper(random), x, z, chunkData);
256 269 chunkData.breakLink();
257 270 return ichunkaccess1;
258 271 };
259 272
260 273 return future == null ? CompletableFuture.supplyAsync(() -> function.apply(ichunkaccess), net.minecraft.SystemUtils.backgroundExecutor()) : future.thenApply(function);
261 274 }
262 275
278 291 return delegate.getBaseHeight(i, j, heightmap_type, levelheightaccessor, randomstate);
279 292 }
280 293
281 294 @Override
282 295 public WeightedRandomList<BiomeSettingsMobs.c> getMobsAt(Holder<BiomeBase> holder, StructureManager structuremanager, EnumCreatureType enumcreaturetype, BlockPosition blockposition) {
283 296 return delegate.getMobsAt(holder, structuremanager, enumcreaturetype, blockposition);
284 297 }
285 298
286 299 @Override
287 300 public void applyBiomeDecoration(GeneratorAccessSeed generatoraccessseed, IChunkAccess ichunkaccess, StructureManager structuremanager) {
288 - super.applyBiomeDecoration(generatoraccessseed, ichunkaccess, structuremanager, generator.shouldGenerateDecorations());
301 + SeededRandom random = getSeededRandom();
302 + int x = ichunkaccess.getPos().x;
303 + int z = ichunkaccess.getPos().z;
304 +
305 + random.setSeed(MathHelper.getSeed(x, "should-decoration".hashCode(), z) ^ generatoraccessseed.getSeed());
306 + super.applyBiomeDecoration(generatoraccessseed, ichunkaccess, structuremanager, generator.shouldGenerateDecorations(this.world.getWorld(), new RandomSourceWrapper.RandomWrapper(random), x, z));
289 307 }
290 308
291 309 @Override
292 310 public void addDebugScreenInfo(List<String> list, RandomState randomstate, BlockPosition blockposition) {
293 311 delegate.addDebugScreenInfo(list, randomstate, blockposition);
294 312 }
295 313
296 314 @Override
297 315 public void spawnOriginalMobs(RegionLimitedWorldAccess regionlimitedworldaccess) {
298 - if (generator.shouldGenerateMobs()) {
316 + SeededRandom random = getSeededRandom();
317 + int x = regionlimitedworldaccess.getCenter().x;
318 + int z = regionlimitedworldaccess.getCenter().z;
319 +
320 + random.setSeed(MathHelper.getSeed(x, "should-mobs".hashCode(), z) ^ regionlimitedworldaccess.getSeed());
321 + if (generator.shouldGenerateMobs(this.world.getWorld(), new RandomSourceWrapper.RandomWrapper(random), x, z)) {
299 322 delegate.spawnOriginalMobs(regionlimitedworldaccess);
300 323 }
301 324 }
302 325
303 326 @Override
304 327 public int getSpawnHeight(LevelHeightAccessor levelheightaccessor) {
305 328 return delegate.getSpawnHeight(levelheightaccessor);
306 329 }
307 330
308 331 @Override

Everything looks good. We'll let you know here if there's anything you should know about.

Add shortcut