diff options
Diffstat (limited to 'src/main/java/de')
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); |
