aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/skyblock
diff options
context:
space:
mode:
authorAaron <51387595+AzureAaron@users.noreply.github.com>2024-05-04 19:14:06 -0400
committerGitHub <noreply@github.com>2024-05-04 19:14:06 -0400
commit4a4234d7c9d4f038d4fa418fb15ef24ce3fcc501 (patch)
tree6e87c6b67aabeb82dbe075d68c16b5492ff92c9b /src/main/java/de/hysky/skyblocker/skyblock
parented0489539902d77595625aaa3bca4e328e1f7e88 (diff)
parentf7b13895a4605e1d22e2c00e7b62c7365902d1aa (diff)
downloadSkyblocker-4a4234d7c9d4f038d4fa418fb15ef24ce3fcc501.tar.gz
Skyblocker-4a4234d7c9d4f038d4fa418fb15ef24ce3fcc501.tar.bz2
Skyblocker-4a4234d7c9d4f038d4fa418fb15ef24ce3fcc501.zip
Merge pull request #669 from SkyblockerMod/1.20.5
1.20.5 & 1.20.6
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java8
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java6
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java19
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakeBagHelper.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakesHelper.java7
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java17
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionViewScreen.java8
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/AuctionTypeWidget.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/CategoryTabWidget.java5
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/SortWidget.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/barn/HungryHiker.java5
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/barn/TreasureHunter.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleAnnouncementScreen.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java10
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/KuudraWaypoints.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java18
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusProfit.java275
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java34
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScoreHUD.java16
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/FireFreezeStaffTimer.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/FinderSettingsContainer.java7
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/OptionDropdownWidget.java11
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java31
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntryListWidget.java10
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java17
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdos.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/TicTacToe.java15
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/Trivia.java5
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/waterboard/Waterboard.java13
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java14
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java9
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java9
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java10
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java137
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java16
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java9
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dwarven/Fetchur.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dwarven/Puzzler.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java7
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/end/TheEnd.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java21
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java125
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/experiment/ChronomatronSolver.java12
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/experiment/SuperpairsSolver.java7
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/experiment/UltrasequencerSolver.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/fancybars/FancyStatusBars.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/filters/AdFilter.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/filters/AutopetFilter.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/filters/ShowOffFilter.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/filters/ToggleSkyMallFilter.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java6
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java60
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorAnimatedDyes.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorDyeColors.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorTrims.java36
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/CustomItemNames.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/ItemRarityBackgrounds.java7
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/MuseumItemCache.java30
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/PlayerHeadHashCache.java7
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreen.java17
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreenHandler.java35
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java31
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoriesHelper.java6
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/BackpackPreview.java81
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java11
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java99
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemFixerUpper.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java13
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java88
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java10
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNav.java7
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java16
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/special/SpecialEffects.java58
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/waypoint/OrderedWaypoints.java16
83 files changed, 897 insertions, 739 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java
index 5cdca216..e04a30ef 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java
@@ -3,10 +3,11 @@ package de.hysky.skyblocker.skyblock;
import com.google.gson.JsonObject;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor;
-import de.hysky.skyblocker.mixin.accessor.ScreenAccessor;
+import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor;
+import de.hysky.skyblocker.mixins.accessors.ScreenAccessor;
import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip;
import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType;
+import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.Utils;
import it.unimi.dsi.fastutil.longs.LongBooleanPair;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
@@ -15,7 +16,6 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
import net.minecraft.client.gui.tooltip.Tooltip;
import net.minecraft.client.gui.widget.ButtonWidget;
-import net.minecraft.client.item.TooltipContext;
import net.minecraft.item.ItemStack;
import net.minecraft.screen.GenericContainerScreenHandler;
import net.minecraft.screen.slot.Slot;
@@ -206,7 +206,7 @@ public class ChestValue {
* Searches for a specific string of characters in the name and lore of an item
*/
private static String searchLoreFor(ItemStack stack, MinecraftClient client, String searchString) {
- return stack.getTooltip(client.player, TooltipContext.BASIC).stream().map(Text::getString).filter(line -> line.contains(searchString)).findAny().orElse(null);
+ return ItemUtils.getLoreLineIf(stack, line -> line.contains(searchString));
}
static Text getProfitText(long profit, boolean hasIncompleteData) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java b/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java
index c3483102..c31e2107 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java
@@ -21,6 +21,7 @@ public class StatusBarTracker {
private int defense = 0;
public void init() {
+ ClientReceiveMessageEvents.ALLOW_GAME.register(this::allowOverlayMessage);
ClientReceiveMessageEvents.MODIFY_GAME.register(this::onOverlayMessage);
}
@@ -65,6 +66,11 @@ public class StatusBarTracker {
return str;
}
+ private boolean allowOverlayMessage(Text text, boolean overlay) {
+ onOverlayMessage(text, overlay);
+ return true;
+ }
+
private Text onOverlayMessage(Text text, boolean overlay) {
if (!overlay || !Utils.isOnSkyblock() || !SkyblockerConfigManager.get().general.bars.enableBars || Utils.isInTheRift()) {
return text;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java
index e572d9dc..f7f9836c 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java
@@ -9,6 +9,7 @@ import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
import net.minecraft.block.BlockState;
import net.minecraft.client.MinecraftClient;
+import net.minecraft.entity.attribute.EntityAttributes;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.util.hit.BlockHitResult;
@@ -27,7 +28,7 @@ public class TeleportOverlay {
if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.teleportOverlay.enableTeleportOverlays && client.player != null && client.world != null) {
ItemStack heldItem = client.player.getMainHandStack();
String itemId = ItemTooltip.getInternalNameFromNBT(heldItem, true);
- NbtCompound extraAttributes = ItemUtils.getExtraAttributes(heldItem);
+ NbtCompound customData = ItemUtils.getCustomData(heldItem);
if (itemId != null) {
switch (itemId) {
@@ -42,20 +43,20 @@ public class TeleportOverlay {
}
}
case "ASPECT_OF_THE_END", "ASPECT_OF_THE_VOID" -> {
- if (SkyblockerConfigManager.get().general.teleportOverlay.enableEtherTransmission && client.options.sneakKey.isPressed() && extraAttributes != null && extraAttributes.getInt("ethermerge") == 1) {
- render(wrc, extraAttributes, 57);
+ if (SkyblockerConfigManager.get().general.teleportOverlay.enableEtherTransmission && client.options.sneakKey.isPressed() && customData != null && customData.getInt("ethermerge") == 1) {
+ render(wrc, customData, 57);
} else if (SkyblockerConfigManager.get().general.teleportOverlay.enableInstantTransmission) {
- render(wrc, extraAttributes, 8);
+ render(wrc, customData, 8);
}
}
case "ETHERWARP_CONDUIT" -> {
if (SkyblockerConfigManager.get().general.teleportOverlay.enableEtherTransmission) {
- render(wrc, extraAttributes, 57);
+ render(wrc, customData, 57);
}
}
case "SINSEEKER_SCYTHE" -> {
if (SkyblockerConfigManager.get().general.teleportOverlay.enableSinrecallTransmission) {
- render(wrc, extraAttributes, 4);
+ render(wrc, customData, 4);
}
}
case "NECRON_BLADE", "ASTRAEA", "HYPERION", "SCYLLA", "VALKYRIE" -> {
@@ -71,8 +72,8 @@ public class TeleportOverlay {
/**
* Renders the teleport overlay with a given base range and the tuned transmission stat.
*/
- private static void render(WorldRenderContext wrc, NbtCompound extraAttributes, int baseRange) {
- render(wrc, extraAttributes != null && extraAttributes.contains("tuned_transmission") ? baseRange + extraAttributes.getInt("tuned_transmission") : baseRange);
+ private static void render(WorldRenderContext wrc, NbtCompound customData, int baseRange) {
+ render(wrc, customData != null && customData.contains("tuned_transmission") ? baseRange + customData.getInt("tuned_transmission") : baseRange);
}
/**
@@ -83,7 +84,7 @@ public class TeleportOverlay {
private static void render(WorldRenderContext wrc, int range) {
if (client.crosshairTarget != null && client.crosshairTarget.getType() == HitResult.Type.BLOCK && client.crosshairTarget instanceof BlockHitResult blockHitResult && client.crosshairTarget.squaredDistanceTo(client.player) < range * range) {
render(wrc, blockHitResult);
- } else if (client.interactionManager != null && range > client.interactionManager.getReachDistance()) {
+ } else if (client.interactionManager != null && range > client.player.getAttributeInstance(EntityAttributes.PLAYER_BLOCK_INTERACTION_RANGE).getValue()) {
@SuppressWarnings("DataFlowIssue")
HitResult result = client.player.raycast(range, wrc.tickDelta(), false);
if (result.getType() == HitResult.Type.BLOCK && result instanceof BlockHitResult blockHitResult) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java b/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java
index 8862185f..a44a3102 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java
@@ -20,7 +20,7 @@ import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.arg
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
/**
- * the mixin {@link de.hysky.skyblocker.mixin.CommandTreeS2CPacketMixin}
+ * the mixin {@link de.hysky.skyblocker.mixins.CommandTreeS2CPacketMixin}
*/
public class WarpAutocomplete {
private static final Logger LOGGER = LoggerFactory.getLogger(WarpAutocomplete.class);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakeBagHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakeBagHelper.java
index e0d67fbe..9b2080a3 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakeBagHelper.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakeBagHelper.java
@@ -3,12 +3,12 @@ package de.hysky.skyblocker.skyblock.accessories.newyearcakes;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.client.MinecraftClient;
import net.minecraft.item.ItemStack;
import net.minecraft.screen.slot.Slot;
import java.util.List;
-import java.util.Map;
public class NewYearCakeBagHelper extends ContainerSolver {
public NewYearCakeBagHelper() {
@@ -21,7 +21,7 @@ public class NewYearCakeBagHelper extends ContainerSolver {
}
@Override
- protected List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> slots) {
+ protected List<ColorHighlight> getColors(String[] groups, Int2ObjectMap<ItemStack> slots) {
MinecraftClient client = MinecraftClient.getInstance();
if (client.player != null) {
for (Slot slot : client.player.currentScreenHandler.slots) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakesHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakesHelper.java
index b722849b..2fdcf3b4 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakesHelper.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakesHelper.java
@@ -4,6 +4,7 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import it.unimi.dsi.fastutil.ints.IntSet;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
@@ -64,14 +65,14 @@ public class NewYearCakesHelper extends ContainerSolver {
}
@Override
- protected List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> slots) {
+ protected List<ColorHighlight> getColors(String[] groups, Int2ObjectMap<ItemStack> slots) {
String profile = Utils.getProfile();
if (cakes.isEmpty() || !cakes.containsKey(profile) || cakes.containsKey(profile) && cakes.get(profile).isEmpty()) return List.of();
List<ColorHighlight> highlights = new ArrayList<>();
- for (Map.Entry<Integer, ItemStack> entry : slots.entrySet()) {
+ for (Int2ObjectMap.Entry<ItemStack> entry : slots.int2ObjectEntrySet()) {
int year = getCakeYear(entry.getValue());
if (year >= 0 && cakes.containsKey(profile)) {
- highlights.add(cakes.get(profile).contains(year) ? ColorHighlight.red(entry.getKey()) : ColorHighlight.green(entry.getKey()));
+ highlights.add(cakes.get(profile).contains(year) ? ColorHighlight.red(entry.getIntKey()) : ColorHighlight.green(entry.getIntKey()));
}
}
return highlights;
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 c8bc1f13..10823418 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java
@@ -34,6 +34,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.awt.*;
+import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
@@ -93,7 +94,7 @@ public class AuctionBrowserScreen extends AbstractCustomHypixelGUI<AuctionHouseS
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);
+ resetFiltersButton.setTooltipDelay(Duration.ofMillis(500));
addDrawableChild(new ButtonWidget.Builder(Text.literal("<"), button -> this.clickSlot(BACK_BUTTON_SLOT))
.position(x + 98, y + 4)
@@ -240,11 +241,11 @@ public class AuctionBrowserScreen extends AbstractCustomHypixelGUI<AuctionHouseS
}
}
case SORT_BUTTON_SLOT ->
- sortWidget.setCurrent(SortWidget.Option.get(getOrdinal(ItemUtils.getNbtTooltips(stack))));
+ sortWidget.setCurrent(SortWidget.Option.get(getOrdinal(ItemUtils.getLore(stack))));
case AUCTION_TYPE_BUTTON_SLOT ->
- auctionTypeWidget.setCurrent(AuctionTypeWidget.Option.get(getOrdinal(ItemUtils.getNbtTooltips(stack))));
+ auctionTypeWidget.setCurrent(AuctionTypeWidget.Option.get(getOrdinal(ItemUtils.getLore(stack))));
case RARITY_BUTTON_SLOT -> {
- List<Text> tooltip = ItemUtils.getNbtTooltips(stack);
+ List<Text> tooltip = ItemUtils.getLore(stack);
int ordinal = getOrdinal(tooltip);
String split = tooltip.get(ordinal + 1).getString().substring(2);
rarityWidget.setText(tooltip.subList(1, tooltip.size() - 3), split);
@@ -254,7 +255,7 @@ public class AuctionBrowserScreen extends AbstractCustomHypixelGUI<AuctionHouseS
resetFiltersButton.active = handler.getSlot(slotId).getStack().isOf(Items.ANVIL);
}
case SEARCH_BUTTON_SLOT -> {
- List<Text> tooltipSearch = ItemUtils.getNbtTooltips(stack);
+ List<Text> tooltipSearch = ItemUtils.getLore(stack);
for (Text text : tooltipSearch) {
String string = text.getString();
if (string.contains("Filtered:")) {
@@ -271,7 +272,7 @@ public class AuctionBrowserScreen extends AbstractCustomHypixelGUI<AuctionHouseS
CategoryTabWidget categoryTabWidget = categoryTabWidgets.get(slotId / 9);
categoryTabWidget.setSlotId(slotId);
categoryTabWidget.setIcon(handler.getSlot(slotId).getStack());
- List<Text> tooltipDefault = ItemUtils.getNbtTooltips(handler.getSlot(slotId).getStack());
+ List<Text> tooltipDefault = ItemUtils.getLore(handler.getSlot(slotId).getStack());
for (int j = tooltipDefault.size() - 1; j >= 0; j--) {
String lowerCase = tooltipDefault.get(j).getString().toLowerCase();
if (lowerCase.contains("currently")) {
@@ -284,7 +285,7 @@ public class AuctionBrowserScreen extends AbstractCustomHypixelGUI<AuctionHouseS
}
} else if (slotId > 9 && slotId < (handler.getRows() - 1) * 9 && slotId % 9 > 1 && slotId % 9 < 8) {
if (!SkyblockerConfigManager.get().general.fancyAuctionHouse.highlightCheapBIN) return;
- List<Text> tooltip = ItemUtils.getNbtTooltips(stack);
+ List<Text> tooltip = ItemUtils.getLore(stack);
for (int k = tooltip.size() - 1; k >= 0; k--) {
Text text = tooltip.get(k);
String string = text.getString();
@@ -349,7 +350,7 @@ public class AuctionBrowserScreen extends AbstractCustomHypixelGUI<AuctionHouseS
private void parsePage(ItemStack stack) {
assert client != null;
try {
- List<Text> tooltip = ItemUtils.getNbtTooltips(stack);
+ List<Text> tooltip = ItemUtils.getLore(stack);
String str = tooltip.get(0).getString().trim();
str = str.substring(1, str.length() - 1); // remove parentheses
String[] parts = str.split("/"); // split the string
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 28898cdc..4c4e1c0f 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java
@@ -1,6 +1,6 @@
package de.hysky.skyblocker.skyblock.auction;
-import de.hysky.skyblocker.mixin.accessor.SlotAccessor;
+import de.hysky.skyblocker.mixins.accessors.SlotAccessor;
import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.Inventory;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionViewScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionViewScreen.java
index a8b30a50..af931eb1 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionViewScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionViewScreen.java
@@ -198,18 +198,18 @@ public class AuctionViewScreen extends AbstractCustomHypixelGUI<AuctionHouseScre
if (priceParsed) return;
if (stack.isOf(Items.POISONOUS_POTATO)) {
changeState(BuyState.CANT_AFFORD);
- getPriceFromTooltip(ItemUtils.getNbtTooltips(stack));
+ getPriceFromTooltip(ItemUtils.getLore(stack));
buySlotID = slotId;
} else if (stack.isOf(Items.GOLD_NUGGET)) {
changeState(BuyState.AFFORD);
- getPriceFromTooltip(ItemUtils.getNbtTooltips(stack));
+ getPriceFromTooltip(ItemUtils.getLore(stack));
buySlotID = slotId;
} else if (stack.isOf(Items.GOLD_BLOCK)) {
changeState(BuyState.TOP_BID);
- getPriceFromTooltip(ItemUtils.getNbtTooltips(stack));
+ getPriceFromTooltip(ItemUtils.getLore(stack));
buySlotID = slotId;
} else if (stack.isOf(Items.NAME_TAG)) {
- getPriceFromTooltip(ItemUtils.getNbtTooltips(stack));
+ getPriceFromTooltip(ItemUtils.getLore(stack));
changeProfile = true;
buySlotID = slotId;
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/AuctionTypeWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/AuctionTypeWidget.java
index 4334fc58..2204d39c 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/AuctionTypeWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/AuctionTypeWidget.java
@@ -4,7 +4,6 @@ import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.skyblock.auction.SlotClickHandler;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
-import net.minecraft.util.math.MathHelper;
public class AuctionTypeWidget extends SliderWidget<AuctionTypeWidget.Option> {
@@ -34,7 +33,7 @@ public class AuctionTypeWidget extends SliderWidget<AuctionTypeWidget.Option> {
private static final AuctionTypeWidget.Option[] values = values();
public static AuctionTypeWidget.Option get(int ordinal) {
- return values[MathHelper.clamp(ordinal, 0, values.length - 1)];
+ return values[Math.clamp(ordinal, 0, values.length - 1)];
}
@Override
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/CategoryTabWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/CategoryTabWidget.java
index 03d91780..02dbc132 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/CategoryTabWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/CategoryTabWidget.java
@@ -5,7 +5,8 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.ButtonTextures;
import net.minecraft.client.gui.widget.ToggleButtonWidget;
-import net.minecraft.client.item.TooltipContext;
+import net.minecraft.client.item.TooltipType;
+import net.minecraft.item.Item.TooltipContext;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.NotNull;
@@ -39,7 +40,7 @@ public class CategoryTabWidget extends ToggleButtonWidget {
if (isMouseOver(mouseX, mouseY)) {
context.getMatrices().push();
- context.drawTooltip(MinecraftClient.getInstance().textRenderer, icon.getTooltip(MinecraftClient.getInstance().player, TooltipContext.BASIC), mouseX, mouseY);
+ context.drawTooltip(MinecraftClient.getInstance().textRenderer, icon.getTooltip(TooltipContext.DEFAULT, MinecraftClient.getInstance().player, TooltipType.BASIC), mouseX, mouseY);
context.getMatrices().pop();
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/SortWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/SortWidget.java
index b2450b59..84b8ae4d 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/SortWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/widgets/SortWidget.java
@@ -4,7 +4,6 @@ import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.skyblock.auction.SlotClickHandler;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
-import net.minecraft.util.math.MathHelper;
public class SortWidget extends SliderWidget<SortWidget.Option> {
@@ -39,7 +38,7 @@ public class SortWidget extends SliderWidget<SortWidget.Option> {
private static final Option[] values = values();
public static Option get(int ordinal) {
- return values[MathHelper.clamp(ordinal, 0, values.length - 1)];
+ return values[Math.clamp(ordinal, 0, values.length - 1)];
}
@Override
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/barn/HungryHiker.java b/src/main/java/de/hysky/skyblocker/skyblock/barn/HungryHiker.java
index abb4a76d..4a0213c1 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/barn/HungryHiker.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/barn/HungryHiker.java
@@ -1,6 +1,7 @@
package de.hysky.skyblocker.skyblock.barn;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.chat.ChatFilterResult;
import de.hysky.skyblocker.utils.chat.ChatPatternListener;
import net.minecraft.client.MinecraftClient;
@@ -14,7 +15,7 @@ public class HungryHiker extends ChatPatternListener {
private static final Map<String, String> foods;
- public HungryHiker() { super("^§e\\[NPC] Hungry Hiker§f: (The food I want is|(I asked for) food that is) ([a-zA-Z, '\\-]*\\.)$"); }
+ public HungryHiker() { super("^\\[NPC] Hungry Hiker: (The food I want is|(I asked for) food that is) ([a-zA-Z, '\\-]*\\.)$"); }
@Override
public ChatFilterResult state() {
@@ -29,7 +30,7 @@ public class HungryHiker extends ChatPatternListener {
String food = foods.get(foodDescription);
if (food == null) return false;
String middlePartOfTheMessageToSend = matcher.group(2) != null ? matcher.group(2) : matcher.group(1);
- client.player.sendMessage(Text.of("§e[NPC] Hungry Hiker§f: " + middlePartOfTheMessageToSend + " " + food + "."), false);
+ Utils.sendMessageToBypassEvents(Text.of("§e[NPC] Hungry Hiker§f: " + middlePartOfTheMessageToSend + " " + food + "."));
return true;
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/barn/TreasureHunter.java b/src/main/java/de/hysky/skyblocker/skyblock/barn/TreasureHunter.java
index 191014d5..032c7df9 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/barn/TreasureHunter.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/barn/TreasureHunter.java
@@ -14,7 +14,7 @@ public class TreasureHunter extends ChatPatternListener {
private static final Map<String, String> locations;
- public TreasureHunter() { super("^§e\\[NPC] Treasure Hunter§f: ([a-zA-Z, '\\-\\.]*)$"); }
+ public TreasureHunter() { super("^\\[NPC] Treasure Hunter: ([a-zA-Z, '\\-\\.]*)$"); }
@Override
public ChatFilterResult state() {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleAnnouncementScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleAnnouncementScreen.java
index bafada27..d61a0b59 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleAnnouncementScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleAnnouncementScreen.java
@@ -1,7 +1,7 @@
package de.hysky.skyblocker.skyblock.chat;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
+import de.hysky.skyblocker.events.HudRenderEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.util.math.MatrixStack;
@@ -13,7 +13,7 @@ public class ChatRuleAnnouncementScreen {
private static Text text = null;
public static void init() {
- HudRenderCallback.EVENT.register((context, tickDelta) -> {
+ HudRenderEvents.BEFORE_CHAT.register((context, tickDelta) -> {
if (timer <= 0 || text == null) {
return;
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java
index a1b9317a..747e826b 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java
@@ -39,8 +39,8 @@ public class ChatRulesConfigListWidget extends ElementListWidget<ChatRulesConfig
}
@Override
- protected int getScrollbarPositionX() {
- return super.getScrollbarPositionX() + 50;
+ protected int getScrollbarX() {
+ return super.getScrollbarX() + 50;
}
protected void addRuleAfterSelected() {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java
index 2a103d13..d1c7f4fd 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java
@@ -6,7 +6,7 @@ import com.google.gson.JsonParser;
import com.mojang.serialization.Codec;
import com.mojang.serialization.JsonOps;
import de.hysky.skyblocker.SkyblockerMod;
-import de.hysky.skyblocker.mixin.accessor.MessageHandlerAccessor;
+import de.hysky.skyblocker.mixins.accessors.MessageHandlerAccessor;
import de.hysky.skyblocker.utils.Http;
import de.hysky.skyblocker.utils.Utils;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
@@ -52,7 +52,7 @@ public class ChatRulesHandler {
private static void loadChatRules() {
try (BufferedReader reader = Files.newBufferedReader(CHAT_RULE_FILE)) {
- Map<String, List<ChatRule>> chatRules = MAP_CODEC.parse(JsonOps.INSTANCE, JsonParser.parseReader(reader)).result().orElseThrow();
+ Map<String, List<ChatRule>> chatRules = MAP_CODEC.parse(JsonOps.INSTANCE, JsonParser.parseReader(reader)).getOrThrow();
LOGGER.info("[Skyblocker Chat Rules]: {}", chatRules);
chatRuleList.addAll(chatRules.get("rules"));
@@ -98,7 +98,7 @@ public class ChatRulesHandler {
protected static void saveChatRules() {
JsonObject chatRuleJson = new JsonObject();
- chatRuleJson.add("rules", ChatRule.LIST_CODEC.encodeStart(JsonOps.INSTANCE, chatRuleList).result().orElseThrow());
+ chatRuleJson.add("rules", ChatRule.LIST_CODEC.encodeStart(JsonOps.INSTANCE, chatRuleList).getOrThrow());
try (BufferedWriter writer = Files.newBufferedWriter(CHAT_RULE_FILE)) {
SkyblockerMod.GSON.toJson(chatRuleJson, writer);
LOGGER.info("[Skyblocker Chat Rules] Saved chat rules file");
@@ -139,9 +139,7 @@ public class ChatRulesHandler {
//show replacement message in chat
//bypass MessageHandler#onGameMessage to avoid activating chat rules again
if (!rule.getHideMessage() && CLIENT.player != null) {
- CLIENT.inGameHud.getChatHud().addMessage(newMessage);
- ((MessageHandlerAccessor) CLIENT.getMessageHandler()).invokeAddToChatLog(newMessage, Instant.now());
- CLIENT.getNarratorManager().narrateSystemMessage(newMessage);
+ Utils.sendMessageToBypassEvents(newMessage);
}
//play sound
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/KuudraWaypoints.java b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/KuudraWaypoints.java
index 790d434a..00cd85a0 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/KuudraWaypoints.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/KuudraWaypoints.java
@@ -60,7 +60,7 @@ public class KuudraWaypoints {
private static CompletableFuture<Void> loadWaypoints(MinecraftClient client, Identifier file, ObjectArrayList<Waypoint> list, float[] colorComponents) {
return CompletableFuture.supplyAsync(() -> {
try (BufferedReader reader = client.getResourceManager().openAsReader(file)) {
- return CODEC.apply(colorComponents).parse(JsonOps.INSTANCE, getWaypoints(reader)).result().orElseThrow();
+ return CODEC.apply(colorComponents).parse(JsonOps.INSTANCE, getWaypoints(reader)).getOrThrow();
} catch (Exception e) {
LOGGER.error("[Skyblocker Kuudra Waypoints] Failed to load kuudra waypoints from: {}", file, e);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java
index 01422770..0bc34c57 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java
@@ -1,13 +1,15 @@
package de.hysky.skyblocker.skyblock.dungeon;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import net.minecraft.component.DataComponentTypes;
import net.minecraft.item.ItemStack;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
public class CroesusHelper extends ContainerSolver {
@@ -21,15 +23,15 @@ public class CroesusHelper extends ContainerSolver {
}
@Override
- protected List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> slots) {
+ protected List<ColorHighlight> getColors(String[] groups, Int2ObjectMap<ItemStack> slots) {
List<ColorHighlight> highlights = new ArrayList<>();
- for (Map.Entry<Integer, ItemStack> entry : slots.entrySet()) {
+ for (Int2ObjectMap.Entry<ItemStack> entry : slots.int2ObjectEntrySet()) {
ItemStack stack = entry.getValue();
- if (stack != null && stack.getNbt() != null) {
- if (stack.getNbt().toString().contains("Opened Chest:")) {
- highlights.add(ColorHighlight.gray(entry.getKey()));
- } else if (stack.getNbt().toString().contains("No more Chests to open!")) {
- highlights.add(ColorHighlight.red(entry.getKey()));
+ if (stack != null && stack.contains(DataComponentTypes.LORE)) {
+ if (ItemUtils.getLoreLineIf(stack, s -> s.contains("Opened Chest:")) != null) {
+ highlights.add(ColorHighlight.gray(entry.getIntKey()));
+ } else if (ItemUtils.getLoreLineIf(stack, s -> s.contains("No more Chests to open!")) != null) {
+ highlights.add(ColorHighlight.red(entry.getIntKey()));
}
}
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusProfit.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusProfit.java
index ca166915..c6cbe2ce 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusProfit.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusProfit.java
@@ -6,8 +6,11 @@ import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.item.ItemStack;
import net.minecraft.text.Text;
+import net.minecraft.util.Util;
+
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@@ -29,15 +32,15 @@ public class CroesusProfit extends ContainerSolver {
}
@Override
- protected List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> slots) {
+ protected List<ColorHighlight> getColors(String[] groups, Int2ObjectMap<ItemStack> slots) {
List<ColorHighlight> highlights = new ArrayList<>();
ItemStack bestChest = null, secondBestChest = null;
long bestValue = 0, secondBestValue = 0; // If negative value of chest - it is out of the question
long dungeonKeyPriceData = getItemPrice("DUNGEON_CHEST_KEY") * 2; // lesser ones don't worth the hassle
- for (Map.Entry<Integer, ItemStack> entry : slots.entrySet()) {
+ for (Int2ObjectMap.Entry<ItemStack> entry : slots.int2ObjectEntrySet()) {
ItemStack stack = entry.getValue();
- if (stack != null && stack.getNbt() != null && stack.getName().toString().contains("Chest")) {
+ if (stack.getName().getString().contains("Chest")) {
long value = valueChest(stack);
if (value > bestValue) {
secondBestChest = bestChest;
@@ -51,13 +54,13 @@ public class CroesusProfit extends ContainerSolver {
}
}
- for (Map.Entry<Integer, ItemStack> entry : slots.entrySet()) {
+ for (Int2ObjectMap.Entry<ItemStack> entry : slots.int2ObjectEntrySet()) {
ItemStack stack = entry.getValue();
- if (stack != null && stack.getNbt() != null) {
+ if (stack != null) {
if (stack.equals(bestChest)) {
- highlights.add(ColorHighlight.green(entry.getKey()));
+ highlights.add(ColorHighlight.green(entry.getIntKey()));
} else if (stack.equals(secondBestChest) && secondBestValue > dungeonKeyPriceData) {
- highlights.add(ColorHighlight.yellow(entry.getKey()));
+ highlights.add(ColorHighlight.yellow(entry.getIntKey()));
}
}
}
@@ -71,7 +74,7 @@ public class CroesusProfit extends ContainerSolver {
List<String> chestItems = new ArrayList<>();
boolean processingContents = false;
- for (Text line : ItemUtils.getNbtTooltips(chest)) {
+ for (Text line : ItemUtils.getLore(chest)) {
String lineString = line.getString();
if (lineString.contains("Contents")) {
processingContents = true;
@@ -124,144 +127,144 @@ public class CroesusProfit extends ContainerSolver {
// I did a thing :(
- final Map<String, String> dungeonDropsNameToId = new HashMap<>() {{
- put("Enchanted Book (Ultimate Jerry I)", "ENCHANTMENT_ULTIMATE_JERRY_1"); // ultimate books start
- put("Enchanted Book (Ultimate Jerry II)", "ENCHANTMENT_ULTIMATE_JERRY_2");
- put("Enchanted Book (Ultimate Jerry III)", "ENCHANTMENT_ULTIMATE_JERRY_3");
- put("Enchanted Book (Bank I)", "ENCHANTMENT_ULTIMATE_BANK_1");
- put("Enchanted Book (Bank II)", "ENCHANTMENT_ULTIMATE_BANK_2");
- put("Enchanted Book (Bank III)", "ENCHANTMENT_ULTIMATE_BANK_3");
- put("Enchanted Book (Combo I)", "ENCHANTMENT_ULTIMATE_COMBO_1");
- put("Enchanted Book (Combo II)", "ENCHANTMENT_ULTIMATE_COMBO_2");
- put("Enchanted Book (No Pain No Gain I)", "ENCHANTMENT_ULTIMATE_NO_PAIN_NO_GAIN_1");
- put("Enchanted Book (No Pain No Gain II)", "ENCHANTMENT_ULTIMATE_NO_PAIN_NO_GAIN_2");
- put("Enchanted Book (Ultimate Wise I)", "ENCHANTMENT_ULTIMATE_WISE_1");
- put("Enchanted Book (Ultimate Wise II)", "ENCHANTMENT_ULTIMATE_WISE_2");
- put("Enchanted Book (Wisdom I)", "ENCHANTMENT_ULTIMATE_WISDOM_1");
- put("Enchanted Book (Wisdom II)", "ENCHANTMENT_ULTIMATE_WISDOM_2");
- put("Enchanted Book (Last Stand I)", "ENCHANTMENT_ULTIMATE_LAST_STAND_1");
- put("Enchanted Book (Last Stand II)", "ENCHANTMENT_ULTIMATE_LAST_STAND_2");
- put("Enchanted Book (Rend I)", "ENCHANTMENT_ULTIMATE_REND_1");
- put("Enchanted Book (Rend II)", "ENCHANTMENT_ULTIMATE_REND_2");
- put("Enchanted Book (Legion I)", "ENCHANTMENT_ULTIMATE_LEGION_1");
- put("Enchanted Book (Swarm I)", "ENCHANTMENT_ULTIMATE_SWARM_1");
- put("Enchanted Book (One For All I)", "ENCHANTMENT_ULTIMATE_ONE_FOR_ALL_1");
- put("Enchanted Book (Soul Eater I)", "ENCHANTMENT_ULTIMATE_SOUL_EATER_1"); // ultimate books end
- put("Enchanted Book (Infinite Quiver VI)", "ENCHANTMENT_INFINITE_QUIVER_6"); // enchanted books start
- put("Enchanted Book (Infinite Quiver VII)", "ENCHANTMENT_INFINITE_QUIVER_7");
- put("Enchanted Book (Feather Falling VI)", "ENCHANTMENT_FEATHER_FALLING_6");
- put("Enchanted Book (Feather Falling VII)", "ENCHANTMENT_FEATHER_FALLING_7");
- put("Enchanted Book (Rejuvenate I)", "ENCHANTMENT_REJUVENATE_1");
- put("Enchanted Book (Rejuvenate II)", "ENCHANTMENT_REJUVENATE_2");
- put("Enchanted Book (Rejuvenate III)", "ENCHANTMENT_REJUVENATE_3");
- put("Enchanted Book (Overload)", "ENCHANTMENT_OVERLOAD_1");
- put("Enchanted Book (Lethality VI)", "ENCHANTMENT_LETHALITY_6");
- put("Enchanted Book (Thunderlord VII)", "ENCHANTMENT_THUNDERLORD_7"); // enchanted books end
+ private final Map<String, String> dungeonDropsNameToId = Util.make(new HashMap<>(), map -> {
+ map.put("Enchanted Book (Ultimate Jerry I)", "ENCHANTMENT_ULTIMATE_JERRY_1"); // ultimate books start
+ map.put("Enchanted Book (Ultimate Jerry II)", "ENCHANTMENT_ULTIMATE_JERRY_2");
+ map.put("Enchanted Book (Ultimate Jerry III)", "ENCHANTMENT_ULTIMATE_JERRY_3");
+ map.put("Enchanted Book (Bank I)", "ENCHANTMENT_ULTIMATE_BANK_1");
+ map.put("Enchanted Book (Bank II)", "ENCHANTMENT_ULTIMATE_BANK_2");
+ map.put("Enchanted Book (Bank III)", "ENCHANTMENT_ULTIMATE_BANK_3");
+ map.put("Enchanted Book (Combo I)", "ENCHANTMENT_ULTIMATE_COMBO_1");
+ map.put("Enchanted Book (Combo II)", "ENCHANTMENT_ULTIMATE_COMBO_2");
+ map.put("Enchanted Book (No Pain No Gain I)", "ENCHANTMENT_ULTIMATE_NO_PAIN_NO_GAIN_1");
+ map.put("Enchanted Book (No Pain No Gain II)", "ENCHANTMENT_ULTIMATE_NO_PAIN_NO_GAIN_2");
+ map.put("Enchanted Book (Ultimate Wise I)", "ENCHANTMENT_ULTIMATE_WISE_1");
+ map.put("Enchanted Book (Ultimate Wise II)", "ENCHANTMENT_ULTIMATE_WISE_2");
+ map.put("Enchanted Book (Wisdom I)", "ENCHANTMENT_ULTIMATE_WISDOM_1");
+ map.put("Enchanted Book (Wisdom II)", "ENCHANTMENT_ULTIMATE_WISDOM_2");
+ map.put("Enchanted Book (Last Stand I)", "ENCHANTMENT_ULTIMATE_LAST_STAND_1");
+ map.put("Enchanted Book (Last Stand II)", "ENCHANTMENT_ULTIMATE_LAST_STAND_2");
+ map.put("Enchanted Book (Rend I)", "ENCHANTMENT_ULTIMATE_REND_1");
+ map.put("Enchanted Book (Rend II)", "ENCHANTMENT_ULTIMATE_REND_2");
+ map.put("Enchanted Book (Legion I)", "ENCHANTMENT_ULTIMATE_LEGION_1");
+ map.put("Enchanted Book (Swarm I)", "ENCHANTMENT_ULTIMATE_SWARM_1");
+ map.put("Enchanted Book (One For All I)", "ENCHANTMENT_ULTIMATE_ONE_FOR_ALL_1");
+ map.put("Enchanted Book (Soul Eater I)", "ENCHANTMENT_ULTIMATE_SOUL_EATER_1"); // ultimate books end
+ map.put("Enchanted Book (Infinite Quiver VI)", "ENCHANTMENT_INFINITE_QUIVER_6"); // enchanted books start
+ map.put("Enchanted Book (Infinite Quiver VII)", "ENCHANTMENT_INFINITE_QUIVER_7");
+ map.put("Enchanted Book (Feather Falling VI)", "ENCHANTMENT_FEATHER_FALLING_6");
+ map.put("Enchanted Book (Feather Falling VII)", "ENCHANTMENT_FEATHER_FALLING_7");
+ map.put("Enchanted Book (Rejuvenate I)", "ENCHANTMENT_REJUVENATE_1");
+ map.put("Enchanted Book (Rejuvenate II)", "ENCHANTMENT_REJUVENATE_2");
+ map.put("Enchanted Book (Rejuvenate III)", "ENCHANTMENT_REJUVENATE_3");
+ map.put("Enchanted Book (Overload)", "ENCHANTMENT_OVERLOAD_1");
+ map.put("Enchanted Book (Lethality VI)", "ENCHANTMENT_LETHALITY_6");
+ map.put("Enchanted Book (Thunderlord VII)", "ENCHANTMENT_THUNDERLORD_7"); // enchanted books end
- put("Hot Potato Book", "HOT_POTATO_BOOK"); // HPB, FPB, Recomb (universal drops)
- put("Fuming Potato Book", "FUMING_POTATO_BOOK");
- put("Recombobulator 3000", "RECOMBOBULATOR_3000");
- put("Necromancer's Brooch", "NECROMANCER_BROOCH");
- put("ESSENCE_WITHER","ESSENCE_WITHER"); // Essences. Really stupid way of doing this
- put("ESSENCE_UNDEAD", "ESSENCE_UNDEAD");
- put("ESSENCE_DRAGON", "ESSENCE_DRAGON");
- put("ESSENCE_SPIDER", "ESSENCE_SPIDER");
- put("ESSENCE_ICE", "ESSENCE_ICE");
- put("ESSENCE_DIAMOND", "ESSENCE_DIAMOND");
- put("ESSENCE_GOLD", "ESSENCE_GOLD");
- put("ESSENCE_CRIMSON", "ESSENCE_CRIMSON");
- put("DUNGEON_CHEST_KEY", "DUNGEON_CHEST_KEY");
+ map.put("Hot Potato Book", "HOT_POTATO_BOOK"); // HPB, FPB, Recomb (universal drops)
+ map.put("Fuming Potato Book", "FUMING_POTATO_BOOK");
+ map.put("Recombobulator 3000", "RECOMBOBULATOR_3000");
+ map.put("Necromancer's Brooch", "NECROMANCER_BROOCH");
+ map.put("ESSENCE_WITHER","ESSENCE_WITHER"); // Essences. Really stupid way of doing this
+ map.put("ESSENCE_UNDEAD", "ESSENCE_UNDEAD");
+ map.put("ESSENCE_DRAGON", "ESSENCE_DRAGON");
+ map.put("ESSENCE_SPIDER", "ESSENCE_SPIDER");
+ map.put("ESSENCE_ICE", "ESSENCE_ICE");
+ map.put("ESSENCE_DIAMOND", "ESSENCE_DIAMOND");
+ map.put("ESSENCE_GOLD", "ESSENCE_GOLD");
+ map.put("ESSENCE_CRIMSON", "ESSENCE_CRIMSON");
+ map.put("DUNGEON_CHEST_KEY", "DUNGEON_CHEST_KEY");
- put("Bonzo's Staff", "BONZO_STAFF"); // F1 M1
- put("Master Skull - Tier 1", "MASTER_SKULL_TIER_1");
- put("Bonzo's Mask", "BONZO_MASK");
- put("Balloon Snake", "BALLOON_SNAKE");
- put("Red Nose", "RED_NOSE");
+ map.put("Bonzo's Staff", "BONZO_STAFF"); // F1 M1
+ map.put("Master Skull - Tier 1", "MASTER_SKULL_TIER_1");
+ map.put("Bonzo's Mask", "BONZO_MASK");
+ map.put("Balloon Snake", "BALLOON_SNAKE");
+ map.put("Red Nose", "RED_NOSE");
- put("Red Scarf", "RED_SCARF"); // F2 M2
- put("Adaptive Blade", "STONE_BLADE");
- put("Master Skull - Tier 2", "MASTER_SKULL_TIER_2");
- put("Adaptive Belt", "ADAPTIVE_BELT");
- put("Scarf's Studies", "SCARF_STUDIES");
+ map.put("Red Scarf", "RED_SCARF"); // F2 M2
+ map.put("Adaptive Blade", "STONE_BLADE");
+ map.put("Master Skull - Tier 2", "MASTER_SKULL_TIER_2");
+ map.put("Adaptive Belt", "ADAPTIVE_BELT");
+ map.put("Scarf's Studies", "SCARF_STUDIES");
- put("First Master Star", "FIRST_MASTER_STAR"); // F3 M3
- put("Adaptive Helmet", "ADAPTIVE_HELMET");
- put("Adaptive Chestplate", "ADAPTIVE_CHESTPLATE");
- put("Adaptive Leggings", "ADAPTIVE_LEGGINGS");
- put("Adaptive Boots", "ADAPTIVE_BOOTS");
- put("Master Skull - Tier 3", "MASTER_SKULL_TIER_3");
- put("Suspicious Vial", "SUSPICIOUS_VIAL");
+ map.put("First Master Star", "FIRST_MASTER_STAR"); // F3 M3
+ map.put("Adaptive Helmet", "ADAPTIVE_HELMET");
+ map.put("Adaptive Chestplate", "ADAPTIVE_CHESTPLATE");
+ map.put("Adaptive Leggings", "ADAPTIVE_LEGGINGS");
+ map.put("Adaptive Boots", "ADAPTIVE_BOOTS");
+ map.put("Master Skull - Tier 3", "MASTER_SKULL_TIER_3");
+ map.put("Suspicious Vial", "SUSPICIOUS_VIAL");
- put("Spirit Sword", "SPIRIT_SWORD"); // F4 M4
- put("Spirit Shortbow", "ITEM_SPIRIT_BOW");
- put("Spirit Boots", "THORNS_BOOTS");
- put("Spirit", "LVL_1_LEGENDARY_SPIRIT"); // Spirit pet (Legendary)
- put("Spirit Epic", "LVL_1_EPIC_SPIRIT");
+ map.put("Spirit Sword", "SPIRIT_SWORD"); // F4 M4
+ map.put("Spirit Shortbow", "ITEM_SPIRIT_BOW");
+ map.put("Spirit Boots", "THORNS_BOOTS");
+ map.put("Spirit", "LVL_1_LEGENDARY_SPIRIT"); // Spirit pet (Legendary)
+ map.put("Spirit Epic", "LVL_1_EPIC_SPIRIT");
- put("Second Master Star", "SECOND_MASTER_STAR");
- put("Spirit Wing", "SPIRIT_WING");
- put("Spirit Bone", "SPIRIT_BONE");
- put("Spirit Stone", "SPIRIT_DECOY");
+ map.put("Second Master Star", "SECOND_MASTER_STAR");
+ map.put("Spirit Wing", "SPIRIT_WING");
+ map.put("Spirit Bone", "SPIRIT_BONE");
+ map.put("Spirit Stone", "SPIRIT_DECOY");
- put("Shadow Fury", "SHADOW_FURY"); // F5 M5
- put("Last Breath", "LAST_BREATH");
- put("Third Master Star", "THIRD_MASTER_STAR");
- put("Warped Stone", "AOTE_STONE");
- put("Livid Dagger", "LIVID_DAGGER");
- put("Shadow Assassin Helmet", "SHADOW_ASSASSIN_HELMET");
- put("Shadow Assassin Chestplate", "SHADOW_ASSASSIN_CHESTPLATE");
- put("Shadow Assassin Leggings", "SHADOW_ASSASSIN_LEGGINGS");
- put("Shadow Assassin Boots", "SHADOW_ASSASSIN_BOOTS");
- put("Shadow Assassin Cloak", "SHADOW_ASSASSIN_CLOAK");
- put("Master Skull - Tier 4", "MASTER_SKULL_TIER_4");
- put("Dark Orb", "DARK_ORB");
+ map.put("Shadow Fury", "SHADOW_FURY"); // F5 M5
+ map.put("Last Breath", "LAST_BREATH");
+ map.put("Third Master Star", "THIRD_MASTER_STAR");
+ map.put("Warped Stone", "AOTE_STONE");
+ map.put("Livid Dagger", "LIVID_DAGGER");
+ map.put("Shadow Assassin Helmet", "SHADOW_ASSASSIN_HELMET");
+ map.put("Shadow Assassin Chestplate", "SHADOW_ASSASSIN_CHESTPLATE");
+ map.put("Shadow Assassin Leggings", "SHADOW_ASSASSIN_LEGGINGS");
+ map.put("Shadow Assassin Boots", "SHADOW_ASSASSIN_BOOTS");
+ map.put("Shadow Assassin Cloak", "SHADOW_ASSASSIN_CLOAK");
+ map.put("Master Skull - Tier 4", "MASTER_SKULL_TIER_4");
+ map.put("Dark Orb", "DARK_ORB");
- put("Precursor Eye", "PRECURSOR_EYE"); // F6 M6
- put("Giant's Sword", "GIANTS_SWORD");
- put("Necromancer Lord Helmet", "NECROMANCER_LORD_HELMET");
- put("Necromancer Lord Chestplate", "NECROMANCER_LORD_CHESTPLATE");
- put("Necromancer Lord Leggings", "NECROMANCER_LORD_LEGGINGS");
- put("Necromancer Lord Boots", "NECROMANCER_LORD_BOOTS");
- put("Fourth Master Star", "FOURTH_MASTER_STAR");
- put("Summoning Ring", "SUMMONING_RING");
- put("Fel Skull", "FEL_SKULL");
- put("Necromancer Sword", "NECROMANCER_SWORD");
- put("Soulweaver Gloves", "SOULWEAVER_GLOVES");
- put("Sadan's Brooch", "SADAN_BROOCH");
- put("Giant Tooth", "GIANT_TOOTH");
+ map.put("Precursor Eye", "PRECURSOR_EYE"); // F6 M6
+ map.put("Giant's Sword", "GIANTS_SWORD");
+ map.put("Necromancer Lord Helmet", "NECROMANCER_LORD_HELMET");
+ map.put("Necromancer Lord Chestplate", "NECROMANCER_LORD_CHESTPLATE");
+ map.put("Necromancer Lord Leggings", "NECROMANCER_LORD_LEGGINGS");
+ map.put("Necromancer Lord Boots", "NECROMANCER_LORD_BOOTS");
+ map.put("Fourth Master Star", "FOURTH_MASTER_STAR");
+ map.put("Summoning Ring", "SUMMONING_RING");
+ map.put("Fel Skull", "FEL_SKULL");
+ map.put("Necromancer Sword", "NECROMANCER_SWORD");
+ map.put("Soulweaver Gloves", "SOULWEAVER_GLOVES");
+ map.put("Sadan's Brooch", "SADAN_BROOCH");
+ map.put("Giant Tooth", "GIANT_TOOTH");
- put("Precursor Gear", "PRECURSOR_GEAR"); // F7 M7
- put("Necron Dye", "DYE_NECRON");
- put("Storm the Fish", "STORM_THE_FISH");
- put("Maxor the Fish", "MAXOR_THE_FISH");
- put("Goldor the Fish", "GOLDOR_THE_FISH");
- put("Dark Claymore", "DARK_CLAYMORE");
- put("Necron's Handle", "NECRON_HANDLE");
- put("Master Skull - Tier 5", "MASTER_SKULL_TIER_5");
- put("Shadow Warp", "SHADOW_WARP_SCROLL");
- put("Wither Shield", "WITHER_SHIELD_SCROLL");
- put("Implosion", "IMPLOSION_SCROLL");
- put("Fifth Master Star", "FIFTH_MASTER_STAR");
- put("Auto Recombobulator", "AUTO_RECOMBOBULATOR");
- put("Wither Helmet", "WITHER_HELMET");
- put("Wither Chestplate", "WITHER_CHESTPLATE");
- put("Wither Leggings", "WITHER_LEGGINGS");
- put("Wither Boots", "WITHER_BOOTS");
- put("Wither Catalyst", "WITHER_CATALYST");
- put("Wither Cloak Sword", "WITHER_CLOAK");
- put("Wither Blood", "WITHER_BLOOD");
+ map.put("Precursor Gear", "PRECURSOR_GEAR"); // F7 M7
+ map.put("Necron Dye", "DYE_NECRON");
+ map.put("Storm the Fish", "STORM_THE_FISH");
+ map.put("Maxor the Fish", "MAXOR_THE_FISH");
+ map.put("Goldor the Fish", "GOLDOR_THE_FISH");
+ map.put("Dark Claymore", "DARK_CLAYMORE");
+ map.put("Necron's Handle", "NECRON_HANDLE");
+ map.put("Master Skull - Tier 5", "MASTER_SKULL_TIER_5");
+ map.put("Shadow Warp", "SHADOW_WARP_SCROLL");
+ map.put("Wither Shield", "WITHER_SHIELD_SCROLL");
+ map.put("Implosion", "IMPLOSION_SCROLL");
+ map.put("Fifth Master Star", "FIFTH_MASTER_STAR");
+ map.put("Auto Recombobulator", "AUTO_RECOMBOBULATOR");
+ map.put("Wither Helmet", "WITHER_HELMET");
+ map.put("Wither Chestplate", "WITHER_CHESTPLATE");
+ map.put("Wither Leggings", "WITHER_LEGGINGS");
+ map.put("Wither Boots", "WITHER_BOOTS");
+ map.put("Wither Catalyst", "WITHER_CATALYST");
+ map.put("Wither Cloak Sword", "WITHER_CLOAK");
+ map.put("Wither Blood", "WITHER_BLOOD");
- put("Shiny Wither Helmet", "SHINY_WITHER_HELMET"); // M7 shiny drops
- put("Shiny Wither Chestplate", "SHINY_WITHER_CHESTPLATE");
- put("Shiny Wither Leggings", "SHINY_WITHER_LEGGINGS");
- put("Shiny Wither Boots", "SHINY_WITHER_BOOTS");
- put("Shiny Necron's Handle", "SHINY_NECRON_HANDLE"); // cool thing
+ map.put("Shiny Wither Helmet", "SHINY_WITHER_HELMET"); // M7 shiny drops
+ map.put("Shiny Wither Chestplate", "SHINY_WITHER_CHESTPLATE");
+ map.put("Shiny Wither Leggings", "SHINY_WITHER_LEGGINGS");
+ map.put("Shiny Wither Boots", "SHINY_WITHER_BOOTS");
+ map.put("Shiny Necron's Handle", "SHINY_NECRON_HANDLE"); // cool thing
- put("Dungeon Disc", "DUNGEON_DISC_1");
- put("Clown Disc", "DUNGEON_DISC_2");
- put("Watcher Disc", "DUNGEON_DISC_3");
- put("Old Disc", "DUNGEON_DISC_4");
- put("Necron Disc", "DUNGEON_DISC_5");
- }};
+ map.put("Dungeon Disc", "DUNGEON_DISC_1");
+ map.put("Clown Disc", "DUNGEON_DISC_2");
+ map.put("Watcher Disc", "DUNGEON_DISC_3");
+ map.put("Old Disc", "DUNGEON_DISC_4");
+ map.put("Necron Disc", "DUNGEON_DISC_5");
+ });
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java
index f2986ec0..7a6cdcd0 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java
@@ -1,25 +1,32 @@
package de.hysky.skyblocker.skyblock.dungeon;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.events.HudRenderEvents;
+import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
+import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.LightmapTextureManager;
import net.minecraft.client.render.MapRenderer;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.component.DataComponentTypes;
+import net.minecraft.component.type.MapIdComponent;
import net.minecraft.item.FilledMapItem;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.item.map.MapState;
public class DungeonMap {
- private static final int DEFAULT_MAP_ID = 1024;
- private static Integer cachedMapId = null;
+ private static final MapIdComponent DEFAULT_MAP_ID_COMPONENT = new MapIdComponent(1024);
+ private static MapIdComponent cachedMapIdComponent = null;
public static void init() {
+ HudRenderEvents.AFTER_MAIN_HUD.register((context, tickDelta) -> render(context));
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker")
.then(ClientCommandManager.literal("hud")
.then(ClientCommandManager.literal("dungeon")
@@ -34,7 +41,7 @@ public class DungeonMap {
MinecraftClient client = MinecraftClient.getInstance();
if (client.player == null || client.world == null) return;
- int mapId = getMapId(client.player.getInventory().main.get(8));
+ MapIdComponent mapId = getMapIdComponent(client.player.getInventory().main.get(8));
MapState state = FilledMapItem.getMapState(mapId, client.world);
if (state == null) return;
@@ -53,16 +60,21 @@ public class DungeonMap {
matrices.pop();
}
- public static int getMapId(ItemStack stack) {
- if (stack.isOf(Items.FILLED_MAP)) {
- @SuppressWarnings("DataFlowIssue")
- int mapId = FilledMapItem.getMapId(stack);
- cachedMapId = mapId;
- return mapId;
- } else return cachedMapId != null ? cachedMapId : DEFAULT_MAP_ID;
+ public static MapIdComponent getMapIdComponent(ItemStack stack) {
+ if (stack.isOf(Items.FILLED_MAP) && stack.contains(DataComponentTypes.MAP_ID)) {
+ MapIdComponent mapIdComponent = stack.get(DataComponentTypes.MAP_ID);
+ cachedMapIdComponent = mapIdComponent;
+ return mapIdComponent;
+ } else return cachedMapIdComponent != null ? cachedMapIdComponent : DEFAULT_MAP_ID_COMPONENT;
+ }
+
+ private static void render(DrawContext context) {
+ if (Utils.isInDungeons() && DungeonScore.isDungeonStarted() && !DungeonManager.isInBoss() && SkyblockerConfigManager.get().locations.dungeons.enableMap) {
+ render(context.getMatrices());
+ }
}
private static void reset() {
- cachedMapId = null;
+ cachedMapIdComponent = null;
}
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScoreHUD.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScoreHUD.java
index 1dfb1b95..8d402172 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScoreHUD.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScoreHUD.java
@@ -1,6 +1,8 @@
package de.hysky.skyblocker.skyblock.dungeon;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.events.HudRenderEvents;
+import de.hysky.skyblocker.utils.Utils;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.util.math.MatrixStack;
@@ -11,13 +13,19 @@ public class DungeonScoreHUD {
private DungeonScoreHUD() {
}
+ public static void init() {
+ HudRenderEvents.AFTER_MAIN_HUD.register((context, tickDelta) -> render(context));
+ }
+
//This is 4+5 wide, needed to offset the extra width from bold numbers (3×1 wide) in S+ and the "+" (6 wide) so that it doesn't go off the screen if the score is S+ and the hud element is at the right edge of the screen
private static final Text extraSpace = Text.literal(" ").append(Text.literal(" ").formatted(Formatting.BOLD));
- public static void render(DrawContext context) {
- int x = SkyblockerConfigManager.get().locations.dungeons.dungeonScore.scoreX;
- int y = SkyblockerConfigManager.get().locations.dungeons.dungeonScore.scoreY;
- render(context, x, y);
+ private static void render(DrawContext context) {
+ if (Utils.isInDungeons() && DungeonScore.isDungeonStarted() && SkyblockerConfigManager.get().locations.dungeons.dungeonScore.enableScoreHUD) {
+ int x = SkyblockerConfigManager.get().locations.dungeons.dungeonScore.scoreX;
+ int y = SkyblockerConfigManager.get().locations.dungeons.dungeonScore.scoreY;
+ render(context, x, y);
+ }
}
public static void render(DrawContext context, int x, int y) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/FireFreezeStaffTimer.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/FireFreezeStaffTimer.java
index e5d4f078..7c0aab4c 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/FireFreezeStaffTimer.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/FireFreezeStaffTimer.java
@@ -1,9 +1,9 @@
package de.hysky.skyblocker.skyblock.dungeon;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.events.HudRenderEvents;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
-import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
@@ -14,7 +14,7 @@ public class FireFreezeStaffTimer {
private static long fireFreezeTimer;
public static void init() {
- HudRenderCallback.EVENT.register(FireFreezeStaffTimer::onDraw);
+ HudRenderEvents.BEFORE_CHAT.register(FireFreezeStaffTimer::onDraw);
ClientReceiveMessageEvents.GAME.register(FireFreezeStaffTimer::onChatMessage);
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> FireFreezeStaffTimer.reset());
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
index 15efe6e4..ee9791d5 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
@@ -16,6 +16,7 @@ import net.minecraft.util.Formatting;
import net.minecraft.util.math.BlockPos;
import java.util.Map;
+import java.util.Set;
public class LividColor {
private static final Map<Block, Formatting> WOOL_TO_FORMATTING = Map.of(
@@ -40,6 +41,7 @@ public class LividColor {
"Doctor Livid", Formatting.GRAY,
"Vendetta Livid", Formatting.WHITE
);
+ public static final Set<String> LIVID_NAMES = Set.copyOf(LIVID_TO_FORMATTING.keySet());
public static final SkyblockerConfig.LividColor CONFIG = SkyblockerConfigManager.get().locations.dungeons.lividColor;
private static int tenTicks = 0;
private static Formatting color;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/FinderSettingsContainer.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/FinderSettingsContainer.java
index 0a048775..70902a17 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/FinderSettingsContainer.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/FinderSettingsContainer.java
@@ -5,7 +5,6 @@ import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
import net.minecraft.client.gui.widget.ContainerWidget;
-import net.minecraft.client.item.TooltipContext;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.screen.GenericContainerScreenHandler;
@@ -15,6 +14,8 @@ import net.minecraft.text.Text;
import java.util.ArrayList;
import java.util.List;
+import de.hysky.skyblocker.utils.ItemUtils;
+
public class FinderSettingsContainer extends ContainerWidget {
private boolean isInitialized = false;
private OptionDropdownWidget floorSelector;
@@ -161,7 +162,7 @@ public class FinderSettingsContainer extends ContainerWidget {
* @return true if all goes well
*/
private boolean setRangeFromTooltip(ItemStack stack, RangedValueWidget widget) {
- for (Text text : stack.getTooltip(null, TooltipContext.BASIC)) {
+ for (Text text : ItemUtils.getLore(stack)) {
String textLowerCase = text.getString().toLowerCase();
if (textLowerCase.contains("selected:")) {
String[] split = text.getString().split(":");
@@ -186,7 +187,7 @@ public class FinderSettingsContainer extends ContainerWidget {
* @return true if all goes well
*/
private boolean setSelectedElementFromTooltip(Slot slot, ItemStack stack, OptionDropdownWidget dropdownWidget) {
- for (Text text : stack.getTooltip(null, TooltipContext.BASIC)) {
+ for (Text text : ItemUtils.getLore(stack)) {
String textLowerCase = text.getString().toLowerCase();
if (textLowerCase.contains("selected:")) {
String[] split = text.getString().split(":");
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/OptionDropdownWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/OptionDropdownWidget.java
index 64e45283..d2159751 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/OptionDropdownWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/OptionDropdownWidget.java
@@ -29,7 +29,6 @@ public class OptionDropdownWidget extends ElementListWidget<OptionDropdownWidget
this.screen = screen;
this.slotId = slotId;
setX(x);
- setRenderBackground(false);
setRenderHeader(true, 25);
this.name = name;
this.selectedOption = selectedOption;
@@ -55,7 +54,7 @@ public class OptionDropdownWidget extends ElementListWidget<OptionDropdownWidget
}
@Override
- protected int getScrollbarPositionX() {
+ protected int getScrollbarX() {
return getRowLeft() + getRowWidth();
}
@@ -120,6 +119,14 @@ public class OptionDropdownWidget extends ElementListWidget<OptionDropdownWidget
matrices.pop();
}
}
+
+ @Override
+ protected void drawHeaderAndFooterSeparators(DrawContext context) {
+ }
+
+ @Override
+ protected void drawMenuListBackground(DrawContext context) {
+ }
public void open(List<Option> entries, int backButtonId) {
isOpen = true;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java
index b53047d8..a9ffafec 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java
@@ -1,8 +1,9 @@
package de.hysky.skyblocker.skyblock.dungeon.partyfinder;
-import com.mojang.brigadier.exceptions.CommandSyntaxException;
+import com.mojang.authlib.properties.PropertyMap;
import de.hysky.skyblocker.SkyblockerMod;
-import de.hysky.skyblocker.mixin.accessor.SkullBlockEntityAccessor;
+import de.hysky.skyblocker.mixins.accessors.SkullBlockEntityAccessor;
+import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
@@ -12,10 +13,10 @@ import net.minecraft.client.gui.Selectable;
import net.minecraft.client.gui.widget.ElementListWidget;
import net.minecraft.client.util.DefaultSkinHelper;
import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.component.DataComponentTypes;
+import net.minecraft.component.type.ProfileComponent;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
-import net.minecraft.nbt.NbtCompound;
-import net.minecraft.nbt.StringNbtReader;
import net.minecraft.text.Style;
import net.minecraft.text.Text;
import net.minecraft.text.TextColor;
@@ -24,7 +25,10 @@ import net.minecraft.util.Identifier;
import java.util.Arrays;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
+import java.util.Optional;
+import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -32,13 +36,14 @@ public class PartyEntry extends ElementListWidget.Entry<PartyEntry> {
private static final Identifier PARTY_CARD_TEXTURE = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/party_card.png");
private static final Identifier PARTY_CARD_TEXTURE_HOVER = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/party_card_hover.png");
public static final Text JOIN_TEXT = Text.translatable("skyblocker.partyFinder.join");
+ private static final Map<String, ProfileComponent> SKULL_CACHE = new Object2ObjectOpenHashMap<>();
protected final PartyFinderScreen screen;
protected final int slotID;
Player partyLeader;
String floor = "???";
String dungeon = "???";
String note = "";
- NbtCompound floorSkullNBT = new NbtCompound();
+ PropertyMap floorSkullProperties = new PropertyMap();
Identifier partyLeaderSkin = DefaultSkinHelper.getTexture();
Player[] partyMembers = new Player[4];
@@ -66,7 +71,7 @@ public class PartyEntry extends ElementListWidget.Entry<PartyEntry> {
String partyHost = title.getString().split("'s")[0];
int membersIndex = -1;
- for (int i = 1; i < tooltips.size(); i++) {
+ for (int i = 0; i < tooltips.size(); i++) {
Text text = tooltips.get(i);
String tooltipText = Formatting.strip(text.getString());
assert tooltipText != null;
@@ -87,14 +92,14 @@ public class PartyEntry extends ElementListWidget.Entry<PartyEntry> {
if (PartyFinderScreen.floorIconsMaster == null || PartyFinderScreen.floorIconsNormal == null) continue;
if (dungeon.contains("Master Mode")) {
try {
- floorSkullNBT = StringNbtReader.parse(PartyEntryListWidget.BASE_SKULL_NBT.replace("%TEXTURE%", PartyFinderScreen.floorIconsMaster.getOrDefault(floor.toLowerCase(), "")));
- } catch (CommandSyntaxException e) {
+ floorSkullProperties = PartyFinderScreen.floorIconsMaster.getOrDefault(floor.toLowerCase(), new PropertyMap());
+ } catch (Exception e) {
throw new RuntimeException(e);
}
} else {
try {
- floorSkullNBT = StringNbtReader.parse(PartyEntryListWidget.BASE_SKULL_NBT.replace("%TEXTURE%", PartyFinderScreen.floorIconsNormal.getOrDefault(floor.toLowerCase(), "")));
- } catch (CommandSyntaxException e) {
+ floorSkullProperties = PartyFinderScreen.floorIconsNormal.getOrDefault(floor.toLowerCase(), new PropertyMap());
+ } catch (Exception e) {
throw new RuntimeException(e);
}
}
@@ -143,7 +148,7 @@ public class PartyEntry extends ElementListWidget.Entry<PartyEntry> {
if (matcher.find()) classLevel = Integer.parseInt(matcher.group(1));
Player player = new Player(playerName, className, classLevel);
- SkullBlockEntityAccessor.invokeFetchProfile(playerNameTrim).thenAccept(
+ SkullBlockEntityAccessor.invokeFetchProfileByName(playerNameTrim).thenAccept(
gameProfile -> gameProfile.ifPresent(profile -> player.skinTexture = (client.getSkinProvider().getSkinTextures(profile).texture())));
if (playerNameTrim.equals(partyHost)) {
@@ -168,7 +173,7 @@ public class PartyEntry extends ElementListWidget.Entry<PartyEntry> {
partyLeader = new Player(Text.literal("Error"), "Error", -1);
}
- SkullBlockEntityAccessor.invokeFetchProfile(partyLeader.name.getString()).thenAccept(
+ SkullBlockEntityAccessor.invokeFetchProfileByName(partyLeader.name.getString()).thenAccept(
gameProfile -> gameProfile.ifPresent(profile -> partyLeaderSkin = client.getSkinProvider().getSkinTextures(profile).texture()));
}
@@ -226,7 +231,7 @@ public class PartyEntry extends ElementListWidget.Entry<PartyEntry> {
}
}
ItemStack stack = new ItemStack(Items.PLAYER_HEAD);
- stack.setNbt(floorSkullNBT);
+ stack.set(DataComponentTypes.PROFILE, SKULL_CACHE.computeIfAbsent("SkyblockerCustomPFSkull" + dungeon + floor, name -> new ProfileComponent(Optional.of(name), Optional.of(UUID.randomUUID()), floorSkullProperties)));
context.drawItem(stack, 317, 3);
int textWidth = textRenderer.getWidth(floor);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntryListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntryListWidget.java
index 640f71bd..385b97f0 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntryListWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntryListWidget.java
@@ -68,7 +68,7 @@ public class PartyEntryListWidget extends ElementListWidget<PartyEntry> {
}
@Override
- protected int getScrollbarPositionX() {
+ protected int getScrollbarX() {
return this.width / 2 + getRowWidth() / 2 + 2;
}
@@ -97,4 +97,12 @@ public class PartyEntryListWidget extends ElementListWidget<PartyEntry> {
context.drawTextWrapped(textRenderer, string, getRowLeft(), getY() + 10, getRowWidth(), 0xFFFFFFFF);
} else super.renderWidget(context, mouseX, mouseY, delta);
}
+
+ @Override
+ protected void drawHeaderAndFooterSeparators(DrawContext context) {
+ }
+
+ @Override
+ protected void drawMenuListBackground(DrawContext context) {
+ }
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java
index 16be2b67..fc66ab06 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java
@@ -1,7 +1,10 @@
package de.hysky.skyblocker.skyblock.dungeon.partyfinder;
import com.google.gson.JsonObject;
+import com.mojang.authlib.properties.PropertyMap;
+
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.utils.ItemUtils;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.minecraft.block.entity.SignBlockEntity;
import net.minecraft.client.MinecraftClient;
@@ -10,7 +13,6 @@ import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.TextFieldWidget;
-import net.minecraft.client.item.TooltipContext;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.client.toast.SystemToast;
import net.minecraft.entity.player.PlayerInventory;
@@ -99,8 +101,8 @@ public class PartyFinderScreen extends Screen {
private boolean waitingForServer = false;
- public static Map<String, String> floorIconsNormal = null;
- public static Map<String, String> floorIconsMaster = null;
+ public static Map<String, PropertyMap> floorIconsNormal = null;
+ public static Map<String, PropertyMap> floorIconsMaster = null;
public static void initClass() {
ClientLifecycleEvents.CLIENT_STARTED.register(client -> {
@@ -110,8 +112,8 @@ public class PartyFinderScreen extends Screen {
floorIconsMaster = new HashMap<>();
try (BufferedReader skullTextureReader = client.getResourceManager().openAsReader(new Identifier(SkyblockerMod.NAMESPACE, "dungeons/catacombs/floorskulls.json"))) {
JsonObject json = SkyblockerMod.GSON.fromJson(skullTextureReader, JsonObject.class);
- json.getAsJsonObject("normal").asMap().forEach((s, jsonElement) -> floorIconsNormal.put(s, jsonElement.getAsString()));
- json.getAsJsonObject("master").asMap().forEach((s, jsonElement) -> floorIconsMaster.put(s, jsonElement.getAsString()));
+ json.getAsJsonObject("normal").asMap().forEach((s, tex) -> floorIconsNormal.put(s, ItemUtils.propertyMapWithTexture(tex.getAsString())));
+ json.getAsJsonObject("master").asMap().forEach((s, tex) -> floorIconsMaster.put(s, ItemUtils.propertyMapWithTexture(tex.getAsString())));
LOGGER.debug("[Skyblocker] Dungeons floor skull textures json loaded");
} catch (Exception e) {
LOGGER.error("[Skyblocker] Failed to load dungeons floor skull textures json", e);
@@ -136,7 +138,6 @@ public class PartyFinderScreen extends Screen {
int widget_height = (int) (this.height * 0.8);
int entryListTopY = Math.max(43, (int) (height * 0.1));
this.partyEntryListWidget = new PartyEntryListWidget(client, width, widget_height, entryListTopY, 68);
- partyEntryListWidget.setRenderBackground(false);
// Search field
this.searchField = new TextFieldWidget(textRenderer, partyEntryListWidget.getRowLeft() + 12, entryListTopY - 12, partyEntryListWidget.getRowWidth() - 12 * 3 - 6, 12, Text.literal("Search..."));
@@ -370,7 +371,7 @@ public class PartyFinderScreen extends Screen {
if (slot.id > (handler.getRows() - 1) * 9 - 1 || !slot.hasStack()) continue;
if (slot.getStack().isOf(Items.PLAYER_HEAD)) {
assert this.client != null;
- parties.add(new PartyEntry(slot.getStack().getTooltip(this.client.player, TooltipContext.BASIC), this, slot.id));
+ parties.add(new PartyEntry(ItemUtils.getLore(slot.getStack()), this, slot.id));
} else if (slot.getStack().isOf(Items.ARROW) && slot.getStack().getName().getString().toLowerCase().contains("previous")) {
prevPageSlotId = slot.id;
previousPageButton.active = true;
@@ -399,7 +400,7 @@ public class PartyFinderScreen extends Screen {
deListSlotId = slot.id;
} else if (slot.getStack().isOf(Items.PLAYER_HEAD)) {
assert this.client != null;
- tooltips = slot.getStack().getTooltip(this.client.player, TooltipContext.BASIC);
+ tooltips = new ArrayList<>(ItemUtils.getLore(slot.getStack()));
}
}
if (tooltips != null) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdos.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdos.java
index c5e55f93..fd7a8dbf 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdos.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdos.java
@@ -12,7 +12,7 @@ import java.util.regex.Matcher;
public class ThreeWeirdos extends ChatPatternListener {
public ThreeWeirdos() {
- super("^§e\\[NPC] §c([A-Z][a-z]+)§f: (?:The reward is(?: not in my chest!|n't in any of our chests\\.)|My chest (?:doesn't have the reward\\. We are all telling the truth\\.|has the reward and I'm telling the truth!)|At least one of them is lying, and the reward is not in §c§c[A-Z][a-z]+'s §rchest\\!|Both of them are telling the truth\\. Also, §c§c[A-Z][a-z]+ §rhas the reward in their chest\\!)$");
+ super("^\\[NPC] ([A-Z][a-z]+): (?:The reward is(?: not in my chest!|n't in any of our chests\\.)|My chest (?:doesn't have the reward\\. We are all telling the truth\\.|has the reward and I'm telling the truth!)|At least one of them is lying, and the reward is not in [A-Z][a-z]+'s chest\\!|Both of them are telling the truth\\. Also, [A-Z][a-z]+ has the reward in their chest\\!)$");
}
@Override
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/TicTacToe.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/TicTacToe.java
index a9b88b3d..1683276e 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/TicTacToe.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/TicTacToe.java
@@ -4,11 +4,11 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.RenderHelper;
+import de.hysky.skyblocker.utils.tictactoe.BoardIndex;
import de.hysky.skyblocker.utils.tictactoe.TicTacToeUtils;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.decoration.ItemFrameEntity;
-import net.minecraft.item.FilledMapItem;
import net.minecraft.item.map.MapState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
@@ -50,11 +50,12 @@ public class TicTacToe extends DungeonPuzzle {
try {
//Only attempt to solve if the puzzle wasn't just completed and if its the player's turn
- if (itemFramesThatHoldMaps.size() != 9 && itemFramesThatHoldMaps.size() % 2 == 1) {
+ //The low bit will always be set to 1 on odd numbers
+ if (itemFramesThatHoldMaps.size() != 9 && (itemFramesThatHoldMaps.size() & 1) == 1) {
char[][] board = new char[3][3];
for (ItemFrameEntity itemFrame : itemFramesThatHoldMaps) {
- MapState mapState = client.world.getMapState(FilledMapItem.getMapName(itemFrame.getMapId().getAsInt()));
+ MapState mapState = client.world.getMapState(itemFrame.getMapId());
if (mapState == null) continue;
@@ -84,7 +85,7 @@ public class TicTacToe extends DungeonPuzzle {
if (row == -1 || column == -1) continue;
//Get the color of the middle pixel of the map which determines whether its X or O
- int middleColor = mapState.colors[8256] & 255;
+ int middleColor = mapState.colors[8256] & 0xFF;
if (middleColor == 114) {
board[row][column] = 'X';
@@ -93,11 +94,11 @@ public class TicTacToe extends DungeonPuzzle {
}
}
- int bestMove = TicTacToeUtils.getBestMove(board) - 1;
+ BoardIndex bestMove = TicTacToeUtils.getBestMove(board);
double nextX = 8;
- double nextY = 72 - (double) (bestMove / 3);
- double nextZ = 17 - (bestMove % 3);
+ double nextY = 72 - bestMove.row();
+ double nextZ = 17 - bestMove.column();
BlockPos nextPos = DungeonManager.getCurrentRoom().relativeToActual(BlockPos.ofFloored(nextX, nextY, nextZ));
nextBestMoveToMake = new Box(nextPos);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/Trivia.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/Trivia.java
index c331bd48..eb09cf6e 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/Trivia.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/Trivia.java
@@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.dungeon.puzzle;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.waypoint.FairySouls;
+import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.chat.ChatFilterResult;
import de.hysky.skyblocker.utils.chat.ChatPatternListener;
import net.minecraft.client.MinecraftClient;
@@ -23,7 +24,7 @@ public class Trivia extends ChatPatternListener {
private List<String> solutions = Collections.emptyList();
public Trivia() {
- super("^ +(?:([A-Za-z,' ]*\\?)|§6 ([ⓐⓑⓒ]) §a([a-zA-Z0-9 ]+))$");
+ super("^ +(?:([A-Za-z,' ]*\\?)| ([ⓐⓑⓒ]) ([a-zA-Z0-9 ]+))$");
}
@Override
@@ -38,7 +39,7 @@ public class Trivia extends ChatPatternListener {
if (!solutions.contains(riddle)) {
ClientPlayerEntity player = MinecraftClient.getInstance().player;
if (player != null)
- MinecraftClient.getInstance().player.sendMessage(Text.of(" " + Formatting.GOLD + matcher.group(2) + Formatting.RED + " " + riddle), false);
+ Utils.sendMessageToBypassEvents(Text.of(" " + Formatting.GOLD + matcher.group(2) + Formatting.RED + " " + riddle));
return player != null;
}
} else updateSolutions(matcher.group(0));
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/waterboard/Waterboard.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/waterboard/Waterboard.java
index ba4b9a5f..2efadfda 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/waterboard/Waterboard.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/waterboard/Waterboard.java
@@ -119,13 +119,12 @@ public class Waterboard extends DungeonPuzzle {
for (Cell[] row : cells) {
sb.append("\n");
for (Cell cell : row) {
- if (cell == null) {
- sb.append('?');
- } else if (cell instanceof SwitchCell switchCell) {
- sb.append(switchCell.id);
- } else switch (cell.type) {
- case BLOCK -> sb.append('#');
- case EMPTY -> sb.append('.');
+ switch (cell) {
+ case SwitchCell switchCell -> sb.append(switchCell.id);
+ case Cell c when c.type == Cell.Type.BLOCK -> sb.append('#');
+ case Cell c when c.type == Cell.Type.EMPTY -> sb.append('.');
+
+ case null, default -> sb.append('?');
}
}
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java
index 86997cd3..8bb22e7e 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java
@@ -35,10 +35,12 @@ import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
import net.fabricmc.fabric.api.event.player.UseBlockCallback;
import net.minecraft.block.Blocks;
import net.minecraft.client.MinecraftClient;
+import net.minecraft.command.CommandRegistryAccess;
import net.minecraft.command.CommandSource;
import net.minecraft.command.argument.BlockPosArgumentType;
import net.minecraft.command.argument.PosArgument;
import net.minecraft.command.argument.TextArgumentType;
+import net.minecraft.component.DataComponentTypes;
import net.minecraft.entity.Entity;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LivingEntity;
@@ -244,8 +246,8 @@ public class DungeonManager {
.then(literal("markAsMissing").then(markSecretsCommand(false)))
.then(literal("getRelativePos").executes(DungeonManager::getRelativePos))
.then(literal("getRelativeTargetPos").executes(DungeonManager::getRelativeTargetPos))
- .then(literal("addWaypoint").then(addCustomWaypointCommand(false)))
- .then(literal("addWaypointRelatively").then(addCustomWaypointCommand(true)))
+ .then(literal("addWaypoint").then(addCustomWaypointCommand(false, registryAccess)))
+ .then(literal("addWaypointRelatively").then(addCustomWaypointCommand(true, registryAccess)))
.then(literal("removeWaypoint").then(removeCustomWaypointCommand(false)))
.then(literal("removeWaypointRelatively").then(removeCustomWaypointCommand(true)))
))));
@@ -385,11 +387,11 @@ public class DungeonManager {
return Command.SINGLE_SUCCESS;
}
- private static RequiredArgumentBuilder<FabricClientCommandSource, PosArgument> addCustomWaypointCommand(boolean relative) {
+ private static RequiredArgumentBuilder<FabricClientCommandSource, PosArgument> addCustomWaypointCommand(boolean relative, CommandRegistryAccess registryAccess) {
return argument("pos", BlockPosArgumentType.blockPos())
.then(argument("secretIndex", IntegerArgumentType.integer())
.then(argument("category", SecretWaypoint.Category.CategoryArgumentType.category())
- .then(argument("name", TextArgumentType.text()).executes(context -> {
+ .then(argument("name", TextArgumentType.text(registryAccess)).executes(context -> {
// TODO Less hacky way with custom ClientBlockPosArgumentType
BlockPos pos = context.getArgument("pos", PosArgument.class).toAbsoluteBlockPos(new ServerCommandSource(null, context.getSource().getPosition(), context.getSource().getRotation(), null, 0, null, null, null, null));
return relative ? addCustomWaypointRelative(context, pos) : addCustomWaypoint(context, pos);
@@ -461,7 +463,7 @@ public class DungeonManager {
context.getSource().sendError(Constants.PREFIX.get().append("§cFailed to get dungeon map."));
return Command.SINGLE_SUCCESS;
}
- MapState map = FilledMapItem.getMapState(FilledMapItem.getMapId(stack), client.world);
+ MapState map = FilledMapItem.getMapState(stack.get(DataComponentTypes.MAP_ID), client.world);
if (map == null) {
context.getSource().sendError(Constants.PREFIX.get().append("§cFailed to get dungeon map state."));
return Command.SINGLE_SUCCESS;
@@ -538,7 +540,7 @@ public class DungeonManager {
physicalEntrancePos = DungeonMapUtils.getPhysicalRoomPos(playerPos);
currentRoom = newRoom(Room.Type.ENTRANCE, physicalEntrancePos);
}
- MapState map = FilledMapItem.getMapState(DungeonMap.getMapId(client.player.getInventory().main.get(8)), client.world);
+ MapState map = FilledMapItem.getMapState(DungeonMap.getMapIdComponent(client.player.getInventory().main.get(8)), client.world);
if (map == null) {
return;
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java
index 8e0073f7..5474224a 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java
@@ -5,7 +5,8 @@ import it.unimi.dsi.fastutil.ints.IntSortedSet;
import it.unimi.dsi.fastutil.objects.ObjectIntPair;
import net.minecraft.block.Blocks;
import net.minecraft.block.MapColor;
-import net.minecraft.item.map.MapIcon;
+import net.minecraft.item.map.MapDecoration;
+import net.minecraft.item.map.MapDecorationTypes;
import net.minecraft.item.map.MapState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
@@ -45,9 +46,9 @@ public class DungeonMapUtils {
@Nullable
private static Vector2i getMapPlayerPos(MapState map) {
- for (MapIcon icon : map.getIcons()) {
- if (icon.type() == MapIcon.Type.FRAME) {
- return new Vector2i((icon.x() >> 1) + 64, (icon.z() >> 1) + 64);
+ for (MapDecoration decoration : map.getDecorations()) {
+ if (decoration.type().value().equals(MapDecorationTypes.FRAME.value())) {
+ return new Vector2i((decoration.x() >> 1) + 64, (decoration.z() >> 1) + 64);
}
}
return null;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java
index 6e9eb02d..933fefa9 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java
@@ -3,6 +3,7 @@ package de.hysky.skyblocker.skyblock.dungeon.terminal;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
@@ -32,7 +33,7 @@ public class ColorTerminal extends ContainerSolver {
}
@Override
- protected List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> slots) {
+ protected List<ColorHighlight> getColors(String[] groups, Int2ObjectMap<ItemStack> slots) {
trimEdges(slots, 6);
List<ColorHighlight> highlights = new ArrayList<>();
String colorString = groups[0];
@@ -43,10 +44,10 @@ public class ColorTerminal extends ContainerSolver {
return Collections.emptyList();
}
}
- for (Map.Entry<Integer, ItemStack> slot : slots.entrySet()) {
+ for (Int2ObjectMap.Entry<ItemStack> slot : slots.int2ObjectEntrySet()) {
ItemStack itemStack = slot.getValue();
- if (!itemStack.hasEnchantments() && targetColor.equals(itemColor.get(itemStack.getItem()))) {
- highlights.add(ColorHighlight.green(slot.getKey()));
+ if (!itemStack.hasGlint() && targetColor.equals(itemColor.get(itemStack.getItem()))) {
+ highlights.add(ColorHighlight.green(slot.getIntKey()));
}
}
return highlights;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java
index b2636373..4789e0f4 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java
@@ -3,13 +3,13 @@ package de.hysky.skyblocker.skyblock.dungeon.terminal;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import java.util.Map;
public class OrderTerminal extends ContainerSolver {
private final int PANES_NUM = 14;
@@ -28,7 +28,7 @@ public class OrderTerminal extends ContainerSolver {
}
@Override
- protected List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> slots) {
+ protected List<ColorHighlight> getColors(String[] groups, Int2ObjectMap<ItemStack> slots) {
if(orderedSlots == null && !orderSlots(slots))
return Collections.emptyList();
while(currentNum < PANES_NUM && Items.LIME_STAINED_GLASS_PANE.equals(slots.get(orderedSlots[currentNum]).getItem()))
@@ -41,16 +41,16 @@ public class OrderTerminal extends ContainerSolver {
return highlights;
}
- public boolean orderSlots(Map<Integer, ItemStack> slots) {
+ public boolean orderSlots(Int2ObjectMap<ItemStack> slots) {
trimEdges(slots, 4);
orderedSlots = new int[PANES_NUM];
- for(Map.Entry<Integer, ItemStack> slot : slots.entrySet()) {
+ for(Int2ObjectMap.Entry<ItemStack> slot : slots.int2ObjectEntrySet()) {
if(Items.AIR.equals(slot.getValue().getItem())) {
orderedSlots = null;
return false;
}
else
- orderedSlots[slot.getValue().getCount() - 1] = slot.getKey();
+ orderedSlots[slot.getValue().getCount() - 1] = slot.getIntKey();
}
currentNum = 0;
return true;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java
index 5f856af2..0bfb896e 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java
@@ -3,33 +3,124 @@ package de.hysky.skyblocker.skyblock.dungeon.terminal;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.objects.ObjectSet;
+import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
+import java.util.function.Predicate;
public class StartsWithTerminal extends ContainerSolver {
- public StartsWithTerminal() {
- super("^What starts with: '([A-Z])'\\?$");
- }
-
- @Override
- protected boolean isEnabled() {
- return SkyblockerConfigManager.get().locations.dungeons.terminals.solveStartsWith;
- }
-
- @Override
- protected List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> slots) {
- trimEdges(slots, 6);
- String prefix = groups[0];
- List<ColorHighlight> highlights = new ArrayList<>();
- for (Map.Entry<Integer, ItemStack> slot : slots.entrySet()) {
- ItemStack stack = slot.getValue();
- if (!stack.hasEnchantments() && stack.getName().getString().startsWith(prefix)) {
- highlights.add(ColorHighlight.green(slot.getKey()));
- }
- }
- return highlights;
- }
+ private final Int2ObjectOpenHashMap<ItemState> trackedItemStates = new Int2ObjectOpenHashMap<>();
+ private int lastKnownScreenId = Integer.MIN_VALUE;
+
+ public StartsWithTerminal() {
+ super("^What starts with: '([A-Z])'\\?$");
+ }
+
+ @Override
+ protected boolean isEnabled() {
+ return SkyblockerConfigManager.get().locations.dungeons.terminals.solveStartsWith;
+ }
+
+ @Override
+ protected List<ColorHighlight> getColors(String[] groups, Int2ObjectMap<ItemStack> slots) {
+ trimEdges(slots, 6);
+ setupState(slots);
+
+ String prefix = groups[0];
+ List<ColorHighlight> highlights = new ArrayList<>();
+
+ for (Int2ObjectMap.Entry<ItemStack> slot : slots.int2ObjectEntrySet()) {
+ ItemStack stack = slot.getValue();
+ ItemState state = trackedItemStates.getOrDefault(slot.getIntKey(), ItemState.DEFAULT);
+
+ //If the item hasn't been marked as clicked and it matches the starts with condition
+ //We keep track of the clicks ourselves instead of using the enchantment glint because some items like nether stars have the glint override component by default
+ //so even if Hypixel tries to change that to the same thing it was before (true) it won't work and the solver would permanently consider the item to be clicked
+ //even if it hasn't been yet
+ if (!state.clicked() && stack.getName().getString().startsWith(prefix)) {
+ highlights.add(ColorHighlight.green(slot.getIntKey()));
+ }
+ }
+ return highlights;
+ }
+
+ @Override
+ protected void onClickSlot(int slot, ItemStack stack, int screenId, String[] groups) {
+ //Some random glass pane was clicked or something
+ if (!trackedItemStates.containsKey(slot) || stack == null || stack.isEmpty()) return;
+
+ ItemState state = trackedItemStates.get(slot);
+ String prefix = groups[0];
+
+ //If the item stack's name starts with the correct letter
+ //Also, since Hypixel closes & reopens the GUI after every click we check if the last known screen id is the same that way in case the server lags and
+ //either a player tries to click a second item or if the player puts the clicked item back and tries to click another that we don't mark multiple items
+ //as clicked when only the first one will count.
+
+ //While Hypixel does use a different syncId each time they open the screen we opt to use our own so as to avoid them potentially changing that
+ //and in turn breaking this logic
+ if (stack.getName().getString().startsWith(prefix) && !state.clicked() && lastKnownScreenId != screenId) {
+ trackedItemStates.put(slot, state.click());
+ lastKnownScreenId = screenId;
+ }
+ //In the future we could add an else branch and return a boolean to cancel the click since it would be wrong
+
+ return;
+ }
+
+ //We only setup the state when all items aren't null or empty. This prevents the state from being reset due to unsent items or server lag spikes/bad TPS (fix ur servers Hypixel)
+ private void setupState(Int2ObjectMap<ItemStack> usefulSlots) {
+ Predicate<Int2ObjectMap.Entry<ItemStack>> notNullOrEmpty = e -> e.getValue() != null && !e.getValue().isEmpty();
+
+ if (allEntriesMatch(usefulSlots.int2ObjectEntrySet(), notNullOrEmpty)) {
+ //If the state hasn't been setup then we will do that
+ if (trackedItemStates.isEmpty()) {
+ for (Int2ObjectMap.Entry<ItemStack> entry : usefulSlots.int2ObjectEntrySet()) {
+ trackedItemStates.put(entry.getIntKey(), ItemState.of(entry.getValue().getItem()));
+ }
+ } else { //If the state is setup then we verify that it hasn't changed since last time, and if it has then we will clear it and call this method again to set it up
+ //Checks whether the trackedItemStates contains the slot id and if it does it checks whether the tracked state's item is a 1:1 match
+ Predicate<Int2ObjectMap.Entry<ItemStack>> doesItemMatch = e -> trackedItemStates.containsKey(e.getIntKey()) && trackedItemStates.get(e.getIntKey()).itemMatches(e.getValue().getItem());
+
+ if (!allEntriesMatch(usefulSlots.int2ObjectEntrySet(), doesItemMatch)) {
+ clearState();
+ setupState(usefulSlots);
+ }
+ }
+ }
+ }
+
+ private void clearState() {
+ trackedItemStates.clear();
+ lastKnownScreenId = Integer.MIN_VALUE;
+ }
+
+ private static boolean allEntriesMatch(ObjectSet<Int2ObjectMap.Entry<ItemStack>> entries, Predicate<Int2ObjectMap.Entry<ItemStack>> predicate) {
+ for (Int2ObjectMap.Entry<ItemStack> entry : entries) {
+ if (!predicate.test(entry)) return false;
+ }
+
+ return true;
+ }
+
+ private record ItemState(Item item, boolean clicked) {
+ private static final ItemState DEFAULT = new ItemState(null, false);
+
+ boolean itemMatches(Item item) {
+ return this.item.equals(item);
+ }
+
+ ItemState click() {
+ return new ItemState(item, true);
+ }
+
+ static ItemState of(Item item) {
+ return new ItemState(item, false);
+ }
+ }
} \ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java
index 79e81ad0..a4af804c 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java
@@ -2,16 +2,15 @@ package de.hysky.skyblocker.skyblock.dwarven;
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.events.HudRenderEvents;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
-import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Identifier;
-import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RotationAxis;
import org.joml.Vector2i;
import org.joml.Vector2ic;
@@ -23,9 +22,10 @@ import java.util.Map;
public class CrystalsHud {
private static final MinecraftClient CLIENT = MinecraftClient.getInstance();
protected static final Identifier MAP_TEXTURE = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/crystals_map.png");
- private static final Identifier MAP_ICON = new Identifier("textures/map/map_icons.png");
+ private static final Identifier MAP_ICON = new Identifier("textures/map/decorations/player.png");
private static final List<String> SMALL_LOCATIONS = List.of("Fairy Grotto", "King Yolkar", "Corleone", "Odawa", "Key Guardian");
+
public static boolean visible = false;
public static void init() {
@@ -34,7 +34,7 @@ public class CrystalsHud {
.then(ClientCommandManager.literal("crystals")
.executes(Scheduler.queueOpenScreenCommand(CrystalsHudConfigScreen::new))))));
- HudRenderCallback.EVENT.register((context, tickDelta) -> {
+ HudRenderEvents.AFTER_MAIN_HUD.register((context, tickDelta) -> {
if (!SkyblockerConfigManager.get().locations.dwarvenMines.crystalsHud.enabled
|| CLIENT.player == null
|| !visible) {
@@ -65,7 +65,7 @@ public class CrystalsHud {
//and set position and scale
MatrixStack matrices = context.getMatrices();
matrices.push();
- matrices.translate(hudX, hudY, 200f);
+ matrices.translate(hudX, hudY, 0f);
matrices.scale(scale, scale, 0f);
//draw map texture
@@ -109,7 +109,7 @@ public class CrystalsHud {
matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(yaw2Cardinal(playerRotation)), 2.5f, 3.5f, 0);
//draw marker on map
- context.drawTexture(MAP_ICON, 0, 0, 2, 0, 5, 7, 128, 128);
+ context.drawTexture(MAP_ICON, 0, 0, 2, 0, 5, 7, 8, 8);
//todo add direction (can not work out how to rotate)
matrices.pop();
@@ -126,8 +126,8 @@ public class CrystalsHud {
//converts an x and z to a location on the map
int transformedX = (int) ((x - 202) / 621 * 62);
int transformedY = (int) ((z - 202) / 621 * 62);
- transformedX = MathHelper.clamp(transformedX, 0, 62);
- transformedY = MathHelper.clamp(transformedY, 0, 62);
+ transformedX = Math.clamp(transformedX, 0, 62);
+ transformedY = Math.clamp(transformedY, 0, 62);
return new Vector2i(transformedX, transformedY);
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java
index 86a8e685..a5b9fa24 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java
@@ -1,6 +1,8 @@
package de.hysky.skyblocker.skyblock.dwarven;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.events.HudRenderEvents;
+import de.hysky.skyblocker.mixins.accessors.PlayerListHudAccessor;
import de.hysky.skyblocker.skyblock.tabhud.util.Colors;
import de.hysky.skyblocker.skyblock.tabhud.widget.hud.HudCommsWidget;
import de.hysky.skyblocker.skyblock.tabhud.widget.hud.HudPowderWidget;
@@ -8,7 +10,6 @@ import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
-import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.network.PlayerListEntry;
@@ -32,7 +33,7 @@ public class DwarvenHud {
private static final List<Pattern> COMMISSIONS = Stream.of(
"(?:Titanium|Mithril|Hard Stone) Miner",
- "(?:Glacite Walker|Golden Goblin|(?<!Golden )Goblin|Goblin Raid|Treasure Hoarder|Automaton|Sludge|Team Treasurite Member|Yog|Boss Corleone|Thyst) Slayer",
+ "(?:Glacite Walker|Golden Goblin|(?<!Golden )Goblin|Goblin Raid|Treasure Hoarder|Automaton|Sludge|Team Treasurite Member|Yog|Boss Corleone|Thyst|Maniac) Slayer",
"(?:Lava Springs|Cliffside Veins|Rampart's Quarry|Upper Mines|Royal Mines) Mithril",
"(?:Lava Springs|Cliffside Veins|Rampart's Quarry|Upper Mines|Royal Mines) Titanium",
"Goblin Raid",
@@ -60,7 +61,7 @@ public class DwarvenHud {
)
));
- HudRenderCallback.EVENT.register((context, tickDelta) -> {
+ HudRenderEvents.AFTER_MAIN_HUD.register((context, tickDelta) -> {
if (!SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledCommissions && !SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledPowder
|| CLIENT.options.playerListKey.isPressed()
|| CLIENT.player == null
@@ -169,7 +170,7 @@ public class DwarvenHud {
commissionList = new ArrayList<>();
- for (PlayerListEntry playerListEntry : CLIENT.getNetworkHandler().getPlayerList()) {
+ for (PlayerListEntry playerListEntry : CLIENT.getNetworkHandler().getPlayerList().stream().sorted(PlayerListHudAccessor.getOrdering()).toList()) {
if (playerListEntry.getDisplayName() == null) {
continue;
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/Fetchur.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/Fetchur.java
index 27cd62ad..2ddaf6b5 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/Fetchur.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/Fetchur.java
@@ -18,7 +18,7 @@ public class Fetchur extends ChatPatternListener {
private static final Map<String, String> answers;
public Fetchur() {
- super("^§e\\[NPC] Fetchur§f: (?:its|theyre) ([a-zA-Z, \\-]*)$");
+ super("^\\[NPC] Fetchur: (?:its|theyre) ([a-zA-Z, \\-]*)$");
}
@Override
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/Puzzler.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/Puzzler.java
index fae845b5..1f5c0c90 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/Puzzler.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/Puzzler.java
@@ -13,7 +13,7 @@ import java.util.regex.Matcher;
public class Puzzler extends ChatPatternListener {
public Puzzler() {
- super("^§e\\[NPC] §dPuzzler§f: ((?:§d▲|§5▶|§b◀|§a▼){10})$");
+ super("^\\[NPC] Puzzler: ((?:▲|▶|◀|▼){10})$");
}
@Override
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java
index 30de9a48..ca3c8cd8 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java
@@ -4,6 +4,8 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.tabhud.widget.Widget;
import de.hysky.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent;
import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent;
+import net.minecraft.component.DataComponentTypes;
+import net.minecraft.component.type.ProfileComponent;
import net.minecraft.enchantment.Enchantments;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
@@ -12,6 +14,9 @@ import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import java.text.NumberFormat;
+import java.util.Optional;
+
+import com.mojang.authlib.properties.PropertyMap;
public class EndHudWidget extends Widget {
private static final MutableText TITLE = Text.literal("The End").formatted(Formatting.LIGHT_PURPLE, Formatting.BOLD);
@@ -29,7 +34,7 @@ public class EndHudWidget extends Widget {
private static final ItemStack POPPY = new ItemStack(Items.POPPY);
static {
- ENDERMAN_HEAD.getOrCreateNbt().putString("SkullOwner", "MHF_Enderman");
+ ENDERMAN_HEAD.set(DataComponentTypes.PROFILE, new ProfileComponent(Optional.of("MHF_Enderman"), Optional.empty(), new PropertyMap()));
POPPY.addEnchantment(Enchantments.INFINITY, 1);
INSTANCE.setX(SkyblockerConfigManager.get().locations.end.x);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/end/TheEnd.java b/src/main/java/de/hysky/skyblocker/skyblock/end/TheEnd.java
index a093f598..6f2a0e40 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/end/TheEnd.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/end/TheEnd.java
@@ -4,13 +4,13 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.events.HudRenderEvents;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.waypoint.Waypoint;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientChunkEvents;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
-import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
import net.fabricmc.fabric.api.event.player.AttackEntityCallback;
@@ -73,7 +73,7 @@ public class TheEnd {
});
- HudRenderCallback.EVENT.register((drawContext, tickDelta) -> {
+ HudRenderEvents.AFTER_MAIN_HUD.register((drawContext, tickDelta) -> {
if (!Utils.isInTheEnd()) return;
if (!SkyblockerConfigManager.get().locations.end.hudEnabled) return;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
index b969ba0b..5522ceca 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
@@ -1,7 +1,5 @@
package de.hysky.skyblocker.skyblock.entity;
-import java.util.List;
-
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.FrustumUtils;
@@ -31,20 +29,13 @@ public class MobBoundingBoxes {
if (Utils.isInDungeons() && FrustumUtils.isVisible(box) && !entity.isInvisible()) {
String name = entity.getName().getString();
- // Minibosses
- if (entity instanceof PlayerEntity) {
- switch (name) {
- case "Lost Adventurer", "Shadow Assassin", "Diamond Guy": return SkyblockerConfigManager.get().locations.dungeons.starredMobBoundingBoxes;
- }
- }
-
- // Regular Mobs
- if (!(entity instanceof ArmorStandEntity)) {
- List<ArmorStandEntity> armorStands = MobGlow.getArmorStands(entity);
+ return switch (entity) {
+ case PlayerEntity _p when name.equals("Lost Adventurer") || name.equals("Shadow Assassin") || name.equals("Diamond Guy") -> SkyblockerConfigManager.get().locations.dungeons.starredMobBoundingBoxes;
+ case ArmorStandEntity _armorStand -> false;
- if (!armorStands.isEmpty() && armorStands.get(0).getName().getString().contains("✯"))
- return SkyblockerConfigManager.get().locations.dungeons.starredMobBoundingBoxes;
- }
+ // Regular Mobs
+ default -> SkyblockerConfigManager.get().locations.dungeons.starredMobBoundingBoxes && MobGlow.isStarred(entity);
+ };
}
return false;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
index 12ae468f..75ba700e 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
@@ -1,19 +1,22 @@
package de.hysky.skyblocker.skyblock.entity;
+import com.mojang.authlib.properties.Property;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.end.TheEnd;
import de.hysky.skyblocker.skyblock.dungeon.LividColor;
+import de.hysky.skyblocker.skyblock.end.TheEnd;
+import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.SlayerUtils;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.culling.OcclusionCulling;
+import net.minecraft.component.DataComponentTypes;
+import net.minecraft.component.type.ProfileComponent;
import net.minecraft.entity.Entity;
import net.minecraft.entity.decoration.ArmorStandEntity;
import net.minecraft.entity.mob.EndermanEntity;
import net.minecraft.entity.passive.BatEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NbtCompound;
-import net.minecraft.nbt.NbtElement;
+import net.minecraft.item.Items;
import net.minecraft.predicate.entity.EntityPredicates;
import net.minecraft.util.Formatting;
import net.minecraft.util.math.Box;
@@ -29,57 +32,52 @@ public class MobGlow {
if (OcclusionCulling.getReducedCuller().isVisible(box.minX, box.minY, box.minZ, box.maxX, box.maxY, box.maxZ)) {
String name = entity.getName().getString();
- if (!entity.isInvisible()) {
+ // Dungeons
+ if (Utils.isInDungeons() && !entity.isInvisible()) {
+ return switch (entity) {
+ // Minibosses
+ case PlayerEntity p when name.equals("Lost Adventurer") || name.equals("Shadow Assassin") || name.equals("Diamond Guy") -> SkyblockerConfigManager.get().locations.dungeons.starredMobGlow;
+ case PlayerEntity p when LividColor.LIVID_NAMES.contains(name) -> LividColor.shouldGlow(name);
- // Dungeons
- if (Utils.isInDungeons()) {
+ // Bats
+ case BatEntity b -> SkyblockerConfigManager.get().locations.dungeons.starredMobGlow || SkyblockerConfigManager.get().locations.dungeons.starredMobBoundingBoxes;
- // Minibosses
- if (entity instanceof PlayerEntity) {
- switch (name) {
- case "Lost Adventurer", "Shadow Assassin", "Diamond Guy": return SkyblockerConfigManager.get().locations.dungeons.starredMobGlow;
- case "Arcade Livid", "Crossed Livid", "Doctor Livid", "Frog Livid", "Hockey Livid",
- "Purple Livid", "Scream Livid", "Smile Livid", "Vendetta Livid": return LividColor.shouldGlow(name);
- }
- }
+ // Armor Stands
+ case ArmorStandEntity _armorStand -> false;
// Regular Mobs
- if (!(entity instanceof ArmorStandEntity)) {
- List<ArmorStandEntity> armorStands = getArmorStands(entity);
+ default -> SkyblockerConfigManager.get().locations.dungeons.starredMobGlow && isStarred(entity);
+ };
+ }
- if (!armorStands.isEmpty() && armorStands.get(0).getName().getString().contains("✯"))
- return SkyblockerConfigManager.get().locations.dungeons.starredMobGlow;
- }
+ return switch (entity) {
+ // Rift
+ case PlayerEntity p when Utils.isInTheRift() && !entity.isInvisible() && name.equals("Blobbercyst ") -> SkyblockerConfigManager.get().locations.rift.blobbercystGlow;
- // Bats
- return (SkyblockerConfigManager.get().locations.dungeons.starredMobGlow || SkyblockerConfigManager.get().locations.dungeons.starredMobBoundingBoxes) && entity instanceof BatEntity;
- }
+ // Enderman Slayer
+ // Highlights Nukekubi Heads
+ case ArmorStandEntity armorStand when Utils.isInTheEnd() && SlayerUtils.isInSlayer() && isNukekubiHead(armorStand) -> SkyblockerConfigManager.get().slayer.endermanSlayer.highlightNukekubiHeads;
- // Rift
- if (Utils.isInTheRift()) {
- if (entity instanceof PlayerEntity) {
- switch (name) {
- // They have a space in their name for some reason...
- case "Blobbercyst ": return SkyblockerConfigManager.get().locations.rift.blobbercystGlow;
- }
- }
- }
- }
+ // Special Zelot
+ case EndermanEntity enderman when Utils.isInTheEnd() && !entity.isInvisible() -> TheEnd.isSpecialZealot(enderman);
- // Enderman Slayer
- // Highlights Nukekubi Heads
- return SkyblockerConfigManager.get().slayer.endermanSlayer.highlightNukekubiHeads
- && SlayerUtils.isInSlayer()
- && entity instanceof ArmorStandEntity armorStandEntity
- && isNukekubiHead(armorStandEntity);
+ default -> false;
+ };
}
- // Special Zelot
- if (entity instanceof EndermanEntity enderman && TheEnd.isSpecialZealot(enderman)) return true;
-
return false;
}
+ /**
+ * Checks if an entity is starred by checking if its armor stand contains a star in its name.
+ * @param entity the entity to check.
+ * @return true if the entity is starred, false otherwise
+ */
+ public static boolean isStarred(Entity entity) {
+ List<ArmorStandEntity> armorStands = getArmorStands(entity);
+ return !armorStands.isEmpty() && armorStands.getFirst().getName().getString().contains("✯");
+ }
+
public static List<ArmorStandEntity> getArmorStands(Entity entity) {
return getArmorStands(entity.getWorld(), entity.getBoundingBox());
}
@@ -91,45 +89,28 @@ public class MobGlow {
public static int getGlowColor(Entity entity) {
String name = entity.getName().getString();
- if (entity instanceof PlayerEntity) {
- return switch (name) {
- case "Lost Adventurer" -> 0xfee15c;
- case "Shadow Assassin" -> 0x5b2cb2;
- case "Diamond Guy" -> 0x57c2f7;
- case "Arcade Livid", "Crossed Livid", "Doctor Livid", "Frog Livid", "Hockey Livid",
- "Purple Livid", "Scream Livid", "Smile Livid", "Vendetta Livid" -> LividColor.getGlowColor(name);
- case "Blobbercyst " -> Formatting.GREEN.getColorValue();
- default -> 0xf57738;
- };
- }
- if (entity instanceof EndermanEntity enderman && TheEnd.isSpecialZealot(enderman)) return Formatting.RED.getColorValue();
+ return switch (entity) {
+ case PlayerEntity p when name.equals("Lost Adventurer") -> 0xfee15c;
+ case PlayerEntity p when name.equals("Shadow Assassin") -> 0x5b2cb2;
+ case PlayerEntity p when name.equals("Diamond Guy") -> 0x57c2f7;
+ case PlayerEntity p when LividColor.LIVID_NAMES.contains(name) -> LividColor.getGlowColor(name);
+ case PlayerEntity p when name.equals("Blobbercyst ") -> Formatting.GREEN.getColorValue();
- // copypaste nukekebi head logic
- if (entity instanceof ArmorStandEntity armorStandEntity && isNukekubiHead(armorStandEntity)) return 0x990099;
+ case EndermanEntity enderman when TheEnd.isSpecialZealot(enderman) -> Formatting.RED.getColorValue();
+ case ArmorStandEntity armorStand when isNukekubiHead(armorStand) -> 0x990099;
- return 0xf57738;
+ default -> 0xf57738;
+ };
}
private static boolean isNukekubiHead(ArmorStandEntity entity) {
for (ItemStack armorItem : entity.getArmorItems()) {
- // hacky way to check if an item is a player head w/o
- // some shenanigans
- if (!armorItem.toString().startsWith("1 player_head"))
- continue;
-
// eb07594e2df273921a77c101d0bfdfa1115abed5b9b2029eb496ceba9bdbb4b3 is texture id for the nukekubi head,
// compare against it to exclusively find armorstands that are nukekubi heads
- NbtCompound skullOwner = armorItem.getSubNbt("SkullOwner");
- if (skullOwner != null) {
- // get the texture of the nukekubi head item itself and compare it
- String texture = skullOwner
- .getCompound("Properties")
- .getList("textures", NbtElement.COMPOUND_TYPE)
- .getCompound(0)
- .getString("Value");
-
- return texture.contains("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWIwNzU5NGUyZGYyNzM5MjFhNzdjMTAxZDBiZmRmYTExMTVhYmVkNWI5YjIwMjllYjQ5NmNlYmE5YmRiYjRiMyJ9fX0=");
- }
+ // get the texture of the nukekubi head item itself and compare it
+ String texture = ItemUtils.getHeadTexture(armorItem);
+
+ return texture.contains("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWIwNzU5NGUyZGYyNzM5MjFhNzdjMTAxZDBiZmRmYTExMTVhYmVkNWI5YjIwMjllYjQ5NmNlYmE5YmRiYjRiMyJ9fX0=");
}
return false;
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/experiment/ChronomatronSolver.java b/src/main/java/de/hysky/skyblocker/skyblock/experiment/ChronomatronSolver.java
index 19459b43..98738112 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/experiment/ChronomatronSolver.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/experiment/ChronomatronSolver.java
@@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableMap;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
import net.minecraft.inventory.Inventory;
@@ -14,7 +15,6 @@ import net.minecraft.item.Items;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
public class ChronomatronSolver extends ExperimentSolver {
public static final ImmutableMap<Item, Item> TERRACOTTA_TO_GLASS = ImmutableMap.ofEntries(
@@ -64,7 +64,7 @@ public class ChronomatronSolver extends ExperimentSolver {
Inventory inventory = genericContainerScreen.getScreenHandler().getInventory();
if (chronomatronCurrentSlot == 0) {
for (int index = 10; index < 43; index++) {
- if (inventory.getStack(index).hasEnchantments()) {
+ if (inventory.getStack(index).hasGlint()) {
if (chronomatronSlots.size() <= chronomatronChainLengthCount) {
chronomatronSlots.add(TERRACOTTA_TO_GLASS.get(inventory.getStack(index).getItem()));
setState(State.WAIT);
@@ -75,7 +75,7 @@ public class ChronomatronSolver extends ExperimentSolver {
return;
}
}
- } else if (!inventory.getStack(chronomatronCurrentSlot).hasEnchantments()) {
+ } else if (!inventory.getStack(chronomatronCurrentSlot).hasGlint()) {
chronomatronCurrentSlot = 0;
}
}
@@ -103,11 +103,11 @@ public class ChronomatronSolver extends ExperimentSolver {
}
@Override
- protected List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> slots) {
+ protected List<ColorHighlight> getColors(String[] groups, Int2ObjectMap<ItemStack> slots) {
List<ColorHighlight> highlights = new ArrayList<>();
if (getState() == State.SHOW && chronomatronSlots.size() > chronomatronCurrentOrdinal) {
- for (Map.Entry<Integer, ItemStack> indexStack : slots.entrySet()) {
- int index = indexStack.getKey();
+ for (Int2ObjectMap.Entry<ItemStack> indexStack : slots.int2ObjectEntrySet()) {
+ int index = indexStack.getIntKey();
ItemStack stack = indexStack.getValue();
Item item = chronomatronSlots.get(chronomatronCurrentOrdinal);
if (stack.isOf(item) || TERRACOTTA_TO_GLASS.get(stack.getItem()) == item) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/experiment/SuperpairsSolver.java b/src/main/java/de/hysky/skyblocker/skyblock/experiment/SuperpairsSolver.java
index c34abca1..e7502c89 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/experiment/SuperpairsSolver.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/experiment/SuperpairsSolver.java
@@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.experiment;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
import net.minecraft.item.ItemStack;
@@ -62,11 +63,11 @@ public class SuperpairsSolver extends ExperimentSolver {
}
@Override
- protected List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> displaySlots) {
+ protected List<ColorHighlight> getColors(String[] groups, Int2ObjectMap<ItemStack> displaySlots) {
List<ColorHighlight> highlights = new ArrayList<>();
if (getState() == State.SHOW) {
- for (Map.Entry<Integer, ItemStack> indexStack : displaySlots.entrySet()) {
- int index = indexStack.getKey();
+ for (Int2ObjectMap.Entry<ItemStack> indexStack : displaySlots.int2ObjectEntrySet()) {
+ int index = indexStack.getIntKey();
ItemStack displayStack = indexStack.getValue();
ItemStack stack = getSlots().get(index);
if (stack != null && !ItemStack.areEqual(stack, displayStack)) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/experiment/UltrasequencerSolver.java b/src/main/java/de/hysky/skyblocker/skyblock/experiment/UltrasequencerSolver.java
index 4e87b237..3f1fc72d 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/experiment/UltrasequencerSolver.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/experiment/UltrasequencerSolver.java
@@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.experiment;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.utils.render.gui.ColorHighlight;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
import net.minecraft.inventory.Inventory;
@@ -9,7 +10,6 @@ import net.minecraft.item.ItemStack;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
public class UltrasequencerSolver extends ExperimentSolver {
public static final UltrasequencerSolver INSTANCE = new UltrasequencerSolver();
@@ -76,7 +76,7 @@ public class UltrasequencerSolver extends ExperimentSolver {
}
@Override
- protected List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> slots) {
+ protected List<ColorHighlight> getColors(String[] groups, Int2ObjectMap<ItemStack> slots) {
return getState() == State.SHOW && ultrasequencerNextSlot != 0 ? List.of(ColorHighlight.green(ultrasequencerNextSlot)) : new ArrayList<>();
}
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/FancyStatusBars.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/FancyStatusBars.java
index a960c9af..2ee119fe 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/FancyStatusBars.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/FancyStatusBars.java
@@ -185,7 +185,7 @@ public class FancyStatusBars {
// FIX SIZES
int totalSize = 0;
for (StatusBar statusBar : barRow)
- totalSize += (statusBar.size = MathHelper.clamp(statusBar.size, sizeRule.minSize(), sizeRule.maxSize()));
+ totalSize += (statusBar.size = Math.clamp(statusBar.size, sizeRule.minSize(), sizeRule.maxSize()));
whileLoop:
while (totalSize != sizeRule.targetSize()) {
@@ -240,7 +240,7 @@ public class FancyStatusBars {
}
}
StatusBar statusBar = barRow.get(i);
- statusBar.size = MathHelper.clamp(statusBar.size, sizeRule.minSize(), sizeRule.maxSize());
+ statusBar.size = Math.clamp(statusBar.size, sizeRule.minSize(), sizeRule.maxSize());
float x = barAnchor.isRight() ?
anchorPosition.x() + currSize * widthPerSize :
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/filters/AdFilter.java b/src/main/java/de/hysky/skyblocker/skyblock/filters/AdFilter.java
index 5860b41e..5c9cd4a5 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/filters/AdFilter.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/filters/AdFilter.java
@@ -19,8 +19,8 @@ public class AdFilter extends ChatPatternListener {
// Groups:
// 1. Player name
// 2. Message
- // (?:§8\[[§feadbc0-9]+§8\] )?(?:[§76l]+[<INSERT EMBLEMS>] )?§[67abc](?:\[[§A-Za-z0-9+]+\] )?([A-Za-z0-9_]+)§[f7]: (.+)
- super("(?:§8\\[[§feadbc0-9]+§8\\] )?(?:[§76l]+[" + Constants.LEVEL_EMBLEMS + "] )?§[67abc](?:\\[[§A-Za-z0-9+]+\\] )?([A-Za-z0-9_]+)§[f7]: (.+)");
+ // (?:\[[0-9]+\] )?(?:[<INSERT EMBLEMS>] )?(?:\[[A-Z+]+\] )?([A-Za-z0-9_]+): (.+)
+ super("(?:\\[[0-9]+\\] )?(?:[" + Constants.LEVEL_EMBLEMS+ "] )?(?:\\[[A-Z+]+\\] )?([A-Za-z0-9_]+): (.+)");
}
@Override
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/filters/AutopetFilter.java b/src/main/java/de/hysky/skyblocker/skyblock/filters/AutopetFilter.java
index f97e8177..958be11e 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/filters/AutopetFilter.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/filters/AutopetFilter.java
@@ -11,7 +11,7 @@ import java.util.regex.Matcher;
public class AutopetFilter extends ChatPatternListener {
public AutopetFilter() {
- super("^§cAutopet §eequipped your §7.*§e! §a§lVIEW RULE$");
+ super("^Autopet equipped your .*! VIEW RULE$");
}
@Override
@@ -19,7 +19,7 @@ public class AutopetFilter extends ChatPatternListener {
if (SkyblockerConfigManager.get().messages.hideAutopet == ChatFilterResult.ACTION_BAR) {
Objects.requireNonNull(MinecraftClient.getInstance().player).sendMessage(
Text.literal(
- _message.getString().replace("§a§lVIEW RULE", "")
+ _message.getString().replace("VIEW RULE", "")
), true);
}
return true;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/filters/ShowOffFilter.java b/src/main/java/de/hysky/skyblocker/skyblock/filters/ShowOffFilter.java
index a9c551fb..84d32007 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/filters/ShowOffFilter.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/filters/ShowOffFilter.java
@@ -8,7 +8,8 @@ public class ShowOffFilter extends SimpleChatFilter {
private static final String[] SHOW_TYPES = { "is holding", "is wearing", "is friends with a", "has" };
public ShowOffFilter() {
- super("(?:§8\\[[§feadbc0-9]+§8\\] )?(?:[§76l]+[" + Constants.LEVEL_EMBLEMS + "] )?§[67abc](?:\\[[§A-Za-z0-9+]+\\] )?([A-Za-z0-9_]+)[§f7]+ (?:" + String.join("|", SHOW_TYPES) + ") §8\\[(.+)§8\\]");
+ //(?:\[[0-9]+\] )?(?:[<INSERT EMBLEMS>] )?(?:\[[A-Z+]+\] )?([A-Za-z0-9_]+) (?:<INSERT SHOW TYPES>) \[(.+)\]
+ super("(?:\\[[0-9]+\\] )?(?:[" + Constants.LEVEL_EMBLEMS + "] )?(?:\\[[A-Z+]+\\] )?([A-Za-z0-9_]+) (?:" + String.join("|", SHOW_TYPES) + ") \\[(.+)\\]");
}
@Override
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/filters/ToggleSkyMallFilter.java b/src/main/java/de/hysky/skyblocker/skyblock/filters/ToggleSkyMallFilter.java
index 94d10e3a..6ee13aff 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/filters/ToggleSkyMallFilter.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/filters/ToggleSkyMallFilter.java
@@ -6,7 +6,7 @@ import de.hysky.skyblocker.utils.chat.ChatFilterResult;
public class ToggleSkyMallFilter extends SimpleChatFilter {
public ToggleSkyMallFilter() {
- super("^§8§oYou can disable this messaging by toggling Sky Mall in your /hotm!$");
+ super("^You can disable this messaging by toggling Sky Mall in your /hotm!$");
}
@Override
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java
index fe93813f..43fdf001 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java
@@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.garden;
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.events.HudRenderEvents;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.Location;
import de.hysky.skyblocker.utils.Utils;
@@ -12,7 +13,6 @@ import it.unimi.dsi.fastutil.longs.LongArrayFIFOQueue;
import it.unimi.dsi.fastutil.longs.LongPriorityQueue;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
-import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.fabricmc.fabric.api.event.client.player.ClientPlayerBlockBreakEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.item.ItemStack;
@@ -41,7 +41,7 @@ public class FarmingHud {
private static float farmingXpPercentProgress;
public static void init() {
- HudRenderCallback.EVENT.register((context, tickDelta) -> {
+ HudRenderEvents.AFTER_MAIN_HUD.register((context, tickDelta) -> {
if (shouldRender()) {
if (!counter.isEmpty() && counter.peek().rightLong() + 10_000 < System.currentTimeMillis()) {
counter.poll();
@@ -54,7 +54,7 @@ public class FarmingHud {
}
ItemStack stack = MinecraftClient.getInstance().player.getMainHandStack();
- Matcher matcher = ItemUtils.getNbtTooltip(stack, FarmingHud.COUNTER);
+ Matcher matcher = ItemUtils.getLoreLineIfMatch(stack, FarmingHud.COUNTER);
if (matcher != null) {
try {
int count = NUMBER_FORMAT.parse(matcher.group("count")).intValue();
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 6640d413..c855c3e3 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java
@@ -2,24 +2,24 @@ package de.hysky.skyblocker.skyblock.garden;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
+import de.hysky.skyblocker.utils.ItemUtils;
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.nbt.NbtCompound;
-import net.minecraft.nbt.NbtElement;
-import net.minecraft.nbt.NbtList;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.slot.Slot;
import net.minecraft.text.Text;
-import net.minecraft.text.Text.Serialization;
import net.minecraft.util.Formatting;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
@@ -27,6 +27,7 @@ import org.slf4j.LoggerFactory;
import java.text.NumberFormat;
import java.util.HashMap;
+import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -34,7 +35,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;
@@ -58,7 +60,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;
@@ -77,47 +79,50 @@ public class VisitorHelper {
}
}
- public static void onSlotClick(Slot slot, int slotId, String title) {
+ public static void onSlotClick(Slot slot, int slotId, String title, ItemStack visitorHeadStack) {
if (slotId == 29 || slotId == 13 || slotId == 33) {
- itemMap.remove(title);
+ itemMap.remove(new ObjectObjectImmutablePair<>(title, getTextureOrNull(visitorHeadStack)));
}
}
private static void processVisitorItem(String visitorName, ScreenHandler handler) {
ItemStack visitorItem = handler.getSlot(13).getStack();
- if (visitorItem == null || !visitorItem.hasNbt() || !visitorItem.getNbt().asString().contains("Times Visited")) return;
+ 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;
- NbtCompound acceptButtonNbt = acceptButton.getSubNbt("display");
- if (acceptButtonNbt == null || !acceptButtonNbt.contains("Lore", NbtElement.LIST_TYPE)) return;
- processLore(visitorName, acceptButtonNbt.getList("Lore", NbtElement.STRING_TYPE));
+ processLore(visitorName, getTextureOrNull(visitorItem), ItemUtils.getLore(acceptButton));
}
- private static void processLore(String visitorName, NbtList loreList) {
+ private static @Nullable String getTextureOrNull(ItemStack stack) {
+ String texture = ItemUtils.getHeadTexture(stack);
+
+ return texture.isEmpty() ? null : texture;
+ }
+
+ 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.getString(i);
+ for (Text text : loreList) {
+ String lore = text.getString();
if (lore.contains("Items Required"))
saveRequiredItems = true;
else if (lore.contains("Rewards"))
break;
else if (saveRequiredItems)
- updateItemMap(visitorName, lore);
+ updateItemMap(visitorName, visitorTexture, text);
}
}
- private static void updateItemMap(String visitorName, String lore) {
- Text itemText = Serialization.fromJson(lore);
- String[] splitItemText = itemText.getString().split(" x");
+ 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<>());
- visitorMap.putIfAbsent(itemName, amount);
- itemMap.putIfAbsent(visitorName, visitorMap);
+ Pair<String, String> key = Pair.of(visitorName, visitorTexture);
+ Object2IntMap<String> visitorMap = itemMap.computeIfAbsent(key, _key -> new Object2IntOpenHashMap<>());
+ visitorMap.put(itemName, amount);
} catch (Exception e) {
- LOGGER.error("[Skyblocker Visitor Helper] Failed to parse item: " + itemText.getString(), e);
+ LOGGER.error("[Skyblocker Visitor Helper] Failed to parse item: {}", lore.getString(), e);
}
}
@@ -125,9 +130,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()) {
@@ -149,6 +154,7 @@ public class VisitorHelper {
String strippedName = Formatting.strip(displayName);
ItemStack cachedStack = itemCache.get(strippedName);
if (cachedStack != null) return cachedStack;
+ if (NEURepoManager.isLoading() || !ItemRepository.filesImported()) return null; // Item repo might be taking its sweet time doing things and cause concurrent modification error
Map<String, NEUItem> items = NEURepoManager.NEU_REPO.getItems().getItems();
if (items == null) return null;
ItemStack stack = items.values().stream()
@@ -163,7 +169,7 @@ public class VisitorHelper {
}
private static void drawItemEntryWithHover(DrawContext context, TextRenderer textRenderer, @Nullable ItemStack stack, String itemName, int amount, int index, int mouseX, int mousseY) {
- Text text = stack != null ? Serialization.fromJson(stack.getSubNbt("display").getString("Name")).append(" x" + amount) : Text.literal(itemName + " x" + amount);
+ Text text = stack != null ? stack.getName().copy().append(" x" + amount) : Text.literal(itemName + " x" + amount);
drawTextWithOptionalUnderline(context, textRenderer, text, TEXT_START_X + TEXT_INDENT, TEXT_START_Y + (index * (LINE_SPACING + textRenderer.fontHeight)), mouseX, mousseY);
// drawItem adds 150 to the z, which puts our z at 350, above the item in the slot (250) and their text (300) and below the cursor stack (382) and their text (432)
if (stack != null) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorAnimatedDyes.java b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorAnimatedDyes.java
index b011b2b0..4440cd84 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorAnimatedDyes.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorAnimatedDyes.java
@@ -22,8 +22,8 @@ import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallba
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.minecraft.command.CommandRegistryAccess;
-import net.minecraft.item.DyeableItem;
import net.minecraft.item.ItemStack;
+import net.minecraft.registry.tag.ItemTags;
import net.minecraft.text.Text;
import net.minecraft.util.math.MathHelper;
@@ -62,7 +62,7 @@ public class CustomArmorAnimatedDyes {
ItemStack heldItem = source.getPlayer().getMainHandStack();
if (Utils.isOnSkyblock() && heldItem != null && !heldItem.isEmpty()) {
- if (heldItem.getItem() instanceof DyeableItem) {
+ if (heldItem.isIn(ItemTags.DYEABLE)) {
String itemUuid = ItemUtils.getItemUuid(heldItem);
if (!itemUuid.isEmpty()) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorDyeColors.java b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorDyeColors.java
index 639e98ed..97311220 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorDyeColors.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorDyeColors.java
@@ -12,8 +12,8 @@ import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
import net.minecraft.command.CommandRegistryAccess;
-import net.minecraft.item.DyeableItem;
import net.minecraft.item.ItemStack;
+import net.minecraft.registry.tag.ItemTags;
import net.minecraft.text.Text;
public class CustomArmorDyeColors {
@@ -40,7 +40,7 @@ public class CustomArmorDyeColors {
}
if (Utils.isOnSkyblock() && heldItem != null) {
- if (heldItem.getItem() instanceof DyeableItem) {
+ if (heldItem.isIn(ItemTags.DYEABLE)) {
String itemUuid = ItemUtils.getItemUuid(heldItem);
if (!itemUuid.isEmpty()) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorTrims.java b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorTrims.java
index 3434f026..65e1b138 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorTrims.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorTrims.java
@@ -5,8 +5,8 @@ import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.suggestion.SuggestionProvider;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
-
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.debug.Debug;
import de.hysky.skyblocker.events.SkyblockEvents;
import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.ItemUtils;
@@ -17,6 +17,7 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
+import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.command.CommandRegistryAccess;
@@ -25,20 +26,19 @@ import net.minecraft.command.argument.IdentifierArgumentType;
import net.minecraft.item.ArmorItem;
import net.minecraft.item.ItemStack;
import net.minecraft.item.trim.ArmorTrim;
-import net.minecraft.nbt.NbtCompound;
-import net.minecraft.nbt.NbtOps;
+import net.minecraft.item.trim.ArmorTrimMaterial;
+import net.minecraft.item.trim.ArmorTrimPattern;
import net.minecraft.registry.*;
+import net.minecraft.registry.entry.RegistryEntry.Reference;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Optional;
-
public class CustomArmorTrims {
private static final Logger LOGGER = LoggerFactory.getLogger(CustomArmorTrims.class);
- public static final Object2ObjectOpenHashMap<ArmorTrimId, Optional<ArmorTrim>> TRIMS_CACHE = new Object2ObjectOpenHashMap<>();
+ public static final Object2ObjectOpenHashMap<ArmorTrimId, ArmorTrim> TRIMS_CACHE = new Object2ObjectOpenHashMap<>();
private static boolean trimsInitialized = false;
public static void init() {
@@ -48,24 +48,18 @@ public class CustomArmorTrims {
private static void initializeTrimCache() {
ClientPlayerEntity player = MinecraftClient.getInstance().player;
- if (trimsInitialized || player == null) {
+ FabricLoader loader = FabricLoader.getInstance();
+ if (trimsInitialized || (player == null && !Debug.debugEnabled())) {
return;
}
try {
TRIMS_CACHE.clear();
- DynamicRegistryManager registryManager = player.networkHandler.getRegistryManager();
- for (Identifier material : registryManager.get(RegistryKeys.TRIM_MATERIAL).getIds()) {
- for (Identifier pattern : registryManager.get(RegistryKeys.TRIM_PATTERN).getIds()) {
- NbtCompound compound = new NbtCompound();
- compound.putString("material", material.toString());
- compound.putString("pattern", pattern.toString());
-
- ArmorTrim trim = ArmorTrim.CODEC.parse(RegistryOps.of(NbtOps.INSTANCE, registryManager), compound).resultOrPartial(LOGGER::error).orElse(null);
+ RegistryWrapper.WrapperLookup wrapperLookup = getWrapperLookup(loader, player);
+ for (Reference<ArmorTrimMaterial> material : wrapperLookup.getWrapperOrThrow(RegistryKeys.TRIM_MATERIAL).streamEntries().toList()) {
+ for (Reference<ArmorTrimPattern> pattern : wrapperLookup.getWrapperOrThrow(RegistryKeys.TRIM_PATTERN).streamEntries().toList()) {
+ ArmorTrim trim = new ArmorTrim(material, pattern);
- // Something went terribly wrong
- if (trim == null) throw new IllegalStateException("Trim shouldn't be null! [" + "\"" + material + "\",\"" + pattern + "\"]");
-
- TRIMS_CACHE.put(new ArmorTrimId(material, pattern), Optional.of(trim));
+ TRIMS_CACHE.put(new ArmorTrimId(material.registryKey().getValue(), pattern.registryKey().getValue()), trim);
}
}
@@ -76,6 +70,10 @@ public class CustomArmorTrims {
}
}
+ private static RegistryWrapper.WrapperLookup getWrapperLookup(FabricLoader loader, ClientPlayerEntity player) {
+ return !Debug.debugEnabled() ? player.networkHandler.getRegistryManager() : BuiltinRegistries.createWrapperLookup();
+ }
+
private static void registerCommand(CommandDispatcher<FabricClientCommandSource> dispatcher, CommandRegistryAccess registryAccess) {
dispatcher.register(ClientCommandManager.literal("skyblocker")
.then(ClientCommandManager.literal("custom")
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomItemNames.java b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomItemNames.java
index e47444cf..e1af788e 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomItemNames.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomItemNames.java
@@ -26,7 +26,7 @@ public class CustomItemNames {
.then(ClientCommandManager.literal("custom")
.then(ClientCommandManager.literal("renameItem")
.executes(context -> renameItem(context.getSource(), null))
- .then(ClientCommandManager.argument("textComponent", TextArgumentType.text())
+ .then(ClientCommandManager.argument("textComponent", TextArgumentType.text(registryAccess))
.executes(context -> renameItem(context.getSource(), context.getArgument("textComponent", Text.class)))))));
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/ItemRarityBackgrounds.java b/src/main/java/de/hysky/skyblocker/skyblock/item/ItemRarityBackgrounds.java
index d4bf3d52..8a23ea6d 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/ItemRarityBackgrounds.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/ItemRarityBackgrounds.java
@@ -17,7 +17,6 @@ import it.unimi.dsi.fastutil.ints.Int2ReferenceOpenHashMap;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.item.TooltipContext;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.texture.Sprite;
import net.minecraft.item.ItemStack;
@@ -48,7 +47,7 @@ public class ItemRarityBackgrounds {
ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
String title = screen.getTitle().getString();
- if (Utils.isOnSkyblock() && (title.equals("The Hex") || title.equals("Craft Item") || title.equals("Anvil") || title.equals("Reforge Anvil"))) {
+ if (Utils.isOnSkyblock() && (title.contains("The Hex") || title.equals("Craft Item") || title.equals("Anvil") || title.equals("Reforge Anvil"))) {
ScreenEvents.remove(screen).register(screen1 -> CACHE.clear());
}
});
@@ -74,8 +73,8 @@ public class ItemRarityBackgrounds {
if (CACHE.containsKey(hashCode)) return CACHE.get(hashCode);
- List<Text> tooltip = stack.getTooltip(player, TooltipContext.BASIC);
- String[] stringifiedTooltip = tooltip.stream().map(Text::getString).toArray(String[]::new);
+ List<Text> lore = ItemUtils.getLore(stack);
+ String[] stringifiedTooltip = lore.stream().map(Text::getString).toArray(String[]::new);
for (String rarityString : LORE_RARITIES.keySet()) {
if (Arrays.stream(stringifiedTooltip).anyMatch(line -> line.contains(rarityString))) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/MuseumItemCache.java b/src/main/java/de/hysky/skyblocker/skyblock/item/MuseumItemCache.java
index ae908245..c78724ca 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/MuseumItemCache.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/MuseumItemCache.java
@@ -3,13 +3,16 @@ package de.hysky.skyblocker.skyblock.item;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
-import com.google.gson.reflect.TypeToken;
+import com.mojang.serialization.Codec;
+import com.mojang.serialization.JsonOps;
+import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.mojang.util.UndashedUuid;
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.utils.Http;
import de.hysky.skyblocker.utils.Http.ApiResponse;
import de.hysky.skyblocker.utils.Utils;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.minecraft.client.MinecraftClient;
@@ -21,7 +24,6 @@ import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.IOException;
-import java.lang.reflect.Type;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
@@ -32,8 +34,7 @@ import java.util.concurrent.CompletableFuture;
public class MuseumItemCache {
private static final Logger LOGGER = LoggerFactory.getLogger(MuseumItemCache.class);
private static final Path CACHE_FILE = SkyblockerMod.CONFIG_DIR.resolve("museum_item_cache.json");
- private static final Object2ObjectOpenHashMap<String, Object2ObjectOpenHashMap<String, ProfileMuseumData>> MUSEUM_ITEM_CACHE = new Object2ObjectOpenHashMap<>();
- private static final Type MAP_TYPE = new TypeToken<Object2ObjectOpenHashMap<String, Object2ObjectOpenHashMap<String, ProfileMuseumData>>>() {}.getType();
+ private static final Map<String, Object2ObjectOpenHashMap<String, ProfileMuseumData>> MUSEUM_ITEM_CACHE = new Object2ObjectOpenHashMap<>();
private static final String ERROR_LOG_TEMPLATE = "[Skyblocker] Failed to refresh museum item data for profile {}";
private static CompletableFuture<Void> loaded;
@@ -45,7 +46,7 @@ public class MuseumItemCache {
private static void load(MinecraftClient client) {
loaded = CompletableFuture.runAsync(() -> {
try (BufferedReader reader = Files.newBufferedReader(CACHE_FILE)) {
- Object2ObjectOpenHashMap<String, Object2ObjectOpenHashMap<String, ProfileMuseumData>> cachedData = SkyblockerMod.GSON.fromJson(reader, MAP_TYPE);
+ Map<String, Object2ObjectOpenHashMap<String, ProfileMuseumData>> cachedData = ProfileMuseumData.SERIALIZATION_CODEC.parse(JsonOps.INSTANCE, JsonParser.parseReader(reader)).getOrThrow();
MUSEUM_ITEM_CACHE.putAll(cachedData);
LOGGER.info("[Skyblocker] Loaded museum items cache");
@@ -59,7 +60,7 @@ public class MuseumItemCache {
private static void save() {
CompletableFuture.runAsync(() -> {
try (BufferedWriter writer = Files.newBufferedWriter(CACHE_FILE)) {
- SkyblockerMod.GSON.toJson(MUSEUM_ITEM_CACHE, writer);
+ SkyblockerMod.GSON.toJson(ProfileMuseumData.SERIALIZATION_CODEC.encodeStart(JsonOps.INSTANCE, MUSEUM_ITEM_CACHE).getOrThrow(), writer);
} catch (IOException e) {
LOGGER.error("[Skyblocker] Failed to save cached museum items!", e);
}
@@ -68,7 +69,7 @@ public class MuseumItemCache {
private static void updateData4ProfileMember(String uuid, String profileId) {
CompletableFuture.runAsync(() -> {
- try (ApiResponse response = Http.sendHypixelRequest("skyblock/museum", "?profile=" + profileId)) {
+ try (ApiResponse response = Http.sendHypixelRequest("skyblock/museum", "?profile=" + profileId)) {
//The request was successful
if (response.ok()) {
JsonObject profileData = JsonParser.parseString(response.content()).getAsJsonObject();
@@ -86,7 +87,7 @@ public class MuseumItemCache {
for (Map.Entry<String, JsonElement> donatedSet : donatedSets.entrySet()) {
//Item is plural here because the nbt is a list
String itemsData = donatedSet.getValue().getAsJsonObject().get("items").getAsJsonObject().get("data").getAsString();
- NbtList items = NbtIo.readCompressed(new ByteArrayInputStream(Base64.getDecoder().decode(itemsData)), NbtTagSizeTracker.ofUnlimitedBytes()).getList("i", NbtElement.COMPOUND_TYPE);
+ NbtList items = NbtIo.readCompressed(new ByteArrayInputStream(Base64.getDecoder().decode(itemsData)), NbtSizeTracker.ofUnlimitedBytes()).getList("i", NbtElement.COMPOUND_TYPE);
for (int i = 0; i < items.size(); i++) {
NbtCompound tag = items.getCompound(i).getCompound("tag");
@@ -135,7 +136,7 @@ public class MuseumItemCache {
public static void tick(String profileId) {
if (loaded.isDone()) {
String uuid = UndashedUuid.toString(MinecraftClient.getInstance().getSession().getUuidOrNull());
- Object2ObjectOpenHashMap<String, ProfileMuseumData> playerData = MUSEUM_ITEM_CACHE.computeIfAbsent(uuid, _uuid -> new Object2ObjectOpenHashMap<>());
+ Map<String, ProfileMuseumData> playerData = MUSEUM_ITEM_CACHE.computeIfAbsent(uuid, _uuid -> new Object2ObjectOpenHashMap<>());
playerData.putIfAbsent(profileId, ProfileMuseumData.EMPTY);
if (playerData.get(profileId).stale()) updateData4ProfileMember(uuid, profileId);
@@ -152,6 +153,17 @@ public class MuseumItemCache {
private record ProfileMuseumData(long lastUpdated, ObjectOpenHashSet<String> collectedItemIds) {
private static final ProfileMuseumData EMPTY = new ProfileMuseumData(0L, null);
private static final long MAX_AGE = 86_400_000;
+ private static final Codec<ProfileMuseumData> CODEC = RecordCodecBuilder.create(instance -> instance.group(
+ Codec.LONG.fieldOf("lastUpdated").forGetter(ProfileMuseumData::lastUpdated),
+ Codec.STRING.listOf()
+ .xmap(ObjectOpenHashSet::new, ObjectArrayList::new)
+ .fieldOf("collectedItemIds")
+ .forGetter(i -> new ObjectOpenHashSet<>(i.collectedItemIds()))
+ ).apply(instance, ProfileMuseumData::new));
+ //Mojang's internal Codec implementation uses ImmutableMaps so we'll just xmap those away and type safety while we're at it :')
+ private static final Codec<Map<String, Object2ObjectOpenHashMap<String, ProfileMuseumData>>> SERIALIZATION_CODEC = Codec.unboundedMap(Codec.STRING, Codec.unboundedMap(Codec.STRING, CODEC)
+ .xmap(Object2ObjectOpenHashMap::new, Object2ObjectOpenHashMap::new)
+ ).xmap(Object2ObjectOpenHashMap::new, Object2ObjectOpenHashMap::new);
private boolean stale() {
return System.currentTimeMillis() > lastUpdated + MAX_AGE;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/PlayerHeadHashCache.java b/src/main/java/de/hysky/skyblocker/skyblock/item/PlayerHeadHashCache.java
index 2a1688fc..da832164 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/PlayerHeadHashCache.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/PlayerHeadHashCache.java
@@ -1,7 +1,6 @@
package de.hysky.skyblocker.skyblock.item;
-import java.net.MalformedURLException;
-import java.net.URL;
+import java.net.URI;
import java.util.Base64;
import java.util.concurrent.CompletableFuture;
@@ -50,8 +49,8 @@ public class PlayerHeadHashCache {
//From MinecraftProfileTexture#getHash
public static String getSkinHash(String url) {
try {
- return FilenameUtils.getBaseName(new URL(url).getPath());
- } catch (MalformedURLException e) {
+ return FilenameUtils.getBaseName(new URI(url).getPath());
+ } catch (Exception e) {
LOGGER.error("[Skyblocker Player Head Hash Cache] Malformed Skin URL! URL: {}", url, e);
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreen.java
index 14ddb238..a09b260a 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreen.java
@@ -1,5 +1,7 @@
package de.hysky.skyblocker.skyblock.item;
+import java.time.Duration;
+
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.skyblock.itemlist.ItemListWidget;
import net.minecraft.client.gui.DrawContext;
@@ -21,6 +23,7 @@ import net.minecraft.screen.AbstractRecipeScreenHandler;
import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.screen.slot.Slot;
import net.minecraft.screen.slot.SlotActionType;
+import net.minecraft.text.OrderedText;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
@@ -54,11 +57,13 @@ public class SkyblockCraftingTableScreen extends HandledScreen<SkyblockCraftingT
button.setPosition(this.x + 5, this.height / 2 - 49);
if (moreCraftsButton != null) moreCraftsButton.setPosition(this.x + 174, this.y + 62);
}));
- moreCraftsButton = new TexturedButtonWidget(this.x + 174, y + 62, 16, 16, MORE_CRAFTS_TEXTURES,
- button -> this.onMouseClick(handler.slots.get(26), handler.slots.get(26).id, 0, SlotActionType.PICKUP));
- moreCraftsButton.setTooltipDelay(250);
- moreCraftsButton.setTooltip(Tooltip.of(Text.literal("More Crafts")));
- this.addDrawableChild(moreCraftsButton);
+ if (!handler.mirrorverse) {
+ moreCraftsButton = new TexturedButtonWidget(this.x + 174, y + 62, 16, 16, MORE_CRAFTS_TEXTURES,
+ button -> this.onMouseClick(handler.slots.get(26), handler.slots.get(26).id, 0, SlotActionType.PICKUP));
+ moreCraftsButton.setTooltipDelay(Duration.ofMillis(250L));
+ moreCraftsButton.setTooltip(Tooltip.of(Text.literal("More Crafts")));
+ this.addDrawableChild(moreCraftsButton);
+ }
assert (client != null ? client.player : null) != null;
client.player.currentScreenHandler = handler; // recipe book replaces it with the Dummy one fucking DUMBASS
this.addSelectableChild(this.recipeBook);
@@ -101,7 +106,7 @@ public class SkyblockCraftingTableScreen extends HandledScreen<SkyblockCraftingT
int i = this.x;
int j = (this.height - this.backgroundHeight) / 2;
context.drawTexture(TEXTURE, i, j, 0, 0, this.backgroundWidth, this.backgroundHeight);
- context.drawGuiTexture(QUICK_CRAFT, i + 173, j, 0, 25, 84);
+ if (!handler.mirrorverse) context.drawGuiTexture(QUICK_CRAFT, i + 173, j, 0, 25, 84);
}
@Override
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreenHandler.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreenHandler.java
index 04974ade..c3704d8c 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreenHandler.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreenHandler.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.item;
+import de.hysky.skyblocker.utils.Utils;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.Inventory;
import net.minecraft.screen.GenericContainerScreenHandler;
@@ -16,11 +17,22 @@ public class SkyblockCraftingTableScreenHandler extends GenericContainerScreenHa
28, 29, 30, 34
};
+ private static final int[] riftNormalSlots = new int[]{
+ 11, 12, 13,
+ 20, 21, 22, 24,
+ 29, 30, 31
+ };
+
+ public final boolean mirrorverse;
+
public SkyblockCraftingTableScreenHandler(ScreenHandlerType<?> type, int syncId, PlayerInventory playerInventory, Inventory inventory, int rows) {
super(type, syncId, playerInventory, inventory, rows);
+ mirrorverse = Utils.getIslandArea().toLowerCase().contains("mirrorverse");
+ int[] activeSlots = mirrorverse ? riftNormalSlots: normalSlots;
+
for (int i = 0; i < rows * 9; i++) {
Slot originalSlot = slots.get(i);
- if (Arrays.binarySearch(normalSlots, i) >= 0) {
+ if (Arrays.binarySearch(activeSlots, i) >= 0) {
int[] coords = getCoords(i);
Slot slot = new Slot(originalSlot.inventory, originalSlot.getIndex(), coords[0], coords[1]);
slot.id = i;
@@ -45,14 +57,21 @@ public class SkyblockCraftingTableScreenHandler extends GenericContainerScreenHa
}
private int[] getCoords(int slot) {
- if (slot == 23) return new int[]{124, 35};
- if (slot == 16 || slot == 25 || slot == 34) {
- int y = (slot / 9 - 1) * 18 + 8;
- return new int[]{174, y};
+ if (mirrorverse) {
+ if (slot == 24) return new int[]{124, 35};
+ int gridX = slot % 9 - 2;
+ int gridY = slot / 9 - 1;
+ return new int[]{30 + gridX * 18, 17 + gridY * 18};
+ } else {
+ if (slot == 23) return new int[]{124, 35};
+ if (slot == 16 || slot == 25 || slot == 34) {
+ int y = (slot / 9 - 1) * 18 + 8;
+ return new int[]{174, y};
+ }
+ int gridX = slot % 9 - 1;
+ int gridY = slot / 9 - 1;
+ return new int[]{30 + gridX * 18, 17 + gridY * 18};
}
- int gridX = slot % 9 - 1;
- int gridY = slot / 9 - 1;
- return new int[]{30 + gridX * 18, 17 + gridY * 18};
}
public static class DisabledSlot extends Slot {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java b/src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java
index 5815c11f..109e5503 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java
@@ -2,7 +2,9 @@ package de.hysky.skyblocker.skyblock.item;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
+import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.ItemUtils;
+import de.hysky.skyblocker.utils.Utils;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
@@ -10,6 +12,7 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.screen.slot.Slot;
import net.minecraft.text.Text;
import net.minecraft.util.Util;
+import org.jetbrains.annotations.NotNull;
import org.lwjgl.glfw.GLFW;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -19,7 +22,6 @@ import java.util.concurrent.CompletableFuture;
public class WikiLookup {
private static final Logger LOGGER = LoggerFactory.getLogger(WikiLookup.class);
public static KeyBinding wikiLookup;
- private static String id;
public static void init() {
wikiLookup = KeyBindingHelper.registerKeyBinding(new KeyBinding(
@@ -30,24 +32,15 @@ public class WikiLookup {
));
}
- public static void getSkyblockId(Slot slot) {
- //Grabbing the skyblock NBT data
- ItemUtils.getItemIdOptional(slot.getStack()).ifPresent(newId -> id = newId);
- }
+ public static void openWiki(@NotNull Slot slot, @NotNull PlayerEntity player) {
+ if (!Utils.isOnSkyblock() || !SkyblockerConfigManager.get().general.wikiLookup.enableWikiLookup) return;
- public static void openWiki(Slot slot, PlayerEntity player) {
- if (SkyblockerConfigManager.get().general.wikiLookup.enableWikiLookup) {
- getSkyblockId(slot);
- try {
- String wikiLink = ItemRepository.getWikiLink(id, player);
- if (wikiLink != null) CompletableFuture.runAsync(() -> Util.getOperatingSystem().open(wikiLink));
- } catch (IndexOutOfBoundsException | IllegalStateException e) {
- LOGGER.error("[Skyblocker] Error while retrieving wiki article...", e);
- if (player != null) {
- player.sendMessage(Text.of("[Skyblocker] Error while retrieving wiki article, see logs..."), false);
- }
- }
- }
+ ItemUtils.getItemIdOptional(slot.getStack())
+ .map(ItemRepository::getWikiLink)
+ .ifPresentOrElse(wikiLink -> CompletableFuture.runAsync(() -> Util.getOperatingSystem().open(wikiLink)).exceptionally(e -> {
+ LOGGER.error("[Skyblocker] Error while retrieving wiki article...", e);
+ player.sendMessage(Constants.PREFIX.get().append("Error while retrieving wiki article, see logs..."), false);
+ return null;
+ }), () -> player.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.wikiLookup.noArticleFound")), false));
}
-
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoriesHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoriesHelper.java
index b4d47617..06601f80 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoriesHelper.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoriesHelper.java
@@ -75,7 +75,7 @@ public class AccessoriesHelper {
private static void load() {
loaded = CompletableFuture.runAsync(() -> {
try (BufferedReader reader = Files.newBufferedReader(FILE)) {
- COLLECTED_ACCESSORIES.putAll(ProfileAccessoryData.SERIALIZATION_CODEC.parse(JsonOps.COMPRESSED, JsonParser.parseReader(reader)).result().orElseThrow());
+ COLLECTED_ACCESSORIES.putAll(ProfileAccessoryData.SERIALIZATION_CODEC.parse(JsonOps.COMPRESSED, JsonParser.parseReader(reader)).getOrThrow());
} catch (NoSuchFileException ignored) {
} catch (Exception e) {
LOGGER.error("[Skyblocker Accessory Helper] Failed to load accessory file!", e);
@@ -85,7 +85,7 @@ public class AccessoriesHelper {
private static void save() {
try (BufferedWriter writer = Files.newBufferedWriter(FILE)) {
- SkyblockerMod.GSON.toJson(ProfileAccessoryData.SERIALIZATION_CODEC.encodeStart(JsonOps.COMPRESSED, COLLECTED_ACCESSORIES).result().orElseThrow(), writer);
+ SkyblockerMod.GSON.toJson(ProfileAccessoryData.SERIALIZATION_CODEC.encodeStart(JsonOps.COMPRESSED, COLLECTED_ACCESSORIES).getOrThrow(), writer);
} catch (Exception e) {
LOGGER.error("[Skyblocker Accessory Helper] Failed to save accessory file!", e);
}
@@ -166,7 +166,7 @@ public class AccessoriesHelper {
static void refreshData(JsonObject data) {
try {
- ACCESSORY_DATA = Accessory.MAP_CODEC.parse(JsonOps.INSTANCE, data).result().orElseThrow();
+ ACCESSORY_DATA = Accessory.MAP_CODEC.parse(JsonOps.INSTANCE, data).getOrThrow();
} catch (Exception e) {
LOGGER.error("[Skyblocker Accessory Helper] Failed to parse data!", e);
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/BackpackPreview.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/BackpackPreview.java
index 37de58e6..50772789 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/BackpackPreview.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/BackpackPreview.java
@@ -1,9 +1,13 @@
package de.hysky.skyblocker.skyblock.item.tooltip;
import com.mojang.blaze3d.systems.RenderSystem;
+import com.mojang.serialization.Codec;
+import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.item.ItemProtection;
import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds;
+import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.Utils;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.minecraft.client.MinecraftClient;
@@ -15,23 +19,26 @@ import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.inventory.Inventory;
import net.minecraft.inventory.SimpleInventory;
import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NbtCompound;
-import net.minecraft.nbt.NbtInt;
-import net.minecraft.nbt.NbtIo;
-import net.minecraft.nbt.NbtList;
+import net.minecraft.nbt.NbtOps;
+import net.minecraft.nbt.StringNbtReader;
+import net.minecraft.nbt.visitor.StringNbtWriter;
import net.minecraft.util.Identifier;
-import org.jetbrains.annotations.NotNull;
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.Objects;
+import java.util.ArrayList;
+import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import java.util.stream.Collectors;
public class BackpackPreview {
private static final Logger LOGGER = LoggerFactory.getLogger(BackpackPreview.class);
+ private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png");
private static final Identifier TEXTURE = new Identifier("textures/gui/container/generic_54.png");
private static final Pattern ECHEST_PATTERN = Pattern.compile("Ender Chest.*\\((\\d+)/\\d+\\)");
private static final Pattern BACKPACK_PATTERN = Pattern.compile("Backpack.*\\(Slot #(\\d+)\\)");
@@ -61,8 +68,13 @@ public class BackpackPreview {
String id = MinecraftClient.getInstance().getSession().getUuidOrNull().toString().replaceAll("-", "") + "/" + Utils.getProfileId();
if (!id.equals(loaded)) {
saveDir = SkyblockerMod.CONFIG_DIR.resolve("backpack-preview/" + id);
- //noinspection ResultOfMethodCallIgnored
- saveDir.toFile().mkdirs();
+
+ try {
+ Files.createDirectories(saveDir);
+ } catch (Exception e) {
+ LOGGER.error("[Skyblocker] Failed to create the backpack preview save directory! Path: {}", saveDir, e);
+ }
+
// load storage again because profile id changed
loaded = id;
loadStorages();
@@ -75,10 +87,10 @@ public class BackpackPreview {
storages[index] = null;
Path storageFile = saveDir.resolve(index + ".nbt");
if (Files.isRegularFile(storageFile)) {
- try {
- storages[index] = Storage.fromNbt(Objects.requireNonNull(NbtIo.read(storageFile)));
+ try (BufferedReader reader = Files.newBufferedReader(storageFile)) {
+ storages[index] = Storage.CODEC.parse(NbtOps.INSTANCE, StringNbtReader.parse(reader.lines().collect(Collectors.joining()))).getOrThrow();
} catch (Exception e) {
- LOGGER.error("Failed to load backpack preview file: " + storageFile.getFileName().toString(), e);
+ LOGGER.error("Failed to load backpack preview file: {}", storageFile.getFileName().toString(), e);
}
}
}
@@ -93,11 +105,12 @@ public class BackpackPreview {
}
private static void saveStorage(int index) {
- try {
- NbtIo.write(storages[index].toNbt(), saveDir.resolve(index + ".nbt"));
+ Path storageFile = saveDir.resolve(index + ".nbt");
+ try (BufferedWriter writer = Files.newBufferedWriter(storageFile)) {
+ writer.write(new StringNbtWriter().apply(Storage.CODEC.encodeStart(NbtOps.INSTANCE, storages[index]).getOrThrow()));
storages[index].markClean();
} catch (Exception e) {
- LOGGER.error("Failed to save backpack preview file: " + index + ".nbt", e);
+ LOGGER.error("Failed to save backpack preview file: {}", storageFile.getFileName().toString(), e);
}
}
@@ -105,7 +118,7 @@ public class BackpackPreview {
String title = handledScreen.getTitle().getString();
int index = getStorageIndexFromTitle(title);
if (index != -1) {
- storages[index] = new Storage(handledScreen.getScreenHandler().slots.get(0).inventory, title, true);
+ storages[index] = new Storage(handledScreen.getScreenHandler().slots.getFirst().inventory, title, true);
}
}
@@ -129,7 +142,7 @@ public class BackpackPreview {
context.drawTexture(TEXTURE, x, y + rows * 18 + 17, 0, 215, 176, 7);
TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
- context.drawText(textRenderer, storages[index].name, x + 8, y + 6, 0x404040, false);
+ context.drawText(textRenderer, storages[index].name(), x + 8, y + 6, 0x404040, false);
matrices.translate(0f, 0f, 200f);
for (int i = 9; i < storages[index].size(); ++i) {
@@ -141,6 +154,12 @@ public class BackpackPreview {
ItemRarityBackgrounds.tryDraw(currentStack, context, itemX, itemY);
}
+ if (ItemProtection.isItemProtected(currentStack)) {
+ RenderSystem.enableBlend();
+ context.drawTexture(ITEM_PROTECTION, itemX, itemY, 0, 0, 16, 16, 16, 16);
+ RenderSystem.disableBlend();
+ }
+
context.drawItem(currentStack, itemX, itemY);
context.drawItemInSlot(textRenderer, currentStack, itemX, itemY);
}
@@ -159,6 +178,10 @@ public class BackpackPreview {
}
static class Storage {
+ private static final Codec<Storage> CODEC = RecordCodecBuilder.create(instance -> instance.group(
+ Codec.STRING.fieldOf("name").forGetter(Storage::name),
+ ItemUtils.EMPTY_ALLOWING_ITEMSTACK_CODEC.listOf().fieldOf("items").forGetter(Storage::getItemList)
+ ).apply(instance, Storage::create));
private final Inventory inventory;
private final String name;
private boolean dirty;
@@ -169,6 +192,10 @@ public class BackpackPreview {
this.dirty = dirty;
}
+ private String name() {
+ return name;
+ }
+
private int size() {
return inventory.size();
}
@@ -181,23 +208,19 @@ public class BackpackPreview {
dirty = false;
}
- @NotNull
- private static Storage fromNbt(NbtCompound root) {
- SimpleInventory inventory = new SimpleInventory(root.getList("list", NbtCompound.COMPOUND_TYPE).stream().map(NbtCompound.class::cast).map(ItemStack::fromNbt).toArray(ItemStack[]::new));
- return new Storage(inventory, root.getString("name"), false);
+ private static Storage create(String name, List<ItemStack> items) {
+ SimpleInventory inventory = new SimpleInventory(items.toArray(ItemStack[]::new));
+ return new Storage(inventory, name, false);
}
- @NotNull
- private NbtCompound toNbt() {
- NbtCompound root = new NbtCompound();
- NbtList list = new NbtList();
+ private List<ItemStack> getItemList() {
+ List<ItemStack> items = new ArrayList<>();
+
for (int i = 0; i < size(); ++i) {
- list.add(getStack(i).writeNbt(new NbtCompound()));
+ items.add(getStack(i));
}
- root.put("list", list);
- root.put("size", NbtInt.of(size()));
- root.putString("name", name);
- return root;
+
+ return items;
}
}
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java
index 657db0c9..c5279c61 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java
@@ -1,6 +1,6 @@
package de.hysky.skyblocker.skyblock.item.tooltip;
-import de.hysky.skyblocker.mixin.accessor.DrawContextInvoker;
+import de.hysky.skyblocker.mixins.accessors.DrawContextInvoker;
import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
import de.hysky.skyblocker.utils.ItemUtils;
import it.unimi.dsi.fastutil.ints.IntIntPair;
@@ -40,10 +40,9 @@ public class CompactorDeletorPreview {
if (targetIndex == -1) return false;
// Get items in compactor or deletor
- NbtCompound extraAttributes = ItemUtils.getExtraAttributes(stack);
- if (extraAttributes == null) return false;
+ NbtCompound customData = ItemUtils.getCustomData(stack);
// Get the slots and their items from the nbt, which is in the format personal_compact_<slot_number> or personal_deletor_<slot_number>
- List<IntObjectPair<ItemStack>> slots = extraAttributes.getKeys().stream().filter(slot -> slot.contains(type.toLowerCase().substring(0, 7))).map(slot -> IntObjectPair.of(Integer.parseInt(slot.substring(17)), ItemRepository.getItemStack(extraAttributes.getString(slot)))).toList();
+ List<IntObjectPair<ItemStack>> slots = customData.getKeys().stream().filter(slot -> slot.contains(type.toLowerCase().substring(0, 7))).map(slot -> IntObjectPair.of(Integer.parseInt(slot.substring(17)), ItemRepository.getItemStack(customData.getString(slot)))).toList();
List<TooltipComponent> components = tooltips.stream().map(Text::asOrderedText).map(TooltipComponent::of).collect(Collectors.toList());
IntIntPair dimensions = DIMENSIONS.getOrDefault(size, DEFAULT_DIMENSION);
@@ -60,9 +59,9 @@ public class CompactorDeletorPreview {
// Add the preview tooltip component
components.add(targetIndex, new CompactorPreviewTooltipComponent(slots, dimensions));
- if (extraAttributes.contains("PERSONAL_DELETOR_ACTIVE")) {
+ if (customData.contains("PERSONAL_DELETOR_ACTIVE")) {
components.add(targetIndex, TooltipComponent.of(Text.literal("Active: ")
- .append(extraAttributes.getBoolean("PERSONAL_DELETOR_ACTIVE") ? Text.literal("YES").formatted(Formatting.BOLD).formatted(Formatting.GREEN) : Text.literal("NO").formatted(Formatting.BOLD).formatted(Formatting.RED)).asOrderedText()));
+ .append(customData.getBoolean("PERSONAL_DELETOR_ACTIVE") ? Text.literal("YES").formatted(Formatting.BOLD).formatted(Formatting.GREEN) : Text.literal("NO").formatted(Formatting.BOLD).formatted(Formatting.RED)).asOrderedText()));
}
((DrawContextInvoker) context).invokeDrawTooltip(client.textRenderer, components, x, y, HoveredTooltipPositioner.INSTANCE);
return true;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java
index 66d94890..46babc8b 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java
@@ -65,8 +65,8 @@ public class ExoticTooltip {
return DyeType.EXOTIC;
}
- public static boolean intendedDyed(NbtCompound ItemData) {
- return ItemData.getCompound("ExtraAttributes").contains("dye_item");
+ public static boolean intendedDyed(NbtCompound customData) {
+ return customData.contains("dye_item");
}
public enum DyeType implements StringIdentifiable {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java
index ea24dc63..0cffa05c 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java
@@ -12,14 +12,17 @@ import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
import it.unimi.dsi.fastutil.Pair;
import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.item.TooltipContext;
-import net.minecraft.item.DyeableItem;
+import net.minecraft.client.item.TooltipType;
+import net.minecraft.component.DataComponentTypes;
+import net.minecraft.component.type.DyedColorComponent;
+import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
+
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,7 +36,7 @@ public class ItemTooltip {
protected static final SkyblockerConfig.ItemTooltip config = SkyblockerConfigManager.get().general.itemTooltip;
private static volatile boolean sentNullWarning = false;
- public static void getTooltip(ItemStack stack, TooltipContext context, List<Text> lines) {
+ public static void getTooltip(ItemStack stack, Item.TooltipContext tooltipContext, TooltipType tooltipType, List<Text> lines) {
if (!Utils.isOnSkyblock() || client.player == null) return;
String name = getInternalNameFromNBT(stack, false);
@@ -123,31 +126,31 @@ public class ItemTooltip {
}
}
- final Map<Integer, String> itemTierFloors = new HashMap<>() {{
- put(1, "F1");
- put(2, "F2");
- put(3, "F3");
- put(4, "F4/M1");
- put(5, "F5/M2");
- put(6, "F6/M3");
- put(7, "F7/M4");
- put(8, "M5");
- put(9, "M6");
- put(10, "M7");
- }};
+ final Map<Integer, String> itemTierFloors = Map.of(
+ 1, "F1",
+ 2, "F2",
+ 3, "F3",
+ 4, "F4/M1",
+ 5, "F5/M2",
+ 6, "F6/M3",
+ 7, "F7/M4",
+ 8, "M5",
+ 9, "M6",
+ 10, "M7"
+ );
if (SkyblockerConfigManager.get().general.dungeonQuality) {
- NbtCompound ea = ItemUtils.getExtraAttributes(stack);
- if (ea != null && ea.contains("baseStatBoostPercentage")) {
- int baseStatBoostPercentage = ea.getInt("baseStatBoostPercentage");
+ NbtCompound customData = ItemUtils.getCustomData(stack);
+ if (customData != null && customData.contains("baseStatBoostPercentage")) {
+ int baseStatBoostPercentage = customData.getInt("baseStatBoostPercentage");
boolean maxQuality = baseStatBoostPercentage == 50;
if (maxQuality) {
lines.add(Text.literal(String.format("%-17s", "Item Quality:") + baseStatBoostPercentage + "/50").formatted(Formatting.RED).formatted(Formatting.BOLD));
} else {
lines.add(Text.literal(String.format("%-21s", "Item Quality:") + baseStatBoostPercentage + "/50").formatted(Formatting.BLUE));
}
- if (ea.contains("item_tier")) { // sometimes it just isn't here?
- int itemTier = ea.getInt("item_tier");
+ if (customData.contains("item_tier")) { // sometimes it just isn't here?
+ int itemTier = customData.getInt("item_tier");
if (maxQuality) {
lines.add(Text.literal(String.format("%-17s", "Floor Tier:") + itemTier + " (" + itemTierFloors.get(itemTier) + ")").formatted(Formatting.RED).formatted(Formatting.BOLD));
} else {
@@ -186,8 +189,8 @@ public class ItemTooltip {
lines.add(Text.literal(String.format(format, "Museum: (" + itemCategory + ")"))
.formatted(Formatting.LIGHT_PURPLE));
} else {
- NbtCompound extraAttributes = ItemUtils.getExtraAttributes(stack);
- boolean isInMuseum = (extraAttributes.contains("donated_museum") && extraAttributes.getBoolean("donated_museum")) || MuseumItemCache.hasItemInMuseum(internalID);
+ NbtCompound customData = ItemUtils.getCustomData(stack);
+ boolean isInMuseum = (customData.contains("donated_museum") && customData.getBoolean("donated_museum")) || MuseumItemCache.hasItemInMuseum(internalID);
Formatting donatedIndicatorFormatting = isInMuseum ? Formatting.GREEN : Formatting.RED;
@@ -198,12 +201,16 @@ public class ItemTooltip {
}
}
- if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID) && stack.getNbt() != null) {
+ if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID) && stack.contains(DataComponentTypes.DYED_COLOR)) {
String uuid = ItemUtils.getItemUuid(stack);
boolean hasCustomDye = SkyblockerConfigManager.get().general.customDyeColors.containsKey(uuid) || SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(uuid);
+ //DyedColorComponent#getColor returns ARGB so we mask out the alpha bits
+ int dyeColor = DyedColorComponent.getColor(stack, 0);
- if (!hasCustomDye && stack.getItem() instanceof DyeableItem item && item.hasColor(stack)) {
- String colorHex = String.format("%06X", item.getColor(stack));
+ // dyeColor will have alpha = 255 if it's dyed, and alpha = 0 if it's not dyed,
+ if (!hasCustomDye && dyeColor != 0) {
+ dyeColor = dyeColor & 0x00FFFFFF;
+ String colorHex = String.format("%06X", dyeColor);
String expectedHex = ExoticTooltip.getExpectedHex(internalID);
boolean correctLine = false;
@@ -212,13 +219,13 @@ public class ItemTooltip {
if (existingTooltip.startsWith("Color: ")) {
correctLine = true;
- addExoticTooltip(lines, internalID, stack.getNbt(), colorHex, expectedHex, existingTooltip);
+ addExoticTooltip(lines, internalID, ItemUtils.getCustomData(stack), colorHex, expectedHex, existingTooltip);
break;
}
}
if (!correctLine) {
- addExoticTooltip(lines, internalID, stack.getNbt(), colorHex, expectedHex, "");
+ addExoticTooltip(lines, internalID, ItemUtils.getCustomData(stack), colorHex, expectedHex, "");
}
}
}
@@ -271,8 +278,8 @@ public class ItemTooltip {
return neuName;
}
- private static void addExoticTooltip(List<Text> lines, String internalID, NbtCompound nbt, String colorHex, String expectedHex, String existingTooltip) {
- if (expectedHex != null && !colorHex.equalsIgnoreCase(expectedHex) && !ExoticTooltip.isException(internalID, colorHex) && !ExoticTooltip.intendedDyed(nbt)) {
+ private static void addExoticTooltip(List<Text> lines, String internalID, NbtCompound customData, String colorHex, String expectedHex, String existingTooltip) {
+ if (expectedHex != null && !colorHex.equalsIgnoreCase(expectedHex) && !ExoticTooltip.isException(internalID, colorHex) && !ExoticTooltip.intendedDyed(customData)) {
final ExoticTooltip.DyeType type = ExoticTooltip.checkDyeType(colorHex);
lines.add(1, Text.literal(existingTooltip + Formatting.DARK_GRAY + "(").append(type.getTranslatedText()).append(Formatting.DARK_GRAY + ")"));
}
@@ -287,57 +294,57 @@ public class ItemTooltip {
// TODO What in the world is this?
public static String getInternalNameFromNBT(ItemStack stack, boolean internalIDOnly) {
- NbtCompound ea = ItemUtils.getExtraAttributes(stack);
+ NbtCompound customData = ItemUtils.getCustomData(stack);
- if (ea == null || !ea.contains(ItemUtils.ID, NbtElement.STRING_TYPE)) {
+ if (customData == null || !customData.contains(ItemUtils.ID, NbtElement.STRING_TYPE)) {
return null;
}
- String internalName = ea.getString(ItemUtils.ID);
+ String internalName = customData.getString(ItemUtils.ID);
if (internalIDOnly) {
return internalName;
}
// Transformation to API format.
- if (ea.contains("is_shiny")) {
+ if (customData.contains("is_shiny")) {
return "ISSHINY_" + internalName;
}
switch (internalName) {
case "ENCHANTED_BOOK" -> {
- if (ea.contains("enchantments")) {
- NbtCompound enchants = ea.getCompound("enchantments");
+ if (customData.contains("enchantments")) {
+ NbtCompound enchants = customData.getCompound("enchantments");
Optional<String> firstEnchant = enchants.getKeys().stream().findFirst();
String enchant = firstEnchant.orElse("");
return "ENCHANTMENT_" + enchant.toUpperCase(Locale.ENGLISH) + "_" + enchants.getInt(enchant);
}
}
case "PET" -> {
- if (ea.contains("petInfo")) {
- JsonObject petInfo = SkyblockerMod.GSON.fromJson(ea.getString("petInfo"), JsonObject.class);
+ if (customData.contains("petInfo")) {
+ JsonObject petInfo = SkyblockerMod.GSON.fromJson(customData.getString("petInfo"), JsonObject.class);
return "LVL_1_" + petInfo.get("tier").getAsString() + "_" + petInfo.get("type").getAsString();
}
}
case "POTION" -> {
- String enhanced = ea.contains("enhanced") ? "_ENHANCED" : "";
- String extended = ea.contains("extended") ? "_EXTENDED" : "";
- String splash = ea.contains("splash") ? "_SPLASH" : "";
- if (ea.contains("potion") && ea.contains("potion_level")) {
- return (ea.getString("potion") + "_" + internalName + "_" + ea.getInt("potion_level")
+ String enhanced = customData.contains("enhanced") ? "_ENHANCED" : "";
+ String extended = customData.contains("extended") ? "_EXTENDED" : "";
+ String splash = customData.contains("splash") ? "_SPLASH" : "";
+ if (customData.contains("potion") && customData.contains("potion_level")) {
+ return (customData.getString("potion") + "_" + internalName + "_" + customData.getInt("potion_level")
+ enhanced + extended + splash).toUpperCase(Locale.ENGLISH);
}
}
case "RUNE" -> {
- if (ea.contains("runes")) {
- NbtCompound runes = ea.getCompound("runes");
+ if (customData.contains("runes")) {
+ NbtCompound runes = customData.getCompound("runes");
Optional<String> firstRunes = runes.getKeys().stream().findFirst();
String rune = firstRunes.orElse("");
return rune.toUpperCase(Locale.ENGLISH) + "_RUNE_" + runes.getInt(rune);
}
}
case "ATTRIBUTE_SHARD" -> {
- if (ea.contains("attributes")) {
- NbtCompound shards = ea.getCompound("attributes");
+ if (customData.contains("attributes")) {
+ NbtCompound shards = customData.getCompound("attributes");
Optional<String> firstShards = shards.getKeys().stream().findFirst();
String shard = firstShards.orElse("");
return internalName + "-" + shard.toUpperCase(Locale.ENGLISH) + "_" + shards.getInt(shard);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemFixerUpper.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemFixerUpper.java
index 488c5f48..06230d4e 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemFixerUpper.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemFixerUpper.java
@@ -169,7 +169,7 @@ public class ItemFixerUpper {
private final static String[] TALLGRASS_VARIANTS = {
"minecraft:dead_bush",
- "minecraft:grass",
+ "minecraft:short_grass",
"minecraft:fern"
};
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java
index 5570c4f7..6120528c 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java
@@ -1,7 +1,8 @@
package de.hysky.skyblocker.skyblock.itemlist;
import com.mojang.blaze3d.systems.RenderSystem;
-import de.hysky.skyblocker.mixin.accessor.RecipeBookWidgetAccessor;
+
+import de.hysky.skyblocker.mixins.accessors.RecipeBookWidgetAccessor;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java
index 3379b693..4fd0f8cd 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java
@@ -1,16 +1,13 @@
package de.hysky.skyblocker.skyblock.itemlist;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.NEURepoManager;
import io.github.moulberry.repo.data.NEUCraftingRecipe;
import io.github.moulberry.repo.data.NEUItem;
import io.github.moulberry.repo.data.NEURecipe;
-import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
-import net.minecraft.text.Text;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -67,10 +64,9 @@ public class ItemRepository {
}
}
- public static String getWikiLink(String internalName, PlayerEntity player) {
+ public static String getWikiLink(String internalName) {
NEUItem item = NEURepoManager.NEU_REPO.getItems().getItemBySkyblockId(internalName);
if (item == null || item.getInfo() == null || item.getInfo().isEmpty()) {
- warnNoWikiLink(player);
return null;
}
@@ -83,16 +79,9 @@ public class ItemRepository {
} else if (wikiLink1.startsWith(wikiDomain)) {
return wikiLink1;
}
- warnNoWikiLink(player);
return null;
}
- private static void warnNoWikiLink(PlayerEntity player) {
- if (player != null) {
- player.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.wikiLookup.noArticleFound")), false);
- }
- }
-
public static List<SkyblockCraftingRecipe> getRecipes(String internalName) {
List<SkyblockCraftingRecipe> result = new ArrayList<>();
for (SkyblockCraftingRecipe recipe : recipes) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java
index c1eea23a..6ee75161 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java
@@ -5,10 +5,15 @@ import de.hysky.skyblocker.utils.NEURepoManager;
import io.github.moulberry.repo.constants.PetNumbers;
import io.github.moulberry.repo.data.NEUItem;
import io.github.moulberry.repo.data.Rarity;
-import net.minecraft.item.FireworkRocketItem;
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import net.minecraft.component.DataComponentTypes;
+import net.minecraft.component.type.*;
import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.*;
+import net.minecraft.nbt.NbtCompound;
+import net.minecraft.nbt.NbtString;
+import net.minecraft.registry.Registries;
import net.minecraft.text.Text;
+import net.minecraft.util.Identifier;
import net.minecraft.util.Pair;
import java.util.*;
@@ -16,6 +21,10 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ItemStackBuilder {
+ private static final Pattern SKULL_UUID_PATTERN = Pattern.compile("(?<=SkullOwner:\\{)Id:\"(.{36})\"");
+ private static final Pattern SKULL_TEXTURE_PATTERN = Pattern.compile("(?<=Properties:\\{textures:\\[0:\\{Value:)\"(.+?)\"");
+ private static final Pattern COLOR_PATTERN = Pattern.compile("color:(\\d+)");
+ private static final Pattern EXPLOSION_COLOR_PATTERN = Pattern.compile("\\{Explosion:\\{(?:Type:[0-9a-z]+,)?Colors:\\[(?<color>[0-9]+)]\\}");
private static Map<String, Map<Rarity, PetNumbers>> petNums;
public static void loadPetNums() {
@@ -31,73 +40,60 @@ public class ItemStackBuilder {
List<Pair<String, String>> injectors = new ArrayList<>(petData(internalName));
- NbtCompound root = new NbtCompound();
- root.put("Count", NbtByte.of((byte) 1));
+ String legacyId = item.getMinecraftItemId();
+ Identifier itemId = new Identifier(ItemFixerUpper.convertItemId(legacyId, item.getDamage()));
- String id = item.getMinecraftItemId();
- int damage = item.getDamage();
- root.put("id", NbtString.of(ItemFixerUpper.convertItemId(id, damage)));
+ ItemStack stack = new ItemStack(Registries.ITEM.get(itemId));
- NbtCompound tag = new NbtCompound();
- root.put("tag", tag);
+ // Custom Data
+ NbtCompound customData = new NbtCompound();
- NbtCompound extra = new NbtCompound();
- tag.put(ItemUtils.EXTRA_ATTRIBUTES, extra);
- extra.put(ItemUtils.ID, NbtString.of(internalName));
-
- NbtCompound display = new NbtCompound();
- tag.put("display", display);
+ // Add Skyblock Item Id
+ customData.put(ItemUtils.ID, NbtString.of(internalName));
+ // Item Name
String name = injectData(item.getDisplayName(), injectors);
- display.put("Name", NbtString.of(Text.Serialization.toJsonString(Text.of(name))));
+ stack.set(DataComponentTypes.CUSTOM_NAME, Text.of(name));
- NbtList lore = new NbtList();
- display.put("Lore", lore);
- item.getLore().forEach(el -> lore.add(NbtString.of(Text.Serialization.toJsonString(Text.of(injectData(el, injectors))))));
+ // Lore
+ stack.set(DataComponentTypes.LORE, new LoreComponent(item.getLore().stream().map(line -> Text.of(injectData(line, injectors))).toList()));
String nbttag = item.getNbttag();
// add skull texture
- Matcher skullUuid = Pattern.compile("(?<=SkullOwner:\\{)Id:\"(.{36})\"").matcher(nbttag);
- Matcher skullTexture = Pattern.compile("(?<=Properties:\\{textures:\\[0:\\{Value:)\"(.+?)\"").matcher(nbttag);
+ Matcher skullUuid = SKULL_UUID_PATTERN.matcher(nbttag);
+ Matcher skullTexture = SKULL_TEXTURE_PATTERN.matcher(nbttag);
if (skullUuid.find() && skullTexture.find()) {
- NbtCompound skullOwner = new NbtCompound();
- tag.put("SkullOwner", skullOwner);
UUID uuid = UUID.fromString(skullUuid.group(1));
- skullOwner.put("Id", NbtHelper.fromUuid(uuid));
- skullOwner.put("Name", NbtString.of(internalName));
-
- NbtCompound properties = new NbtCompound();
- skullOwner.put("Properties", properties);
- NbtList textures = new NbtList();
- properties.put("textures", textures);
- NbtCompound texture = new NbtCompound();
- textures.add(texture);
- texture.put("Value", NbtString.of(skullTexture.group(1)));
+ String textureValue = skullTexture.group(1);
+
+ stack.set(DataComponentTypes.PROFILE, new ProfileComponent(Optional.of(internalName), Optional.of(uuid), ItemUtils.propertyMapWithTexture(textureValue)));
}
+
// add leather armor dye color
- Matcher colorMatcher = Pattern.compile("color:(\\d+)").matcher(nbttag);
+ Matcher colorMatcher = COLOR_PATTERN.matcher(nbttag);
if (colorMatcher.find()) {
- NbtInt color = NbtInt.of(Integer.parseInt(colorMatcher.group(1)));
- display.put("color", color);
+ int color = Integer.parseInt(colorMatcher.group(1));
+ stack.set(DataComponentTypes.DYED_COLOR, new DyedColorComponent(color, false));
}
// add enchantment glint
if (nbttag.contains("ench:")) {
- NbtList enchantments = new NbtList();
- enchantments.add(new NbtCompound());
- tag.put("Enchantments", enchantments);
+ stack.set(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE, true);
}
+ //Hide weapon damage and other useless info
+ stack.set(DataComponentTypes.ATTRIBUTE_MODIFIERS, new AttributeModifiersComponent(List.of(), false));
+
// Add firework star color
- Matcher explosionColorMatcher = Pattern.compile("\\{Explosion:\\{(?:Type:[0-9a-z]+,)?Colors:\\[(?<color>[0-9]+)]\\}").matcher(nbttag);
+ Matcher explosionColorMatcher = EXPLOSION_COLOR_PATTERN.matcher(nbttag);
if (explosionColorMatcher.find()) {
- NbtCompound explosion = new NbtCompound();
-
- explosion.putInt("Type", FireworkRocketItem.Type.SMALL_BALL.getId()); //Forget about the actual ball type because it probably doesn't matter
- explosion.putIntArray("Colors", new int[]{Integer.parseInt(explosionColorMatcher.group("color"))});
- tag.put("Explosion", explosion);
+ //Forget about the actual ball type because it probably doesn't matter
+ stack.set(DataComponentTypes.FIREWORK_EXPLOSION, new FireworkExplosionComponent(FireworkExplosionComponent.Type.SMALL_BALL, new IntArrayList(Integer.parseInt(explosionColorMatcher.group("color"))), new IntArrayList(), false, false));
}
- return ItemStack.fromNbt(root);
+ // Attach custom nbt data
+ stack.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(customData));
+
+ return stack;
}
private static List<Pair<String, String>> petData(String internalName) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java
index 44e336d9..961a2cc2 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java
@@ -8,10 +8,13 @@ import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.Drawable;
import net.minecraft.client.gui.screen.ButtonTextures;
import net.minecraft.client.gui.widget.ToggleButtonWidget;
+import net.minecraft.component.DataComponentTypes;
+import net.minecraft.component.type.LoreComponent;
import net.minecraft.item.ItemStack;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
+
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
@@ -74,11 +77,8 @@ public class SearchResultsWidget implements Drawable {
this.searchResults.clear();
for (ItemStack entry : ItemRepository.getItems()) {
String name = entry.getName().toString().toLowerCase(Locale.ENGLISH);
- if (entry.getNbt() == null) {
- continue;
- }
- String disp = entry.getNbt().getCompound("display").toString().toLowerCase(Locale.ENGLISH);
- if (name.contains(this.searchText) || disp.contains(this.searchText))
+ LoreComponent lore = entry.getOrDefault(DataComponentTypes.LORE, LoreComponent.DEFAULT);
+ if (name.contains(this.searchText) || lore.lines().stream().map(Text::getString).anyMatch(s -> s.contains(this.searchText)))
this.searchResults.add(entry);
}
this.currentPage = 0;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNav.java b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNav.java
index 51a3d409..8e203b84 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNav.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNav.java
@@ -5,12 +5,12 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Utils;
+import de.hysky.skyblocker.utils.datafixer.ItemStackComponentizationFixer;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.fabricmc.fabric.api.client.screen.v1.Screens;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.client.network.ClientPlayerEntity;
-import net.minecraft.item.ItemStack;
import net.minecraft.nbt.StringNbtReader;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
@@ -21,8 +21,6 @@ import java.util.Locale;
import java.util.regex.PatternSyntaxException;
public class QuickNav {
- private static final String skyblockHubIconNbt = "{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;-300151517,-631415889,-1193921967,-1821784279],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0=\"}]}}}}";
- private static final String dungeonHubIconNbt = "{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;1605800870,415127827,-1236127084,15358548],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg5MWQ1YjI3M2ZmMGJjNTBjOTYwYjJjZDg2ZWVmMWM0MGExYjk0MDMyYWU3MWU3NTQ3NWE1NjhhODI1NzQyMSJ9fX0=\"}]}}}}";
public static void init() {
ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
@@ -74,7 +72,6 @@ public class QuickNav {
return new QuickNavButton(id,
uiTitleMatches,
buttonInfo.clickEvent,
- ItemStack.fromNbt(StringNbtReader.parse(nbtString))
- );
+ ItemStackComponentizationFixer.fixUpItem(StringNbtReader.parse(nbtString)));
}
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java
index 28ffc930..7db78590 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java
@@ -2,7 +2,7 @@ package de.hysky.skyblocker.skyblock.quicknav;
import com.mojang.blaze3d.systems.RenderSystem;
-import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor;
+import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor;
import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java
index aa3b976e..3918037f 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java
@@ -47,17 +47,17 @@ public class ShortcutsConfigListWidget extends ElementListWidget<ShortcutsConfig
}
@Override
- protected int getScrollbarPositionX() {
- return super.getScrollbarPositionX() + 50;
+ protected int getScrollbarX() {
+ return super.getScrollbarX();
}
protected Optional<ShortcutCategoryEntry> getCategory() {
- if (getSelectedOrNull() instanceof ShortcutCategoryEntry category) {
- return Optional.of(category);
- } else if (getSelectedOrNull() instanceof ShortcutEntry shortcutEntry) {
- return Optional.of(shortcutEntry.category);
- }
- return Optional.empty();
+ return switch (getSelectedOrNull()) {
+ case ShortcutCategoryEntry category -> Optional.of(category);
+ case ShortcutEntry shortcutEntry -> Optional.of(shortcutEntry.category);
+
+ case null, default -> Optional.empty();
+ };
}
@Override
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/special/SpecialEffects.java b/src/main/java/de/hysky/skyblocker/skyblock/special/SpecialEffects.java
index bc4f98c2..8e10086f 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/special/SpecialEffects.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/special/SpecialEffects.java
@@ -1,42 +1,24 @@
package de.hysky.skyblocker.skyblock.special;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.RenderHelper;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
import net.minecraft.client.MinecraftClient;
-import net.minecraft.enchantment.Enchantments;
import net.minecraft.item.ItemStack;
-import net.minecraft.item.Items;
-import net.minecraft.nbt.StringNbtReader;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.text.Text;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
public class SpecialEffects {
private static final Logger LOGGER = LoggerFactory.getLogger(SpecialEffects.class);
private static final Pattern DROP_PATTERN = Pattern.compile("(?:\\[[A-Z+]+] )?(?<player>[A-Za-z0-9_]+) unlocked (?<item>.+)!");
- private static final ItemStack NECRON_HANDLE = new ItemStack(Items.STICK);
- private static final ItemStack SCROLL = new ItemStack(Items.WRITABLE_BOOK);
- private static ItemStack TIER_5_SKULL;
- private static ItemStack FIFTH_STAR;
-
- static {
- NECRON_HANDLE.addEnchantment(Enchantments.PROTECTION, 1);
- SCROLL.addEnchantment(Enchantments.PROTECTION, 1);
- try {
- TIER_5_SKULL = ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;-1613868903,-527154034,-1445577520,748807544],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEwZjlmMTA4NWQ0MDcxNDFlYjc3NjE3YTRhYmRhYWEwOGQ4YWYzM2I5NjAyMDBmZThjMTI2YzFkMTQ0NTY4MiJ9fX0=\"}]}}}}"));
- FIFTH_STAR = ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;1904417095,756174249,-1302927470,1407004198],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzFjODA0MjUyN2Y4MWM4ZTI5M2UyODEwMTEzNDg5ZjQzOTRjYzZlZmUxNWQxYWZhYzQzMTU3MWM3M2I2MmRjNCJ9fX0=\"}]}}}}"));
- } catch (Exception e) {
- TIER_5_SKULL = ItemStack.EMPTY;
- FIFTH_STAR = ItemStack.EMPTY;
- LOGGER.error("[Skyblocker Special Effects] Failed to parse NBT for a player head!", e);
- }
- }
public static void init() {
ClientReceiveMessageEvents.GAME.register(SpecialEffects::displayRareDropEffect);
@@ -45,7 +27,7 @@ public class SpecialEffects {
private static void displayRareDropEffect(Text message, boolean overlay) {
//We don't check if we're in dungeons because that check doesn't work in m7 which defeats the point of this
//It might also allow it to work with Croesus
- if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.specialEffects.rareDungeonDropEffects) {
+ if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.specialEffects.rareDungeonDropEffects && !overlay) {
try {
String stringForm = message.getString();
Matcher matcher = DROP_PATTERN.matcher(stringForm);
@@ -57,7 +39,7 @@ public class SpecialEffects {
if (player.equals(client.getSession().getUsername())) {
ItemStack stack = getStackFromName(matcher.group("item"));
- if (!stack.isEmpty()) {
+ if (stack != null && !stack.isEmpty()) {
RenderHelper.runOnRenderThread(() -> {
client.particleManager.addEmitter(client.player, ParticleTypes.PORTAL, 30);
client.gameRenderer.showFloatingItem(stack);
@@ -72,20 +54,22 @@ public class SpecialEffects {
}
private static ItemStack getStackFromName(String itemName) {
- return switch (itemName) {
+ String itemId = switch (itemName) {
//M7
- case "Necron Dye" -> new ItemStack(Items.ORANGE_DYE);
- case "Dark Claymore" -> new ItemStack(Items.STONE_SWORD);
- case "Necron's Handle", "Shiny Necron's Handle" -> NECRON_HANDLE;
- case "Enchanted Book (Thunderlord VII)" -> new ItemStack(Items.ENCHANTED_BOOK);
- case "Master Skull - Tier 5" -> TIER_5_SKULL;
- case "Shadow Warp", "Wither Shield", "Implosion" -> SCROLL;
- case "Fifth Master Star" -> FIFTH_STAR;
+ case "Necron Dye" -> "NECRON_DYE";
+ case "Dark Claymore" -> "DARK_CLAYMORE";
+ case "Necron's Handle", "Shiny Necron's Handle" -> "NECRON_HANDLE";
+ case "Enchanted Book (Thunderlord VII)" -> "ENCHANTED_BOOK";
+ case "Master Skull - Tier 5" -> "MASTER_SKULL_TIER_5";
+ case "Shadow Warp", "Wither Shield", "Implosion" -> "IMPLOSION_SCROLL";
+ case "Fifth Master Star" -> "FIFTH_MASTER_STAR";
//M6
- case "Giant's Sword" -> new ItemStack(Items.IRON_SWORD);
+ case "Giant's Sword" -> "GIANTS_SWORD";
- default -> ItemStack.EMPTY;
+ default -> "NONE";
};
+
+ return ItemRepository.getItemStack(itemId);
}
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java
index 3ef968a3..472cf700 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java
@@ -4,7 +4,7 @@ import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import de.hysky.skyblocker.mixin.accessor.PlayerListHudAccessor;
+import de.hysky.skyblocker.mixins.accessors.PlayerListHudAccessor;
import de.hysky.skyblocker.utils.Utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java
index c4388178..9522be43 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java
@@ -5,7 +5,6 @@ import net.minecraft.client.gui.DrawContext;
import net.minecraft.item.ItemStack;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
-import net.minecraft.util.math.MathHelper;
/**
@@ -37,7 +36,7 @@ public class ProgressComponent extends Component {
this.ico = (ico == null) ? Ico.BARRIER : ico;
this.desc = d;
this.bar = b;
- this.pcnt = MathHelper.clamp(pcnt, 0f, 100f);
+ this.pcnt = Math.clamp(pcnt, 0f, 100f);
this.color = 0xff000000 | color;
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/waypoint/OrderedWaypoints.java b/src/main/java/de/hysky/skyblocker/skyblock/waypoint/OrderedWaypoints.java
index 93c6b3f4..b70bac47 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/waypoint/OrderedWaypoints.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/waypoint/OrderedWaypoints.java
@@ -58,7 +58,6 @@ import net.minecraft.command.argument.PosArgument;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.text.Text;
import net.minecraft.util.math.BlockPos;
-import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
public class OrderedWaypoints {
@@ -144,7 +143,7 @@ public class OrderedWaypoints {
OrderedWaypoint waypoint = new OrderedWaypoint(pos, colorComponents);
if (index != Integer.MIN_VALUE) {
- int indexToAddAt = MathHelper.clamp(index, 0, group.waypoints().size());
+ int indexToAddAt = Math.clamp(index, 0, group.waypoints().size());
group.waypoints().add(indexToAddAt, waypoint);
INDEX_STORE.removeInt(group.name());
@@ -188,7 +187,7 @@ public class OrderedWaypoints {
}
if (index != Integer.MIN_VALUE) {
- int indexToRemove = MathHelper.clamp(index, 0, group.waypoints().size() - 1);
+ int indexToRemove = Math.clamp(index, 0, group.waypoints().size() - 1);
group.waypoints().remove(indexToRemove);
INDEX_STORE.removeInt(group.name());
@@ -221,6 +220,7 @@ public class OrderedWaypoints {
for (OrderedWaypointGroup group : WAYPOINTS.values()) {
if (group.enabled()) {
List<OrderedWaypoint> waypoints = group.waypoints();
+ if (waypoints.isEmpty()) continue;
ClientPlayerEntity player = MinecraftClient.getInstance().player;
int centreIndex = INDEX_STORE.computeIfAbsent(group.name(), name -> 0);
@@ -258,7 +258,7 @@ public class OrderedWaypoints {
private static void load() {
loaded = CompletableFuture.runAsync(() -> {
try (BufferedReader reader = Files.newBufferedReader(PATH)) {
- WAYPOINTS.putAll(SERIALIZATION_CODEC.parse(JsonOps.INSTANCE, JsonParser.parseReader(reader)).result().orElseThrow());
+ WAYPOINTS.putAll(SERIALIZATION_CODEC.parse(JsonOps.INSTANCE, JsonParser.parseReader(reader)).getOrThrow());
} catch (NoSuchFileException ignored) {
} catch (Exception e) {
LOGGER.error("[Skyblocker Ordered Waypoints] Failed to load the waypoints! :(", e);
@@ -268,7 +268,7 @@ public class OrderedWaypoints {
private static void save() {
try (BufferedWriter writer = Files.newBufferedWriter(PATH)) {
- SkyblockerMod.GSON.toJson(SERIALIZATION_CODEC.encodeStart(JsonOps.INSTANCE, WAYPOINTS).result().orElseThrow(), writer);
+ SkyblockerMod.GSON.toJson(SERIALIZATION_CODEC.encodeStart(JsonOps.INSTANCE, WAYPOINTS).getOrThrow(), writer);
} catch (Exception e) {
LOGGER.error("[Skyblocker Ordered Waypoints] Failed to save the waypoints! :(", e);
}
@@ -276,7 +276,7 @@ public class OrderedWaypoints {
private static int export(FabricClientCommandSource source) {
try {
- String json = new Gson().toJson(SERIALIZATION_CODEC.encodeStart(JsonOps.INSTANCE, WAYPOINTS).result().orElseThrow());
+ String json = new Gson().toJson(SERIALIZATION_CODEC.encodeStart(JsonOps.INSTANCE, WAYPOINTS).getOrThrow());
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out);
@@ -306,7 +306,7 @@ public class OrderedWaypoints {
byte[] decoded = Base64.getDecoder().decode(encoded);
String json = new String(new GZIPInputStream(new ByteArrayInputStream(decoded)).readAllBytes());
- Map<String, OrderedWaypointGroup> importedWaypoints = SERIALIZATION_CODEC.parse(JsonOps.INSTANCE, JsonParser.parseString(json)).result().orElseThrow();
+ Map<String, OrderedWaypointGroup> importedWaypoints = SERIALIZATION_CODEC.parse(JsonOps.INSTANCE, JsonParser.parseString(json)).getOrThrow();
SEMAPHORE.acquireUninterruptibly();
WAYPOINTS.putAll(importedWaypoints);
@@ -332,7 +332,7 @@ public class OrderedWaypoints {
}
String json = MinecraftClient.getInstance().keyboard.getClipboard();
- List<ColeWeightWaypoint> coleWeightWaypoints = ColeWeightWaypoint.LIST_CODEC.parse(JsonOps.INSTANCE, JsonParser.parseString(json)).result().orElseThrow();
+ List<ColeWeightWaypoint> coleWeightWaypoints = ColeWeightWaypoint.LIST_CODEC.parse(JsonOps.INSTANCE, JsonParser.parseString(json)).getOrThrow();
ObjectArrayList<OrderedWaypoint> convertedWaypoints = new ObjectArrayList<>();
for (ColeWeightWaypoint waypoint : coleWeightWaypoints) {