diff options
| author | Serhan <serhanduzce@gmail.com> | 2022-06-16 12:34:35 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-16 12:34:35 +0300 |
| commit | 5f323aaf6f26aba3a2f33eea9ed88e1ee40cc4f9 (patch) | |
| tree | 856b91f6a6c8632b24ef05d1898c0ba1f847585b /src/main/java/me/xmrvizzy/skyblocker | |
| parent | 4afe31dca21b94c102099549800d4fa1cb1bbe6d (diff) | |
| parent | 6c268d4f5b5d9447d9cd7ca4cb5afe2066198c97 (diff) | |
| download | Skyblocker-5f323aaf6f26aba3a2f33eea9ed88e1ee40cc4f9.tar.gz Skyblocker-5f323aaf6f26aba3a2f33eea9ed88e1ee40cc4f9.tar.bz2 Skyblocker-5f323aaf6f26aba3a2f33eea9ed88e1ee40cc4f9.zip | |
Merge branch 'SkyblockerMod:master' into master
Diffstat (limited to 'src/main/java/me/xmrvizzy/skyblocker')
23 files changed, 701 insertions, 462 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java index a15b3a96..e9af52f6 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java @@ -8,6 +8,7 @@ import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; +import me.xmrvizzy.skyblocker.utils.UpdateChecker; import net.fabricmc.api.ClientModInitializer; public class SkyblockerInitializer implements ClientModInitializer { @@ -21,5 +22,7 @@ public class SkyblockerInitializer implements ClientModInitializer { StatsCommand.init(); DwarvenHud.init(); ChatMessageListener.init(); + UpdateChecker.init(); + SkyblockerMod.getInstance().discordRPCManager.init(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index f3c851f1..6b5558cf 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -3,6 +3,7 @@ package me.xmrvizzy.skyblocker; import me.xmrvizzy.skyblocker.container.ContainerSolverManager; import me.xmrvizzy.skyblocker.discord.DiscordRPCManager; import me.xmrvizzy.skyblocker.skyblock.BackpackPreview; +import me.xmrvizzy.skyblocker.skyblock.StatusBarTracker; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze; import me.xmrvizzy.skyblocker.utils.Scheduler; import me.xmrvizzy.skyblocker.utils.Utils; @@ -14,12 +15,13 @@ public class SkyblockerMod { public final Scheduler scheduler = new Scheduler(); public final ContainerSolverManager containerSolverManager = new ContainerSolverManager(); public final DiscordRPCManager discordRPCManager = new DiscordRPCManager(); + public final StatusBarTracker statusBarTracker = new StatusBarTracker(); private SkyblockerMod() { scheduler.scheduleCyclic(Utils::sbChecker, 20); scheduler.scheduleCyclic(discordRPCManager::update, 100); scheduler.scheduleCyclic(DungeonBlaze::update, 4); - scheduler.scheduleCyclic(BackpackPreview::tick, 100); + scheduler.scheduleCyclic(BackpackPreview::tick, 50); } public static SkyblockerMod getInstance() { diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 93e1d8e9..0a7260f8 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -37,28 +37,79 @@ public class SkyblockerConfig implements ConfigData { public String apiKey; @ConfigEntry.Category("bars") - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public Bars bars = new Bars(); @ConfigEntry.Category("itemList") - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public ItemList itemList = new ItemList(); @ConfigEntry.Category("quicknav") - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public Quicknav quicknav = new Quicknav(); @ConfigEntry.Category("itemTooltip") - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public ItemTooltip itemTooltip = new ItemTooltip(); + @ConfigEntry.Category("hitbox") + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) + public Hitbox hitbox = new Hitbox(); + @ConfigEntry.Gui.Excluded public List<Integer> lockedSlots = new ArrayList<>(); } public static class Bars { public boolean enableBars = true; + + @ConfigEntry.Category("barpositions") + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) + public BarPositions barpositions = new BarPositions(); + } + + public static class BarPositions { + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public BarPosition healthBarPosition = BarPosition.LAYER1; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public BarPosition manaBarPosition = BarPosition.LAYER1; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public BarPosition defenceBarPosition = BarPosition.LAYER1; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public BarPosition experienceBarPosition = BarPosition.LAYER1; + } + + public enum BarPosition { + LAYER1, + LAYER2, + RIGHT, + NONE; + + public String toString() { + return switch (this) { + case LAYER1 -> "Layer 1"; + case LAYER2 -> "Layer 2"; + case RIGHT -> "Right"; + case NONE -> "Disabled"; + }; + } + + public int toInt() { + return switch (this) { + case LAYER1 -> 0; + case LAYER2 -> 1; + case RIGHT -> 2; + case NONE -> -1; + }; + } + } + + public static class Hitbox { + public boolean oldFarmlandHitbox = true; + public boolean oldLeverHitbox = false; + } + public static class RichPresence { public boolean enableRichPresence = false; @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) @@ -103,11 +154,11 @@ public class SkyblockerConfig implements ConfigData { public static class Locations { @ConfigEntry.Category("dungeons") - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public Dungeons dungeons = new Dungeons(); @ConfigEntry.Category("dwarvenmines") - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public DwarvenMines dwarvenMines = new DwarvenMines(); } @@ -116,8 +167,7 @@ public class SkyblockerConfig implements ConfigData { public boolean solveThreeWeirdos = true; public boolean blazesolver = true; public boolean solveTrivia = true; - public boolean oldLevers = false; - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public Terminals terminals = new Terminals(); } @@ -131,7 +181,7 @@ public class SkyblockerConfig implements ConfigData { public boolean enableDrillFuel = true; public boolean solveFetchur = true; public boolean solvePuzzler = true; - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public DwarvenHud dwarvenHud = new DwarvenHud(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java index e13dfd09..87405989 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java @@ -1,101 +1,76 @@ package me.xmrvizzy.skyblocker.discord; -import com.google.gson.JsonObject; -import com.jagrosh.discordipc.IPCClient; -import com.jagrosh.discordipc.IPCListener; -import com.jagrosh.discordipc.entities.RichPresence; -import com.jagrosh.discordipc.entities.pipe.PipeStatus; + +import me.shedaniel.autoconfig.AutoConfig; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.SkyblockEvents; import me.xmrvizzy.skyblocker.utils.Utils; +import meteordevelopment.discordipc.DiscordIPC; +import meteordevelopment.discordipc.RichPresence; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.DecimalFormat; -import java.time.OffsetDateTime; +import java.time.Instant; -public class DiscordRPCManager implements IPCListener{ - public static long startTimestamp; - public static IPCClient client; - public boolean isConnected; - private static final Logger LOGGER = LoggerFactory.getLogger(DiscordRPCManager.class.getName()); - public static DecimalFormat dFormat = new DecimalFormat("###,###.##"); - public int cycleCount = 0; +public class DiscordRPCManager { + public static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("###,###.##"); + public static final Logger LOGGER = LoggerFactory.getLogger(DiscordRPCManager.class.getName()); + public static long startTimeStamp; + public static int cycleCount; - public void update() { - if (!SkyblockerConfig.get().richPresence.enableRichPresence || !Utils.isOnSkyblock) { - if (isConnected) stop(); - return; - } - if (!isConnected) start(); - if (SkyblockerConfig.get().richPresence.cycleMode) - cycleCount = (cycleCount + 1) % 3; - updatePresence(); + public static void init(){ + SkyblockEvents.LEAVE.register(DiscordIPC::stop); } - public void start(){ - try { - LOGGER.info("[Skyblocker DiscordRPC] Starting..."); - startTimestamp = OffsetDateTime.now().toEpochSecond(); - client = new IPCClient(934607927837356052L); - client.setListener(this); - try { - client.connect(); - } catch (Exception e) { - LOGGER.warn("Failed to connect: " + e.getMessage()); + public void update(){ + if (SkyblockerConfig.get().richPresence.customMessage != null ) { + if (SkyblockerConfig.get().richPresence.customMessage.isBlank()) { + SkyblockerConfig.get().richPresence.customMessage = "All on Fabric!"; + AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); } - } catch (Throwable ex) { - LOGGER.error("[Skyblocker DiscordRPC] unexpected error occurred while trying to start..."); - ex.printStackTrace(); } + if (!SkyblockerConfig.get().richPresence.enableRichPresence || !Utils.isOnSkyblock){ + if (DiscordIPC.isConnected()) DiscordIPC.stop(); + } + if (SkyblockerConfig.get().richPresence.enableRichPresence && Utils.isOnSkyblock && !DiscordIPC.isConnected()){ + if (!DiscordIPC.start(934607927837356052L, () -> { + LOGGER.info("Started up rich presence"); + startTimeStamp = Instant.now().getEpochSecond(); + })){ + LOGGER.info("An error occurred while attempting to connect to discord"); + return; + } + } + if (SkyblockerConfig.get().richPresence.cycleMode) + cycleCount = (cycleCount + 1) % 3; + buildPresence(); } - public void updatePresence(){ - RichPresence presence = new RichPresence.Builder() - .setState(SkyblockerConfig.get().richPresence.customMessage) - .setDetails(getInfo()) - .setStartTimestamp(startTimestamp) - .setLargeImage("skyblocker-default") - .build(); - if (client != null && isConnected) client.sendRichPresence(presence); + public void buildPresence(){ + RichPresence presence = new RichPresence(); + presence.setLargeImage("skyblocker-default", null); + presence.setStart(startTimeStamp); + presence.setDetails(SkyblockerConfig.get().richPresence.customMessage); + presence.setState(getInfo()); + DiscordIPC.setActivity(presence); } public String getInfo(){ String info = null; if (!SkyblockerConfig.get().richPresence.cycleMode){ switch (SkyblockerConfig.get().richPresence.info){ - case BITS -> info = "Bits: " + dFormat.format(Utils.getBits()); - case PURSE -> info = "Purse: " + dFormat.format(Utils.getPurse()); + case BITS -> info = "Bits: " + DECIMAL_FORMAT.format(Utils.getBits()); + case PURSE -> info = "Purse: " + DECIMAL_FORMAT.format(Utils.getPurse()); case LOCATION -> info = "⏣ " + Utils.getLocation(); } } else if (SkyblockerConfig.get().richPresence.cycleMode){ switch (cycleCount){ - case 0 -> info = "Bits: " + dFormat.format(Utils.getBits()); - case 1 -> info = "Purse: " + dFormat.format(Utils.getPurse()); + case 0 -> info = "Bits: " + DECIMAL_FORMAT.format(Utils.getBits()); + case 1 -> info = "Purse: " + DECIMAL_FORMAT.format(Utils.getPurse()); case 2 -> info = "⏣ " + Utils.getLocation(); } } return info; } - - public void stop(){ - if (client != null && client.getStatus() == PipeStatus.CONNECTED) { - LOGGER.info("[Skyblocker DiscordRPC] Closing..."); - isConnected = false; - client.close(); - client = null; - } - } - - @Override - public void onReady(IPCClient client) { - LOGGER.info("[Skyblocker DiscordRPC] Started!"); - isConnected = true; - } - - @Override - public void onClose(IPCClient client, JsonObject json) { - LOGGER.info("[Skyblocker DiscordRPC] Closed"); - isConnected = false; - } - } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatScreenMixin.java deleted file mode 100644 index e85a64fc..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatScreenMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package me.xmrvizzy.skyblocker.mixin; - -import net.minecraft.client.gui.screen.ChatScreen; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.text.Text; -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.CallbackInfoReturnable; - -@Mixin(ChatScreen.class) -public class ChatScreenMixin extends Screen { - - @Shadow protected TextFieldWidget chatField; - - protected ChatScreenMixin(Text title) { - super(title); - } - - @Inject(method = "keyPressed", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;openScreen(Lnet/minecraft/client/gui/screen/Screen;)V", ordinal = 1), cancellable = true) - public void keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable<Boolean> cir) { - String[] split = this.chatField.getText().trim().toLowerCase().split(" "); - if (split.length > 0 && split[0].contentEquals("/skb")) { - cir.setReturnValue(true); - } - } -}
\ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java deleted file mode 100644 index ef900eef..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java +++ /dev/null @@ -1,34 +0,0 @@ -package me.xmrvizzy.skyblocker.mixin; - -import com.mojang.authlib.GameProfile; -import com.mojang.brigadier.CommandDispatcher; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.util.telemetry.TelemetrySender; -import net.minecraft.command.CommandSource; -import net.minecraft.network.ClientConnection; -import net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket; -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 static com.mojang.brigadier.builder.LiteralArgumentBuilder.literal; - -@Mixin(ClientPlayNetworkHandler.class) -public class ClientPlayNetworkHandlerMixin { - - @Shadow private CommandDispatcher<CommandSource> commandDispatcher; - - @Inject(method = "<init>", at = @At("RETURN")) - private void init(MinecraftClient client, Screen screen, ClientConnection connection, GameProfile profile, TelemetrySender telemetrySender, CallbackInfo ci) { - commandDispatcher.register(literal("skb")); - } - - @Inject(method = "onCommandTree", at = @At("RETURN")) - private void onCommandTree(CommandTreeS2CPacket packet, CallbackInfo ci) { - commandDispatcher.register(literal("skb")); - } -}
\ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java index 160c8078..2d016459 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java @@ -9,7 +9,6 @@ import net.minecraft.client.world.ClientWorld; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ClientPlayerEntity.class) @@ -19,14 +18,6 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity super(world, profile); } - @Inject(method = "sendChatMessage", at = @At("HEAD"), cancellable = true) - public void sendChatMessage(String message, CallbackInfo ci) { - String[] split = message.toLowerCase().split(" "); - if (split.length > 0 && split[0].contentEquals("/skb")) { - ci.cancel(); - } - } - @Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true) public void dropSelectedItem(boolean dropEntireStack, CallbackInfoReturnable<Boolean> cir) { if (Utils.isOnSkyblock) HotbarSlotLock.handleDropSelectedItem(this.getInventory().selectedSlot, cir); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java new file mode 100644 index 00000000..d7ca3686 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java @@ -0,0 +1,33 @@ +package me.xmrvizzy.skyblocker.mixin; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.FarmlandBlock; +import net.minecraft.block.ShapeContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(FarmlandBlock.class) +public abstract class FarmlandBlockMixin extends Block { + protected FarmlandBlockMixin(Settings settings) { + super(settings); + } + + @Inject(method = "getOutlineShape", at = @At("HEAD"), cancellable = true) + public void onGetOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context, CallbackInfoReturnable<VoxelShape> cir) { + if (Utils.isOnSkyblock && SkyblockerConfig.get().general.hitbox.oldFarmlandHitbox) + cir.setReturnValue(Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 16.0, 16.0)); + } + + @Override + public VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) { + return Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 15.0, 16.0); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index bd99f2d4..0303bca2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -41,25 +41,26 @@ public abstract class HandledScreenMixin extends Screen { List<QuickNavButton> buttons = QuickNav.init(screenTitle); for (QuickNavButton button : buttons) super.addDrawableChild(button); } - BackpackPreview.loadStorage((HandledScreen)(Object)this); - BackpackPreview.updateStorage((HandledScreen)(Object)this); + // backpack preview + BackpackPreview.updateStorage((HandledScreen<?>)(Object)this); } @Inject(at = @At("HEAD"), method = "keyPressed", cancellable = true) public void keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable<Boolean> cir) { - if (focusedSlot != null){ - if (keyCode != 256 && !MinecraftClient.getInstance().options.inventoryKey.matchesKey(keyCode, scanCode)){ - if (WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) WikiLookup.openWiki(focusedSlot); + if (this.focusedSlot != null){ + if (keyCode != 256 && !this.client.options.inventoryKey.matchesKey(keyCode, scanCode)){ + if (WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) WikiLookup.openWiki(this.focusedSlot); } } } @Inject(at = @At("HEAD"), method = "drawMouseoverTooltip", cancellable = true) public void drawMouseOverTooltip(MatrixStack matrices, int x, int y, CallbackInfo ci) { - String title = ((HandledScreen)(Object)this).getTitle().getString(); - boolean shiftDown = SkyblockerConfig.get().general.backpackPreviewWithoutShift || Screen.hasShiftDown(); - if (shiftDown && title.equals("Storage") && focusedSlot != null) { - if (BackpackPreview.renderPreview(matrices, focusedSlot.getIndex(), x, y)) ci.cancel(); + String title = ((HandledScreen<?>)(Object)this).getTitle().getString(); + boolean shiftDown = SkyblockerConfig.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown(); + if (shiftDown && title.equals("Storage") && this.focusedSlot != null) { + if (this.focusedSlot.inventory == this.client.player.getInventory()) return; + if (BackpackPreview.renderPreview(matrices, this.focusedSlot.getIndex(), x, y)) ci.cancel(); } } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java index b9e80bd6..9ceebf9f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java @@ -5,6 +5,7 @@ import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.FancyStatusBars; import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; +import me.xmrvizzy.skyblocker.skyblock.StatusBarTracker; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMap; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.api.EnvType; @@ -24,14 +25,12 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - @Environment(EnvType.CLIENT) @Mixin(InGameHud.class) public abstract class InGameHudMixin extends DrawableHelper { private static final Identifier SLOT_LOCK = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/slot_lock.png"); + private final StatusBarTracker statusBarTracker = SkyblockerMod.getInstance().statusBarTracker; private final FancyStatusBars statusBars = new FancyStatusBars(); private MatrixStack hotbarMatrices; private int hotbarSlotIndex; @@ -44,13 +43,21 @@ public abstract class InGameHudMixin extends DrawableHelper { @Shadow private int scaledWidth; + @Shadow + private void setOverlayMessage(Text message, boolean tinted) { + } + @Inject(method = "setOverlayMessage(Lnet/minecraft/text/Text;Z)V", at = @At("HEAD"), cancellable = true) private void onSetOverlayMessage(Text message, boolean tinted, CallbackInfo ci) { - if(!Utils.isOnSkyblock) + if (!Utils.isOnSkyblock || !SkyblockerConfig.get().general.bars.enableBars) return; String msg = message.getString(); - if(statusBars.update(msg)) + String res = statusBarTracker.update(msg, SkyblockerConfig.get().messages.hideMana); + if (msg != res) { + if (res != null) + setOverlayMessage(Text.of(res), tinted); ci.cancel(); + } } @Inject(method = "renderHotbar", at = @At("HEAD")) diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java index 2638b0a6..00f32459 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java @@ -9,6 +9,7 @@ import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.network.PlayerListEntry; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.player.PlayerEntity; @@ -18,7 +19,9 @@ import net.minecraft.nbt.*; import net.minecraft.util.Identifier; import java.io.File; +import java.nio.file.Path; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -26,82 +29,95 @@ import java.util.regex.Pattern; public class BackpackPreview extends DrawableHelper { private static final Identifier TEXTURE = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/inventory_background.png"); private static final BackpackPreview instance = new BackpackPreview(); + private static final Pattern PROFILE_PATTERN = Pattern.compile("Profile: ([a-zA-Z]+)"); private static final Pattern ECHEST_PATTERN = Pattern.compile("Ender Chest.*\\((\\d+)/\\d+\\)"); private static final Pattern BACKPACK_PATTERN = Pattern.compile("Backpack.*\\((\\d+)/\\d+\\)"); private static final int STORAGE_SIZE = 27; private static final Inventory[] storage = new Inventory[STORAGE_SIZE]; private static final boolean[] dirty = new boolean[STORAGE_SIZE]; - private static boolean loaded = false; + + private static String loaded = ""; // uuid + sb profile currently loaded + private static Path save_dir = null; public static void tick() { + Utils.sbChecker(); // force update isOnSkyblock to prevent crash on disconnect if (Utils.isOnSkyblock) { - for (int index = 0; index < STORAGE_SIZE; ++index) - if (dirty[index]) saveStorage(index); - if (MinecraftClient.getInstance().currentScreen != null) { - String title = MinecraftClient.getInstance().currentScreen.getTitle().getString(); - int index = getStorageIndexFromTitle(title); - if (index != -1) dirty[index] = true; + // save all dirty storages + saveStorage(); + // update save dir based on uuid and sb profile + String uuid = MinecraftClient.getInstance().getSession().getUuid().replaceAll("-", ""); + String profile = getSkyblockProfile(); + if (uuid != null && profile != null) { + save_dir = FabricLoader.getInstance().getConfigDir().resolve("skyblocker/backpack-preview/" + uuid + "/" + profile); + save_dir.toFile().mkdirs(); + if (loaded.equals(uuid + "/" + profile)) { + // mark currently opened storage as dirty + if (MinecraftClient.getInstance().currentScreen != null) { + String title = MinecraftClient.getInstance().currentScreen.getTitle().getString(); + int index = getStorageIndexFromTitle(title); + if (index != -1) dirty[index] = true; + } + } else { + // load storage again because uuid/profile changed + loaded = uuid + "/" + profile; + loadStorage(); + } } } } - private static File getSaveDir() { - String uuid = MinecraftClient.getInstance().getSession().getUuid(); - File dir = FabricLoader.getInstance().getConfigDir().resolve("skyblocker/backpack-preview/" + uuid).toFile(); - dir.mkdirs |
