From aea3d1e55fc969badd9806b00fdee976637d3077 Mon Sep 17 00:00:00 2001
From: viciscat <51047087+viciscat@users.noreply.github.com>
Date: Sat, 18 May 2024 21:24:11 +0200
Subject: equipment in inventory
---
.../skyblock/item/SkyblockInventoryScreen.java | 128 +++++++++++++++++++++
1 file changed, 128 insertions(+)
create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
(limited to 'src/main/java/de/hysky/skyblocker/skyblock/item')
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
new file mode 100644
index 00000000..8717dd15
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
@@ -0,0 +1,128 @@
+package de.hysky.skyblocker.skyblock.item;
+
+import com.mojang.serialization.Codec;
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.mixins.accessors.SlotAccessor;
+import de.hysky.skyblocker.utils.ItemUtils;
+import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
+import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.gui.screen.ingame.InventoryScreen;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.inventory.Inventory;
+import net.minecraft.inventory.SimpleInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NbtOps;
+import net.minecraft.nbt.StringNbtReader;
+import net.minecraft.nbt.visitor.StringNbtWriter;
+import net.minecraft.screen.slot.Slot;
+import net.minecraft.screen.slot.SlotActionType;
+import net.minecraft.util.Identifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Opened here {@code de.hysky.skyblocker.mixins.MinecraftClientMixin#skyblocker$skyblockInventoryScreen}
+ *
+ * Book button is moved here {@code de.hysky.skyblocker.mixins.InventoryScreenMixin#skyblocker$moveButton}
+ */
+public class SkyblockInventoryScreen extends InventoryScreen {
+ private static final Logger LOGGER = LoggerFactory.getLogger("Equipment");
+
+ public static final ItemStack[] equipment = new ItemStack[]{ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY};
+ private static final Codec CODEC = ItemUtils.EMPTY_ALLOWING_ITEMSTACK_CODEC.listOf(4,4)
+ .xmap(itemStacks -> itemStacks.toArray(ItemStack[]::new), List::of).fieldOf("items").codec();
+
+ private static final Identifier SLOT_TEXTURE = new Identifier("container/slot");
+ private static final Identifier EMPTY_SLOT = new Identifier(SkyblockerMod.NAMESPACE, "equipment/empty_icon");
+
+ public static void initEquipment() {
+ ClientLifecycleEvents.CLIENT_STARTED.register(client1 -> {
+ Path resolve = SkyblockerMod.CONFIG_DIR.resolve("equipment.nbt");
+ try (BufferedReader reader = Files.newBufferedReader(resolve)) {
+ ItemStack[] array = CODEC.parse(
+ NbtOps.INSTANCE, StringNbtReader.parse(reader.lines().collect(Collectors.joining())))
+ .getOrThrow();
+ System.arraycopy(array, 0, equipment, 0, Math.min(array.length, 4));
+ } catch (Exception e) {
+ LOGGER.error("[Skyblocker] Failed to load Equipment data", e);
+ }
+ });
+
+ ClientLifecycleEvents.CLIENT_STOPPING.register(client1 -> {
+ Path resolve = SkyblockerMod.CONFIG_DIR.resolve("equipment.nbt");
+ try (BufferedWriter writer = Files.newBufferedWriter(resolve)) {
+ writer.write(new StringNbtWriter().apply(CODEC.encodeStart(NbtOps.INSTANCE, equipment).getOrThrow()));
+ } catch (Exception e) {
+ LOGGER.error("[Skyblocker] Failed to save Equipment data", e);
+ }
+ });
+ }
+
+ public SkyblockInventoryScreen(PlayerEntity player) {
+ super(player);
+ SimpleInventory inventory = new SimpleInventory(equipment);
+
+ Slot slot = handler.slots.get(45);
+ ((SlotAccessor) slot).setX(slot.x + 21);
+ for (int i = 0; i < 4; i++) {
+ handler.slots.add(new EquipmentSlot(inventory, i, 77, 8 + i * 18));
+ }
+ }
+
+ @Override
+ protected void onMouseClick(Slot slot, int slotId, int button, SlotActionType actionType) {
+ if (slot instanceof EquipmentSlot && handler.getCursorStack().isEmpty()) {
+ MessageScheduler.INSTANCE.sendMessageAfterCooldown("/equipment");
+ }
+ super.onMouseClick(slot, slotId, button, actionType);
+ }
+
+ @Override
+ public void removed() {
+ super.removed();
+ // move it back, the handler is the same for the entire session
+ Slot slot = handler.slots.get(45);
+ ((SlotAccessor) slot).setX(slot.x - 21);
+ }
+
+ @Override
+ protected void drawBackground(DrawContext context, float delta, int mouseX, int mouseY) {
+ super.drawBackground(context, delta, mouseX, mouseY);
+ for (int i = 0; i < 4; i++) {
+ context.drawGuiTexture(SLOT_TEXTURE, x + 76 + (i == 3 ? 21 : 0), y + 7 + i * 18, 18, 18);
+ }
+ }
+
+ @Override
+ protected void drawSlot(DrawContext context, Slot slot) {
+ super.drawSlot(context, slot);
+ if (slot instanceof EquipmentSlot && !slot.hasStack()) {
+ context.drawGuiTexture(EMPTY_SLOT, slot.x, slot.y, 16, 16);
+ }
+ }
+
+ private static class EquipmentSlot extends Slot {
+
+ public EquipmentSlot(Inventory inventory, int index, int x, int y) {
+ super(inventory, index, x, y);
+ }
+
+ @Override
+ public boolean canTakeItems(PlayerEntity playerEntity) {
+ return false;
+ }
+
+ @Override
+ public boolean canInsert(ItemStack stack) {
+ return false;
+ }
+ }
+}
--
cgit
From 61770cd6bf681efee78d7ed976672e5e38f9e810 Mon Sep 17 00:00:00 2001
From: viciscat <51047087+viciscat@users.noreply.github.com>
Date: Sat, 25 May 2024 14:24:37 +0200
Subject: stop the slot invasion
---
.../de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
(limited to 'src/main/java/de/hysky/skyblocker/skyblock/item')
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
index 8717dd15..8f1abbb8 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
@@ -88,9 +88,10 @@ public class SkyblockInventoryScreen extends InventoryScreen {
@Override
public void removed() {
super.removed();
- // move it back, the handler is the same for the entire session
+ // put the handler back how it was, the handler is the same while the player is alive/in the same world
Slot slot = handler.slots.get(45);
((SlotAccessor) slot).setX(slot.x - 21);
+ handler.slots.removeIf(slot1 -> slot1 instanceof EquipmentSlot);
}
@Override
--
cgit
From 3f5e76b960cc6b2ef80f0c2924ff71d36047eaa8 Mon Sep 17 00:00:00 2001
From: viciscat <51047087+viciscat@users.noreply.github.com>
Date: Sun, 26 May 2024 17:49:38 +0200
Subject: yea
---
src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java | 6 ++++++
.../de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
(limited to 'src/main/java/de/hysky/skyblocker/skyblock/item')
diff --git a/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java
index 191ce921..2194e7a8 100644
--- a/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java
@@ -26,4 +26,10 @@ public abstract class InventoryScreenMixin {
if (!Utils.isOnSkyblock() || !SkyblockerConfigManager.get().uiAndVisuals.showEquipmentInInventory) return original.call(x, y, width, height, textures, pressAction);
return new TexturedButtonWidget(x + 21, y, width, height, textures, pressAction);
}
+
+ @WrapOperation(method = "method_19891", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/ButtonWidget;setPosition(II)V"))
+ private void skyblocker$moveButtonWhenPressed(ButtonWidget instance, int i, int j, Operation original) {
+ if (!Utils.isOnSkyblock() || !SkyblockerConfigManager.get().uiAndVisuals.showEquipmentInInventory) original.call(instance, i, j);
+ else instance.setPosition(i + 21, j);
+ }
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
index 8f1abbb8..2d20ef9f 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
@@ -31,7 +31,7 @@ import java.util.stream.Collectors;
/**
* Opened here {@code de.hysky.skyblocker.mixins.MinecraftClientMixin#skyblocker$skyblockInventoryScreen}
*
- * Book button is moved here {@code de.hysky.skyblocker.mixins.InventoryScreenMixin#skyblocker$moveButton}
+ * Book button is moved here {@code de.hysky.skyblocker.mixins.InventoryScreenMixin#skyblocker}
*/
public class SkyblockInventoryScreen extends InventoryScreen {
private static final Logger LOGGER = LoggerFactory.getLogger("Equipment");
--
cgit
From 55c658659c24db483b32be339afeb6f0b8ea72dd Mon Sep 17 00:00:00 2001
From: viciscat <51047087+viciscat@users.noreply.github.com>
Date: Sat, 22 Jun 2024 16:26:35 +0200
Subject: private constructor real
---
.../de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'src/main/java/de/hysky/skyblocker/skyblock/item')
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
index 2d20ef9f..462ac6d1 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
@@ -40,8 +40,8 @@ public class SkyblockInventoryScreen extends InventoryScreen {
private static final Codec CODEC = ItemUtils.EMPTY_ALLOWING_ITEMSTACK_CODEC.listOf(4,4)
.xmap(itemStacks -> itemStacks.toArray(ItemStack[]::new), List::of).fieldOf("items").codec();
- private static final Identifier SLOT_TEXTURE = new Identifier("container/slot");
- private static final Identifier EMPTY_SLOT = new Identifier(SkyblockerMod.NAMESPACE, "equipment/empty_icon");
+ private static final Identifier SLOT_TEXTURE = Identifier.ofVanilla("container/slot");
+ private static final Identifier EMPTY_SLOT = Identifier.of(SkyblockerMod.NAMESPACE, "equipment/empty_icon");
public static void initEquipment() {
ClientLifecycleEvents.CLIENT_STARTED.register(client1 -> {
--
cgit
From 19e0fb096e427da5921009e8315aa0ac093b70ae Mon Sep 17 00:00:00 2001
From: viciscat <51047087+viciscat@users.noreply.github.com>
Date: Thu, 27 Jun 2024 17:08:06 +0200
Subject: start replacing slots with normal rendering
---
.../skyblock/item/SkyblockInventoryScreen.java | 44 +++++++++++++++++++---
1 file changed, 38 insertions(+), 6 deletions(-)
(limited to 'src/main/java/de/hysky/skyblocker/skyblock/item')
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
index 462ac6d1..dcadd366 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
@@ -8,6 +8,7 @@ import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
+import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.Inventory;
import net.minecraft.inventory.SimpleInventory;
@@ -24,6 +25,7 @@ import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Collectors;
@@ -43,6 +45,8 @@ public class SkyblockInventoryScreen extends InventoryScreen {
private static final Identifier SLOT_TEXTURE = Identifier.ofVanilla("container/slot");
private static final Identifier EMPTY_SLOT = Identifier.of(SkyblockerMod.NAMESPACE, "equipment/empty_icon");
+ private final Slot[] equipmentSlots = new Slot[4];
+
public static void initEquipment() {
ClientLifecycleEvents.CLIENT_STARTED.register(client1 -> {
Path resolve = SkyblockerMod.CONFIG_DIR.resolve("equipment.nbt");
@@ -51,6 +55,7 @@ public class SkyblockInventoryScreen extends InventoryScreen {
NbtOps.INSTANCE, StringNbtReader.parse(reader.lines().collect(Collectors.joining())))
.getOrThrow();
System.arraycopy(array, 0, equipment, 0, Math.min(array.length, 4));
+ } catch (NoSuchFileException ignored) {
} catch (Exception e) {
LOGGER.error("[Skyblocker] Failed to load Equipment data", e);
}
@@ -73,16 +78,44 @@ public class SkyblockInventoryScreen extends InventoryScreen {
Slot slot = handler.slots.get(45);
((SlotAccessor) slot).setX(slot.x + 21);
for (int i = 0; i < 4; i++) {
- handler.slots.add(new EquipmentSlot(inventory, i, 77, 8 + i * 18));
+ equipmentSlots[i] = new EquipmentSlot(inventory, i, 77, 8 + i * 18);
+ }
+ }
+
+ @Override
+ public boolean mouseClicked(double mouseX, double mouseY, int button) {
+ for (Slot equipmentSlot : equipmentSlots) {
+ if (isPointWithinBounds(equipmentSlot.x, equipmentSlot.y, 16, 16, mouseX, mouseY)) {
+ MessageScheduler.INSTANCE.sendMessageAfterCooldown("/equipment");
+ return true;
+ }
}
+ return super.mouseClicked(mouseX, mouseY, button);
}
@Override
- protected void onMouseClick(Slot slot, int slotId, int button, SlotActionType actionType) {
- if (slot instanceof EquipmentSlot && handler.getCursorStack().isEmpty()) {
- MessageScheduler.INSTANCE.sendMessageAfterCooldown("/equipment");
+ public void render(DrawContext context, int mouseX, int mouseY, float delta) {
+ super.render(context, mouseX, mouseY, delta);
+ MatrixStack matrices = context.getMatrices();
+ matrices.push();
+ matrices.translate(this.x, this.y, 0.0F);
+ for (Slot equipmentSlot : equipmentSlots) {
+ drawSlot(context, equipmentSlot);
+ if (isPointWithinBounds(equipmentSlot.x, equipmentSlot.y, 16, 16, mouseX, mouseY)) drawSlotHighlight(context, equipmentSlot.x, equipmentSlot.y, 0);
+ }
+ matrices.pop();
+ }
+
+ @Override
+ protected void drawMouseoverTooltip(DrawContext context, int x, int y) {
+ super.drawMouseoverTooltip(context, x, y);
+ if (!handler.getCursorStack().isEmpty()) return;
+ for (Slot equipmentSlot : equipmentSlots) {
+ if (isPointWithinBounds(equipmentSlot.x, equipmentSlot.y, 16, 16, x, y)) {
+ ItemStack itemStack = equipmentSlot.getStack();
+ context.drawTooltip(this.textRenderer, this.getTooltipFromItem(itemStack), itemStack.getTooltipData(), x, y);
+ }
}
- super.onMouseClick(slot, slotId, button, actionType);
}
@Override
@@ -91,7 +124,6 @@ public class SkyblockInventoryScreen extends InventoryScreen {
// put the handler back how it was, the handler is the same while the player is alive/in the same world
Slot slot = handler.slots.get(45);
((SlotAccessor) slot).setX(slot.x - 21);
- handler.slots.removeIf(slot1 -> slot1 instanceof EquipmentSlot);
}
@Override
--
cgit
From ac61fe9c8166dc1fdc0dbd0f3bca3a8a0f5fb02a Mon Sep 17 00:00:00 2001
From: viciscat <51047087+viciscat@users.noreply.github.com>
Date: Thu, 4 Jul 2024 01:03:45 +0200
Subject: mhm
---
.../de/hysky/skyblocker/events/SkyblockEvents.java | 16 ++++++
.../skyblock/item/SkyblockInventoryScreen.java | 58 ++++++++++++++++++----
src/main/java/de/hysky/skyblocker/utils/Utils.java | 4 ++
3 files changed, 67 insertions(+), 11 deletions(-)
(limited to 'src/main/java/de/hysky/skyblocker/skyblock/item')
diff --git a/src/main/java/de/hysky/skyblocker/events/SkyblockEvents.java b/src/main/java/de/hysky/skyblocker/events/SkyblockEvents.java
index c268103d..93426143 100644
--- a/src/main/java/de/hysky/skyblocker/events/SkyblockEvents.java
+++ b/src/main/java/de/hysky/skyblocker/events/SkyblockEvents.java
@@ -26,6 +26,16 @@ public final class SkyblockEvents {
}
});
+ /**
+ * Called when the player's Skyblock profile changes.
+ * @implNote This is called upon receiving the chat message for the profile change rather than the exact moment of profile change, so it may be delayed by a few seconds.
+ */
+ public static final Event PROFILE_CHANGE = EventFactory.createArrayBacked(ProfileChange.class, callbacks -> (prev, profile) -> {
+ for (ProfileChange callback : callbacks) {
+ callback.onSkyblockProfileChange(prev, profile);
+ }
+ });
+
@Environment(EnvType.CLIENT)
@FunctionalInterface
public interface SkyblockJoin {
@@ -43,4 +53,10 @@ public final class SkyblockEvents {
public interface SkyblockLocationChange {
void onSkyblockLocationChange(Location location);
}
+
+ @Environment(EnvType.CLIENT)
+ @FunctionalInterface
+ public interface ProfileChange {
+ void onSkyblockProfileChange(String prevProfileId, String profileId);
+ }
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
index dcadd366..8c800783 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
@@ -2,10 +2,13 @@ package de.hysky.skyblocker.skyblock.item;
import com.mojang.serialization.Codec;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.events.SkyblockEvents;
import de.hysky.skyblocker.mixins.accessors.SlotAccessor;
import de.hysky.skyblocker.utils.ItemUtils;
+import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
+import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
import net.minecraft.client.util.math.MatrixStack;
@@ -24,10 +27,12 @@ import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.BufferedWriter;
+import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.util.List;
+import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
/**
@@ -44,29 +49,54 @@ public class SkyblockInventoryScreen extends InventoryScreen {
private static final Identifier SLOT_TEXTURE = Identifier.ofVanilla("container/slot");
private static final Identifier EMPTY_SLOT = Identifier.of(SkyblockerMod.NAMESPACE, "equipment/empty_icon");
+ private static final Path FOLDER = SkyblockerMod.CONFIG_DIR.resolve("equipment");
private final Slot[] equipmentSlots = new Slot[4];
- public static void initEquipment() {
- ClientLifecycleEvents.CLIENT_STARTED.register(client1 -> {
- Path resolve = SkyblockerMod.CONFIG_DIR.resolve("equipment.nbt");
+ private static void save(String profileId) {
+ try {
+ Files.createDirectories(FOLDER);
+ } catch (IOException e) {
+ LOGGER.error("[Skyblocker] Failed to create folder for equipment!", e);
+ }
+ Path resolve = FOLDER.resolve(profileId + ".nbt");
+
+ try (BufferedWriter writer = Files.newBufferedWriter(resolve)) {
+ writer.write(new StringNbtWriter().apply(CODEC.encodeStart(NbtOps.INSTANCE, equipment).getOrThrow()));
+ } catch (Exception e) {
+ LOGGER.error("[Skyblocker] Failed to save Equipment data", e);
+ }
+ }
+
+ private static void load(String profileId) {
+ Path resolve = FOLDER.resolve(profileId + ".nbt");
+ CompletableFuture.supplyAsync(() -> {
try (BufferedReader reader = Files.newBufferedReader(resolve)) {
- ItemStack[] array = CODEC.parse(
+ return CODEC.parse(
NbtOps.INSTANCE, StringNbtReader.parse(reader.lines().collect(Collectors.joining())))
.getOrThrow();
- System.arraycopy(array, 0, equipment, 0, Math.min(array.length, 4));
} catch (NoSuchFileException ignored) {
} catch (Exception e) {
LOGGER.error("[Skyblocker] Failed to load Equipment data", e);
+
}
- });
+ return null;
+ // Schedule on main thread to avoid any async weirdness
+ }).thenAccept(itemStacks -> MinecraftClient.getInstance().execute(() -> System.arraycopy(itemStacks, 0, equipment, 0, Math.min(itemStacks.length, 4))));
+
+ }
+
+ public static void initEquipment() {
+
+ SkyblockEvents.PROFILE_CHANGE.register(((prevProfileId, profileId) -> {
+ if (!prevProfileId.isEmpty()) save(prevProfileId);
+ load(profileId);
+ }));
ClientLifecycleEvents.CLIENT_STOPPING.register(client1 -> {
- Path resolve = SkyblockerMod.CONFIG_DIR.resolve("equipment.nbt");
- try (BufferedWriter writer = Files.newBufferedWriter(resolve)) {
- writer.write(new StringNbtWriter().apply(CODEC.encodeStart(NbtOps.INSTANCE, equipment).getOrThrow()));
- } catch (Exception e) {
- LOGGER.error("[Skyblocker] Failed to save Equipment data", e);
+ String profileId = Utils.getProfileId();
+ if (!profileId.isBlank()) {
+ save(profileId);
}
});
}
@@ -93,6 +123,8 @@ public class SkyblockInventoryScreen extends InventoryScreen {
return super.mouseClicked(mouseX, mouseY, button);
}
+ private boolean canDrawTooltips = false;
+
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
super.render(context, mouseX, mouseY, delta);
@@ -104,10 +136,14 @@ public class SkyblockInventoryScreen extends InventoryScreen {
if (isPointWithinBounds(equipmentSlot.x, equipmentSlot.y, 16, 16, mouseX, mouseY)) drawSlotHighlight(context, equipmentSlot.x, equipmentSlot.y, 0);
}
matrices.pop();
+ canDrawTooltips = true;
+ drawMouseoverTooltip(context, mouseX, mouseY);
+ canDrawTooltips = false;
}
@Override
protected void drawMouseoverTooltip(DrawContext context, int x, int y) {
+ if (!canDrawTooltips) return;
super.drawMouseoverTooltip(context, x, y);
if (!handler.getCursorStack().isEmpty()) return;
for (Slot equipmentSlot : equipmentSlots) {
diff --git a/src/main/java/de/hysky/skyblocker/utils/Utils.java b/src/main/java/de/hysky/skyblocker/utils/Utils.java
index 7ee5ec38..19b07879 100644
--- a/src/main/java/de/hysky/skyblocker/utils/Utils.java
+++ b/src/main/java/de/hysky/skyblocker/utils/Utils.java
@@ -460,7 +460,11 @@ public class Utils {
if (message.startsWith(PROFILE_MESSAGE_PREFIX)) {
profile = message.substring(PROFILE_MESSAGE_PREFIX.length()).split("§b")[0];
} else if (message.startsWith(PROFILE_ID_PREFIX)) {
+ String prevProfileId = profileId;
profileId = message.substring(PROFILE_ID_PREFIX.length());
+ if (!prevProfileId.equals(profileId)) {
+ SkyblockEvents.PROFILE_CHANGE.invoker().onSkyblockProfileChange(prevProfileId, profileId);
+ }
MuseumItemCache.tick(profileId);
}
--
cgit
From af52c9e954b319bbf5f804c9814e947248325a4d Mon Sep 17 00:00:00 2001
From: viciscat <51047087+viciscat@users.noreply.github.com>
Date: Thu, 4 Jul 2024 12:37:03 +0200
Subject: hasStack
---
.../de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
(limited to 'src/main/java/de/hysky/skyblocker/skyblock/item')
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
index 8c800783..6b3a9081 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
@@ -20,7 +20,6 @@ import net.minecraft.nbt.NbtOps;
import net.minecraft.nbt.StringNbtReader;
import net.minecraft.nbt.visitor.StringNbtWriter;
import net.minecraft.screen.slot.Slot;
-import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.util.Identifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -147,7 +146,7 @@ public class SkyblockInventoryScreen extends InventoryScreen {
super.drawMouseoverTooltip(context, x, y);
if (!handler.getCursorStack().isEmpty()) return;
for (Slot equipmentSlot : equipmentSlots) {
- if (isPointWithinBounds(equipmentSlot.x, equipmentSlot.y, 16, 16, x, y)) {
+ if (isPointWithinBounds(equipmentSlot.x, equipmentSlot.y, 16, 16, x, y) && equipmentSlot.hasStack()) {
ItemStack itemStack = equipmentSlot.getStack();
context.drawTooltip(this.textRenderer, this.getTooltipFromItem(itemStack), itemStack.getTooltipData(), x, y);
}
--
cgit
From e85358e00a72533f3f18b5dd60cdead857be23a9 Mon Sep 17 00:00:00 2001
From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>
Date: Fri, 5 Jul 2024 21:40:32 +0800
Subject: Fix equipment initialization and refactor tooltip rendering
---
.../skyblock/item/SkyblockInventoryScreen.java | 35 ++++++++--------------
1 file changed, 13 insertions(+), 22 deletions(-)
(limited to 'src/main/java/de/hysky/skyblocker/skyblock/item')
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
index 6b3a9081..665b090c 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
@@ -11,7 +11,6 @@ import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
-import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.Inventory;
import net.minecraft.inventory.SimpleInventory;
@@ -32,6 +31,7 @@ import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.util.List;
import java.util.concurrent.CompletableFuture;
+import java.util.function.Supplier;
import java.util.stream.Collectors;
/**
@@ -41,9 +41,9 @@ import java.util.stream.Collectors;
*/
public class SkyblockInventoryScreen extends InventoryScreen {
private static final Logger LOGGER = LoggerFactory.getLogger("Equipment");
-
- public static final ItemStack[] equipment = new ItemStack[]{ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY};
- private static final Codec CODEC = ItemUtils.EMPTY_ALLOWING_ITEMSTACK_CODEC.listOf(4,4)
+ private static final Supplier EMPTY_EQUIPMENT = () -> new ItemStack[]{ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY};
+ public static final ItemStack[] equipment = EMPTY_EQUIPMENT.get();
+ private static final Codec CODEC = ItemUtils.EMPTY_ALLOWING_ITEMSTACK_CODEC.listOf(4, 4)
.xmap(itemStacks -> itemStacks.toArray(ItemStack[]::new), List::of).fieldOf("items").codec();
private static final Identifier SLOT_TEXTURE = Identifier.ofVanilla("container/slot");
@@ -71,18 +71,14 @@ public class SkyblockInventoryScreen extends InventoryScreen {
Path resolve = FOLDER.resolve(profileId + ".nbt");
CompletableFuture.supplyAsync(() -> {
try (BufferedReader reader = Files.newBufferedReader(resolve)) {
- return CODEC.parse(
- NbtOps.INSTANCE, StringNbtReader.parse(reader.lines().collect(Collectors.joining())))
- .getOrThrow();
+ return CODEC.parse(NbtOps.INSTANCE, StringNbtReader.parse(reader.lines().collect(Collectors.joining()))).getOrThrow();
} catch (NoSuchFileException ignored) {
} catch (Exception e) {
LOGGER.error("[Skyblocker] Failed to load Equipment data", e);
-
}
- return null;
+ return EMPTY_EQUIPMENT.get();
// Schedule on main thread to avoid any async weirdness
}).thenAccept(itemStacks -> MinecraftClient.getInstance().execute(() -> System.arraycopy(itemStacks, 0, equipment, 0, Math.min(itemStacks.length, 4))));
-
}
public static void initEquipment() {
@@ -122,27 +118,22 @@ public class SkyblockInventoryScreen extends InventoryScreen {
return super.mouseClicked(mouseX, mouseY, button);
}
- private boolean canDrawTooltips = false;
-
+ /**
+ * Draws the equipment slots in the foreground layer after vanilla slots are drawn
+ * in {@link net.minecraft.client.gui.screen.ingame.HandledScreen#render(DrawContext, int, int, float) HandledScreen#render(DrawContext, int, int, float)}.
+ */
@Override
- public void render(DrawContext context, int mouseX, int mouseY, float delta) {
- super.render(context, mouseX, mouseY, delta);
- MatrixStack matrices = context.getMatrices();
- matrices.push();
- matrices.translate(this.x, this.y, 0.0F);
+ protected void drawForeground(DrawContext context, int mouseX, int mouseY) {
for (Slot equipmentSlot : equipmentSlots) {
drawSlot(context, equipmentSlot);
if (isPointWithinBounds(equipmentSlot.x, equipmentSlot.y, 16, 16, mouseX, mouseY)) drawSlotHighlight(context, equipmentSlot.x, equipmentSlot.y, 0);
}
- matrices.pop();
- canDrawTooltips = true;
- drawMouseoverTooltip(context, mouseX, mouseY);
- canDrawTooltips = false;
+
+ super.drawForeground(context, mouseX, mouseY);
}
@Override
protected void drawMouseoverTooltip(DrawContext context, int x, int y) {
- if (!canDrawTooltips) return;
super.drawMouseoverTooltip(context, x, y);
if (!handler.getCursorStack().isEmpty()) return;
for (Slot equipmentSlot : equipmentSlots) {
--
cgit
From dad74c6c9d169ed6fb550ac2998e3799fdf0076c Mon Sep 17 00:00:00 2001
From: viciscat <51047087+viciscat@users.noreply.github.com>
Date: Fri, 5 Jul 2024 23:45:05 +0200
Subject: rift and more async idk
---
.../mixins/GenericContainerScreenHandlerMixin.java | 6 +++++-
.../skyblock/item/SkyblockInventoryScreen.java | 21 ++++++++++++++-------
2 files changed, 19 insertions(+), 8 deletions(-)
(limited to 'src/main/java/de/hysky/skyblocker/skyblock/item')
diff --git a/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java
index bd066fc9..3c3dbd52 100644
--- a/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java
@@ -3,6 +3,7 @@ package de.hysky.skyblocker.mixins;
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
import de.hysky.skyblocker.skyblock.item.SkyblockInventoryScreen;
+import de.hysky.skyblocker.utils.Utils;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
@@ -33,7 +34,10 @@ public abstract class GenericContainerScreenHandlerMixin extends ScreenHandler {
int line = slot/9;
if (line > 0 && line < 5 && slot % 9 == 1) {
boolean empty = stack.getName().getString().trim().toLowerCase().startsWith("empty");
- SkyblockInventoryScreen.equipment[line - 1] = empty ? ItemStack.EMPTY : stack;
+ if (Utils.isInTheRift())
+ SkyblockInventoryScreen.equipment_rift[line - 1] = empty ? ItemStack.EMPTY : stack;
+ else
+ SkyblockInventoryScreen.equipment[line - 1] = empty ? ItemStack.EMPTY : stack;
}
}
case null, default -> {}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
index 665b090c..42a52a85 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java
@@ -20,6 +20,7 @@ import net.minecraft.nbt.StringNbtReader;
import net.minecraft.nbt.visitor.StringNbtWriter;
import net.minecraft.screen.slot.Slot;
import net.minecraft.util.Identifier;
+import org.apache.commons.lang3.ArrayUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -43,7 +44,8 @@ public class SkyblockInventoryScreen extends InventoryScreen {
private static final Logger LOGGER = LoggerFactory.getLogger("Equipment");
private static final Supplier EMPTY_EQUIPMENT = () -> new ItemStack[]{ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY};
public static final ItemStack[] equipment = EMPTY_EQUIPMENT.get();
- private static final Codec CODEC = ItemUtils.EMPTY_ALLOWING_ITEMSTACK_CODEC.listOf(4, 4)
+ public static final ItemStack[] equipment_rift = EMPTY_EQUIPMENT.get();
+ private static final Codec CODEC = ItemUtils.EMPTY_ALLOWING_ITEMSTACK_CODEC.listOf(4, 8) // min size at 4 for backwards compat
.xmap(itemStacks -> itemStacks.toArray(ItemStack[]::new), List::of).fieldOf("items").codec();
private static final Identifier SLOT_TEXTURE = Identifier.ofVanilla("container/slot");
@@ -61,7 +63,8 @@ public class SkyblockInventoryScreen extends InventoryScreen {
Path resolve = FOLDER.resolve(profileId + ".nbt");
try (BufferedWriter writer = Files.newBufferedWriter(resolve)) {
- writer.write(new StringNbtWriter().apply(CODEC.encodeStart(NbtOps.INSTANCE, equipment).getOrThrow()));
+
+ writer.write(new StringNbtWriter().apply(CODEC.encodeStart(NbtOps.INSTANCE, ArrayUtils.addAll(equipment, equipment_rift)).getOrThrow()));
} catch (Exception e) {
LOGGER.error("[Skyblocker] Failed to save Equipment data", e);
}
@@ -78,27 +81,31 @@ public class SkyblockInventoryScreen extends InventoryScreen {
}
return EMPTY_EQUIPMENT.get();
// Schedule on main thread to avoid any async weirdness
- }).thenAccept(itemStacks -> MinecraftClient.getInstance().execute(() -> System.arraycopy(itemStacks, 0, equipment, 0, Math.min(itemStacks.length, 4))));
+ }).thenAccept(itemStacks -> MinecraftClient.getInstance().execute(() -> {
+ System.arraycopy(itemStacks, 0, equipment, 0, Math.min(itemStacks.length, 4));
+ if (itemStacks.length <= 4) return;
+ System.arraycopy(itemStacks, 4, equipment_rift, 0, Math.clamp(itemStacks.length - 4, 0, 4));
+ }));
}
public static void initEquipment() {
SkyblockEvents.PROFILE_CHANGE.register(((prevProfileId, profileId) -> {
- if (!prevProfileId.isEmpty()) save(prevProfileId);
- load(profileId);
+ if (!prevProfileId.isEmpty()) CompletableFuture.runAsync(() -> save(prevProfileId)).thenRun(() -> load(profileId));
+ else load(profileId);
}));
ClientLifecycleEvents.CLIENT_STOPPING.register(client1 -> {
String profileId = Utils.getProfileId();
if (!profileId.isBlank()) {
- save(profileId);
+ CompletableFuture.runAsync(() -> save(profileId));
}
});
}
public SkyblockInventoryScreen(PlayerEntity player) {
super(player);
- SimpleInventory inventory = new SimpleInventory(equipment);
+ SimpleInventory inventory = new SimpleInventory(Utils.isInTheRift() ? equipment_rift: equipment);
Slot slot = handler.slots.get(45);
((SlotAccessor) slot).setX(slot.x + 21);
--
cgit