aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de')
-rw-r--r--src/main/java/de/hysky/skyblocker/SkyblockerMod.java6
-rw-r--r--src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java129
-rw-r--r--src/main/java/de/hysky/skyblocker/config/ImageRepoLoader.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java31
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/DwarvenMinesCategory.java7
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java8
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java22
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/SlayersCategory.java15
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java47
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/accessor/EndermanEntityAccessor.java17
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/accessor/MessageHandlerAccessor.java14
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/accessor/PlayerListHudAccessor.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/accessor/RecipeBookWidgetAccessor.java1
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java27
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java77
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/CreeperBeams.java5
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java7
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java17
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudConfigScreen.java65
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java71
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java75
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/end/BeaconHighlighter.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/end/EndHudConfigScreen.java29
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/end/TheEnd.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java8
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java123
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudConfigScreen.java30
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java67
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/MuseumItemCache.java42
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/rift/EnigmaSouls.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java11
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java17
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EmptyWidget.java12
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/Widget.java27
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/waypoint/FairySouls.java7
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/ItemUtils.java14
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/Utils.java12
40 files changed, 695 insertions, 364 deletions
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
index 2987f493..ebb85b36 100644
--- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
+++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
@@ -8,8 +8,8 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.debug.Debug;
import de.hysky.skyblocker.skyblock.*;
import de.hysky.skyblocker.skyblock.chat.ChatRuleAnnouncementScreen;
-import de.hysky.skyblocker.skyblock.crimson.kuudra.Kuudra;
import de.hysky.skyblocker.skyblock.chat.ChatRulesHandler;
+import de.hysky.skyblocker.skyblock.crimson.kuudra.Kuudra;
import de.hysky.skyblocker.skyblock.dungeon.*;
import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
import de.hysky.skyblocker.skyblock.dungeon.puzzle.*;
@@ -22,6 +22,7 @@ import de.hysky.skyblocker.skyblock.dwarven.CrystalsLocationsManager;
import de.hysky.skyblocker.skyblock.dwarven.DwarvenHud;
import de.hysky.skyblocker.skyblock.end.BeaconHighlighter;
import de.hysky.skyblocker.skyblock.end.TheEnd;
+import de.hysky.skyblocker.skyblock.garden.FarmingHud;
import de.hysky.skyblocker.skyblock.garden.VisitorHelper;
import de.hysky.skyblocker.skyblock.item.*;
import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview;
@@ -108,8 +109,10 @@ public class SkyblockerMod implements ClientModInitializer {
BackpackPreview.init();
QuickNav.init();
ItemCooldowns.init();
+ TabHud.init();
DwarvenHud.init();
CrystalsHud.init();
+ FarmingHud.init();
CrystalsLocationsManager.init();
ChatMessageListener.init();
Shortcuts.init();
@@ -118,7 +121,6 @@ public class SkyblockerMod implements ClientModInitializer {
DiscordRPCManager.init();
LividColor.init();
FishingHelper.init();
- TabHud.init();
DungeonMap.init();
DungeonManager.init();
DungeonBlaze.init();
diff --git a/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java b/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java
index c33e2f54..07109b46 100644
--- a/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java
+++ b/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java
@@ -2,82 +2,141 @@ package de.hysky.skyblocker.config;
import de.hysky.skyblocker.skyblock.tabhud.widget.Widget;
import de.hysky.skyblocker.utils.render.RenderHelper;
-import it.unimi.dsi.fastutil.ints.IntIntImmutablePair;
-import it.unimi.dsi.fastutil.ints.IntIntPair;
+import it.unimi.dsi.fastutil.ints.IntIntMutablePair;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.text.Text;
+import net.minecraft.util.math.MathHelper;
import java.awt.*;
+import java.util.List;
+/**
+ * A screen for configuring the positions of HUD widgets.
+ * <p>
+ * This class takes care of rendering the widgets, dragging them, and resetting their positions.
+ * Create one subclass for each collection of HUD widgets that are displayed at the same time.
+ * (i.e. one for dwarven mines, one for the end, etc.) See an implementation for an example.
+ */
public abstract class HudConfigScreen extends Screen {
- private final Widget widget;
private final Screen parent;
+ private final List<Widget> widgets;
- private int hudX = 0;
- private int hudY = 0;
- public HudConfigScreen(Text title, Widget widget, Screen parent) {
+ private Widget draggingWidget;
+ private double mouseClickRelativeX;
+ private double mouseClickRelativeY;
+
+ /**
+ * Creates a new HudConfigScreen with the passed title, parent, and widget
+ * @param title the title of the screen
+ * @param parent the parent screen
+ * @param widget the widget to configure
+ */
+ public HudConfigScreen(Text title, Screen parent, Widget widget) {
+ this(title, parent, List.of(widget));
+ }
+
+ /**
+ * Creates a new HudConfigScreen with the passed title, parent, and widgets
+ * @param title the title of the screen
+ * @param parent the parent screen
+ * @param widgets the widgets to configure
+ */
+ public HudConfigScreen(Text title, Screen parent, List<Widget> widgets) {
super(title);
- this.widget = widget;
this.parent = parent;
-
- int[] posFromConfig = getPosFromConfig(SkyblockerConfigManager.get());
- hudX = posFromConfig[0];
- hudY = posFromConfig[1];
+ this.widgets = widgets;
+ resetPos();
}
@Override
- public void render(DrawContext context, int mouseX, int mouseY, float delta) {
+ public final void render(DrawContext context, int mouseX, int mouseY, float delta) {
super.render(context, mouseX, mouseY, delta);
- renderBackground(context, mouseX, mouseY, delta);
- renderWidget(context, hudX, hudY);
+ renderWidget(context, widgets);
context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB());
}
+ /**
+ * Renders the widgets using the default {@link Widget#render(DrawContext, boolean)} method. Override to change the behavior.
+ * @param context the context to render in
+ * @param widgets the widgets to render
+ */
+ protected void renderWidget(DrawContext context, List<Widget> widgets) {
+ for (Widget widget : widgets) {
+ widget.render(context, SkyblockerConfigManager.get().general.tabHud.enableHudBackground);
+ }
+ }
+
@Override
- public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
- IntIntPair dims = getDimensions();
- if (RenderHelper.pointIsInArea(mouseX, mouseY, hudX, hudY, hudX + dims.leftInt(), hudY + dims.rightInt()) && button == 0) {
- hudX = (int) Math.max(Math.min(mouseX - (double) dims.leftInt() / 2, this.width - dims.leftInt()), 0);
- hudY = (int) Math.max(Math.min(mouseY - (double) dims.rightInt() / 2, this.height - dims.rightInt()), 0);
+ public final boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
+ if (button == 0 && draggingWidget != null) {
+ draggingWidget.setX((int) MathHelper.clamp(mouseX - mouseClickRelativeX, 0, this.width - draggingWidget.getWidth()));
+ draggingWidget.setY((int) MathHelper.clamp(mouseY - mouseClickRelativeY, 0, this.height - draggingWidget.getHeight()));
}
return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
}
@Override
- public boolean mouseClicked(double mouseX, double mouseY, int button) {
- if (button == 1) {
- IntIntPair dims = getDimensions();
- hudX = this.width / 2 - dims.leftInt();
- hudY = this.height / 2 - dims.rightInt();
+ public final boolean mouseClicked(double mouseX, double mouseY, int button) {
+ if (button == 0) {
+ for (Widget widget : widgets) {
+ if (RenderHelper.pointIsInArea(mouseX, mouseY, widget.getX(), widget.getY(), widget.getX() + widget.getWidth(), widget.getY() + widget.getHeight())) {
+ draggingWidget = widget;
+ mouseClickRelativeX = mouseX - widget.getX();
+ mouseClickRelativeY = mouseY - widget.getY();
+ break;
+ }
+ }
+ } else if (button == 1) {
+ resetPos();
}
return super.mouseClicked(mouseX, mouseY, button);
}
- abstract protected int[] getPosFromConfig(SkyblockerConfig config);
+ @Override
+ public final boolean mouseReleased(double mouseX, double mouseY, int button) {
+ draggingWidget = null;
+ return super.mouseReleased(mouseX, mouseY, button);
+ }
- protected IntIntPair getDimensions() {
- return new IntIntImmutablePair(widget.getHeight(), widget.getWidth());
+ /**
+ * Resets the positions of the widgets to the positions in the config. Override to change the behavior.
+ */
+ protected void resetPos() {
+ List<IntIntMutablePair> configPositions = getConfigPos(SkyblockerConfigManager.get());
+ if (configPositions.size() != widgets.size()) {
+ throw new IllegalStateException("The number of positions (" + configPositions.size() + ") does not match the number of widgets (" + widgets.size() + ")");
+ }
+ for (int i = 0; i < widgets.size(); i++) {
+ Widget widget = widgets.get(i);
+ IntIntMutablePair configPos = configPositions.get(i);
+ widget.setX(configPos.leftInt());
+ widget.setY(configPos.rightInt());
+ }
}
+ /**
+ * Returns the positions of the widgets in the config
+ * @param config the config to get the positions from
+ * @return the positions of the widgets
+ */
+ protected abstract List<IntIntMutablePair> getConfigPos(SkyblockerConfig config);
+
@Override
- public void close() {
+ public final void close() {
SkyblockerConfig skyblockerConfig = SkyblockerConfigManager.get();
- savePos(skyblockerConfig, hudX, hudY);
+ savePos(skyblockerConfig, widgets);
SkyblockerConfigManager.save();
client.setScreen(parent);
}
/**
- * This method should save the passed position to the config
+ * Saves the passed positions to the config.
* <p>
* NOTE: The parent class will call {@link SkyblockerConfigManager#save()} right after this method
* @param configManager the config so you don't have to get it
- * @param x x
- * @param y y
+ * @param widgets the widgets to save
*/
- abstract protected void savePos(SkyblockerConfig configManager, int x, int y);
-
- abstract protected void renderWidget(DrawContext context, int x, int y);
+ protected abstract void savePos(SkyblockerConfig configManager, List<Widget> widgets);
}
diff --git a/src/main/java/de/hysky/skyblocker/config/ImageRepoLoader.java b/src/main/java/de/hysky/skyblocker/config/ImageRepoLoader.java
index 0591cd96..584b79e7 100644
--- a/src/main/java/de/hysky/skyblocker/config/ImageRepoLoader.java
+++ b/src/main/java/de/hysky/skyblocker/config/ImageRepoLoader.java
@@ -56,7 +56,7 @@ public class ImageRepoLoader {
//Delete all directories to clear potentially now unused/old files
//TODO change this to only delete periodically?
- deleteDirectories();
+ if (Files.exists(REPO_DIRECTORY)) deleteDirectories();
try (ZipInputStream zis = new ZipInputStream(in)) {
ZipEntry entry;
diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
index 4626003d..a3e710c1 100644
--- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
@@ -267,6 +267,9 @@ public class SkyblockerConfig {
public int tabHudScale = 100;
@SerialEntry
+ public boolean enableHudBackground = true;
+
+ @SerialEntry
public boolean plainPlayerNames = false;
@SerialEntry
@@ -945,9 +948,6 @@ public class SkyblockerConfig {
public DwarvenHudStyle style = DwarvenHudStyle.SIMPLE;
@SerialEntry
- public boolean enableBackground = true;
-
- @SerialEntry
public int x = 10;
@SerialEntry
@@ -1037,7 +1037,7 @@ public class SkyblockerConfig {
public boolean noArrowPoisonWarning = true;
@SerialEntry
- public int arrowPoisonThreshold = 16;
+ public int arrowPoisonThreshold = 32;
}
public static class Rift {
@@ -1063,9 +1063,6 @@ public class SkyblockerConfig {
public boolean hudEnabled = true;
@SerialEntry
- public boolean enableBackground = true;
-
- @SerialEntry
public boolean waypoint = true;
@SerialEntry
@@ -1090,12 +1087,26 @@ public class SkyblockerConfig {
public static class Garden {
@SerialEntry
+ public FarmingHud farmingHud = new FarmingHud();
+
+ @SerialEntry
public boolean dicerTitlePrevent = true;
@SerialEntry
public boolean visitorHelper = true;
}
+ public static class FarmingHud {
+ @SerialEntry
+ public boolean enableHud = true;
+
+ @SerialEntry
+ public int x;
+
+ @SerialEntry
+ public int y;
+ }
+
public static class Slayer {
@SerialEntry
public EndermanSlayer endermanSlayer = new EndermanSlayer();
@@ -1106,10 +1117,13 @@ public class SkyblockerConfig {
public static class EndermanSlayer {
@SerialEntry
- public boolean highlightNukekubiHeads = true;
+ public boolean enableYangGlyphsNotification = true;
@SerialEntry
public boolean highlightBeacons = true;
+
+ @SerialEntry
+ public boolean highlightNukekubiHeads = true;
}
public static class VampireSlayer {
@@ -1199,6 +1213,7 @@ public class SkyblockerConfig {
@SerialEntry
public ChatRuleConfig chatRuleConfig = new ChatRuleConfig();
}
+
public static class ChatRuleConfig {
@SerialEntry
public int announcementLength = 60;
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/DwarvenMinesCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/DwarvenMinesCategory.java
index 97b48bc4..4ae0fc35 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/DwarvenMinesCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/DwarvenMinesCategory.java
@@ -76,13 +76,6 @@ public class DwarvenMinesCategory {
.text(Text.translatable("text.skyblocker.open"))
.action((screen, opt) -> MinecraftClient.getInstance().setScreen(new DwarvenHudConfigScreen(screen)))
.build())
- .option(Option.<Boolean>createBuilder()
- .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enableBackground"))
- .binding(defaults.locations.dwarvenMines.dwarvenHud.enableBackground,
- () -> config.locations.dwarvenMines.dwarvenHud.enableBackground,
- newValue -> config.locations.dwarvenMines.dwarvenHud.enableBackground = newValue)
- .controller(ConfigUtils::createBooleanController)
- .build())
.build())
//crystal HUD
.group(OptionGroup.createBuilder()
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 afd688d8..23ce7bb6 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java
@@ -107,6 +107,14 @@ public class GeneralCategory {
.controller(opt -> IntegerSliderControllerBuilder.create(opt).range(10, 200).step(1))
.build())
.option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.enableHudBackground"))
+ .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.enableHudBackground.@Tooltip")))
+ .binding(defaults.general.tabHud.enableHudBackground,
+ () -> config.general.tabHud.enableHudBackground,
+ newValue -> config.general.tabHud.enableHudBackground = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
+ .option(Option.<Boolean>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.plainPlayerNames"))
.description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.plainPlayerNames.@Tooltip")))
.binding(defaults.general.tabHud.plainPlayerNames,
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java
index d97513f8..86ed3f6c 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java
@@ -4,6 +4,7 @@ import de.hysky.skyblocker.config.ConfigUtils;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.skyblock.end.EndHudConfigScreen;
import de.hysky.skyblocker.skyblock.end.TheEnd;
+import de.hysky.skyblocker.skyblock.garden.FarmingHudConfigScreen;
import dev.isxander.yacl3.api.*;
import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder;
import net.minecraft.client.MinecraftClient;
@@ -91,13 +92,6 @@ public class LocationsCategory {
.controller(ConfigUtils::createBooleanController)
.build())
.option(Option.<Boolean>createBuilder()
- .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enableBackground")) // Reusing that string cuz sure
- .binding(defaults.locations.end.enableBackground,
- () -> config.locations.end.enableBackground,
- newValue -> config.locations.end.enableBackground = newValue)
- .controller(ConfigUtils::createBooleanController)
- .build())
- .option(Option.<Boolean>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.end.waypoint"))
.binding(defaults.locations.end.waypoint,
() -> config.locations.end.waypoint,
@@ -147,6 +141,18 @@ public class LocationsCategory {
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.garden"))
.collapsed(false)
.option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.garden.farmingHud.enableHud"))
+ .binding(defaults.locations.garden.farmingHud.enableHud,
+ () -> config.locations.garden.farmingHud.enableHud,
+ newValue -> config.locations.garden.farmingHud.enableHud = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
+ .option(ButtonOption.createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.garden.farmingHud.config"))
+ .text(Text.translatable("text.skyblocker.open"))
+ .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new FarmingHudConfigScreen(screen)))
+ .build())
+ .option(Option.<Boolean>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.garden.dicerTitlePrevent"))
.binding(defaults.locations.garden.dicerTitlePrevent,
() -> config.locations.garden.dicerTitlePrevent,
@@ -154,7 +160,7 @@ public class LocationsCategory {
.controller(ConfigUtils::createBooleanController)
.build())
.option(Option.<Boolean>createBuilder()
- .name(Text.translatable("text.autoconfig.skyblocker.option.general.visitorHelper"))
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.garden.visitorHelper"))
.binding(defaults.locations.garden.visitorHelper,
() -> config.locations.garden.visitorHelper,
newValue -> config.locations.garden.visitorHelper = newValue)
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/SlayersCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/SlayersCategory.java
index 19b30937..005bebab 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/SlayersCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/SlayersCategory.java
@@ -22,10 +22,10 @@ public class SlayersCategory {
.name(Text.translatable("text.autoconfig.skyblocker.option.slayer.endermanSlayer"))
.collapsed(true)
.option(Option.<Boolean>createBuilder()
- .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.endermanSlayer.highlightNukekubiHeads"))
- .binding(defaults.slayer.endermanSlayer.highlightNukekubiHeads,
- () -> config.slayer.endermanSlayer.highlightNukekubiHeads,
- newValue -> config.slayer.endermanSlayer.highlightNukekubiHeads = newValue)
+ .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.endermanSlayer.enableYangGlyphsNotification"))
+ .binding(defaults.slayer.endermanSlayer.enableYangGlyphsNotification,
+ () -> config.slayer.endermanSlayer.enableYangGlyphsNotification,
+ newValue -> config.slayer.endermanSlayer.enableYangGlyphsNotification = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
.option(Option.<Boolean>createBuilder()
@@ -35,6 +35,13 @@ public class SlayersCategory {
newValue -> config.slayer.endermanSlayer.highlightBeacons = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.slayer.endermanSlayer.highlightNukekubiHeads"))
+ .binding(defaults.slayer.endermanSlayer.highlightNukekubiHeads,
+ () -> config.slayer.endermanSlayer.highlightNukekubiHeads,
+ newValue -> config.slayer.endermanSlayer.highlightNukekubiHeads = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
.build())
//Vampire Slayer
diff --git a/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java
index 03786876..d9db5dae 100644
--- a/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java
@@ -1,19 +1,50 @@
package de.hysky.skyblocker.mixin;
+import com.llamalad7.mixinextras.sugar.Local;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.mixin.accessor.EndermanEntityAccessor;
+import de.hysky.skyblocker.skyblock.entity.MobGlow;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.data.DataTracker;
+import net.minecraft.sound.SoundEvents;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.entity.data.DataTracker;
+import java.util.Optional;
@Mixin(DataTracker.class)
-public class DataTrackerMixin {
+public abstract class DataTrackerMixin {
+ @Shadow
+ @Final
+ private Entity trackedEntity;
+
+ @SuppressWarnings("ConstantValue")
+ @Inject(method = "writeUpdatedEntries", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/data/DataTracker;copyToFrom(Lnet/minecraft/entity/data/DataTracker$Entry;Lnet/minecraft/entity/data/DataTracker$SerializedEntry;)V"))
+ private <T> void skyblocker$onWriteUpdatedEntries(CallbackInfo ci, @Local DataTracker.Entry<T> entry, @Local DataTracker.SerializedEntry<T> serializedEntry) {
+ if (Utils.isInTheEnd() && SkyblockerConfigManager.get().slayer.endermanSlayer.enableYangGlyphsNotification && entry.getData() == EndermanEntityAccessor.getCARRIED_BLOCK() && entry.get() instanceof Optional<?> value && value.isPresent() && value.get() instanceof BlockState state && state.isOf(Blocks.BEACON) && ((Optional<?>) serializedEntry.value()).isEmpty()) {
+ MinecraftClient client = MinecraftClient.getInstance();
+ if (MobGlow.getArmorStands(trackedEntity).stream().anyMatch(armorStand -> armorStand.getName().getString().contains(client.getSession().getUsername()))) {
+ client.inGameHud.setTitleTicks(5, 20, 10);