diff options
| author | inyourwalls <inyourwalls@tutanota.com> | 2024-06-24 19:14:59 -0400 |
|---|---|---|
| committer | inyourwalls <inyourwalls@tutanota.com> | 2024-06-24 19:14:59 -0400 |
| commit | 8aefe91d289c153c4a71ac495053be291f3b1964 (patch) | |
| tree | e6bc031a9a6bd749eb7e97986e3c918a5f57ba9d | |
| parent | 39b9fb9104a74894653d8e7e9070aaf93330f6a6 (diff) | |
| parent | b965069edef8a1a9adfcfd08536870e5e22b52be (diff) | |
Merge branch 'refactor'
| -rw-r--r-- | build.gradle.kts | 2 | ||||
| -rw-r--r-- | src/main/java/net/inyourwalls/frank/Frank.java | 133 | ||||
| -rw-r--r-- | src/main/java/net/inyourwalls/frank/ScreenEventHandler.java | 99 | ||||
| -rw-r--r-- | src/main/java/net/inyourwalls/frank/ScreenHandlerPropertyAccessor.java | 19 | ||||
| -rw-r--r-- | src/main/java/net/inyourwalls/frank/mixin/AbstractFurnaceScreenHandlerMixin.java | 35 | ||||
| -rw-r--r-- | src/main/resources/fabric.mod.json | 6 | ||||
| -rw-r--r-- | src/main/resources/frank.mixins.json | 12 |
7 files changed, 176 insertions, 130 deletions
diff --git a/build.gradle.kts b/build.gradle.kts index f961e14..a37f91c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } val minecraftVersion = "1.21" -version = "1.0.0+$minecraftVersion" +version = "1.0.1+$minecraftVersion" group = "net.inyourwalls" repositories { diff --git a/src/main/java/net/inyourwalls/frank/Frank.java b/src/main/java/net/inyourwalls/frank/Frank.java index 0aebd73..4996a88 100644 --- a/src/main/java/net/inyourwalls/frank/Frank.java +++ b/src/main/java/net/inyourwalls/frank/Frank.java @@ -4,16 +4,9 @@ package net.inyourwalls.frank; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; -import net.fabricmc.fabric.api.registry.FuelRegistry; import net.inyourwalls.frank.config.FrankConfig; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.AbstractFurnaceScreen; -import net.minecraft.item.ItemStack; import net.minecraft.screen.AbstractFurnaceScreenHandler; -import net.minecraft.screen.BlastFurnaceScreenHandler; -import net.minecraft.screen.SmokerScreenHandler; -import net.minecraft.text.Text; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,8 +15,6 @@ import java.nio.file.Path; public class Frank implements ClientModInitializer { public static final Logger LOGGER = LoggerFactory.getLogger(Frank.class); - private static final int CRAFTING_SLOT_INDEX = 0; - private static final int FUEL_SLOT_INDEX = 1; private static final Path CONFIG_PATH = FabricLoader.getInstance().getConfigDir().resolve("frank.json"); private static FrankConfig config; @@ -38,131 +29,15 @@ public class Frank implements ClientModInitializer { ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> { if (screen instanceof AbstractFurnaceScreen furnace) { - AbstractFurnaceScreenHandler handler = (AbstractFurnaceScreenHandler) furnace.getScreenHandler(); - - int speedMultiplier = (handler instanceof BlastFurnaceScreenHandler || handler instanceof SmokerScreenHandler) ? 2 : 1; - ScreenEvents.afterRender(screen).register((_s, drawContext, mouseX, mouseY, tickDelta) -> { - int x = screen.width / 2 + 90; // just after the right edge. - int y = screen.height / 2 - 80; // more or less in line with the top edge. - if (furnace.recipeBook.isOpen()) x += 77; - switch (config.getDisplayMode()) { - case TIME_LEFT_FIRST -> { - renderTimeLeft( - drawContext, - client.textRenderer, - x, - y, - config.getTextColour(), - handler.getSlot(CRAFTING_SLOT_INDEX).getStack().getCount(), - speedMultiplier, - handler.getCookProgress() - ); - renderItemsSmeltable( - drawContext, - client.textRenderer, - x, - y + 10, - config.getTextColour(), - handler.getSlot(FUEL_SLOT_INDEX).getStack(), - handler.getFuelProgress() - ); - break; - } - - case TIME_LEFT_ONLY -> { - renderTimeLeft( - drawContext, - client.textRenderer, - x, - y, - config.getTextColour(), - handler.getSlot(CRAFTING_SLOT_INDEX).getStack().getCount(), - speedMultiplier, - handler.getCookProgress() - ); - break; - } - - case ITEMS_SMELTABLE_FIRST -> { - renderItemsSmeltable( - drawContext, - client.textRenderer, - x, - y, - config.getTextColour(), - handler.getSlot(FUEL_SLOT_INDEX).getStack(), - handler.getFuelProgress() - ); - renderTimeLeft( - drawContext, - client.textRenderer, - x, - y + 10, - config.getTextColour(), - handler.getSlot(CRAFTING_SLOT_INDEX).getStack().getCount(), - speedMultiplier, - handler.getCookProgress() - ); - break; - } - - case ITEMS_SMELTABLE_ONLY -> { - renderItemsSmeltable( - drawContext, - client.textRenderer, - x, - y, - config.getTextColour(), - handler.getSlot(FUEL_SLOT_INDEX).getStack(), - handler.getFuelProgress() - ); - break; - } - - case DISABLED -> {} - } - }); + AbstractFurnaceScreenHandler screenHandler = (AbstractFurnaceScreenHandler) furnace.getScreenHandler(); + ScreenEventHandler handler = new ScreenEventHandler(furnace, screenHandler, client.textRenderer, config); + ScreenEvents.afterRender(screen).register(handler); + ScreenEvents.afterTick(screen).register(handler); } }); LOGGER.info("Screen events registered."); } - private void renderTimeLeft( - DrawContext context, - TextRenderer renderer, - int x, - int y, - int textColour, - int itemsInProgress, - int speedMultiplier, - float cookProgress - ) { - int smeltingSpeed = 10 / speedMultiplier; // still kinda lame, but it works! - int secondsLeft = itemsInProgress * smeltingSpeed - (int)(cookProgress * smeltingSpeed); - int minutesLeft = secondsLeft / 60; - secondsLeft = secondsLeft % 60; - - context.drawTextWithShadow(renderer, Text.translatable("ui.frank.time_left", minutesLeft, secondsLeft), x, y, textColour); - } - - private void renderItemsSmeltable( - DrawContext context, - TextRenderer renderer, - int x, - int y, - int textColour, - ItemStack fuel, - float fuelProgress - ) { - int fuelCount = fuel.getCount(); - Integer fuelTicks = FuelRegistry.INSTANCE.get(fuel.getItem()); - if (fuelTicks == null) fuelTicks = 0; - int burningFuel = (int)((float)(fuelTicks / 10) * fuelProgress); - int itemsSmeltable = (((fuelTicks / 10) * fuelCount) / 20) + (burningFuel / 20); - - context.drawTextWithShadow(renderer, Text.translatable("ui.frank.smeltable", itemsSmeltable), x, y, textColour); - } - /** * Gets the current active configuration. */ diff --git a/src/main/java/net/inyourwalls/frank/ScreenEventHandler.java b/src/main/java/net/inyourwalls/frank/ScreenEventHandler.java new file mode 100644 index 0000000..cc12575 --- /dev/null +++ b/src/main/java/net/inyourwalls/frank/ScreenEventHandler.java @@ -0,0 +1,99 @@ +package net.inyourwalls.frank; + +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; +import net.fabricmc.fabric.api.registry.FuelRegistry; +import net.inyourwalls.frank.config.FrankConfig; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.ingame.AbstractFurnaceScreen; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.AbstractFurnaceScreenHandler; +import net.minecraft.text.Text; + +public class ScreenEventHandler implements ScreenEvents.AfterRender, ScreenEvents.AfterTick { + private static final int CRAFTING_SLOT_INDEX = 0; + private static final int FUEL_SLOT_INDEX = 1; + private final AbstractFurnaceScreen<?> screen; + private final AbstractFurnaceScreenHandler screenHandler; + private final TextRenderer textRenderer; + private final FrankConfig config; + private int ticksLeft = 0; + private int itemsSmeltable = 0; + + public ScreenEventHandler( + AbstractFurnaceScreen<?> screen, + AbstractFurnaceScreenHandler screenHandler, + TextRenderer textRenderer, + FrankConfig config + ) { + this.screen = screen; + this.screenHandler = screenHandler; + this.textRenderer = textRenderer; + this.config = config; + } + + @Override + public void afterRender(Screen screen, DrawContext drawContext, int mouseX, int mouseY, float tickDelta) { + int secondsLeft = this.ticksLeft / 20; + int x = this.screen.width / 2 + (this.screen.recipeBook.isOpen() ? 167 : 90); + int y = this.screen.height / 2 - 80; + switch (this.config.getDisplayMode()) { + case TIME_LEFT_FIRST -> { + renderTimeLeft(drawContext, secondsLeft, x, y); + renderItemsSmeltable(drawContext, x, y + 10); + } + + case TIME_LEFT_ONLY -> { + renderTimeLeft(drawContext, secondsLeft, x, y); + } + + case ITEMS_SMELTABLE_FIRST -> { + renderItemsSmeltable(drawContext, x, y); + renderTimeLeft(drawContext, secondsLeft, x, y); + } + + case ITEMS_SMELTABLE_ONLY -> { + renderItemsSmeltable(drawContext, x, y); + } + + case DISABLED -> {} + } + } + + private void renderTimeLeft(DrawContext drawContext, int secondsLeft, int x, int y) { + int minutesLeft = secondsLeft / 60; + secondsLeft %= 60; + drawContext.drawTextWithShadow( + this.textRenderer, + Text.translatable("ui.frank.time_left", minutesLeft, secondsLeft), + x, + y, + this.config.getTextColour() + ); + } + + private void renderItemsSmeltable(DrawContext drawContext, int x, int y) { + drawContext.drawTextWithShadow( + this.textRenderer, + Text.translatable("ui.frank.smeltable", itemsSmeltable), + x, + y, + this.config.getTextColour() + ); + } + + @Override + public void afterTick(Screen screen) { + ItemStack fuel = this.screenHandler.getSlot(FUEL_SLOT_INDEX).getStack(); + Integer availableFuelTicks = FuelRegistry.INSTANCE.get(fuel.getItem()); + if (availableFuelTicks == null) availableFuelTicks = 0; + availableFuelTicks *= fuel.getCount(); + int remainingFuelTicks = availableFuelTicks + (this.screenHandler.isBurning() ? this.screenHandler.getRemainingFuelTicks() : 0); + int totalCookingTicks = this.screenHandler.getTotalCookingTicks() <= 0 ? 200 : this.screenHandler.getTotalCookingTicks(); + this.itemsSmeltable = remainingFuelTicks / totalCookingTicks; + int totalTicks = + this.screenHandler.getSlot(CRAFTING_SLOT_INDEX).getStack().getCount() * this.screenHandler.getTotalCookingTicks(); + this.ticksLeft = totalTicks - this.screenHandler.getCurrentCookingTicks(); + } +} diff --git a/src/main/java/net/inyourwalls/frank/ScreenHandlerPropertyAccessor.java b/src/main/java/net/inyourwalls/frank/ScreenHandlerPropertyAccessor.java new file mode 100644 index 0000000..8df81e2 --- /dev/null +++ b/src/main/java/net/inyourwalls/frank/ScreenHandlerPropertyAccessor.java @@ -0,0 +1,19 @@ +package net.inyourwalls.frank; + +public interface ScreenHandlerPropertyAccessor { + default int getRemainingFuelTicks() { + return 0; + } + + default int getTotalFuelTicks() { + return 0; + } + + default int getCurrentCookingTicks() { + return 0; + } + + default int getTotalCookingTicks() { + return 0; + } +} diff --git a/src/main/java/net/inyourwalls/frank/mixin/AbstractFurnaceScreenHandlerMixin.java b/src/main/java/net/inyourwalls/frank/mixin/AbstractFurnaceScreenHandlerMixin.java new file mode 100644 index 0000000..30b68ee --- /dev/null +++ b/src/main/java/net/inyourwalls/frank/mixin/AbstractFurnaceScreenHandlerMixin.java @@ -0,0 +1,35 @@ +package net.inyourwalls.frank.mixin; + +import net.inyourwalls.frank.ScreenHandlerPropertyAccessor; +import net.minecraft.screen.AbstractFurnaceScreenHandler; +import net.minecraft.screen.PropertyDelegate; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(AbstractFurnaceScreenHandler.class) +public abstract class AbstractFurnaceScreenHandlerMixin implements ScreenHandlerPropertyAccessor { + @Shadow + @Final + private PropertyDelegate propertyDelegate; + + @Override + public int getRemainingFuelTicks() { + return this.propertyDelegate.get(0); + } + + @Override + public int getTotalFuelTicks() { + return this.propertyDelegate.get(1); + } + + @Override + public int getCurrentCookingTicks() { + return this.propertyDelegate.get(2); + } + + @Override + public int getTotalCookingTicks() { + return this.propertyDelegate.get(3); + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 6b2edac..1163876 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -21,6 +21,9 @@ "net.inyourwalls.frank.ModMenuIntegration" ] }, + "mixins": [ + "frank.mixins.json" + ], "depends": { "fabricloader": ">=0.14.22", "fabric-screen-api-v1": ">=0.100.1+1.21", @@ -29,6 +32,9 @@ }, "suggests": {}, "custom": { + "loom:injected_interfaces": { + "net/minecraft/class_1720": ["net/inyourwalls/frank/ScreenHandlerPropertyAccessor"] + }, "modmenu": { "links": { "frank.matrix": "https://matrix.to/#/#mod-support:inyourwalls.net" diff --git a/src/main/resources/frank.mixins.json b/src/main/resources/frank.mixins.json new file mode 100644 index 0000000..4d27370 --- /dev/null +++ b/src/main/resources/frank.mixins.json @@ -0,0 +1,12 @@ +{ + "required": true, + "minVersion": "0.8", + "compatibilityLevel": "JAVA_21", + "package": "net.inyourwalls.frank.mixin", + "client": [ + "AbstractFurnaceScreenHandlerMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} |
