aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorinyourwalls <inyourwalls@tutanota.com>2024-06-19 21:19:12 -0400
committerinyourwalls <inyourwalls@tutanota.com>2024-06-19 21:19:12 -0400
commitcf9b99bc758e66a331ef448714efb1dcafc3b9e8 (patch)
treed2114b8984cc22c5f365fcd0cbe0b742334aae01
parent56531253380bcbcb7d98ea074ba31a314a39ac8f (diff)
split handler into separate file, use screen handler properties
-rw-r--r--build.gradle.kts2
-rw-r--r--src/main/java/net/inyourwalls/frank/Frank.java133
-rw-r--r--src/main/java/net/inyourwalls/frank/ScreenEventHandler.java98
-rw-r--r--src/main/java/net/inyourwalls/frank/ScreenHandlerPropertyAccessor.java19
-rw-r--r--src/main/java/net/inyourwalls/frank/mixin/AbstractFurnaceScreenHandlerMixin.java35
-rw-r--r--src/main/resources/fabric.mod.json6
-rw-r--r--src/main/resources/frank.mixins.json12
7 files changed, 175 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..7e64119
--- /dev/null
+++ b/src/main/java/net/inyourwalls/frank/ScreenEventHandler.java
@@ -0,0 +1,98 @@
+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);
+ this.itemsSmeltable = remainingFuelTicks / this.screenHandler.getTotalCookingTicks();
+ 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 e608d30..7abafec 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
+ }
+}