diff --git a/build.gradle b/build.gradle index 7dda232..eeafdb1 100644 --- a/build.gradle +++ b/build.gradle @@ -70,7 +70,7 @@ processResources { tasks.withType(JavaCompile).configureEach { options.encoding = "UTF-8" - options.release.set(8) + options.release.set(17) } java { diff --git a/gradle.properties b/gradle.properties index 8a0f4a1..85a1951 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,9 +4,9 @@ org.gradle.parallel=true org.gradle.caching=true loom.platform=forge -minecraft_version=1.16.5 -forge_version=36.2.39 -parchment_version=2022.03.06 +minecraft_version=1.20.1 +forge_version=47.2.20 +parchment_version=2023.09.03 yarn_mappings=10 cf_project_id=912104 diff --git a/src/main/java/com/teampotato/sparsestructuresreforged/CustomSpreadFactors.java b/src/main/java/com/teampotato/sparsestructuresreforged/CustomSpreadFactors.java new file mode 100644 index 0000000..09ad4e1 --- /dev/null +++ b/src/main/java/com/teampotato/sparsestructuresreforged/CustomSpreadFactors.java @@ -0,0 +1,19 @@ +package com.teampotato.sparsestructuresreforged; + +public class CustomSpreadFactors { + public String structure; + public double factor; + + public CustomSpreadFactors(String structure, double factor) { + this.structure = structure; + this.factor = factor; + } + + public String structure() { + return this.structure; + } + + public double factor() { + return this.factor; + } +} \ No newline at end of file diff --git a/src/main/java/com/teampotato/sparsestructuresreforged/SparseStructures.java b/src/main/java/com/teampotato/sparsestructuresreforged/SparseStructures.java new file mode 100644 index 0000000..dc06345 --- /dev/null +++ b/src/main/java/com/teampotato/sparsestructuresreforged/SparseStructures.java @@ -0,0 +1,37 @@ +package com.teampotato.sparsestructuresreforged; + +import com.google.gson.Gson; +import net.minecraftforge.fml.common.Mod; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; + +@Mod(SparseStructures.MOD_ID) +public class SparseStructures { + public static final String MOD_ID = "sparsestructuresreforged"; + private static final String CONFIG_RESOURCE_NAME = "sparse-structures-default-config.json5"; + private static final String CONFIG_FILENAME = "sparsestructures.json5"; + private static final Path CONFIG_FILE_PATH = Paths.get("config", CONFIG_FILENAME); + public static SparseStructuresConfig config; + + public SparseStructures() { + if (!CONFIG_FILE_PATH.toFile().exists()) { + try (InputStream in = this.getClass().getClassLoader().getResourceAsStream(CONFIG_RESOURCE_NAME)) { + if (in == null) throw new IllegalStateException("Failed to load SparseStructure's default config \"" + CONFIG_RESOURCE_NAME +"\""); + Files.createDirectories(CONFIG_FILE_PATH); + Files.copy(in, CONFIG_FILE_PATH, StandardCopyOption.REPLACE_EXISTING); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + try (final InputStream in = Files.newInputStream(CONFIG_FILE_PATH)) { + config = new Gson().fromJson(new InputStreamReader(in), SparseStructuresConfig.class); + } catch (Exception e) { + throw new RuntimeException("SparseStructure's config file is malformed! If you don't know what's causing this, delete the config file and restart the game."); + } + } +} diff --git a/src/main/java/com/teampotato/sparsestructuresreforged/SparseStructuresConfig.java b/src/main/java/com/teampotato/sparsestructuresreforged/SparseStructuresConfig.java new file mode 100644 index 0000000..7e048b5 --- /dev/null +++ b/src/main/java/com/teampotato/sparsestructuresreforged/SparseStructuresConfig.java @@ -0,0 +1,13 @@ +package com.teampotato.sparsestructuresreforged; + +import java.util.List; + +public class SparseStructuresConfig { + public double spreadFactor; + public List customSpreadFactors; + + public SparseStructuresConfig(double spreadFactor, List customSpreadFactors) { + this.spreadFactor = spreadFactor; + this.customSpreadFactors = customSpreadFactors; + } +} \ No newline at end of file diff --git a/src/main/java/com/teampotato/sparsestructuresreforged/SparseStructuresReforged.java b/src/main/java/com/teampotato/sparsestructuresreforged/SparseStructuresReforged.java deleted file mode 100644 index a40c57b..0000000 --- a/src/main/java/com/teampotato/sparsestructuresreforged/SparseStructuresReforged.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.teampotato.sparsestructuresreforged; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.loading.FMLPaths; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.io.*; - -@Mod(SparseStructuresReforged.MOD_ID) -public class SparseStructuresReforged { - public static final String MOD_ID = "sparsestructuresreforged"; - public static final Logger LOGGER = LogManager.getLogger(SparseStructuresReforged.class); - - public static double getExtraSpacingPercentage() { - return Config.INSTANCE.extraSpacingPercentage; - } - - public static double getExtraSeparationPercentage() { - return Config.INSTANCE.extraSeparationPercentage; - } - - private static final class Config { - private double extraSpacingPercentage, extraSeparationPercentage; - private static final Config INSTANCE = new Config(); - - private Config() { - File config = new File(FMLPaths.CONFIGDIR.get().toFile(), MOD_ID + "-v2.json"); - if (!config.exists()) { - try { - FileWriter writer = new FileWriter(config); - JsonObject defaultConfig = new JsonObject(); - defaultConfig.addProperty("extraSpacingPercentage", 0.8D); - defaultConfig.addProperty("extraSeparationPercentage", 0.8D); - writer.write(defaultConfig.toString()); - writer.close(); - } catch (IOException e) { - LOGGER.error("Failed to write SparseStructuresReforged default config", e); - } - } - - try { - BufferedReader reader = new BufferedReader(new FileReader(config)); - JsonObject configObject = new JsonParser().parse(reader).getAsJsonObject(); - this.extraSpacingPercentage = configObject.get("extraSpacingPercentage").getAsDouble(); - this.extraSeparationPercentage = configObject.get("extraSeparationPercentage").getAsDouble(); - reader.close(); - } catch (IOException e) { - LOGGER.error("Failed to read SparseStructuresReforged config", e); - } - } - } -} diff --git a/src/main/java/com/teampotato/sparsestructuresreforged/mixin/RegistryDataLoaderMixin.java b/src/main/java/com/teampotato/sparsestructuresreforged/mixin/RegistryDataLoaderMixin.java new file mode 100644 index 0000000..3d199fd --- /dev/null +++ b/src/main/java/com/teampotato/sparsestructuresreforged/mixin/RegistryDataLoaderMixin.java @@ -0,0 +1,52 @@ +package com.teampotato.sparsestructuresreforged.mixin; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.mojang.serialization.Decoder; +import com.teampotato.sparsestructuresreforged.CustomSpreadFactors; +import com.teampotato.sparsestructuresreforged.SparseStructures; +import net.minecraft.core.Registry; +import net.minecraft.core.WritableRegistry; +import net.minecraft.resources.*; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.resources.ResourceManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import java.io.Reader; +import java.util.Iterator; +import java.util.Map; + +@Mixin(RegistryDataLoader.class) +public abstract class RegistryDataLoaderMixin { + @Inject(method = "loadRegistryContents", at = @At(value = "INVOKE", remap = false, target = "Lcom/mojang/serialization/Decoder;parse(Lcom/mojang/serialization/DynamicOps;Ljava/lang/Object;)Lcom/mojang/serialization/DataResult;"), locals = LocalCapture.CAPTURE_FAILEXCEPTION) + private static void ssr$init(RegistryOps.RegistryInfoLookup lookup, ResourceManager manager, ResourceKey> registryKey, WritableRegistry registry, Decoder decoder, Map, Exception> exceptions, CallbackInfo ci, String string, FileToIdConverter converter, RegistryOps registryOps, Iterator> iterator, Map.Entry entry, ResourceLocation resourcelocation, ResourceKey resourceKey, Resource resource, Reader reader, JsonElement jsonElement) { + JsonObject jsonObject = jsonElement.getAsJsonObject(); + JsonObject placement = jsonObject.getAsJsonObject("placement"); + if (string.equals("worldgen/structure_set") && !placement.get("type").getAsString().equals("minecraft:concentric_rings")) { + double factor = SparseStructures.config.customSpreadFactors.stream().filter(s -> { + if (s == null) return false; + String structure_set = resourceKey.location().toString(); + return structure_set.equals(s.structure()) || jsonObject.getAsJsonArray("structures").asList().stream().anyMatch(p -> p.getAsJsonObject().get("structure").getAsString().equals(s.structure())); + }).findFirst().orElse(new CustomSpreadFactors("", SparseStructures.config.spreadFactor)).factor(); + + int spacing; + int separation; + + if (placement.get("spacing") == null) spacing = 1; + else spacing = (int)(Math.min(placement.get("spacing").getAsDouble() * factor, 4096.0)); + if (placement.get("separation") == null) separation = 1; + else separation = (int)(Math.min(placement.get("separation").getAsDouble() * factor, 4096.0)); + if (separation >= spacing) { + if (spacing == 0) spacing = 1; + separation = spacing - 1; + } + + placement.addProperty("spacing", spacing); + placement.addProperty("separation", separation); + } + } +} diff --git a/src/main/java/com/teampotato/sparsestructuresreforged/mixin/StructureFeatureConfigurationMixin.java b/src/main/java/com/teampotato/sparsestructuresreforged/mixin/StructureFeatureConfigurationMixin.java deleted file mode 100644 index 50e0ead..0000000 --- a/src/main/java/com/teampotato/sparsestructuresreforged/mixin/StructureFeatureConfigurationMixin.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.teampotato.sparsestructuresreforged.mixin; - -import com.teampotato.sparsestructuresreforged.SparseStructuresReforged; -import net.minecraft.world.level.levelgen.feature.configurations.StructureFeatureConfiguration; -import org.jetbrains.annotations.NotNull; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(StructureFeatureConfiguration.class) -public class StructureFeatureConfigurationMixin { - - @Inject(method = "", at = @At("RETURN")) - private void onInit(int spacing, int separation, int salt, CallbackInfo ci) { - ssr$initialize((StructureFeatureConfiguration) (Object) this); - } - - @Unique - private static void ssr$initialize(@NotNull StructureFeatureConfiguration configuration) { - final int limit = 4095; - - double multiplier = SparseStructuresReforged.getExtraSpacingPercentage() + 1; - double spacing = configuration.spacing; - double separation = configuration.separation; - if (multiplier <= 0) multiplier = 0.01D; - spacing = (int) (spacing * multiplier); - if (spacing >= limit) spacing = limit - 1; - - multiplier = SparseStructuresReforged.getExtraSeparationPercentage() + 1; - if (multiplier <= 0) multiplier = 0.01D; - separation = (int) (separation * multiplier); - if (separation >= limit) separation = limit - 1; - - if (spacing <= separation) { - if (spacing <= 1) spacing = 3; - separation = spacing - 1; - } - - configuration.spacing = (int) spacing; - configuration.separation = (int) separation; - } -} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg deleted file mode 100644 index a9f01fd..0000000 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ /dev/null @@ -1 +0,0 @@ -public-f net.minecraft.world.gen.settings.StructureSeparationSettings * \ No newline at end of file diff --git a/src/main/resources/sparse-structures-default-config.json5 b/src/main/resources/sparse-structures-default-config.json5 new file mode 100644 index 0000000..a9efce4 --- /dev/null +++ b/src/main/resources/sparse-structures-default-config.json5 @@ -0,0 +1,30 @@ +// ### THE MOD REQUIRES A RESTART OF THE GAME TO APPLY CHANGES ### +{ + // this is the main spread factor (default is 2) + // + // tips : a spread factor can be a decimal number (such as 1.5) + // a spread factor of 1 means all structure's placement are not modified (useful if you want to use only custom spread factors) + // a spread factor above 1 means all structures are rarer + // a spread factor below 1 means all structure are more common + "spreadFactor": 2, + + // this is a list of custom spread factors + "customSpreadFactors": [ + // example of the mansion being doubled in rarity (the mod's default) + { + "structure": "minecraft:mansion", + "factor": 2 + }, + // add the structures you want to modify in the format: + // { + // "structure": "namespace:structure_name", + // "factor": number + // }, + // where "structure" is a structure_set or the name of a structure + // /!\ if you put the name of a structure, all structures in its set will be modified + // (example : "minecraft:village_plains" will modify all structures in the "villages" set) + // see https://minecraft.wiki/w/Tutorials/Custom_structures#Structure_Set for more info + // + // tip : the same spread factors rules apply here + ] +} \ No newline at end of file diff --git a/src/main/resources/sparsestructuresreforged.mixins.json b/src/main/resources/sparsestructuresreforged.mixins.json index ec5bea2..2924d0c 100644 --- a/src/main/resources/sparsestructuresreforged.mixins.json +++ b/src/main/resources/sparsestructuresreforged.mixins.json @@ -1,12 +1,12 @@ { "required": true, "package": "com.teampotato.sparsestructuresreforged.mixin", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "JAVA_17", "minVersion": "0.8", "injectors": { "defaultRequire": 1 }, "mixins": [ - "StructureFeatureConfigurationMixin" + "RegistryDataLoaderMixin" ] }