diff --git a/build.gradle b/build.gradle index 9c3276e..3bd98e0 100644 --- a/build.gradle +++ b/build.gradle @@ -25,12 +25,9 @@ loom { repositories { maven { url = "https://maven.theillusivec4.top/" } - maven { url = 'https://jitpack.io' } } dependencies { - modImplementation "com.github.MCTeamPotato:Potattributes:${project.potattributes_version}" - include "com.github.MCTeamPotato:Potattributes:${project.potattributes_version}" minecraft "com.mojang:minecraft:${project.minecraft_version}" mappings "net.fabricmc:yarn:1.19.2+build.28:v2" forge "net.minecraftforge:forge:${project.forge_version}" diff --git a/gradle.properties b/gradle.properties index 5089ca4..ed60c25 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,8 +12,14 @@ potattributes_version=1.19.2-0.0.5 # Mod Properties - mod_version=1.19.2-2.1.1 + mod_version=1.19.2-2.2.0 maven_group=com.teampotato.modifiers archives_base_name=remodifier mod_id=modifiers mod_author=TeamPotato + +# Proxy + systemProp.http.proxyHost=localhost + systemProp.http.proxyPort=7890 + systemProp.https.proxyHost=localhost + systemProp.https.proxyPort=7890 \ No newline at end of file diff --git a/src/main/java/com/teampotato/modifiers/ModifiersMod.java b/src/main/java/com/teampotato/modifiers/ModifiersMod.java index e492e6b..509a441 100644 --- a/src/main/java/com/teampotato/modifiers/ModifiersMod.java +++ b/src/main/java/com/teampotato/modifiers/ModifiersMod.java @@ -1,8 +1,8 @@ package com.teampotato.modifiers; -import com.teampotato.modifiers.common.config.*; +import com.teampotato.modifiers.common.config.toml.*; import com.teampotato.modifiers.common.curios.ICurioProxy; -import com.teampotato.modifiers.common.events.ClientEvents; +import com.teampotato.modifiers.client.events.ClientEvents; import com.teampotato.modifiers.common.events.CommonEvents; import com.teampotato.modifiers.common.item.ItemModifierBook; import com.teampotato.modifiers.common.modifier.Modifiers; @@ -34,49 +34,58 @@ public class ModifiersMod { public static final Logger LOGGER = LogManager.getLogger(); public static ICurioProxy CURIO_PROXY; public static ItemGroup GROUP_BOOKS; + public ModifiersMod() { - final IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus(); + final IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + final IEventBus forgeBus = MinecraftForge.EVENT_BUS; final ModLoadingContext ctx = ModLoadingContext.get(); - final ModConfig.Type COMMON = ModConfig.Type.COMMON; + final ModConfig.Type common = ModConfig.Type.COMMON; NetworkHandler.register(); - ITEM_DEFERRED_REGISTER.register(eventBus); - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); - MinecraftForge.EVENT_BUS.register(CommonEvents.class); - if (FMLLoader.getDist().isClient()) { - MinecraftForge.EVENT_BUS.register(ClientEvents.class); - } - ctx.registerConfig(COMMON, ReforgeConfig.CONFIG, "remodifier/reforge.toml"); - ctx.registerConfig(COMMON, CurioNArmorConfig.CONFIG, "remodifier/armor-n-curio-modifiers.toml"); - ctx.registerConfig(COMMON, ToolConfig.CONFIG, "remodifier/tool-modifiers.toml"); - ctx.registerConfig(COMMON, BowConfig.CONFIG, "remodifier/bow-modifiers.toml"); - ctx.registerConfig(COMMON, ShieldConfig.CONFIG, "remodifier/shield-modifiers.toml"); + ITEM_DEFERRED_REGISTER.register(modEventBus); + modEventBus.addListener(this::setup); + forgeBus.register(CommonEvents.class); + if (FMLLoader.getDist().isClient()) forgeBus.register(ClientEvents.class); + ctx.registerConfig(common, ReforgeConfig.CONFIG, "remodifier/reforge.toml"); + ctx.registerConfig(common, ArmorConfig.CONFIG, "remodifier/armor-modifiers.toml"); + ctx.registerConfig(common, ToolConfig.CONFIG, "remodifier/tool-modifiers.toml"); + ctx.registerConfig(common, BowConfig.CONFIG, "remodifier/bow-modifiers.toml"); + ctx.registerConfig(common, ShieldConfig.CONFIG, "remodifier/shield-modifiers.toml"); + ctx.registerConfig(common, CuriosConfig.CONFIG, "remodifier/curios-modifiers.toml"); } static { NetworkHandler.setProxy(new NetworkHandlerForge()); GROUP_BOOKS = new ItemGroup(-1, MOD_ID +"_books") { + static ItemStack icon; @Override public ItemStack createIcon() { - return MODIFIER_BOOK.get().getDefaultStack(); + if (icon == null) icon = MODIFIER_BOOK.get().getDefaultStack(); + return icon; } }; } + private static Boolean isCuriosLoaded = null; + + public static boolean isCuriosLoaded() { + if (isCuriosLoaded == null) isCuriosLoaded = ModList.get().isLoaded("curios"); + return isCuriosLoaded; + } + private void setup(final FMLCommonSetupEvent event) { - if (ModList.get().isLoaded("curios")) { - try { - CURIO_PROXY = (ICurioProxy) Class.forName("com.teampotato.modifiers.common.curios.CurioCompat").getDeclaredConstructor().newInstance(); - MinecraftForge.EVENT_BUS.register(CURIO_PROXY); - } catch (Exception e) { - LOGGER.error("Remodifier failed to load Curios integration."); - LOGGER.error(e.getMessage()); + event.enqueueWork(() -> { + if (isCuriosLoaded()) { + try { + CURIO_PROXY = (ICurioProxy) Class.forName("com.teampotato.modifiers.common.curios.CurioCompat").getDeclaredConstructor().newInstance(); + MinecraftForge.EVENT_BUS.register(CURIO_PROXY); + } catch (Exception e) { + LOGGER.error("Remodifier failed to load Curios integration.", e); + } } - } - if (CURIO_PROXY == null) { - CURIO_PROXY = new ICurioProxy() {}; - } - Modifiers.init(); + if (CURIO_PROXY == null) CURIO_PROXY = new ICurioProxy() {}; + Modifiers.initialize(); + }); } static { diff --git a/src/main/java/com/teampotato/modifiers/client/SmithingScreenReforge.java b/src/main/java/com/teampotato/modifiers/client/SmithingScreenReforge.java index b32d052..28a8dc8 100644 --- a/src/main/java/com/teampotato/modifiers/client/SmithingScreenReforge.java +++ b/src/main/java/com/teampotato/modifiers/client/SmithingScreenReforge.java @@ -1,6 +1,5 @@ package com.teampotato.modifiers.client; -@SuppressWarnings("unused") public interface SmithingScreenReforge { void modifiers_init(); diff --git a/src/main/java/com/teampotato/modifiers/client/TabButtonWidget.java b/src/main/java/com/teampotato/modifiers/client/TabButtonWidget.java index dbdae4e..d3b57d0 100644 --- a/src/main/java/com/teampotato/modifiers/client/TabButtonWidget.java +++ b/src/main/java/com/teampotato/modifiers/client/TabButtonWidget.java @@ -2,7 +2,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; @@ -38,9 +37,9 @@ public void setTextureUV(int i, int j, int k, int l, Identifier identifier) { public void renderButton(MatrixStack matrixStack, int i, int j, float f) { MinecraftClient minecraftClient = MinecraftClient.getInstance(); - TextRenderer textRenderer = minecraftClient.textRenderer; minecraftClient.getTextureManager().bindTexture(this.texture); RenderSystem.disableDepthTest(); + int u = this.u; int v = this.v; if (this.toggled) { @@ -53,7 +52,7 @@ public void renderButton(MatrixStack matrixStack, int i, int j, float f) { this.drawTexture(matrixStack, this.x, this.y, u, v, this.width, this.height); int color = this.active ? 16777215 : 10526880; - drawCenteredText(matrixStack, textRenderer, this.getMessage(), this.x + this.width / 2, this.y + (this.height - 8) / 2, color | MathHelper.ceil(this.alpha * 255.0F) << 24); + drawCenteredText(matrixStack, minecraftClient.textRenderer, this.getMessage(), this.x + this.width / 2, this.y + (this.height - 8) / 2, color | MathHelper.ceil(this.alpha * 255.0F) << 24); if (this.isHovered()) this.renderTooltip(matrixStack, i, j); RenderSystem.enableDepthTest(); diff --git a/src/main/java/com/teampotato/modifiers/common/events/ClientEvents.java b/src/main/java/com/teampotato/modifiers/client/events/ClientEvents.java similarity index 92% rename from src/main/java/com/teampotato/modifiers/common/events/ClientEvents.java rename to src/main/java/com/teampotato/modifiers/client/events/ClientEvents.java index eb0b0bc..a72bc20 100644 --- a/src/main/java/com/teampotato/modifiers/common/events/ClientEvents.java +++ b/src/main/java/com/teampotato/modifiers/client/events/ClientEvents.java @@ -1,4 +1,4 @@ -package com.teampotato.modifiers.common.events; +package com.teampotato.modifiers.client.events; import com.teampotato.modifiers.common.modifier.Modifier; import com.teampotato.modifiers.common.modifier.ModifierHandler; diff --git a/src/main/java/com/teampotato/modifiers/common/config/json/JsonConfigInitialier.java b/src/main/java/com/teampotato/modifiers/common/config/json/JsonConfigInitialier.java new file mode 100644 index 0000000..f585fc9 --- /dev/null +++ b/src/main/java/com/teampotato/modifiers/common/config/json/JsonConfigInitialier.java @@ -0,0 +1,121 @@ +package com.teampotato.modifiers.common.config.json; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.teampotato.modifiers.ModifiersMod; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraftforge.fml.loading.FMLLoader; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Path; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +@SuppressWarnings("ResultOfMethodCallIgnored") +public class JsonConfigInitialier { + + private static final Path ROOT = FMLLoader.getGamePath().resolve("config").resolve("remodifier"); + private static final String NAME = "name", WEIGHT = "weight", ATTRIBUTES = "attributes", AMOUNTS = "amounts", OPERATION_ID = "operationId"; + + private static @NotNull FileWriter writeFile(File configFile) throws IOException { + JsonObject config = new JsonObject(); + config.addProperty(NAME, "violent"); + config.addProperty(WEIGHT, 100); + config.addProperty(ATTRIBUTES, "minecraft:generic.attack_speed"); + config.addProperty(AMOUNTS, "0.04"); + config.addProperty(OPERATION_ID, "2"); + FileWriter fileWriter = new FileWriter(configFile); + fileWriter.write(config.toString()); + return fileWriter; + } + + static { + ROOT.toFile().mkdirs(); + mkdirs("armor", "curios", "shield", "tool", "bow"); + generateExampleFile(); + } + + private static void mkdirs(String @NotNull ... strings) { + for (String s : strings) ROOT.resolve(s).toFile().mkdirs(); + } + + private static void generateExampleFile() { + File violent = new File(ROOT.resolve("armor").toFile(), "violent.json"); + if (!violent.exists()) { + try { + FileWriter writer = writeFile(violent); + writer.close(); + } catch (Throwable throwable) { + ModifiersMod.LOGGER.error("Error occurs during example json file generation", throwable); + } + } + } + + private static final Iterable BOW_JSONS = readFiles(ROOT.resolve("bow")), + CURIOS_JSONS = readFiles(ROOT.resolve("curios")), + ARMOR_JSONS = readFiles(ROOT.resolve("armor")), + SHIELD_JSONS = readFiles(ROOT.resolve("shield")), + TOOL_JSONS = readFiles(ROOT.resolve("tool")); + + public static final Iterable BOW_NAMES = getElements(BOW_JSONS, NAME), + BOW_WEIGHTS = getElements(BOW_JSONS, WEIGHT), + BOW_ATTRIBUTES = getElements(BOW_JSONS, ATTRIBUTES), + BOW_AMOUNTS = getElements(BOW_JSONS, AMOUNTS), + BOW_OPERATIONS_IDS = getElements(BOW_JSONS, OPERATION_ID); + + public static final Iterable CURIOS_NAMES = getElements(CURIOS_JSONS, NAME), + CURIOS_WEIGHTS = getElements(CURIOS_JSONS, WEIGHT), + CURIOS_ATTRIBUTES = getElements(CURIOS_JSONS, ATTRIBUTES), + CURIOS_AMOUNTS = getElements(CURIOS_JSONS, AMOUNTS), + CURIOS_OPERATIONS_IDS = getElements(CURIOS_JSONS, OPERATION_ID); + + public static final Iterable ARMOR_NAMES = getElements(ARMOR_JSONS, NAME), + ARMOR_WEIGHTS = getElements(ARMOR_JSONS, WEIGHT), + ARMOR_ATTRIBUTES = getElements(ARMOR_JSONS, ATTRIBUTES), + ARMOR_AMOUNTS = getElements(ARMOR_JSONS, AMOUNTS), + ARMOR_OPERATIONS_IDS = getElements(ARMOR_JSONS, OPERATION_ID); + + public static final Iterable SHIELD_NAMES = getElements(SHIELD_JSONS, NAME), + SHIELD_WEIGHTS = getElements(SHIELD_JSONS, WEIGHT), + SHIELD_ATTRIBUTES = getElements(SHIELD_JSONS, ATTRIBUTES), + SHIELD_AMOUNTS = getElements(SHIELD_JSONS, AMOUNTS), + SHIELD_OPERATIONS_IDS = getElements(SHIELD_JSONS, OPERATION_ID); + + public static final Iterable TOOL_NAMES = getElements(TOOL_JSONS, NAME), + TOOL_WEIGHTS = getElements(TOOL_JSONS, WEIGHT), + TOOL_ATTRIBUTES = getElements(TOOL_JSONS, ATTRIBUTES), + TOOL_AMOUNTS = getElements(TOOL_JSONS, AMOUNTS), + TOOL_OPERATIONS_IDS = getElements(TOOL_JSONS, OPERATION_ID); + + private static @NotNull Iterable getElements(@NotNull Iterable files, String element) { + List names = new LinkedList<>(); + for (File file : files) { + try { + FileReader fileReader = new FileReader(file); + JsonObject configObject = JsonParser.parseReader(fileReader).getAsJsonObject(); + names.add(configObject.get(element).getAsString()); + } catch (Throwable throwable) { + ModifiersMod.LOGGER.error("Error occurs during " + file.getName() + " reading", throwable); + } + } + return names; + } + + private static @NotNull Iterable readFiles(@NotNull Path path) { + List fileList = new ObjectArrayList<>(); + File folder = path.toFile(); + if (!folder.exists() || !folder.isDirectory()) return Collections.emptySet(); + File[] files = folder.listFiles(); + if (files == null) return Collections.emptySet(); + for (File file : files) { + if (!file.isFile() || !file.getName().toLowerCase().endsWith(".json")) continue; + fileList.add(file); + } + return fileList; + } +} diff --git a/src/main/java/com/teampotato/modifiers/common/config/CurioNArmorConfig.java b/src/main/java/com/teampotato/modifiers/common/config/toml/ArmorConfig.java similarity index 85% rename from src/main/java/com/teampotato/modifiers/common/config/CurioNArmorConfig.java rename to src/main/java/com/teampotato/modifiers/common/config/toml/ArmorConfig.java index ab5efc7..3ca4e4a 100644 --- a/src/main/java/com/teampotato/modifiers/common/config/CurioNArmorConfig.java +++ b/src/main/java/com/teampotato/modifiers/common/config/toml/ArmorConfig.java @@ -1,11 +1,11 @@ -package com.teampotato.modifiers.common.config; +package com.teampotato.modifiers.common.config.toml; import com.google.common.collect.Lists; import net.minecraftforge.common.ForgeConfigSpec; import java.util.List; -public class CurioNArmorConfig { +public class ArmorConfig { public static ForgeConfigSpec CONFIG; public static ForgeConfigSpec.ConfigValue> NAMES; public static ForgeConfigSpec.ConfigValue> WEIGHTS; @@ -15,13 +15,13 @@ public class CurioNArmorConfig { static { ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder(); - BUILDER.push("Modifiers for armors and curios"); + BUILDER.push("Modifiers for armors"); BUILDER.comment("This configuration file is based on index. it means, 'half_hearted' -> '300' -> 'generic.max_health' -> '1.0' -> '0' is the first index.", "WARNING: You have to make a resource pack to save the customization-required translation key for the attributes if the mod author didn't do that, or your customization on other mods' attribute will crash the game!", "A hint on the translation key format: attribute.modxxx.attributexxx, e.g. attribute.minecraft.generic.attack_damage"); - NAMES = BUILDER.comment("The name of the modifier").defineList("NAMES", Lists.newArrayList("half_hearted", "hearty", "hard", "guarding", "armored", "warding", "jagged", "spiked", "angry", "menacing", "brisk", "fleeting", "hasty", "quick", "wild", "rash", "intrepid", "violent"), o -> true); - WEIGHTS = BUILDER.comment("The weight of the modifier in the modifiers pool").defineList("WEIGHTS", Lists.newArrayList("300", "100", "300", "200", "100", "200", "200", "200", "100", "100", "200", "200", "100", "100", "200", "200", "100", "100"), o -> true); - ATTRIBUTES = BUILDER.comment("The attribute of the modifier has. One modifier can have multiple attributes. Use ';' to split different attributes").defineList("ATTRIBUTES", Lists.newArrayList("minecraft:generic.max_health", "minecraft:generic.max_health", "minecraft:generic.armor", "minecraft:generic.armor", "minecraft:generic.armor", "minecraft:generic.armor_toughness", "minecraft:generic.attack_damage", "minecraft:generic.attack_damage", "minecraft:generic.attack_damage", "minecraft:generic.attack_damage", "minecraft:generic.movement_speed", "minecraft:generic.movement_speed", "minecraft:generic.movement_speed", "minecraft:generic.movement_speed", "minecraft:generic.attack_speed", "minecraft:generic.attack_speed", "minecraft:generic.attack_speed", "minecraft:generic.attack_speed"), o -> true); - AMOUNTS = BUILDER.comment("The amount used to calculate the attribute effect. Also can be multiple. Use ';' to split").defineList("AMOUNTS", Lists.newArrayList("1.0", "2.0", "1.0", "1.5", "2.0", "1.0", "0.01", "0.02", "0.03", "0.04", "0.01", "0.02","0.03", "0.04", "0.01", "0.02", "0.03", "0.04"), o -> true); - OPERATIONS_IDS = BUILDER.comment("The operation ID of the attribute calculation. Can be three values: 0,1,2. 0 is ADDITION. 1 is MULTIPLY_BASE. 2 is MULTIPLY_TOTAL. you can refer to the calculation of the attributes already in the game").defineList("OPERATIONS_IDS", Lists.newArrayList("0", "0", "0", "0", "0", "0", "2", "2", "2", "2", "2", "2", "2","2", "2", "2", "2", "2"), o -> true); + NAMES = BUILDER.comment("The name of the modifier").defineList("NAMES", Lists.newArrayList("half_hearted", "hearty", "hard", "guarding", "armored", "warding", "jagged", "spiked", "angry", "menacing", "brisk", "fleeting", "hasty", "quick", "wild", "rash", "intrepid"), o -> true); + WEIGHTS = BUILDER.comment("The weight of the modifier in the modifiers pool").defineList("WEIGHTS", Lists.newArrayList("300", "100", "300", "200", "100", "200", "200", "200", "100", "100", "200", "200", "100", "100", "200", "200", "100"), o -> true); + ATTRIBUTES = BUILDER.comment("The attribute of the modifier has. One modifier can have multiple attributes. Use ';' to split different attributes").defineList("ATTRIBUTES", Lists.newArrayList("minecraft:generic.max_health", "minecraft:generic.max_health", "minecraft:generic.armor", "minecraft:generic.armor", "minecraft:generic.armor", "minecraft:generic.armor_toughness", "minecraft:generic.attack_damage", "minecraft:generic.attack_damage", "minecraft:generic.attack_damage", "minecraft:generic.attack_damage", "minecraft:generic.movement_speed", "minecraft:generic.movement_speed", "minecraft:generic.movement_speed", "minecraft:generic.movement_speed", "minecraft:generic.attack_speed", "minecraft:generic.attack_speed", "minecraft:generic.attack_speed"), o -> true); + AMOUNTS = BUILDER.comment("The amount used to calculate the attribute effect. Also can be multiple. Use ';' to split").defineList("AMOUNTS", Lists.newArrayList("1.0", "2.0", "1.0", "1.5", "2.0", "1.0", "0.01", "0.02", "0.03", "0.04", "0.01", "0.02","0.03", "0.04", "0.01", "0.02", "0.03"), o -> true); + OPERATIONS_IDS = BUILDER.comment("The operation ID of the attribute calculation. Can be three values: 0,1,2. 0 is ADDITION. 1 is MULTIPLY_BASE. 2 is MULTIPLY_TOTAL. you can refer to the calculation of the attributes already in the game").defineList("OPERATIONS_IDS", Lists.newArrayList("0", "0", "0", "0", "0", "0", "2", "2", "2", "2", "2", "2", "2","2", "2", "2", "2"), o -> true); BUILDER.pop(); CONFIG = BUILDER.build(); } diff --git a/src/main/java/com/teampotato/modifiers/common/config/BowConfig.java b/src/main/java/com/teampotato/modifiers/common/config/toml/BowConfig.java similarity index 97% rename from src/main/java/com/teampotato/modifiers/common/config/BowConfig.java rename to src/main/java/com/teampotato/modifiers/common/config/toml/BowConfig.java index 7d9c01b..930a1c7 100644 --- a/src/main/java/com/teampotato/modifiers/common/config/BowConfig.java +++ b/src/main/java/com/teampotato/modifiers/common/config/toml/BowConfig.java @@ -1,4 +1,4 @@ -package com.teampotato.modifiers.common.config; +package com.teampotato.modifiers.common.config.toml; import com.google.common.collect.Lists; import net.minecraftforge.common.ForgeConfigSpec; diff --git a/src/main/java/com/teampotato/modifiers/common/config/toml/CuriosConfig.java b/src/main/java/com/teampotato/modifiers/common/config/toml/CuriosConfig.java new file mode 100644 index 0000000..ca0fe1a --- /dev/null +++ b/src/main/java/com/teampotato/modifiers/common/config/toml/CuriosConfig.java @@ -0,0 +1,29 @@ +package com.teampotato.modifiers.common.config.toml; + +import com.google.common.collect.Lists; +import net.minecraftforge.common.ForgeConfigSpec; + +import java.util.List; + +public class CuriosConfig { + public static ForgeConfigSpec CONFIG; + public static ForgeConfigSpec.ConfigValue> NAMES; + public static ForgeConfigSpec.ConfigValue> WEIGHTS; + public static ForgeConfigSpec.ConfigValue> ATTRIBUTES; + public static ForgeConfigSpec.ConfigValue> AMOUNTS; + public static ForgeConfigSpec.ConfigValue> OPERATIONS_IDS; + public static ForgeConfigSpec.BooleanValue WHETHER_OR_NOT_CURIOS_USE_ARMOR_MODIFIERS; + + static { + ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder(); + BUILDER.push("Modifiers for shields"); + WHETHER_OR_NOT_CURIOS_USE_ARMOR_MODIFIERS = BUILDER.comment("When enabled, the below configurations will be ignored and your curio items will use armor modifiers.").define("WhetherOrNotCuriosUseArmorModifiers", true); + NAMES = BUILDER.comment("The name of the modifier").defineList("NAMES", Lists.newArrayList(), o -> true); + WEIGHTS = BUILDER.comment("The weight of the modifier in the modifiers pool").defineList("WEIGHTS", Lists.newArrayList(), o -> true); + ATTRIBUTES = BUILDER.comment("The attribute of the modifier has. One modifier can have multiple attributes. Use ';' to split different attributes").defineList("ATTRIBUTES", Lists.newArrayList(), o -> true); + AMOUNTS = BUILDER.comment("The amount used to calculate the attribute effect. Also can be multiple. Use ';' to split").defineList("AMOUNTS", Lists.newArrayList(), o -> true); + OPERATIONS_IDS = BUILDER.comment("The operation ID of the attribute calculation. Can be three values: 0,1,2. 0 is ADDITION. 1 is MULTIPLY_BASE. 2 is MULTIPLY_TOTAL. you can refer to the calculation of the attributes already in the game").defineList("OPERATIONS_IDS", Lists.newArrayList(), o -> true); + BUILDER.pop(); + CONFIG = BUILDER.build(); + } +} diff --git a/src/main/java/com/teampotato/modifiers/common/config/ReforgeConfig.java b/src/main/java/com/teampotato/modifiers/common/config/toml/ReforgeConfig.java similarity index 92% rename from src/main/java/com/teampotato/modifiers/common/config/ReforgeConfig.java rename to src/main/java/com/teampotato/modifiers/common/config/toml/ReforgeConfig.java index ba1f060..c4851b4 100644 --- a/src/main/java/com/teampotato/modifiers/common/config/ReforgeConfig.java +++ b/src/main/java/com/teampotato/modifiers/common/config/toml/ReforgeConfig.java @@ -1,4 +1,4 @@ -package com.teampotato.modifiers.common.config; +package com.teampotato.modifiers.common.config.toml; import net.minecraftforge.common.ForgeConfigSpec; diff --git a/src/main/java/com/teampotato/modifiers/common/config/ShieldConfig.java b/src/main/java/com/teampotato/modifiers/common/config/toml/ShieldConfig.java similarity index 97% rename from src/main/java/com/teampotato/modifiers/common/config/ShieldConfig.java rename to src/main/java/com/teampotato/modifiers/common/config/toml/ShieldConfig.java index 1b1029c..09e661f 100644 --- a/src/main/java/com/teampotato/modifiers/common/config/ShieldConfig.java +++ b/src/main/java/com/teampotato/modifiers/common/config/toml/ShieldConfig.java @@ -1,4 +1,4 @@ -package com.teampotato.modifiers.common.config; +package com.teampotato.modifiers.common.config.toml; import com.google.common.collect.Lists; import net.minecraftforge.common.ForgeConfigSpec; diff --git a/src/main/java/com/teampotato/modifiers/common/config/ToolConfig.java b/src/main/java/com/teampotato/modifiers/common/config/toml/ToolConfig.java similarity index 98% rename from src/main/java/com/teampotato/modifiers/common/config/ToolConfig.java rename to src/main/java/com/teampotato/modifiers/common/config/toml/ToolConfig.java index ee4a148..078d5cf 100644 --- a/src/main/java/com/teampotato/modifiers/common/config/ToolConfig.java +++ b/src/main/java/com/teampotato/modifiers/common/config/toml/ToolConfig.java @@ -1,4 +1,4 @@ -package com.teampotato.modifiers.common.config; +package com.teampotato.modifiers.common.config.toml; import com.google.common.collect.Lists; import net.minecraftforge.common.ForgeConfigSpec; diff --git a/src/main/java/com/teampotato/modifiers/common/curios/CurioCompat.java b/src/main/java/com/teampotato/modifiers/common/curios/CurioCompat.java index e44a520..f3758ba 100644 --- a/src/main/java/com/teampotato/modifiers/common/curios/CurioCompat.java +++ b/src/main/java/com/teampotato/modifiers/common/curios/CurioCompat.java @@ -19,10 +19,7 @@ public void onCurioChange(CurioChangeEvent event) { int slot = event.getSlotIndex(); Modifier modFrom = ModifierHandler.getModifier(event.getFrom()); - if (modFrom != null) { - ModifierHandler.removeCurioModifier(entity, modFrom, identifier, slot); - } - + if (modFrom != null) ModifierHandler.removeCurioModifier(entity, modFrom, identifier, slot); Modifier modifier = ModifierHandler.getModifier(to); if (modifier == null) { modifier = ModifierHandler.rollModifier(to, ThreadLocalRandom.current()); @@ -32,7 +29,8 @@ public void onCurioChange(CurioChangeEvent event) { ModifierHandler.applyCurioModifier(entity, modifier, identifier, slot); } - @Override public boolean isModifiableCurio(ItemStack stack) { + @Override + public boolean isModifiableCurio(ItemStack stack) { return !CuriosApi.getCuriosHelper().getCurioTags(stack.getItem()).isEmpty(); } } diff --git a/src/main/java/com/teampotato/modifiers/common/item/ItemModifierBook.java b/src/main/java/com/teampotato/modifiers/common/item/ItemModifierBook.java index 847d766..2834897 100644 --- a/src/main/java/com/teampotato/modifiers/common/item/ItemModifierBook.java +++ b/src/main/java/com/teampotato/modifiers/common/item/ItemModifierBook.java @@ -21,7 +21,6 @@ import java.util.List; public class ItemModifierBook extends Item { - public static final Identifier ID = new Identifier("modifiers", "modifier_book"); public ItemModifierBook() { super(new Settings().rarity(Rarity.EPIC).group(ModifiersMod.GROUP_BOOKS)); } @@ -36,44 +35,41 @@ public boolean hasGlint(ItemStack stack) { @Override public void appendStacks(ItemGroup group, DefaultedList items) { - // FIXME make variants display in JEI - if (this.isIn(group)) { - items.addAll(getStacks()); - } + if (this.isIn(group)) items.addAll(getStacks()); } @Override public Text getName(ItemStack stack) { Text base = super.getName(stack); - if (!stack.hasNbt() || (stack.getNbt() != null &&!stack.getNbt().contains(ModifierHandler.bookTagName))) return base; - Modifier mod = com.teampotato.modifiers.common.modifier.Modifiers.MODIFIERS.get(new Identifier(stack.getNbt().getString(ModifierHandler.bookTagName))); + if (!stack.hasNbt() || (stack.getNbt() != null && !stack.getNbt().contains(ModifierHandler.bookTagName))) return base; + Modifier mod = Modifiers.MODIFIERS.get(new Identifier(stack.getNbt().getString(ModifierHandler.bookTagName))); if (mod == null) return base; return Text.translatable("misc.modifiers.modifier_prefix").append(MutableText.of(mod.getFormattedName())); } @Override - public void appendTooltip(ItemStack stack, @Nullable World worldIn, - List tooltip, TooltipContext flagIn) { + public void appendTooltip(ItemStack stack, @Nullable World worldIn, List tooltip, TooltipContext flagIn) { + String translationKey = this.getTranslationKey(); if (stack.getNbt() != null && stack.getNbt().contains(ModifierHandler.bookTagName)) { - Modifier mod = com.teampotato.modifiers.common.modifier.Modifiers.MODIFIERS.get( - new Identifier(stack.getNbt().getString(ModifierHandler.bookTagName))); + Modifier mod = Modifiers.MODIFIERS.get(new Identifier(stack.getNbt().getString(ModifierHandler.bookTagName))); if (mod != null) { tooltip.addAll(mod.getInfoLines()); - tooltip.add(Text.translatable(this.getTranslationKey() + ".tooltip.0")); - tooltip.add(Text.translatable(this.getTranslationKey() + ".tooltip.1")); + tooltip.add(Text.translatable(translationKey + ".tooltip.0")); + tooltip.add(Text.translatable(translationKey + ".tooltip.1")); return; } } - tooltip.add(Text.translatable(this.getTranslationKey()+".tooltip.invalid")); + tooltip.add(Text.translatable(translationKey + ".tooltip.invalid")); } protected List getStacks() { List modifiers = new ObjectArrayList<>(); modifiers.add(Modifiers.NONE); - modifiers.addAll(Modifiers.curio_pool.modifiers); - modifiers.addAll(Modifiers.tool_pool.modifiers); - modifiers.addAll(Modifiers.shield_pool.modifiers); - modifiers.addAll(Modifiers.bow_pool.modifiers); + modifiers.addAll(Modifiers.curioPool.modifiers); + modifiers.addAll(Modifiers.toolPool.modifiers); + modifiers.addAll(Modifiers.shieldPool.modifiers); + modifiers.addAll(Modifiers.bowPool.modifiers); + modifiers.addAll(Modifiers.armorPool.modifiers); List stacks = new ObjectArrayList<>(); for (Modifier mod : modifiers) { diff --git a/src/main/java/com/teampotato/modifiers/common/modifier/Modifier.java b/src/main/java/com/teampotato/modifiers/common/modifier/Modifier.java index 90d1314..a52ab4d 100644 --- a/src/main/java/com/teampotato/modifiers/common/modifier/Modifier.java +++ b/src/main/java/com/teampotato/modifiers/common/modifier/Modifier.java @@ -1,6 +1,5 @@ package com.teampotato.modifiers.common.modifier; -import com.teampotato.modifiers.ModifiersMod; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.attribute.EntityAttributeModifier; @@ -13,9 +12,10 @@ import net.minecraftforge.registries.ForgeRegistries; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.UUID; @@ -29,6 +29,7 @@ public class Modifier { public final ModifierType type; public final List> modifiers; + private Modifier(Identifier name, String debugName, int weight, ModifierType type, List> modifiers) { this.name = name; this.debugName = debugName; @@ -69,8 +70,6 @@ private static MutableText getModifierDescription(Pair getInfoLines() { - // TODO: probably want a "no effect" description rather than just not showing a description for modifiers with no effect - // also maybe "no modifier" for None, idk List lines = new ObjectArrayList<>(); int size = modifiers.size(); if (size < 1) return lines; @@ -89,17 +88,12 @@ public List getInfoLines() { return lines; } - // TODO might want to distinguish between curio slots and armor slots in future, too - public enum ModifierType { - EQUIPPED, HELD, BOTH - } - public static class ModifierBuilder { int weight = 100; final Identifier name; final String debugName; final ModifierType type; - List> modifiers = new ArrayList<>(); + List> modifiers = new ObjectArrayList<>(); public ModifierBuilder(Identifier name, String debugName, ModifierType type) { this.name = name; @@ -122,8 +116,7 @@ public ModifierBuilder addModifiers(String[] attribute, AttributeModifierSupplie int index = Arrays.asList(attribute).indexOf(entityAttribute); EntityAttribute registryAttribute = ForgeRegistries.ATTRIBUTES.getValue(new Identifier(entityAttribute)); if (registryAttribute == null) { - ModifiersMod.LOGGER.fatal("Invalid key: " + entityAttribute); - throw new RuntimeException(); + throw new RuntimeException("Invalid key: " + entityAttribute); } modifiers.add(new ImmutablePair<>(registryAttribute, modifier[index])); } @@ -137,7 +130,8 @@ public Modifier build() { public record AttributeModifierSupplier(double amount, EntityAttributeModifier.Operation operation) { - public EntityAttributeModifier getAttributeModifier(UUID id, String name) { + @Contract(value = "_, _ -> new", pure = true) + public @NotNull EntityAttributeModifier getAttributeModifier(UUID id, String name) { return new EntityAttributeModifier(id, name, amount, operation); } } diff --git a/src/main/java/com/teampotato/modifiers/common/modifier/ModifierHandler.java b/src/main/java/com/teampotato/modifiers/common/modifier/ModifierHandler.java index 94d09b3..cc2a44e 100644 --- a/src/main/java/com/teampotato/modifiers/common/modifier/ModifierHandler.java +++ b/src/main/java/com/teampotato/modifiers/common/modifier/ModifierHandler.java @@ -20,17 +20,17 @@ public class ModifierHandler { public static final String bookTagName = "bookModifier"; public static boolean canHaveModifiers(ItemStack stack) { - return !stack.isEmpty() && stack.getMaxCount() <= 1 /* && stack.getItem() != ModItems.modifier_book*/; + return !stack.isEmpty() && stack.getMaxCount() <= 1; } @Nullable public static Modifier rollModifier(ItemStack stack, Random random) { if (!canHaveModifiers(stack)) return null; - // TODO if multiple pools applicable, roll between them - if (Modifiers.curio_pool.isApplicable.test(stack)) return Modifiers.curio_pool.roll(random); - if (Modifiers.tool_pool.isApplicable.test(stack)) return Modifiers.tool_pool.roll(random); - if (Modifiers.bow_pool.isApplicable.test(stack)) return Modifiers.bow_pool.roll(random); - if (Modifiers.shield_pool.isApplicable.test(stack)) return Modifiers.shield_pool.roll(random); + if (Modifiers.curioPool.isApplicable.test(stack)) return Modifiers.curioPool.roll(random); + if (Modifiers.toolPool.isApplicable.test(stack)) return Modifiers.toolPool.roll(random); + if (Modifiers.bowPool.isApplicable.test(stack)) return Modifiers.bowPool.roll(random); + if (Modifiers.shieldPool.isApplicable.test(stack)) return Modifiers.shieldPool.roll(random); + if (Modifiers.armorPool.isApplicable.test(stack)) return Modifiers.armorPool.roll(random); return null; } @@ -45,7 +45,8 @@ public static boolean hasModifier(ItemStack stack) { return tag != null && tag.contains(tagName); } - @Nullable public static Modifier getModifier(ItemStack stack) { + @Nullable + public static Modifier getModifier(ItemStack stack) { NbtCompound tag = stack.getNbt(); if (tag == null) return null; if (!tag.contains(tagName)) return null; @@ -60,7 +61,7 @@ public static UUID getCurioUuid(String identifier, int slot, int attributeIndex) } public static void applyCurioModifier(LivingEntity entity, Modifier modifier, String slotIdentifier, int index) { - if (modifier.type == Modifier.ModifierType.HELD) { + if (modifier.type == ModifierType.HELD) { return; } for (int i = 0; i < modifier.modifiers.size(); i++) { @@ -90,8 +91,8 @@ public static UUID getEquipmentUuid(EquipmentSlot slot, int attributeIndex) { } public static void applyEquipmentModifier(LivingEntity entity, Modifier modifier, EquipmentSlot type) { - if (modifier.type == Modifier.ModifierType.HELD && type.getType() == EquipmentSlot.Type.ARMOR - || modifier.type == Modifier.ModifierType.EQUIPPED && type.getType() == EquipmentSlot.Type.HAND) { + if (modifier.type == ModifierType.HELD && type.getType() == EquipmentSlot.Type.ARMOR + || modifier.type == ModifierType.EQUIPPED && type.getType() == EquipmentSlot.Type.HAND) { return; } for (int i = 0; i < modifier.modifiers.size(); i++) { diff --git a/src/main/java/com/teampotato/modifiers/common/modifier/ModifierPool.java b/src/main/java/com/teampotato/modifiers/common/modifier/ModifierPool.java index 69684ae..30d7e8e 100644 --- a/src/main/java/com/teampotato/modifiers/common/modifier/ModifierPool.java +++ b/src/main/java/com/teampotato/modifiers/common/modifier/ModifierPool.java @@ -1,10 +1,10 @@ package com.teampotato.modifiers.common.modifier; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import net.minecraft.item.ItemStack; -import java.util.ArrayList; -import java.util.List; import java.util.Random; +import java.util.Set; import java.util.function.Predicate; public class ModifierPool { @@ -12,7 +12,7 @@ public class ModifierPool { public int totalWeight = 0; // Pool weight, for choosing which pool to use when multiple are applicable. public int poolWeight = 0; - public List modifiers = new ArrayList<>(); + public Set modifiers = new ObjectOpenHashSet<>(); public ModifierPool(Predicate isApplicable) { this.isApplicable = isApplicable; diff --git a/src/main/java/com/teampotato/modifiers/common/modifier/ModifierType.java b/src/main/java/com/teampotato/modifiers/common/modifier/ModifierType.java new file mode 100644 index 0000000..320bef8 --- /dev/null +++ b/src/main/java/com/teampotato/modifiers/common/modifier/ModifierType.java @@ -0,0 +1,5 @@ +package com.teampotato.modifiers.common.modifier; + +public enum ModifierType { + EQUIPPED, HELD, BOTH +} diff --git a/src/main/java/com/teampotato/modifiers/common/modifier/Modifiers.java b/src/main/java/com/teampotato/modifiers/common/modifier/Modifiers.java index 03f66e7..80aa6e1 100644 --- a/src/main/java/com/teampotato/modifiers/common/modifier/Modifiers.java +++ b/src/main/java/com/teampotato/modifiers/common/modifier/Modifiers.java @@ -1,76 +1,88 @@ package com.teampotato.modifiers.common.modifier; import com.teampotato.modifiers.ModifiersMod; -import com.teampotato.modifiers.common.config.BowConfig; -import com.teampotato.modifiers.common.config.CurioNArmorConfig; -import com.teampotato.modifiers.common.config.ShieldConfig; -import com.teampotato.modifiers.common.config.ToolConfig; -import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; +import com.teampotato.modifiers.common.config.toml.*; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.attribute.EntityAttributeModifier.Operation; import net.minecraft.item.*; import net.minecraft.util.Identifier; import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import java.util.Iterator; import java.util.List; import java.util.Map; +import static com.teampotato.modifiers.common.config.json.JsonConfigInitialier.*; + +@SuppressWarnings("MismatchedQueryAndUpdateOfCollection") public class Modifiers { - public static Map MODIFIERS = new Object2ObjectLinkedOpenHashMap<>(); + public static final Map MODIFIERS = new Object2ObjectOpenHashMap<>(); + + public static final Modifier NONE = new Modifier.ModifierBuilder(new Identifier(ModifiersMod.MOD_ID, "none"), "modifier_none", ModifierType.BOTH).setWeight(0).build(); - public static Modifier NONE = new Modifier.ModifierBuilder(new Identifier(ModifiersMod.MOD_ID, "none"), "modifier_none", Modifier.ModifierType.BOTH).setWeight(0).build(); static { MODIFIERS.put(NONE.name, NONE); } - public static ModifierPool curio_pool = new ModifierPool(stack -> { - if (stack.getItem() instanceof ArmorItem) return true; - return ModifiersMod.CURIO_PROXY.isModifiableCurio(stack); - }); + public static final ModifierPool curioPool = new ModifierPool(stack -> ModifiersMod.CURIO_PROXY.isModifiableCurio(stack)); + + public static final ModifierPool armorPool = new ModifierPool(stack -> stack.getItem() instanceof ArmorItem || ModifiersMod.CURIO_PROXY.isModifiableCurio(stack)); - public static ModifierPool tool_pool = new ModifierPool(stack -> { + public static final ModifierPool toolPool = new ModifierPool(stack -> { Item item = stack.getItem(); if (item instanceof SwordItem) return true; return item instanceof MiningToolItem; }); - public static ModifierPool bow_pool = new ModifierPool(stack -> stack.getItem() instanceof RangedWeaponItem); + public static final ModifierPool bowPool = new ModifierPool(stack -> stack.getItem() instanceof RangedWeaponItem); - public static ModifierPool shield_pool = new ModifierPool(stack -> stack.getItem() instanceof ShieldItem); + public static final ModifierPool shieldPool = new ModifierPool(stack -> stack.getItem() instanceof ShieldItem); - private static Modifier.ModifierBuilder curio(String name) { - return new Modifier.ModifierBuilder(new Identifier(ModifiersMod.MOD_ID, name), "modifier_" + name, Modifier.ModifierType.EQUIPPED); + @Contract("_ -> new") + private static Modifier.@NotNull ModifierBuilder armor(String name) { + return new Modifier.ModifierBuilder(new Identifier(ModifiersMod.MOD_ID, name), "modifier_" + name, ModifierType.EQUIPPED); } - private static Modifier.ModifierBuilder tool(String name) { - return new Modifier.ModifierBuilder(new Identifier(ModifiersMod.MOD_ID, name), "modifier_" + name, Modifier.ModifierType.HELD); + @Contract("_ -> new") + private static Modifier.@NotNull ModifierBuilder tool(String name) { + return new Modifier.ModifierBuilder(new Identifier(ModifiersMod.MOD_ID, name), "modifier_" + name, ModifierType.HELD); } private static void addCurio(Modifier modifier) { MODIFIERS.put(modifier.name, modifier); - curio_pool.add(modifier); + curioPool.add(modifier); + } + + private static void addArmor(Modifier modifier) { + MODIFIERS.put(modifier.name, modifier); + armorPool.add(modifier); } private static void addTool(Modifier modifier) { MODIFIERS.put(modifier.name, modifier); - tool_pool.add(modifier); + toolPool.add(modifier); } private static void addBow(Modifier modifier) { MODIFIERS.put(modifier.name, modifier); - bow_pool.add(modifier); + bowPool.add(modifier); } private static void addShield(Modifier modifier) { MODIFIERS.put(modifier.name, modifier); - shield_pool.add(modifier); + shieldPool.add(modifier); } - private static Modifier.AttributeModifierSupplier mod(double amount, Operation op) { + @Contract("_, _ -> new") + private static Modifier.@NotNull AttributeModifierSupplier mod(double amount, Operation op) { return new Modifier.AttributeModifierSupplier(amount, op); } - private static Modifier.AttributeModifierSupplier[] mods(String[] amounts, String[] ops) { + private static Modifier.AttributeModifierSupplier @NotNull [] mods(String @NotNull [] amounts, String[] ops) { Modifier.AttributeModifierSupplier[] suppliers = new Modifier.AttributeModifierSupplier[amounts.length]; for (String amount : amounts) { int index = List.of(amounts).indexOf(amount); @@ -79,14 +91,19 @@ private static Modifier.AttributeModifierSupplier[] mods(String[] amounts, Strin return suppliers; } + @Contract("_, _ -> new") + private static @NotNull List merge(@NotNull Iterable iterable1, @NotNull Iterable iterable2) { + return new ObjectArrayList<>(new MergedStringIterator(iterable1.iterator(), iterable2.iterator())); + } + private static void initBowModifiers() { - List MODIFIERS_NAMES = BowConfig.NAMES.get(); - List MODIFIERS_WEIGHTS = BowConfig.WEIGHTS.get(); - List MODIFIERS_ATTRIBUTES = BowConfig.ATTRIBUTES.get(); - List MODIFIERS_AMOUNTS = BowConfig.AMOUNTS.get(); - List MODIFIERS_OPERATIONS_IDS = BowConfig.OPERATIONS_IDS.get(); - for (String name : MODIFIERS_NAMES) { - int index = MODIFIERS_NAMES.indexOf(name); + List MODIFIERS_NAMES = merge(BowConfig.NAMES.get(), BOW_NAMES); + List MODIFIERS_WEIGHTS = merge(BowConfig.WEIGHTS.get(), BOW_WEIGHTS); + List MODIFIERS_ATTRIBUTES = merge(BowConfig.ATTRIBUTES.get(), BOW_ATTRIBUTES); + List MODIFIERS_AMOUNTS = merge(BowConfig.AMOUNTS.get(), BOW_AMOUNTS); + List MODIFIERS_OPERATIONS_IDS = merge(BowConfig.OPERATIONS_IDS.get(), BOW_OPERATIONS_IDS); + for (int index = 0; index < MODIFIERS_NAMES.size(); index++) { + String name = MODIFIERS_NAMES.get(index); String weight = MODIFIERS_WEIGHTS.get(index); String attribute = MODIFIERS_ATTRIBUTES.get(index); String amount = MODIFIERS_AMOUNTS.get(index); @@ -108,13 +125,13 @@ private static void initBowModifiers() { } private static void initShieldModifiers() { - List MODIFIERS_NAMES = ShieldConfig.NAMES.get(); - List MODIFIERS_WEIGHTS = ShieldConfig.WEIGHTS.get(); - List MODIFIERS_ATTRIBUTES = ShieldConfig.ATTRIBUTES.get(); - List MODIFIERS_AMOUNTS = ShieldConfig.AMOUNTS.get(); - List MODIFIERS_OPERATIONS_IDS = ShieldConfig.OPERATIONS_IDS.get(); - for (String name : MODIFIERS_NAMES) { - int index = MODIFIERS_NAMES.indexOf(name); + List MODIFIERS_NAMES = merge(ShieldConfig.NAMES.get(), SHIELD_NAMES); + List MODIFIERS_WEIGHTS = merge(ShieldConfig.WEIGHTS.get(), SHIELD_WEIGHTS); + List MODIFIERS_ATTRIBUTES = merge(ShieldConfig.ATTRIBUTES.get(), SHIELD_ATTRIBUTES); + List MODIFIERS_AMOUNTS = merge(ShieldConfig.AMOUNTS.get(), SHIELD_AMOUNTS); + List MODIFIERS_OPERATIONS_IDS = merge(ShieldConfig.OPERATIONS_IDS.get(), SHIELD_OPERATIONS_IDS); + for (int index = 0; index < MODIFIERS_NAMES.size(); index++) { + String name = MODIFIERS_NAMES.get(index); String weight = MODIFIERS_WEIGHTS.get(index); String attribute = MODIFIERS_ATTRIBUTES.get(index); String amount = MODIFIERS_AMOUNTS.get(index); @@ -136,13 +153,13 @@ private static void initShieldModifiers() { } private static void initToolModifiers() { - List MODIFIERS_NAMES = ToolConfig.NAMES.get(); - List MODIFIERS_WEIGHTS = ToolConfig.WEIGHTS.get(); - List MODIFIERS_ATTRIBUTES = ToolConfig.ATTRIBUTES.get(); - List MODIFIERS_AMOUNTS = ToolConfig.AMOUNTS.get(); - List MODIFIERS_OPERATIONS_IDS = ToolConfig.OPERATIONS_IDS.get(); - for (String name : MODIFIERS_NAMES) { - int index = MODIFIERS_NAMES.indexOf(name); + List MODIFIERS_NAMES = merge(ToolConfig.NAMES.get(), TOOL_NAMES); + List MODIFIERS_WEIGHTS = merge(ToolConfig.WEIGHTS.get(), TOOL_WEIGHTS); + List MODIFIERS_ATTRIBUTES = merge(ToolConfig.ATTRIBUTES.get(), TOOL_ATTRIBUTES); + List MODIFIERS_AMOUNTS = merge(ToolConfig.AMOUNTS.get(), TOOL_AMOUNTS); + List MODIFIERS_OPERATIONS_IDS = merge(ToolConfig.OPERATIONS_IDS.get(), TOOL_OPERATIONS_IDS); + for (int index = 0; index < MODIFIERS_NAMES.size(); index++) { + String name = MODIFIERS_NAMES.get(index); String weight = MODIFIERS_WEIGHTS.get(index); String attribute = MODIFIERS_ATTRIBUTES.get(index); String amount = MODIFIERS_AMOUNTS.get(index); @@ -163,14 +180,14 @@ private static void initToolModifiers() { } } - private static void initCuriosNArmorsModifiers() { - List MODIFIERS_NAMES = CurioNArmorConfig.NAMES.get(); - List MODIFIERS_WEIGHTS = CurioNArmorConfig.WEIGHTS.get(); - List MODIFIERS_ATTRIBUTES = CurioNArmorConfig.ATTRIBUTES.get(); - List MODIFIERS_AMOUNTS = CurioNArmorConfig.AMOUNTS.get(); - List MODIFIERS_OPERATIONS_IDS = CurioNArmorConfig.OPERATIONS_IDS.get(); - for (String name : MODIFIERS_NAMES) { - int index = MODIFIERS_NAMES.indexOf(name); + private static void initArmorsModifiers() { + List MODIFIERS_NAMES = merge(ArmorConfig.NAMES.get(), ARMOR_NAMES); + List MODIFIERS_WEIGHTS = merge(ArmorConfig.WEIGHTS.get(), ARMOR_WEIGHTS); + List MODIFIERS_ATTRIBUTES = merge(ArmorConfig.ATTRIBUTES.get(), ARMOR_ATTRIBUTES); + List MODIFIERS_AMOUNTS = merge(ArmorConfig.AMOUNTS.get(), ARMOR_AMOUNTS); + List MODIFIERS_OPERATIONS_IDS = merge(ArmorConfig.OPERATIONS_IDS.get(), ARMOR_OPERATIONS_IDS); + for (int index = 0; index < MODIFIERS_NAMES.size(); index++) { + String name = MODIFIERS_NAMES.get(index); String weight = MODIFIERS_WEIGHTS.get(index); String attribute = MODIFIERS_ATTRIBUTES.get(index); String amount = MODIFIERS_AMOUNTS.get(index); @@ -179,18 +196,70 @@ private static void initCuriosNArmorsModifiers() { String[] attributes = attribute.split(";"); String[] amounts = amount.split(";"); String[] operations_ids = operations_id.split(";"); - addCurio(curio(name).setWeight(Integer.parseInt(weight)).addModifiers(attributes, mods(amounts, operations_ids)).build()); + addCurio(armor(name).setWeight(Integer.parseInt(weight)).addModifiers(attributes, mods(amounts, operations_ids)).build()); } else { - addCurio(curio(name).setWeight(Integer.parseInt(weight)).addModifier(ForgeRegistries.ATTRIBUTES.getValue(new Identifier(attribute.split(":")[0], attribute.split(":")[1])), mod(Double.parseDouble(amount), Operation.fromId(Integer.parseInt(operations_id)))).build()); + addCurio(armor(name).setWeight(Integer.parseInt(weight)).addModifier(ForgeRegistries.ATTRIBUTES.getValue(new Identifier(attribute.split(":")[0], attribute.split(":")[1])), mod(Double.parseDouble(amount), Operation.fromId(Integer.parseInt(operations_id)))).build()); } } } + private static void initCuriosModifiers() { + List MODIFIERS_NAMES = merge(CuriosConfig.NAMES.get(), CURIOS_NAMES); + List MODIFIERS_WEIGHTS = merge(CuriosConfig.WEIGHTS.get(), CURIOS_WEIGHTS); + List MODIFIERS_ATTRIBUTES = merge(CuriosConfig.ATTRIBUTES.get(), CURIOS_ATTRIBUTES); + List MODIFIERS_AMOUNTS = merge(CuriosConfig.AMOUNTS.get(), CURIOS_AMOUNTS); + List MODIFIERS_OPERATIONS_IDS = merge(CuriosConfig.OPERATIONS_IDS.get(), CURIOS_OPERATIONS_IDS); + for (int index = 0; index < MODIFIERS_NAMES.size(); index++) { + String name = MODIFIERS_NAMES.get(index); + String weight = MODIFIERS_WEIGHTS.get(index); + String attribute = MODIFIERS_ATTRIBUTES.get(index); + String amount = MODIFIERS_AMOUNTS.get(index); + String operations_id = MODIFIERS_OPERATIONS_IDS.get(index); + if (attribute.contains(";")) { + String[] attributes = attribute.split(";"); + String[] amounts = amount.split(";"); + String[] operations_ids = operations_id.split(";"); + addArmor(armor(name).setWeight(Integer.parseInt(weight)).addModifiers(attributes, mods(amounts, operations_ids)).build()); + } else { + addArmor(armor(name).setWeight(Integer.parseInt(weight)).addModifier(ForgeRegistries.ATTRIBUTES.getValue(new Identifier(attribute.split(":")[0], attribute.split(":")[1])), mod(Double.parseDouble(amount), Operation.fromId(Integer.parseInt(operations_id)))).build()); + } + } + } - public static void init() { + public static void initialize() { initToolModifiers(); - initCuriosNArmorsModifiers(); + initArmorsModifiers(); initBowModifiers(); initShieldModifiers(); + if (ModifiersMod.isCuriosLoaded() && !CuriosConfig.WHETHER_OR_NOT_CURIOS_USE_ARMOR_MODIFIERS.get()) initCuriosModifiers(); + } + + static class MergedStringIterator implements Iterator { + private final Iterator iterator1; + private final Iterator iterator2; + private boolean useIterator1; + + public MergedStringIterator(Iterator iterator1, Iterator iterator2) { + this.iterator1 = iterator1; + this.iterator2 = iterator2; + this.useIterator1 = true; + } + + @Override + public boolean hasNext() { + return (useIterator1 && iterator1.hasNext()) || iterator2.hasNext(); + } + + @Override + public String next() { + if (useIterator1) { + if (iterator1.hasNext()) { + return iterator1.next(); + } else { + useIterator1 = false; + } + } + return iterator2.next(); + } } } \ No newline at end of file diff --git a/src/main/java/com/teampotato/modifiers/common/network/NetworkHandler.java b/src/main/java/com/teampotato/modifiers/common/network/NetworkHandler.java index dc57309..6f9f512 100644 --- a/src/main/java/com/teampotato/modifiers/common/network/NetworkHandler.java +++ b/src/main/java/com/teampotato/modifiers/common/network/NetworkHandler.java @@ -6,6 +6,8 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Identifier; import net.minecraft.util.thread.ThreadExecutor; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.function.BiConsumer; @@ -26,11 +28,13 @@ public static void register() { PacketC2SReforge::new, mainThreadHandler(PacketC2SReforge.Handler::handle)); } - private static BiConsumer mainThreadHandler(Consumer handler) { + @Contract(pure = true) + private static @NotNull BiConsumer mainThreadHandler(Consumer handler) { return (packet, ctx) -> ctx.threadExecutor.submit(() -> handler.accept(packet)); } - private static BiConsumer mainThreadHandler(BiConsumer handler) { + @Contract(pure = true) + private static @NotNull BiConsumer mainThreadHandler(BiConsumer handler) { return (packet, ctx) -> ctx.threadExecutor.submit(() -> handler.accept(packet, ctx)); } diff --git a/src/main/java/com/teampotato/modifiers/common/network/NetworkHandlerForge.java b/src/main/java/com/teampotato/modifiers/common/network/NetworkHandlerForge.java index 05fe0f6..202d94a 100644 --- a/src/main/java/com/teampotato/modifiers/common/network/NetworkHandlerForge.java +++ b/src/main/java/com/teampotato/modifiers/common/network/NetworkHandlerForge.java @@ -16,9 +16,7 @@ import java.util.function.Function; public class NetworkHandlerForge implements NetworkHandlerProxy { - private static final SimpleChannel channel = NetworkRegistry.newSimpleChannel( - new Identifier("modifiers", "net"), ()->"", (a)->true, (a)->true - ); + private static final SimpleChannel channel = NetworkRegistry.newSimpleChannel(new Identifier("modifiers", "net"), ()->"", (a)->true, (a)->true); private static NetworkHandler.PacketContext convertContext(NetworkEvent.Context context) { ThreadExecutor executor = LogicalSidedProvider.WORKQUEUE.get(context.getDirection().getReceptionSide()); diff --git a/src/main/java/com/teampotato/modifiers/common/network/PacketC2SReforge.java b/src/main/java/com/teampotato/modifiers/common/network/PacketC2SReforge.java index 06551f1..e6e14c3 100644 --- a/src/main/java/com/teampotato/modifiers/common/network/PacketC2SReforge.java +++ b/src/main/java/com/teampotato/modifiers/common/network/PacketC2SReforge.java @@ -3,7 +3,9 @@ import com.teampotato.modifiers.common.reforge.SmithingScreenHandlerReforge; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.PacketByteBuf; +import org.jetbrains.annotations.NotNull; +@SuppressWarnings("unused") public class PacketC2SReforge { public PacketC2SReforge() {} @@ -12,7 +14,7 @@ public PacketC2SReforge() {} void encode(PacketByteBuf buf) {} public static class Handler { - public static void handle(PacketC2SReforge packet, NetworkHandler.PacketContext context) { + public static void handle(PacketC2SReforge packet, NetworkHandler.@NotNull PacketContext context) { PlayerEntity player = context.player; if (player != null && player.currentScreenHandler instanceof SmithingScreenHandlerReforge) { ((SmithingScreenHandlerReforge) player.currentScreenHandler).modifiers$tryReforge(); diff --git a/src/main/java/com/teampotato/modifiers/mixin/MixinItemStack.java b/src/main/java/com/teampotato/modifiers/mixin/MixinItemStack.java index 47b419c..47db870 100644 --- a/src/main/java/com/teampotato/modifiers/mixin/MixinItemStack.java +++ b/src/main/java/com/teampotato/modifiers/mixin/MixinItemStack.java @@ -21,7 +21,10 @@ public abstract class MixinItemStack { private void onGetDisplayName(CallbackInfoReturnable cir) { Modifier modifier = ModifierHandler.getModifier((ItemStack) (Object)this); if (modifier != null && modifier != Modifiers.NONE) { - cir.setReturnValue(MutableText.of(modifier.getFormattedName()).append(" ").append(Text.translatable(this.getItem().getTranslationKey((ItemStack) (Object)this)))); + MutableText modifierText = MutableText.of(modifier.getFormattedName()); + MutableText itemText = Text.translatable(this.getItem().getTranslationKey((ItemStack) (Object)this)); + MutableText newItemName = modifierText.append(" ").append(itemText); + cir.setReturnValue(newItemName); } } } diff --git a/src/main/java/com/teampotato/modifiers/mixin/MixinSmithingTableContainer.java b/src/main/java/com/teampotato/modifiers/mixin/MixinSmithingTableContainer.java index ffd452f..21e52b5 100644 --- a/src/main/java/com/teampotato/modifiers/mixin/MixinSmithingTableContainer.java +++ b/src/main/java/com/teampotato/modifiers/mixin/MixinSmithingTableContainer.java @@ -3,7 +3,7 @@ import com.teampotato.modifiers.common.modifier.Modifier; import com.teampotato.modifiers.common.modifier.ModifierHandler; import com.teampotato.modifiers.common.reforge.SmithingScreenHandlerReforge; -import com.teampotato.modifiers.common.config.ReforgeConfig; +import com.teampotato.modifiers.common.config.toml.ReforgeConfig; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.screen.ForgingScreenHandler; @@ -24,21 +24,20 @@ public MixinSmithingTableContainer(ScreenHandlerType a, int b, PlayerInventor @Override public void modifiers$tryReforge() { - ItemStack stack = input.getStack(0); - ItemStack material = input.getStack(1); + ItemStack stack = this.input.getStack(0); + ItemStack material = this.input.getStack(1); + if (!ModifierHandler.canHaveModifiers(stack)) return; + boolean canRepair = stack.getItem().canRepair(stack, material) && !ReforgeConfig.DISABLE_REPAIR_REFORGED.get(); + boolean isUniversal = ReforgeConfig.UNIVERSAL_REFORGE_ITEM.get().equals(Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(material.getItem())).toString()); - if (ModifierHandler.canHaveModifiers(stack)) { - if ((stack.getItem().canRepair(stack, material) && !ReforgeConfig.DISABLE_REPAIR_REFORGED.get()) || ReforgeConfig.UNIVERSAL_REFORGE_ITEM.get().equals(Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(material.getItem())).toString())) { - - boolean hadModifier = ModifierHandler.hasModifier(stack); - Modifier modifier = ModifierHandler.rollModifier(stack, ThreadLocalRandom.current()); - if (modifier != null) { - ModifierHandler.setModifier(stack, modifier); - if (hadModifier) { - material.decrement(1); - // We do this for markDirty() mostly, I think - input.setStack(1, material); - } + if (canRepair|| isUniversal) { + boolean hadModifier = ModifierHandler.hasModifier(stack); + Modifier modifier = ModifierHandler.rollModifier(stack, ThreadLocalRandom.current()); + if (modifier != null) { + ModifierHandler.setModifier(stack, modifier); + if (hadModifier) { + material.decrement(1); + this.input.setStack(1, material); } } } diff --git a/src/main/java/com/teampotato/modifiers/mixin/client/MixinForgingScreen.java b/src/main/java/com/teampotato/modifiers/mixin/client/MixinForgingScreen.java index 1b4cc28..0bba85c 100644 --- a/src/main/java/com/teampotato/modifiers/mixin/client/MixinForgingScreen.java +++ b/src/main/java/com/teampotato/modifiers/mixin/client/MixinForgingScreen.java @@ -2,7 +2,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.teampotato.modifiers.client.SmithingScreenReforge; -import com.teampotato.modifiers.common.config.ReforgeConfig; +import com.teampotato.modifiers.common.config.toml.ReforgeConfig; import net.minecraft.client.gui.screen.ingame.ForgingScreen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.screen.ingame.SmithingScreen; @@ -35,28 +35,23 @@ public MixinForgingScreen(T handler, PlayerInventory inventory, Text title) { @SuppressWarnings("ConstantValue") @Inject(method = "drawBackground", at = @At("HEAD"), cancellable = true) private void onDrawBackground(MatrixStack matrixStack, float f, int i, int j, CallbackInfo ci) { - if (((Object) this) instanceof SmithingScreen) { - if (((SmithingScreenReforge) this).modifiers_isOnTab2()) { - ci.cancel(); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.setShaderTexture(0, modifiers$reforger); - this.client.getTextureManager().bindTexture(modifiers$reforger); - int k = (this.width - this.backgroundWidth) / 2; - int l = (this.height - this.backgroundHeight) / 2; - this.drawTexture(matrixStack, k, l, 0, 0, this.backgroundWidth, this.backgroundHeight); - ItemStack stack1 = this.handler.getSlot(0).getStack(); - ItemStack stack2 = this.handler.getSlot(1).getStack(); - boolean isUniversalReforgeItem = ReforgeConfig.UNIVERSAL_REFORGE_ITEM.get().equals(Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(stack2.getItem())).toString()); - // TODO add a util function somewhere for `canReforge(stack1, stack2)` - boolean cantReforge = !stack1.isEmpty() && !stack1.getItem().canRepair(stack1, stack2); - if (ReforgeConfig.DISABLE_REPAIR_REFORGED.get() && !cantReforge) cantReforge = true; - if (isUniversalReforgeItem && cantReforge) cantReforge = false; - // canReforge is also true for empty slot 1. Probably how it should behave. - ((SmithingScreenReforge) this).modifiers_setCanReforge(!cantReforge); - if (cantReforge) { - this.drawTexture(matrixStack, k + 99 - 53, l + 45, this.backgroundWidth, 0, 28, 21); - } - } + if (((Object) this) instanceof SmithingScreen && ((SmithingScreenReforge) this).modifiers_isOnTab2()) { + ci.cancel(); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.setShaderTexture(0, modifiers$reforger); + this.client.getTextureManager().bindTexture(modifiers$reforger); + int k = (this.width - this.backgroundWidth) / 2; + int l = (this.height - this.backgroundHeight) / 2; + this.drawTexture(matrixStack, k, l, 0, 0, this.backgroundWidth, this.backgroundHeight); + ItemStack stack1 = this.handler.getSlot(0).getStack(); + ItemStack stack2 = this.handler.getSlot(1).getStack(); + boolean isUniversalReforgeItem = ReforgeConfig.UNIVERSAL_REFORGE_ITEM.get().equals(Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(stack2.getItem())).toString()); + boolean cantReforge = !stack1.isEmpty() && !stack1.getItem().canRepair(stack1, stack2); + if (ReforgeConfig.DISABLE_REPAIR_REFORGED.get() && !cantReforge) cantReforge = true; + if (isUniversalReforgeItem && cantReforge) cantReforge = false; + // canReforge is also true for empty slot 1. Probably how it should behave. + ((SmithingScreenReforge) this).modifiers_setCanReforge(!cantReforge); + if (cantReforge) this.drawTexture(matrixStack, k + 99 - 53, l + 45, this.backgroundWidth, 0, 28, 21); } } } \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 1b90eae..d73f061 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -5,7 +5,7 @@ license="MIT" [[mods]] modId="modifiers" version="${version}" -displayName="Remodified" +displayName="Remodifier" authors="Team Potato" description='''