aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de
diff options
context:
space:
mode:
authorvicisacat <victor.branchu@gmail.com>2024-03-22 22:02:46 +0100
committervicisacat <victor.branchu@gmail.com>2024-04-12 17:18:23 +0200
commit5b258a6cd798678b2cb98be029443c5048496a86 (patch)
tree1c3809d2626ca50d0bea4f55679a67c37ca0cc83 /src/main/java/de
parentaf46b0c6b8d38d876e59e523d4af4c939053a988 (diff)
downloadSkyblocker-5b258a6cd798678b2cb98be029443c5048496a86.tar.gz
Skyblocker-5b258a6cd798678b2cb98be029443c5048496a86.tar.bz2
Skyblocker-5b258a6cd798678b2cb98be029443c5048496a86.zip
rebasing1
Diffstat (limited to 'src/main/java/de')
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java10
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/accessor/SlotAccessor.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java155
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java31
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/RarityWidget.java94
5 files changed, 284 insertions, 9 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java
index 975c9c51..cd2baa4b 100644
--- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java
@@ -2,6 +2,8 @@ package de.hysky.skyblocker.mixin;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.auction.AuctionBrowserScreen;
+import de.hysky.skyblocker.skyblock.auction.AuctionHouseScreenHandler;
import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreenHandler;
import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreen;
@@ -26,6 +28,8 @@ public interface HandledScreenProviderMixin<T extends ScreenHandler> {
if (player == null) return;
if (!Utils.isOnSkyblock()) return;
T screenHandler = type.create(id, player.getInventory());
+ if (!(screenHandler instanceof GenericContainerScreenHandler containerScreenHandler)) return;
+ if (PartyFinderScreen.possibleInventoryNames.contains(name.getString().toLowerCase())) {
if (SkyblockerConfigManager.get().general.betterPartyFinder && screenHandler instanceof GenericContainerScreenHandler containerScreenHandler && PartyFinderScreen.possibleInventoryNames.contains(name.getString().toLowerCase())) {
if (client.currentScreen != null) {
String lowerCase = client.currentScreen.getTitle().getString().toLowerCase();
@@ -45,6 +49,12 @@ public interface HandledScreenProviderMixin<T extends ScreenHandler> {
}
ci.cancel();
+ } else if (name.getString().toLowerCase().contains("auctions browser")) {
+ System.out.println("another one");
+ AuctionHouseScreenHandler auctionHouseScreenHandler = AuctionHouseScreenHandler.of(containerScreenHandler, false);
+ client.player.currentScreenHandler = auctionHouseScreenHandler;
+ client.setScreen(new AuctionBrowserScreen(auctionHouseScreenHandler, client.player.getInventory()));
+ ci.cancel();
} else if (SkyblockerConfigManager.get().general.fancyCraftingTable && screenHandler instanceof GenericContainerScreenHandler containerScreenHandler && name.getString().toLowerCase().contains("craft item")) {
SkyblockCraftingTableScreenHandler skyblockCraftingTableScreenHandler = new SkyblockCraftingTableScreenHandler(containerScreenHandler, player.getInventory());
client.player.currentScreenHandler = skyblockCraftingTableScreenHandler;
diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/SlotAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/SlotAccessor.java
index 2a0a418f..b8c5618f 100644
--- a/src/main/java/de/hysky/skyblocker/mixin/accessor/SlotAccessor.java
+++ b/src/main/java/de/hysky/skyblocker/mixin/accessor/SlotAccessor.java
@@ -2,13 +2,16 @@ package de.hysky.skyblocker.mixin.accessor;
import net.minecraft.screen.slot.Slot;
import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(Slot.class)
public interface SlotAccessor {
+ @Mutable
@Accessor("x")
void setX(int x);
+ @Mutable
@Accessor("y")
void setY(int y);
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java
index 48b528ee..a06b9649 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java
@@ -1,20 +1,169 @@
package de.hysky.skyblocker.skyblock.auction;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.skyblock.auction.widgets.AuctionTypeWidget;
+import de.hysky.skyblocker.skyblock.auction.widgets.CategoryTabWidget;
+import de.hysky.skyblocker.skyblock.auction.widgets.RarityWidget;
+import de.hysky.skyblocker.skyblock.auction.widgets.SortWidget;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
+import net.minecraft.client.gui.tooltip.Tooltip;
+import net.minecraft.client.gui.widget.ButtonWidget;
+import net.minecraft.client.item.TooltipContext;
+import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.player.PlayerInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraft.screen.ScreenHandler;
+import net.minecraft.screen.ScreenHandlerListener;
+import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
+import net.minecraft.util.math.MathHelper;
-public class AuctionBrowserScreen extends HandledScreen<AuctionHouseScreenHandler> {
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Supplier;
+
+public class AuctionBrowserScreen extends HandledScreen<AuctionHouseScreenHandler> implements ScreenHandlerListener {
protected static final Identifier TEXTURE = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/auctions_gui/browser/background.png");
- public AuctionBrowserScreen(AuctionHouseScreenHandler handler, PlayerInventory inventory, Text title) {
- super(handler, inventory, title);
+
+ // WIDGETS
+ private SortWidget sortWidget;
+ private AuctionTypeWidget auctionTypeWidget;
+ private RarityWidget rarityWidget;
+ private ButtonWidget resetFiltersButton;
+ private final List<CategoryTabWidget> categoryTabWidgets = new ArrayList<>(6);
+
+ public static int RESET_SLOT_ID = 45;
+
+
+ boolean isWaitingForServer = false;
+
+ public AuctionBrowserScreen(AuctionHouseScreenHandler handler, PlayerInventory inventory) {
+ super(handler, inventory, Text.literal("Auctions Browser"));
+ this.backgroundHeight = 187;
+ this.playerInventoryTitleY = 92;
+ this.titleX = 999;
+ handler.addListener(this);
+ }
+
+ @Override
+ protected void init() {
+ super.init();
+ x = (this.width - 176) / 2;
+ y = (this.height - 187) / 2;
+ sortWidget = new SortWidget(x + 25, y + 81, this::clickSlot);
+ sortWidget.setSlotId(50);
+ addDrawableChild(sortWidget);
+ auctionTypeWidget = new AuctionTypeWidget(x + 134, y + 77, this::clickSlot);
+ auctionTypeWidget.setSlotId(52);
+ addDrawableChild(auctionTypeWidget);
+ rarityWidget = new RarityWidget(x + 73, y + 80, this::clickSlot);
+ rarityWidget.setSlotId(51);
+ addDrawableChild(rarityWidget);
+ resetFiltersButton = new ScaledTextButtonWidget(x + 10, y + 77, 12, 12, Text.literal("↻"), this::onResetPressed);
+ addDrawableChild(resetFiltersButton);
+ resetFiltersButton.setTooltip(Tooltip.of(Text.literal("Reset Filters")));
+ resetFiltersButton.setTooltipDelay(500);
+ if (categoryTabWidgets.isEmpty())
+ for (int i = 0; i < 6; i++) {
+ CategoryTabWidget categoryTabWidget = new CategoryTabWidget(new ItemStack(Items.SPONGE), this::clickSlot);
+ categoryTabWidgets.add(categoryTabWidget);
+ addSelectableChild(categoryTabWidget); // This method only makes it clickable, does not add it to the drawables list
+ // manually rendered in the render method to have it not render behind the durability bars
+ categoryTabWidget.setPosition(x - 30, y + 3 + i * 28);
+ }
+ else
+ for (int i = 0; i < categoryTabWidgets.size(); i++) {
+ CategoryTabWidget categoryTabWidget = categoryTabWidgets.get(i);
+ categoryTabWidget.setPosition(x - 30, y + 3 + i * 28);
+
+ }
+ }
+
+ protected void clickSlot(int slotID, int button) {
+ if (isWaitingForServer) return;
+ if (client == null) return;
+ assert this.client.interactionManager != null;
+ this.client.interactionManager.clickSlot(handler.syncId, slotID, button, SlotActionType.PICKUP, client.player);
+ }
+
+ private void onResetPressed(ButtonWidget buttonWidget) {
+ buttonWidget.setFocused(false); // Annoying.
+ if (RESET_SLOT_ID == -1) return;
+ this.clickSlot(RESET_SLOT_ID, 0);
}
@Override
protected void drawBackground(DrawContext context, float delta, int mouseX, int mouseY) {
context.drawTexture(TEXTURE, this.x, this.y, 0, 0, this.backgroundWidth, this.backgroundHeight);
}
+
+ @Override
+ public void render(DrawContext context, int mouseX, int mouseY, float delta) {
+ super.render(context, mouseX, mouseY, delta);
+ this.drawMouseoverTooltip(context, mouseX, mouseY);
+ }
+
+ private static int getOrdinal(List<Text> tooltip) {
+ int ordinal = 0;
+ for (int j = 0; j < tooltip.size()-3; j++) {
+ if (j+2 >= tooltip.size()) break;
+ if (tooltip.get(j+2).getString().contains("▶")) {
+ ordinal = j;
+ break;
+ }
+ }
+ return ordinal;
+ }
+
+ @Override
+ public void onSlotUpdate(ScreenHandler handler, int slotId, ItemStack stack) {
+ if (client == null || stack.isEmpty()) return;
+ if (slotId == 50) {
+ sortWidget.setCurrent(SortWidget.Option.get(getOrdinal(stack.getTooltip(client.player, TooltipContext.BASIC))));
+ } else if (slotId == 52) {
+ auctionTypeWidget.setCurrent(AuctionTypeWidget.Option.get(getOrdinal(stack.getTooltip(client.player, TooltipContext.BASIC))));
+ } else if (slotId == 51) {
+ List<Text> tooltip = stack.getTooltip(client.player, TooltipContext.BASIC);
+ int ordinal = getOrdinal(tooltip);
+ String split = tooltip.get(ordinal+2).getString().substring(2);
+ rarityWidget.setText(tooltip.subList(1, tooltip.size()-3), split);
+ } else if (slotId == 45) {
+ if (resetFiltersButton != null) resetFiltersButton.active = handler.getSlot(slotId).getStack().isOf(Items.ANVIL);
+ }
+ }
+
+ @Override
+ public void removed() {
+ super.removed();
+ handler.removeListener(this);
+ }
+
+ @Override
+ public void onPropertyUpdate(ScreenHandler handler, int property, int value) {}
+
+ private static class ScaledTextButtonWidget extends ButtonWidget {
+
+ protected ScaledTextButtonWidget(int x, int y, int width, int height, Text message, PressAction onPress) {
+ super(x, y, width, height, message, onPress, Supplier::get);
+ }
+
+ // Code taken mostly from YACL by isxander. Love you <3
+ @Override
+ public void drawMessage(DrawContext graphics, TextRenderer textRenderer, int color) {
+ TextRenderer font = MinecraftClient.getInstance().textRenderer;
+ MatrixStack pose = graphics.getMatrices();
+ float textScale = 2.f;
+
+ pose.push();
+ pose.translate(((this.getX() + this.width / 2f) - font.getWidth(getMessage()) * textScale / 2) + 1, (float)this.getY() + (this.height - font.fontHeight * textScale) / 2f - 1, 0);
+ pose.scale(textScale, textScale, 1);
+ graphics.drawText(font, getMessage(), 0, 0, color | MathHelper.ceil(this.alpha * 255.0F) << 24, true);
+ pose.pop();
+ }
+ }
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java
index 58adfc6c..7df3cef5 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java
@@ -1,8 +1,10 @@
package de.hysky.skyblocker.skyblock.auction;
import de.hysky.skyblocker.mixin.accessor.SlotAccessor;
+import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.Inventory;
+import net.minecraft.item.ItemStack;
import net.minecraft.screen.GenericContainerScreenHandler;
import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.screen.slot.Slot;
@@ -14,19 +16,21 @@ public class AuctionHouseScreenHandler extends GenericContainerScreenHandler {
int yOffset = (rows - 4) * 18;
// Shift player inventory by 2 pixels and also remove the yOffset
for (int i = rows*9; i < slots.size(); i++) {
- SlotAccessor slotAccessor = (SlotAccessor) slots.get(i);
- slotAccessor.setY(2-yOffset);
+ Slot slot = slots.get(i);
+ SlotAccessor slotAccessor = (SlotAccessor) slot;
+ slotAccessor.setY(slot.y+2-yOffset);
}
if (isView) return;
// disable ALL THE OTHER SLOTS MWAHAHAHA and also move the good ones around and stuff
- for (int i = 9; i < (rows-1)*9; i++) {
+ for (int i = 0; i < rows*9; i++) {
int lineI = i % 9;
Slot slot = slots.get(i);
- if (lineI > 1 && lineI < 8) {
+ if (i>9 && i<(rows-1)*9 && lineI > 1 && lineI < 8) {
+ int miniInventorySlot = lineI - 2 + (i/9 - 1)*6;
SlotAccessor slotAccessor = (SlotAccessor) slot;
- slotAccessor.setX(8+ lineI * 18);
- slotAccessor.setY(18 + (i/9 -1) * 18);
+ slotAccessor.setX(8 + miniInventorySlot%8 * 18);
+ slotAccessor.setY(18 + miniInventorySlot/8 * 18);
} else {
slots.set(i, new Slot(slot.inventory, slot.getIndex(), slot.x, slot.y){
@Override
@@ -37,4 +41,19 @@ public class AuctionHouseScreenHandler extends GenericContainerScreenHandler {
}
}
}
+
+ public static AuctionHouseScreenHandler of(GenericContainerScreenHandler original, boolean isView) {
+ return new AuctionHouseScreenHandler(original.getType(),
+ original.syncId,
+ MinecraftClient.getInstance().player.getInventory(),
+ original.getInventory(),
+ original.getRows(),
+ isView);
+ }
+
+ @Override
+ public void setStackInSlot(int slot, int revision, ItemStack stack) {
+ super.setStackInSlot(slot, revision, stack);
+ onContentChanged(slots.get(slot).inventory);
+ }
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/RarityWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/RarityWidget.java
new file mode 100644
index 00000000..1affdc0c
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/RarityWidget.java
@@ -0,0 +1,94 @@
+package de.hysky.skyblocker.skyblock.auction.widgets;
+
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.skyblock.auction.SlotClickHandler;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.font.TextRenderer;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
+import net.minecraft.client.gui.widget.ClickableWidget;
+import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.text.Text;
+import net.minecraft.util.Identifier;
+
+import java.util.List;
+
+public class RarityWidget extends ClickableWidget {
+
+ private static final Identifier HOVER_TEXTURE = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/auctions_gui/rarity_widget/hover.png");
+ private static final Identifier TEXTURE = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/auctions_gui/rarity_widget/background.png");
+ private final SlotClickHandler onClick;
+ private int slotId = -1;
+
+ public RarityWidget(int x, int y, SlotClickHandler onClick) {
+ super(x, y, 48, 11, Text.literal("rarity selector thing, hi mom"));
+ this.onClick = onClick;
+ }
+
+ @Override
+ protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) {
+ MatrixStack matrices = context.getMatrices();
+ matrices.push();
+ matrices.translate(getX(), getY(), 0);
+ //context.drawText(parent.getTextRender(), String.valueOf(slotId), 0, -9, Colors.RED, true);
+ boolean onLeftArrow = isOnLeftArrow(mouseX);
+ boolean onRightArrow = isOnRightArrow(mouseX);
+ context.drawTexture(TEXTURE, 0, 0, 0, 0, 48, 11, 48, 11);
+ if (onLeftArrow) context.drawTexture(HOVER_TEXTURE, 0, 0, 0, 0, 6, 11, 6, 11);
+ if (onRightArrow) context.drawTexture(HOVER_TEXTURE, 42, 0, 0, 0, 6, 11, 6, 11);
+
+ // Text
+ TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
+ int textWidth = textRenderer.getWidth(current);
+ int color = 0xFFEAEAEA;
+ if (textWidth > 34) {
+ matrices.push();
+ //matrices.translate(-7-getX(), -5.5f-getY(), 0);
+ matrices.translate(7, 5.5f, 0);
+ matrices.scale(34.f/textWidth, 34.f/textWidth, 1.f);
+ context.drawText(textRenderer, current, 0, -textRenderer.fontHeight/2, color, false);
+ matrices.pop();
+ } else {
+ context.drawText(textRenderer, current, 7, 2, color, false);
+ }
+
+ matrices.pop();
+ if (!onLeftArrow && !onRightArrow && isHovered()) context.drawTooltip(textRenderer, tooltip, mouseX, mouseY);
+
+ }
+
+ private boolean isOnRightArrow(int mouseX) {
+ return isHovered() && mouseX - getX() > 40;
+ }
+
+ private boolean isOnLeftArrow(int mouseX) {
+ return isHovered() && mouseX - getX() < 7;
+ }
+
+ @Override
+ protected void appendClickableNarrations(NarrationMessageBuilder builder) {
+
+ }
+
+ public void setSlotId(int slotId) {
+ this.slotId = slotId;
+ }
+
+ private List<Text> tooltip = List.of();
+ private String current = "?";
+
+ public void setText(List<Text> tooltip, String current) {
+ this.tooltip = tooltip;
+ this.current = current;
+ }
+
+ @Override
+ public void onClick(double mouseX, double mouseY) {
+ if (slotId == -1) return;
+ if (isOnLeftArrow((int) mouseX)) {
+ onClick.click(slotId, 1);
+ } else if (isOnRightArrow((int) mouseX)) {
+ onClick.click(slotId, 0);
+ }
+ }
+}