diff options
| author | viciscat <51047087+viciscat@users.noreply.github.com> | 2025-05-08 00:08:56 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-07 18:08:56 -0400 |
| commit | e71f08a418eba1c464d054c5d634d580a25eac8a (patch) | |
| tree | fb4c528340e6969546c7cf7fd040ff7b450fd10f /src/main/java/de | |
| parent | c61721e5e76aa02b6222fc47609a11c8da12aaf8 (diff) | |
| download | Skyblocker-e71f08a418eba1c464d054c5d634d580a25eac8a.tar.gz Skyblocker-e71f08a418eba1c464d054c5d634d580a25eac8a.tar.bz2 Skyblocker-e71f08a418eba1c464d054c5d634d580a25eac8a.zip | |
Add extra buttons to garden plots widget (#1266)
Diffstat (limited to 'src/main/java/de')
3 files changed, 106 insertions, 17 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java index a0ba8284..a96d327d 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java @@ -15,12 +15,10 @@ import de.hysky.skyblocker.skyblock.itemlist.recipebook.SkyblockRecipeBookWidget import de.hysky.skyblocker.utils.Location; import de.hysky.skyblocker.utils.Utils; import net.minecraft.client.gui.DrawContext; -import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.screen.ingame.InventoryScreen; import net.minecraft.client.gui.screen.ingame.StatusEffectsDisplay; import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; -import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.text.Text; @@ -33,8 +31,6 @@ public abstract class InventoryScreenMixin extends HandledScreen<PlayerScreenHan @Unique private GardenPlotsWidget gardenPlotsWidget; - @Unique - private ButtonWidget deskButton; public InventoryScreenMixin(PlayerScreenHandler handler, PlayerInventory inventory, Text title) { super(handler, inventory, title); @@ -64,23 +60,15 @@ public abstract class InventoryScreenMixin extends HandledScreen<PlayerScreenHan @Inject(method = "onRecipeBookToggled", at = @At("TAIL")) private void skyblocker$moveGardenPlotsWdiget(CallbackInfo ci) { - if (Utils.getLocation().equals(Location.GARDEN) && gardenPlotsWidget != null) { + if (gardenPlotsWidget != null) { gardenPlotsWidget.setPosition(x + backgroundWidth + 4, y); - if (deskButton != null) deskButton.setPosition(gardenPlotsWidget.getX() + 4, y + 108); } } @Inject(method = "init", at = @At("TAIL")) private void skyblocker$addGardenPlotsWidget(CallbackInfo ci) { if (Utils.getLocation().equals(Location.GARDEN) && SkyblockerConfigManager.get().farming.garden.gardenPlotsWidget) { - gardenPlotsWidget = new GardenPlotsWidget(x + backgroundWidth + 4, y); - deskButton = ButtonWidget.builder(Text.translatable("skyblocker.gardenPlots.openDesk"), button -> MessageScheduler.INSTANCE.sendMessageAfterCooldown("/desk", true)) - .dimensions(gardenPlotsWidget.getX() + 7, y + 108, 60, 15) - .build(); - // make desk button get selected before the widget but render after the widget - addSelectableChild(deskButton); - addDrawableChild(gardenPlotsWidget); - addDrawable(deskButton); + addDrawableChild(gardenPlotsWidget = new GardenPlotsWidget(x + backgroundWidth + 4, y)); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/GardenPlotsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/GardenPlotsWidget.java index 93fc0c49..70fe587a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/GardenPlotsWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/GardenPlotsWidget.java @@ -9,6 +9,7 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.events.SkyblockEvents; import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListManager; import de.hysky.skyblocker.utils.Utils; +import de.hysky.skyblocker.utils.render.gui.ItemButtonWidget; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import it.unimi.dsi.fastutil.ints.*; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; @@ -16,9 +17,10 @@ import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.Element; import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; -import net.minecraft.client.gui.widget.ClickableWidget; +import net.minecraft.client.gui.widget.ContainerWidget; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.component.DataComponentTypes; @@ -45,7 +47,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; -public class GardenPlotsWidget extends ClickableWidget { +public class GardenPlotsWidget extends ContainerWidget { private static final Logger LOGGER = LoggerFactory.getLogger("Garden Plots"); private static final Path FOLDER = SkyblockerMod.CONFIG_DIR.resolve("garden_plots"); @@ -173,8 +175,10 @@ public class GardenPlotsWidget extends ClickableWidget { private long updateFromTabTime = System.currentTimeMillis(); private final IntList infectedPlots = new IntArrayList(8); + private final ItemButtonWidget[] widgets; + public GardenPlotsWidget(int x, int y) { - super(x, y, 104, 127, Text.translatable("skyblocker.gardenPlots")); + super(x, y, 104, 132, Text.translatable("skyblocker.gardenPlots")); items = Arrays.stream(gardenPlots).map(gardenPlot -> { if (gardenPlot == null) return null; ItemStack itemStack = new ItemStack(gardenPlot.item()); @@ -184,6 +188,24 @@ public class GardenPlotsWidget extends ClickableWidget { items[12] = new ItemStack(Items.LODESTONE); items[12].set(DataComponentTypes.ITEM_NAME, Text.literal("The Barn")); updateInfestedFromTab(); + + // Inner widgets + ItemButtonWidget deskButton = new ItemButtonWidget( + getX() + 7, getBottom() - 24, + new ItemStack(Items.BOOK), Text.translatable("skyblocker.gardenPlots.openDesk"), + button -> MessageScheduler.INSTANCE.sendMessageAfterCooldown("/desk", true) + ); + ItemButtonWidget spawnButton = new ItemButtonWidget( + getRight() - 7 - 40 - 2, getBottom() - 24, + new ItemStack(Items.ENDER_EYE), Text.translatable("skyblocker.gardenPlots.spawn"), + button -> MessageScheduler.INSTANCE.sendMessageAfterCooldown("/warp garden", true) + ); + ItemButtonWidget setSpawnButton = new ItemButtonWidget( + getRight() - 7 - 20, getBottom() - 24, + new ItemStack(Math.random() < 0.001 ? Items.PINK_BED : Items.RED_BED), Text.translatable("skyblocker.gardenPlots.setSpawn"), + button -> MessageScheduler.INSTANCE.sendMessageAfterCooldown("/setspawn", true) + ); + widgets = new ItemButtonWidget[]{deskButton, spawnButton, setSpawnButton}; } @Override @@ -253,6 +275,11 @@ public class GardenPlotsWidget extends ClickableWidget { matrices.pop(); + for (ItemButtonWidget widget : widgets) { + widget.render(context, mouseX, mouseY, delta); + } + + if (timeMillis - updateFromTabTime > 3000) { updateFromTabTime = timeMillis; @@ -297,6 +324,41 @@ public class GardenPlotsWidget extends ClickableWidget { protected void appendClickableNarrations(NarrationMessageBuilder builder) { } + @Override + public List<? extends Element> children() { + return List.of(widgets); + } + + @Override + protected int getContentsHeightWithPadding() { + return getHeight(); + } + + @Override + protected double getDeltaYPerScroll() { + return 0; + } + + @Override + public void setX(int x) { + int prevX = getX(); + super.setX(x); + int diff = x - prevX; + for (ItemButtonWidget widget : widgets) { + widget.setX(widget.getX() + diff); + } + } + + @Override + public void setY(int y) { + int prevY = getY(); + super.setY(y); + int diff = y - prevY; + for (ItemButtonWidget widget : widgets) { + widget.setY(widget.getY() + diff); + } + } + private record GardenPlot(Item item, String name) { } } diff --git a/src/main/java/de/hysky/skyblocker/utils/render/gui/ItemButtonWidget.java b/src/main/java/de/hysky/skyblocker/utils/render/gui/ItemButtonWidget.java new file mode 100644 index 00000000..a4f6adff --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/render/gui/ItemButtonWidget.java @@ -0,0 +1,39 @@ +package de.hysky.skyblocker.utils.render.gui; + +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.tooltip.Tooltip; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; + +import java.time.Duration; + +public class ItemButtonWidget extends ButtonWidget { + + private final ItemStack item; + + public ItemButtonWidget(int x, int y, int width, int height, ItemStack item, Text message, PressAction onPress, NarrationSupplier narrationSupplier) { + super(x, y, width, height, message, onPress, narrationSupplier); + this.item = item.copy(); + setTooltip(Tooltip.of(message)); + setTooltipDelay(Duration.ofMillis(250)); + } + + public ItemButtonWidget(int x, int y, int width, int height, ItemStack item, Text message, PressAction onPress) { + this(x, y, width, height, item, message, onPress, DEFAULT_NARRATION_SUPPLIER); + } + + public ItemButtonWidget(int x, int y, ItemStack item, Text message, PressAction onPress) { + this(x, y, 20, 20, item, message, onPress, DEFAULT_NARRATION_SUPPLIER); + } + + @Override + public void drawMessage(DrawContext context, TextRenderer textRenderer, int color) {} + + @Override + protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { + super.renderWidget(context, mouseX, mouseY, delta); + context.drawItem(this.item, getX() + getWidth() / 2 - 8, getY() + getHeight() / 2 - 8); + } +} |
