From 38a09c7221c04a0b103adb3824444600c8dd2f73 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 9 Feb 2021 15:06:08 +0300 Subject: [PATCH] BYG crash fix, BYG end sub-biome support, Old Bulbis Gardens improvements --- .../integration/AdornIntegration.java | 20 +++----- .../betterend/integration/ModIntegration.java | 44 +++++++++++----- .../integration/byg/BYGIntegration.java | 50 +++++++++++++++++++ .../byg/biomes/OldBulbisGardens.java | 49 ++++++++++++++---- .../integration/byg/features/BYGFeatures.java | 5 +- .../byg/features/OldBulbisTreeFeature.java | 7 ++- .../java/ru/betterend/registry/EndBiomes.java | 9 ++-- .../ru/betterend/registry/EndStructures.java | 2 +- .../ru/betterend/world/biome/EndBiome.java | 35 +++++++++++-- .../world/generator/BiomePicker.java | 15 +++++- 10 files changed, 183 insertions(+), 53 deletions(-) diff --git a/src/main/java/ru/betterend/integration/AdornIntegration.java b/src/main/java/ru/betterend/integration/AdornIntegration.java index 707daefe..1a2ef30e 100644 --- a/src/main/java/ru/betterend/integration/AdornIntegration.java +++ b/src/main/java/ru/betterend/integration/AdornIntegration.java @@ -1,9 +1,5 @@ package ru.betterend.integration; -import java.lang.reflect.Method; - -import ru.betterend.BetterEnd; - public class AdornIntegration extends ModIntegration { public AdornIntegration() { super("adorn"); @@ -11,15 +7,15 @@ public class AdornIntegration extends ModIntegration { @Override public void register() { - Class adornBlockBuilder = getClass("juuxel.adorn.api.block.AdornBlockBuilder"); - Class blockVariantWood = getClass("juuxel.adorn.api.block.BlockVariant$Wood"); - Class blockVariant = getClass("juuxel.adorn.api.block.BlockVariant"); + //Class adornBlockBuilder = getClass("juuxel.adorn.api.block.AdornBlockBuilder"); + //Class blockVariantWood = getClass("juuxel.adorn.api.block.BlockVariant$Wood"); + //Class blockVariant = getClass("juuxel.adorn.api.block.BlockVariant"); - Object testVariant = newInstance(blockVariantWood, BetterEnd.MOD_ID + "/mossy_glowshroom"); - Method create = getMethod(adornBlockBuilder, "create", blockVariant); - Object builder = executeMethod(adornBlockBuilder, create, testVariant); - getAndExecuteRuntime(builder, "withEverything"); - getAndExecuteRuntime(builder, "registerIn", BetterEnd.MOD_ID); + //Object testVariant = newInstance(blockVariantWood, BetterEnd.MOD_ID + "/mossy_glowshroom"); + //Method create = getMethod(adornBlockBuilder, "create", blockVariant); + //Object builder = executeMethod(adornBlockBuilder, create, testVariant); + //getAndExecuteRuntime(builder, "withEverything"); + //getAndExecuteRuntime(builder, "registerIn", BetterEnd.MOD_ID); } @Override diff --git a/src/main/java/ru/betterend/integration/ModIntegration.java b/src/main/java/ru/betterend/integration/ModIntegration.java index ef39fa69..07074df6 100644 --- a/src/main/java/ru/betterend/integration/ModIntegration.java +++ b/src/main/java/ru/betterend/integration/ModIntegration.java @@ -1,6 +1,7 @@ package ru.betterend.integration; import java.lang.reflect.Constructor; +import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -87,25 +88,41 @@ public abstract class ModIntegration { return cl; } - public Method getMethod(Class cl, String functionName, Class... args) { + @SuppressWarnings("unchecked") + public T getStaticFieldValue(Class cl, String name) { if (cl != null) { try { - return cl.getMethod(functionName, args); - } - catch (NoSuchMethodException | SecurityException e) { - BetterEnd.LOGGER.error(e.getMessage()); - if (BetterEnd.isDevEnvironment()) { - e.printStackTrace(); + Field field = cl.getDeclaredField(name); + if (field != null) { + return (T) field.get(null); } } + catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + e.printStackTrace(); + } } return null; } - public Method getInstanceMethod(Object instance, String functionName, Class... args) { - if (instance != null) { + public Object getFieldValue(Class cl, String name, Object classInstance) { + if (cl != null) { try { - return instance.getClass().getDeclaredMethod(functionName, args); + Field field = cl.getDeclaredField(name); + if (field != null) { + return field.get(classInstance); + } + } + catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + e.printStackTrace(); + } + } + return null; + } + + public Method getMethod(Class cl, String functionName, Class... args) { + if (cl != null) { + try { + return cl.getMethod(functionName, args); } catch (NoSuchMethodException | SecurityException e) { BetterEnd.LOGGER.error(e.getMessage()); @@ -144,14 +161,15 @@ public abstract class ModIntegration { return null; } - public Object getAndExecuteRuntime(Object instance, String functionName, Object... args) { + @SuppressWarnings("unchecked") + public T getAndExecuteRuntime(Class cl, Object instance, String functionName, Object... args) { if (instance != null) { Class[] classes = new Class[args.length]; for (int i = 0; i < args.length; i++) { classes[i] = args[i].getClass(); } - Method method = getInstanceMethod(instance, functionName, classes); - return executeMethod(instance, method, args); + Method method = getMethod(cl, functionName, classes); + return (T) executeMethod(instance, method, args); } return null; } diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index d6797d65..6064442b 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -1,11 +1,20 @@ package ru.betterend.integration.byg; +import java.util.List; +import java.util.stream.Collectors; + +import net.minecraft.util.Identifier; +import net.minecraft.util.collection.WeightedList; +import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.world.biome.Biome; import ru.betterend.integration.Integrations; import ru.betterend.integration.ModIntegration; import ru.betterend.integration.byg.biomes.BYGBiomes; import ru.betterend.integration.byg.features.BYGFeatures; +import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; import ru.betterend.util.TagHelper; +import ru.betterend.world.biome.EndBiome; public class BYGIntegration extends ModIntegration { public BYGIntegration() { @@ -23,5 +32,46 @@ public class BYGIntegration extends ModIntegration { @Override public void addBiomes() { BYGBiomes.addBiomes(); + + Class biomeClass = this.getClass("corgiaoc.byg.common.world.biome.BYGEndBiome"); + List biomes = this.getStaticFieldValue(biomeClass, "BYG_END_BIOMES"); + + if (biomes != null && biomeClass != null) { + biomes.forEach((obj) -> { + Biome biome = this.getAndExecuteRuntime(biomeClass, obj, "getBiome"); + if (biome != null) { + Identifier biomeID = BuiltinRegistries.BIOME.getId(biome); + EndBiome endBiome = EndBiomes.getBiome(biomeID); + Biome edge = this.getAndExecuteRuntime(biomeClass, obj, "getEdge"); + if (edge != null) { + Identifier edgeID = BuiltinRegistries.BIOME.getId(edge); + EndBiomes.LAND_BIOMES.removeMutableBiome(edgeID); + EndBiomes.VOID_BIOMES.removeMutableBiome(edgeID); + EndBiome edgeBiome = EndBiomes.getBiome(edgeID); + endBiome.setEdge(edgeBiome); + endBiome.setEdgeSize(32); + } + else { + boolean isVoid = this.getAndExecuteRuntime(biomeClass, obj, "isVoid"); + if (isVoid) { + EndBiomes.LAND_BIOMES.removeMutableBiome(biomeID); + EndBiomes.VOID_BIOMES.addBiome(endBiome); + } + WeightedList subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills"); + if (subBiomes != null) { + subBiomes.stream().collect(Collectors.toList()).forEach((id) -> { + EndBiome subBiome = EndBiomes.getBiome(id); + EndBiomes.LAND_BIOMES.removeMutableBiome(id); + EndBiomes.VOID_BIOMES.removeMutableBiome(id); + if (!endBiome.containsSubBiome(subBiome)) { + EndBiomes.SUBBIOMES.add(subBiome); + endBiome.addSubBiome(subBiome); + } + }); + } + } + } + }); + } } } diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index 739bc7b1..ec711c80 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -1,14 +1,21 @@ package ru.betterend.integration.byg.biomes; import java.util.List; +import java.util.function.Supplier; +import net.minecraft.block.Block; import net.minecraft.entity.SpawnGroup; import net.minecraft.particle.ParticleTypes; import net.minecraft.sound.SoundEvent; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.SpawnSettings.SpawnEntry; import net.minecraft.world.gen.GenerationStep.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.ConfiguredFeatures; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; @@ -25,24 +32,17 @@ public class OldBulbisGardens extends EndBiome { Biome biome = Integrations.BYG.getBiome("bulbis_gardens"); BiomeEffects effects = biome.getEffects(); + Block ivis = Integrations.BYG.getBlock("ivis_phylium"); + Block origin = biome.getGenerationSettings().getSurfaceConfig().getTopMaterial().getBlock(); BiomeDefinition def = new BiomeDefinition("old_bulbis_gardens") .setFogColor(215, 132, 207) .setFogDensity(1.8F) .setWaterAndFogColor(40, 0, 56) .setFoliageColor(122, 17, 155) .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F) - .setSurface(Integrations.BYG.getBlock("ivis_phylium")) + .setSurface(ivis, origin) .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(BYGFeatures.OLD_BULBIS_TREE) - .addFeature(Feature.VEGETAL_DECORATION, BYGFeatures.BULBIS_TREES) - .addFeature(Feature.VEGETAL_DECORATION, BYGFeatures.PURPLE_BULBIS_TREES) - .addFeature(EndFeatures.PURPLE_POLYPORE) - .addFeature(BYGFeatures.IVIS_MOSS_WOOD) - .addFeature(BYGFeatures.IVIS_MOSS) - .addFeature(BYGFeatures.IVIS_VINE) - .addFeature(BYGFeatures.IVIS_SPROUT) - .addFeature(BYGFeatures.BULBIS_ODDITY) - .addFeature(BYGFeatures.PURPLE_BULBIS_ODDITY); + .addFeature(BYGFeatures.OLD_BULBIS_TREE); if (BetterEnd.isClient()) { SoundEvent loop = effects.getLoopSound().get(); @@ -59,6 +59,33 @@ public class OldBulbisGardens extends EndBiome { }); } + List>>> features = biome.getGenerationSettings().getFeatures(); + List>> vegetal = features.get(Feature.VEGETAL_DECORATION.ordinal()); + if (vegetal.size() > 2) { + Supplier> getter; + // Trees (first two features) + // I couldn't process them with conditions, so that's why they are hardcoded (paulevs) + for (int i = 0; i < 2; i++) { + getter = vegetal.get(i); + ConfiguredFeature feature = getter.get(); + Identifier id = BetterEnd.makeID("obg_feature_" + i); + feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.decorate(ConfiguredFeatures.Decorators.SQUARE_HEIGHTMAP).repeatRandomly(1)); + def.addFeature(Feature.VEGETAL_DECORATION, feature); + } + // Grasses and other features + for (int i = 2; i < vegetal.size(); i++) { + getter = vegetal.get(i); + ConfiguredFeature feature = getter.get(); + def.addFeature(Feature.VEGETAL_DECORATION, feature); + } + } + + def.addFeature(EndFeatures.PURPLE_POLYPORE) + .addFeature(BYGFeatures.IVIS_MOSS_WOOD) + .addFeature(BYGFeatures.IVIS_MOSS) + .addFeature(BYGFeatures.IVIS_VINE) + .addFeature(BYGFeatures.IVIS_SPROUT); + return def; } } diff --git a/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java index 1f21a35c..83f9780d 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java +++ b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java @@ -1,6 +1,5 @@ package ru.betterend.integration.byg.features; -import net.minecraft.world.gen.feature.ConfiguredFeature; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.BYGBlocks; import ru.betterend.world.features.EndFeature; @@ -23,8 +22,8 @@ public class BYGFeatures { public static final EndFeature NIGHTSHADE_REDWOOD_TREE = new EndFeature("nightshade_redwood_tree", new NightshadeRedwoodTreeFeature(), 1); public static final EndFeature BIG_ETHER_TREE = new EndFeature("big_ether_tree", new BigEtherTreeFeature(), 1); - public static final ConfiguredFeature BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_bulbis_tree"); - public static final ConfiguredFeature PURPLE_BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_purple_bulbis_tree"); + //public static final ConfiguredFeature BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_bulbis_tree"); + //public static final ConfiguredFeature PURPLE_BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_purple_bulbis_tree"); public static void register() {} } diff --git a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java index 9f9e89a4..a7d93ef7 100644 --- a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java @@ -53,7 +53,10 @@ public class OldBulbisTreeFeature extends DefaultFeature { }; float size = MHelper.randRange(10, 20, random); + float addSize = MHelper.randRange(1, 1.7F, random); + float addRad = addSize * 0.5F + 0.5F; int count = (int) (size * 0.15F); + size *= addSize; float var = MHelper.PI2 / (float) (count * 3); float start = MHelper.randRange(0, MHelper.PI2, random); SDF sdf = null; @@ -65,10 +68,10 @@ public class OldBulbisTreeFeature extends DefaultFeature { List spline = SplineHelper.copySpline(SPLINE); float sizeXZ = (size + MHelper.randRange(0, size * 0.5F, random)) * 0.7F; SplineHelper.scale(spline, sizeXZ, sizeXZ * 1.5F + MHelper.randRange(0, size * 0.5F, random), sizeXZ); - SplineHelper.offset(spline, new Vector3f((20 - size), 0, 0)); + SplineHelper.offset(spline, new Vector3f(size * random.nextFloat() * 0.3F, 0, 0)); SplineHelper.rotateSpline(spline, angle); SplineHelper.offsetParts(spline, random, 1F, 0, 1F);//1.3F 0.8F - SDF branch = SplineHelper.buildSDF(spline, 2.3F, 1.3F, (bpos) -> { + SDF branch = SplineHelper.buildSDF(spline, 2.3F * addRad, 1.3F * addRad, (bpos) -> { return stem; }); diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 5907a212..282ee5cc 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -144,18 +144,15 @@ public class EndBiomes { VOID_BIOMES.rebuild(); LAND_BIOMES.getBiomes().forEach((endBiome) -> { - Biome biome = biomeRegistry.get(endBiome.getID()); - endBiome.setActualBiome(biome); + endBiome.updateActualBiomes(biomeRegistry); }); VOID_BIOMES.getBiomes().forEach((endBiome) -> { - Biome biome = biomeRegistry.get(endBiome.getID()); - endBiome.setActualBiome(biome); + endBiome.updateActualBiomes(biomeRegistry); }); SUBBIOMES.forEach((endBiome) -> { - Biome biome = biomeRegistry.get(endBiome.getID()); - endBiome.setActualBiome(biome); + endBiome.updateActualBiomes(biomeRegistry); }); CLIENT.clear(); diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index 72c87bf4..a14fd9f3 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -19,8 +19,8 @@ import ru.betterend.world.structures.features.StructureMegaLakeSmall; import ru.betterend.world.structures.features.StructureMountain; import ru.betterend.world.structures.features.StructurePaintedMountain; import ru.betterend.world.structures.piece.CavePiece; -import ru.betterend.world.structures.piece.LakePiece; import ru.betterend.world.structures.piece.CrystalMountainPiece; +import ru.betterend.world.structures.piece.LakePiece; import ru.betterend.world.structures.piece.NBTPiece; import ru.betterend.world.structures.piece.PaintedMountainPiece; import ru.betterend.world.structures.piece.VoxelPiece; diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index 7ab7a540..c36369b0 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -9,6 +9,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import ru.betterend.config.Configs; import ru.betterend.util.JsonFactory; @@ -161,10 +162,6 @@ public class EndBiome { return structuresFeature; } - public void setActualBiome(Biome biome) { - this.actualBiome = biome; - } - public Biome getActualBiome() { return this.actualBiome; } @@ -180,4 +177,34 @@ public class EndBiome { public boolean hasCaves() { return hasCaves; } + + public void updateActualBiomes(Registry biomeRegistry) { + subbiomes.forEach((sub) -> { + sub.updateActualBiomes(biomeRegistry); + }); + if (edge != null) { + edge.updateActualBiomes(biomeRegistry); + } + Biome biome = biomeRegistry.get(mcID); + this.actualBiome = biome; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + EndBiome biome = (EndBiome) obj; + return biome == null ? false : biome.mcID.equals(mcID); + } + + @Override + public int hashCode() { + return mcID.hashCode(); + } + + public List subbiomes() { + // TODO Auto-generated method stub + return this.subbiomes; + } } diff --git a/src/main/java/ru/betterend/world/generator/BiomePicker.java b/src/main/java/ru/betterend/world/generator/BiomePicker.java index 15108bb8..4db12d23 100644 --- a/src/main/java/ru/betterend/world/generator/BiomePicker.java +++ b/src/main/java/ru/betterend/world/generator/BiomePicker.java @@ -28,7 +28,6 @@ public class BiomePicker { public void addBiomeMutable(EndBiome biome) { biomes.add(biome); - maxChance = biome.mutateGenChance(maxChance); } public void clearMutables() { @@ -49,7 +48,21 @@ public class BiomePicker { return immutableIDs.contains(id); } + public void removeMutableBiome(Identifier id) { + for (int i = biomeCount; i < biomes.size(); i++) { + EndBiome biome = biomes.get(i); + if (biome.getID().equals(id)) { + biomes.remove(i); + break; + } + } + } + public void rebuild() { + maxChance = maxChanceUnmutable; + for (int i = biomeCount; i < biomes.size(); i++) { + maxChance = biomes.get(i).mutateGenChance(maxChance); + } tree = new WeighTree(biomes); } }