aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/xmrvizzy/skyblocker
diff options
context:
space:
mode:
authorSerhan <serhanduzce@gmail.com>2022-06-16 12:34:35 +0300
committerGitHub <noreply@github.com>2022-06-16 12:34:35 +0300
commit5f323aaf6f26aba3a2f33eea9ed88e1ee40cc4f9 (patch)
tree856b91f6a6c8632b24ef05d1898c0ba1f847585b /src/main/java/me/xmrvizzy/skyblocker
parent4afe31dca21b94c102099549800d4fa1cb1bbe6d (diff)
parent6c268d4f5b5d9447d9cd7ca4cb5afe2066198c97 (diff)
downloadSkyblocker-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')
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java3
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java68
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java113
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/ChatScreenMixin.java29
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java34
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java9
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java33
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java19
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java17
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java133
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java277
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java110
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/OldLever.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java43
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java17
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java32
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java70
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java13
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/Events.java35
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/SkyblockEvents.java33
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java59
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java10
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