aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gradle.properties6
-rwxr-xr-xgradlew2
-rw-r--r--gradlew.bat2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java75
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java14
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java21
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java7
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java3
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java14
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java5
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java52
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java1
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java160
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java3
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/Events.java34
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java60
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/ToastBuilder.java34
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java55
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java48
-rw-r--r--src/main/resources/assets/skyblocker/lang/en_us.json14
27 files changed, 420 insertions, 206 deletions
diff --git a/gradle.properties b/gradle.properties
index 41a9c7fc..f1e32644 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,4 +1,4 @@
-org.gradle.jvmargs=-Xmx1G
+org.gradle.jvmargs=-Xmx1G -Dfile.encoding=UTF-8 -Duser.language=en -Duser.country=US
# Fabric Properties (https://fabricmc.net/versions.html)
minecraft_version=1.18.1
@@ -10,9 +10,9 @@ fabric_version=0.44.0+1.18
# Dependencies
## Cloth Api (https://www.curseforge.com/minecraft/mc-mods/cloth-config/files)
-clothconfig_version=6.1.48
+clothconfig_version=6.1.50
## Mod Menu (https://www.curseforge.com/minecraft/mc-mods/modmenu/files)
-mod_menu_version=3.0.0
+mod_menu_version=3.0.1
# Mod Properties
mod_version = 1.5.0
diff --git a/gradlew b/gradlew
index fe1f4e62..39be0b91 100755
--- a/gradlew
+++ b/gradlew
@@ -44,7 +44,7 @@ APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m" "-Dfile.encoding=UTF-8" "-Duser.language=en" "-Duser.country=US"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
diff --git a/gradlew.bat b/gradlew.bat
index 107acd32..afa9efaa 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -33,7 +33,7 @@ set APP_HOME=%DIRNAME%
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" "-Dfile.encoding=UTF-8" "-Duser.language=en" "-Duser.country=US"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
index 575a87d3..2c0a8ad6 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
@@ -1,88 +1,31 @@
package me.xmrvizzy.skyblocker;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
import me.xmrvizzy.skyblocker.container.ContainerSolverManager;
import me.xmrvizzy.skyblocker.discord.DiscordRPCManager;
import me.xmrvizzy.skyblocker.skyblock.BackpackPreview;
import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze;
+import me.xmrvizzy.skyblocker.utils.Scheduler;
import me.xmrvizzy.skyblocker.utils.Utils;
-import net.minecraft.client.MinecraftClient;
-
-import java.util.Objects;
public class SkyblockerMod {
public static final String NAMESPACE = "skyblocker";
private static final SkyblockerMod instance = new SkyblockerMod();
+
+ public final Scheduler scheduler = new Scheduler();
public final ContainerSolverManager containerSolverManager = new ContainerSolverManager();
- public DiscordRPCManager discordRPCManager = new DiscordRPCManager();
+ public final DiscordRPCManager discordRPCManager = new DiscordRPCManager();
private SkyblockerMod() {
+ scheduler.scheduleCyclic(Utils::sbChecker, 20);
+ scheduler.scheduleCyclic(discordRPCManager::update, 100);
+ scheduler.scheduleCyclic(DungeonBlaze::update, 4);
}
public static SkyblockerMod getInstance() {
return instance;
}
- private int ticks = 0;
- private int rpTimer = 0;
-
public void onTick() {
- MinecraftClient client = MinecraftClient.getInstance();
- if (client == null) return;
- ticks++;
- if(onHypxiel()) {
- BackpackPreview.tick();
- if (ticks % 4 == 0)
- try {
- if (Utils.isDungeons) {
- DungeonBlaze.DungeonBlaze();
- }
- } catch (Exception e) {
- //System.out.println("Blazesolver: " + e);
- }
- if (ticks % 20 == 0) {
- rpTimer++;
- if (rpTimer == 5) {
- if (discordRPCManager.isConnected && Utils.isSkyblock && SkyblockerConfig.get().richPresence.enableRichPresence) {
- discordRPCManager.updatePresence();
- }
- if (discordRPCManager.isConnected && Utils.isSkyblock && SkyblockerConfig.get().richPresence.cycleMode) {
- discordRPCManager.cycleCount++;
- if (discordRPCManager.cycleCount == 3) discordRPCManager.cycleCount = 0;
- }
- rpTimer = 0;
- }
- if (client.world != null && !client.isInSingleplayer())
- Utils.sbChecker();
- if (!discordRPCManager.isConnected && Utils.isSkyblock && SkyblockerConfig.get().richPresence.enableRichPresence)
- discordRPCManager.start();
- if (discordRPCManager.isConnected && !SkyblockerConfig.get().richPresence.enableRichPresence)
- discordRPCManager.stop();
- ticks = 0;
- }
- } else {
- if (ticks % 20 == 0) {
- if (discordRPCManager.isConnected) {
- discordRPCManager.stop();
- }
- Utils.sbChecker();
- ticks = 0;
- }
- }
- }
- public static MinecraftClient client() {
- try {
- return MinecraftClient.getInstance();
- }
- catch(NullPointerException e) {
- return null;
- }
- }
- public static boolean onHypxiel() {
- try {
- return client() != null && !client().isInSingleplayer() && Objects.requireNonNull(client().getCurrentServerEntry()).address != null && client().getCurrentServerEntry().address.contains("hypixel.net");
- } catch (NullPointerException exception) {
- return false;
- }
+ scheduler.tick();
}
-} \ No newline at end of file
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
index 9471620b..40b20b98 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
@@ -42,6 +42,12 @@ public class SkyblockerConfig implements ConfigData {
@ConfigEntry.Gui.CollapsibleObject(startExpanded = true)
public Quicknav quicknav = new Quicknav();
+ public boolean enableUpdateNotification = true;
+
+ @ConfigEntry.Category("itemTooltip")
+ @ConfigEntry.Gui.CollapsibleObject(startExpanded = true)
+ public ItemTooltip itemTooltip = new ItemTooltip();
+
@ConfigEntry.Gui.Excluded
public List<Integer> lockedSlots = new ArrayList<>();
}
@@ -66,6 +72,14 @@ public class SkyblockerConfig implements ConfigData {
public boolean enableQuicknav = true;
}
+ public static class ItemTooltip {
+ public boolean enableNPCPrice = true;
+ public boolean enableAvgBIN = true;
+ public boolean enableLowestBIN = true;
+ public boolean enableBazaarPrice = true;
+ public boolean enableMuseumDate = true;
+ }
+
public static class Locations {
@ConfigEntry.Category("dungeons")
@ConfigEntry.Gui.CollapsibleObject(startExpanded = true)
diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java
index 96da1198..b854613a 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java
@@ -20,6 +20,17 @@ public class DiscordRPCManager implements IPCListener{
public static DecimalFormat dFormat = new DecimalFormat("###,###.##");
public int cycleCount = 0;
+ 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 void start(){
try {
logger.info("Starting...");
@@ -66,10 +77,12 @@ public class DiscordRPCManager implements IPCListener{
}
public void stop(){
- logger.info("Closing...");
- isConnected = false;
- client.close();
- client = null;
+ if (client != null){
+ logger.info("Closing...");
+ isConnected = false;
+ client.close();
+ client = null;
+ }
}
@Override
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java
index 43103159..9170f1db 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java
@@ -1,20 +1,15 @@
package me.xmrvizzy.skyblocker.mixin;
import me.xmrvizzy.skyblocker.chat.ChatParser;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
import me.xmrvizzy.skyblocker.utils.Utils;
-import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.hud.ChatHudListener;
-import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.network.MessageType;
-import net.minecraft.text.ClickEvent;
import net.minecraft.text.Text;
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 java.util.List;
import java.util.UUID;
@Mixin(ChatHudListener.class)
@@ -24,7 +19,7 @@ public class ChatHudListenerMixin {
@Inject(method = "onChatMessage", at = @At("HEAD"), cancellable = true)
public void onMessage(MessageType messageType, Text message, UUID senderUuid, CallbackInfo ci) {
- if (!Utils.isSkyblock)
+ if (!Utils.isOnSkyblock)
return;
if (parser.shouldFilter(message.getString()))
ci.cancel();
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java
index 5825b394..160c8078 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java
@@ -29,6 +29,6 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity
@Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true)
public void dropSelectedItem(boolean dropEntireStack, CallbackInfoReturnable<Boolean> cir) {
- if (Utils.isSkyblock) HotbarSlotLock.handleDropSelectedItem(this.getInventory().selectedSlot, cir);
+ if (Utils.isOnSkyblock) HotbarSlotLock.handleDropSelectedItem(this.getInventory().selectedSlot, cir);
}
} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java
index 3e6bf16a..d63d17b8 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java
@@ -25,7 +25,7 @@ public abstract class GenericContainerScreenMixin extends HandledScreen<GenericC
@Override
protected void drawForeground(MatrixStack matrices, int mouseX, int mouseY) {
super.drawForeground(matrices, mouseX, mouseY);
- if (Utils.isSkyblock)
+ if (Utils.isOnSkyblock)
SkyblockerMod.getInstance().containerSolverManager.onDraw(matrices, this.handler.slots.subList(0, rows * 9));
}
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java
index 88676f08..cba87f48 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java
@@ -35,7 +35,8 @@ public abstract class HandledScreenMixin extends Screen {
@Inject(method = "init()V", at = @At("TAIL"))
private void init(CallbackInfo ci) {
- if (Utils.isSkyblock && SkyblockerConfig.get().general.quicknav.enableQuicknav) {
+ // quicknav
+ if (Utils.isOnSkyblock && SkyblockerConfig.get().general.quicknav.enableQuicknav) {
String screenTitle = super.getTitle().getString().trim();
List<QuickNavButton> buttons = QuickNav.init(screenTitle);
for (QuickNavButton button : buttons) super.addDrawableChild(button);
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java
index 2653aeef..19e0d79e 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java
@@ -43,7 +43,7 @@ public abstract class InGameHudMixin extends DrawableHelper {
@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.isSkyblock)
+ if(!Utils.isOnSkyblock)
return;
String msg = message.getString();
if(statusBars.update(msg))
@@ -52,7 +52,7 @@ public abstract class InGameHudMixin extends DrawableHelper {
@Inject(method = "renderHotbar", at = @At("HEAD"))
public void renderHotbar(float f, MatrixStack matrices, CallbackInfo ci) {
- if (Utils.isSkyblock) {
+ if (Utils.isOnSkyblock) {
hotbarMatrices = matrices;
hotbarSlotIndex = 0;
}
@@ -60,7 +60,7 @@ public abstract class InGameHudMixin extends DrawableHelper {
@Inject(method = "renderHotbarItem", at = @At("HEAD"))
public void renderHotbarItem(int i, int j, float f, PlayerEntity player, ItemStack stack, int seed, CallbackInfo ci) {
- if (Utils.isSkyblock) {
+ if (Utils.isOnSkyblock) {
if (HotbarSlotLock.isLocked(hotbarSlotIndex)) {
RenderSystem.setShaderTexture(0,SLOT_LOCK);
this.drawTexture(hotbarMatrices, i, j, 0, 0,16, 16);
@@ -71,18 +71,18 @@ public abstract class InGameHudMixin extends DrawableHelper {
@Inject(method = "renderExperienceBar", at = @At("HEAD"), cancellable = true)
private void renderExperienceBar(MatrixStack matrices, int x, CallbackInfo ci) {
- if (Utils.isSkyblock && SkyblockerConfig.get().general.bars.enableBars)
+ if (Utils.isOnSkyblock && SkyblockerConfig.get().general.bars.enableBars)
ci.cancel();
}
@Inject(method = "renderStatusBars", at = @At("HEAD"), cancellable = true)
private void renderStatusBars(MatrixStack matrices, CallbackInfo ci) {
- if(!Utils.isSkyblock)
+ if(!Utils.isOnSkyblock)
return;
if(statusBars.render(matrices, scaledWidth, scaledHeight))
ci.cancel();
- if (Utils.isDungeons && SkyblockerConfig.get().locations.dungeons.enableMap)
+ if (Utils.isInDungeons && SkyblockerConfig.get().locations.dungeons.enableMap)
DungeonMap.render(matrices);
RenderSystem.setShaderTexture(0, GUI_ICONS_TEXTURE);
@@ -90,7 +90,7 @@ public abstract class InGameHudMixin extends DrawableHelper {
@Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true)
private void renderMountHealth(MatrixStack matrices, CallbackInfo ci) {
- if (Utils.isSkyblock && SkyblockerConfig.get().general.bars.enableBars)
+ if (Utils.isOnSkyblock && SkyblockerConfig.get().general.bars.enableBars)
ci.cancel();
}
} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java
index fcdbf706..4bff2779 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java
@@ -19,7 +19,7 @@ public class InventoryScreenMixin {
)
)
RecipeBookWidget constructor() {
- if (Utils.isSkyblock && SkyblockerConfig.get().general.itemList.enableItemList)
+ if (Utils.isOnSkyblock && SkyblockerConfig.get().general.itemList.enableItemList)
return new ItemListWidget();
else
return new RecipeBookWidget();
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java
index 002497ce..395027bc 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java
@@ -28,7 +28,7 @@ public abstract class ItemRendererMixin {
@Inject(method = "renderGuiItemOverlay(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD"))
public void renderItemBar(TextRenderer renderer, ItemStack stack, int x, int y, @Nullable String countLabel, CallbackInfo ci) {
- if (Utils.isSkyblock && SkyblockerConfig.get().locations.dwarvenMines.enableDrillFuel) {
+ if (Utils.isOnSkyblock && SkyblockerConfig.get().locations.dwarvenMines.enableDrillFuel) {
if (!stack.isEmpty()) {
NbtCompound tag = stack.getNbt();
if (tag != null && tag.contains("ExtraAttributes")) {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java
index f1c6661d..c3ff287e 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java
@@ -22,7 +22,7 @@ public abstract class LeverBlockMixin extends WallMountedBlock {
@Inject(method = "getOutlineShape", at = @At("HEAD"), cancellable = true)
public void onGetOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context, CallbackInfoReturnable<VoxelShape> cir) {
- if (Utils.isSkyblock) {
+ if (Utils.isOnSkyblock) {
VoxelShape shape = OldLever.getShape(state.get(FACE), state.get(FACING));
if (shape != null)
cir.setReturnValue(shape);
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java
index 21730e69..6561eb5b 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java
@@ -27,13 +27,13 @@ public class MinecraftClientMixin {
@Inject(method = "handleInputEvents", at = @At("HEAD"))
public void handleInputEvents(CallbackInfo ci) {
- if (Utils.isSkyblock) HotbarSlotLock.handleInputEvents(player);
+ if (Utils.isOnSkyblock) HotbarSlotLock.handleInputEvents(player);
}
@Inject(method = "setScreen", at = @At("HEAD"))
public void onSetScreen(Screen screen, CallbackInfo ci) {
ContainerSolverManager manager = SkyblockerMod.getInstance().containerSolverManager;
- if(Utils.isSkyblock && screen instanceof GenericContainerScreen)
+ if(Utils.isOnSkyblock && screen instanceof GenericContainerScreen)
manager.onSetScreen((GenericContainerScreen) screen);
else
manager.clearScreen();
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java
index ab81cd75..d4f7fec5 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java
@@ -1,6 +1,7 @@
package me.xmrvizzy.skyblocker.skyblock.dungeon;
import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.utils.Utils;
import me.xmrvizzy.skyblocker.utils.color.QuadColor;
import me.xmrvizzy.skyblocker.utils.RenderUtils;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
@@ -14,13 +15,15 @@ public class DungeonBlaze {
static Entity lowestBlaze = null;
static boolean renderHooked = false;
- public static void DungeonBlaze() {
+ public static void update() {
+ if (!Utils.isInDungeons) return;
MinecraftClient client = MinecraftClient.getInstance();
if(!renderHooked){
WorldRenderEvents.END.register(DungeonBlaze::blazeRenderer);
renderHooked = true;
}
+ assert client.world != null;
Iterable<Entity> entities = client.world.getEntities();
int highestHealth = 0;
int lowestHealth = 99999999;
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java
index 69278023..65b9648f 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java
@@ -1,5 +1,6 @@
package me.xmrvizzy.skyblocker.skyblock.dungeon;
+import me.xmrvizzy.skyblocker.SkyblockerMod;
import me.xmrvizzy.skyblocker.chat.ChatListener;
import me.xmrvizzy.skyblocker.utils.Utils;
import net.fabricmc.fabric.api.client.command.v1.ClientCommandManager;
@@ -11,8 +12,9 @@ import java.util.regex.Pattern;
public class Reparty extends ChatListener {
private static final MinecraftClient client = MinecraftClient.getInstance();
+ private static final SkyblockerMod skyblocker = SkyblockerMod.getInstance();
public static final Pattern PLAYER = Pattern.compile(" ([a-zA-Z0-9_]{2,16}) ●");
- private static final int SLEEP_TIME = 600;
+ private static final int BASE_DELAY = 20;
private String[] players;
private int playersSoFar;
@@ -23,7 +25,7 @@ public class Reparty extends ChatListener {
repartying = false;
ClientCommandManager.DISPATCHER.register(
ClientCommandManager.literal("rp").executes(context -> {
- if (!Utils.isSkyblock || repartying)
+ if (!Utils.isOnSkyblock || repartying)
return 0;
assert client.player != null;
repartying = true;
@@ -53,45 +55,31 @@ public class Reparty extends ChatListener {
return false;
}
if (playersSoFar == players.length)
- new Thread(this::reparty).start();
+ reparty();
return false;
}
private void reparty() {
ClientPlayerEntity playerEntity = client.player;
assert playerEntity != null;
- StringBuilder sb = new StringBuilder("/p disband");
- for (int i = 0; i < players.length; i++) {
- if (i % 5 == 0) {
- sleep();
- playerEntity.sendChatMessage(sb.toString());
- sb.setLength(0);
- sb.append("/p invite");
+ sendCommand(playerEntity, "/p disband", 1);
+ StringBuilder sb = new StringBuilder();
+ int invites = (players.length - 1) / 5 + 1;
+ for(int i = 0; i < invites; i++) {
+ sb.setLength(0);
+ sb.append("/p invite");
+ for(int j = 0; j < 5 && i * 5 + j < players.length; j++) {
+ sb.append(' ');
+ sb.append(players[i * 5 + j]);
}
- sb.append(' ');
- sb.append(players[i]);
+ sendCommand(playerEntity, sb.toString(), i + 2);
}
- if (players.length % 5 != 0) {
- sleep();
- playerEntity.sendChatMessage(sb.toString());
- }
- repartying = false;
+ skyblocker.scheduler.schedule(() -> repartying = false, invites + 2);
}
- private void sleep() {
- long sleepStart = System.currentTimeMillis();
- boolean interrupted = false;
- long sleepLeft = SLEEP_TIME;
- do {
- if (interrupted) {
- sleepLeft = sleepStart + SLEEP_TIME - System.currentTimeMillis();
- interrupted = false;
- }
- try {
- Thread.sleep(sleepLeft);
- } catch (InterruptedException e) {
- interrupted = true;
- }
- } while (interrupted);
+ private void sendCommand(ClientPlayerEntity player, String command, int delay) {
+ skyblocker.scheduler.schedule(() ->
+ player.sendChatMessage(command), delay * BASE_DELAY
+ );
}
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java
index c6b5be9e..266006b4 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java
@@ -33,7 +33,7 @@ public class Fetchur extends ChatListener {
static {
answers = new HashMap<>();
answers.put("red and soft", new TranslatableText("block.minecraft.red_wool").getString());
- answers.put("yellow and see-through", new TranslatableText("block.minecraft.yellow_stained_glass").getString());
+ answers.put("yellow and see through", new TranslatableText("block.minecraft.yellow_stained_glass").getString());
answers.put("circular and sometimes moves", new TranslatableText("item.minecraft.compass").getString());
answers.put("expensive minerals", "Mithril");
answers.put("useful during celebrations", new TranslatableText("item.minecraft.firework_rocket").getString());
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java
index e95a7507..3e117955 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java
@@ -21,7 +21,6 @@ public class Puzzler extends ChatListener {
public boolean onMessage(String[] groups) {
int x = 181;
int z = 135;
- System.out.println(groups[1]);
for (char c : groups[1].toCharArray()) {
if (c == '▲') z++;
else if (c == '▼') z--;
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java
index ab24ff27..daad1d26 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java
@@ -1,8 +1,8 @@
package me.xmrvizzy.skyblocker.skyblock.item;
import com.google.gson.Gson;
-import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.item.ItemStack;
@@ -20,55 +20,104 @@ import java.net.URL;
import java.time.Month;
import java.util.List;
import java.util.Locale;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import java.util.zip.GZIPInputStream;
public class PriceInfoTooltip {
- private static JsonObject shopPricesJson;
+ private static JsonObject npcPricesJson;
private static JsonObject bazaarPricesJson;
- private static JsonObject auctionPricesJson;
- private static JsonObject lbAuctionPricesJson;
+ private static JsonObject avgPricesJson;
+ private static JsonObject lowestPricesJson;
private static JsonObject isMuseumJson;
- public static void onInjectTooltip(ItemStack stack, TooltipContext context, List<Text> list) {
+ public static void onInjectTooltip(ItemStack stack, TooltipContext context, List<Text> lines) {
+ int count = stack.getCount();
String name = getInternalNameFromNBT(stack);
String timestamp = getTimestamp(stack);
- List<String> listString = list.stream()
+ List<String> listString = lines.stream()
.map(Text::getString)
.collect(Collectors.toList());
+
try {
- if (!listString.contains("NPC Price") && shopPricesJson != null && shopPricesJson.has(name)) {
- JsonElement getPrice = shopPricesJson.get(name);
- list.add(new LiteralText(String.format("%-23s", "NPC Price:")).formatted(Formatting.YELLOW).append(getCoinsMessage(getPrice.getAsDouble())));
+ if (SkyblockerConfig.get().general.itemTooltip.enableNPCPrice
+ && !listString.contains("NPC Price") && npcPricesJson != null && npcPricesJson.has(name)) {
+
+ lines.add(new LiteralText(String.format("%-21s", "NPC Price:"))
+ .formatted(Formatting.YELLOW)
+ .append(getCoinsMessage(npcPricesJson.get(name).getAsDouble(), count)));
}
- if ((!listString.contains("Bazaar buy Price") || !listString.contains("Bazaar sell Price")) && bazaarPricesJson != null && bazaarPricesJson.has(name)) {
- JsonObject getItem = bazaarPricesJson.getAsJsonObject(name);
- list.add(new LiteralText(String.format("%-19s", "Bazaar buy Price:")).formatted(Formatting.GOLD).append(getCoinsMessage(getItem.get("buyPrice").getAsDouble())));
- list.add(new LiteralText(String.format("%-20s", "Bazaar sell Price:")).formatted(Formatting.GOLD).append(getCoinsMessage(getItem.get("sellPrice").getAsDouble())));
- } else if ((!listString.contains("Avg. BIN Price") && auctionPricesJson != null && auctionPricesJson.has(name)) || (!listString.contains("Lowest BIN Price") && lbAuctionPricesJson != null && lbAuctionPricesJson.has(name))) {
- if (!listString.contains("Lowest BIN Price") && lbAuctionPricesJson != null && lbAuctionPricesJson.has(name)) {
- JsonElement getPrice = lbAuctionPricesJson.get(name);
- list.add(new LiteralText(String.format("%-21s", "Lowest BIN Price:")).formatted(Formatting.GOLD).append(getCoinsMessage(getPrice.getAsDouble())));
+
+ if ((!listString.contains("Avg. BIN Price") && avgPricesJson != null && avgPricesJson.has(name))
+ || (!listString.contains("Lowest BIN Price") && lowestPricesJson != null && lowestPricesJson.has(name))) {
+
+ if (SkyblockerConfig.get().general.itemTooltip.enableLowestBIN) {
+ lines.add(new LiteralText(String.format("%-19s", "Lowest BIN Price:"))
+ .formatted(Formatting.GOLD)
+ .append(getCoinsMessage(lowestPricesJson.get(name).getAsDouble(), count)));
}
- if (!listString.contains("Avg. BIN Price") && auctionPricesJson != null && auctionPricesJson.has(name)) {
- JsonElement getPrice = auctionPricesJson.get(name);
- list.add(new LiteralText(String.format("%-22s", "Avg. BIN Price:")).formatted(Formatting.GOLD).append(getCoinsMessage(getPrice.getAsDouble())));
+
+ // Change format from Skytils to Moulberry's for Avg. BIN
+ if (name.contains("PET-")) {
+ name = name.replace("PET-", "")
+ .replace("0", "COMMON")
+ .replace("1", "UNCOMMON")
+ .replace("2", "RARE")
+ .replace("3", "EPIC")
+ .replace("4", "LEGENDARY")
+ .replace("5", "MYTHIC")
+ .replace("-", ";");
+ } else if (name.contains("ENCHANTED_BOOK-")) {
+ name = name.replace("ENCHANTED_BOOK-", "").replace("-", ";");
+ } else {
+ name = name.replace(":", "-");
+ }
+
+ // has(name) check because Skytils keeps old data but Moulberry not
+ if (SkyblockerConfig.get().general.itemTooltip.enableAvgBIN && avgPricesJson.has(name)) {
+ lines.add(new LiteralText(String.format("%-21s", "Avg. BIN Price:"))
+ .formatted(Formatting.GOLD)
+ .append(getCoinsMessage(avgPricesJson.get(name).getAsDouble(), count)));
}
+ } else if (SkyblockerConfig.get().general.itemTooltip.enableBazaarPrice
+ && (!listString.contains("Bazaar buy Price") || !listString.contains("Bazaar sell Price"))
+ && bazaarPricesJson != null && bazaarPricesJson.has(name)) {
+
+ JsonObject getItem = bazaarPricesJson.getAsJsonObject(name);
+ lines.add(new LiteralText(String.format("%-18s", "Bazaar buy Price:"))
+ .formatted(Formatting.GOLD)
+ .append(getCoinsMessage(getItem.get("buyPrice").getAsDouble(), count)));
+ lines.add(new LiteralText(String.format("%-19s", "Bazaar sell Price:"))
+ .formatted(Formatting.GOLD)
+ .append(getCoinsMessage(getItem.get("sellPrice").getAsDouble(), count)));
}
- if (!listString.contains("Museum") && isMuseumJson != null && isMuseumJson.has(name)) {
+ if (SkyblockerConfig.get().general.itemTooltip.enableMuseumDate
+ && !listString.contains("Museum") && isMuseumJson != null && isMuseumJson.has(name)) {
+
String itemCategory = isMuseumJson.get(name).toString().replaceAll("\"", "");
String format = switch (itemCategory) {
- case "Weapons" -> "%-19s";
- case "Armor" -> "%-20s";
- default -> "%-21s";
+ case "Weapons" -> "%-18s";
+ case "Armor" -> "%-19s";
+ default -> "%-20s";
};
- list.add(new LiteralText(String.format(format, "Museum: (" + itemCategory + ")")).formatted(Formatting.LIGHT_PURPLE).append(new LiteralText(timestamp != null ? timestamp : "").formatted(Formatting.RED)));
- } else if (!listString.contains("Obtained") && timestamp != null) {
- list.add(new LiteralText(String.format("%-23s", "Obtained: ")).formatted(Formatting.LIGHT_PURPLE).append(new LiteralText(timestamp).formatted(Formatting.RED)));
+
+ lines.add(new LiteralText(String.format(format, "Museum: (" + itemCategory + ")"))
+ .formatted(Formatting.LIGHT_PURPLE)
+ .append(new LiteralText(timestamp != null ? timestamp : "").formatted(Formatting.RED)));
+ } else if (!listString.contains("Obtained") && timestamp != null
+ && SkyblockerConfig.get().general.itemTooltip.enableMuseumDate) {
+
+ lines.add(new LiteralText(String.format("%-22s", "Obtained: "))
+ .formatted(Formatting.LIGHT_PURPLE)
+ .append(new LiteralText(timestamp).formatted(Formatting.RED)));
}
} catch (Exception e) {
- assert MinecraftClient.getInstance().player != null;
+ if (MinecraftClient.getInstance().player == null) {
+ throw new RuntimeException("[Skyblocker] client.player cannot be null!");
+ }
MinecraftClient.getInstance().player.sendMessage(new LiteralText(e.toString()), false);
}
@@ -101,15 +150,16 @@ public class PriceInfoTooltip {
NbtCompound ea = tag.getCompound("ExtraAttributes");
if (ea.contains("id", 8)) {
- internalName = ea.getString("id").replaceAll(":", "-");
+ internalName = ea.getString("id");
} else {
return null;
}
+
if ("ENCHANTED_BOOK".equals(internalName)) {
NbtCompound enchants = ea.getCompound("enchantments");
for (String enchName : enchants.getKeys()) {
- internalName = enchName.toUpperCase() + ";" + enchants.getInt(enchName);
+ internalName += "-" + enchName.toUpperCase() + "-" + enchants.getInt(enchName);
break;
}
}
@@ -117,20 +167,42 @@ public class PriceInfoTooltip {
return internalName;
}
- private static Text getCoinsMessage(double price) {
- String priceString = String.format(Locale.ENGLISH, "%1$,.0f", price);
- return new LiteralText(priceString + " Coins").formatted(Formatting.DARK_AQUA);
+ private static Text getCoinsMessage(double price, int count) {
+ if (count == 1) {
+ String priceString = String.format(Locale.ENGLISH, "%1$,.0f", price);
+ return new LiteralText(priceString + " Coins").formatted(Formatting.DARK_AQUA);
+ } else {
+ String priceString = String.format(Locale.ENGLISH, "%1$,.0f", price * count);
+ LiteralText priceText = (LiteralText) new LiteralText(priceString + " Coins ").formatted(Formatting.DARK_AQUA);
+ priceString = String.format(Locale.ENGLISH, "%1$,.0f", price);
+ LiteralText priceText2 = (LiteralText) new LiteralText( "(" + priceString + " each)").formatted(Formatting.GRAY);
+ return priceText.append(priceText2);
+ }
}
+ public static boolean firstRun = true;
public static void init() {
- new Thread(PriceInfoTooltip::downloadPrices).start();
- new Thread(PriceInfoTooltip::downloadLBPrices).start();
- new Thread(PriceInfoTooltip::downloadBazaarPrices).start();
- new Thread(PriceInfoTooltip::downloadShopPrices).start();
- new Thread(PriceInfoTooltip::downloadIsMuseum).start();
+ TimerTask repeatedTask = new TimerTask() {
+ public void run() {
+ if (SkyblockerConfig.get().general.itemTooltip.enableAvgBIN || PriceInfoTooltip.firstRun)
+ CompletableFuture.runAsync(PriceInfoTooltip::downloadAvgPrices);
+ if (SkyblockerConfig.get().general.itemTooltip.enableLowestBIN || PriceInfoTooltip.firstRun)
+ CompletableFuture.runAsync(PriceInfoTooltip::downloadLowestPrices);
+ if (SkyblockerConfig.get().general.itemTooltip.enableBazaarPrice || PriceInfoTooltip.firstRun)
+ CompletableFuture.runAsync(PriceInfoTooltip::downloadBazaarPrices);
+ if (SkyblockerConfig.get().general.itemTooltip.enableNPCPrice || PriceInfoTooltip.firstRun)
+ CompletableFuture.runAsync(PriceInfoTooltip::downloadNPCPrices);
+ if (SkyblockerConfig.get().general.itemTooltip.enableMuseumDate || PriceInfoTooltip.firstRun)
+ CompletableFuture.runAsync(PriceInfoTooltip::downloadIsMuseum);
+ }
+ };
+
+ firstRun = false;
+ Timer timer = new Timer("PriceInfoDownloader");
+ timer.scheduleAtFixedRate(repeatedTask, 0L, 1000L * 60L);
}
- private static void downloadPrices() {
+ private static void downloadAvgPrices() {
JsonObject result = null;
try {
URL apiAddr = new URL("https://moulberry.codes/auction_averages_lbin/3day.json.gz");
@@ -144,7 +216,7 @@ public class PriceInfoTooltip {
} catch (IOException e) {
LogManager.getLogger(PriceInfoTooltip.class.getName()).warn("[Skyblocker] Failed to download auction item prices!", e);
}
- auctionPricesJson = result;
+ avgPricesJson = result;
}
private static void downloadBazaarPrices() {
@@ -159,7 +231,7 @@ public class PriceInfoTooltip {
bazaarPricesJson = result;
}
- private static void downloadLBPrices() {
+ private static void downloadLowestPrices() {
JsonObject result = null;
try {
URL apiAddr = new URL("https://sbe-stole-skytils.design/api/auctions/lowestbins");
@@ -168,10 +240,10 @@ public class PriceInfoTooltip {
} catch (IOException e) {
LogManager.getLogger(PriceInfoTooltip.class.getName()).warn("[Skyblocker] Failed to download lb item prices!", e);
}
- lbAuctionPricesJson = result;
+ lowestPricesJson = result;
}
- private static void downloadShopPrices() {
+ private static void downloadNPCPrices() {
JsonObject result = null;
try {
URL apiAddr = new URL("https://hysky.de/api/npcprice");
@@ -180,7 +252,7 @@ public class PriceInfoTooltip {
} catch (IOException e) {
LogManager.getLogger(PriceInfoTooltip.class.getName()).warn("[Skyblocker] Failed to download shop item prices!", e);
}
- shopPricesJson = result;
+ npcPricesJson = result;
}
private static void downloadIsMuseum() {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java
index a0788126..4e5e7f32 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java
@@ -5,7 +5,6 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import me.xmrvizzy.skyblocker.utils.Utils;
-import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.option.KeyBinding;
@@ -49,7 +48,7 @@ public class WikiLookup {
}
public static void openWiki(Slot slot){
- if (Utils.isSkyblock){
+ if (Utils.isOnSkyblock){
id = getSkyblockId(slot);
try {
//Setting up a connection with the repo
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Events.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Events.java
new file mode 100644
index 00000000..e3aa4da4
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Events.java
@@ -0,0 +1,34 @@
+package me.xmrvizzy.skyblocker.utils;
+
+import me.xmrvizzy.skyblocker.SkyblockerMod;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.text.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Events {
+ public static MinecraftClient client = MinecraftClient.getInstance();
+ public static Logger logger = LoggerFactory.getLogger(SkyblockerMod.NAMESPACE);
+
+ public static void onSkyblockJoin(){
+ Utils.isOnSkyblock = true;
+ logger.info("Joined Skyblock");
+ if (UpdateChecker.shouldUpdate()){
+ TranslatableText linkMessage = new TranslatableText("skyblocker.update.update_message");
+ TranslatableText linkMessageEnding = new TranslatableText("skyblocker.update.update_message_end");
+ TranslatableText link = new TranslatableText("skyblocker.update.update_link");
+ TranslatableText hoverText = new TranslatableText("skyblocker.update.hover_text");
+ linkMessage.append(link.styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://modrinth.com/mod/skyblocker-liap/versions")).withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hoverText)))).append(linkMessageEnding);
+
+ client.player.sendMessage(linkMessage, false);
+ }
+ }
+
+ public static void onSkyblockDisconnect(){
+ logger.info("Disconnected from Skyblock");
+ SkyblockerMod.getInstance().discordRPCManager.stop();
+ Utils.isOnSkyblock = false;
+ Utils.isInDungeons = false;
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java
new file mode 100644
index 00000000..0fdf4892
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java
@@ -0,0 +1,60 @@
+package me.xmrvizzy.skyblocker.utils;
+
+import java.util.PriorityQueue;
+
+public class Scheduler {
+ private int currentTick;
+ private final PriorityQueue<ScheduledTask> tasks;
+
+ public Scheduler() {
+ currentTick = 0;
+ tasks = new PriorityQueue<>();
+ }
+
+ public void schedule(Runnable task, int delay) {
+ assert delay > 0;
+ ScheduledTask tmp = new ScheduledTask(currentTick + delay, task);
+ tasks.add(tmp);
+ }
+
+ public void scheduleCyclic(Runnable task, int period) {
+ new CyclicTask(task, period).run();
+ }
+
+ public void tick() {
+ currentTick += 1;
+ ScheduledTask task;
+ while ((task = tasks.peek()) != null && task.schedule <= currentTick) {
+ task.run();
+ tasks.poll();
+ }
+ }
+
+ private class CyclicTask implements Runnable {
+ private final Runnable inner;
+ private final int period;
+
+ public CyclicTask(Runnable task, int period) {
+ this.inner = task;
+ this.period = period;
+ }
+
+ @Override
+ public void run() {
+ schedule(this, period);
+ inner.run();
+ }
+ }
+
+ private record ScheduledTask(int schedule, Runnable inner) implements Comparable<ScheduledTask>, Runnable {
+ @Override
+ public int compareTo(ScheduledTask o) {
+ return schedule - o.schedule;
+ }
+
+ @Override
+ public void run() {
+ inner.run();
+ }
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/ToastBuilder.java b/src/main/java/me/xmrvizzy/skyblocker/utils/ToastBuilder.java
new file mode 100644
index 00000000..910c8a6c
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/ToastBuilder.java
@@ -0,0 +1,34 @@
+package me.xmrvizzy.skyblocker.utils;
+
+import com.mojang.blaze3d.systems.RenderSystem;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.render.GameRenderer;
+import net.minecraft.client.toast.Toast;
+import net.minecraft.client.toast.ToastManager;
+import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.text.Text;
+
+@Environment(value= EnvType.CLIENT)
+public class ToastBuilder implements Toast {
+ private final Text title;
+ private final Text description;
+
+ public ToastBuilder(Text title, Text description) {
+ this.title = title;
+ this.description = description;
+ }
+
+ @Override
+ public Toast.Visibility draw(MatrixStack matrices, ToastManager manager, long startTime) {
+ RenderSystem.setShader(GameRenderer::getPositionTexShader);
+ RenderSystem.setShaderTexture(0, TEXTURE);
+ RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
+
+ manager.drawTexture(matrices, 0, 0, 0, 0, this.getWidth(), this.getHeight());
+ manager.getClient().textRenderer.draw(matrices, title, 7.0f, 7.0f, -11534256);
+ manager.getClient().textRenderer.draw(matrices, description, 7.0f, 18.0f, -16777216);
+ return startTime >= 3000L ? Toast.Visibility.HIDE : Toast.Visibility.SHOW;
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java b/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java
new file mode 100644
index 00000000..fd43d8e3
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java
@@ -0,0 +1,55 @@
+package me.xmrvizzy.skyblocker.utils;
+
+import com.google.gson.*;
+import me.xmrvizzy.skyblocker.SkyblockerMod;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import net.fabricmc.loader.api.FabricLoader;
+import org.spongepowered.asm.util.VersionNumber;
+
+import javax.net.ssl.HttpsURLConnection;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class UpdateChecker {
+ public static boolean shouldUpdate = false;
+ public static Pattern pattern = Pattern.compile("v(\\d+)\\.(\\d+)\\.(\\d+)");
+ public static Pattern localPattern = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)");
+ public static Matcher matcher;
+ public static VersionNumber localVersion = null;
+ public static VersionNumber latestVersion = null;
+ public static boolean shouldUpdate(){
+ if (SkyblockerConfig.get().general.enableUpdateNotification){
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try{
+ URL url = new URL("https://api.modrinth.com/v2/project/skyblocker-liap/version");
+
+ InputStreamReader reader = new InputStreamReader(url.openStream());
+ JsonObject versionJson = new Gson().fromJson(reader, JsonElement.class).getAsJsonArray().get(0).getAsJsonObject();
+ matcher = pattern.matcher(versionJson.get("version_number").getAsString());
+ if (matcher.find()){
+ latestVersion = VersionNumber.parse(matcher.group(1) + "." + matcher.group(2) + "." + matcher.group(3));
+ }
+ matcher = localPattern.matcher(FabricLoader.getInstance().getModContainer(SkyblockerMod.NAMESPACE).get().getMetadata().getVersion().getFriendlyString());
+ if (matcher.find()){
+ localVersion = VersionNumber.parse(matcher.group(1) + "." + matcher.group(2) + "." + matcher.group(3));
+ }
+ if (localVersion != null && latestVersion != null)
+ if (localVersion.compareTo(latestVersion) < 0) shouldUpdate = true;
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }).start();
+ }
+ return shouldUpdate;
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java
index a4736242..21c30ada 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java
@@ -1,7 +1,5 @@
package me.xmrvizzy.skyblocker.utils;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip;
import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback;
import net.minecraft.client.MinecraftClient;
@@ -12,49 +10,41 @@ import net.minecraft.scoreboard.Team;
import net.minecraft.util.Formatting;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import java.util.stream.Collectors;
public class Utils {
- public static boolean isSkyblock = false;
- public static boolean isDungeons = false;
+ public static boolean isOnSkyblock = false;
+ public static boolean isInDungeons = false;
public static boolean isInjected = false;
public static void sbChecker() {
- List<String> sidebar = getSidebar();
- if (sidebar == null) {
- isSkyblock = false;
- isDungeons = false;
+ MinecraftClient client = MinecraftClient.getInstance();
+ List<String> sidebar;
+ if (client.world == null || client.isInSingleplayer() || (sidebar = getSidebar()) == null) {
+ isOnSkyblock = false;
+ isInDungeons = false;
return;
}
String string = sidebar.toString();
if (sidebar.isEmpty()) return;
- if (sidebar.get(sidebar.size() - 1).equals("www.hypixel.net")) {
- if (sidebar.get(0).contains("SKYBLOCK")){
- if(!isInjected){
- isInjected = true;
- ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip);
- }
- isSkyblock = true;
-
+ if (sidebar.get(0).contains("SKYBLOCK") && !isOnSkyblock) {
+ if (!isInjected) {
+ isInjected = true;
+ ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip);
}
- else isSkyblock = false;
+ Events.onSkyblockJoin();
- isDungeons = isSkyblock && string.contains("The Catacombs");
-
- } else {
- isSkyblock = false;
- isDungeons = false;
}
+ if (!sidebar.get(0).contains("SKYBLOCK") && isOnSkyblock) Events.onSkyblockDisconnect();
+ isInDungeons = isOnSkyblock && string.contains("The Catacombs");
}
public static String getLocation() {
String location = null;
List<String> sidebarLines = getSidebar();
- try{
+ try {
assert sidebarLines != null;
for (String sidebarLine : sidebarLines) {
if (sidebarLine.contains("⏣")) location = sidebarLine;
@@ -66,12 +56,13 @@ public class Utils {
}
return location;
}
+
public static double getPurse() {
String purseString = null;
double purse = 0;
List<String> sidebarLines = getSidebar();
- try{
+ try {
assert sidebarLines != null;
for (String sidebarLine : sidebarLines) {
if (sidebarLine.contains("Piggy:")) purseString = sidebarLine;
@@ -85,16 +76,17 @@ public class Utils {
}
return purse;
}
+
public static int getBits() {
int bits = 0;
String bitsString = null;
List<String> sidebarLines = getSidebar();
- try{
+ try {
assert sidebarLines != null;
for (String sidebarLine : sidebarLines) {
if (sidebarLine.contains("Bits")) bitsString = sidebarLine;
}
- if (bitsString !=null) {
+ if (bitsString != null) {
bits = Integer.parseInt(bitsString.replaceAll("[^0-9.]", "").strip());
}
} catch (IndexOutOfBoundsException e) {
diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json
index 4e7d88bb..52a7b441 100644
--- a/src/main/resources/assets/skyblocker/lang/en_us.json
+++ b/src/main/resources/assets/skyblocker/lang/en_us.json
@@ -10,6 +10,12 @@
"text.autoconfig.skyblocker.option.general.bars.enableBars": "Enable Bars",
"text.autoconfig.skyblocker.option.general.quicknav": "Quicknav",
"text.autoconfig.skyblocker.option.general.quicknav.enableQuicknav": "Enable Quicknav",
+ "text.autoconfig.skyblocker.option.general.itemTooltip": "Item Tooltip",
+ "text.autoconfig.skyblocker.option.general.itemTooltip.enableNPCPrice": "Enable NPC Price",
+ "text.autoconfig.skyblocker.option.general.itemTooltip.enableAvgBIN": "Enable Avg. BIN Price",
+ "text.autoconfig.skyblocker.option.general.itemTooltip.enableLowestBIN": "Enable Lowest BIN Price",
+ "text.autoconfig.skyblocker.option.general.itemTooltip.enableBazaarPrice": "Enable Bazaar buy/sell Price",
+ "text.autoconfig.skyblocker.option.general.itemTooltip.enableMuseumDate": "Enable Museum & Date",
"text.autoconfig.skyblocker.category.richPresence": "Discord Rich Presence",
"text.autoconfig.skyblocker.option.richPresence.info": "Skyblock Info",
@@ -43,5 +49,11 @@
"text.autoconfig.skyblocker.option.messages.hideAOTE": "Hide AOTE Messages",
"text.autoconfig.skyblocker.option.messages.hideImplosion": "Hide Implosion Message",
"text.autoconfig.skyblocker.option.messages.hideMoltenWave": "Hide Molten Wave Message",
- "text.autoconfig.skyblocker.option.messages.hideAds": "Hide Ads From Public Chat"
+ "text.autoconfig.skyblocker.option.messages.hideAds": "Hide Ads From Public Chat",
+
+ "skyblocker.update.update_message": "§b[§6Skyblocker§b] §2There is a new version available!",
+ "skyblocker.update.update_link": " §2§nClick here§r",
+ "skyblocker.update.update_message_end" : " §ato find out about latest features.",
+ "skyblocker.update.hover_text": "Open Modrinth",
+ "text.autoconfig.skyblocker.option.general.enableUpdateNotification": "Update Notification"
} \ No newline at end of file