From 689485e337f15aa13e8bef2cd77e837922fda9c5 Mon Sep 17 00:00:00 2001 From: Zontreck Date: Tue, 27 Sep 2022 02:59:09 -0700 Subject: [PATCH 1/3] Add new roadmap item --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b27bee6..2911c5f 100644 --- a/README.md +++ b/README.md @@ -15,4 +15,5 @@ There is not much on the roadmap for the mod except to maintain the code for fut The following is the possible roadmap: 1. Create a spigot plugin variant. -2. Explore possibly making a quilt mod variant. \ No newline at end of file +2. Explore possibly making a quilt mod variant. +3. Create a permission that a server owner can set to block this mod from functioning on the client. \ No newline at end of file From b8a065590ceb6356c46ca8c17dd8efb1733c41d2 Mon Sep 17 00:00:00 2001 From: Zontreck Date: Wed, 12 Oct 2022 23:50:06 -0700 Subject: [PATCH 2/3] Push next version of WMD --- build.gradle | 13 +- gradle.properties | 6 +- .../dev/zontreck/mcmods/CheckInventory.java | 24 +- src/main/java/dev/zontreck/mcmods/Health.java | 36 ++ .../dev/zontreck/mcmods/ItemRegistry.java | 3 + .../zontreck/mcmods/WatchMyDurability.java | 9 +- .../mcmods/configs/WMDClientConfig.java | 9 + .../zontreck/mcmods/gui/HeartsRenderer.java | 333 ++++++++++++++++++ .../watchmydurability/textures/gui/absorb.png | Bin 0 -> 4835 bytes .../watchmydurability/textures/gui/hearts.png | Bin 0 -> 4628 bytes 10 files changed, 427 insertions(+), 6 deletions(-) create mode 100644 src/main/java/dev/zontreck/mcmods/Health.java create mode 100644 src/main/java/dev/zontreck/mcmods/gui/HeartsRenderer.java create mode 100644 src/main/resources/assets/watchmydurability/textures/gui/absorb.png create mode 100644 src/main/resources/assets/watchmydurability/textures/gui/hearts.png diff --git a/build.gradle b/build.gradle index c53330d..95806d2 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { id 'net.minecraftforge.gradle' version '5.1.+' } -version = '1.1.0' +version = "${myversion}" group = 'dev.zontreck.mcmods' // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = 'WatchMyDurability' @@ -26,7 +26,7 @@ minecraft { // // Use non-default mappings at your own risk. They may not always work. // Simply re-run your setup task after changing the mappings to update your workspace. - mappings channel: 'official', version: '1.19.2' + mappings channel: 'official', version: "${mc_version}" // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // Currently, this location cannot be changed from the default. @@ -123,14 +123,21 @@ repositories { // flatDir { // dir 'libs' // } + maven { + name = "ZNI Creations" + url = "https://maven.zontreck.dev" + } } dependencies { // Specify the version of Minecraft to use. If this is any group other than 'net.minecraft', it is assumed // that the dep is a ForgeGradle 'patcher' dependency, and its patches will be applied. // The userdev artifact is a special name and will get all sorts of transformations applied to it. - minecraft 'net.minecraftforge:forge:1.19.2-43.1.1' + minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}" + implementation fg.deobf("dev.zontreck:libzontreck:1.0.0.1:dev") + runtimeOnly fg.deobf("dev.zontreck:libzontreck:1.0.0.1") + compileOnly fg.deobf("dev.zontreck:libzontreck:1.0.0.1:dev") // Real mod deobf dependency examples - these get remapped to your current mappings // compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency // runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // Adds the full JEI mod as a runtime dependency diff --git a/gradle.properties b/gradle.properties index 878bf1f..854c213 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,8 @@ # Sets default memory used for gradle commands. Can be overridden by user or command line properties. # This is required to provide enough memory for the Minecraft decompilation process. org.gradle.jvmargs=-Xmx3G -org.gradle.daemon=false \ No newline at end of file +org.gradle.daemon=false + +mc_version=1.19.2 +forge_version=43.1.16 +myversion = 1.1.1 \ No newline at end of file diff --git a/src/main/java/dev/zontreck/mcmods/CheckInventory.java b/src/main/java/dev/zontreck/mcmods/CheckInventory.java index 88237e9..99eec29 100644 --- a/src/main/java/dev/zontreck/mcmods/CheckInventory.java +++ b/src/main/java/dev/zontreck/mcmods/CheckInventory.java @@ -5,6 +5,9 @@ import java.util.List; import java.util.Map; import java.util.TimerTask; +import dev.zontreck.libzontreck.chat.ChatColor; +import dev.zontreck.libzontreck.chat.ChatColorFactory; +import dev.zontreck.libzontreck.chat.ChatColor.ColorOptions; import dev.zontreck.mcmods.configs.WMDClientConfig; import net.minecraft.client.Minecraft; import net.minecraft.core.NonNullList; @@ -40,6 +43,25 @@ public class CheckInventory extends TimerTask WatchMyDurability.LOGGER.warn("A error in the WatchMyDurability timer code has occurred. This could happen with hub worlds and the server transfers that occur. If this happened in another instance, please report this error to the developer, along with what you were doing."); } + + // Hijack this timer so we dont need to register yet another + if(!WMDClientConfig.EnableHealthAlert.get())return; + Health current = Health.of(Minecraft.getInstance().player); + if(WatchMyDurability.LastHealth == null)WatchMyDurability.LastHealth = current; + else{ + if(current.identical(WatchMyDurability.LastHealth))return; + } + + // Good to proceed + if(current.shouldGiveAlert()) + { + + Minecraft.getInstance().player.displayClientMessage(Component.literal(ChatColorFactory.MakeBuilder().set(ColorOptions.Dark_Red).set(ColorOptions.Bold).toString()+"You need to eat!"), false); + + SoundEvent sv = SoundEvents.WARDEN_ROAR; + Soundify(sv); + } + } public void PushItems(String type, List stack) @@ -84,7 +106,7 @@ public class CheckInventory extends TimerTask String entryStr = WMDClientConfig.alertMessages.get().get(idx); if(percent <= entry){ - String replaced = entryStr.replaceAll("!item!", is1.getDisplayName().getString()); + String replaced = WatchMyDurability.WMDPrefix + ChatColor.DARK_RED + entryStr.replaceAll("!item!", is1.getDisplayName().getString()); WatchMyDurability.LOGGER.info("Enqueue alert for an item. Playing sound for item: "+is1.getDisplayName().getString()); SoundEvent theSound = SoundEvents.ITEM_BREAK; diff --git a/src/main/java/dev/zontreck/mcmods/Health.java b/src/main/java/dev/zontreck/mcmods/Health.java new file mode 100644 index 0000000..90c88f6 --- /dev/null +++ b/src/main/java/dev/zontreck/mcmods/Health.java @@ -0,0 +1,36 @@ +package dev.zontreck.mcmods; + +import net.minecraft.world.entity.player.Player; + +public class Health { + + public float maximum; + public float current; + + public int asPercent() + { + return (int)Math.round(Math.abs((current * 100 / maximum))); + } + public Health lastHealthState; + + + public static Health of(Player player){ + Health obj = new Health(); + obj.current = player.getHealth(); + obj.maximum = player.getMaxHealth(); + + return obj; + } + + public boolean shouldGiveAlert() + { + if(asPercent()<=50){ + return true; + }else return false; + } + public boolean identical(Health other) + { + if(other.current == current && other.maximum == maximum)return true; + else return false; + } +} diff --git a/src/main/java/dev/zontreck/mcmods/ItemRegistry.java b/src/main/java/dev/zontreck/mcmods/ItemRegistry.java index 1c477cd..de1e2c5 100644 --- a/src/main/java/dev/zontreck/mcmods/ItemRegistry.java +++ b/src/main/java/dev/zontreck/mcmods/ItemRegistry.java @@ -21,6 +21,9 @@ public class ItemRegistry { } } + public class Health { + } + public Map> CachedItems; public ItemRegistry() diff --git a/src/main/java/dev/zontreck/mcmods/WatchMyDurability.java b/src/main/java/dev/zontreck/mcmods/WatchMyDurability.java index 865130b..e4ee4b2 100644 --- a/src/main/java/dev/zontreck/mcmods/WatchMyDurability.java +++ b/src/main/java/dev/zontreck/mcmods/WatchMyDurability.java @@ -2,7 +2,10 @@ package dev.zontreck.mcmods; import com.mojang.logging.LogUtils; +import dev.zontreck.libzontreck.chat.ChatColorFactory; +import dev.zontreck.libzontreck.chat.ChatColor.ColorOptions; import dev.zontreck.mcmods.configs.WMDClientConfig; +import dev.zontreck.mcmods.gui.HeartsRenderer; import net.minecraft.client.Minecraft; import net.minecraft.client.User; import net.minecraftforge.common.MinecraftForge; @@ -34,17 +37,21 @@ public class WatchMyDurability public static User CurrentUser = null; // This is initialized by the client public static boolean isInGame = false; // This locks the timer thread public static ItemRegistry REGISTRY; + public static Health LastHealth; + public static String WMDPrefix; public WatchMyDurability() { + WMDPrefix = ChatColorFactory.MakeBuilder().set(ColorOptions.Dark_Gray).toString() + "[" + ChatColorFactory.MakeBuilder().set(ColorOptions.Dark_Green) + "WMD" + ChatColorFactory.MakeBuilder().set(ColorOptions.Dark_Gray) + "]"; IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); // Register the commonSetup method for modloading modEventBus.addListener(this::commonSetup); ModLoadingContext.get().registerConfig(Type.CLIENT, WMDClientConfig.SPEC, "watchmydurability-client.toml"); - + + MinecraftForge.EVENT_BUS.register(new HeartsRenderer()); // Register ourselves for server and other game events we are interested in MinecraftForge.EVENT_BUS.register(this); } diff --git a/src/main/java/dev/zontreck/mcmods/configs/WMDClientConfig.java b/src/main/java/dev/zontreck/mcmods/configs/WMDClientConfig.java index 4353398..1815a2a 100644 --- a/src/main/java/dev/zontreck/mcmods/configs/WMDClientConfig.java +++ b/src/main/java/dev/zontreck/mcmods/configs/WMDClientConfig.java @@ -12,6 +12,9 @@ public class WMDClientConfig { public static ForgeConfigSpec.ConfigValue> alertPercents; public static ForgeConfigSpec.ConfigValue> alertMessages; public static ForgeConfigSpec.ConfigValue TimerVal; + public static ForgeConfigSpec.ConfigValue EnableExtraHearts; + public static ForgeConfigSpec.ConfigValue EnableHealthAlert; + static{ List alerts1 = new ArrayList<>(); alerts1.add(10); @@ -28,6 +31,12 @@ public class WMDClientConfig { TimerVal = BUILDER.comment("How many seconds between timer ticks to check your inventory items?").define("Timer", 5); BUILDER.pop(); + + BUILDER.push("General"); + EnableExtraHearts = BUILDER.comment("Whether to enable the extra hearts rendering").define("compress_hearts", false); + EnableHealthAlert = BUILDER.comment("The following was added for a friend. If you need reminders to eat in order to heal, turn the below option on").define("watchMyHunger", false); + + SPEC=BUILDER.build(); } } diff --git a/src/main/java/dev/zontreck/mcmods/gui/HeartsRenderer.java b/src/main/java/dev/zontreck/mcmods/gui/HeartsRenderer.java new file mode 100644 index 0000000..110c85f --- /dev/null +++ b/src/main/java/dev/zontreck/mcmods/gui/HeartsRenderer.java @@ -0,0 +1,333 @@ +/* + * + * DISCLAIMER: This code was taken from Mantle, and will be modified to fit the needs of this mod, such as adding more heat options. This code is subject to Mantle's license of MIT. + * Despite this code being taken from, and modified/updated to be modern, all textures are my own creation + * This disclaimer is here to give credit where credit is due. The author(s) of mantle have done a absolutely fantastic job. And if Mantle gets updated this shall be removed along with future plans of extra hearts and color options. + * + * + */ + +package dev.zontreck.mcmods.gui; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; + +import dev.zontreck.mcmods.WatchMyDurability; +import dev.zontreck.mcmods.configs.WMDClientConfig; +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.client.event.RenderGuiOverlayEvent; +import net.minecraftforge.client.gui.overlay.ForgeGui; +import net.minecraftforge.client.gui.overlay.GuiOverlayManager; +import net.minecraftforge.client.gui.overlay.NamedGuiOverlay; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +import java.util.Random; + +public class HeartsRenderer { + private static final ResourceLocation ICON_HEARTS = new ResourceLocation(WatchMyDurability.MODID, + "textures/gui/hearts.png"); + private static final ResourceLocation ICON_ABSORB = new ResourceLocation(WatchMyDurability.MODID, + "textures/gui/absorb.png"); + private static final ResourceLocation ICON_VANILLA = GuiComponent.GUI_ICONS_LOCATION; + + private final Minecraft mc = Minecraft.getInstance(); + + private int playerHealth = 0; + private int lastPlayerHealth = 0; + private long healthUpdateCounter = 0; + private long lastSystemTime = 0; + private final Random rand = new Random(); + + private int regen; + + /** + * Draws a texture to the screen + * + * @param matrixStack Matrix stack instance + * @param x X position + * @param y Y position + * @param textureX Texture X + * @param textureY Texture Y + * @param width Width to draw + * @param height Height to draw + */ + private void blit(PoseStack matrixStack, int x, int y, int textureX, int textureY, int width, int height) { + Minecraft.getInstance().gui.blit(matrixStack, x, y, textureX, textureY, width, height); + } + + /* HUD */ + + /** + * Event listener + * + * @param event Event instance + */ + @SubscribeEvent(priority = EventPriority.LOW) + public void renderHealthbar(RenderGuiOverlayEvent.Pre event) { + NamedGuiOverlay ActualOverlay = GuiOverlayManager.findOverlay(new ResourceLocation("minecraft:player_health")); + + if (ActualOverlay == null) { + if (GuiOverlayManager.getOverlays() == null) { + WatchMyDurability.LOGGER.info("Overlays non existent?!"); + } + for (NamedGuiOverlay overlay : GuiOverlayManager.getOverlays()) { + // Next print + // LibZontreck.LOGGER.info("GUI OVERLAY: "+overlay.id().getPath()); + + if (overlay.id().getPath().equals("player_health")) { + ActualOverlay = overlay; + break; + } + } + } + if (event.isCanceled() || !WMDClientConfig.EnableExtraHearts.get() || event.getOverlay() != ActualOverlay) { + return; + } + // ensure its visible + if (!(mc.gui instanceof ForgeGui gui) || mc.options.hideGui || !gui.shouldDrawSurvivalElements()) { + return; + } + Entity renderViewEnity = this.mc.getCameraEntity(); + if (!(renderViewEnity instanceof Player player)) { + return; + } + gui.setupOverlayRenderState(true, false); + + this.mc.getProfiler().push("health"); + + // extra setup stuff from us + int left_height = gui.leftHeight; + int width = this.mc.getWindow().getGuiScaledWidth(); + int height = this.mc.getWindow().getGuiScaledHeight(); + int updateCounter = this.mc.gui.getGuiTicks(); + + // start default forge/mc rendering + // changes are indicated by comment + + int health = Mth.ceil(player.getHealth()); + boolean highlight = this.healthUpdateCounter > (long) updateCounter + && (this.healthUpdateCounter - (long) updateCounter) / 3L % 2L == 1L; + + if (health < this.playerHealth && player.invulnerableTime > 0) { + this.lastSystemTime = Util.getMillis(); + this.healthUpdateCounter = (updateCounter + 20); + } else if (health > this.playerHealth && player.invulnerableTime > 0) { + this.lastSystemTime = Util.getMillis(); + this.healthUpdateCounter = (updateCounter + 10); + } + + if (Util.getMillis() - this.lastSystemTime > 1000L) { + this.playerHealth = health; + this.lastPlayerHealth = health; + this.lastSystemTime = Util.getMillis(); + } + + this.playerHealth = health; + int healthLast = this.lastPlayerHealth; + + AttributeInstance attrMaxHealth = player.getAttribute(Attributes.MAX_HEALTH); + float healthMax = attrMaxHealth == null ? 0 : (float) attrMaxHealth.getValue(); + float absorb = Mth.ceil(player.getAbsorptionAmount()); + + // CHANGE: simulate 10 hearts max if there's more, so vanilla only renders one + // row max + healthMax = Math.min(healthMax, 20f); + health = Math.min(health, 20); + absorb = Math.min(absorb, 20); + + int healthRows = Mth.ceil((healthMax + absorb) / 2.0F / 10.0F); + int rowHeight = Math.max(10 - (healthRows - 2), 3); + + this.rand.setSeed(updateCounter * 312871L); + + int left = width / 2 - 91; + int top = height - left_height; + // change: these are unused below, unneeded? should these adjust the Forge + // variable? + // left_height += (healthRows * rowHeight); + // if (rowHeight != 10) left_height += 10 - rowHeight; + + this.regen = -1; + if (player.hasEffect(MobEffects.REGENERATION)) { + this.regen = updateCounter % 25; + } + + assert this.mc.level != null; + final int TOP = 9 * (this.mc.level.getLevelData().isHardcore() ? 5 : 0); + final int BACKGROUND = (highlight ? 25 : 16); + int MARGIN = 16; + if (player.hasEffect(MobEffects.POISON)) + MARGIN += 36; + else if (player.hasEffect(MobEffects.WITHER)) + MARGIN += 72; + float absorbRemaining = absorb; + + PoseStack matrixStack = event.getPoseStack(); + for (int i = Mth.ceil((healthMax + absorb) / 2.0F) - 1; i >= 0; --i) { + int row = Mth.ceil((float) (i + 1) / 10.0F) - 1; + int x = left + i % 10 * 8; + int y = top - row * rowHeight; + + if (health <= 4) + y += this.rand.nextInt(2); + if (i == this.regen) + y -= 2; + + this.blit(matrixStack, x, y, BACKGROUND, TOP, 9, 9); + + if (highlight) { + if (i * 2 + 1 < healthLast) { + this.blit(matrixStack, x, y, MARGIN + 54, TOP, 9, 9); // 6 + } else if (i * 2 + 1 == healthLast) { + this.blit(matrixStack, x, y, MARGIN + 63, TOP, 9, 9); // 7 + } + } + + if (absorbRemaining > 0.0F) { + if (absorbRemaining == absorb && absorb % 2.0F == 1.0F) { + this.blit(matrixStack, x, y, MARGIN + 153, TOP, 9, 9); // 17 + absorbRemaining -= 1.0F; + } else { + this.blit(matrixStack, x, y, MARGIN + 144, TOP, 9, 9); // 16 + absorbRemaining -= 2.0F; + } + } else { + if (i * 2 + 1 < health) { + this.blit(matrixStack, x, y, MARGIN + 36, TOP, 9, 9); // 4 + } else if (i * 2 + 1 == health) { + this.blit(matrixStack, x, y, MARGIN + 45, TOP, 9, 9); // 5 + } + } + } + + this.renderExtraHearts(matrixStack, left, top, player); + this.renderExtraAbsorption(matrixStack, left, top - rowHeight, player); + + RenderSystem.setShaderTexture(0, ICON_VANILLA); + gui.leftHeight += 10; + if (absorb > 0) { + gui.leftHeight += 10; + } + + event.setCanceled(true); + RenderSystem.disableBlend(); + this.mc.getProfiler().pop(); + MinecraftForge.EVENT_BUS + .post(new RenderGuiOverlayEvent.Post(mc.getWindow(), matrixStack, event.getPartialTick(), ActualOverlay)); + } + + /** + * Gets the texture from potion effects + * + * @param player Player instance + * @return Texture offset for potion effects + */ + private int getPotionOffset(Player player) { + int potionOffset = 0; + MobEffectInstance potion = player.getEffect(MobEffects.WITHER); + if (potion != null) { + potionOffset = 18; + } + potion = player.getEffect(MobEffects.POISON); + if (potion != null) { + potionOffset = 9; + } + assert this.mc.level != null; + if (this.mc.level.getLevelData().isHardcore()) { + potionOffset += 27; + } + return potionOffset; + } + + /** + * Renders the health above 10 hearts + * + * @param matrixStack Matrix stack instance + * @param xBasePos Health bar top corner + * @param yBasePos Health bar top corner + * @param player Player instance + */ + private void renderExtraHearts(PoseStack matrixStack, int xBasePos, int yBasePos, Player player) { + int potionOffset = this.getPotionOffset(player); + + // Extra hearts + RenderSystem.setShaderTexture(0, ICON_HEARTS); + int hp = Mth.ceil(player.getHealth()); + this.renderCustomHearts(matrixStack, xBasePos, yBasePos, potionOffset, hp, false); + } + + /** + * Renders the absorption health above 10 hearts + * + * @param matrixStack Matrix stack instance + * @param xBasePos Health bar top corner + * @param yBasePos Health bar top corner + * @param player Player instance + */ + private void renderExtraAbsorption(PoseStack matrixStack, int xBasePos, int yBasePos, Player player) { + int potionOffset = this.getPotionOffset(player); + + // Extra hearts + RenderSystem.setShaderTexture(0, ICON_ABSORB); + int absorb = Mth.ceil(player.getAbsorptionAmount()); + this.renderCustomHearts(matrixStack, xBasePos, yBasePos, potionOffset, absorb, true); + } + + /** + * Gets the texture offset from the regen effect + * + * @param i Heart index + * @param offset Current offset + */ + private int getYRegenOffset(int i, int offset) { + return i + offset == this.regen ? -2 : 0; + } + + /** + * Shared logic to render custom hearts + * + * @param matrixStack Matrix stack instance + * @param xBasePos Health bar top corner + * @param yBasePos Health bar top corner + * @param potionOffset Offset from the potion effect + * @param count Number to render + * @param absorb If true, render absorption hearts + */ + private void renderCustomHearts(PoseStack matrixStack, int xBasePos, int yBasePos, int potionOffset, int count, + boolean absorb) { + int regenOffset = absorb ? 10 : 0; + for (int iter = 0; iter < count / 20; iter++) { + int renderHearts = (count - 20 * (iter + 1)) / 2; + int heartIndex = iter % 11; + if (renderHearts > 10) { + renderHearts = 10; + } + for (int i = 0; i < renderHearts; i++) { + int y = this.getYRegenOffset(i, regenOffset); + if (absorb) { + this.blit(matrixStack, xBasePos + 8 * i, yBasePos + y, 0, 54, 9, 9); + } + this.blit(matrixStack, xBasePos + 8 * i, yBasePos + y, 18 * heartIndex, potionOffset, 9, 9); + } + if (count % 2 == 1 && renderHearts < 10) { + int y = this.getYRegenOffset(renderHearts, regenOffset); + if (absorb) { + this.blit(matrixStack, xBasePos + 8 * renderHearts, yBasePos + y, 0, 54, 9, 9); + } + this.blit(matrixStack, xBasePos + 8 * renderHearts, yBasePos + y, 9 + 18 * heartIndex, potionOffset, 9, 9); + } + } + } +} diff --git a/src/main/resources/assets/watchmydurability/textures/gui/absorb.png b/src/main/resources/assets/watchmydurability/textures/gui/absorb.png new file mode 100644 index 0000000000000000000000000000000000000000..bbb550acd245c9adc252c434feadde1ec14ed8d8 GIT binary patch literal 4835 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 literal 0 HcmV?d00001 From a179e537909c84403358c8d42cf0e1e6b10686c7 Mon Sep 17 00:00:00 2001 From: Zontreck Date: Wed, 12 Oct 2022 23:50:45 -0700 Subject: [PATCH 3/3] Fix version in mods.toml --- src/main/resources/META-INF/mods.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index af62d71..9d2fa71 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -19,7 +19,7 @@ modId="watchmydurability" #mandatory # The version number of the mod - there's a few well known ${} variables useable here or just hardcode it # ${file.jarVersion} will substitute the value of the Implementation-Version as read from the mod's JAR file metadata # see the associated build.gradle script for how to populate this completely automatically during a build -version="${file.jarVersion}" #mandatory +version="1.1.1" #mandatory # A display name for the mod displayName="Watch My Durability" #mandatory # A URL to query for updates for this mod. See the JSON update specification https://mcforge.readthedocs.io/en/latest/gettingstarted/autoupdate/