aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorinyourwalls <inyourwalls@tutanota.com>2023-11-07 22:35:09 -0500
committerinyourwalls <inyourwalls@tutanota.com>2023-11-07 22:35:09 -0500
commita703b62894af662efc3238423f5b6f99c76b1cc4 (patch)
tree8cd5af83cd898fd6112181893cff626eee267f46
parentad36711caa30a934a61b2d95ad8f898a6690d257 (diff)
make it a little less bad, add support for blast furnace and smoker
-rw-r--r--src/main/java/net/inyourwalls/frank/Frank.java104
1 files changed, 74 insertions, 30 deletions
diff --git a/src/main/java/net/inyourwalls/frank/Frank.java b/src/main/java/net/inyourwalls/frank/Frank.java
index 805d2c4..825ddfa 100644
--- a/src/main/java/net/inyourwalls/frank/Frank.java
+++ b/src/main/java/net/inyourwalls/frank/Frank.java
@@ -4,8 +4,16 @@ package net.inyourwalls.frank;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.fabricmc.fabric.api.registry.FuelRegistry;
+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.BlastFurnaceScreen;
import net.minecraft.client.gui.screen.ingame.FurnaceScreen;
+import net.minecraft.client.gui.screen.ingame.SmokerScreen;
import net.minecraft.item.ItemStack;
+import net.minecraft.screen.BlastFurnaceScreenHandler;
+import net.minecraft.screen.FurnaceScreenHandler;
+import net.minecraft.screen.SmokerScreenHandler;
import net.minecraft.text.Text;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -15,47 +23,83 @@ public class Frank implements ClientModInitializer {
private static final int CRAFTING_SLOT_INDEX = 0;
private static final int FUEL_SLOT_INDEX = 1;
+ private static final int WHITE = 0xffffff;
@Override
public void onInitializeClient() {
ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
if (screen instanceof FurnaceScreen furnace) {
- // Determine where to draw the information.
- int infoX = screen.width / 2 + 90;
- int infoY = screen.height / 2 - 80;
-
ScreenEvents.afterRender(screen).register((_s, drawContext, mouseX, mouseY, tickDelta) -> {
- int itemsInProgress = furnace.getScreenHandler().getSlot(CRAFTING_SLOT_INDEX).getStack().getCount();
- int secondsLeft = itemsInProgress * 10 - (int)(furnace.getScreenHandler().getCookProgress() * 10);
-
- ItemStack fuel = furnace.getScreenHandler().getSlot(FUEL_SLOT_INDEX).getStack();
- int fuelItemCount = fuel.getCount();
- Integer fuelTicks = FuelRegistry.INSTANCE.get(fuel.getItem());
- if (fuelTicks == null) fuelTicks = 0; // Avoid null pointer exception because Java is terrible.
- int itemsSmeltable = ((fuelTicks / 10) * fuelItemCount) / 20;
-
- drawContext.drawTextWithShadow(
- client.textRenderer,
- Text.literal("ui.frank.time_left: " + secondsLeft),
- infoX,
- infoY,
- 0xffffff);
- drawContext.drawTextWithShadow(client.textRenderer, Text.literal("smeltable: " + itemsSmeltable), infoX, infoY + 10, 0xffffff);
- drawContext.drawTextWithShadow(client.textRenderer,
- Text.literal("fuelProgress: " + furnace.getScreenHandler().getFuelProgress()),
- infoX,
- infoY + 20,
- 0xffffff
+ FurnaceScreenHandler handler = furnace.getScreenHandler();
+ renderInfoLines(
+ screen,
+ drawContext,
+ client.textRenderer,
+ handler.getSlot(CRAFTING_SLOT_INDEX).getStack().getCount(),
+ handler.getCookProgress(),
+ handler.getSlot(FUEL_SLOT_INDEX).getStack(),
+ 1
);
- drawContext.drawTextWithShadow(client.textRenderer,
- Text.literal("cookProgress: " + furnace.getScreenHandler().getCookProgress()),
- infoX,
- infoY + 30,
- 0xffffff
+ });
+ } else if (screen instanceof BlastFurnaceScreen furnace) {
+ ScreenEvents.afterRender(screen).register((_s, drawContext, mouseX, mouseY, tickDelta) -> {
+ BlastFurnaceScreenHandler handler = furnace.getScreenHandler();
+ renderInfoLines(
+ screen,
+ drawContext,
+ client.textRenderer,
+ handler.getSlot(CRAFTING_SLOT_INDEX).getStack().getCount(),
+ handler.getCookProgress(),
+ handler.getSlot(FUEL_SLOT_INDEX).getStack(),
+ 2
+ );
+ });
+ } else if (screen instanceof SmokerScreen furnace) {
+ ScreenEvents.afterRender(screen).register((_s, drawContext, mouseX, mouseY, tickDelta) -> {
+ SmokerScreenHandler handler = furnace.getScreenHandler();
+ renderInfoLines(
+ screen,
+ drawContext,
+ client.textRenderer,
+ handler.getSlot(CRAFTING_SLOT_INDEX).getStack().getCount(),
+ handler.getCookProgress(),
+ handler.getSlot(FUEL_SLOT_INDEX).getStack(),
+ 2
);
});
}
});
LOGGER.info("Screen events registered.");
}
+
+ /**
+ * Renders the info lines on the given screen.
+ */
+ private void renderInfoLines(
+ Screen screen,
+ DrawContext context,
+ TextRenderer renderer,
+ int itemsInProgress,
+ float cookProgress,
+ ItemStack fuel,
+ int speedMultiplier
+ ) {
+ // Determine where to start drawnig the information.
+ int infoX = screen.width / 2 + 90;
+ int infoY = screen.height / 2 - 80;
+
+ int secondsLeft = itemsInProgress * (10 / speedMultiplier) - (int)(cookProgress * 10);
+ int minutesLeft = secondsLeft / 60;
+ secondsLeft = secondsLeft % 60;
+
+ int fuelCount = fuel.getCount();
+ Integer fuelTicks = FuelRegistry.INSTANCE.get(fuel.getItem());
+ // Avoid null pointer exception because Java is terrible.
+ if (fuelTicks == null) fuelTicks = 0;
+ int itemsSmeltable = ((fuelTicks / 10) * fuelCount) / 20;
+
+ context.drawTextWithShadow(renderer, Text.translatable("ui.frank.time_left", minutesLeft, secondsLeft), infoX, infoY, WHITE);
+ context.drawTextWithShadow(renderer, Text.translatable("ui.frank.smeltable", itemsSmeltable), infoX, infoY + 10, WHITE);
+ }
}
+