Commits
DerFrZocker authored and md_5 committed e7aab549321
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 | |
114 115 | public int getSeaLevel() { |
115 116 | return delegate.getSeaLevel(); |
116 117 | } |
117 118 | |
118 119 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
304 327 | public int getSpawnHeight(LevelHeightAccessor levelheightaccessor) { |
305 328 | return delegate.getSpawnHeight(levelheightaccessor); |
306 329 | } |
307 330 | |
308 331 | |