aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/de/hysky/skyblocker/SkyblockerMod.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/config/ConfigUtils.java20
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java9
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java5
-rw-r--r--src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownController.java93
-rw-r--r--src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownControllerBuilder.java27
-rw-r--r--src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java27
-rw-r--r--src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownControllerElement.java26
-rw-r--r--src/main/java/de/hysky/skyblocker/debug/Debug.java27
-rw-r--r--src/main/java/de/hysky/skyblocker/debug/DumpPlayersCommand.java31
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java19
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java18
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java18
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/Trivia.java25
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/ItemRarityBackgrounds.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockItemRarity.java1
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/ItemUtils.java12
-rw-r--r--src/main/resources/skyblocker.mixins.json3
18 files changed, 139 insertions, 230 deletions
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
index 1473d1de..ad5e442f 100644
--- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
+++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
@@ -5,7 +5,6 @@ import com.google.gson.GsonBuilder;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.debug.Debug;
import de.hysky.skyblocker.skyblock.*;
-import de.hysky.skyblocker.skyblock.waypoint.MythologicalRitual;
import de.hysky.skyblocker.skyblock.dungeon.*;
import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonSecrets;
import de.hysky.skyblocker.skyblock.dungeon.secrets.SecretsTracker;
@@ -18,11 +17,12 @@ import de.hysky.skyblocker.skyblock.quicknav.QuickNav;
import de.hysky.skyblocker.skyblock.rift.TheRift;
import de.hysky.skyblocker.skyblock.shortcut.Shortcuts;
import de.hysky.skyblocker.skyblock.special.SpecialEffects;
-import de.hysky.skyblocker.skyblock.waypoint.Relics;
import de.hysky.skyblocker.skyblock.tabhud.TabHud;
import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
import de.hysky.skyblocker.skyblock.waypoint.FairySouls;
+import de.hysky.skyblocker.skyblock.waypoint.MythologicalRitual;
+import de.hysky.skyblocker.skyblock.waypoint.Relics;
import de.hysky.skyblocker.utils.ApiUtils;
import de.hysky.skyblocker.utils.NEURepoManager;
import de.hysky.skyblocker.utils.Utils;
diff --git a/src/main/java/de/hysky/skyblocker/config/ConfigUtils.java b/src/main/java/de/hysky/skyblocker/config/ConfigUtils.java
index 9a7a41b5..8b0f27a7 100644
--- a/src/main/java/de/hysky/skyblocker/config/ConfigUtils.java
+++ b/src/main/java/de/hysky/skyblocker/config/ConfigUtils.java
@@ -1,9 +1,7 @@
package de.hysky.skyblocker.config;
import dev.isxander.yacl3.api.Option;
-import dev.isxander.yacl3.api.controller.BooleanControllerBuilder;
-import dev.isxander.yacl3.api.controller.EnumControllerBuilder;
-import dev.isxander.yacl3.api.controller.ValueFormatter;
+import dev.isxander.yacl3.api.controller.*;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import org.apache.commons.lang3.StringUtils;
@@ -11,7 +9,7 @@ import org.apache.commons.lang3.StringUtils;
import java.util.function.Function;
public class ConfigUtils {
- public static final Function<Formatting, String> FORMATTING_TO_STRING = formatting -> StringUtils.capitalize(formatting.getName().replaceAll("_", " "));
+ public static final ValueFormatter<Formatting> FORMATTING_FORMATTER = formatting -> Text.literal(StringUtils.capitalize(formatting.getName().replaceAll("_", " ")));
public static final ValueFormatter<Float> FLOAT_TWO_FORMATTER = value -> Text.literal(String.format("%,.2f", value).replaceAll("[\u00a0\u202F]", " "));
public static BooleanControllerBuilder createBooleanController(Option<Boolean> opt) {
@@ -22,4 +20,18 @@ public class ConfigUtils {
public static <E extends Enum<E>> EnumControllerBuilder<E> createEnumCyclingListController(Option<E> opt) {
return EnumControllerBuilder.create(opt).enumClass((Class<E>) opt.binding().defaultValue().getClass());
}
+
+ /**
+ * Creates a factory for {@link EnumDropdownControllerBuilder}s with the given function for converting enum constants to texts.
+ * Use this if a custom formatter function for an enum is needed.
+ * Use it like this:
+ * <pre>{@code Option.<MyEnum>createBuilder().controller(ConfigUtils.getEnumDropdownControllerFactory(MY_CUSTOM_ENUM_TO_TEXT_FUNCTION))}</pre>
+ *
+ * @param formatter The function used to convert enum constants to texts used for display, suggestion, and validation
+ * @param <E> the enum type
+ * @return a factory for {@link EnumDropdownControllerBuilder}s
+ */
+ public static <E extends Enum<E>> Function<Option<E>, ControllerBuilder<E>> getEnumDropdownControllerFactory(ValueFormatter<E> formatter) {
+ return opt -> EnumDropdownControllerBuilder.create(opt).formatValue(formatter);
+ }
}
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
index 246611cc..3d304487 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
@@ -12,7 +12,6 @@ import dev.isxander.yacl3.api.OptionGroup;
import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder;
import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder;
import dev.isxander.yacl3.api.controller.StringControllerBuilder;
-import de.hysky.skyblocker.config.controllers.EnumDropdownControllerBuilder;
import de.hysky.skyblocker.skyblock.dungeon.DungeonMapConfigScreen;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
@@ -209,21 +208,21 @@ public class DungeonsCategory {
.binding(defaults.locations.dungeons.dungeonChestProfit.neutralColor,
() -> config.locations.dungeons.dungeonChestProfit.neutralColor,
newValue -> config.locations.dungeons.dungeonChestProfit.neutralColor = newValue)
- .controller(EnumDropdownControllerBuilder.getFactory(ConfigUtils.FORMATTING_TO_STRING))
+ .controller(ConfigUtils.getEnumDropdownControllerFactory(ConfigUtils.FORMATTING_FORMATTER))
.build())
.option(Option.<Formatting>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.profitColor"))
.binding(defaults.locations.dungeons.dungeonChestProfit.profitColor,
() -> config.locations.dungeons.dungeonChestProfit.profitColor,
newValue -> config.locations.dungeons.dungeonChestProfit.profitColor = newValue)
- .controller(EnumDropdownControllerBuilder.getFactory(ConfigUtils.FORMATTING_TO_STRING))
+ .controller(ConfigUtils.getEnumDropdownControllerFactory(ConfigUtils.FORMATTING_FORMATTER))
.build())
.option(Option.<Formatting>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.lossColor"))
.binding(defaults.locations.dungeons.dungeonChestProfit.lossColor,
() -> config.locations.dungeons.dungeonChestProfit.lossColor,
newValue -> config.locations.dungeons.dungeonChestProfit.lossColor = newValue)
- .controller(EnumDropdownControllerBuilder.getFactory(ConfigUtils.FORMATTING_TO_STRING))
+ .controller(ConfigUtils.getEnumDropdownControllerFactory(ConfigUtils.FORMATTING_FORMATTER))
.build())
.option(Option.<Formatting>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.chestValue.incompleteColor"))
@@ -231,7 +230,7 @@ public class DungeonsCategory {
.binding(defaults.locations.dungeons.dungeonChestProfit.incompleteColor,
() -> config.locations.dungeons.dungeonChestProfit.incompleteColor,
newValue -> config.locations.dungeons.dungeonChestProfit.incompleteColor = newValue)
- .controller(EnumDropdownControllerBuilder.getFactory(ConfigUtils.FORMATTING_TO_STRING))
+ .controller(ConfigUtils.getEnumDropdownControllerFactory(ConfigUtils.FORMATTING_FORMATTER))
.build())
.build())
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java
index 8d8c6f46..2065f6df 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java
@@ -2,7 +2,6 @@ package de.hysky.skyblocker.config.categories;
import de.hysky.skyblocker.config.ConfigUtils;
import de.hysky.skyblocker.config.SkyblockerConfig;
-import de.hysky.skyblocker.config.controllers.EnumDropdownControllerBuilder;
import de.hysky.skyblocker.skyblock.shortcut.ShortcutsConfigScreen;
import de.hysky.skyblocker.utils.render.title.TitleContainerConfigScreen;
import de.hysky.skyblocker.utils.waypoint.Waypoint;
@@ -474,7 +473,7 @@ public class GeneralCategory {
.binding(defaults.general.chestValue.color,
() -> config.general.chestValue.color,
newValue -> config.general.chestValue.color = newValue)
- .controller(EnumDropdownControllerBuilder.getFactory(ConfigUtils.FORMATTING_TO_STRING))
+ .controller(ConfigUtils.getEnumDropdownControllerFactory(ConfigUtils.FORMATTING_FORMATTER))
.build())
.option(Option.<Formatting>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.chestValue.incompleteColor"))
@@ -482,7 +481,7 @@ public class GeneralCategory {
.binding(defaults.general.chestValue.incompleteColor,
() -> config.general.chestValue.incompleteColor,
newValue -> config.general.chestValue.incompleteColor = newValue)
- .controller(EnumDropdownControllerBuilder.getFactory(ConfigUtils.FORMATTING_TO_STRING))
+ .controller(ConfigUtils.getEnumDropdownControllerFactory(ConfigUtils.FORMATTING_FORMATTER))
.build())
.build())
diff --git a/src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownController.java b/src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownController.java
deleted file mode 100644
index 0b9a809d..00000000
--- a/src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownController.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package de.hysky.skyblocker.config.controllers;
-
-import dev.isxander.yacl3.api.Option;
-import dev.isxander.yacl3.api.utils.Dimension;
-import dev.isxander.yacl3.gui.AbstractWidget;
-import dev.isxander.yacl3.gui.YACLScreen;
-import dev.isxander.yacl3.gui.controllers.dropdown.AbstractDropdownController;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Arrays;
-import java.util.function.Function;
-import java.util.stream.Stream;
-
-public class EnumDropdownController<E extends Enum<E>> extends AbstractDropdownController<E> {
- /**
- * The function used to convert enum constants to strings used for display, suggestion, and validation. Defaults to {@link Enum#toString}.
- */
- protected final Function<E, String> toString;
-
- protected EnumDropdownController(Option<E> option, Function<E, String> toString) {
- super(option);
- this.toString = toString;
- }
-
- @Override
- public String getString() {
- return toString.apply(option().pendingValue());
- }
-
- @Override
- public void setFromString(String value) {
- option().requestSet(getEnumFromString(value));
- }
-
- /**
- * Searches through enum constants for one whose {@link #toString} result equals {@code value}
- *
- * @return The enum constant associated with the {@code value} or the pending value if none are found
- * @implNote The return value of {@link #toString} on each enum constant should be unique in order to ensure accuracy
- */
- private E getEnumFromString(String value) {
- value = value.toLowerCase();
- for (E constant : option().pendingValue().getDeclaringClass().getEnumConstants()) {
- if (toString.apply(constant).toLowerCase().equals(value)) return constant;
- }
-
- return option().pendingValue();
- }
-
- @Override
- public boolean isValueValid(String value) {
- value = value.toLowerCase();
- for (E constant : option().pendingValue().getDeclaringClass().getEnumConstants()) {
- if (toString.apply(constant).equals(value)) return true;
- }
-
- return false;
- }
-
- @Override
- protected String getValidValue(String value, int offset) {
- return getValidEnumConstants(value)
- .skip(offset)
- .findFirst()
- .orElseGet(this::getString);
- }
-
- /**
- * Filters and sorts through enum constants for those whose {@link #toString} result equals {@code value}
- *
- * @return a sorted stream containing enum constants associated with the {@code value}
- * @implNote The return value of {@link #toString} on each enum constant should be unique in order to ensure accuracy
- */
- @NotNull
- protected Stream<String> getValidEnumConstants(String value) {
- String valueLowerCase = value.toLowerCase();
- return Arrays.stream(option().pendingValue().getDeclaringClass().getEnumConstants())
- .map(this.toString)
- .filter(constant -> constant.toLowerCase().contains(valueLowerCase))
- .sorted((s1, s2) -> {
- String s1LowerCase = s1.toLowerCase();
- String s2LowerCase = s2.toLowerCase();
- if (s1LowerCase.startsWith(valueLowerCase) && !s2LowerCase.startsWith(valueLowerCase)) return -1;
- if (!s1LowerCase.startsWith(valueLowerCase) && s2LowerCase.startsWith(valueLowerCase)) return 1;
- return s1.compareTo(s2);
- });
- }
-
- @Override
- public AbstractWidget provideWidget(YACLScreen screen, Dimension<Integer> widgetDimension) {
- return new EnumDropdownControllerElement<>(this, screen, widgetDimension);
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownControllerBuilder.java b/src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownControllerBuilder.java
deleted file mode 100644
index d451a88c..00000000
--- a/src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownControllerBuilder.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package de.hysky.skyblocker.config.controllers;
-
-import dev.isxander.yacl3.api.Option;
-import dev.isxander.yacl3.api.controller.ControllerBuilder;
-
-import java.util.function.Function;
-
-public interface EnumDropdownControllerBuilder<E extends Enum<E>> extends ControllerBuilder<E> {
- EnumDropdownControllerBuilder<E> toString(Function<E, String> toString);
-
- static <E extends Enum<E>> EnumDropdownControllerBuilder<E> create(Option<E> option) {
- return new EnumDropdownControllerBuilderImpl<>(option);
- }
-
- /**
- * Creates a factory for {@link EnumDropdownControllerBuilder}s with the given function for converting enum constants to strings.
- * Use this if a custom toString function for an enum is needed.
- * Use it like this:
- * <pre>{@code Option.<MyEnum>createBuilder().controller(createEnumDropdownControllerBuilder.getFactory(MY_CUSTOM_ENUM_TO_STRING_FUNCTION))}</pre>
- * @param toString The function used to convert enum constants to strings used for display, suggestion, and validation
- * @return a factory for {@link EnumDropdownControllerBuilder}s
- * @param <E> the enum type
- */
- static <E extends Enum<E>> Function<Option<E>, ControllerBuilder<E>> getFactory(Function<E, String> toString) {
- return opt -> EnumDropdownControllerBuilder.create(opt).toString(toString);
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java b/src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java
deleted file mode 100644
index 8f6dbb2a..00000000
--- a/src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package de.hysky.skyblocker.config.controllers;
-
-import dev.isxander.yacl3.api.Controller;
-import dev.isxander.yacl3.api.Option;
-import dev.isxander.yacl3.impl.controller.AbstractControllerBuilderImpl;
-
-import java.util.function.Function;
-
-public class EnumDropdownControllerBuilderImpl<E extends Enum<E>> extends AbstractControllerBuilderImpl<E> implements EnumDropdownControllerBuilder<E> {
- private Function<E, String> toString = Enum::toString;
-
- public EnumDropdownControllerBuilderImpl(Option<E> option) {
- super(option);
- }
-
- @Override
- public EnumDropdownControllerBuilder<E> toString(Function<E, String> toString) {
- this.toString = toString;
- return this;
- }
-
- @SuppressWarnings("UnstableApiUsage")
- @Override
- public Controller<E> build() {
- return new EnumDropdownController<>(option, toString);
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownControllerElement.java b/src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownControllerElement.java
deleted file mode 100644
index 2a8de609..00000000
--- a/src/main/java/de/hysky/skyblocker/config/controllers/EnumDropdownControllerElement.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package de.hysky.skyblocker.config.controllers;
-
-import dev.isxander.yacl3.api.utils.Dimension;
-import dev.isxander.yacl3.gui.YACLScreen;
-import dev.isxander.yacl3.gui.controllers.dropdown.AbstractDropdownControllerElement;
-
-import java.util.List;
-
-public class EnumDropdownControllerElement<E extends Enum<E>> extends AbstractDropdownControllerElement<E, String> {
- private final EnumDropdownController<E> controller;
-
- public EnumDropdownControllerElement(EnumDropdownController<E> control, YACLScreen screen, Dimension<Integer> dim) {
- super(control, screen, dim);
- this.controller = control;
- }
-
- @Override
- public List<String> computeMatchingValues() {
- return controller.getValidEnumConstants(inputField).toList();
- }
-
- @Override
- public String getString(String object) {
- return object;
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/debug/Debug.java b/src/main/java/de/hysky/skyblocker/debug/Debug.java
index 1fc22d2a..86adcac6 100644
--- a/src/main/java/de/hysky/skyblocker/debug/Debug.java
+++ b/src/main/java/de/hysky/skyblocker/debug/Debug.java
@@ -1,14 +1,37 @@
package de.hysky.skyblocker.debug;
+import com.mojang.brigadier.Command;
+import com.mojang.brigadier.builder.LiteralArgumentBuilder;
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.utils.ItemUtils;
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.text.Text;
+
+import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
public class Debug {
private static final boolean DEBUG_ENABLED = Boolean.parseBoolean(System.getProperty("skyblocker.debug", "false"));
+ public static boolean debugEnabled() {
+ return DEBUG_ENABLED || FabricLoader.getInstance().isDevelopmentEnvironment();
+ }
+
public static void init() {
- if (DEBUG_ENABLED || FabricLoader.getInstance().isDevelopmentEnvironment()) {
- ClientCommandRegistrationCallback.EVENT.register(DumpPlayersCommand::register);
+ if (debugEnabled()) {
+ ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE).then(literal("debug")
+ .then(dumpPlayersCommand())
+ .then(ItemUtils.dumpHeldItemNbtCommand())
+ )));
}
}
+
+ private static LiteralArgumentBuilder<FabricClientCommandSource> dumpPlayersCommand() {
+ return literal("dumpPlayers")
+ .executes(context -> {
+ context.getSource().getWorld().getPlayers().forEach(player -> context.getSource().sendFeedback(Text.of("'" + player.getName().getString() + "'")));
+ return Command.SINGLE_SUCCESS;
+ });
+ }
}
diff --git a/src/main/java/de/hysky/skyblocker/debug/DumpPlayersCommand.java b/src/main/java/de/hysky/skyblocker/debug/DumpPlayersCommand.java
deleted file mode 100644
index 5f6e0362..00000000
--- a/src/main/java/de/hysky/skyblocker/debug/DumpPlayersCommand.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package de.hysky.skyblocker.debug;
-
-import com.mojang.brigadier.Command;
-import com.mojang.brigadier.CommandDispatcher;
-import de.hysky.skyblocker.SkyblockerMod;
-import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
-import net.minecraft.command.CommandRegistryAccess;
-import net.minecraft.entity.player.PlayerEntity;
-import net.minecraft.text.Text;
-
-import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
-
-public class DumpPlayersCommand {
-
- static void register(CommandDispatcher<FabricClientCommandSource> dispatcher, CommandRegistryAccess registryAccess) {
- dispatcher.register(literal(SkyblockerMod.NAMESPACE)
- .then(literal("debug")
- .then(literal("dumpPlayers")
- .executes(context -> {
- FabricClientCommandSource source = context.getSource();
-
- source.getWorld().getEntities().forEach(e -> {
- if (e instanceof PlayerEntity player) {
- source.sendFeedback(Text.of("'" + player.getName().getString() + "'"));
- }
- });
-
- return Command.SINGLE_SUCCESS;
- }))));
- }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java
new file mode 100644
index 00000000..0d12200c
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java
@@ -0,0 +1,19 @@
+package de.hysky.skyblocker.mixin;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import de.hysky.skyblocker.utils.Utils;
+import dev.cbyrne.betterinject.annotations.Inject;
+import net.minecraft.entity.data.DataTracker;
+
+@Mixin(DataTracker.class)
+public class DataTrackerMixin {
+
+ @Inject(method = "copyToFrom", at = @At(value = "NEW", target = "Ljava/lang/IllegalStateException;", shift = At.Shift.BEFORE), cancellable = true)
+ public void skyblocker$ignoreInvalidDataExceptions(CallbackInfo ci) {
+ //These exceptions cause annoying small lag spikes for some reason
+ if (Utils.isOnHypixel()) ci.cancel();
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java b/src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java
new file mode 100644
index 00000000..5cf88588
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java
@@ -0,0 +1,18 @@
+package de.hysky.skyblocker.mixin;
+
+import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
+import de.hysky.skyblocker.debug.Debug;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.client.render.entity.EntityRenderDispatcher;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.decoration.ArmorStandEntity;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+@Mixin(EntityRenderDispatcher.class)
+public class EntityRenderDispatcherMixin {
+ @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;isInvisible()Z", ordinal = 1))
+ private <E extends Entity> boolean skyblocker$armorStandHitboxVisible(boolean invisible, E entity) {
+ return (!(entity instanceof ArmorStandEntity) || !Utils.isOnHypixel() || !Debug.debugEnabled()) && invisible;
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java
new file mode 100644
index 00000000..cf927f0c
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java
@@ -0,0 +1,18 @@
+package de.hysky.skyblocker.mixin;
+
+import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
+import de.hysky.skyblocker.debug.Debug;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.client.render.entity.LivingEntityRenderer;
+import net.minecraft.entity.LivingEntity;
+import net.minecraft.entity.decoration.ArmorStandEntity;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+@Mixin(LivingEntityRenderer.class)
+public class LivingEntityRendererMixin {
+ @ModifyExpressionValue(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/LivingEntityRenderer;isVisible(Lnet/minecraft/entity/LivingEntity;)Z"))
+ private <T extends LivingEntity> boolean skyblocker$armorStandVisible(boolean visible, T entity) {
+ return entity instanceof ArmorStandEntity && Utils.isOnHypixel() && Debug.debugEnabled() || visible;
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/Trivia.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/Trivia.java
index 53368c14..21bbdce0 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/Trivia.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/Trivia.java
@@ -10,11 +10,15 @@ import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.slf4j.Logger;
+
+import com.mojang.logging.LogUtils;
import java.util.*;
import java.util.regex.Matcher;
public class Trivia extends ChatPatternListener {
+ private static final Logger LOGGER = LogUtils.getLogger();
private static final Map<String, String[]> answers;
private List<String> solutions = Collections.emptyList();
@@ -42,14 +46,19 @@ public class Trivia extends ChatPatternListener {
}
private void updateSolutions(String question) {
- String trimmedQuestion = question.trim();
- if (trimmedQuestion.equals("What SkyBlock year is it?")) {
- long currentTime = System.currentTimeMillis() / 1000L;
- long diff = currentTime - 1560276000;
- int year = (int) (diff / 446400 + 1);
- solutions = Collections.singletonList("Year " + year);
- } else {
- solutions = Arrays.asList(answers.get(trimmedQuestion));
+ try {
+ String trimmedQuestion = question.trim();
+ if (trimmedQuestion.equals("What SkyBlock year is it?")) {
+ long currentTime = System.currentTimeMillis() / 1000L;
+ long diff = currentTime - 1560276000;
+ int year = (int) (diff / 446400 + 1);
+ solutions = Collections.singletonList("Year " + year);
+ } else {
+ String[] questionAnswers = answers.get(trimmedQuestion);
+ if (questionAnswers != null) solutions = Arrays.asList(questionAnswers);
+ }
+ } catch (Exception e) { //Hopefully the solver doesn't go south
+ LOGGER.error("[Skyblocker] Failed to update the Trivia puzzle answers!", e);
}
}
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 8867af91..c9cdb99a 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/ItemRarityBackgrounds.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/ItemRarityBackgrounds.java
@@ -28,6 +28,7 @@ public class ItemRarityBackgrounds {
private static final Supplier<Sprite> SPRITE = () -> MinecraftClient.getInstance().getGuiAtlasManager().getSprite(CONFIG.itemRarityBackgroundStyle.tex);
private static final ImmutableMap<String, SkyblockItemRarity> LORE_RARITIES = ImmutableMap.ofEntries(
Map.entry("ADMIN", SkyblockItemRarity.ADMIN),
+ Map.entry("ULTIMATE", SkyblockItemRarity.ULTIMATE),
Map.entry("SPECIAL", SkyblockItemRarity.SPECIAL), //Very special is the same color so this will cover it
Map.entry("DIVINE", SkyblockItemRarity.DIVINE),
Map.entry("MYTHIC", SkyblockItemRarity.MYTHIC),
@@ -36,8 +37,7 @@ public class ItemRarityBackgrounds {
Map.entry("EPIC", SkyblockItemRarity.EPIC),
Map.entry("RARE", SkyblockItemRarity.RARE),
Map.entry("UNCOMMON", SkyblockItemRarity.UNCOMMON),
- Map.entry("COMMON", SkyblockItemRarity.COMMON)
- );
+ Map.entry("COMMON", SkyblockItemRarity.COMMON));
private static final Int2ReferenceOpenHashMap<SkyblockItemRarity> CACHE = new Int2ReferenceOpenHashMap<>();
public static void init() {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockItemRarity.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockItemRarity.java
index 07a566af..4addeac6 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockItemRarity.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockItemRarity.java
@@ -4,6 +4,7 @@ import net.minecraft.util.Formatting;
public enum SkyblockItemRarity {
ADMIN(Formatting.DARK_RED),
+ ULTIMATE(Formatting.DARK_RED),
VERY_SPECIAL(Formatting.RED),
SPECIAL(Formatting.RED),
DIVINE(Formatting.AQUA),
diff --git a/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java b/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java
index ed46677d..6e80acea 100644
--- a/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java
+++ b/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java
@@ -1,7 +1,10 @@
package de.hysky.skyblocker.utils;
+import com.mojang.brigadier.Command;
+import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import it.unimi.dsi.fastutil.ints.IntIntPair;
+import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.item.ItemStack;
@@ -18,6 +21,8 @@ import java.util.Optional;
import java.util.function.Predicate;
import java.util.regex.Pattern;
+import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
+
public class ItemUtils {
public static final String EXTRA_ATTRIBUTES = "ExtraAttributes";
public static final String ID = "id";
@@ -25,6 +30,13 @@ public class ItemUtils {
public static final Pattern NOT_DURABILITY = Pattern.compile("[^0-9 /]");
public static final Predicate<String> FUEL_PREDICATE = line -> line.contains("Fuel: ");
+ public static LiteralArgumentBuilder<FabricClientCommandSource> dumpHeldItemNbtCommand() {
+ return literal("dumpHeldItemNbt").executes(context -> {
+ context.getSource().sendFeedback(Text.literal("[Skyblocker Debug] Held Item Nbt: " + context.getSource().getPlayer().getMainHandStack().writeNbt(new NbtCompound())));
+ return Command.SINGLE_SUCCESS;
+ });
+ }
+
public static List<Text> getTooltips(ItemStack item) {
MinecraftClient client = MinecraftClient.getInstance();
return client.player == null || item == null ? Collections.emptyList() : item.getTooltip(client.player, TooltipContext.Default.BASIC);
diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json
index d7ae26e1..b6308284 100644
--- a/src/main/resources/skyblocker.mixins.json
+++ b/src/main/resources/skyblocker.mixins.json
@@ -10,8 +10,10 @@
"ClientPlayerEntityMixin",
"ClientPlayerInteractionManagerMixin",
"ClientPlayNetworkHandlerMixin",
+ "DataTrackerMixin",
"DrawContextMixin",
"DyeableItemMixin",
+ "EntityRenderDispatcherMixin",
"FarmlandBlockMixin",
"GenericContainerScreenHandlerMixin",
"HandledScreenMixin",
@@ -21,6 +23,7 @@
"ItemMixin",
"ItemStackMixin",
"LeverBlockMixin",
+ "LivingEntityRendererMixin",
"MinecraftClientMixin",
"PlayerListHudMixin",
"PlayerSkinProviderMixin",