diff options
Diffstat (limited to 'src/main/java/de')
18 files changed, 531 insertions, 37 deletions
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java index ee82209d..4b562574 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java @@ -23,6 +23,7 @@ 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.LowerSensitivity; import de.hysky.skyblocker.skyblock.garden.VisitorHelper; import de.hysky.skyblocker.skyblock.item.*; import de.hysky.skyblocker.skyblock.item.tooltip.AccessoriesHelper; @@ -115,6 +116,7 @@ public class SkyblockerMod implements ClientModInitializer { DwarvenHud.init(); CrystalsHud.init(); FarmingHud.init(); + LowerSensitivity.init(); CrystalsLocationsManager.init(); ChatMessageListener.init(); Shortcuts.init(); diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java index 8d65806f..06ac748a 100644 --- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java @@ -160,6 +160,9 @@ public class SkyblockerConfig { public boolean betterPartyFinder = true; @SerialEntry + public boolean fancyCraftingTable = true; + + @SerialEntry public boolean backpackPreviewWithoutShift = false; @SerialEntry @@ -178,6 +181,9 @@ public class SkyblockerConfig { public boolean dungeonQuality = true; @SerialEntry + public boolean enableNewYearCakesHelper = true; + + @SerialEntry public TabHudConf tabHud = new TabHudConf(); @SerialEntry @@ -622,7 +628,7 @@ public class SkyblockerConfig { public boolean enableWikiLookup = true; @SerialEntry - public boolean officialWiki = false; + public boolean officialWiki = true; } public static class ChestValue { @@ -1097,6 +1103,12 @@ public class SkyblockerConfig { @SerialEntry public boolean visitorHelper = true; + + @SerialEntry + public boolean lockMouseTool = false; + + @SerialEntry + public boolean lockMouseGroundOnly = false; } public static class FarmingHud { 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 abe20e18..e310cb85 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java @@ -42,6 +42,13 @@ public class GeneralCategory { .controller(ConfigUtils::createBooleanController) .build()) .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.fancyCraftingTable")) + .binding(defaults.general.fancyCraftingTable, + () -> config.general.fancyCraftingTable, + newValue -> config.general.fancyCraftingTable = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.general.backpackPreviewWithoutShift")) .binding(defaults.general.backpackPreviewWithoutShift, () -> config.general.backpackPreviewWithoutShift, @@ -86,6 +93,14 @@ public class GeneralCategory { newValue -> config.general.dungeonQuality = newValue) .controller(ConfigUtils::createBooleanController) .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.enableNewYearCakesHelper")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.enableNewYearCakesHelper.@Tooltip"))) + .binding(defaults.general.enableNewYearCakesHelper, + () -> config.general.enableNewYearCakesHelper, + newValue -> config.general.enableNewYearCakesHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) //Tab Hud .group(OptionGroup.createBuilder() 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 86ed3f6c..67512b78 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java @@ -166,6 +166,20 @@ public class LocationsCategory { newValue -> config.locations.garden.visitorHelper = newValue) .controller(ConfigUtils::createBooleanController) .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.garden.lockMouseTool")) + .binding(defaults.locations.garden.lockMouseTool, + () -> config.locations.garden.lockMouseTool, + newValue -> config.locations.garden.lockMouseTool = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.garden.lockMouseGround")) + .binding(defaults.locations.garden.lockMouseGroundOnly, + () -> config.locations.garden.lockMouseGroundOnly, + newValue -> config.locations.garden.lockMouseGroundOnly = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) .build()) .build(); } diff --git a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java index 94eb53a5..975c9c51 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java @@ -3,6 +3,9 @@ package de.hysky.skyblocker.mixin; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen; +import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreenHandler; +import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreen; +import de.hysky.skyblocker.utils.Utils; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ingame.HandledScreens; import net.minecraft.client.network.ClientPlayerEntity; @@ -19,11 +22,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public interface HandledScreenProviderMixin<T extends ScreenHandler> { @Inject(method = "open", at = @At("HEAD"), cancellable = true) default void skyblocker$open(Text name, ScreenHandlerType<T> type, MinecraftClient client, int id, CallbackInfo ci) { - if (!SkyblockerConfigManager.get().general.betterPartyFinder) return; ClientPlayerEntity player = client.player; if (player == null) return; + if (!Utils.isOnSkyblock()) return; T screenHandler = type.create(id, player.getInventory()); - if (screenHandler instanceof GenericContainerScreenHandler containerScreenHandler && PartyFinderScreen.possibleInventoryNames.contains(name.getString().toLowerCase())) { + if (SkyblockerConfigManager.get().general.betterPartyFinder && screenHandler instanceof GenericContainerScreenHandler containerScreenHandler && PartyFinderScreen.possibleInventoryNames.contains(name.getString().toLowerCase())) { if (client.currentScreen != null) { String lowerCase = client.currentScreen.getTitle().getString().toLowerCase(); if (lowerCase.contains("group builder")) return; @@ -42,6 +45,11 @@ public interface HandledScreenProviderMixin<T extends ScreenHandler> { } ci.cancel(); + } else if (SkyblockerConfigManager.get().general.fancyCraftingTable && screenHandler instanceof GenericContainerScreenHandler containerScreenHandler && name.getString().toLowerCase().contains("craft item")) { + SkyblockCraftingTableScreenHandler skyblockCraftingTableScreenHandler = new SkyblockCraftingTableScreenHandler(containerScreenHandler, player.getInventory()); + client.player.currentScreenHandler = skyblockCraftingTableScreenHandler; + client.setScreen(new SkyblockCraftingTableScreen(skyblockCraftingTableScreenHandler, player.getInventory(), Text.literal("Craft Item"))); + ci.cancel(); } } } diff --git a/src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java b/src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java new file mode 100644 index 00000000..33c3f487 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java @@ -0,0 +1,19 @@ +package de.hysky.skyblocker.mixin; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import de.hysky.skyblocker.skyblock.garden.LowerSensitivity; +import net.minecraft.client.Mouse; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(Mouse.class) +public class MouseMixin { + + @ModifyExpressionValue(method = "updateMouse", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/SimpleOption;getValue()Ljava/lang/Object;", ordinal = 0)) + public Object skyblocker$gardenMouseLock(Object original) { + if (LowerSensitivity.isSensitivityLowered()) + return -1 / 3d; + else return original; + + } +} 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 new file mode 100644 index 00000000..e0d67fbe --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakeBagHelper.java @@ -0,0 +1,33 @@ +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 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() { + super("New Year Cake Bag"); + } + + @Override + protected boolean isEnabled() { + return SkyblockerConfigManager.get().general.enableNewYearCakesHelper; + } + + @Override + protected List<ColorHighlight> getColors(String[] groups, Map<Integer, ItemStack> slots) { + MinecraftClient client = MinecraftClient.getInstance(); + if (client.player != null) { + for (Slot slot : client.player.currentScreenHandler.slots) { + NewYearCakesHelper.INSTANCE.addCake(NewYearCakesHelper.getCakeYear(slot.getStack())); + } + } + return List.of(); + } +} 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 new file mode 100644 index 00000000..b722849b --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakesHelper.java @@ -0,0 +1,79 @@ +package de.hysky.skyblocker.skyblock.accessories.newyearcakes; + +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.IntOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntSet; +import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class NewYearCakesHelper extends ContainerSolver { + private static final Logger LOGGER = LoggerFactory.getLogger(NewYearCakeBagHelper.class); + private static final Pattern NEW_YEAR_CAKE = Pattern.compile("New Year Cake \\(Year (?<year>\\d+)\\)"); + private static final Pattern NEW_YEAR_CAKE_PURCHASE = Pattern.compile("You purchased New Year Cake \\(Year (?<year>\\d+)\\) for .+ coins!"); + private static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance(Locale.US); + public static final NewYearCakesHelper INSTANCE = new NewYearCakesHelper(); + private final Map<String, IntSet> cakes = new HashMap<>(); + + private NewYearCakesHelper() { + super("Auctions: \".*\""); + ClientReceiveMessageEvents.GAME.register(this::onChatMessage); + } + + public static int getCakeYear(ItemStack stack) { + return getCakeYear(NEW_YEAR_CAKE, stack.getName().getString()); + } + + public static int getCakeYear(Pattern pattern, String name) { + Matcher matcher = pattern.matcher(name); + if (matcher.matches()) { + try { + return NUMBER_FORMAT.parse(matcher.group("year")).intValue(); + } catch (ParseException e) { + LOGGER.info("Failed to parse year from New Year Cake: " + name, e); + } + } + return -1; + } + + @Override + protected boolean isEnabled() { + return SkyblockerConfigManager.get().general.enableNewYearCakesHelper; + } + + public boolean addCake(int year) { + if (year < 0) return false; + return cakes.computeIfAbsent(Utils.getProfile(), _profile -> new IntOpenHashSet()).add(year); + } + + private void onChatMessage(Text message, boolean overlay) { + if (isEnabled()) { + addCake(getCakeYear(NEW_YEAR_CAKE_PURCHASE, message.getString())); + } + } + + @Override + protected List<ColorHighlight> getColors(String[] groups, Map<Integer, 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()) { + 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())); + } + } + return highlights; + } +} 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 d5d57e70..4f5da8de 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 @@ -86,7 +86,7 @@ import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.lit public class DungeonManager { protected static final Logger LOGGER = LoggerFactory.getLogger(DungeonManager.class); private static final String DUNGEONS_PATH = "dungeons"; - private static final Path CUSTOM_WAYPOINTS_DIR = SkyblockerMod.CONFIG_DIR.resolve("custom_secret_waypoints.json"); + private static Path CUSTOM_WAYPOINTS_DIR; private static final Pattern KEY_FOUND = Pattern.compile("^(?:\\[.+] )?(?<name>\\w+) has obtained (?<type>Wither|Blood) Key!$"); /** * Maps the block identifier string to a custom numeric block id used in dungeon rooms data. @@ -214,6 +214,7 @@ public class DungeonManager { * Use {@link #isRoomsLoaded()} to check for completion of loading. */ public static void init() { + CUSTOM_WAYPOINTS_DIR = SkyblockerMod.CONFIG_DIR.resolve("custom_secret_waypoints.json"); if (!SkyblockerConfigManager.get().locations.dungeons.secretWaypoints.enableRoomMatching) { return; } 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 58abd980..3297ef5a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java @@ -43,8 +43,8 @@ public class DwarvenHud { "First Event", "(?:Ruby|Amber|Sapphire|Jade|Amethyst|Topaz) Gemstone Collector", "(?:Amber|Sapphire|Jade|Amethyst|Topaz) Crystal Hunter", - "Chest Looter").map(s -> Pattern.compile("(" + s + "): (\\d+\\.?\\d*%|DONE)")) - .collect(Collectors.toList()); + "Chest Looter").map(s -> Pattern.compile("(" + s + "): (\\d+\\.?\\d*%|DONE)") + ).collect(Collectors.toList()); public static final Pattern MITHRIL_PATTERN = Pattern.compile("Mithril Powder: [0-9,]+"); public static final Pattern GEMSTONE_PATTERN = Pattern.compile("Gemstone Powder: [0-9,]+"); @@ -52,10 +52,13 @@ public class DwarvenHud { ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker") .then(ClientCommandManager.literal("hud") .then(ClientCommandManager.literal("dwarven") - .executes(Scheduler.queueOpenScreenCommand(DwarvenHudConfigScreen::new)))))); + .executes(Scheduler.queueOpenScreenCommand(DwarvenHudConfigScreen::new)) + ) + ) + )); HudRenderCallback.EVENT.register((context, tickDelta) -> { - if ((!SkyblockerConfigManager.get().general.tabHud.enableHudBackground && !SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledPowder) + if (!SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledCommissions && !SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledPowder || client.options.playerListKey.isPressed() || client.player == null || (!Utils.isInDwarvenMines() && !Utils.isInCrystalHollows())) { @@ -93,7 +96,7 @@ public class DwarvenHud { context.fill(comHudX, comHudY, comHudX + 200, comHudY + (20 * commissions.size()), 0x64000000); context.fill(powderHudX, powderHudY, powderHudX + 200, powderHudY + 40, 0x64000000); } - if (SkyblockerConfigManager.get().general.tabHud.enableHudBackground) { + if (SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledCommissions) { int y = 0; for (Commission commission : commissions) { float percentage; @@ -103,29 +106,26 @@ public class DwarvenHud { percentage = 100f; } - context - .drawTextWithShadow(client.textRenderer, - Text.literal(commission.commission + ": ").formatted(Formatting.AQUA) - .append(Text.literal(commission.progression).formatted(Colors.hypixelProgressColor(percentage))), - comHudX + 5, comHudY + y + 5, 0xFFFFFFFF); + context.drawTextWithShadow(client.textRenderer, + Text.literal(commission.commission + ": ").formatted(Formatting.AQUA) + .append(Text.literal(commission.progression).formatted(Colors.hypixelProgressColor(percentage))), + comHudX + 5, comHudY + y + 5, 0xFFFFFFFF); y += 20; } } - if(SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledPowder) { + if (SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledPowder) { //render mithril powder then gemstone - context - .drawTextWithShadow(client.textRenderer, - Text.literal("Mithril: " + mithrilPowder).formatted(Formatting.AQUA), - powderHudX + 5, powderHudY + 5, 0xFFFFFFFF); - context - .drawTextWithShadow(client.textRenderer, - Text.literal("Gemstone: " + gemStonePowder).formatted(Formatting.DARK_PURPLE), - powderHudX + 5, powderHudY + 25, 0xFFFFFFFF); + context.drawTextWithShadow(client.textRenderer, + Text.literal("Mithril: " + mithrilPowder).formatted(Formatting.AQUA), + powderHudX + 5, powderHudY + 5, 0xFFFFFFFF); + context.drawTextWithShadow(client.textRenderer, + Text.literal("Gemstone: " + gemStonePowder).formatted(Formatting.DARK_PURPLE), + powderHudX + 5, powderHudY + 25, 0xFFFFFFFF); } } public static void renderSimple(HudCommsWidget hcw, HudPowderWidget hpw, DrawContext context, int comHudX, int comHudY, int powderHudX, int powderHudY, List<Commission> commissions) { - if (SkyblockerConfigManager.get().general.tabHud.enableHudBackground) { + if (SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledCommissions) { hcw.updateData(commissions, false); hcw.update(); hcw.setX(comHudX); @@ -141,27 +141,27 @@ public class DwarvenHud { } public static void renderFancy(HudCommsWidget hcw, HudPowderWidget hpw, DrawContext context, int comHudX, int comHudY, int powderHudX, int powderHudY, List<Commission> commissions) { - if (SkyblockerConfigManager.get().general.tabHud.enableHudBackground) { + if (SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledCommissions) { hcw.updateData(commissions, true); hcw.update(); hcw.setX(comHudX); hcw.setY(comHudY); - hcw.render(context, - SkyblockerConfigManager.get().general.tabHud.enableHudBackground); + hcw.render(context, SkyblockerConfigManager.get().general.tabHud.enableHudBackground); } if (SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledPowder) { hpw.update(); hpw.setX(powderHudX); hpw.setY(powderHudY); - hpw.render(context, - SkyblockerConfigManager.get().general.tabHud.enableHudBackground); + hpw.render(context, SkyblockerConfigManager.get().general.tabHud.enableHudBackground); } } public static void update() { - if (client.player == null || client.getNetworkHandler() == null || (!SkyblockerConfigManager.get().general.tabHud.enableHudBackground && !SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledPowder) - || (!Utils.isInCrystalHollows() && !Utils.isInDwarvenMines())) + if (client.player == null || client.getNetworkHandler() == null + || !SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledCommissions && !SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledPowder + || !Utils.isInCrystalHollows() && !Utils.isInDwarvenMines()) { return; + } commissionList = new ArrayList<>(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java index 72efb207..febbe825 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java @@ -18,7 +18,7 @@ import java.util.Map; public class FarmingHudWidget extends Widget { private static final MutableText TITLE = Text.literal("Farming").formatted(Formatting.YELLOW, Formatting.BOLD); - private static final Map<String, ItemStack> FARMING_TOOLS = Map.ofEntries( + public static final Map<String, ItemStack> FARMING_TOOLS = Map.ofEntries( Map.entry("THEORETICAL_HOE_WHEAT_1", Ico.WHEAT), Map.entry("THEORETICAL_HOE_WHEAT_2", Ico.WHEAT), Map.entry("THEORETICAL_HOE_WHEAT_3", Ico.WHEAT), @@ -65,5 +65,8 @@ public class FarmingHudWidget extends Widget { double pitch = cameraEntity == null ? 0.0d : cameraEntity.getPitch(); addComponent(new PlainTextComponent(Text.literal("Yaw: " + String.format("%.3f", MathHelper.wrapDegrees(yaw))).formatted(Formatting.YELLOW))); addComponent(new PlainTextComponent(Text.literal("Pitch: " + String.format("%.3f", MathHelper.wrapDegrees(pitch))).formatted(Formatting.YELLOW))); + if (LowerSensitivity.isSensitivityLowered()) { + addComponent(new PlainTextComponent(Text.translatable("skyblocker.garden.hud.mouseLocked").formatted(Formatting.ITALIC))); + } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/LowerSensitivity.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/LowerSensitivity.java new file mode 100644 index 00000000..edea50de --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/LowerSensitivity.java @@ -0,0 +1,40 @@ +package de.hysky.skyblocker.skyblock.garden; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.Location; +import de.hysky.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.minecraft.client.MinecraftClient; +import net.minecraft.item.ItemStack; + +public class LowerSensitivity { + + private static boolean sensitivityLowered = false; + + public static void init() { + ClientTickEvents.END_WORLD_TICK.register(world -> { + if (!Utils.isOnSkyblock() || Utils.getLocation() != Location.GARDEN || MinecraftClient.getInstance().player == null) { + if (sensitivityLowered) lowerSensitivity(false); + return; + } + if (SkyblockerConfigManager.get().locations.garden.lockMouseTool) { + ItemStack mainHandStack = MinecraftClient.getInstance().player.getMainHandStack(); + String itemId = ItemUtils.getItemId(mainHandStack); + boolean shouldLockMouse = FarmingHudWidget.FARMING_TOOLS.containsKey(itemId) && (!SkyblockerConfigManager.get().locations.garden.lockMouseGroundOnly || MinecraftClient.getInstance().player.isOnGround()); + if (shouldLockMouse && !sensitivityLowered) lowerSensitivity(true); + else if (!shouldLockMouse && sensitivityLowered) lowerSensitivity(false); + + } + }); + } + + public static void lowerSensitivity(boolean lowerSensitivity) { + if (sensitivityLowered == lowerSensitivity) return; + sensitivityLowered = lowerSensitivity; + } + + public static boolean isSensitivityLowered() { + return sensitivityLowered; + } +} 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 bde8b3ea..6640d413 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java @@ -78,7 +78,7 @@ public class VisitorHelper { } public static void onSlotClick(Slot slot, int slotId, String title) { - if (slotId == 29 || slotId == 13) { + if (slotId == 29 || slotId == 13 || slotId == 33) { itemMap.remove(title); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreen.java new file mode 100644 index 00000000..14ddb238 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreen.java @@ -0,0 +1,194 @@ +package de.hysky.skyblocker.skyblock.item; + +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.skyblock.itemlist.ItemListWidget; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.ButtonTextures; +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; +import net.minecraft.client.gui.tooltip.Tooltip; +import net.minecraft.client.gui.widget.TexturedButtonWidget; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.SimpleInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.recipe.Recipe; +import net.minecraft.recipe.RecipeEntry; +import net.minecraft.recipe.RecipeMatcher; +import net.minecraft.recipe.book.RecipeBookCategory; +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.Text; +import net.minecraft.util.Identifier; + +public class SkyblockCraftingTableScreen extends HandledScreen<SkyblockCraftingTableScreenHandler> { + private static final Identifier TEXTURE = new Identifier("textures/gui/container/crafting_table.png"); + protected static final ButtonTextures MORE_CRAFTS_TEXTURES = new ButtonTextures( + new Identifier(SkyblockerMod.NAMESPACE, "quick_craft/more_button"), + new Identifier(SkyblockerMod.NAMESPACE, "quick_craft/more_button_disabled"), + new Identifier(SkyblockerMod.NAMESPACE, "quick_craft/more_button_highlighted") + ); + + protected static final Identifier QUICK_CRAFT = new Identifier(SkyblockerMod.NAMESPACE, "quick_craft/quick_craft_overlay"); + private final ItemListWidget recipeBook = new ItemListWidget(); + private boolean narrow; + private TexturedButtonWidget moreCraftsButton; + + public SkyblockCraftingTableScreen(SkyblockCraftingTableScreenHandler handler, PlayerInventory inventory, Text title) { + super(handler, inventory, title); + this.backgroundWidth += 22; + } + + @Override + protected void init() { + super.init(); + this.narrow = this.width < 379; + this.recipeBook.initialize(this.width, this.height, this.client, this.narrow, new DummyRecipeScreenHandler()); + this.x = this.recipeBook.findLeftEdge(this.width, this.backgroundWidth) + 11; + this.addDrawableChild(new TexturedButtonWidget(this.x + 5, this.height / 2 - 49, 20, 18, RecipeBookWidget.BUTTON_TEXTURES, button -> { + this.recipeBook.toggleOpen(); + this.x = this.recipeBook.findLeftEdge(this.width, this.backgroundWidth) + 11; + 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); + 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); + this.setInitialFocus(this.recipeBook); + this.titleX = 29; + } + + @Override + public void handledScreenTick() { + super.handledScreenTick(); + this.recipeBook.update(); + if (moreCraftsButton == null) return; + ItemStack stack = handler.slots.get(26).getStack(); + moreCraftsButton.active = stack.isEmpty() || stack.isOf(Items.PLAYER_HEAD); + } + + @Override + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + if (this.recipeBook.isOpen() && this.narrow) { + this.renderBackground(context, mouseX, mouseY, delta); + this.recipeBook.render(context, mouseX, mouseY, delta); + } else { + super.render(context, mouseX, mouseY, delta); + this.recipeBook.render(context, mouseX, mouseY, delta); + this.recipeBook.drawGhostSlots(context, this.x, this.y, true, delta); + } + this.drawMouseoverTooltip(context, mouseX, mouseY); + this.recipeBook.drawTooltip(context, this.x, this.y, mouseX, mouseY); + } + + + @Override + protected void drawSlot(DrawContext context, Slot slot) { + if (slot.id == 23 && slot.getStack().isOf(Items.BARRIER)) return; + super.drawSlot(context, slot); + } + + @Override + protected void drawBackground(DrawContext context, float delta, int mouseX, int mouseY) { + 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); + } + + @Override + protected boolean isPointWithinBounds(int x, int y, int width, int height, double pointX, double pointY) { + return (!this.narrow || !this.recipeBook.isOpen()) && super.isPointWithinBounds(x, y, width, height, pointX, pointY); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (this.recipeBook.mouseClicked(mouseX, mouseY, button)) { + this.setFocused(this.recipeBook); + return true; + } + if (this.narrow && this.recipeBook.isOpen()) { + return true; + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + protected boolean isClickOutsideBounds(double mouseX, double mouseY, int left, int top, int button) { + boolean bl = mouseX < (double) left || mouseY < (double) top || mouseX >= (double) (left + this.backgroundWidth) || mouseY >= (double) (top + this.backgroundHeight); + return this.recipeBook.isClickOutsideBounds(mouseX, mouseY, this.x, this.y, this.backgroundWidth, this.backgroundHeight, button) && bl; + } + + @Override + protected void onMouseClick(Slot slot, int slotId, int button, SlotActionType actionType) { + super.onMouseClick(slot, slotId, button, actionType); + this.recipeBook.slotClicked(slot); + } + + + static class DummyRecipeScreenHandler extends AbstractRecipeScreenHandler<SimpleInventory> { + + public DummyRecipeScreenHandler() { + super(ScreenHandlerType.GENERIC_9X6, -69); + } + + @Override + public void populateRecipeFinder(RecipeMatcher finder) {} + + @Override + public void clearCraftingSlots() {} + + @Override + public boolean matches(RecipeEntry<? extends Recipe<SimpleInventory>> recipe) { + return false; + } + + @Override + public int getCraftingResultSlotIndex() { + return 0; + } + + @Override + public int getCraftingWidth() { + return 0; + } + + @Override + public int getCraftingHeight() { + return 0; + } + + @Override + public int getCraftingSlotCount() { + return 0; + } + + @Override + public RecipeBookCategory getCategory() { + return RecipeBookCategory.CRAFTING; + } + + @Override + public boolean canInsertIntoSlot(int index) { + return false; + } + + @Override + public ItemStack quickMove(PlayerEntity player, int slot) { + return ItemStack.EMPTY; + } + + @Override + public boolean canUse(PlayerEntity player) { + return false; + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreenHandler.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreenHandler.java new file mode 100644 index 00000000..04974ade --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreenHandler.java @@ -0,0 +1,69 @@ +package de.hysky.skyblocker.skyblock.item; + +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.screen.GenericContainerScreenHandler; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.screen.slot.Slot; + +import java.util.Arrays; + +public class SkyblockCraftingTableScreenHandler extends GenericContainerScreenHandler { + + private static final int[] normalSlots = new int[]{ + 10, 11, 12, 16, + 19, 20, 21, 23, 25, + 28, 29, 30, 34 + }; + + public SkyblockCraftingTableScreenHandler(ScreenHandlerType<?> type, int syncId, PlayerInventory playerInventory, Inventory inventory, int rows) { + super(type, syncId, playerInventory, inventory, rows); + for (int i = 0; i < rows * 9; i++) { + Slot originalSlot = slots.get(i); + if (Arrays.binarySearch(normalSlots, i) >= 0) { + int[] coords = getCoords(i); + Slot slot = new Slot(originalSlot.inventory, originalSlot.getIndex(), coords[0], coords[1]); + slot.id = i; + slots.set(i, slot); + } else { + DisabledSlot slot = new DisabledSlot(originalSlot.inventory, originalSlot.getIndex(), originalSlot.x, originalSlot.y); + slot.id = i; + slots.set(i, slot); + } + } + int yOffset = (rows - 4) * 18 + 19; + for (int i = rows * 9; i < slots.size(); i++) { + Slot originalSlot = slots.get(i); + Slot slot = new Slot(originalSlot.inventory, originalSlot.getIndex(), originalSlot.x, originalSlot.y - yOffset); + slot.id = i; + slots.set(i, slot); + } + } + + public SkyblockCraftingTableScreenHandler(GenericContainerScreenHandler handler, PlayerInventory playerInventory) { + this(handler.getType(), handler.syncId, playerInventory, handler.getInventory(), handler.getRows()); + } + + 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}; + } + 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 { + + public DisabledSlot(Inventory inventory, int index, int x, int y) { + super(inventory, index, x, y); + } + + @Override + public boolean isEnabled() { + return false; + } + } +} 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 38121ea3..5815c11f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java @@ -40,7 +40,7 @@ public class WikiLookup { getSkyblockId(slot); try { String wikiLink = ItemRepository.getWikiLink(id, player); - CompletableFuture.runAsync(() -> Util.getOperatingSystem().open(wikiLink)); + 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) { 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 bd2ac27a..3379b693 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java @@ -69,7 +69,7 @@ public class ItemRepository { public static String getWikiLink(String internalName, PlayerEntity player) { NEUItem item = NEURepoManager.NEU_REPO.getItems().getItemBySkyblockId(internalName); - if (item == null || item.getInfo().isEmpty()) { + if (item == null || item.getInfo() == null || item.getInfo().isEmpty()) { warnNoWikiLink(player); return null; } diff --git a/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java b/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java index 460f34dd..e5b2dddb 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java @@ -2,6 +2,8 @@ package de.hysky.skyblocker.utils.render.gui; import com.mojang.blaze3d.systems.RenderSystem; import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor; +import de.hysky.skyblocker.skyblock.accessories.newyearcakes.NewYearCakeBagHelper; +import de.hysky.skyblocker.skyblock.accessories.newyearcakes.NewYearCakesHelper; import de.hysky.skyblocker.skyblock.dungeon.CroesusHelper; import de.hysky.skyblocker.skyblock.dungeon.CroesusProfit; import de.hysky.skyblocker.skyblock.dungeon.terminal.ColorTerminal; @@ -44,7 +46,9 @@ public class ContainerSolverManager { new CroesusProfit(), new ChronomatronSolver(), new SuperpairsSolver(), - UltrasequencerSolver.INSTANCE + UltrasequencerSolver.INSTANCE, + new NewYearCakeBagHelper(), + NewYearCakesHelper.INSTANCE }; } @@ -84,6 +88,7 @@ public class ContainerSolverManager { groups[i] = matcher.group(i + 1); } currentSolver.start(screen); + markDirty(); return; } } @@ -112,7 +117,7 @@ public class ContainerSolverManager { for (ColorHighlight highlight : highlights) { Slot slot = slots.get(highlight.slot()); int color = highlight.color(); - context.fillGradient(slot.x, slot.y, slot.x + 16, slot.y + 16, color, color); + context.fill(slot.x, slot.y, slot.x + 16, slot.y + 16, color); } RenderSystem.colorMask(true, true, true, true); } |