aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorviciscat <51047087+viciscat@users.noreply.github.com>2024-04-27 20:14:54 +0200
committerviciscat <51047087+viciscat@users.noreply.github.com>2024-04-27 22:18:18 +0200
commit69476a65e6831c0d857877e7d95519c1334239ec (patch)
treec479bec2695e5d9ca364fae01093df595c00bce1
parent2ec071136965e45db2447be781b6805b134d5d49 (diff)
downloadSkyblocker-69476a65e6831c0d857877e7d95519c1334239ec.tar.gz
Skyblocker-69476a65e6831c0d857877e7d95519c1334239ec.tar.bz2
Skyblocker-69476a65e6831c0d857877e7d95519c1334239ec.zip
possible royal resident fix
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java40
2 files changed, 28 insertions, 14 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java
index cbc29974..49632919 100644
--- a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java
@@ -203,7 +203,7 @@ public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen
return;
}
if (this.handler instanceof GenericContainerScreenHandler genericContainerScreenHandler && genericContainerScreenHandler.getRows() == 6) {
- VisitorHelper.onSlotClick(slot, slotId, title);
+ VisitorHelper.onSlotClick(genericContainerScreenHandler.getSlot(13), slotId, title);
// Prevent selling to NPC shops
ItemStack sellStack = this.handler.slots.get(49).getStack();
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java
index 2805cb0e..770c7b02 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.garden;
+import com.mojang.authlib.properties.Property;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
import de.hysky.skyblocker.utils.ItemUtils;
@@ -7,14 +8,17 @@ import de.hysky.skyblocker.utils.NEURepoManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
import io.github.moulberry.repo.data.NEUItem;
+import it.unimi.dsi.fastutil.Pair;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
+import it.unimi.dsi.fastutil.objects.ObjectObjectImmutablePair;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.slot.Slot;
import net.minecraft.text.Text;
@@ -33,7 +37,8 @@ import java.util.Map;
public class VisitorHelper {
private static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Visitor Helper");
- private static final Map<String, Object2IntMap<String>> itemMap = new HashMap<>();
+ // The pair contains the name of the visitor and the texture if the icon is a player head
+ private static final Map<Pair<String, String>, Object2IntMap<String>> itemMap = new HashMap<>();
private static final Map<String, ItemStack> itemCache = new HashMap<>();
private static final int TEXT_START_X = 4;
private static final int TEXT_START_Y = 4;
@@ -57,7 +62,7 @@ public class VisitorHelper {
public static void onMouseClicked(double mouseX, double mouseY, int mouseButton, TextRenderer textRenderer) {
int yPosition = TEXT_START_Y;
- for (Map.Entry<String, Object2IntMap<String>> visitorEntry : itemMap.entrySet()) {
+ for (Map.Entry<Pair<String, String>, Object2IntMap<String>> visitorEntry : itemMap.entrySet()) {
int textWidth;
int textHeight = textRenderer.fontHeight;
@@ -76,9 +81,9 @@ public class VisitorHelper {
}
}
- public static void onSlotClick(Slot slot, int slotId, String title) {
+ public static void onSlotClick(Slot visitorSlot, int slotId, String title) {
if (slotId == 29 || slotId == 13 || slotId == 33) {
- itemMap.remove(title);
+ itemMap.remove(new ObjectObjectImmutablePair<>(title, getTextureOrNull(visitorSlot.getStack())));
}
}
@@ -87,10 +92,18 @@ public class VisitorHelper {
if (visitorItem == null || !visitorItem.contains(DataComponentTypes.LORE) || ItemUtils.getLoreLineIf(visitorItem, t -> t.contains("Times Visited")) == null) return;
ItemStack acceptButton = handler.getSlot(29).getStack();
if (acceptButton == null) return;
- processLore(visitorName, ItemUtils.getLore(acceptButton));
+ processLore(visitorName, getTextureOrNull(visitorItem), ItemUtils.getLore(acceptButton));
}
- private static void processLore(String visitorName, List<Text> loreList) {
+ private static @Nullable String getTextureOrNull(ItemStack stack) {
+ if (!stack.isOf(Items.PLAYER_HEAD) || stack.get(DataComponentTypes.PROFILE) == null) return null;
+ return stack.get(DataComponentTypes.PROFILE).properties().get("textures").stream()
+ .map(Property::value)
+ .findFirst()
+ .orElse(null);
+ }
+
+ private static void processLore(String visitorName, @Nullable String visitorTexture, List<Text> loreList) {
boolean saveRequiredItems = false;
for (int i = 0; i < loreList.size(); i++) {
String lore = loreList.get(i).getString();
@@ -99,19 +112,20 @@ public class VisitorHelper {
else if (lore.contains("Rewards"))
break;
else if (saveRequiredItems)
- updateItemMap(visitorName, loreList.get(i));
+ updateItemMap(visitorName, visitorTexture, loreList.get(i));
}
}
- private static void updateItemMap(String visitorName, Text lore) {
+ private static void updateItemMap(String visitorName, @Nullable String visitorTexture, Text lore) {
String[] splitItemText = lore.getString().split(" x");
String itemName = splitItemText[0].trim();
if (itemName.isEmpty()) return;
try {
int amount = splitItemText.length == 2 ? NumberFormat.getInstance(Locale.US).parse(splitItemText[1].trim()).intValue() : 1;
- Object2IntMap<String> visitorMap = itemMap.getOrDefault(visitorName, new Object2IntOpenHashMap<>());
+ ObjectObjectImmutablePair<String, String> key = new ObjectObjectImmutablePair<>(visitorName, visitorTexture);
+ Object2IntMap<String> visitorMap = itemMap.getOrDefault(key, new Object2IntOpenHashMap<>());
visitorMap.putIfAbsent(itemName, amount);
- itemMap.putIfAbsent(visitorName, visitorMap);
+ itemMap.putIfAbsent(key, visitorMap);
} catch (Exception e) {
LOGGER.error("[Skyblocker Visitor Helper] Failed to parse item: " + lore.getString(), e);
}
@@ -121,9 +135,9 @@ public class VisitorHelper {
context.getMatrices().push();
context.getMatrices().translate(0, 0, 200);
int index = 0;
- for (Map.Entry<String, Object2IntMap<String>> visitorEntry : itemMap.entrySet()) {
- String visitorName = visitorEntry.getKey();
- drawTextWithOptionalUnderline(context, textRenderer, Text.literal(visitorName), TEXT_START_X, TEXT_START_Y + index * (LINE_SPACING + textRenderer.fontHeight), mouseX, mouseY);
+ for (Map.Entry<Pair<String, String>, Object2IntMap<String>> visitorEntry : itemMap.entrySet()) {
+ Pair<String, String> visitorName = visitorEntry.getKey();
+ drawTextWithOptionalUnderline(context, textRenderer, Text.literal(visitorName.left()), TEXT_START_X, TEXT_START_Y + index * (LINE_SPACING + textRenderer.fontHeight), mouseX, mouseY);
index++;
for (Object2IntMap.Entry<String> itemEntry : visitorEntry.getValue().object2IntEntrySet()) {