From 0c2a8c6bbc565dfd97a5a5803ccfda70c748f47d Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 12 Jun 2022 18:13:00 -0700 Subject: [PATCH] use mapped 1.18 NMS --- .../bukkit/nms/v1_18_R2/NMSBiomeInfo.java | 8 +- .../bukkit/nms/v1_18_R2/NMSBiomeInjector.java | 152 ++++++------- .../bukkit/nms/v1_18_R2/NMSBiomeProvider.java | 55 +++-- .../v1_18_R2/NMSChunkGeneratorDelegate.java | 210 +++++++++--------- .../nms/v1_18_R2/NMSInjectListener.java | 12 +- .../nms/v1_18_R2/NMSWorldProperties.java | 4 +- .../terra/bukkit/nms/v1_18_R2/Reflection.java | 35 +++ .../terra/bukkit/nms/v1_18_R2/Registries.java | 22 +- .../bukkit/nms/v1_19_R1/NMSBiomeInjector.java | 7 +- 9 files changed, 258 insertions(+), 247 deletions(-) create mode 100644 platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Reflection.java diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInfo.java index 2cba0bfe2..7e04ef178 100644 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInfo.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInfo.java @@ -1,10 +1,10 @@ package com.dfsek.terra.bukkit.nms.v1_18_R2; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; + import com.dfsek.terra.api.properties.Properties; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.biome.BiomeBase; - -public record NMSBiomeInfo(ResourceKey biomeKey) implements Properties { +public record NMSBiomeInfo(ResourceKey biomeKey) implements Properties { } diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java index cbd8ab74b..544072061 100644 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java @@ -3,23 +3,19 @@ package com.dfsek.terra.bukkit.nms.v1_18_R2; import com.google.common.collect.ImmutableMap; import com.mojang.serialization.Lifecycle; import net.minecraft.core.Holder; -import net.minecraft.core.IRegistry; -import net.minecraft.core.IRegistryWritable; -import net.minecraft.core.RegistryMaterials; -import net.minecraft.data.RegistryGeneration; -import net.minecraft.resources.MinecraftKey; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.Registry; +import net.minecraft.core.WritableRegistry; +import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; -import net.minecraft.world.level.biome.BiomeBase; -import net.minecraft.world.level.biome.BiomeFog; -import net.minecraft.world.level.biome.BiomeFog.GrassColor; -import net.minecraft.world.level.biome.BiomeSettingsGeneration; -import net.minecraft.world.level.biome.BiomeSettingsMobs; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSpecialEffects; import org.bukkit.NamespacedKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -29,7 +25,6 @@ import java.util.Objects; import java.util.Optional; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; import com.dfsek.terra.registry.master.ConfigRegistry; @@ -37,49 +32,48 @@ import com.dfsek.terra.registry.master.ConfigRegistry; public class NMSBiomeInjector { private static final Logger LOGGER = LoggerFactory.getLogger(NMSBiomeInjector.class); - private static final Map> terraBiomeMap = new HashMap<>(); + private static final Map> terraBiomeMap = new HashMap<>(); public static void registerBiomes(ConfigRegistry configRegistry) { try { LOGGER.info("Hacking biome registry..."); - IRegistryWritable biomeRegistry = (IRegistryWritable) Registries.biomeRegistry(); - Field frozen = RegistryMaterials.class.getDeclaredField("bL"); // registry frozen field - frozen.setAccessible(true); - frozen.set(biomeRegistry, false); + WritableRegistry biomeRegistry = (WritableRegistry) Registries.biomeRegistry(); - configRegistry.forEach(pack -> pack.getRegistry(Biome.class).forEach((key, biome) -> { + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, false); + + configRegistry.forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> { try { BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome(); NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey(); - MinecraftKey vanillaMinecraftKey = new MinecraftKey(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); - BiomeBase platform = createBiome( + ResourceLocation vanillaMinecraftKey = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); + Biome platform = createBiome( biome, - biomeRegistry.a(vanillaMinecraftKey) // get + biomeRegistry.get(vanillaMinecraftKey) // get ); - ResourceKey delegateKey = ResourceKey.a(IRegistry.aP, new MinecraftKey("terra", createBiomeID(pack, key))); + ResourceKey delegateKey = ResourceKey.create(Registry.BIOME_REGISTRY, new ResourceLocation("terra", createBiomeID(pack, key))); - RegistryGeneration.a(RegistryGeneration.i, delegateKey, platform); - biomeRegistry.a(delegateKey, platform, Lifecycle.stable()); + BuiltinRegistries.register(BuiltinRegistries.BIOME, delegateKey, platform); + biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); - terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.a()); + terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location()); LOGGER.debug("Registered biome: " + delegateKey); } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { throw new RuntimeException(e); } })); - - frozen.set(biomeRegistry, true); // freeze registry again :) + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, true); // freeze registry again :) LOGGER.info("Doing tag garbage...."); - Map, List>> collect = biomeRegistry - .g() // streamKeysAndEntries + Map, List>> collect = biomeRegistry + .getTags() // streamKeysAndEntries .collect(HashMap::new, (map, pair) -> - map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().a().toList())), + map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())), HashMap::putAll); terraBiomeMap @@ -90,13 +84,13 @@ public class NMSBiomeInjector { .forEach(tb -> getEntry(biomeRegistry, tb) .ifPresentOrElse( terra -> { - LOGGER.debug(vanilla.e().orElseThrow().a() + + LOGGER.debug(vanilla.unwrapKey().orElseThrow().location() + " (vanilla for " + - terra.e().orElseThrow().a() + + terra.unwrapKey().orElseThrow().location() + ": " + - vanilla.c().toList()); + vanilla.tags().toList()); - vanilla.c() + vanilla.tags() .forEach( tag -> collect .computeIfAbsent(tag, @@ -108,77 +102,63 @@ public class NMSBiomeInjector { tb))), () -> LOGGER.error("No vanilla biome: {}", vb))); - biomeRegistry.k(); // clearTags - biomeRegistry.a(ImmutableMap.copyOf(collect)); // populateTags + biomeRegistry.resetTags(); // clearTags + biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); // populateTags - } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException exception) { + } catch(SecurityException | IllegalArgumentException exception) { throw new RuntimeException(exception); } } - public static Optional> getEntry(IRegistry registry, MinecraftKey identifier) { - return registry.b(identifier) - .flatMap(registry::c) - .map(registry::c); + public static Optional> getEntry(Registry registry, ResourceLocation identifier) { + return registry.getOptional(identifier) + .flatMap(registry::getResourceKey) + .map(registry::getOrCreateHolder); } - private static BiomeBase createBiome(Biome biome, BiomeBase vanilla) + private static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { - BiomeBase.a builder = new BiomeBase.a(); // Builder - - Field f = BiomeBase.class.getDeclaredField("l"); // category - f.setAccessible(true); - builder.a((BiomeBase.Geography) f.get(vanilla)) - .a(vanilla.c()); // getPrecipitation + Biome.BiomeBuilder builder = new Biome.BiomeBuilder(); // Builder - Field biomeSettingMobsField = BiomeBase.class.getDeclaredField("k"); // spawn settings - biomeSettingMobsField.setAccessible(true); - BiomeSettingsMobs biomeSettingMobs = (BiomeSettingsMobs) biomeSettingMobsField.get(vanilla); - builder.a(biomeSettingMobs); - - - BiomeSettingsGeneration.a generationBuilder = new BiomeSettingsGeneration.a(); // builder - builder.a(generationBuilder.a()) - .a(vanilla.c()) - .b(vanilla.h()) // precipitation - .a(vanilla.i()); // temp - - - BiomeFog.a effects = new BiomeFog.a(); // Builder - effects.a(GrassColor.a); // magic + builder.biomeCategory(Reflection.BIOME.getCategory(vanilla)) + .precipitation(vanilla.getPrecipitation()) // getPrecipitation + .mobSpawnSettings(vanilla.getMobSettings()) + .generationSettings(vanilla.getGenerationSettings()) + .temperature(vanilla.getBaseTemperature()) + .downfall(vanilla.getDownfall()); + + + BiomeSpecialEffects.Builder effects = new BiomeSpecialEffects.Builder(); + + effects.grassColorModifier(vanilla.getSpecialEffects().getGrassColorModifier()); + VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); - - // fog - effects.a(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.f())); - - // water - effects.b(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.k())); - - // water fog - effects.c(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.l())); - - // sky - effects.d(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.a())); - + + effects.fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor())) + + .waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor())) + + .waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor())) + + .skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor())); + if(vanillaBiomeProperties.getFoliageColor() == null) { - vanilla.j().e().ifPresent(effects::e); + vanilla.getSpecialEffects().getFoliageColorOverride().ifPresent(effects::foliageColorOverride); } else { - // foliage - effects.e(vanillaBiomeProperties.getFoliageColor()); + effects.foliageColorOverride(vanillaBiomeProperties.getFoliageColor()); } - + if(vanillaBiomeProperties.getGrassColor() == null) { - vanilla.j().f().ifPresent(effects::f); + vanilla.getSpecialEffects().getGrassColorOverride().ifPresent(effects::grassColorOverride); } else { - // grass - effects.f(vanillaBiomeProperties.getGrassColor()); + effects.grassColorOverride(vanillaBiomeProperties.getGrassColor()); } + + builder.specialEffects(effects.build()); - builder.a(effects.a()); // build() - - return builder.a(); // build() + return builder.build(); // build() } public static String createBiomeID(ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey biomeID) { diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeProvider.java index c4fc62749..6d44d19d5 100644 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeProvider.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeProvider.java @@ -1,54 +1,49 @@ package com.dfsek.terra.bukkit.nms.v1_18_R2; -import com.mojang.serialization.Codec; -import net.minecraft.core.Holder; -import net.minecraft.core.IRegistry; -import net.minecraft.server.dedicated.DedicatedServer; -import net.minecraft.world.level.biome.BiomeBase; -import net.minecraft.world.level.biome.Climate.Sampler; -import net.minecraft.world.level.biome.WorldChunkManager; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_18_R2.CraftServer; - -import com.dfsek.terra.api.util.generic.Lazy; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; +import com.mojang.serialization.Codec; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.Climate.Sampler; +import org.jetbrains.annotations.NotNull; -public class NMSBiomeProvider extends WorldChunkManager { + +public class NMSBiomeProvider extends BiomeSource { private final BiomeProvider delegate; - private final WorldChunkManager vanilla; + private final BiomeSource vanilla; private final long seed; + private final Registry biomeRegistry = Registries.biomeRegistry(); - private static final Lazy> biomeRegistry = Lazy.lazy(() -> { - DedicatedServer dedicatedserver = ((CraftServer) Bukkit.getServer()).getServer(); - return dedicatedserver.aU().b(IRegistry.aP); - }); - - public NMSBiomeProvider(BiomeProvider delegate, WorldChunkManager vanilla, long seed) { - super(delegate.stream().map(biome -> biomeRegistry.value().g(((BukkitPlatformBiome) biome.getPlatformBiome()).getContext().get(NMSBiomeInfo.class).biomeKey()))); + public NMSBiomeProvider(BiomeProvider delegate, BiomeSource vanilla, long seed) { + super(delegate.stream() + .map(biome -> Registries.biomeRegistry() + .getOrCreateHolder(((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() + .get(NMSBiomeInfo.class) + .biomeKey()))); this.delegate = delegate; this.vanilla = vanilla; this.seed = seed; } @Override - protected Codec a() { - return WorldChunkManager.a; + protected Codec codec() { + return BiomeSource.CODEC; } @Override - public WorldChunkManager a(long seed) { - return withSeed(seed); - } - - public WorldChunkManager withSeed(long seed) { + public @NotNull BiomeSource withSeed(long seed) { return new NMSBiomeProvider(delegate, vanilla, seed); } @Override - public Holder getNoiseBiome(int x, int y, int z, Sampler sampler) { - //return CraftBlock.biomeToBiomeBase(biomeRegistry.value(), ((BukkitPlatformBiome) delegate.getBiome(x << 2, y << 2, z << 2, seed).getPlatformBiome()).getHandle()); - return biomeRegistry.value().g(((BukkitPlatformBiome) delegate.getBiome(x << 2, y << 2, z << 2, seed).getPlatformBiome()).getContext().get(NMSBiomeInfo.class).biomeKey()); + public @NotNull Holder getNoiseBiome(int x, int y, int z, @NotNull Sampler sampler) { + return biomeRegistry.getOrCreateHolder(((BukkitPlatformBiome) delegate.getBiome(x << 2, y << 2, z << 2, seed).getPlatformBiome()) + .getContext() + .get(NMSBiomeInfo.class) + .biomeKey()); } } diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSChunkGeneratorDelegate.java index b9c4ceb10..12a9d2711 100644 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSChunkGeneratorDelegate.java @@ -8,31 +8,29 @@ import com.dfsek.terra.api.world.info.WorldProperties; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; -import net.minecraft.core.BlockPosition; +import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; -import net.minecraft.core.IRegistryCustom; -import net.minecraft.core.SectionPosition; -import net.minecraft.server.level.RegionLimitedWorldAccess; -import net.minecraft.world.level.BlockColumn; -import net.minecraft.world.level.ChunkCoordIntPair; +import net.minecraft.core.SectionPos; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelHeightAccessor; -import net.minecraft.world.level.StructureManager; -import net.minecraft.world.level.biome.BiomeBase; +import net.minecraft.world.level.NoiseColumn; +import net.minecraft.world.level.StructureFeatureManager; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.biome.Climate; import net.minecraft.world.level.biome.Climate.Sampler; -import net.minecraft.world.level.block.state.IBlockData; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.chunk.IChunkAccess; -import net.minecraft.world.level.levelgen.ChunkGeneratorAbstract; -import net.minecraft.world.level.levelgen.HeightMap; -import net.minecraft.world.level.levelgen.WorldGenStage; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.blending.Blender; import net.minecraft.world.level.levelgen.structure.StructureSet; import net.minecraft.world.level.levelgen.structure.placement.ConcentricRingsStructurePlacement; import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement; -import net.minecraft.world.level.levelgen.structure.templatesystem.DefinedStructureManager; import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,8 +51,8 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { private final long seed; - private final Map>> h = new Object2ObjectArrayMap<>(); - private static final Lazy> EMPTY = Lazy.lazy(List::of); + private final Map>> ringPositions = new Object2ObjectArrayMap<>(); + private static final Lazy> EMPTY = Lazy.lazy(List::of); public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, long seed) { @@ -66,103 +64,95 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { this.seed = seed; } - @Override //applyCarvers - public void a(RegionLimitedWorldAccess regionlimitedworldaccess, long var2, BiomeManager var4, StructureManager var5, - IChunkAccess ichunkaccess, WorldGenStage.Features var7) { + @Override + public void applyCarvers(@NotNull WorldGenRegion chunkRegion, long seed, @NotNull BiomeManager biomeAccess, @NotNull StructureFeatureManager structureAccessor, + @NotNull ChunkAccess chunk, GenerationStep.@NotNull Carving generationStep) { // no-op } - @Override // getSeaLevel - public int g() { - return vanilla.g(); + @Override + public int getSeaLevel() { + return vanilla.getSeaLevel(); } @Override //fillFromNoise - public CompletableFuture a(Executor executor, Blender blender, StructureManager structuremanager, - IChunkAccess ichunkaccess) { - return vanilla.a(executor, blender, structuremanager, ichunkaccess); - } - - - @Override //buildSurface. Used to be buildBase - public void a(RegionLimitedWorldAccess regionlimitedworldaccess, StructureManager structuremanager, IChunkAccess ichunkaccess) { - + public @NotNull CompletableFuture fillFromNoise(@NotNull Executor executor, @NotNull Blender blender, @NotNull StructureFeatureManager structureAccessor, + @NotNull ChunkAccess chunk) { + return vanilla.fillFromNoise(executor, blender, structureAccessor, chunk); } @Override - protected Codec b() { - return ChunkGeneratorAbstract.a; + public void buildSurface(@NotNull WorldGenRegion region, @NotNull StructureFeatureManager structures, @NotNull ChunkAccess chunk) { + // no-op + } + + @Override + protected @NotNull Codec codec() { + return ChunkGenerator.CODEC; } @Override // getColumn - public BlockColumn a(int x, int z, LevelHeightAccessor height) { - IBlockData[] array = new IBlockData[height.v_()]; + public @NotNull NoiseColumn getBaseColumn(int x, int z, LevelHeightAccessor height) { + BlockState[] array = new BlockState[height.getHeight()]; WorldProperties properties = new NMSWorldProperties(seed, height); BiomeProvider biomeProvider = pack.getBiomeProvider().caching(properties); for(int y = properties.getMaxHeight() - 1; y >= properties.getMinHeight(); y--) { array[y - properties.getMinHeight()] = ((CraftBlockData) delegate.getBlock(properties, x, y, z, biomeProvider) .getHandle()).getState(); } - return new BlockColumn(getMinimumY(), array); + return new NoiseColumn(getMinY(), array); } @Override // withSeed - public ChunkGenerator a(long seed) { + public @NotNull ChunkGenerator withSeed(long seed) { return new NMSChunkGeneratorDelegate(vanilla, pack, biomeSource, seed); } - //spawnOriginalMobs - public void a(RegionLimitedWorldAccess regionlimitedworldaccess) { - vanilla.a(regionlimitedworldaccess); - } - - // getGenDepth - public int f() { - return vanilla.f(); - } - - // climateSampler - public Sampler d() { - return Climate.a(); - } - - //getMinY @Override - public int h() { - return vanilla.h(); + public void spawnOriginalMobs(@NotNull WorldGenRegion regionlimitedworldaccess) { + vanilla.spawnOriginalMobs(regionlimitedworldaccess); } - @Override // getBaseHeight - public int a(int x, int z, HeightMap.Type heightmap, LevelHeightAccessor height) { - WorldProperties properties = new NMSWorldProperties(seed, height); + @Override + public int getGenDepth() { + return vanilla.getGenDepth(); + } + + @Override + public @NotNull Sampler climateSampler() { + return Climate.empty(); + } + + @Override + public int getMinY() { + return vanilla.getMinY(); + } + + @Override + public int getBaseHeight(int x, int z, Heightmap.@NotNull Types heightmap, @NotNull LevelHeightAccessor world) { + WorldProperties properties = new NMSWorldProperties(seed, world); int y = properties.getMaxHeight(); BiomeProvider biomeProvider = pack.getBiomeProvider().caching(properties); - while(y >= getMinimumY() && !heightmap.e().test( + while(y >= getMinY() && !heightmap.isOpaque().test( ((CraftBlockData) delegate.getBlock(properties, x, y - 1, z, biomeProvider).getHandle()).getState())) { y--; } return y; } - @Override - public void a(IRegistryCustom iregistrycustom, StructureManager structuremanager, IChunkAccess ichunkaccess, - DefinedStructureManager definedstructuremanager, long i) { - super.a(iregistrycustom, structuremanager, ichunkaccess, definedstructuremanager, i); - } - @Nullable @Override - public List a(ConcentricRingsStructurePlacement concentricringsstructureplacement) { - this.i(); - return this.h.getOrDefault(concentricringsstructureplacement, EMPTY).value(); + public List getRingPositionsFor(@NotNull ConcentricRingsStructurePlacement concentricringsstructureplacement) { + ensureStructuresGenerated(); + return ringPositions.getOrDefault(concentricringsstructureplacement, EMPTY).value(); } private volatile boolean rings = false; @Override - public synchronized void i() { + public synchronized void ensureStructuresGenerated() { if(!this.rings) { - super.i(); + super.ensureStructuresGenerated(); this.populateStrongholdData(); this.rings = true; } @@ -170,70 +160,82 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { private void populateStrongholdData() { LOGGER.info("Generating safe stronghold data. This may take up to a minute."); - Set> set = this.d.b(); - a().map(h -> h.a()).forEach((holder) -> { // we dont need the spigot crap because it doesnt touch concentric. - StructurePlacement structureplacement = holder.b(); + Set> set = this.runtimeBiomeSource.possibleBiomes(); + possibleStructureSets().map(Holder::value).forEach((holder) -> { // we dont need the spigot crap because it doesnt touch concentric. + StructurePlacement structureplacement = holder.placement(); if(structureplacement instanceof ConcentricRingsStructurePlacement concentricringsstructureplacement) { - if(holder.a().stream().anyMatch((structureset_a1) -> structureset_a1.a(set::contains))) { - this.h.put(concentricringsstructureplacement, - Lazy.lazy(() -> this.generateRingPositions(holder, concentricringsstructureplacement))); + if(holder.structures().stream().anyMatch((structureset_a1) -> structureset_a1.generatesInMatchingBiome(set::contains))) { + this.ringPositions.put(concentricringsstructureplacement, + Lazy.lazy(() -> this.generateRingPositions(holder, concentricringsstructureplacement))); } } }); } - private List generateRingPositions(StructureSet holder, - ConcentricRingsStructurePlacement concentricringsstructureplacement) { - if(concentricringsstructureplacement.d() == 0) { + private List generateRingPositions(StructureSet holder, + ConcentricRingsStructurePlacement concentricringsstructureplacement) { // Spigot + if(concentricringsstructureplacement.count() == 0) { return List.of(); } - List list = new ArrayList<>(); - Set> set = holder.a().stream().flatMap((structureset_a) -> (structureset_a.a().a()).a().a()).collect( - Collectors.toSet()); - int i = concentricringsstructureplacement.b(); - int j = concentricringsstructureplacement.d(); - int k = concentricringsstructureplacement.c(); + + List list = new ArrayList<>(); + Set> set = holder + .structures() + .stream() + .flatMap((structureset_a) -> structureset_a.structure().value().biomes().stream()) + .collect(Collectors.toSet()); + int i = concentricringsstructureplacement.distance(); + int j = concentricringsstructureplacement.count(); + int k = concentricringsstructureplacement.spread(); Random random = new Random(); - random.setSeed(this.j); - double d0 = random.nextDouble() * Math.PI * 2.0; + + // Paper start + if(this.conf.strongholdSeed != null && this.structureSets.getResourceKey(holder).orElse(null) == + net.minecraft.world.level.levelgen.structure.BuiltinStructureSets.STRONGHOLDS) { + random.setSeed(this.conf.strongholdSeed); + } else { + // Paper end + random.setSeed(this.ringPlacementSeed); + } // Paper + double d0 = random.nextDouble() * 3.141592653589793D * 2.0D; int l = 0; int i1 = 0; for(int j1 = 0; j1 < j; ++j1) { - double d1 = (double) (4 * i + i * i1 * 6) + (random.nextDouble() - 0.5) * (double) i * 2.5; + double d1 = (double) (4 * i + i * i1 * 6) + (random.nextDouble() - 0.5D) * (double) i * 2.5D; int k1 = (int) Math.round(Math.cos(d0) * d1); int l1 = (int) Math.round(Math.sin(d0) * d1); - int i2 = SectionPosition.a(k1, 8); - int j2 = SectionPosition.a(l1, 8); + int i2 = SectionPos.sectionToBlockCoord(k1, 8); + int j2 = SectionPos.sectionToBlockCoord(l1, 8); + Objects.requireNonNull(set); - Pair> pair = this.c.a(i2, 0, j2, 112, set::contains, random, this.d()); + Pair> pair = this.biomeSource.findBiomeHorizontal(i2, 0, j2, 112, set::contains, random, + this.climateSampler()); + if(pair != null) { - BlockPosition blockposition = pair.getFirst(); - k1 = SectionPosition.a(blockposition.u()); - l1 = SectionPosition.a(blockposition.w()); + BlockPos blockposition = (BlockPos) pair.getFirst(); + + k1 = SectionPos.blockToSectionCoord(blockposition.getX()); + l1 = SectionPos.blockToSectionCoord(blockposition.getZ()); } - list.add(new ChunkCoordIntPair(k1, l1)); - d0 += 6.283185307179586 / (double) k; + list.add(new ChunkPos(k1, l1)); + d0 += 6.283185307179586D / (double) k; ++l; if(l == k) { ++i1; l = 0; k += 2 * k / (i1 + 1); k = Math.min(k, j - j1); - d0 += random.nextDouble() * Math.PI * 2.0; + d0 += random.nextDouble() * 3.141592653589793D * 2.0D; } } - return list; + return list; } - public int getMinimumY() { - return h(); - } - - @Override //addDebugScreenInfo - public void a(List arg0, BlockPosition arg1) { + @Override + public void addDebugScreenInfo(@NotNull List arg0, @NotNull BlockPos arg1) { } } diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInjectListener.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInjectListener.java index 7402c1463..46f4a64c0 100644 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInjectListener.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.nms.v1_18_R2; -import net.minecraft.server.level.WorldServer; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import org.bukkit.World; import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; @@ -30,21 +30,21 @@ public class NMSInjectListener implements Listener { INJECTED.add(event.getWorld()); LOGGER.info("Preparing to take over the world: {}", event.getWorld().getName()); CraftWorld craftWorld = (CraftWorld) event.getWorld(); - WorldServer serverWorld = craftWorld.getHandle(); + ServerLevel serverWorld = craftWorld.getHandle(); ConfigPack pack = bukkitChunkGeneratorWrapper.getPack(); - ChunkGenerator vanilla = serverWorld.k().g(); - NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), vanilla.e(), craftWorld.getSeed()); + ChunkGenerator vanilla = serverWorld.getChunkSource().getGenerator(); + NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), vanilla.getBiomeSource(), craftWorld.getSeed()); NMSChunkGeneratorDelegate custom = new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()); custom.conf = vanilla.conf; // world config from Spigot - serverWorld.k().a.u = custom; + serverWorld.getChunkSource().chunkMap.generator = custom; LOGGER.info("Successfully injected into world."); - serverWorld.k().a.u.i(); // generate stronghold data now + serverWorld.getChunkSource().chunkMap.generator.ensureStructuresGenerated(); // generate stronghold data now INJECT_LOCK.unlock(); } diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSWorldProperties.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSWorldProperties.java index 97dd66167..73b009fc4 100644 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSWorldProperties.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSWorldProperties.java @@ -26,11 +26,11 @@ public class NMSWorldProperties implements WorldProperties { @Override public int getMaxHeight() { - return height.ag(); + return height.getMaxBuildHeight(); } @Override public int getMinHeight() { - return height.u_(); + return height.getMinBuildHeight(); } } diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Reflection.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Reflection.java new file mode 100644 index 000000000..785c93bf5 --- /dev/null +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Reflection.java @@ -0,0 +1,35 @@ +package com.dfsek.terra.bukkit.nms.v1_18_R2; + +import net.minecraft.core.MappedRegistry; +import net.minecraft.world.level.biome.Biome; +import xyz.jpenilla.reflectionremapper.ReflectionRemapper; +import xyz.jpenilla.reflectionremapper.proxy.ReflectionProxyFactory; +import xyz.jpenilla.reflectionremapper.proxy.annotation.FieldGetter; +import xyz.jpenilla.reflectionremapper.proxy.annotation.FieldSetter; +import xyz.jpenilla.reflectionremapper.proxy.annotation.Proxies; + + +public class Reflection { + public static final MappedRegistryProxy MAPPED_REGISTRY; + public static final BiomeProxy BIOME; + + static { + ReflectionRemapper reflectionRemapper = ReflectionRemapper.forReobfMappingsInPaperJar(); + ReflectionProxyFactory reflectionProxyFactory = ReflectionProxyFactory.create(reflectionRemapper, Reflection.class.getClassLoader()); + + MAPPED_REGISTRY = reflectionProxyFactory.reflectionProxy(MappedRegistryProxy.class); + BIOME = reflectionProxyFactory.reflectionProxy(BiomeProxy.class); + } + + @Proxies + public interface MappedRegistryProxy { + @FieldSetter("frozen") + void setFrozen(MappedRegistry instance, boolean frozen); + } + + @Proxies + public interface BiomeProxy { + @FieldGetter("category") + Biome.BiomeCategory getCategory(Biome instance); + } +} diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Registries.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Registries.java index 0702b25c9..3902b61d3 100644 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Registries.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Registries.java @@ -1,30 +1,30 @@ package com.dfsek.terra.bukkit.nms.v1_18_R2; -import net.minecraft.core.IRegistry; +import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import net.minecraft.server.dedicated.DedicatedServer; -import net.minecraft.world.level.biome.BiomeBase; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.structure.StructureSet; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_18_R2.CraftServer; public class Registries { - private static IRegistry getRegistry(ResourceKey> key) { + private static Registry getRegistry(ResourceKey> key) { CraftServer craftserver = (CraftServer) Bukkit.getServer(); DedicatedServer dedicatedserver = craftserver.getServer(); return dedicatedserver - .aU() // getRegistryManager - .b( // getRegistry - key - ); + .registryAccess() + .registryOrThrow( // getRegistry + key + ); } - public static IRegistry biomeRegistry() { - return getRegistry(IRegistry.aP); + public static Registry biomeRegistry() { + return getRegistry(Registry.BIOME_REGISTRY); } - public static IRegistry structureSet() { - return getRegistry(IRegistry.aM); + public static Registry structureSet() { + return getRegistry(Registry.STRUCTURE_SET_REGISTRY); } } diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java index f77fbefab..8cc0895b6 100644 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java @@ -110,11 +110,10 @@ public class NMSBiomeInjector { } } - @SuppressWarnings("unchecked, rawtypes") public static Optional> getEntry(Registry registry, ResourceLocation identifier) { - return (Optional) registry.getOptional(identifier) - .flatMap(registry::getResourceKey) - .map(registry::getHolder); + return registry.getOptional(identifier) + .flatMap(registry::getResourceKey) + .map(registry::getOrCreateHolderOrThrow); } private static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla)