From 1f92e2dbe396db8f8bd13d2d05e2d970693ebc64 Mon Sep 17 00:00:00 2001 From: SkyNotTheLimit <159592458+ekulxam@users.noreply.github.com> Date: Fri, 21 Aug 2026 16:55:57 -0700 Subject: [PATCH] feat: Doing It Myself --- .gitmodules | 3 ++ build.gradle.kts | 12 ++++- gradle/libs.versions.toml | 11 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 10 ---- settings.gradle.kts | 6 ++- .../tourmaline/AbstractClientPlayerMixin.java | 27 ++++++++++ .../resources/flowerbed.client.mixins.json | 31 +++++------ .../duck/tourmaline/ClientFoodLimiter.java | 7 +++ .../panacea/PanaceaBrewingStandMenuMixin.java | 27 ++++++++++ .../PanaceaCauldronInteractionsMixin.java | 18 +++++++ .../mixin/fix/tourmaline/FoodDataMixin.java | 18 +++++++ src/main/resources/fabric.mod.json | 2 +- ...d.accesswidener => flowerbed.classtweaker} | 2 +- src/main/resources/flowerbed.mixins.json | 51 ++++++++++--------- 15 files changed, 167 insertions(+), 60 deletions(-) create mode 100644 .gitmodules delete mode 100644 settings.gradle create mode 100644 src/client/java/net/modgarden/flowerbed/client/mixin/fix/tourmaline/AbstractClientPlayerMixin.java create mode 100644 src/main/java/net/modgarden/flowerbed/duck/tourmaline/ClientFoodLimiter.java create mode 100644 src/main/java/net/modgarden/flowerbed/mixin/fix/panacea/PanaceaBrewingStandMenuMixin.java create mode 100644 src/main/java/net/modgarden/flowerbed/mixin/fix/panacea/PanaceaCauldronInteractionsMixin.java create mode 100644 src/main/java/net/modgarden/flowerbed/mixin/fix/tourmaline/FoodDataMixin.java rename src/main/resources/{flowerbed.accesswidener => flowerbed.classtweaker} (91%) diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..8aeee5a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Tourmaline"] + path = submodules/tourmaline + url = https://sylveon.pet/cyan/tourmaline diff --git a/build.gradle.kts b/build.gradle.kts index 405fe0b..afe2cde 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ import net.modgarden.flowerbed.gradle.Properties plugins { - id("net.fabricmc.fabric-loom") version "1.14-SNAPSHOT" + id("net.fabricmc.fabric-loom") version "1.17-SNAPSHOT" id("maven-publish") } @@ -17,7 +17,7 @@ loom { sourceSet(sourceSets["client"]) } } - accessWidenerPath = projectDir.resolve("src/main/resources/flowerbed.accesswidener") + accessWidenerPath = projectDir.resolve("src/main/resources/flowerbed.classtweaker") } repositories { @@ -47,6 +47,12 @@ repositories { maven("https://maven.cassian.cc") { name = "Cassian" } + maven("https://maven.greenhouse.lgbt/releases") { + name = "Greenhouse (Releases)" + } + maven("https://maven.greenhouse.lgbt/snapshots") { + name = "Greenhouse (Snapshots)" + } } dependencies { @@ -60,6 +66,8 @@ dependencies { localRuntime(libs.player.roles) // Fix Mods + implementation(libs.panacea) + implementation(project(":tourmaline")) // Libraries implementation(libs.fabric.permissions) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3523611..364a205 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,16 +1,16 @@ [versions] -minecraft = "26.1.1" +minecraft = "26.1.2" # Fabric -fabric-loader = "0.18.6" -fabric-api = "0.145.3+26.1.1" -mod-menu = "18.0.0-alpha.7" +fabric-loader = "0.19.3" +fabric-api = "0.155.2+26.1.2" +mod-menu = "18.0.0" # Testing player-roles = "1.9.0-pre.1" # Fixing - +panacea = "0.1.5+26.1.x" # Libraries fabric-permissions = "0.7.0" @@ -26,6 +26,7 @@ mod-menu = { module = "com.terraformersmc:modmenu", version.ref = "mod-menu" } player-roles = { module = "dev.gegy:player-roles", version.ref = "player-roles" } # Fixing +panacea = { module = "lgbt.greenhouse.panacea:panacea", version.ref = "panacea" } # Libraries fabric-permissions = { module = "me.lucko:fabric-permissions-api", version.ref = "fabric-permissions" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c61a118..1a70468 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 75c4d72..0000000 --- a/settings.gradle +++ /dev/null @@ -1,10 +0,0 @@ -pluginManagement { - repositories { - maven { - name = 'Fabric' - url = 'https://maven.fabricmc.net/' - } - mavenCentral() - gradlePluginPortal() - } -} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 1a53c95..1c2dfee 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,4 +6,8 @@ pluginManagement { mavenCentral() gradlePluginPortal() } -} \ No newline at end of file +} + +rootProject.name = "flowerbed" + +includeBuild("submodules/tourmaline") diff --git a/src/client/java/net/modgarden/flowerbed/client/mixin/fix/tourmaline/AbstractClientPlayerMixin.java b/src/client/java/net/modgarden/flowerbed/client/mixin/fix/tourmaline/AbstractClientPlayerMixin.java new file mode 100644 index 0000000..53d95f3 --- /dev/null +++ b/src/client/java/net/modgarden/flowerbed/client/mixin/fix/tourmaline/AbstractClientPlayerMixin.java @@ -0,0 +1,27 @@ +package net.modgarden.flowerbed.client.mixin.fix.tourmaline; + +import com.mojang.authlib.GameProfile; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.modgarden.flowerbed.duck.tourmaline.ClientFoodLimiter; +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 pet.cyan.tourmaline.registry.TourmalineAttributes; + +@Mixin(AbstractClientPlayer.class) +public abstract class AbstractClientPlayerMixin extends Player { + public AbstractClientPlayerMixin(Level level, GameProfile gameProfile) { + super(level, gameProfile); + } + + @Inject(method = "tick", at = @At("RETURN")) + private void tickFoodData(CallbackInfo ci) { + ((ClientFoodLimiter) this.foodData).doing_it_myself$setMaxFood( + Mth.ceil(this.getAttributeValue(TourmalineAttributes.MAX_FOOD)) + ); + } +} diff --git a/src/client/resources/flowerbed.client.mixins.json b/src/client/resources/flowerbed.client.mixins.json index 8a713af..fab5080 100644 --- a/src/client/resources/flowerbed.client.mixins.json +++ b/src/client/resources/flowerbed.client.mixins.json @@ -1,17 +1,18 @@ { - "required": true, - "package": "net.modgarden.flowerbed.client.mixin", - "compatibilityLevel": "JAVA_21", - "client": [ - "Mixin_EntityRenderer", - "Mixin_Gui", - "Mixin_WorldBorderRenderer", - "fix.Mixin_LogoRenderer", - "showcase.screen.Mixin_JoinMultiplayerScreen", - "showcase.screen.Mixin_ServerSelectionList", - "showcase.screen.Mixin_ServerSelectionListOnlineServerEntry" - ], - "injectors": { - "defaultRequire": 1 - } + "required": true, + "package": "net.modgarden.flowerbed.client.mixin", + "compatibilityLevel": "JAVA_21", + "client": [ + "Mixin_EntityRenderer", + "Mixin_Gui", + "Mixin_WorldBorderRenderer", + "fix.Mixin_LogoRenderer", + "fix.tourmaline.AbstractClientPlayerMixin", + "showcase.screen.Mixin_JoinMultiplayerScreen", + "showcase.screen.Mixin_ServerSelectionList", + "showcase.screen.Mixin_ServerSelectionListOnlineServerEntry" + ], + "injectors": { + "defaultRequire": 1 + } } diff --git a/src/main/java/net/modgarden/flowerbed/duck/tourmaline/ClientFoodLimiter.java b/src/main/java/net/modgarden/flowerbed/duck/tourmaline/ClientFoodLimiter.java new file mode 100644 index 0000000..88d537d --- /dev/null +++ b/src/main/java/net/modgarden/flowerbed/duck/tourmaline/ClientFoodLimiter.java @@ -0,0 +1,7 @@ +package net.modgarden.flowerbed.duck.tourmaline; + +public interface ClientFoodLimiter { + default void doing_it_myself$setMaxFood(int maxFood) { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/net/modgarden/flowerbed/mixin/fix/panacea/PanaceaBrewingStandMenuMixin.java b/src/main/java/net/modgarden/flowerbed/mixin/fix/panacea/PanaceaBrewingStandMenuMixin.java new file mode 100644 index 0000000..cedb032 --- /dev/null +++ b/src/main/java/net/modgarden/flowerbed/mixin/fix/panacea/PanaceaBrewingStandMenuMixin.java @@ -0,0 +1,27 @@ +package net.modgarden.flowerbed.mixin.fix.panacea; + +import lgbt.greenhouse.panacea.world.menu.PanaceaBrewingStandMenu; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.Slot; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(PanaceaBrewingStandMenu.class) +public class PanaceaBrewingStandMenuMixin { + + @SuppressWarnings("unused") + @Mixin(PanaceaBrewingStandMenu.PotionSlot.class) + public abstract static class PotionSlotMixin extends Slot { + public PotionSlotMixin(Container container, int slot, int x, int y) { + super(container, slot, x, y); + } + + /** + * @reason Trying to brew multiple potions in one slot fails and seems to revert the potion instead + */ + @SuppressWarnings("JavadocDeclaration") + @Override + public int getMaxStackSize() { + return 1; // mixinoverride, yeah I know, whatever, it's fine here + } + } +} diff --git a/src/main/java/net/modgarden/flowerbed/mixin/fix/panacea/PanaceaCauldronInteractionsMixin.java b/src/main/java/net/modgarden/flowerbed/mixin/fix/panacea/PanaceaCauldronInteractionsMixin.java new file mode 100644 index 0000000..d77fe91 --- /dev/null +++ b/src/main/java/net/modgarden/flowerbed/mixin/fix/panacea/PanaceaCauldronInteractionsMixin.java @@ -0,0 +1,18 @@ +package net.modgarden.flowerbed.mixin.fix.panacea; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import lgbt.greenhouse.panacea.world.block.PanaceaCauldronInteractions; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(PanaceaCauldronInteractions.class) +public class PanaceaCauldronInteractionsMixin { + /** + * @reason ItemUtil handles the decrementing already, so this prevents double-shrinking + */ + @WrapWithCondition(method = "takePotsicle", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;shrink(I)V")) + private static boolean decrementOnce(ItemStack instance, int amount) { + return false; + } +} diff --git a/src/main/java/net/modgarden/flowerbed/mixin/fix/tourmaline/FoodDataMixin.java b/src/main/java/net/modgarden/flowerbed/mixin/fix/tourmaline/FoodDataMixin.java new file mode 100644 index 0000000..c1b2eab --- /dev/null +++ b/src/main/java/net/modgarden/flowerbed/mixin/fix/tourmaline/FoodDataMixin.java @@ -0,0 +1,18 @@ +package net.modgarden.flowerbed.mixin.fix.tourmaline; + +import net.minecraft.world.food.FoodData; +import net.modgarden.flowerbed.duck.tourmaline.ClientFoodLimiter; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(value = FoodData.class, priority = 2000) +public class FoodDataMixin implements ClientFoodLimiter { + @SuppressWarnings("MixinAnnotationTarget") + @Shadow + int tourmaline$maxFood; + + @Override + public void doing_it_myself$setMaxFood(int maxFood) { + this.tourmaline$maxFood = maxFood; + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 283ba4f..514b96a 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -28,7 +28,7 @@ "environment": "client" } ], - "accessWidener": "${mod_id}.accesswidener", + "accessWidener": "flowerbed.classtweaker", "depends": { "fabricloader": "${fabric_loader_range}", "fabric-api": ">=0.125.0", diff --git a/src/main/resources/flowerbed.accesswidener b/src/main/resources/flowerbed.classtweaker similarity index 91% rename from src/main/resources/flowerbed.accesswidener rename to src/main/resources/flowerbed.classtweaker index d52ef24..255056e 100644 --- a/src/main/resources/flowerbed.accesswidener +++ b/src/main/resources/flowerbed.classtweaker @@ -1,2 +1,2 @@ -accessWidener v2 official +classTweaker v2 official accessible method net/minecraft/client/gui/screens/multiplayer/ServerSelectionList$OnlineServerEntry (Lnet/minecraft/client/gui/screens/multiplayer/ServerSelectionList;Lnet/minecraft/client/gui/screens/multiplayer/JoinMultiplayerScreen;Lnet/minecraft/client/multiplayer/ServerData;)V diff --git a/src/main/resources/flowerbed.mixins.json b/src/main/resources/flowerbed.mixins.json index 2e3e2f2..0c8119b 100644 --- a/src/main/resources/flowerbed.mixins.json +++ b/src/main/resources/flowerbed.mixins.json @@ -1,28 +1,31 @@ { - "required": true, - "package": "net.modgarden.flowerbed.mixin", - "compatibilityLevel": "JAVA_21", - "mixins": [ - "Mixin_CarvedPumpkinBlock", - "Mixin_FoodData", - "Mixin_Player", - "Mixin_PortalProcessor", - "Mixin_ServerPlayer", + "required": true, + "package": "net.modgarden.flowerbed.mixin", + "compatibilityLevel": "JAVA_21", + "mixins": [ + "Mixin_CarvedPumpkinBlock", + "Mixin_FoodData", + "Mixin_Player", + "Mixin_PortalProcessor", + "Mixin_ServerPlayer", "Mixin_WitherSkullBlock", - "fix.log.Mixin_IdDispatchCodec", - "showcase.gamemode.Mixin_ServerPlayer", - "showcase.griefing.Mixin_FarmBlock", - "showcase.griefing.invulnerability.Mixin_ArmorStandItem", - "showcase.griefing.invulnerability.Mixin_BoatItem", - "showcase.griefing.invulnerability.Mixin_HangingEntityItem", - "showcase.griefing.invulnerability.Mixin_SpawnEggItem", - "showcase.griefing.invulnerability.Mixin_SummonCommand", - "showcase.griefing.prevent_modfest_1_20.Mixin_EntityArgument", - "showcase.griefing.prevent_modfest_1_20.Mixin_EntitySelectorOptions", - "showcase.griefing.prevent_modfest_1_20.Mixin_EntitySelectorParser", - "showcase.spawning.Mixin_TrialSpawner" - ], - "injectors": { - "defaultRequire": 1 + "fix.log.Mixin_IdDispatchCodec", + "fix.panacea.PanaceaBrewingStandMenuMixin", + "fix.panacea.PanaceaCauldronInteractionsMixin", + "fix.tourmaline.FoodDataMixin", + "showcase.gamemode.Mixin_ServerPlayer", + "showcase.griefing.Mixin_FarmBlock", + "showcase.griefing.invulnerability.Mixin_ArmorStandItem", + "showcase.griefing.invulnerability.Mixin_BoatItem", + "showcase.griefing.invulnerability.Mixin_HangingEntityItem", + "showcase.griefing.invulnerability.Mixin_SpawnEggItem", + "showcase.griefing.invulnerability.Mixin_SummonCommand", + "showcase.griefing.prevent_modfest_1_20.Mixin_EntityArgument", + "showcase.griefing.prevent_modfest_1_20.Mixin_EntitySelectorOptions", + "showcase.griefing.prevent_modfest_1_20.Mixin_EntitySelectorParser", + "showcase.spawning.Mixin_TrialSpawner" + ], + "injectors": { + "defaultRequire": 1 } }