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.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java14
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java15
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java14
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java12
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java19
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakeBagHelper.java33
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/accessories/newyearcakes/NewYearCakesHelper.java79
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java54
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java5
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/garden/LowerSensitivity.java40
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreen.java194
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockCraftingTableScreenHandler.java69
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRepository.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java9
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);
}