From a703b62894af662efc3238423f5b6f99c76b1cc4 Mon Sep 17 00:00:00 2001 From: inyourwalls Date: Tue, 7 Nov 2023 22:35:09 -0500 Subject: make it a little less bad, add support for blast furnace and smoker --- src/main/java/net/inyourwalls/frank/Frank.java | 104 ++++++++++++++++++------- 1 file changed, 74 insertions(+), 30 deletions(-) (limited to 'src/main/java') 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 + ); + }); + } 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 ); - drawContext.drawTextWithShadow(client.textRenderer, - Text.literal("cookProgress: " + furnace.getScreenHandler().getCookProgress()), - infoX, - infoY + 30, - 0xffffff + }); + } 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); + } } + -- cgit v1.3.1