From 5f05e7bf6c08880af5c3c00ae15c494ec5b87d9c Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Wed, 17 May 2023 23:11:15 -0400 Subject: Added docs to SkyblockerMod and Scheduler and refactored Scheduler --- .../me/xmrvizzy/skyblocker/utils/Scheduler.java | 45 ++++++++++++++++------ 1 file changed, 33 insertions(+), 12 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java index 16e5b023..efba4995 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java @@ -1,27 +1,46 @@ package me.xmrvizzy.skyblocker.utils; +import me.xmrvizzy.skyblocker.SkyblockerMod; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.PriorityQueue; +/** + * A scheduler for running tasks at a later time. Tasks will be run synchronously on the main client thread. Use the instance stored in {@link SkyblockerMod#scheduler}. Do not instantiate this class. + */ public class Scheduler { private static final Logger LOGGER = LoggerFactory.getLogger(Scheduler.class); private int currentTick; private final PriorityQueue tasks; + /** + * Do not instantiate this class. Use {@link SkyblockerMod#scheduler} instead. + */ + @SuppressWarnings("DeprecatedIsStillUsed") + @Deprecated public Scheduler() { currentTick = 0; tasks = new PriorityQueue<>(); } + /** + * Schedules a task to run after a delay. + * @param task the task to run + * @param delay the delay in ticks + */ public void schedule(Runnable task, int delay) { if (delay < 0) LOGGER.warn("Scheduled a task with negative delay"); - ScheduledTask tmp = new ScheduledTask(currentTick + delay, task); + ScheduledTask tmp = new ScheduledTask(task, currentTick + delay); tasks.add(tmp); } + /** + * Schedules a task to run every period ticks. + * @param task the task to run + * @param period the period in ticks + */ public void scheduleCyclic(Runnable task, int period) { if (period <= 0) LOGGER.error("Attempted to schedule a cyclic task with period lower than 1"); @@ -38,23 +57,25 @@ public class Scheduler { } } - 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; - } - + /** + * A task that runs every period ticks. More specifically, this task reschedules itself to run again after period ticks every time it runs. + * @param inner the task to run + * @param period the period in ticks + */ + private record CyclicTask(Runnable inner, int period) implements Runnable { @Override public void run() { - schedule(this, period); + SkyblockerMod.getInstance().scheduler.schedule(this, period); inner.run(); } } - private record ScheduledTask(int schedule, Runnable inner) implements Comparable, Runnable { + /** + * A task that runs at a specific tick, relative to {@link #currentTick}. + * @param inner the task to run + * @param schedule the tick to run at + */ + private record ScheduledTask(Runnable inner, int schedule) implements Comparable, Runnable { @Override public int compareTo(ScheduledTask o) { return schedule - o.schedule; -- cgit From 3391f91c985c9e34867b651cd3b0c34bd8950cc8 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Fri, 19 May 2023 23:19:10 -0400 Subject: Refactored Utils fields to use getters --- .../xmrvizzy/skyblocker/chat/ChatMessageListener.java | 2 +- .../xmrvizzy/skyblocker/discord/DiscordRPCManager.java | 2 +- .../skyblocker/gui/ContainerSolverManager.java | 2 +- .../skyblocker/mixin/ClientPlayerEntityMixin.java | 2 +- .../xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java | 2 +- .../me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java | 14 +++++++------- .../skyblocker/mixin/InventoryScreenMixin.java | 2 +- .../xmrvizzy/skyblocker/mixin/ItemRendererMixin.java | 2 +- .../me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java | 2 +- .../skyblocker/mixin/MinecraftClientMixin.java | 2 +- .../java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java | 2 +- .../xmrvizzy/skyblocker/skyblock/BackpackPreview.java | 2 +- .../skyblocker/skyblock/dungeon/DungeonBlaze.java | 2 +- .../xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java | 2 +- .../skyblocker/skyblock/item/PriceInfoTooltip.java | 4 ++-- .../xmrvizzy/skyblocker/skyblock/item/WikiLookup.java | 2 +- .../skyblocker/skyblock/quicknav/QuickNav.java | 2 +- src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java | 18 +++++++++++++++--- 18 files changed, 39 insertions(+), 27 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java index 9e6b5f64..f502a356 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java @@ -62,7 +62,7 @@ public interface ChatMessageListener { } // Register EVENT to ClientReceiveMessageEvents.ALLOW_GAME from fabric api ClientReceiveMessageEvents.ALLOW_GAME.register((message, overlay) -> { - if (!Utils.isOnSkyblock) { + if (!Utils.isOnSkyblock()) { return true; } ChatFilterResult result = EVENT.invoker().onMessage(message, message.getString()); diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java index 10b88ce8..4fa5265f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java @@ -37,7 +37,7 @@ public class DiscordRPCManager { SkyblockerConfig.get().richPresence.customMessage = "Playing Skyblock"; AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); } - if ((!Utils.isOnSkyblock || !SkyblockerConfig.get().richPresence.enableRichPresence) && DiscordIPC.isConnected()){ + if ((!Utils.isOnSkyblock() || !SkyblockerConfig.get().richPresence.enableRichPresence) && DiscordIPC.isConnected()){ DiscordIPC.stop(); LOGGER.info("Discord RPC stopped"); return; diff --git a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java index 8f3f7e2a..e4ff229d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java @@ -42,7 +42,7 @@ public class ContainerSolverManager extends DrawableHelper { public void init() { ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> { - if (Utils.isOnSkyblock && screen instanceof GenericContainerScreen genericContainerScreen) { + if (Utils.isOnSkyblock() && screen instanceof GenericContainerScreen genericContainerScreen) { ScreenEvents.afterRender(screen).register((screen1, matrices, mouseX, mouseY, delta) -> { matrices.push(); matrices.translate(((HandledScreenAccessor) genericContainerScreen).getX(), ((HandledScreenAccessor) genericContainerScreen).getY(), 300); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java index e59a3bfb..76c4e8ec 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java @@ -19,6 +19,6 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity @Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true) public void skyblocker$dropSelectedItem(boolean dropEntireStack, CallbackInfoReturnable cir) { - if (Utils.isOnSkyblock) 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/FarmlandBlockMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java index 74cc4b1c..761f8a68 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java @@ -22,7 +22,7 @@ public abstract class FarmlandBlockMixin extends Block { @Inject(method = "getOutlineShape", at = @At("HEAD"), cancellable = true) public void skyblocker$onGetOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context, CallbackInfoReturnable cir) { - if (Utils.isOnSkyblock && SkyblockerConfig.get().general.hitbox.oldFarmlandHitbox) + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.hitbox.oldFarmlandHitbox) cir.setReturnValue(Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 16.0, 16.0)); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java index c137e6c8..e17795ab 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java @@ -50,7 +50,7 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "setOverlayMessage(Lnet/minecraft/text/Text;Z)V", at = @At("HEAD"), cancellable = true) private void skyblocker$onSetOverlayMessage(Text message, boolean tinted, CallbackInfo ci) { - if (!Utils.isOnSkyblock || !SkyblockerConfig.get().general.bars.enableBars) + if (!Utils.isOnSkyblock() || !SkyblockerConfig.get().general.bars.enableBars) return; String msg = message.getString(); String res = statusBarTracker.update(msg, SkyblockerConfig.get().messages.hideMana); @@ -63,7 +63,7 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "renderHotbar", at = @At("HEAD")) public void skyblocker$renderHotbar(float f, MatrixStack matrices, CallbackInfo ci) { - if (Utils.isOnSkyblock) { + if (Utils.isOnSkyblock()) { hotbarMatrices = matrices; hotbarSlotIndex = 0; } @@ -71,7 +71,7 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "renderHotbarItem", at = @At("HEAD")) public void skyblocker$renderHotbarItem(MatrixStack matrices, int i, int j, float f, PlayerEntity player, ItemStack stack, int seed, CallbackInfo ci) { - if (Utils.isOnSkyblock) { + if (Utils.isOnSkyblock()) { if (HotbarSlotLock.isLocked(hotbarSlotIndex)) { RenderSystem.setShaderTexture(0, SLOT_LOCK); DrawableHelper.drawTexture(hotbarMatrices, i, j, 0, 0, 16, 16); @@ -82,18 +82,18 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "renderExperienceBar", at = @At("HEAD"), cancellable = true) private void skyblocker$renderExperienceBar(MatrixStack matrices, int x, CallbackInfo ci) { - if (Utils.isOnSkyblock && 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 skyblocker$renderStatusBars(MatrixStack matrices, CallbackInfo ci) { - if (!Utils.isOnSkyblock) + if (!Utils.isOnSkyblock()) return; if (statusBars.render(matrices, scaledWidth, scaledHeight)) ci.cancel(); - if (Utils.isInDungeons && SkyblockerConfig.get().locations.dungeons.enableMap) + if (Utils.isInDungeons() && SkyblockerConfig.get().locations.dungeons.enableMap) DungeonMap.render(matrices); RenderSystem.setShaderTexture(0, GUI_ICONS_TEXTURE); @@ -101,7 +101,7 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true) private void skyblocker$renderMountHealth(MatrixStack matrices, CallbackInfo ci) { - if (Utils.isOnSkyblock && 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 8de390cc..64a1a4fe 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 abstract class InventoryScreenMixin { ) ) RecipeBookWidget skyblocker$constructor() { - if (Utils.isOnSkyblock && 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 b9ddc156..26bafc14 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java @@ -27,7 +27,7 @@ public abstract class ItemRendererMixin { @Inject(method = "renderGuiItemOverlay(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD")) public void skyblocker$renderItemBar(MatrixStack matrices, TextRenderer renderer, ItemStack stack, int x, int y, @Nullable String countLabel, CallbackInfo ci) { - if (Utils.isOnSkyblock && 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 c28a7096..505de202 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 skyblocker$onGetOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context, CallbackInfoReturnable cir) { - if (Utils.isOnSkyblock) { + 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 66ec5c15..0c1977fe 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java @@ -19,7 +19,7 @@ public abstract class MinecraftClientMixin { @Inject(method = "handleInputEvents", at = @At("HEAD")) public void skyblocker$handleInputEvents(CallbackInfo ci) { - if (Utils.isOnSkyblock) { + if (Utils.isOnSkyblock()) { HotbarSlotLock.handleInputEvents(player); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java index 7d54ccb0..9389b792 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java @@ -17,7 +17,7 @@ public abstract class ScreenMixin { public void skyblocker$renderTooltip(MatrixStack matrices, ItemStack itemStack, int x, int y, CallbackInfo ci) { Text stackName = itemStack.getName(); String strName = stackName.getString(); - if (Utils.isOnSkyblock && SkyblockerConfig.get().general.hideEmptyTooltips && strName.equals(" ")) { + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideEmptyTooltips && strName.equals(" ")) { ci.cancel(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java index a6dfe31d..4820bc0f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java @@ -51,7 +51,7 @@ public class BackpackPreview extends DrawableHelper { public static void tick() { Utils.sbChecker(); // force update isOnSkyblock to prevent crash on disconnect - if (Utils.isOnSkyblock) { + if (Utils.isOnSkyblock()) { // save all dirty storages saveStorage(); // update save dir based on uuid and sb profile 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 4554372b..219f4258 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java @@ -21,7 +21,7 @@ public class DungeonBlaze { public static void update() { ClientWorld world = MinecraftClient.getInstance().world; - if (world == null || !Utils.isInDungeons) return; + if (world == null || !Utils.isInDungeons()) return; if(!renderHooked){ WorldRenderEvents.END.register(DungeonBlaze::blazeRenderer); 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 42fcc36a..fdc39c42 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java @@ -27,7 +27,7 @@ public class Reparty extends ChatPatternListener { super("^(?:You are not currently in a party\\.|Party (?:Membe|Moderato)rs(?: \\(([0-9]+)\\)|:( .*)))$"); this.repartying = false; ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("rp").executes(context -> { - if (!Utils.isOnSkyblock || this.repartying || client.player == null) return 0; + if (!Utils.isOnSkyblock() || this.repartying || client.player == null) return 0; this.repartying = true; client.player.networkHandler.sendCommand("p list"); return 0; 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 d9263f9a..04f2b596 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java @@ -45,7 +45,7 @@ public class PriceInfoTooltip { private static final Map apiAddresses; public static void onInjectTooltip(ItemStack stack, TooltipContext context, List lines) { - if (!Utils.isOnSkyblock || client.player == null) return; + if (!Utils.isOnSkyblock() || client.player == null) return; String name = getInternalNameFromNBT(stack); if (name == null) return; @@ -295,7 +295,7 @@ public class PriceInfoTooltip { public static int minute = -1; public static void init() { skyblocker.scheduler.scheduleCyclic(() -> { - if (!Utils.isOnSkyblock && 0 < minute++) { + if (!Utils.isOnSkyblock() && 0 < minute++) { nullMsgSend = false; return; } 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 305720d0..d05e5cb8 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java @@ -42,7 +42,7 @@ public class WikiLookup { } public static void openWiki(Slot slot) { - if (Utils.isOnSkyblock) { + if (Utils.isOnSkyblock()) { id = getSkyblockId(slot); try { String wikiLink = ItemRegistry.getWikiLink(id); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java index 8ab49754..1d58435e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java @@ -19,7 +19,7 @@ public class QuickNav { public static void init() { ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> { - if (Utils.isOnSkyblock && SkyblockerConfig.get().quickNav.enableQuickNav && screen instanceof HandledScreen) { + if (Utils.isOnSkyblock() && SkyblockerConfig.get().quickNav.enableQuickNav && screen instanceof HandledScreen) { String screenTitle = screen.getTitle().getString().trim(); List buttons = QuickNav.init(screenTitle); for (QuickNavButton button : buttons) Screens.getButtons(screen).add(button); diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index 532de0dd..e1de7b6e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -15,9 +15,21 @@ import java.util.Collections; import java.util.List; public class Utils { - public static boolean isOnSkyblock = false; - public static boolean isInDungeons = false; - public static boolean isInjected = false; + private static boolean isOnSkyblock = false; + private static boolean isInDungeons = false; + private static boolean isInjected = false; + + public static boolean isOnSkyblock() { + return isOnSkyblock; + } + + public static boolean isInDungeons() { + return isInDungeons; + } + + public static boolean isInjected() { + return isInjected; + } public static void sbChecker() { MinecraftClient client = MinecraftClient.getInstance(); -- cgit From 5c8a90cb61f97f710513aac3cd880e04472024a8 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Fri, 19 May 2023 23:21:49 -0400 Subject: Added docs to Utils --- src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index e1de7b6e..028386ab 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -14,6 +14,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +/** + * Utility variables and methods for retrieving Skyblock related information. + */ public class Utils { private static boolean isOnSkyblock = false; private static boolean isInDungeons = false; -- cgit From 049f988c904e7bee85e4d0a03e2dbbcf0047d27e Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Mon, 22 May 2023 20:30:12 -0400 Subject: Add Livid Color --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 7 ++++ .../skyblocker/config/SkyblockerConfig.java | 2 + .../skyblocker/skyblock/dungeon/LividColor.java | 43 ++++++++++++++++++++++ .../skyblocker/skyblock/dungeon/Reparty.java | 11 +++--- .../skyblock/quicknav/QuickNavButton.java | 3 +- .../skyblocker/utils/MessageScheduler.java | 43 ++++++++++++++++++++++ .../me/xmrvizzy/skyblocker/utils/Scheduler.java | 13 ++++--- 7 files changed, 110 insertions(+), 12 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index 64c09a2f..2ab1b45e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -11,11 +11,13 @@ import me.xmrvizzy.skyblocker.skyblock.StatusBarTracker; import me.xmrvizzy.skyblocker.skyblock.api.RepositoryUpdate; import me.xmrvizzy.skyblocker.skyblock.api.StatsCommand; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze; +import me.xmrvizzy.skyblocker.skyblock.dungeon.LividColor; 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.skyblock.quicknav.QuickNav; +import me.xmrvizzy.skyblocker.utils.MessageScheduler; import me.xmrvizzy.skyblocker.utils.Scheduler; import me.xmrvizzy.skyblocker.utils.UpdateChecker; import me.xmrvizzy.skyblocker.utils.Utils; @@ -32,6 +34,7 @@ public class SkyblockerMod implements ClientModInitializer { @SuppressWarnings("deprecation") public final Scheduler scheduler = new Scheduler(); + public final MessageScheduler messageScheduler = new MessageScheduler(); public final ContainerSolverManager containerSolverManager = new ContainerSolverManager(); public final StatusBarTracker statusBarTracker = new StatusBarTracker(); @@ -66,20 +69,24 @@ public class SkyblockerMod implements ClientModInitializer { ChatMessageListener.init(); UpdateChecker.init(); DiscordRPCManager.init(); + LividColor.init(); FishingHelper.init(); containerSolverManager.init(); scheduler.scheduleCyclic(Utils::sbChecker, 20); scheduler.scheduleCyclic(DiscordRPCManager::update, 100); scheduler.scheduleCyclic(DungeonBlaze::update, 4); + scheduler.scheduleCyclic(LividColor::update, 10); scheduler.scheduleCyclic(BackpackPreview::tick, 50); scheduler.scheduleCyclic(DwarvenHud::update, 40); } /** * Ticks the scheduler. Called once at the end of every client tick through {@link ClientTickEvents#END_CLIENT_TICK}. + * * @param client the Minecraft client. */ public void tick(MinecraftClient client) { scheduler.tick(); + messageScheduler.tick(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 13f70137..65e5c392 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -269,6 +269,8 @@ public class SkyblockerConfig implements ConfigData { public boolean solveThreeWeirdos = true; public boolean blazesolver = true; public boolean solveTrivia = true; + public boolean lividColor = true; + public String lividColorText = "[color]"; @ConfigEntry.Gui.CollapsibleObject() public Terminals terminals = new Terminals(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java new file mode 100644 index 00000000..d05c8cb9 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java @@ -0,0 +1,43 @@ +package me.xmrvizzy.skyblocker.skyblock.dungeon; + +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; +import net.minecraft.client.MinecraftClient; +import net.minecraft.util.math.BlockPos; + +public class LividColor { + private static int tenTicks = 0; + + public static void init() { + ClientReceiveMessageEvents.ALLOW_GAME.register((message, overlay) -> { + if (SkyblockerConfig.get().locations.dungeons.lividColor && message.getString().equals("[BOSS] Livid: I respect you for making it to here, but I'll be your undoing.")) { + tenTicks = 8; + } + return true; + }); + } + + public static void update() { + MinecraftClient client = MinecraftClient.getInstance(); + if (tenTicks != 0) { + if (SkyblockerConfig.get().locations.dungeons.lividColor && Utils.isInDungeons() && client.world != null) { + if (tenTicks == 1) { + SkyblockerMod.getInstance().messageScheduler.sendMessageAfterCooldown(SkyblockerConfig.get().locations.dungeons.lividColorText.replace("[color]", "red")); + tenTicks = 0; + return; + } + String key = client.world.getBlockState(new BlockPos(5, 110, 42)).getBlock().getTranslationKey(); + if (key.startsWith("block.minecraft.") && key.endsWith("wool") && !key.endsWith("red_wool")) { + SkyblockerMod.getInstance().messageScheduler.sendMessageAfterCooldown(SkyblockerConfig.get().locations.dungeons.lividColorText.replace("[color]", key.substring(16, key.length() - 5))); + tenTicks = 0; + return; + } + tenTicks--; + } else { + tenTicks = 0; + } + } + } +} 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 fdc39c42..d6e799ab 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java @@ -29,7 +29,7 @@ public class Reparty extends ChatPatternListener { ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("rp").executes(context -> { if (!Utils.isOnSkyblock() || this.repartying || client.player == null) return 0; this.repartying = true; - client.player.networkHandler.sendCommand("p list"); + SkyblockerMod.getInstance().messageScheduler.sendMessageAfterCooldown("/p list"); return 0; }))); } @@ -63,16 +63,15 @@ public class Reparty extends ChatPatternListener { this.repartying = false; return; } - sendCommand(playerEntity, "p disband", 1); + sendCommand("p disband", 1); for (int i = 0; i < this.players.length; ++i) { String command = "p invite " + this.players[i]; - sendCommand(playerEntity, command, i + 2); + sendCommand(command, i + 2); } skyblocker.scheduler.schedule(() -> this.repartying = false, this.players.length + 2); } - private void sendCommand(ClientPlayerEntity player, String command, int delay) { - // skyblocker.scheduler.schedule(() -> player.sendChatMessage(command, Text.of(command)), delay * BASE_DELAY); - skyblocker.scheduler.schedule(() -> player.networkHandler.sendCommand(command), delay * BASE_DELAY); + private void sendCommand(String command, int delay) { + skyblocker.messageScheduler.queueMessage(command, delay * BASE_DELAY); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java index e31827ab..7269840a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java @@ -2,6 +2,7 @@ package me.xmrvizzy.skyblocker.skyblock.quicknav; import com.mojang.blaze3d.systems.RenderSystem; +import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.mixin.HandledScreenAccessor; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -57,7 +58,7 @@ public class QuickNavButton extends ClickableWidget { public void onClick(double mouseX, double mouseY) { if (!this.toggled) { this.toggled = true; - CLIENT.player.networkHandler.sendCommand(command.replace("/", "")); + SkyblockerMod.getInstance().messageScheduler.sendMessageAfterCooldown(command); // TODO : add null check with log error } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java new file mode 100644 index 00000000..85cc963d --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java @@ -0,0 +1,43 @@ +package me.xmrvizzy.skyblocker.utils; + +import net.minecraft.client.MinecraftClient; + +/** + * A scheduler for sending chat messages or commands. Use the instance in {@link me.xmrvizzy.skyblocker.SkyblockerMod#messageScheduler SkyblockerMod.messageScheduler}. Do not instantiate this class. + */ +@SuppressWarnings("deprecation") +public class MessageScheduler extends Scheduler { + private long lastMessage = 0; + + public void sendMessageAfterCooldown(String message) { + if (lastMessage + 200 < System.currentTimeMillis()) { + sendMessage(message); + lastMessage = System.currentTimeMillis(); + } else { + tasks.add(new ScheduledTask(() -> sendMessage(message), 0)); + } + } + + private void sendMessage(String message) { + if (MinecraftClient.getInstance().player != null) { + MinecraftClient.getInstance().inGameHud.getChatHud().addToMessageHistory(message); + if (message.startsWith("/")) { + MinecraftClient.getInstance().player.networkHandler.sendCommand(message.substring(1)); + } else { + MinecraftClient.getInstance().player.networkHandler.sendChatMessage(message); + } + } + } + + public void queueMessage(String message, int delay) { + tasks.add(new ScheduledTask(() -> sendMessage(message), delay)); + } + + @Override + protected void runTask(Runnable task) { + if (lastMessage + 200 < System.currentTimeMillis()) { + task.run(); + lastMessage = System.currentTimeMillis(); + } + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java index efba4995..09db3f93 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java @@ -12,7 +12,7 @@ import java.util.PriorityQueue; public class Scheduler { private static final Logger LOGGER = LoggerFactory.getLogger(Scheduler.class); private int currentTick; - private final PriorityQueue tasks; + protected final PriorityQueue tasks; /** * Do not instantiate this class. Use {@link SkyblockerMod#scheduler} instead. @@ -52,17 +52,20 @@ public class Scheduler { currentTick += 1; ScheduledTask task; while ((task = tasks.peek()) != null && task.schedule <= currentTick) { - tasks.poll(); - task.run(); + runTask(tasks.poll()); } } + protected void runTask(Runnable task){ + task.run(); + } + /** * A task that runs every period ticks. More specifically, this task reschedules itself to run again after period ticks every time it runs. * @param inner the task to run * @param period the period in ticks */ - private record CyclicTask(Runnable inner, int period) implements Runnable { + protected record CyclicTask(Runnable inner, int period) implements Runnable { @Override public void run() { SkyblockerMod.getInstance().scheduler.schedule(this, period); @@ -75,7 +78,7 @@ public class Scheduler { * @param inner the task to run * @param schedule the tick to run at */ - private record ScheduledTask(Runnable inner, int schedule) implements Comparable, Runnable { + protected record ScheduledTask(Runnable inner, int schedule) implements Comparable, Runnable { @Override public int compareTo(ScheduledTask o) { return schedule - o.schedule; -- cgit From 300fe03100274d0e4f75e1294d71542cd0cc8e0e Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Tue, 30 May 2023 11:23:46 -0400 Subject: Fix MessageScheduler removing and not sending message tasks during cooldown --- src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java | 6 ++++-- src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java | 7 ++++--- 2 files changed, 8 insertions(+), 5 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java index 85cc963d..8aff5517 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java @@ -14,7 +14,7 @@ public class MessageScheduler extends Scheduler { sendMessage(message); lastMessage = System.currentTimeMillis(); } else { - tasks.add(new ScheduledTask(() -> sendMessage(message), 0)); + queueMessage(message, 0); } } @@ -34,10 +34,12 @@ public class MessageScheduler extends Scheduler { } @Override - protected void runTask(Runnable task) { + protected boolean runTask(Runnable task) { if (lastMessage + 200 < System.currentTimeMillis()) { task.run(); lastMessage = System.currentTimeMillis(); + return true; } + return false; } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java index 09db3f93..73c15efc 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java @@ -51,13 +51,14 @@ public class Scheduler { public void tick() { currentTick += 1; ScheduledTask task; - while ((task = tasks.peek()) != null && task.schedule <= currentTick) { - runTask(tasks.poll()); + while ((task = tasks.peek()) != null && task.schedule <= currentTick && runTask(task)) { + tasks.poll(); } } - protected void runTask(Runnable task){ + protected boolean runTask(Runnable task) { task.run(); + return true; } /** -- cgit From d5bdb1ef2bf50084fb59029184224b84f0b99806 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Tue, 30 May 2023 11:35:48 -0400 Subject: Fix MessageScheduler not scheduling relative to current tick --- src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java | 2 +- src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java index 8aff5517..a46bb9f3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java @@ -30,7 +30,7 @@ public class MessageScheduler extends Scheduler { } public void queueMessage(String message, int delay) { - tasks.add(new ScheduledTask(() -> sendMessage(message), delay)); + schedule(() -> sendMessage(message), delay); } @Override diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java index 73c15efc..7313ec10 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java @@ -12,7 +12,7 @@ import java.util.PriorityQueue; public class Scheduler { private static final Logger LOGGER = LoggerFactory.getLogger(Scheduler.class); private int currentTick; - protected final PriorityQueue tasks; + private final PriorityQueue tasks; /** * Do not instantiate this class. Use {@link SkyblockerMod#scheduler} instead. -- cgit From 69e794ffcd06fe14f76f368b33d5af0e4bc60b3a Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Tue, 30 May 2023 11:43:13 -0400 Subject: Refactored schedulers and added docs --- .../skyblocker/utils/MessageScheduler.java | 22 +++++++++++++-- .../me/xmrvizzy/skyblocker/utils/Scheduler.java | 32 ++++++++++++++-------- 2 files changed, 41 insertions(+), 13 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java index a46bb9f3..ac6aa293 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java @@ -7,10 +7,22 @@ import net.minecraft.client.MinecraftClient; */ @SuppressWarnings("deprecation") public class MessageScheduler extends Scheduler { + /** + * The minimum delay that the server will accept between chat messages. + */ + private static final int MIN_DELAY = 200; + /** + * The timestamp of the last message send, + */ private long lastMessage = 0; + /** + * Sends a chat message or command after the minimum cooldown. Prefer this method to send messages or commands to the server. + * + * @param message the message to send + */ public void sendMessageAfterCooldown(String message) { - if (lastMessage + 200 < System.currentTimeMillis()) { + if (lastMessage + MIN_DELAY < System.currentTimeMillis()) { sendMessage(message); lastMessage = System.currentTimeMillis(); } else { @@ -29,13 +41,19 @@ public class MessageScheduler extends Scheduler { } } + /** + * Queues a chat message or command to send in {@code delay} ticks. Use this method to send messages or commands a set time in the future. The minimum cooldown is still respected. + * + * @param message the message to send + * @param delay the delay before sending the message in ticks + */ public void queueMessage(String message, int delay) { schedule(() -> sendMessage(message), delay); } @Override protected boolean runTask(Runnable task) { - if (lastMessage + 200 < System.currentTimeMillis()) { + if (lastMessage + MIN_DELAY < System.currentTimeMillis()) { task.run(); lastMessage = System.currentTimeMillis(); return true; diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java index 7313ec10..02162140 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java @@ -11,8 +11,8 @@ import java.util.PriorityQueue; */ public class Scheduler { private static final Logger LOGGER = LoggerFactory.getLogger(Scheduler.class); - private int currentTick; - private final PriorityQueue tasks; + private int currentTick = 0; + private final PriorityQueue tasks = new PriorityQueue<>(); /** * Do not instantiate this class. Use {@link SkyblockerMod#scheduler} instead. @@ -20,32 +20,34 @@ public class Scheduler { @SuppressWarnings("DeprecatedIsStillUsed") @Deprecated public Scheduler() { - currentTick = 0; - tasks = new PriorityQueue<>(); } /** * Schedules a task to run after a delay. - * @param task the task to run + * + * @param task the task to run * @param delay the delay in ticks */ public void schedule(Runnable task, int delay) { - if (delay < 0) + if (delay < 0) { LOGGER.warn("Scheduled a task with negative delay"); + } ScheduledTask tmp = new ScheduledTask(task, currentTick + delay); tasks.add(tmp); } /** * Schedules a task to run every period ticks. - * @param task the task to run + * + * @param task the task to run * @param period the period in ticks */ public void scheduleCyclic(Runnable task, int period) { - if (period <= 0) + if (period <= 0) { LOGGER.error("Attempted to schedule a cyclic task with period lower than 1"); - else + } else { new CyclicTask(task, period).run(); + } } public void tick() { @@ -56,6 +58,12 @@ public class Scheduler { } } + /** + * Runs the task if able. + * + * @param task the task to run + * @return {@code true} if the task is run, and {@link false} if task is not run. + */ protected boolean runTask(Runnable task) { task.run(); return true; @@ -63,7 +71,8 @@ public class Scheduler { /** * A task that runs every period ticks. More specifically, this task reschedules itself to run again after period ticks every time it runs. - * @param inner the task to run + * + * @param inner the task to run * @param period the period in ticks */ protected record CyclicTask(Runnable inner, int period) implements Runnable { @@ -76,7 +85,8 @@ public class Scheduler { /** * A task that runs at a specific tick, relative to {@link #currentTick}. - * @param inner the task to run + * + * @param inner the task to run * @param schedule the tick to run at */ protected record ScheduledTask(Runnable inner, int schedule) implements Comparable, Runnable { -- cgit From b28a20421348c3385022deeb3cb1ea0ea74928af Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Thu, 11 May 2023 01:54:39 -0400 Subject: 1.20 Port The game launches successfully without any crashes! --- gradle.properties | 8 +-- .../skyblocker/gui/ContainerSolverManager.java | 13 ++--- .../skyblocker/mixin/DrawContextMixin.java | 60 ++++++++++++++++++++++ .../skyblocker/mixin/HandledScreenMixin.java | 13 +++-- .../xmrvizzy/skyblocker/mixin/InGameHudMixin.java | 32 ++++++------ .../skyblocker/mixin/ItemRendererMixin.java | 60 ---------------------- .../skyblocker/mixin/PlayerListHudMixin.java | 8 +-- .../me/xmrvizzy/skyblocker/mixin/ScreenMixin.java | 24 --------- .../skyblocker/skyblock/BackpackPreview.java | 17 +++--- .../skyblocker/skyblock/FancyStatusBars.java | 37 ++++++------- .../skyblocker/skyblock/dungeon/DungeonMap.java | 8 ++- .../skyblock/dungeon/DungeonMapConfigScreen.java | 12 ++--- .../skyblocker/skyblock/dwarven/DwarvenHud.java | 32 ++++++------ .../skyblock/dwarven/DwarvenHudConfigScreen.java | 11 ++-- .../skyblock/itemlist/ItemListWidget.java | 24 ++++----- .../skyblock/itemlist/ResultButtonWidget.java | 27 ++++++---- .../skyblock/itemlist/SearchResultsWidget.java | 23 +++++---- .../skyblock/quicknav/QuickNavButton.java | 20 ++++---- .../skyblocker/skyblock/tabhud/screens/Screen.java | 5 +- .../skyblocker/skyblock/tabhud/widget/Widget.java | 37 ++++++------- .../tabhud/widget/component/Component.java | 5 +- .../widget/component/IcoFatTextComponent.java | 10 ++-- .../tabhud/widget/component/IcoTextComponent.java | 8 +-- .../widget/component/PlainTextComponent.java | 6 +-- .../tabhud/widget/component/PlayerComponent.java | 11 ++-- .../tabhud/widget/component/ProgressComponent.java | 15 +++--- .../tabhud/widget/component/TableComponent.java | 9 ++-- .../me/xmrvizzy/skyblocker/utils/ToastBuilder.java | 16 +++--- src/main/resources/fabric.mod.json | 4 +- src/main/resources/skyblocker.mixins.json | 6 +-- 30 files changed, 272 insertions(+), 289 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/gradle.properties b/gradle.properties index 64c5e5cd..7b8af977 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,19 +2,19 @@ org.gradle.jvmargs=-Xmx1G -Dfile.encoding=UTF-8 -Duser.language=en -Duser.countr # Fabric Properties (https://fabricmc.net/versions.html) ## 1.19.4 -minecraft_version=1.19.4 -yarn_mappings=1.19.4+build.2 +minecraft_version=1.20-pre1 +yarn_mappings=1.20-pre1+build.4 loader_version=0.14.19 #Fabric api ## 1.19.4 -fabric_api_version=0.81.1+1.19.4 +fabric_api_version=0.80.2+1.20 # Dependencies ## Cloth Api (https://www.curseforge.com/minecraft/mc-mods/cloth-config/files) clothconfig_version=10.0.96 ## Mod Menu (https://www.curseforge.com/minecraft/mc-mods/modmenu/files) -mod_menu_version=6.1.0-rc.4 +mod_menu_version=7.0.0-beta.2 ## REI (https://www.curseforge.com/minecraft/mc-mods/roughly-enough-items/files) rei_version=11.0.597 diff --git a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java index e4ff229d..354e7e3a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java @@ -8,7 +8,7 @@ import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.OrderTerminal; import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.StartsWithTerminal; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; @@ -24,7 +24,7 @@ import java.util.regex.Pattern; /** * Manager class for {@link ContainerSolver}s like terminal solvers and experiment solvers. To add a new gui solver, extend {@link ContainerSolver} and register it in {@link #ContainerSolverManager()}. */ -public class ContainerSolverManager extends DrawableHelper { +public class ContainerSolverManager { private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile(""); private final ContainerSolver[] solvers; private ContainerSolver currentSolver = null; @@ -43,10 +43,11 @@ public class ContainerSolverManager extends DrawableHelper { public void init() { ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> { if (Utils.isOnSkyblock() && screen instanceof GenericContainerScreen genericContainerScreen) { - ScreenEvents.afterRender(screen).register((screen1, matrices, mouseX, mouseY, delta) -> { + ScreenEvents.afterRender(screen).register((screen1, context, mouseX, mouseY, delta) -> { + MatrixStack matrices = context.getMatrices(); matrices.push(); matrices.translate(((HandledScreenAccessor) genericContainerScreen).getX(), ((HandledScreenAccessor) genericContainerScreen).getY(), 300); - onDraw(matrices, genericContainerScreen.getScreenHandler().slots.subList(0, genericContainerScreen.getScreenHandler().getRows() * 9)); + onDraw(context, genericContainerScreen.getScreenHandler().slots.subList(0, genericContainerScreen.getScreenHandler().getRows() * 9)); matrices.pop(); }); onSetScreen(genericContainerScreen); @@ -83,7 +84,7 @@ public class ContainerSolverManager extends DrawableHelper { highlights = null; } - public void onDraw(MatrixStack matrices, List slots) { + public void onDraw(DrawContext context, List slots) { if (currentSolver == null) return; if (highlights == null) @@ -93,7 +94,7 @@ public class ContainerSolverManager extends DrawableHelper { for (ColorHighlight highlight : highlights) { Slot slot = slots.get(highlight.slot()); int color = highlight.color(); - fillGradient(matrices, slot.x, slot.y, slot.x + 16, slot.y + 16, color, color); + context.fillGradient(slot.x, slot.y, slot.x + 16, slot.y + 16, color, color); } RenderSystem.colorMask(true, true, true, true); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java new file mode 100644 index 00000000..ccbeaca2 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java @@ -0,0 +1,60 @@ +package me.xmrvizzy.skyblocker.mixin; + +import java.awt.Color; +import java.util.regex.Pattern; + +import org.jetbrains.annotations.Nullable; +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 com.mojang.blaze3d.systems.RenderSystem; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.ItemUtils; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.util.math.ColorHelper; + +@Mixin(DrawContext.class) +public abstract class DrawContextMixin { + @Inject(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD")) + public void skyblocker$renderItemBar(TextRenderer textRenderer, ItemStack stack, int x, int y, @Nullable String countOverride, CallbackInfo ci) { + + if (Utils.isOnSkyblock() && SkyblockerConfig.get().locations.dwarvenMines.enableDrillFuel) { + if (!stack.isEmpty()) { + NbtCompound tag = stack.getNbt(); + if (tag != null && tag.contains("ExtraAttributes")) { + if (tag.getCompound("ExtraAttributes").contains("drill_fuel")) { + float current = 3000.0F; + float max = 3000.0F; + + for (String line : ItemUtils.getTooltipStrings(stack)) { + if (line.contains("Fuel: ")) { + String clear = Pattern.compile("[^0-9 /]").matcher(line).replaceAll("").trim(); + String[] split = clear.split("/"); + current = Integer.parseInt(split[0]); + max = Integer.parseInt(split[1]) * 1000; + break; + } + } + + DrawContext context = ((DrawContext) (Object) this); + + RenderSystem.disableDepthTest(); + float hue = Math.max(0.0F, 1.0F - (max - current) / max); + int width = Math.round(current / max * 13.0F); + Color color = Color.getHSBColor(hue / 3.0F, 1.0F, 1.0F); + context.fill(x + 2, y + 13, x + 15, y + 15, 0xFF000000); + context.fill(x + 2, y + 13, x + 2 + width, y + 14, ColorHelper.Argb.getArgb(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue())); + RenderSystem.enableDepthTest(); + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index 2d200a86..30aa1ed2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -3,9 +3,10 @@ package me.xmrvizzy.skyblocker.mixin; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.BackpackPreview; import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; import org.jetbrains.annotations.Nullable; @@ -36,12 +37,18 @@ public abstract class HandledScreenMixin extends Screen { } @Inject(at = @At("HEAD"), method = "drawMouseoverTooltip", cancellable = true) - public void skyblocker$drawMouseOverTooltip(MatrixStack matrices, int x, int y, CallbackInfo ci) { + public void skyblocker$drawMouseOverTooltip(DrawContext context, int x, int y, CallbackInfo ci) { + //Hide Empty Tooltips + Text stackName = focusedSlot.getStack().getName(); + String strName = stackName.getString(); + if(this.focusedSlot != null && Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideEmptyTooltips && strName.equals(" ")) ci.cancel(); + + //Backpack Preview String title = 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(); + if (BackpackPreview.renderPreview(context, 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 e17795ab..335737a1 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java @@ -1,6 +1,5 @@ package me.xmrvizzy.skyblocker.mixin; -import com.mojang.blaze3d.systems.RenderSystem; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.FancyStatusBars; @@ -10,13 +9,14 @@ import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMap; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.InGameHud; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.util.Identifier; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -26,7 +26,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Environment(EnvType.CLIENT) @Mixin(InGameHud.class) -public abstract class InGameHudMixin extends DrawableHelper { +public abstract class InGameHudMixin { + //@Shadow + //@Final + //private static Identifier ICONS = new Identifier("textures/gui/icons.png"); @Unique private static final Identifier SLOT_LOCK = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/slot_lock.png"); @Unique @@ -35,7 +38,7 @@ public abstract class InGameHudMixin extends DrawableHelper { @Unique private final FancyStatusBars statusBars = new FancyStatusBars(); @Unique - private MatrixStack hotbarMatrices; + private DrawContext hotbarContext; @Unique private int hotbarSlotIndex; @@ -62,45 +65,44 @@ public abstract class InGameHudMixin extends DrawableHelper { } @Inject(method = "renderHotbar", at = @At("HEAD")) - public void skyblocker$renderHotbar(float f, MatrixStack matrices, CallbackInfo ci) { + public void skyblocker$renderHotbar(float f, DrawContext context, CallbackInfo ci) { if (Utils.isOnSkyblock()) { - hotbarMatrices = matrices; + hotbarContext = context; hotbarSlotIndex = 0; } } @Inject(method = "renderHotbarItem", at = @At("HEAD")) - public void skyblocker$renderHotbarItem(MatrixStack matrices, int i, int j, float f, PlayerEntity player, ItemStack stack, int seed, CallbackInfo ci) { + public void skyblocker$renderHotbarItem(DrawContext context, int i, int j, float f, PlayerEntity player, ItemStack stack, int seed, CallbackInfo ci) { if (Utils.isOnSkyblock()) { if (HotbarSlotLock.isLocked(hotbarSlotIndex)) { - RenderSystem.setShaderTexture(0, SLOT_LOCK); - DrawableHelper.drawTexture(hotbarMatrices, i, j, 0, 0, 16, 16); + hotbarContext.drawTexture(SLOT_LOCK, i, j, 0, 0, 16, 16); } hotbarSlotIndex++; } } @Inject(method = "renderExperienceBar", at = @At("HEAD"), cancellable = true) - private void skyblocker$renderExperienceBar(MatrixStack matrices, int x, CallbackInfo ci) { + private void skyblocker$renderExperienceBar(DrawContext context, int x, CallbackInfo ci) { if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars) ci.cancel(); } @Inject(method = "renderStatusBars", at = @At("HEAD"), cancellable = true) - private void skyblocker$renderStatusBars(MatrixStack matrices, CallbackInfo ci) { + private void skyblocker$renderStatusBars(DrawContext context, CallbackInfo ci) { if (!Utils.isOnSkyblock()) return; - if (statusBars.render(matrices, scaledWidth, scaledHeight)) + if (statusBars.render(context, scaledWidth, scaledHeight)) ci.cancel(); if (Utils.isInDungeons() && SkyblockerConfig.get().locations.dungeons.enableMap) - DungeonMap.render(matrices); + DungeonMap.render(context.getMatrices()); - RenderSystem.setShaderTexture(0, GUI_ICONS_TEXTURE); + //RenderSystem.setShaderTexture(0, ICONS); } @Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true) - private void skyblocker$renderMountHealth(MatrixStack matrices, CallbackInfo ci) { + private void skyblocker$renderMountHealth(DrawContext context, CallbackInfo ci) { if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars) ci.cancel(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java deleted file mode 100644 index 26bafc14..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java +++ /dev/null @@ -1,60 +0,0 @@ -package me.xmrvizzy.skyblocker.mixin; - -import java.awt.Color; -import java.util.regex.Pattern; - -import org.jetbrains.annotations.Nullable; -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 com.mojang.blaze3d.systems.RenderSystem; - -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.utils.ItemUtils; -import me.xmrvizzy.skyblocker.utils.Utils; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.math.ColorHelper; - -@Mixin(ItemRenderer.class) -public abstract class ItemRendererMixin { - @Inject(method = "renderGuiItemOverlay(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD")) - public void skyblocker$renderItemBar(MatrixStack matrices, TextRenderer renderer, ItemStack stack, int x, int y, @Nullable String countLabel, CallbackInfo ci) { - - if (Utils.isOnSkyblock() && SkyblockerConfig.get().locations.dwarvenMines.enableDrillFuel) { - if (!stack.isEmpty()) { - NbtCompound tag = stack.getNbt(); - if (tag != null && tag.contains("ExtraAttributes")) { - if (tag.getCompound("ExtraAttributes").contains("drill_fuel")) { - float current = 3000.0F; - float max = 3000.0F; - - for (String line : ItemUtils.getTooltipStrings(stack)) { - if (line.contains("Fuel: ")) { - String clear = Pattern.compile("[^0-9 /]").matcher(line).replaceAll("").trim(); - String[] split = clear.split("/"); - current = Integer.parseInt(split[0]); - max = Integer.parseInt(split[1]) * 1000; - break; - } - } - - RenderSystem.disableDepthTest(); - float hue = Math.max(0.0F, 1.0F - (max - current) / max); - int width = Math.round(current / max * 13.0F); - Color color = Color.getHSBColor(hue / 3.0F, 1.0F, 1.0F); - DrawableHelper.fill(matrices, x + 2, y + 13, x + 15, y + 15, 0xFF000000); - DrawableHelper.fill(matrices, x + 2, y + 13, x + 2 + width, y + 14, ColorHelper.Argb.getArgb(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue())); - RenderSystem.enableDepthTest(); - } - } - } - } - } -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java index b5403ae2..ef65190f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java @@ -13,9 +13,9 @@ import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.PlayerListHud; import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.scoreboard.Scoreboard; import net.minecraft.scoreboard.ScoreboardObjective; import net.minecraft.text.Text; @@ -27,8 +27,8 @@ public class PlayerListHudMixin { @Shadow private Text footer; - @Inject(at = @At("HEAD"), method = "render(Lnet/minecraft/client/util/math/MatrixStack;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreboardObjective;)V", cancellable = true) - public void skyblocker$renderTabHud(MatrixStack ms, int scaledW, Scoreboard sb, ScoreboardObjective sbo, + @Inject(at = @At("HEAD"), method = "render(Lnet/minecraft/client/gui/DrawContext;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreboardObjective;)V", cancellable = true) + public void skyblocker$renderTabHud(DrawContext context, int scaledW, Scoreboard sb, ScoreboardObjective sbo, CallbackInfo info) { if (!Utils.isOnSkyblock() @@ -47,7 +47,7 @@ public class PlayerListHudMixin { int h = MinecraftClient.getInstance().getWindow().getScaledHeight(); try { Screen screen = Screen.getCorrect(w, h, footer); - screen.render(ms); + screen.render(context); info.cancel(); } catch (Exception e) { TabHud.LOGGER.error("Drawing default hud. Reason: Screen exception {}", e); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java deleted file mode 100644 index 9389b792..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java +++ /dev/null @@ -1,24 +0,0 @@ -package me.xmrvizzy.skyblocker.mixin; - -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.utils.Utils; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -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; - -@Mixin(Screen.class) -public abstract class ScreenMixin { - @Inject(at = @At("HEAD"), method = "renderTooltip(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/item/ItemStack;II)V", cancellable = true) - public void skyblocker$renderTooltip(MatrixStack matrices, ItemStack itemStack, int x, int y, CallbackInfo ci) { - Text stackName = itemStack.getName(); - String strName = stackName.getString(); - if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideEmptyTooltips && strName.equals(" ")) { - ci.cancel(); - } - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java index 4820bc0f..e35ef605 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java @@ -7,7 +7,7 @@ import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.network.PlayerListEntry; @@ -27,7 +27,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class BackpackPreview extends DrawableHelper { +public class BackpackPreview { 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]+)"); @@ -135,7 +135,7 @@ public class BackpackPreview extends DrawableHelper { } } - public static boolean renderPreview(MatrixStack matrices, int index, int mouseX, int mouseY) { + public static boolean renderPreview(DrawContext context, int index, int mouseX, int mouseY) { if (index >= 9 && index < 18) index -= 9; else if (index >= 27 && index < 45) index -= 18; else return false; @@ -149,12 +149,13 @@ public class BackpackPreview extends DrawableHelper { RenderSystem.disableDepthTest(); RenderSystem.setShaderTexture(0, TEXTURE); - BackpackPreview.drawTexture(matrices, x, y, 0, 0, 176, 7); + context.drawTexture(TEXTURE, x, y, 0, 0, 176, 7); for (int i = 0; i < rows; ++i) - BackpackPreview.drawTexture(matrices, x, y + i * 18 + 7, 0, 7, 176, 18); - BackpackPreview.drawTexture(matrices, x, y + rows * 18 + 7, 0, 25, 176, 7); + context.drawTexture(TEXTURE, x, y + i * 18 + 7, 0, 7, 176, 18); + context.drawTexture(TEXTURE, x, y + rows * 18 + 7, 0, 25, 176, 7); RenderSystem.enableDepthTest(); + MatrixStack matrices = context.getMatrices(); ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer(); TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; for (int i = 9; i < storage[index].size(); ++i) { @@ -162,8 +163,8 @@ public class BackpackPreview extends DrawableHelper { int itemY = y + (i - 9) / 9 * 18 + 8; matrices.push(); matrices.translate(0, 0, 200); - itemRenderer.renderInGui(matrices, storage[index].getStack(i), itemX, itemY); - itemRenderer.renderGuiItemOverlay(matrices, textRenderer, storage[index].getStack(i), itemX, itemY); + context.drawItem(storage[index].getStack(i), itemX, itemY); + context.drawItemInSlot(textRenderer, storage[index].getStack(i), itemX, itemY); matrices.pop(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java index 05b57410..6af06e6d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java @@ -1,15 +1,13 @@ package me.xmrvizzy.skyblocker.skyblock; -import com.mojang.blaze3d.systems.RenderSystem; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.DrawContext; import net.minecraft.util.Identifier; -public class FancyStatusBars extends DrawableHelper { +public class FancyStatusBars { private static final Identifier BARS = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/bars.png"); private final MinecraftClient client = MinecraftClient.getInstance(); @@ -39,7 +37,7 @@ public class FancyStatusBars extends DrawableHelper { return (100 * value) / max; } - public boolean render(MatrixStack matrices, int scaledWidth, int scaledHeight) { + public boolean render(DrawContext context, int scaledWidth, int scaledHeight) { var player = client.player; if (!SkyblockerConfig.get().general.bars.enableBars || player == null) return false; @@ -72,11 +70,10 @@ public class FancyStatusBars extends DrawableHelper { moveBar(i, configAnchorNum); } - RenderSystem.setShaderTexture(0, BARS); for (var bar : bars) - bar.draw(matrices); + bar.draw(context); for (var bar : bars) - bar.drawText(matrices); + bar.drawText(context); return true; } @@ -143,32 +140,32 @@ public class FancyStatusBars extends DrawableHelper { this.text = val; } - public void draw(MatrixStack matrices) { + public void draw(DrawContext context) { // Dont draw if anchorNum is outside of range if (anchorNum < 0 || anchorNum > 2) return; // Draw the icon for the bar - drawTexture(matrices, anchorsX[anchorNum] + offsetX, anchorsY[anchorNum], 0, v, 9, 9); + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX, anchorsY[anchorNum], 0, v, 9, 9); // Draw the background for the bar - drawTexture(matrices, anchorsX[anchorNum] + offsetX + 10, anchorsY[anchorNum], 10, v, 2, 9); + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10, anchorsY[anchorNum], 10, v, 2, 9); for (int i = 2; i < bar_width - 2; i += 58) - drawTexture(matrices, anchorsX[anchorNum] + offsetX + 10 + i, anchorsY[anchorNum], 12, v, Math.min(58, bar_width - 2 - i), 9); - drawTexture(matrices, anchorsX[anchorNum] + offsetX + 10 + bar_width - 2, anchorsY[anchorNum], 70, v, 2, 9); + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10 + i, anchorsY[anchorNum], 12, v, Math.min(58, bar_width - 2 - i), 9); + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10 + bar_width - 2, anchorsY[anchorNum], 70, v, 2, 9); // Draw the filled part of the bar for (int i = 0; i < fill.length; i++) { int fill_width = this.fill[i] * (bar_width - 2) / 100; if (fill_width >= 1) - drawTexture(matrices, anchorsX[anchorNum] + offsetX + 11, anchorsY[anchorNum], 72 + i*60, v, 1, 9); + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11, anchorsY[anchorNum], 72 + i*60, v, 1, 9); for (int j = 1; j < fill_width - 1; j += 58) - drawTexture(matrices, anchorsX[anchorNum] + offsetX + 11 + j, anchorsY[anchorNum], 73 + i*60, v, Math.min(58, fill_width - 1 - j), 9); + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + j, anchorsY[anchorNum], 73 + i*60, v, Math.min(58, fill_width - 1 - j), 9); if (fill_width == bar_width - 2) - drawTexture(matrices, anchorsX[anchorNum] + offsetX + 11 + fill_width - 1, anchorsY[anchorNum], 131 + i*60, v, 1, 9); + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + fill_width - 1, anchorsY[anchorNum], 131 + i*60, v, 1, 9); } } - public void drawText(MatrixStack matrices) { + public void drawText(DrawContext context) { // Dont draw if anchorNum is outside of range if (anchorNum < 0 || anchorNum > 2) return; @@ -179,10 +176,10 @@ public class FancyStatusBars extends DrawableHelper { final int[] offsets = new int[]{-1, 1}; for (int i : offsets) { - textRenderer.draw(matrices, text, (float) (x + i), (float) y, 0); - textRenderer.draw(matrices, text, (float) x, (float) (y + i), 0); + context.drawText(textRenderer, text, x + i, y, 0, false); + context.drawText(textRenderer, text, x, y + i, 0, false); } - textRenderer.draw(matrices, text, (float) x, (float) y, text_color); + context.drawText(textRenderer, text, x, y, text_color, false); } } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java index e5441b5c..2a97d0ee 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java @@ -2,14 +2,13 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; import org.apache.commons.lang3.StringUtils; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.brigadier.Command; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.render.MapRenderer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.util.math.MatrixStack; @@ -50,11 +49,10 @@ public class DungeonMap { } } - public static void renderHUDMap(MatrixStack matrices, int x, int y) { + public static void renderHUDMap(DrawContext context, int x, int y) { float scaling = SkyblockerConfig.get().locations.dungeons.mapScaling; int size = (int) (128 * scaling); - RenderSystem.setShaderTexture(0, MAP_BACKGROUND); - DrawableHelper.drawTexture(matrices, x, y, 0, 0, size, size, size, size); + context.drawTexture(MAP_BACKGROUND, x, y, 0, 0, size, size, size, size); } public static void init() { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java index 8fba6a7a..ffd7a8b6 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java @@ -5,8 +5,8 @@ import java.awt.Color; import me.shedaniel.autoconfig.AutoConfig; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.RenderUtils; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; public class DungeonMapConfigScreen extends Screen { @@ -19,11 +19,11 @@ public class DungeonMapConfigScreen extends Screen { } @Override - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { - super.render(matrices, mouseX, mouseY, delta); - renderBackground(matrices); - DungeonMap.renderHUDMap(matrices, hudX, hudY); - drawCenteredTextWithShadow(matrices, textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB()); + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + super.render(context, mouseX, mouseY, delta); + renderBackground(context); + DungeonMap.renderHUDMap(context, hudX, hudY); + context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB()); } @Override diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java index 15f9e58b..122f6c6c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java @@ -6,7 +6,7 @@ import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -49,35 +49,35 @@ public class DwarvenHud { return 1; }))))); - HudRenderCallback.EVENT.register((matrixStack, tickDelta) -> { + HudRenderCallback.EVENT.register((context, tickDelta) -> { if (!SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enabled || client.options.playerListKey.isPressed() || client.player == null || commissionList.isEmpty()) { return; } - render(matrixStack, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.x, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.y, commissionList); + render(context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.x, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.y, commissionList); }); } - public static void render(MatrixStack matrixStack, int hudX, int hudY, List commissions) { + public static void render(DrawContext context, int hudX, int hudY, List commissions) { switch(SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.style) { - case SIMPLE -> renderSimple(matrixStack, hudX, hudY, commissions); - case FANCY -> renderFancy(matrixStack, hudX, hudY, commissions); - case CLASSIC -> renderClassic(matrixStack, hudX, hudY, commissions); + case SIMPLE -> renderSimple(context, hudX, hudY, commissions); + case FANCY -> renderFancy(context, hudX, hudY, commissions); + case CLASSIC -> renderClassic(context, hudX, hudY, commissions); } } - public static void renderClassic(MatrixStack matrixStack, int hudX, int hudY, List commissions) { + public static void renderClassic(DrawContext context, int hudX, int hudY, List commissions) { if (SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground) { - DrawableHelper.fill(matrixStack, hudX, hudY, hudX + 200, hudY + (20 * commissions.size()), 0x64000000); + context.fill(hudX, hudY, hudX + 200, hudY + (20 * commissions.size()), 0x64000000); } int y = 0; for (Commission commission : commissions) { - client.textRenderer - .drawWithShadow(matrixStack, + context + .drawTextWithShadow(client.textRenderer, Text.literal(commission.commission + ": ") .styled(style -> style.withColor(Formatting.AQUA)) .append(Text.literal(commission.progression) @@ -87,18 +87,18 @@ public class DwarvenHud { } } - public static void renderSimple(MatrixStack matrixStack, int hudX, int hudY, List commissions) { + public static void renderSimple(DrawContext context, int hudX, int hudY, List commissions) { CommsWidget cw = new CommsWidget(commissions, false); cw.setX(hudX); cw.setY(hudY); - cw.render(matrixStack, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground); + cw.render(context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground); } - public static void renderFancy(MatrixStack matrixStack, int hudX, int hudY, List commissions) { + public static void renderFancy(DrawContext context, int hudX, int hudY, List commissions) { CommsWidget cw = new CommsWidget(commissions, true); cw.setX(hudX); cw.setY(hudY); - cw.render(matrixStack, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground); + cw.render(context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground); } public static void update() { @@ -121,4 +121,4 @@ public class DwarvenHud { // steamroller tactics to get visibility from outside classes (CommsWidget) public static record Commission(String commission, String progression){} -} +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java index 2d0ba892..f91ed921 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java @@ -3,6 +3,7 @@ package me.xmrvizzy.skyblocker.skyblock.dwarven; import me.shedaniel.autoconfig.AutoConfig; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.RenderUtils; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; @@ -19,11 +20,11 @@ public class DwarvenHudConfigScreen extends Screen { } @Override - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { - super.render(matrices, mouseX, mouseY, delta); - renderBackground(matrices); - DwarvenHud.render(matrices, hudX, hudY, List.of(new DwarvenHud.Commission("Test Commission 1", "1%"), new DwarvenHud.Commission("Test Commission 2", "2%"))); - drawCenteredTextWithShadow(matrices, textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB()); + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + super.render(context, mouseX, mouseY, delta); + renderBackground(context); + DwarvenHud.render(context, hudX, hudY, List.of(new DwarvenHud.Commission("Test Commission 1", "1%"), new DwarvenHud.Commission("Test Commission 2", "2%"))); + context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB()); } @Override diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java index d9acc75c..99715e29 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java @@ -5,12 +5,11 @@ import me.xmrvizzy.skyblocker.mixin.RecipeBookWidgetAccessor; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.Drawable; -import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.Selectable; import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.render.GameRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.screen.AbstractRecipeScreenHandler; import net.minecraft.text.Text; @@ -46,27 +45,26 @@ public class ItemListWidget extends RecipeBookWidget implements Drawable, Select } @Override - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { + public void render(DrawContext context, int mouseX, int mouseY, float delta) { if (this.isOpen()) { - matrices.push(); + MatrixStack matrices = context.getMatrices(); + matrices.push(); matrices.translate(0.0D, 0.0D, 100.0D); - RenderSystem.setShader(GameRenderer::getPositionTexProgram); - RenderSystem.setShaderTexture(0, TEXTURE); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); this.searchField = ((RecipeBookWidgetAccessor)this).getSearchField(); int i = (this.parentWidth - 147) / 2 - this.leftOffset; int j = (this.parentHeight - 166) / 2; - DrawableHelper.drawTexture(matrices, i, j, 1, 1, 147, 166); + context.drawTexture(TEXTURE, i, j, 1, 1, 147, 166); this.searchField = ((RecipeBookWidgetAccessor)this).getSearchField(); if (!ItemRegistry.filesImported && !this.searchField.isFocused() && this.searchField.getText().isEmpty()) { Text hintText = (Text.literal("Loading...")).formatted(Formatting.ITALIC).formatted(Formatting.GRAY); - drawTextWithShadow(matrices, this.client.textRenderer, hintText, i + 25, j + 14, -1); + context.drawTextWithShadow(this.client.textRenderer, hintText, i + 25, j + 14, -1); } else if (!this.searchField.isFocused() && this.searchField.getText().isEmpty()) { Text hintText = (Text.translatable("gui.recipebook.search_hint")).formatted(Formatting.ITALIC).formatted(Formatting.GRAY); - drawTextWithShadow(matrices, this.client.textRenderer, hintText, i + 25, j + 14, -1); + context.drawTextWithShadow(this.client.textRenderer, hintText, i + 25, j + 14, -1); } else { - this.searchField.render(matrices, mouseX, mouseY, delta); + this.searchField.render(context, mouseX, mouseY, delta); } if (ItemRegistry.filesImported){ if (results == null) { @@ -75,16 +73,16 @@ public class ItemListWidget extends RecipeBookWidget implements Drawable, Select this.results = new SearchResultsWidget(this.client, x, y); } this.updateSearchResult(); - this.results.render(matrices, mouseX, mouseY, delta); + this.results.render(context, mouseX, mouseY, delta); } matrices.pop(); } } @Override - public void drawTooltip(MatrixStack matrices, int x, int y, int mouseX, int mouseY) { + public void drawTooltip(DrawContext context, int x, int y, int mouseX, int mouseY) { if (this.isOpen() && ItemRegistry.filesImported && results != null) { - this.results.drawTooltip(matrices, mouseX, mouseY); + this.results.drawTooltip(context, mouseX, mouseY); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java index 41e5469d..8b0fe91d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java @@ -1,17 +1,21 @@ package me.xmrvizzy.skyblocker.skyblock.itemlist; import java.util.List; +import java.util.function.Function; +import java.util.ArrayList; +import com.google.common.collect.Lists; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.text.OrderedText; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -36,23 +40,26 @@ public class ResultButtonWidget extends ClickableWidget { } @Override - public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { + public void renderButton(DrawContext context, int mouseX, int mouseY, float delta) { MinecraftClient client = MinecraftClient.getInstance(); - RenderSystem.setShader(GameRenderer::getPositionTexProgram); - RenderSystem.setShaderTexture(0, BACKGROUND_TEXTURE); // this.drawTexture(matrices, this.x, this.y, 29, 206, this.width, this.height); - DrawableHelper.drawTexture(matrices, this.getX(), this.getY(), 29, 206, this.getWidth(), this.getHeight()); + context.drawTexture(BACKGROUND_TEXTURE, this.getX(), this.getY(), 29, 206, this.getWidth(), this.getHeight()); // client.getItemRenderer().renderInGui(this.itemStack, this.x + 4, this.y + 4); - client.getItemRenderer().renderInGui(matrices, this.itemStack, this.getX() + 4, this.getY() + 4); + context.drawItem(this.itemStack, this.getX() + 4, this.getY() + 4); // client.getItemRenderer().renderGuiItemOverlay(client.textRenderer, itemStack, this.x + 4, this.y + 4); - client.getItemRenderer().renderGuiItemOverlay(matrices, client.textRenderer, itemStack, this.getX() + 4, this.getY() + 4); + context.drawItemInSlot(client.textRenderer, itemStack, this.getX() + 4, this.getY() + 4); } - public void renderTooltip(MatrixStack matrices, int mouseX, int mouseY) { + public void renderTooltip(DrawContext context, int mouseX, int mouseY) { MinecraftClient client = MinecraftClient.getInstance(); - List tooltip = client.currentScreen.getTooltipFromItem(this.itemStack); + List tooltip = client.currentScreen.getTooltipFromItem(client, this.itemStack); + List orderedTooltip = new ArrayList<>(); + + for(int i = 0; i < tooltip.size(); i++) orderedTooltip.add(tooltip.get(i).asOrderedText()); + // TODO : add null check with log error - client.currentScreen.renderTooltip(matrices, tooltip, mouseX, mouseY); + client.currentScreen.setTooltip(orderedTooltip); + client.currentScreen.renderWithTooltip(context, mouseX, mouseY, mouseY); } @Override diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java index ce53112b..058495a2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java @@ -2,6 +2,8 @@ package me.xmrvizzy.skyblocker.skyblock.itemlist; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.Drawable; import net.minecraft.client.gui.widget.ToggleButtonWidget; import net.minecraft.client.util.math.MatrixStack; @@ -106,32 +108,33 @@ public class SearchResultsWidget implements Drawable { this.nextPageButton.active = this.currentPage < this.pageCount - 1; } - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; RenderSystem.disableDepthTest(); if (this.displayRecipes) { String craftText = this.recipeResults.get(this.currentPage).craftText; - this.client.textRenderer.drawWithShadow(matrices, craftText, this.parentX + 11, this.parentY + 31, 0xffffffff); + context.drawTextWithShadow(textRenderer, craftText, this.parentX + 11, this.parentY + 31, 0xffffffff); Text resultText = this.recipeResults.get(this.currentPage).result.getName(); - this.client.textRenderer.drawWithShadow(matrices, resultText, this.parentX + 11, this.parentY + 43, 0xffffffff); - this.client.textRenderer.drawWithShadow(matrices, "▶", this.parentX + 96, this.parentY + 90, 0xaaffffff); + context.drawTextWithShadow(textRenderer, resultText, this.parentX + 11, this.parentY + 43, 0xffffffff); + context.drawTextWithShadow(textRenderer, "▶", this.parentX + 96, this.parentY + 90, 0xaaffffff); } for (ResultButtonWidget button : resultButtons) - button.render(matrices, mouseX, mouseY, delta); + button.render(context, mouseX, mouseY, delta); if (this.pageCount > 1) { String string = (this.currentPage + 1) + "/" + this.pageCount; int dx = this.client.textRenderer.getWidth(string) / 2; - this.client.textRenderer.draw(matrices, string, this.parentX - dx + 73, this.parentY + 141, -1); + context.drawText(textRenderer, string, this.parentX - dx + 73, this.parentY + 141, -1, false); } - if (this.prevPageButton.active) this.prevPageButton.render(matrices, mouseX, mouseY, delta); - if (this.nextPageButton.active) this.nextPageButton.render(matrices, mouseX, mouseY, delta); + if (this.prevPageButton.active) this.prevPageButton.render(context, mouseX, mouseY, delta); + if (this.nextPageButton.active) this.nextPageButton.render(context, mouseX, mouseY, delta); RenderSystem.enableDepthTest(); } - public void drawTooltip(MatrixStack matrices, int mouseX, int mouseY) { + public void drawTooltip(DrawContext context, int mouseX, int mouseY) { RenderSystem.disableDepthTest(); for (ResultButtonWidget button : resultButtons) if (button.isMouseOver(mouseX, mouseY)) - button.renderTooltip(matrices, mouseX, mouseY); + button.renderTooltip(context, mouseX, mouseY); RenderSystem.enableDepthTest(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java index 7269840a..c02463a3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java @@ -7,7 +7,7 @@ import me.xmrvizzy.skyblocker.mixin.HandledScreenAccessor; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; @@ -64,41 +64,41 @@ public class QuickNavButton extends ClickableWidget { } @Override - public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { + public void renderButton(DrawContext context, int mouseX, int mouseY, float delta) { this.updateCoordinates(); - RenderSystem.setShaderTexture(0, BUTTON_TEXTURE); + MatrixStack matrices = context.getMatrices(); RenderSystem.disableDepthTest(); // render button background if (!this.toggled) { if (this.index >= 6) // this.drawTexture(matrices, this.x, this.y + 4, this.u, this.v + 4, this.width, this.height - 4); - DrawableHelper.drawTexture(matrices, this.getX(), this.getY() + 4, this.u, this.v + 4, this.width, this.height - 4); + context.drawTexture(BUTTON_TEXTURE, this.getX(), this.getY() + 4, this.u, this.v + 4, this.width, this.height - 4); else // this.drawTexture(matrices, this.x, this.y, this.u, this.v, this.width, this.height - 4); - DrawableHelper.drawTexture(matrices, this.getX(), this.getY() - 2, this.u, this.v, this.width, this.height - 4); + context.drawTexture(BUTTON_TEXTURE, this.getX(), this.getY() - 2, this.u, this.v, this.width, this.height - 4); // } else this.drawTexture(matrices, this.x, this.y, this.u, this.v, this.width, this.height); } else { matrices.push(); //Move the top buttons 2 pixels up if they're selected if (this.index < 6) matrices.translate(0f, -2f, 0f); - DrawableHelper.drawTexture(matrices, this.getX(), this.getY(), this.u, this.v, this.width, this.height); + context.drawTexture(BUTTON_TEXTURE, this.getX(), this.getY(), this.u, this.v, this.width, this.height); matrices.pop(); } // render button icon if (!this.toggled) { if (this.index >= 6) // CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 6); - CLIENT.getItemRenderer().renderInGui(matrices, this.icon,this.getX() + 5, this.getY() + 6); + context.drawItem(this.icon,this.getX() + 5, this.getY() + 6); else // CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 9); - CLIENT.getItemRenderer().renderInGui(matrices, this.icon,this.getX() + 5, this.getY() + 7); + context.drawItem(this.icon,this.getX() + 5, this.getY() + 7); } else { if (this.index >= 6) // CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 9); - CLIENT.getItemRenderer().renderInGui(matrices, this.icon,this.getX() + 5, this.getY() + 9); + context.drawItem(this.icon,this.getX() + 5, this.getY() + 9); else // CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 6); - CLIENT.getItemRenderer().renderInGui(matrices, this.icon,this.getX() + 5, this.getY() + 6); + context.drawItem(this.icon,this.getX() + 5, this.getY() + 6); } RenderSystem.enableDepthTest(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java index 43b7f956..2ed15f27 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java @@ -23,6 +23,7 @@ import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList.HomePlayerScree import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList.PlayerListScreen; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerLocator; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; @@ -98,9 +99,9 @@ public class Screen { } } - public void render(MatrixStack ms) { + public void render(DrawContext context) { for (Widget w : widgets) { - w.render(ms); + w.render(context); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java index 6b96c151..33f77933 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java @@ -10,7 +10,7 @@ import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.Component; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.text.MutableText; @@ -103,14 +103,15 @@ public abstract class Widget { /** * Draw this widget with a background */ - public final void render(MatrixStack ms) { - this.render(ms, true); + public final void render(DrawContext context) { + this.render(context, true); } /** * Draw this widget, possibly with a background */ - public final void render(MatrixStack ms, boolean hasBG) { + public final void render(DrawContext context, boolean hasBG) { + MatrixStack ms = context.getMatrices(); // not sure if this is the way to go, but it fixes Z-layer issues // like blocks being rendered behind the BG and the hotbar clipping into things @@ -123,9 +124,9 @@ public abstract class Widget { // move above other UI elements ms.translate(0, 0, 200); if (hasBG) { - DrawableHelper.fill(ms, x + 1, y, x + w - 1, y + h, COL_BG_BOX); - DrawableHelper.fill(ms, x, y + 1, x + 1, y + h - 1, COL_BG_BOX); - DrawableHelper.fill(ms, x + w - 1, y + 1, x + w, y + h - 1, COL_BG_BOX); + context.fill(x + 1, y, x + w - 1, y + h, COL_BG_BOX); + context.fill(x, y + 1, x + 1, y + h - 1, COL_BG_BOX); + context.fill(x + w - 1, y + 1, x + w, y + h - 1, COL_BG_BOX); } // move above background (if exists) ms.translate(0, 0, 100); @@ -133,19 +134,19 @@ public abstract class Widget { int strHeightHalf = Widget.txtRend.fontHeight / 2; int strAreaWidth = Widget.txtRend.getWidth(title) + 4; - txtRend.draw(ms, title, x + 8, y + 2, this.color); + context.drawText(txtRend, title, x + 8, y + 2, this.color, false); - this.drawHLine(ms, x + 2, y + 1 + strHeightHalf, 4); - this.drawHLine(ms, x + 2 + strAreaWidth + 4, y + 1 + strHeightHalf, w - 4 - 4 - strAreaWidth); - this.drawHLine(ms, x + 2, y + h - 2, w - 4); + this.drawHLine(context, x + 2, y + 1 + strHeightHalf, 4); + this.drawHLine(context, x + 2 + strAreaWidth + 4, y + 1 + strHeightHalf, w - 4 - 4 - strAreaWidth); + this.drawHLine(context, x + 2, y + h - 2, w - 4); - this.drawVLine(ms, x + 1, y + 2 + strHeightHalf, h - 4 - strHeightHalf); - this.drawVLine(ms, x + w - 2, y + 2 + strHeightHalf, h - 4 - strHeightHalf); + this.drawVLine(context, x + 1, y + 2 + strHeightHalf, h - 4 - strHeightHalf); + this.drawVLine(context, x + w - 2, y + 2 + strHeightHalf, h - 4 - strHeightHalf); int yOffs = y + BORDER_SZE_N; for (Component c : components) { - c.render(ms, x + BORDER_SZE_W, yOffs); + c.render(context, x + BORDER_SZE_W, yOffs); yOffs += c.getHeight() + Component.PAD_L; } // pop manipulations above @@ -153,12 +154,12 @@ public abstract class Widget { RenderSystem.disableDepthTest(); } - private void drawHLine(MatrixStack ms, int xpos, int ypos, int width) { - DrawableHelper.fill(ms, xpos, ypos, xpos + width, ypos + 1, this.color); + private void drawHLine(DrawContext context, int xpos, int ypos, int width) { + context.fill(xpos, ypos, xpos + width, ypos + 1, this.color); } - private void drawVLine(MatrixStack ms, int xpos, int ypos, int height) { - DrawableHelper.fill(ms, xpos, ypos, xpos + 1, ypos + height, this.color); + private void drawVLine(DrawContext context, int xpos, int ypos, int height) { + context.fill(xpos, ypos, xpos + 1, ypos + height, this.color); } /** diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/Component.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/Component.java index 671b1f41..850cb3d2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/Component.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/Component.java @@ -2,8 +2,8 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; /** * Abstract base class for a component that may be added to a Widget. @@ -15,12 +15,11 @@ public abstract class Component { public static final int PAD_L = 4; static TextRenderer txtRend = MinecraftClient.getInstance().textRenderer; - static ItemRenderer itmRend = MinecraftClient.getInstance().getItemRenderer(); // these should always be the content dimensions without any padding. int width, height; - public abstract void render(MatrixStack ms, int x, int y); + public abstract void render(DrawContext context, int x, int y); public int getWidth() { return this.width; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java index f845eba5..afd05c26 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java @@ -1,7 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.DrawContext; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -36,10 +36,10 @@ public class IcoFatTextComponent extends Component { } @Override - public void render(MatrixStack ms, int x, int y) { - itmRend.renderGuiItemIcon(ms, ico, x, y + ICO_OFFS); - txtRend.draw(ms, line1, x + ICO_DIM + PAD_L, y, 0xffffffff); - txtRend.draw(ms, line2, x + ICO_DIM + PAD_L, y + txtRend.fontHeight + PAD_S, 0xffffffff); + public void render(DrawContext context, int x, int y) { + context.drawItem(ico, x, y + ICO_OFFS); + context.drawText(txtRend, line1, x + ICO_DIM + PAD_L, y, 0xffffffff, false); + context.drawText(txtRend, line2, x + ICO_DIM + PAD_L, y + txtRend.fontHeight + PAD_S, 0xffffffff, false); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java index 7a495a13..7ab92dd5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java @@ -1,7 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.DrawContext; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -32,9 +32,9 @@ public class IcoTextComponent extends Component { } @Override - public void render(MatrixStack ms, int x, int y) { - itmRend.renderGuiItemIcon(ms, ico, x, y); - txtRend.draw(ms, text, x + ICO_DIM + PAD_L, y + 5, 0xffffffff); + public void render(DrawContext context, int x, int y) { + context.drawItem(ico, x, y); + context.drawText(txtRend, text, x + ICO_DIM + PAD_L, y + 5, 0xffffffff, false); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java index 265d11f1..34e0268b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java @@ -1,6 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.DrawContext; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -23,8 +23,8 @@ public class PlainTextComponent extends Component { } @Override - public void render(MatrixStack ms, int x, int y) { - txtRend.draw(ms, text, x + PAD_S, y, 0xffffffff); + public void render(DrawContext context, int x, int y) { + context.drawText(txtRend, text, x + PAD_S, y, 0xffffffff, false); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java index 18859080..fd66ec73 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java @@ -1,10 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; -import com.mojang.blaze3d.systems.RenderSystem; - +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.PlayerSkinDrawer; import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; /** @@ -27,10 +25,9 @@ public class PlayerComponent extends Component { } @Override - public void render(MatrixStack ms, int x, int y) { - RenderSystem.setShaderTexture(0, tex); - PlayerSkinDrawer.draw(ms, x, y, SKIN_ICO_DIM); - txtRend.draw(ms, name, x + SKIN_ICO_DIM + PAD_S, y, 0xffffffff); + public void render(DrawContext context, int x, int y) { + PlayerSkinDrawer.draw(context, tex, x, y, SKIN_ICO_DIM); + context.drawText(txtRend, name, x + SKIN_ICO_DIM + PAD_S, y, 0xffffffff, false); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java index b9ebc0e9..a7cc8d12 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java @@ -1,8 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.DrawContext; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -55,16 +54,16 @@ public class ProgressComponent extends Component { } @Override - public void render(MatrixStack ms, int x, int y) { - itmRend.renderGuiItemIcon(ms, ico, x, y + ICO_OFFS); - txtRend.draw(ms, desc, x + ICO_DIM + PAD_L, y, 0xffffffff); + public void render(DrawContext context, int x, int y) { + context.drawItem(ico, x, y + ICO_OFFS); + context.drawText(txtRend, desc, x + ICO_DIM + PAD_L, y, 0xffffffff, false); int barX = x + ICO_DIM + PAD_L; int barY = y + txtRend.fontHeight + PAD_S; int endOffsX = ((int) (this.barW * (this.pcnt / 100f))); - DrawableHelper.fill(ms, barX + endOffsX, barY, barX + this.barW, barY + BAR_HEIGHT, COL_BG_BAR); - DrawableHelper.fill(ms, barX, barY, barX + endOffsX, barY + BAR_HEIGHT, + context.fill(barX + endOffsX, barY, barX + this.barW, barY + BAR_HEIGHT, COL_BG_BAR); + context.fill(barX, barY, barX + endOffsX, barY + BAR_HEIGHT, this.color); - txtRend.drawWithShadow(ms, bar, barX + 3, barY + 2, 0xffffffff); + context.drawTextWithShadow(txtRend, bar, barX + 3, barY + 2, 0xffffffff); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java index 5d49be2c..30287dc0 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java @@ -1,7 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.DrawContext; /** * Meta-Component that consists of a grid of other components @@ -38,11 +37,11 @@ public class TableComponent extends Component { } @Override - public void render(MatrixStack ms, int xpos, int ypos) { + public void render(DrawContext context, int xpos, int ypos) { for (int x = 0; x < cols; x++) { for (int y = 0; y < rows; y++) { if (comps[x][y] != null) { - comps[x][y].render(ms, xpos + (x * cellW), ypos + y * cellH); + comps[x][y].render(context, xpos + (x * cellW), ypos + y * cellH); } } // add a line before the col if we're not drawing the first one @@ -51,7 +50,7 @@ public class TableComponent extends Component { int lineX2 = xpos + (x * cellW) - PAD_S; int lineY1 = ypos + 1; int lineY2 = ypos + this.height - PAD_S - 1; // not sure why but it looks correct - DrawableHelper.fill(ms, lineX1, lineY1, lineX2, lineY2, this.color); + context.fill(lineX1, lineY1, lineX2, lineY2, this.color); } } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/ToastBuilder.java b/src/main/java/me/xmrvizzy/skyblocker/utils/ToastBuilder.java index 7a0ad754..919975b0 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/ToastBuilder.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/ToastBuilder.java @@ -3,11 +3,10 @@ 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.gui.DrawableHelper; -import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; 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) @@ -21,14 +20,13 @@ public class ToastBuilder implements Toast { } @Override - public Toast.Visibility draw(MatrixStack matrices, ToastManager manager, long startTime) { - RenderSystem.setShader(GameRenderer::getPositionTexProgram); - RenderSystem.setShaderTexture(0, TEXTURE); + public Toast.Visibility draw(DrawContext context, ToastManager manager, long startTime) { + TextRenderer textRenderer = manager.getClient().textRenderer; RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - DrawableHelper.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); + context.drawTexture(TEXTURE, 0, 0, 0, 0, this.getWidth(), this.getHeight()); + context.drawText(textRenderer, title, 7, 7, -11534256, false); + context.drawText(textRenderer, description, 7, 18, -16777216, false); return startTime >= 3000L ? Toast.Visibility.HIDE : Toast.Visibility.SHOW; } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 14c1e6f1..b407b737 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -30,9 +30,9 @@ ], "depends": { "fabricloader": ">=0.14.19", - "fabric-api": ">=0.81.0+1.19.4", + "fabric-api": ">=0.80.2+1.20", "cloth-config2": "*", - "minecraft": "~1.19.4" + "minecraft": "~1.20-beta.1" }, "custom": { "modmenu": { diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 6fa2596a..f8b39c93 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -6,20 +6,18 @@ "AccessorWorldRenderer", "ClientPlayerEntityMixin", "ClientPlayNetworkHandlerMixin", + "DrawContextMixin", "FarmlandBlockMixin", "GenericContainerScreenHandlerMixin", "HandledScreenAccessor", "HandledScreenMixin", "InGameHudMixin", "InventoryScreenMixin", - "ItemRendererMixin", "LeverBlockMixin", "MinecraftClientMixin", - "RecipeBookWidgetAccessor", - "HandledScreenAccessor", "PlayerListHudAccessor", "PlayerListHudMixin", - "ScreenMixin" + "RecipeBookWidgetAccessor" ], "injectors": { "defaultRequire": 1 -- cgit From 8a5abeaec788dd5d17d8ddfb548a16fd2e8c5e43 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Tue, 20 Jun 2023 12:08:38 +0800 Subject: Async DiscordRPC --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 2 +- .../skyblocker/discord/DiscordRPCManager.java | 67 ++++++++++++++++------ .../java/me/xmrvizzy/skyblocker/utils/Utils.java | 4 +- 3 files changed, 52 insertions(+), 21 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index bfc5013b..189ecca3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -82,7 +82,7 @@ public class SkyblockerMod implements ClientModInitializer { containerSolverManager.init(); DungeonMap.init(); scheduler.scheduleCyclic(Utils::sbChecker, 20); - scheduler.scheduleCyclic(DiscordRPCManager::update, 100); + scheduler.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 100); scheduler.scheduleCyclic(DungeonBlaze::update, 4); scheduler.scheduleCyclic(LividColor::update, 10); scheduler.scheduleCyclic(BackpackPreview::tick, 50); diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java index 1ac2f6d5..f7ec2f33 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java @@ -11,43 +11,74 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.DecimalFormat; +import java.util.concurrent.CompletableFuture; public class DiscordRPCManager { public static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("###,###.##"); public static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Discord RPC"); + public static CompletableFuture updateTask; public static long startTimeStamp; public static int cycleCount; public static void init() { - SkyblockEvents.LEAVE.register(DiscordIPC::stop); + SkyblockEvents.LEAVE.register(DiscordRPCManager::initAndUpdatePresence); SkyblockEvents.JOIN.register(() -> { startTimeStamp = System.currentTimeMillis(); - if (DiscordIPC.start(934607927837356052L, null)) { - if (SkyblockerConfig.get().richPresence.enableRichPresence) { - DiscordIPC.setActivity(buildPresence()); - LOGGER.info("Discord RPC started successfully"); - } else { - LOGGER.info("Discord RPC started successfully but is currently disabled"); - } - } else { - LOGGER.error("Discord RPC failed to start"); - } + initAndUpdatePresence(true); }); } - public static void update() { + public static void updateDataAndPresence() { // If the custom message is empty, discord will keep the last message, this is can serve as a default if the user doesn't want a custom message if (SkyblockerConfig.get().richPresence.customMessage.isEmpty()) { SkyblockerConfig.get().richPresence.customMessage = "Playing Skyblock"; AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); } - if ((!Utils.isOnSkyblock() || !SkyblockerConfig.get().richPresence.enableRichPresence) && DiscordIPC.isConnected()) { - DiscordIPC.stop(); - LOGGER.info("Discord RPC stopped"); - return; - } if (SkyblockerConfig.get().richPresence.cycleMode) cycleCount = (cycleCount + 1) % 3; - DiscordIPC.setActivity(buildPresence()); + initAndUpdatePresence(); + } + + private static void initAndUpdatePresence() { + initAndUpdatePresence(false); + } + + /** + * Updates discord presence asynchronously. + *

+ * When the {@link #updateTask previous update} does not exist or {@link CompletableFuture#isDone() has completed}: + *

+ * Connects to discord if {@link SkyblockerConfig.RichPresence#enableRichPresence rich presence is enabled}, + * the player {@link Utils#isOnSkyblock() is on Skyblock}, and {@link DiscordIPC#isConnected() discord is not already connected}. + * Updates the presence if {@link SkyblockerConfig.RichPresence#enableRichPresence rich presence is enabled} + * and the player {@link Utils#isOnSkyblock() is on Skyblock}. + * Stops the connection if {@link SkyblockerConfig.RichPresence#enableRichPresence rich presence is disabled} + * or the player {@link Utils#isOnSkyblock() is not on Skyblock} and {@link DiscordIPC#isConnected() discord is connected}. + * Saves the update task in {@link #updateTask} + * + * @param initialization whether this is the first time the presence is being updates. If {@code true}, a message will be logged + * if {@link SkyblockerConfig.RichPresence#enableRichPresence rich presence is disabled}. + */ + private static void initAndUpdatePresence(boolean initialization) { + if (updateTask == null || updateTask.isDone()) { + updateTask = CompletableFuture.runAsync(() -> { + if (SkyblockerConfig.get().richPresence.enableRichPresence && Utils.isOnSkyblock()) { + if (!DiscordIPC.isConnected()) { + if (DiscordIPC.start(934607927837356052L, null)) { + LOGGER.info("Discord RPC started successfully"); + } else { + LOGGER.error("Discord RPC failed to start"); + return; + } + } + DiscordIPC.setActivity(buildPresence()); + } else if (DiscordIPC.isConnected()) { + DiscordIPC.stop(); + LOGGER.info("Discord RPC stopped"); + } else if (initialization) { + LOGGER.info("Discord RPC is currently disabled"); + } + }); + } } public static RichPresence buildPresence() { diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index 028386ab..a4e403fc 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -52,13 +52,13 @@ public class Utils { isInjected = true; ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip); } - SkyblockEvents.JOIN.invoker().onSkyblockJoin(); isOnSkyblock = true; + SkyblockEvents.JOIN.invoker().onSkyblockJoin(); } } else if (isOnSkyblock) { - SkyblockEvents.LEAVE.invoker().onSkyblockLeave(); isOnSkyblock = false; isInDungeons = false; + SkyblockEvents.LEAVE.invoker().onSkyblockLeave(); } isInDungeons = isOnSkyblock && string.contains("The Catacombs"); } -- cgit From 027426aacac048b85cd310e9e3d4101e0156a917 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Mon, 22 May 2023 20:30:12 -0400 Subject: Add Fairy Souls Helper --- build.gradle | 3 + gradle.properties | 2 + .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 22 +-- .../skyblocker/config/SkyblockerConfig.java | 8 + .../accessor/BeaconBlockEntityRendererInvoker.java | 16 ++ .../xmrvizzy/skyblocker/skyblock/FairySouls.java | 184 +++++++++++++++++++++ .../skyblocker/skyblock/api/RepositoryUpdate.java | 62 ------- .../skyblocker/skyblock/dungeon/LividColor.java | 3 +- .../skyblocker/skyblock/itemlist/ItemRegistry.java | 75 ++------- .../skyblock/itemlist/ItemStackBuilder.java | 5 +- .../java/me/xmrvizzy/skyblocker/utils/NEURepo.java | 90 ++++++++++ .../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 30 ++++ .../java/me/xmrvizzy/skyblocker/utils/Utils.java | 91 +++++++++- .../resources/assets/skyblocker/lang/en_us.json | 6 +- 14 files changed, 454 insertions(+), 143 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/api/RepositoryUpdate.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/build.gradle b/build.gradle index 4d2dc8ef..83da3489 100644 --- a/build.gradle +++ b/build.gradle @@ -60,6 +60,9 @@ dependencies { // https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit used pull data from the NEU item repo include(implementation("org.eclipse.jgit:org.eclipse.jgit:6.4.0.202211300538-r")) + // Renderer (https://github.com/0x3C50/Renderer) + include modImplementation("com.github.0x3C50:Renderer:${project.renderer_version}") + include(modImplementation ("meteordevelopment:discord-ipc:1.1")) } diff --git a/gradle.properties b/gradle.properties index 14a4fffc..d90dc6f2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,6 +17,8 @@ clothconfig_version=11.0.99 mod_menu_version=7.0.1 ## REI (https://www.curseforge.com/minecraft/mc-mods/roughly-enough-items/files) rei_version=12.0.625 +## Renderer (https://github.com/0x3C50/Renderer) +renderer_version = master-SNAPSHOT # Mod Properties mod_version = 1.10.0 diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index 189ecca3..04ab384f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -1,14 +1,12 @@ package me.xmrvizzy.skyblocker; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import me.xmrvizzy.skyblocker.chat.ChatMessageListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.discord.DiscordRPCManager; import me.xmrvizzy.skyblocker.gui.ContainerSolverManager; -import me.xmrvizzy.skyblocker.skyblock.BackpackPreview; -import me.xmrvizzy.skyblocker.skyblock.FishingHelper; -import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; -import me.xmrvizzy.skyblocker.skyblock.StatusBarTracker; -import me.xmrvizzy.skyblocker.skyblock.api.RepositoryUpdate; +import me.xmrvizzy.skyblocker.skyblock.*; import me.xmrvizzy.skyblocker.skyblock.api.StatsCommand; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMap; @@ -20,14 +18,14 @@ import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; import me.xmrvizzy.skyblocker.skyblock.quicknav.QuickNav; import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; -import me.xmrvizzy.skyblocker.utils.MessageScheduler; -import me.xmrvizzy.skyblocker.utils.Scheduler; -import me.xmrvizzy.skyblocker.utils.UpdateChecker; -import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.*; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; +import java.nio.file.Path; + /** * Main class for Skyblocker which initializes features, registers events, and * manages ticks. This class will be instantiated by Fabric. Do not instantiate @@ -35,6 +33,8 @@ import net.minecraft.client.MinecraftClient; */ public class SkyblockerMod implements ClientModInitializer { public static final String NAMESPACE = "skyblocker"; + public static final Path CONFIG_DIR = FabricLoader.getInstance().getConfigDir().resolve(NAMESPACE); + public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private static SkyblockerMod INSTANCE; @SuppressWarnings("deprecation") @@ -63,12 +63,13 @@ public class SkyblockerMod implements ClientModInitializer { @Override public void onInitializeClient() { ClientTickEvents.END_CLIENT_TICK.register(this::tick); + Utils.init(); HotbarSlotLock.init(); SkyblockerConfig.init(); PriceInfoTooltip.init(); WikiLookup.init(); ItemRegistry.init(); - RepositoryUpdate.init(); + NEURepo.init(); BackpackPreview.init(); QuickNav.init(); StatsCommand.init(); @@ -78,6 +79,7 @@ public class SkyblockerMod implements ClientModInitializer { DiscordRPCManager.init(); LividColor.init(); FishingHelper.init(); + FairySouls.init(); TabHud.init(); containerSolverManager.init(); DungeonMap.init(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index b1bc2001..f296e487 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -150,6 +150,10 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Gui.CollapsibleObject() public Fishing fishing = new Fishing(); + @ConfigEntry.Category("fairySouls") + @ConfigEntry.Gui.CollapsibleObject() + public FairySouls fairySouls = new FairySouls(); + @ConfigEntry.Category("itemList") @ConfigEntry.Gui.CollapsibleObject() public ItemList itemList = new ItemList(); @@ -219,6 +223,10 @@ public class SkyblockerConfig implements ConfigData { public boolean enableFishingHelper = true; } + public static class FairySouls { + public boolean enableFairySouls = true; + } + public static class Hitbox { public boolean oldFarmlandHitbox = true; public boolean oldLeverHitbox = false; diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java new file mode 100644 index 00000000..ff7c7cbc --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java @@ -0,0 +1,16 @@ +package me.xmrvizzy.skyblocker.mixin.accessor; + +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer; +import net.minecraft.client.util.math.MatrixStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(BeaconBlockEntityRenderer.class) +public interface BeaconBlockEntityRendererInvoker { + @SuppressWarnings("unused") + @Invoker("renderBeam") + static void renderBeam(MatrixStack matrices, VertexConsumerProvider vertexConsumers, float tickDelta, long worldTime, int yOffset, int maxY, float[] color) { + throw new IllegalStateException("Mixin invoker failed to apply."); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java new file mode 100644 index 00000000..4480c5e1 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java @@ -0,0 +1,184 @@ +package me.xmrvizzy.skyblocker.skyblock; + +import com.google.common.collect.ImmutableSet; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.NEURepo; +import me.xmrvizzy.skyblocker.utils.RenderHelper; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; +import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.text.Text; +import net.minecraft.util.DyeColor; +import net.minecraft.util.math.BlockPos; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.util.*; +import java.util.concurrent.CompletableFuture; + +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; + +public class FairySouls { + private static final Logger LOGGER = LoggerFactory.getLogger(FairySouls.class); + private static CompletableFuture fairySoulsLoaded; + private static final Map> fairySouls = new HashMap<>(); + private static final Map>> foundFairies = new HashMap<>(); + + public static void init() { + fairySoulsLoaded = NEURepo.runAsyncAfterLoad(() -> { + try { + BufferedReader reader = new BufferedReader(new FileReader(NEURepo.LOCAL_REPO_DIR.resolve("constants").resolve("fairy_souls.json").toFile())); + for (Map.Entry fairySoulJson : JsonParser.parseReader(reader).getAsJsonObject().asMap().entrySet()) { + if (fairySoulJson.getKey().equals("//") || fairySoulJson.getKey().equals("Max Souls")) { + continue; + } + ImmutableSet.Builder fairySoulsForLocation = ImmutableSet.builder(); + for (JsonElement fairySoul : fairySoulJson.getValue().getAsJsonArray().asList()) { + fairySoulsForLocation.add(parseBlockPos(fairySoul)); + } + fairySouls.put(fairySoulJson.getKey(), fairySoulsForLocation.build()); + } + reader = new BufferedReader(new FileReader(SkyblockerMod.CONFIG_DIR.resolve("found_fairy_souls.json").toFile())); + for (Map.Entry foundFairiesForProfileJson : JsonParser.parseReader(reader).getAsJsonObject().asMap().entrySet()) { + Map> foundFairiesForProfile = new HashMap<>(); + for (Map.Entry foundFairiesForLocationJson : foundFairiesForProfileJson.getValue().getAsJsonObject().asMap().entrySet()) { + Set foundFairiesForLocation = new HashSet<>(); + for (JsonElement foundFairy : foundFairiesForLocationJson.getValue().getAsJsonArray().asList()) { + foundFairiesForLocation.add(parseBlockPos(foundFairy)); + } + foundFairiesForProfile.put(foundFairiesForLocationJson.getKey(), foundFairiesForLocation); + } + foundFairies.put(foundFairiesForProfileJson.getKey(), foundFairiesForProfile); + } + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + LOGGER.error("Failed to load found fairy souls."); + } catch (Exception e) { + e.printStackTrace(); + } + }); + ClientLifecycleEvents.CLIENT_STOPPING.register(FairySouls::saveFoundFairySouls); + WorldRenderEvents.AFTER_TRANSLUCENT.register(FairySouls::render); + ClientReceiveMessageEvents.GAME.register(FairySouls::onChatMessage); + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE) + .then(literal("fairySouls") + .then(literal("markAllInCurrentIslandFound").executes(context -> { + FairySouls.markAllFairiesFound(); + context.getSource().sendFeedback(Text.translatable("skyblocker.fairySouls.markAllFound")); + return 1; + })) + .then(literal("markAllInCurrentIslandMissing").executes(context -> { + FairySouls.markAllFairiesNotFound(); + context.getSource().sendFeedback(Text.translatable("skyblocker.fairySouls.markAllMissing")); + return 1; + }))))); + } + + private static BlockPos parseBlockPos(JsonElement posJson) { + String[] posArray = posJson.getAsString().split(","); + return new BlockPos(Integer.parseInt(posArray[0]), Integer.parseInt(posArray[1]), Integer.parseInt(posArray[2])); + } + + public static void saveFoundFairySouls(MinecraftClient client) { + try { + BufferedWriter writer = new BufferedWriter(new FileWriter(SkyblockerMod.CONFIG_DIR.resolve("found_fairy_souls.json").toFile())); + JsonObject foundFairiesJson = new JsonObject(); + for (Map.Entry>> foundFairiesForProfile : foundFairies.entrySet()) { + JsonObject foundFairiesForProfileJson = new JsonObject(); + for (Map.Entry> foundFairiesForLocation : foundFairiesForProfile.getValue().entrySet()) { + JsonArray foundFairiesForLocationJson = new JsonArray(); + for (BlockPos foundFairy : foundFairiesForLocation.getValue()) { + foundFairiesForLocationJson.add(foundFairy.getX() + "," + foundFairy.getY() + "," + foundFairy.getZ()); + } + foundFairiesForProfileJson.add(foundFairiesForLocation.getKey(), foundFairiesForLocationJson); + } + foundFairiesJson.add(foundFairiesForProfile.getKey(), foundFairiesForProfileJson); + } + SkyblockerMod.GSON.toJson(foundFairiesJson, writer); + writer.close(); + } catch (IOException e) { + LOGGER.error("Failed to write found fairy souls to file."); + } + } + + public static void render(WorldRenderContext context) { + if (!SkyblockerConfig.get().general.fairySouls.enableFairySouls) { + return; + } + if (!fairySoulsLoaded.isDone()) { + LOGGER.warn("Fairy souls are not loaded yet."); + return; + } + if (!fairySouls.containsKey(Utils.getLocationRaw())) { + return; + } + for (BlockPos fairySoul : fairySouls.get(Utils.getLocationRaw())) { + float[] colorComponents = isFairySoulNotFound(fairySoul) ? DyeColor.GREEN.getColorComponents() : DyeColor.RED.getColorComponents(); + RenderHelper.renderFilledThroughWallsWithBeaconBeam(context, fairySoul, colorComponents, 0.5F); + } + } + + private static boolean isFairySoulNotFound(BlockPos fairySoul) { + Map> foundFairiesForProfile = foundFairies.get(Utils.getProfile()); + if (foundFairiesForProfile == null) { + return true; + } + Set foundFairiesForProfileAndLocation = foundFairiesForProfile.get(Utils.getLocationRaw()); + if (foundFairiesForProfileAndLocation == null) { + return true; + } + return !foundFairiesForProfileAndLocation.contains(fairySoul); + } + + public static void onChatMessage(Text text, boolean overlay) { + String message = text.getString(); + if (message.equals("You have already found that Fairy Soul!") || message.equals("SOUL! You found a Fairy Soul!")) { + markClosestFairyFound(); + } + } + + private static void markClosestFairyFound() { + PlayerEntity player = MinecraftClient.getInstance().player; + if (player == null) { + LOGGER.warn("Failed to mark closest fairy soul as found because player is null."); + return; + } + fairySouls.get(Utils.getLocationRaw()).stream().filter(FairySouls::isFairySoulNotFound).min(Comparator.comparingDouble(fairySoul -> fairySoul.getSquaredDistance(player.getPos()))).ifPresent(fairySoul -> { + initializeFoundFairiesForCurrentProfileAndLocation(); + foundFairies.get(Utils.getProfile()).get(Utils.getLocationRaw()).add(fairySoul); + }); + } + + public static void markAllFairiesFound() { + initializeFoundFairiesForCurrentProfileAndLocation(); + foundFairies.get(Utils.getProfile()).get(Utils.getLocationRaw()).addAll(fairySouls.get(Utils.getLocationRaw())); + } + + public static void markAllFairiesNotFound() { + Map> foundFairiesForProfile = foundFairies.get(Utils.getProfile()); + if (foundFairiesForProfile != null) { + foundFairiesForProfile.remove(Utils.getLocationRaw()); + } + } + + private static void initializeFoundFairiesForCurrentProfileAndLocation() { + initializeFoundFairiesForProfileAndLocation(Utils.getProfile(), Utils.getLocationRaw()); + } + + private static void initializeFoundFairiesForProfileAndLocation(String profile, String location) { + foundFairies.computeIfAbsent(profile, profileKey -> new HashMap<>()); + foundFairies.get(profile).computeIfAbsent(location, locationKey -> new HashSet<>()); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/RepositoryUpdate.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/RepositoryUpdate.java deleted file mode 100644 index e08cb1c0..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/RepositoryUpdate.java +++ /dev/null @@ -1,62 +0,0 @@ -package me.xmrvizzy.skyblocker.skyblock.api; - -import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; -import net.minecraft.client.MinecraftClient; -import net.minecraft.text.Text; - -import java.io.File; -import java.nio.file.Files; -import java.util.concurrent.CompletableFuture; - -public class RepositoryUpdate { - public static final MinecraftClient client = MinecraftClient.getInstance(); - - /** - * Adds command to update repository manually from ingame. - *

- * TODO A button could be added to the settings menu that will trigger this command. - */ - public static void init(){ - ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register( - ClientCommandManager.literal("skyblocker") - .then(ClientCommandManager.literal("updaterepository") - .executes(context -> { - updateRepository(); - return 1; - }) - ) - ) - ); - - } - - public static void updateRepository() { - CompletableFuture.runAsync(() -> { - try { - ItemRegistry.filesImported = false; - File dir = ItemRegistry.LOCAL_ITEM_REPO_DIR.toFile(); - recursiveDelete(dir); - } catch (Exception ex) { - if (client.player != null) - client.player.sendMessage( - Text.translatable("skyblocker.updaterepository.failed") - , false - ); - return; - } - - ItemRegistry.init(); - }); - } - - private static void recursiveDelete(File dir) { - if (dir.isDirectory() && !Files.isSymbolicLink(dir.toPath())) { - for (File child : dir.listFiles()) { - recursiveDelete(child); - } - } - dir.delete(); - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java index 276a41b6..4701c485 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java @@ -11,11 +11,10 @@ public class LividColor { private static int tenTicks = 0; public static void init() { - ClientReceiveMessageEvents.ALLOW_GAME.register((message, overlay) -> { + ClientReceiveMessageEvents.GAME.register((message, overlay) -> { if (SkyblockerConfig.get().locations.dungeons.lividColor.enableLividColor && message.getString().equals("[BOSS] Livid: I respect you for making it to here, but I'll be your undoing.")) { tenTicks = 8; } - return true; }); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java index d9f3b473..13ca356a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java @@ -2,32 +2,23 @@ package me.xmrvizzy.skyblocker.skyblock.itemlist; import com.google.gson.JsonObject; import com.google.gson.JsonParser; - -import me.xmrvizzy.skyblocker.skyblock.api.RepositoryUpdate; -import net.fabricmc.loader.api.FabricLoader; +import me.xmrvizzy.skyblocker.utils.NEURepo; import net.minecraft.client.MinecraftClient; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.text.Text; -import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.PullResult; -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.*; -import java.util.concurrent.CompletableFuture; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class ItemRegistry { - private static final Logger LOGGER = LoggerFactory.getLogger(ItemRegistry.class); - protected static final String REMOTE_ITEM_REPO = "https://github.com/NotEnoughUpdates/NotEnoughUpdates-REPO"; - public static final Path LOCAL_ITEM_REPO_DIR = FabricLoader.getInstance().getConfigDir().resolve("skyblocker/item-repo"); - - protected static final Path ITEM_LIST_DIR = LOCAL_ITEM_REPO_DIR.resolve("items"); + protected static final Path ITEM_LIST_DIR = NEURepo.LOCAL_REPO_DIR.resolve("items"); protected static final List items = new ArrayList<>(); protected static final Map itemsMap = new HashMap<>(); @@ -36,52 +27,8 @@ public class ItemRegistry { public static boolean filesImported = false; public static void init() { - CompletableFuture.runAsync(ItemRegistry::updateItemRepo) - .whenComplete((result, ex) -> { - if (ex == null) { - ItemStackBuilder.init(); - importItemFiles(); - } - else { - LOGGER.error("[Skyblocker-ItemRegistry] " + ex); - } - }); - } - - private static void updateItemRepo() { - Git git; - if (!Files.isDirectory(LOCAL_ITEM_REPO_DIR)) { - try { - git = Git.cloneRepository() - .setURI(REMOTE_ITEM_REPO) - .setDirectory(LOCAL_ITEM_REPO_DIR.toFile()) - .setBranchesToClone(List.of("refs/heads/master")) - .setBranch("refs/heads/master") - .call(); - git.close(); - LOGGER.info("[Skyblocker Repository Update] Repository updated."); - } catch (Exception e) { - e.printStackTrace(); - } - } else { - try { - git = Git.open(LOCAL_ITEM_REPO_DIR.toFile()); - PullResult pull = git.pull().setRebase(true).call(); - git.close(); - - if (pull.getRebaseResult() == null) { - LOGGER.info("[Skyblocker Repository Update] No update result"); - } else if (pull.getRebaseResult().getStatus().isSuccessful()) { - LOGGER.info("[Skyblocker Repository Update] Status: " + pull.getRebaseResult().getStatus().name()); - } else if (!pull.getRebaseResult().getStatus().isSuccessful()) { - LOGGER.warn("[Skyblocker Repository Update] Status: " + pull.getRebaseResult().getStatus().name()); - } - } catch (RepositoryNotFoundException e) { - RepositoryUpdate.updateRepository(); - } catch (Exception e) { - e.printStackTrace(); - } - } + NEURepo.runAsyncAfterLoad(ItemStackBuilder::loadPetNums); + NEURepo.runAsyncAfterLoad(ItemRegistry::importItemFiles); } private static void importItemFiles() { @@ -119,8 +66,7 @@ public class ItemRegistry { if (lhsFamilyName.equals(rhsFamilyName)) { if (lhsInternalName.length() != rhsInternalName.length()) return lhsInternalName.length() - rhsInternalName.length(); - else - return lhsInternalName.compareTo(rhsInternalName); + else return lhsInternalName.compareTo(rhsInternalName); } return lhsFamilyName.compareTo(rhsFamilyName); }); @@ -147,8 +93,7 @@ public class ItemRegistry { public static List getRecipes(String internalName) { List result = new ArrayList<>(); for (SkyblockCraftingRecipe recipe : recipes) - if (getInternalName(recipe.result).equals(internalName)) - result.add(recipe); + if (getInternalName(recipe.result).equals(internalName)) result.add(recipe); for (SkyblockCraftingRecipe recipe : recipes) for (ItemStack ingredient : recipe.grid) if (!ingredient.getItem().equals(Items.AIR) && getInternalName(ingredient).equals(internalName)) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java index b2d909a8..d420d54f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java @@ -4,6 +4,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import me.xmrvizzy.skyblocker.utils.NEURepo; import net.minecraft.item.ItemStack; import net.minecraft.nbt.*; import net.minecraft.text.Text; @@ -16,10 +17,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class ItemStackBuilder { - private final static Path PETNUMS_PATH = ItemRegistry.LOCAL_ITEM_REPO_DIR.resolve("constants/petnums.json"); + private final static Path PETNUMS_PATH = NEURepo.LOCAL_REPO_DIR.resolve("constants/petnums.json"); private static JsonObject petNums; - public static void init() { + public static void loadPetNums() { try { petNums = JsonParser.parseString(Files.readString(PETNUMS_PATH)).getAsJsonObject(); } catch (Exception e) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java b/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java new file mode 100644 index 00000000..027cfa7a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java @@ -0,0 +1,90 @@ +package me.xmrvizzy.skyblocker.utils; + +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class NEURepo { + private static final Logger LOGGER = LoggerFactory.getLogger(NEURepo.class); + public static final String REMOTE_REPO_URL = "https://github.com/NotEnoughUpdates/NotEnoughUpdates-REPO.git"; + public static final Path LOCAL_REPO_DIR = SkyblockerMod.CONFIG_DIR.resolve("item-repo"); + private static final CompletableFuture REPO_INITIALIZED = initRepository(); + + /** + * Adds command to update repository manually from ingame. + *

+ * TODO A button could be added to the settings menu that will trigger this command. + */ + public static void init() { + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> + dispatcher.register(ClientCommandManager.literal(SkyblockerMod.NAMESPACE) + .then(ClientCommandManager.literal("updaterepository").executes(context -> { + deleteAndDownloadRepository(); + return 1; + })))); + } + + public static CompletableFuture initRepository() { + return CompletableFuture.runAsync(() -> { + try { + if (Files.isDirectory(NEURepo.LOCAL_REPO_DIR)) { + try (Git localRepo = Git.open(NEURepo.LOCAL_REPO_DIR.toFile())) { + localRepo.pull().setRebase(true).call(); + LOGGER.info("[Skyblocker] NEU Repository Updated"); + } + } else { + Git.cloneRepository().setURI(REMOTE_REPO_URL).setDirectory(NEURepo.LOCAL_REPO_DIR.toFile()).setBranchesToClone(List.of("refs/heads/master")).setBranch("refs/heads/master").call().close(); + LOGGER.info("[Skyblocker] NEU Repository Downloaded"); + } + } catch (RepositoryNotFoundException e) { + LOGGER.warn("Local NEU Repository not found or corrupted, downloading new one", e); + deleteAndDownloadRepository(); + } catch (Exception e) { + LOGGER.error("Encountered unknown exception while initializing NEU Repository", e); + } + }); + } + + public static void deleteAndDownloadRepository() { + CompletableFuture.runAsync(() -> { + try { + ItemRegistry.filesImported = false; + File dir = NEURepo.LOCAL_REPO_DIR.toFile(); + recursiveDelete(dir); + } catch (Exception ex) { + if (MinecraftClient.getInstance().player != null) + MinecraftClient.getInstance().player.sendMessage(Text.translatable("skyblocker.updaterepository.failed"), false); + return; + } + initRepository(); + }); + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + private static void recursiveDelete(File dir) { + File[] children; + if (dir.isDirectory() && !Files.isSymbolicLink(dir.toPath()) && (children = dir.listFiles()) != null) { + for (File child : children) { + recursiveDelete(child); + } + } + dir.delete(); + } + + public static CompletableFuture runAsyncAfterLoad(Runnable runnable) { + return REPO_INITIALIZED.thenRunAsync(runnable); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java new file mode 100644 index 00000000..79308dc3 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java @@ -0,0 +1,30 @@ +package me.xmrvizzy.skyblocker.utils; + +import me.x150.renderer.render.Renderer3d; +import me.xmrvizzy.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +import java.awt.*; + +public class RenderHelper { + public static void renderFilledThroughWallsWithBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + renderFilledThroughWalls(context, pos, colorComponents, alpha); + renderBeaconBeam(context, pos, colorComponents); + } + + public static void renderFilledThroughWalls(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + Renderer3d.renderThroughWalls(); + Renderer3d.renderFilled(context.matrixStack(), new Color(colorComponents[0], colorComponents[1], colorComponents[2], alpha), Vec3d.of(pos), new Vec3d(1, 1, 1)); + Renderer3d.stopRenderThroughWalls(); + } + + public static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) { + context.matrixStack().push(); + context.matrixStack().translate(pos.getX() - context.camera().getPos().x, pos.getY() - context.camera().getPos().y, pos.getZ() - context.camera().getPos().z); + BeaconBlockEntityRendererInvoker.renderBeam(context.matrixStack(), context.consumers(), context.tickDelta(), context.world().getTime(), 0, BeaconBlockEntityRenderer.MAX_BEAM_HEIGHT, colorComponents); + context.matrixStack().pop(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index a4e403fc..40c96660 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -1,13 +1,21 @@ package me.xmrvizzy.skyblocker.utils; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; +import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; +import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.scoreboard.Scoreboard; import net.minecraft.scoreboard.ScoreboardObjective; import net.minecraft.scoreboard.ScoreboardPlayerScore; import net.minecraft.scoreboard.Team; +import net.minecraft.text.Text; import net.minecraft.util.Formatting; import java.util.ArrayList; @@ -21,6 +29,14 @@ public class Utils { private static boolean isOnSkyblock = false; private static boolean isInDungeons = false; private static boolean isInjected = false; + private static String profile = ""; + private static String server = ""; + private static String gameType = ""; + private static String locationRaw = ""; + private static String map = ""; + private static long clientWorldJoinTime = 0; + private static boolean sentLocRaw = false; + private static long lastLocRaw = 0; public static boolean isOnSkyblock() { return isOnSkyblock; @@ -34,6 +50,31 @@ public class Utils { return isInjected; } + public static String getProfile() { + return profile; + } + + public static String getServer() { + return server; + } + + public static String getGameType() { + return gameType; + } + + public static String getLocationRaw() { + return locationRaw; + } + + public static String getMap() { + return map; + } + + public static void init() { + ClientPlayConnectionEvents.JOIN.register(Utils::onClientWorldJoin); + ClientReceiveMessageEvents.ALLOW_GAME.register(Utils::onChatMessage); + } + public static void sbChecker() { MinecraftClient client = MinecraftClient.getInstance(); List sidebar; @@ -61,13 +102,14 @@ public class Utils { SkyblockEvents.LEAVE.invoker().onSkyblockLeave(); } isInDungeons = isOnSkyblock && string.contains("The Catacombs"); + updateLocRaw(); } public static String getLocation() { String location = null; List sidebarLines = getSidebar(); try { - if( sidebarLines != null) { + if (sidebarLines != null) { for (String sidebarLine : sidebarLines) { if (sidebarLine.contains("⏣")) location = sidebarLine; } @@ -149,4 +191,51 @@ public class Utils { return null; } } + + public static void onClientWorldJoin(ClientPlayNetworkHandler handler, PacketSender sender, MinecraftClient client) { + clientWorldJoinTime = System.currentTimeMillis(); + resetLocRawInfo(); + } + + private static void updateLocRaw() { + if (isOnSkyblock) { + long currentTime = System.currentTimeMillis(); + if (!sentLocRaw && currentTime > clientWorldJoinTime + 1000 && currentTime > lastLocRaw + 15000) { + SkyblockerMod.getInstance().messageScheduler.sendMessageAfterCooldown("/locraw"); + sentLocRaw = true; + lastLocRaw = currentTime; + } + } else { + resetLocRawInfo(); + } + } + + public static boolean onChatMessage(Text text, boolean overlay) { + String message = text.getString(); + if (message.startsWith("{\"server\":") && message.endsWith("}")) { + JsonObject locRaw = JsonParser.parseString(message).getAsJsonObject(); + if (locRaw.has("server")) { + server = locRaw.get("server").getAsString(); + if (locRaw.has("gameType")) { + gameType = locRaw.get("gameType").getAsString(); + } + if (locRaw.has("mode")) { + locationRaw = locRaw.get("mode").getAsString(); + } + if (locRaw.has("map")) { + map = locRaw.get("map").getAsString(); + } + return !sentLocRaw; + } + } + return true; + } + + private static void resetLocRawInfo() { + sentLocRaw = false; + server = ""; + gameType = ""; + locationRaw = ""; + map = ""; + } } \ No newline at end of file diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 858507fe..b40dd52e 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -22,6 +22,8 @@ "text.autoconfig.skyblocker.option.general.bars.barpositions.experienceBarPosition": "Experience Bar Position", "text.autoconfig.skyblocker.option.general.fishing": "Fishing Helper", "text.autoconfig.skyblocker.option.general.fishing.enableFishingHelper": "Enable Fishing Helper", + "text.autoconfig.skyblocker.option.general.fairySouls": "Fairy Souls Helper", + "text.autoconfig.skyblocker.option.general.fairySouls.enableFairySoulsHelper": "Enable Fairy Souls Helper", "text.autoconfig.skyblocker.option.general.quicknav": "Quicknav", "text.autoconfig.skyblocker.option.general.quicknav.enableQuicknav": "Enable Quicknav", "text.autoconfig.skyblocker.option.general.backpackPreviewWithoutShift": "View backpack preview without holding Shift", @@ -222,5 +224,7 @@ "skyblocker.api.got_key": "§b[§6Skyblocker§b] §2Automatically set your API key!", - "skyblocker.fishing.reelNow": "Reel in now!" + "skyblocker.fishing.reelNow": "Reel in now!", + "skyblocker.fairySouls.markAllFound": "Marked all fairy souls in the current island as found", + "skyblocker.fairySouls.markAllMissing": "Marked all fairy souls in the current island as missing" } -- cgit From 3ecd4afc187a69c174fa4dfa1622e705700f674c Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Thu, 25 May 2023 17:58:00 -0400 Subject: Add profile updating from player list --- src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index 40c96660..6f238b44 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -11,6 +11,7 @@ import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.network.PlayerListEntry; import net.minecraft.scoreboard.Scoreboard; import net.minecraft.scoreboard.ScoreboardObjective; import net.minecraft.scoreboard.ScoreboardPlayerScore; @@ -26,6 +27,7 @@ import java.util.List; * Utility variables and methods for retrieving Skyblock related information. */ public class Utils { + private static final String PROFILE_PREFIX = "§r§e§lProfile: §r§a"; private static boolean isOnSkyblock = false; private static boolean isInDungeons = false; private static boolean isInjected = false; @@ -102,6 +104,7 @@ public class Utils { SkyblockEvents.LEAVE.invoker().onSkyblockLeave(); } isInDungeons = isOnSkyblock && string.contains("The Catacombs"); + updateFromPlayerList(client); updateLocRaw(); } @@ -192,6 +195,21 @@ public class Utils { } } + private static void updateFromPlayerList(MinecraftClient client) { + if (client.getNetworkHandler() == null) { + return; + } + for (PlayerListEntry playerListEntry : client.getNetworkHandler().getPlayerList()) { + if (playerListEntry.getDisplayName() == null) { + continue; + } + String name = playerListEntry.getDisplayName().getString(); + if (name.startsWith(PROFILE_PREFIX)) { + profile = name.substring(PROFILE_PREFIX.length()); + } + } + } + public static void onClientWorldJoin(ClientPlayNetworkHandler handler, PacketSender sender, MinecraftClient client) { clientWorldJoinTime = System.currentTimeMillis(); resetLocRawInfo(); -- cgit From 284518527393aa3363c15119c41d28f863122e37 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Thu, 25 May 2023 18:03:56 -0400 Subject: Abstract different checking methods in Utils --- src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 4 ++-- .../java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java | 2 +- src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java | 10 +++++++--- 3 files changed, 10 insertions(+), 6 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index 04ab384f..add81791 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -81,9 +81,9 @@ public class SkyblockerMod implements ClientModInitializer { FishingHelper.init(); FairySouls.init(); TabHud.init(); - containerSolverManager.init(); DungeonMap.init(); - scheduler.scheduleCyclic(Utils::sbChecker, 20); + containerSolverManager.init(); + scheduler.scheduleCyclic(Utils::update, 20); scheduler.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 100); scheduler.scheduleCyclic(DungeonBlaze::update, 4); scheduler.scheduleCyclic(LividColor::update, 10); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java index e35ef605..d89a18e0 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java @@ -50,7 +50,7 @@ public class BackpackPreview { } public static void tick() { - Utils.sbChecker(); // force update isOnSkyblock to prevent crash on disconnect + Utils.update(); // force update isOnSkyblock to prevent crash on disconnect if (Utils.isOnSkyblock()) { // save all dirty storages saveStorage(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index 6f238b44..887476f2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -77,8 +77,14 @@ public class Utils { ClientReceiveMessageEvents.ALLOW_GAME.register(Utils::onChatMessage); } - public static void sbChecker() { + public static void update() { MinecraftClient client = MinecraftClient.getInstance(); + updateFromScoreboard(client); + updateFromPlayerList(client); + updateLocRaw(); + } + + public static void updateFromScoreboard(MinecraftClient client) { List sidebar; if (client.world == null || client.isInSingleplayer() || (sidebar = getSidebar()) == null) { @@ -104,8 +110,6 @@ public class Utils { SkyblockEvents.LEAVE.invoker().onSkyblockLeave(); } isInDungeons = isOnSkyblock && string.contains("The Catacombs"); - updateFromPlayerList(client); - updateLocRaw(); } public static String getLocation() { -- cgit From 08fa8669d4ff3ec098688a3e85b58ee8e9e0eea4 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Thu, 25 May 2023 18:08:02 -0400 Subject: Add docs to Utils and NEURepo --- .../java/me/xmrvizzy/skyblocker/utils/NEURepo.java | 8 ++++++ .../java/me/xmrvizzy/skyblocker/utils/Utils.java | 33 ++++++++++++++++++++++ 2 files changed, 41 insertions(+) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java b/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java index 027cfa7a..0de6cecd 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java @@ -17,6 +17,9 @@ import java.nio.file.Path; import java.util.List; import java.util.concurrent.CompletableFuture; +/** + * Initializes the NEU repo, which contains item metadata and fairy souls location data. Clones the repo if it does not exist and checks for updates. Use {@link #runAsyncAfterLoad(Runnable)} to run code after the repo is initialized. + */ public class NEURepo { private static final Logger LOGGER = LoggerFactory.getLogger(NEURepo.class); public static final String REMOTE_REPO_URL = "https://github.com/NotEnoughUpdates/NotEnoughUpdates-REPO.git"; @@ -84,6 +87,11 @@ public class NEURepo { dir.delete(); } + /** + * Runs the given runnable after the NEU repo is initialized. + * @param runnable the runnable to run + * @return a completable future of the given runnable + */ public static CompletableFuture runAsyncAfterLoad(Runnable runnable) { return REPO_INITIALIZED.thenRunAsync(runnable); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index 887476f2..1b5019a7 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -31,6 +31,10 @@ public class Utils { private static boolean isOnSkyblock = false; private static boolean isInDungeons = false; private static boolean isInjected = false; + /** + * The following fields store data returned from /locraw: {@link #profile}, {@link #server}, {@link #gameType}, {@link #locationRaw}, and {@link #map}. + */ + @SuppressWarnings("JavadocDeclaration") private static String profile = ""; private static String server = ""; private static String gameType = ""; @@ -52,22 +56,37 @@ public class Utils { return isInjected; } + /** + * @return the profile parsed from the player list. + */ public static String getProfile() { return profile; } + /** + * @return the server parsed from /locraw. + */ public static String getServer() { return server; } + /** + * @return the game type parsed from /locraw. + */ public static String getGameType() { return gameType; } + /** + * @return the location raw parsed from /locraw. + */ public static String getLocationRaw() { return locationRaw; } + /** + * @return the map parsed from /locraw. + */ public static String getMap() { return map; } @@ -77,6 +96,9 @@ public class Utils { ClientReceiveMessageEvents.ALLOW_GAME.register(Utils::onChatMessage); } + /** + * Updates all the fields stored in this class from the sidebar, player list, and /locraw. + */ public static void update() { MinecraftClient client = MinecraftClient.getInstance(); updateFromScoreboard(client); @@ -84,6 +106,9 @@ public class Utils { updateLocRaw(); } + /** + * Updates {@link #isOnSkyblock}, {@link #isInDungeons}, and {@link #isInjected} from the scoreboard. + */ public static void updateFromScoreboard(MinecraftClient client) { List sidebar; @@ -219,6 +244,9 @@ public class Utils { resetLocRawInfo(); } + /** + * Sends /locraw to the server if the player is on skyblock and on a new island. + */ private static void updateLocRaw() { if (isOnSkyblock) { long currentTime = System.currentTimeMillis(); @@ -232,6 +260,11 @@ public class Utils { } } + /** + * Parses the /locraw reply from the server + * + * @return not display the message in chat is the command is sent by the mod + */ public static boolean onChatMessage(Text text, boolean overlay) { String message = text.getString(); if (message.startsWith("{\"server\":") && message.endsWith("}")) { -- cgit From a0d504d9e2ffa95bbd2d9d99e546a44572417de9 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Wed, 31 May 2023 08:31:57 +0800 Subject: Updated NEU repo error handling --- src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java | 5 ++--- .../me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java | 4 +++- src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java | 7 +++++-- 3 files changed, 10 insertions(+), 6 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java index ff3c7fae..838b2a55 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java @@ -63,10 +63,9 @@ public class FairySouls { } reader.close(); } catch (IOException e) { - e.printStackTrace(); - LOGGER.error("Failed to load found fairy souls."); + LOGGER.error("Failed to load found fairy souls", e); } catch (Exception e) { - e.printStackTrace(); + LOGGER.error("Encountered unknown exception loading fairy souls", e); } }); ClientLifecycleEvents.CLIENT_STOPPING.register(FairySouls::saveFoundFairySouls); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java index 13ca356a..dc63e351 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java @@ -36,7 +36,9 @@ public class ItemRegistry { File dir = ITEM_LIST_DIR.toFile(); File[] files = dir.listFiles(); - assert files != null; + if (files == null) { + return; + } for (File file : files) { Path path = ITEM_LIST_DIR.resolve(file.getName()); try { diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java b/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java index 0de6cecd..5254feb1 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java @@ -7,6 +7,7 @@ import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallba import net.minecraft.client.MinecraftClient; import net.minecraft.text.Text; import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.TransportException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,11 +53,13 @@ public class NEURepo { Git.cloneRepository().setURI(REMOTE_REPO_URL).setDirectory(NEURepo.LOCAL_REPO_DIR.toFile()).setBranchesToClone(List.of("refs/heads/master")).setBranch("refs/heads/master").call().close(); LOGGER.info("[Skyblocker] NEU Repository Downloaded"); } + } catch (TransportException e){ + LOGGER.error("[Skyblocker] Transport operation failed. Most likely unable to connect to the remote NEU repo on github", e); } catch (RepositoryNotFoundException e) { - LOGGER.warn("Local NEU Repository not found or corrupted, downloading new one", e); + LOGGER.warn("[Skyblocker] Local NEU Repository not found or corrupted, downloading new one", e); deleteAndDownloadRepository(); } catch (Exception e) { - LOGGER.error("Encountered unknown exception while initializing NEU Repository", e); + LOGGER.error("[Skyblocker] Encountered unknown exception while initializing NEU Repository", e); } }); } -- cgit From 5f8683ab480d9efadbe1b39c006bcc33ae68458e Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Fri, 2 Jun 2023 15:51:19 +0800 Subject: Narrowed access to methods --- src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java b/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java index 5254feb1..29b39aa3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java @@ -41,7 +41,7 @@ public class NEURepo { })))); } - public static CompletableFuture initRepository() { + private static CompletableFuture initRepository() { return CompletableFuture.runAsync(() -> { try { if (Files.isDirectory(NEURepo.LOCAL_REPO_DIR)) { @@ -64,7 +64,7 @@ public class NEURepo { }); } - public static void deleteAndDownloadRepository() { + private static void deleteAndDownloadRepository() { CompletableFuture.runAsync(() -> { try { ItemRegistry.filesImported = false; -- cgit From 3f7d97daa8b531c6bbb2019106947575cbe0b89a Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Fri, 16 Jun 2023 11:25:22 +0800 Subject: Fix profile detection --- src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index 1b5019a7..94ead7c1 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -27,7 +27,7 @@ import java.util.List; * Utility variables and methods for retrieving Skyblock related information. */ public class Utils { - private static final String PROFILE_PREFIX = "§r§e§lProfile: §r§a"; + private static final String PROFILE_PREFIX = "Profile: "; private static boolean isOnSkyblock = false; private static boolean isInDungeons = false; private static boolean isInjected = false; -- cgit From 272131e0c082493e0df12b510012460f07a88694 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Sun, 18 Jun 2023 11:39:09 +0800 Subject: Fix cancel game message incompatibility --- src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java | 1 + 1 file changed, 1 insertion(+) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index 94ead7c1..90939fe8 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -94,6 +94,7 @@ public class Utils { public static void init() { ClientPlayConnectionEvents.JOIN.register(Utils::onClientWorldJoin); ClientReceiveMessageEvents.ALLOW_GAME.register(Utils::onChatMessage); + ClientReceiveMessageEvents.GAME_CANCELED.register(Utils::onChatMessage); // Somehow this works even though onChatMessage returns a boolean } /** -- cgit From 0a3c3d61b749172464665634b392b1f68a32288e Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Fri, 23 Jun 2023 14:27:42 -0400 Subject: Added Rift Tab Hud + 1 Rift related fix --- .../skyblocker/discord/DiscordRPCManager.java | 4 +- .../skyblocker/skyblock/tabhud/screens/Screen.java | 4 + .../screens/genericInfo/GenericRiftInfoScreen.java | 38 ++++++++++ .../skyblock/tabhud/screens/main/RiftScreen.java | 28 +++++++ .../skyblocker/skyblock/tabhud/util/Ico.java | 5 ++ .../skyblock/tabhud/util/PlayerListMgr.java | 13 +++- .../skyblock/tabhud/util/PlayerLocator.java | 3 + .../tabhud/widget/rift/AdvertisementWidget.java | 26 +++++++ .../tabhud/widget/rift/GoodToKnowWidget.java | 46 +++++++++++ .../tabhud/widget/rift/RiftProfileWidget.java | 19 +++++ .../tabhud/widget/rift/RiftProgressWidget.java | 88 ++++++++++++++++++++++ .../tabhud/widget/rift/RiftServerInfoWidget.java | 26 +++++++ .../tabhud/widget/rift/RiftStatsWidget.java | 41 ++++++++++ .../skyblock/tabhud/widget/rift/ShenWidget.java | 20 +++++ .../java/me/xmrvizzy/skyblocker/utils/Utils.java | 3 +- 15 files changed, 357 insertions(+), 7 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericRiftInfoScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/RiftScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/AdvertisementWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/GoodToKnowWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProfileWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProgressWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftServerInfoWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftStatsWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/ShenWidget.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java index 29a2c958..325f271a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java @@ -108,13 +108,13 @@ public class DiscordRPCManager { switch (SkyblockerConfig.get().richPresence.info) { case BITS -> info = "Bits: " + DECIMAL_FORMAT.format(Utils.getBits()); case PURSE -> info = "Purse: " + DECIMAL_FORMAT.format(Utils.getPurse()); - case LOCATION -> info = "⏣ " + Utils.getLocation(); + case LOCATION -> info = Utils.getLocation(); } } else if (SkyblockerConfig.get().richPresence.cycleMode) { switch (cycleCount) { case 0 -> info = "Bits: " + DECIMAL_FORMAT.format(Utils.getBits()); case 1 -> info = "Purse: " + DECIMAL_FORMAT.format(Utils.getPurse()); - case 2 -> info = "⏣ " + Utils.getLocation(); + case 2 -> info = Utils.getLocation(); } } return info; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java index 2ed15f27..6d06c637 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java @@ -6,6 +6,7 @@ import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.genericInfo.GardenInfoScreen; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.genericInfo.GenericInfoScreen; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.genericInfo.GenericRiftInfoScreen; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.CrimsonIsleScreen; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.DungeonHubScreen; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.DungeonScreen; @@ -17,6 +18,7 @@ import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.HomeServerScreen; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.HubServerScreen; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.MineServerScreen; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.ParkServerScreen; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.RiftScreen; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList.DungeonPlayerScreen; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList.GuestPlayerScreen; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList.HomePlayerScreen; @@ -51,6 +53,7 @@ public class Screen { private static Screen correctGenericScrn(int w, int h, Text footer) { return switch (PlayerLocator.getPlayerLocation()) { case GARDEN -> new GardenInfoScreen(w, h, footer); // ok + case THE_RIFT -> new GenericRiftInfoScreen(w, h, footer); case UNKNOWN -> new EmptyScreen(w, h, footer); // ok default -> new GenericInfoScreen(w, h, footer); // ok }; @@ -78,6 +81,7 @@ public class Screen { case DUNGEON -> new DungeonScreen(w, h, footer); // ok case CRIMSON_ISLE -> new CrimsonIsleScreen(w, h, footer); case GARDEN -> new GardenScreen(w, h, footer); // ok + case THE_RIFT -> new RiftScreen(w, h, footer); case UNKNOWN -> new EmptyScreen(w, h, footer); // ok default -> new GenericServerScreen(w, h, footer); // ok }; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericRiftInfoScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericRiftInfoScreen.java new file mode 100644 index 00000000..9821b5a3 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericRiftInfoScreen.java @@ -0,0 +1,38 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.genericInfo; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift.RiftProfileWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift.RiftStatsWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift.ShenWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.CookieWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift.AdvertisementWidget; +import net.minecraft.text.Text; + +public class GenericRiftInfoScreen extends Screen { + + public GenericRiftInfoScreen(int w, int h, Text footer) { + super(w, h); + + String f = footer.getString(); + + RiftProfileWidget profile = new RiftProfileWidget(); + RiftStatsWidget stats = new RiftStatsWidget(); + ShenWidget shen = new ShenWidget(); + + CookieWidget cookie = new CookieWidget(f); + AdvertisementWidget advertisement = new AdvertisementWidget(); + + this.stackWidgetsH(stats, advertisement); + this.stackWidgetsH(profile, shen, cookie); + + this.offCenterL(stats); + this.offCenterL(advertisement); + + this.offCenterR(profile); + this.offCenterR(shen); + this.offCenterR(cookie); + + this.addWidgets(profile, stats, shen, cookie, advertisement); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/RiftScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/RiftScreen.java new file mode 100644 index 00000000..d63bcf62 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/RiftScreen.java @@ -0,0 +1,28 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift.RiftProgressWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift.GoodToKnowWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift.RiftServerInfoWidget; + + +import net.minecraft.text.Text; + +public class RiftScreen extends Screen { + + public RiftScreen(int w, int h, Text footer) { + super(w, h); + + RiftProgressWidget rftProg = new RiftProgressWidget(); + GoodToKnowWidget gtk = new GoodToKnowWidget(); + RiftServerInfoWidget si = new RiftServerInfoWidget(); + + this.stackWidgetsH(si, gtk); + this.stackWidgetsH(rftProg); + this.offCenterL(si); + this.offCenterL(gtk); + this.offCenterR(rftProg); + this.addWidgets(si, gtk, rftProg); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/Ico.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/Ico.java index ca767617..97237769 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/Ico.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/Ico.java @@ -52,4 +52,9 @@ public class Ico { public static final ItemStack SAPLING = new ItemStack(Items.OAK_SAPLING); public static final ItemStack MILESTONE = new ItemStack(Items.LODESTONE); public static final ItemStack PICKAXE = new ItemStack(Items.IRON_PICKAXE); + public static final ItemStack NETHER_STAR = new ItemStack(Items.NETHER_STAR); + public static final ItemStack HEART_OF_THE_SEA = new ItemStack(Items.HEART_OF_THE_SEA); + public static final ItemStack EXPERIENCE_BOTTLE = new ItemStack(Items.EXPERIENCE_BOTTLE); + public static final ItemStack PINK_DYE = new ItemStack(Items.PINK_DYE); + public static final ItemStack ENCHANTED_BOOK = new ItemStack(Items.ENCHANTED_BOOK); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerListMgr.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerListMgr.java index 5ace64ea..ee4319dc 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerListMgr.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerListMgr.java @@ -98,8 +98,8 @@ public class PlayerListMgr { * @return the text or null, if the display name is null * * @implNote currently designed specifically for crimson isles faction quests - * widget, might not work correctly without modification for other - * stuff. you've been warned! + * widget and the rift widgets, might not work correctly without + * modification for other stuff. you've been warned! */ public static Text textAt(int idx) { @@ -128,13 +128,18 @@ public class PlayerListMgr { // Trim leading & trailing space - this can only be done at the start and end // otherwise it'll produce malformed results if (i == 0) - textToAppend = StringUtils.removeStart(textToAppend, " "); + textToAppend = textToAppend.stripLeading(); if (i == size - 1) - textToAppend = StringUtils.removeEnd(textToAppend, " "); + textToAppend = textToAppend.stripTrailing(); newText.append(Text.literal(textToAppend).setStyle(current.getStyle())); } + // Avoid returning an empty component - Rift advertisements needed this + if (newText.getString().length() == 0) { + return null; + } + return newText; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerLocator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerLocator.java index d7abdfc2..c2f14d3c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerLocator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerLocator.java @@ -25,6 +25,7 @@ public class PlayerLocator { JERRY, GARDEN, INSTANCED, + THE_RIFT, UNKNOWN } @@ -82,6 +83,8 @@ public class PlayerLocator { return Location.GARDEN; case "Instanced": return Location.INSTANCED; + case "The Rift": + return Location.THE_RIFT; default: return Location.UNKNOWN; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/AdvertisementWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/AdvertisementWidget.java new file mode 100644 index 00000000..61c79c26 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/AdvertisementWidget.java @@ -0,0 +1,26 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +public class AdvertisementWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Advertisement").formatted(Formatting.DARK_AQUA, Formatting.BOLD); + + public AdvertisementWidget() { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + + + for(int i = 73; i < 80; i++) { + Text text = PlayerListMgr.textAt(i); + if(text != null) this.addComponent(new PlainTextComponent(text)); + } + + this.pack(); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/GoodToKnowWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/GoodToKnowWidget.java new file mode 100644 index 00000000..ca95f811 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/GoodToKnowWidget.java @@ -0,0 +1,46 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +public class GoodToKnowWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Good To Know").formatted(Formatting.BLUE, Formatting.BOLD); + + public GoodToKnowWidget() { + super(TITLE, Formatting.BLUE.getColorValue()); + + //After you progress further the tab adds more info so we need to be careful of that + //In beginning it only shows montezuma, then timecharms and enigma souls are added + Text pos49 = PlayerListMgr.textAt(49); //Can be times visited rift + Text pos51 = PlayerListMgr.textAt(51); //Can be lifetime motes or visited rift + Text pos53 = PlayerListMgr.textAt(53); //Can be lifetime motes + + int visitedRiftPos = 0; + int lifetimeMotesPos = 0; + + //Check each position to see what is or isn't there so we don't try adding invalid components + if(pos49.getString().contains("times")) visitedRiftPos = 49; + if(pos51.getString().contains("Motes")) lifetimeMotesPos = 51; + if(pos51.getString().contains("times")) visitedRiftPos = 51; + if(pos53.getString().contains("Motes")) lifetimeMotesPos = 53; + + Text timesVisitedRift = (visitedRiftPos == 51) ? pos51 : (visitedRiftPos == 49) ? pos49 : null; + Text lifetimeMotesEarned = (lifetimeMotesPos == 53) ? pos53 : (lifetimeMotesPos == 51) ? pos51 : null; + + if(visitedRiftPos != 0) { + this.addComponent(new IcoTextComponent(Ico.EXPERIENCE_BOTTLE, Text.literal("Visited Rift: ").append(timesVisitedRift))); + } + + if(lifetimeMotesPos != 0) { + this.addComponent(new IcoTextComponent(Ico.PINK_DYE, Text.literal("Lifetime Earned: ").append(lifetimeMotesEarned))); + } + + this.pack(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProfileWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProfileWidget.java new file mode 100644 index 00000000..5460de49 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProfileWidget.java @@ -0,0 +1,19 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +public class RiftProfileWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Profile").formatted(Formatting.DARK_AQUA, Formatting.BOLD); + + public RiftProfileWidget() { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + + this.addSimpleIcoText(Ico.SIGN, "Profile:", Formatting.GREEN, 61); + this.pack(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProgressWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProgressWidget.java new file mode 100644 index 00000000..615d3cb0 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProgressWidget.java @@ -0,0 +1,88 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.ProgressComponent; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.MathHelper; + +public class RiftProgressWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Rift Progress").formatted(Formatting.BLUE, Formatting.BOLD); + + private static final Pattern TIMECHARMS_PATTERN = Pattern.compile("Timecharms: (?[0-9]+)\\/(?[0-9]+)"); + private static final Pattern ENIGMA_SOULS_PATTERN = Pattern.compile("Enigma Souls: (?[0-9]+)\\/(?[0-9]+)"); + private static final Pattern MONTEZUMA_PATTERN = Pattern.compile("Montezuma: (?[0-9]+)\\/(?[0-9]+)"); + + public RiftProgressWidget() { + super(TITLE, Formatting.BLUE.getColorValue()); + + //After you progress further the tab adds more info so we need to be careful of that + //In beginning it only shows montezuma, then timecharms and enigma souls are added + String pos45 = PlayerListMgr.strAt(45); //Can be Montezuma or Timecharms + String pos46 = PlayerListMgr.strAt(46); //Can be Enigma Souls or Empty + String pos47 = PlayerListMgr.strAt(47); //Can be Montezuma or "Good to know" heading + + boolean hasTimecharms = false; + boolean hasEnigmaSouls = false; + int montezumaPos = 0; + + //Check each position to see what is or isn't there so we don't try adding invalid components + if(pos45.contains("Timecharms")) hasTimecharms = true; + if(pos46.contains("Enigma Souls")) hasEnigmaSouls = true; + + //Small ternary to account for positions, defaults to -1 if it for some reason does not exist (which shouldn't be the case!) + montezumaPos = (pos47.contains("Montezuma")) ? 47 : (pos45.contains("Montezuma")) ? 45 : -1; + + if(hasTimecharms) { + Matcher m = PlayerListMgr.regexAt(45, TIMECHARMS_PATTERN); + + int current = Integer.parseInt(m.group("current")); + int total = Integer.parseInt(m.group("total")); + float pcnt = ((float) current / (float) total) * 100f; + Text progressText = Text.literal(current + "/" + total); + + ProgressComponent pc = new ProgressComponent(Ico.NETHER_STAR, Text.literal("Timecharms"), progressText, pcnt, pcntToCol(pcnt)); + + this.addComponent(pc); + } + + if(hasEnigmaSouls) { + Matcher m = PlayerListMgr.regexAt(46, ENIGMA_SOULS_PATTERN); + + int current = Integer.parseInt(m.group("current")); + int total = Integer.parseInt(m.group("total")); + float pcnt = ((float) current / (float) total) * 100f; + Text progressText = Text.literal(current + "/" + total); + + ProgressComponent pc = new ProgressComponent(Ico.HEART_OF_THE_SEA, Text.literal("Enigma Souls"), progressText, pcnt, pcntToCol(pcnt)); + + this.addComponent(pc); + } + + if(montezumaPos != -1) { + Matcher m = PlayerListMgr.regexAt(montezumaPos, MONTEZUMA_PATTERN); + + int current = Integer.parseInt(m.group("current")); + int total = Integer.parseInt(m.group("total")); + float pcnt = ((float) current / (float) total) * 100f; + Text progressText = Text.literal(current + "/" + total); + + ProgressComponent pc = new ProgressComponent(Ico.BONE, Text.literal("Montezuma"), progressText, pcnt, pcntToCol(pcnt)); + + this.addComponent(pc); + } + + this.pack(); + } + + private static int pcntToCol(float pcnt) { + return MathHelper.hsvToRgb(pcnt / 300f, 0.9f, 0.9f); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftServerInfoWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftServerInfoWidget.java new file mode 100644 index 00000000..2ac2a35d --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftServerInfoWidget.java @@ -0,0 +1,26 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +/** + * Special version of the server info widget for the rift! + * + */ +public class RiftServerInfoWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Server Info").formatted(Formatting.LIGHT_PURPLE, Formatting.BOLD); + + public RiftServerInfoWidget() { + super(TITLE, Formatting.LIGHT_PURPLE.getColorValue()); + + this.addSimpleIcoText(Ico.MAP, "Area:", Formatting.LIGHT_PURPLE, 41); + this.addSimpleIcoText(Ico.NTAG, "Server ID:", Formatting.GRAY, 42); + + this.pack(); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftStatsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftStatsWidget.java new file mode 100644 index 00000000..ef5876f2 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftStatsWidget.java @@ -0,0 +1,41 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.TableComponent; + +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +public class RiftStatsWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Stats").formatted(Formatting.DARK_AQUA, Formatting.BOLD); + + public RiftStatsWidget() { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + + Text riftDamage = Widget.simpleEntryText(64, "RDG", Formatting.DARK_PURPLE); + IcoTextComponent rdg = new IcoTextComponent(Ico.DIASWORD, riftDamage); + + Text speed = Widget.simpleEntryText(65, "SPD", Formatting.WHITE); + IcoTextComponent spd = new IcoTextComponent(Ico.SUGAR, speed); + + Text intelligence = Widget.simpleEntryText(66, "INT", Formatting.AQUA); + IcoTextComponent intel = new IcoTextComponent(Ico.ENCHANTED_BOOK, intelligence); + + Text manaRegen = Widget.simpleEntryText(67, "MRG", Formatting.AQUA); + IcoTextComponent mrg = new IcoTextComponent(Ico.DIAMOND, manaRegen); + + TableComponent tc = new TableComponent(2, 2, Formatting.AQUA.getColorValue()); + tc.addToCell(0, 0, rdg); + tc.addToCell(0, 1, spd); + tc.addToCell(1, 0, intel); + tc.addToCell(1, 1, mrg); + + this.addComponent(tc); + this.pack(); + } + +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/ShenWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/ShenWidget.java new file mode 100644 index 00000000..5dcc08c0 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/ShenWidget.java @@ -0,0 +1,20 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +public class ShenWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Shen's Countdown").formatted(Formatting.DARK_AQUA, Formatting.BOLD); + + public ShenWidget() { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + + this.addComponent(new PlainTextComponent(Text.literal(PlayerListMgr.strAt(70)))); + this.pack(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index 90939fe8..d961ba7e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -145,9 +145,10 @@ public class Utils { if (sidebarLines != null) { for (String sidebarLine : sidebarLines) { if (sidebarLine.contains("⏣")) location = sidebarLine; + if (sidebarLine.contains("ф")) location = sidebarLine; //Rift } if (location == null) location = "Unknown"; - location = location.replace('⏣', ' ').strip(); + location = location.strip(); } } catch (IndexOutOfBoundsException e) { e.printStackTrace(); -- cgit From 5764eed4cfd41e78a8cc1bb6ceb51fc0f5b84d9c Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Mon, 26 Jun 2023 19:39:18 +0800 Subject: Refactor MirrorverseWaypoints --- .../skyblocker/mixin/accessor/FrustumInvoker.java | 12 ++-- .../skyblock/rift/MirrorverseWaypoints.java | 73 +++++++++------------- .../me/xmrvizzy/skyblocker/utils/FrustumUtils.java | 5 ++ .../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 12 +++- 4 files changed, 51 insertions(+), 51 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java index f086b9e5..108a7344 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java @@ -1,17 +1,15 @@ package me.xmrvizzy.skyblocker.mixin.accessor; +import me.xmrvizzy.skyblocker.utils.FrustumUtils; +import net.minecraft.client.render.Frustum; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -import net.minecraft.client.render.Frustum; - /** - * For the purpose of avoiding object allocations! - * + * Use {@link FrustumUtils#isVisible(double, double, double, double, double, double) FrustumUtils#isVisible} which is shorter. For the purpose of avoiding object allocations! */ @Mixin(Frustum.class) public interface FrustumInvoker { - - @Invoker("isVisible") - public boolean isVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ); + @Invoker("isVisible") + boolean isVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java index c0493d18..630d953b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java @@ -1,74 +1,68 @@ package me.xmrvizzy.skyblocker.skyblock.rift; -import java.awt.Color; -import java.io.BufferedReader; -import java.io.IOException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; - -import me.x150.renderer.render.Renderer3d; +import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.mixin.accessor.FrustumInvoker; -import me.xmrvizzy.skyblocker.utils.FrustumUtils; +import me.xmrvizzy.skyblocker.utils.RenderHelper; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.minecraft.client.MinecraftClient; import net.minecraft.util.DyeColor; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.IOException; public class MirrorverseWaypoints { private static final Logger LOGGER = LoggerFactory.getLogger("skyblocker"); private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); - private static final Identifier WAYPOINTS_JSON = new Identifier("skyblocker", "mirrorverse_waypoints.json"); + private static final Identifier WAYPOINTS_JSON = new Identifier(SkyblockerMod.NAMESPACE, "mirrorverse_waypoints.json"); private static final BlockPos[] LAVA_PATH_WAYPOINTS = new BlockPos[107]; private static final BlockPos[] UPSIDE_DOWN_WAYPOINTS = new BlockPos[66]; private static final BlockPos[] TURBULATOR_WAYPOINTS = new BlockPos[27]; private static final float[] COLOR_COMPONENTS = DyeColor.RED.getColorComponents(); - private static final Vec3d ONE = new Vec3d(1, 1, 1); - + static { loadWaypoints(); } - + /** * Loads the waypoint locations into memory */ public static void loadWaypoints() { - try(BufferedReader reader = CLIENT.getResourceManager().openAsReader(WAYPOINTS_JSON)) { + try (BufferedReader reader = CLIENT.getResourceManager().openAsReader(WAYPOINTS_JSON)) { JsonObject file = JsonParser.parseReader(reader).getAsJsonObject(); JsonArray sections = file.get("sections").getAsJsonArray(); - + /// Lava Path JsonArray lavaPathWaypoints = sections.get(0).getAsJsonObject().get("waypoints").getAsJsonArray(); - - for(int i = 0; i < lavaPathWaypoints.size(); i++) { + + for (int i = 0; i < lavaPathWaypoints.size(); i++) { JsonObject point = lavaPathWaypoints.get(i).getAsJsonObject(); LAVA_PATH_WAYPOINTS[i] = new BlockPos(point.get("x").getAsInt(), point.get("y").getAsInt(), point.get("z").getAsInt()); } - + /// Upside Down Parkour JsonArray upsideDownParkourWaypoints = sections.get(1).getAsJsonObject().get("waypoints").getAsJsonArray(); - - for(int i = 0; i < upsideDownParkourWaypoints.size(); i++) { + + for (int i = 0; i < upsideDownParkourWaypoints.size(); i++) { JsonObject point = upsideDownParkourWaypoints.get(i).getAsJsonObject(); UPSIDE_DOWN_WAYPOINTS[i] = new BlockPos(point.get("x").getAsInt(), point.get("y").getAsInt(), point.get("z").getAsInt()); } - + /// Turbulator Parkour JsonArray turbulatorParkourWaypoints = sections.get(2).getAsJsonObject().get("waypoints").getAsJsonArray(); - - for(int i = 0; i < turbulatorParkourWaypoints.size(); i++) { + + for (int i = 0; i < turbulatorParkourWaypoints.size(); i++) { JsonObject point = turbulatorParkourWaypoints.get(i).getAsJsonObject(); TURBULATOR_WAYPOINTS[i] = new BlockPos(point.get("x").getAsInt(), point.get("y").getAsInt(), point.get("z").getAsInt()); } - + } catch (IOException e) { LOGGER.info("[Skyblocker] Mirrorverse Waypoints failed to load ;("); e.printStackTrace(); @@ -76,25 +70,18 @@ public class MirrorverseWaypoints { } public static void render(WorldRenderContext wrc) { - FrustumInvoker frustum = ((FrustumInvoker) FrustumUtils.getFrustum()); //I would also check for the mirrorverse location but the scoreboard stuff is not performant at all... - if(Utils.getLocationRaw().equals(TheRift.LOCATION) && SkyblockerConfig.get().locations.rift.mirrorverseWaypoints) { - for(BlockPos pos : LAVA_PATH_WAYPOINTS) { - if(frustum.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { - Renderer3d.renderFilled(wrc.matrixStack(), new Color(COLOR_COMPONENTS[0], COLOR_COMPONENTS[1], COLOR_COMPONENTS[2], 0.5f), Vec3d.of(pos), ONE); - }; + if (Utils.getLocationRaw().equals(TheRift.LOCATION) && SkyblockerConfig.get().locations.rift.mirrorverseWaypoints) { + for (BlockPos pos : LAVA_PATH_WAYPOINTS) { + RenderHelper.renderFilledIfVisible(wrc, pos, COLOR_COMPONENTS, 0.5f); } - - for(BlockPos pos : UPSIDE_DOWN_WAYPOINTS) { - if(frustum.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { - Renderer3d.renderFilled(wrc.matrixStack(), new Color(COLOR_COMPONENTS[0], COLOR_COMPONENTS[1], COLOR_COMPONENTS[2], 0.5f), Vec3d.of(pos), ONE); - }; + + for (BlockPos pos : UPSIDE_DOWN_WAYPOINTS) { + RenderHelper.renderFilledIfVisible(wrc, pos, COLOR_COMPONENTS, 0.5f); } - - for(BlockPos pos : TURBULATOR_WAYPOINTS) { - if(frustum.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { - Renderer3d.renderFilled(wrc.matrixStack(), new Color(COLOR_COMPONENTS[0], COLOR_COMPONENTS[1], COLOR_COMPONENTS[2], 0.5f), Vec3d.of(pos), ONE); - }; + + for (BlockPos pos : TURBULATOR_WAYPOINTS) { + RenderHelper.renderFilledIfVisible(wrc, pos, COLOR_COMPONENTS, 0.5f); } } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java index 6973aa1e..9ea90c16 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java @@ -1,6 +1,7 @@ package me.xmrvizzy.skyblocker.utils; import me.xmrvizzy.skyblocker.mixin.AccessorWorldRenderer; +import me.xmrvizzy.skyblocker.mixin.accessor.FrustumInvoker; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.Frustum; import net.minecraft.util.math.Box; @@ -14,4 +15,8 @@ public class FrustumUtils { public static boolean isBoxVisible(Box box) { return getFrustum().isVisible(box); } + + public static boolean isVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { + return ((FrustumInvoker) getFrustum()).isVisible(minX, minY, minZ, maxX, maxY, maxZ); + } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java index 79308dc3..c843dc43 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java @@ -17,10 +17,20 @@ public class RenderHelper { public static void renderFilledThroughWalls(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { Renderer3d.renderThroughWalls(); - Renderer3d.renderFilled(context.matrixStack(), new Color(colorComponents[0], colorComponents[1], colorComponents[2], alpha), Vec3d.of(pos), new Vec3d(1, 1, 1)); + renderFilled(context, pos, colorComponents, alpha); Renderer3d.stopRenderThroughWalls(); } + public static void renderFilledIfVisible(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { + renderFilled(context, pos, colorComponents, alpha); + } + } + + public static void renderFilled(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + Renderer3d.renderFilled(context.matrixStack(), new Color(colorComponents[0], colorComponents[1], colorComponents[2], alpha), Vec3d.of(pos), new Vec3d(1, 1, 1)); + } + public static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) { context.matrixStack().push(); context.matrixStack().translate(pos.getX() - context.camera().getPos().x, pos.getY() - context.camera().getPos().y, pos.getZ() - context.camera().getPos().z); -- cgit From 86189e6455662e25e3f8cc64cc3ebbffea201db2 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Mon, 26 Jun 2023 14:33:00 -0400 Subject: Reuse vector --- src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java index c843dc43..b37d324d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java @@ -10,6 +10,8 @@ import net.minecraft.util.math.Vec3d; import java.awt.*; public class RenderHelper { + private static final Vec3d DIMENSIONS = new Vec3d(1, 1, 1); + public static void renderFilledThroughWallsWithBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { renderFilledThroughWalls(context, pos, colorComponents, alpha); renderBeaconBeam(context, pos, colorComponents); @@ -28,7 +30,7 @@ public class RenderHelper { } public static void renderFilled(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { - Renderer3d.renderFilled(context.matrixStack(), new Color(colorComponents[0], colorComponents[1], colorComponents[2], alpha), Vec3d.of(pos), new Vec3d(1, 1, 1)); + Renderer3d.renderFilled(context.matrixStack(), new Color(colorComponents[0], colorComponents[1], colorComponents[2], alpha), Vec3d.of(pos), DIMENSIONS); } public static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) { -- cgit From f941ae83603d242972567710021192f1a4dfdc02 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Mon, 26 Jun 2023 17:41:32 -0400 Subject: Format file --- .../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 64 ++++++++++++---------- 1 file changed, 36 insertions(+), 28 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java index b37d324d..3c3e30d1 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java @@ -11,32 +11,40 @@ import java.awt.*; public class RenderHelper { private static final Vec3d DIMENSIONS = new Vec3d(1, 1, 1); - - public static void renderFilledThroughWallsWithBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { - renderFilledThroughWalls(context, pos, colorComponents, alpha); - renderBeaconBeam(context, pos, colorComponents); - } - - public static void renderFilledThroughWalls(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { - Renderer3d.renderThroughWalls(); - renderFilled(context, pos, colorComponents, alpha); - Renderer3d.stopRenderThroughWalls(); - } - - public static void renderFilledIfVisible(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { - if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { - renderFilled(context, pos, colorComponents, alpha); - } - } - - public static void renderFilled(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { - Renderer3d.renderFilled(context.matrixStack(), new Color(colorComponents[0], colorComponents[1], colorComponents[2], alpha), Vec3d.of(pos), DIMENSIONS); - } - - public static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) { - context.matrixStack().push(); - context.matrixStack().translate(pos.getX() - context.camera().getPos().x, pos.getY() - context.camera().getPos().y, pos.getZ() - context.camera().getPos().z); - BeaconBlockEntityRendererInvoker.renderBeam(context.matrixStack(), context.consumers(), context.tickDelta(), context.world().getTime(), 0, BeaconBlockEntityRenderer.MAX_BEAM_HEIGHT, colorComponents); - context.matrixStack().pop(); - } + + public static void renderFilledThroughWallsWithBeaconBeam(WorldRenderContext context, BlockPos pos, + float[] colorComponents, float alpha) { + renderFilledThroughWalls(context, pos, colorComponents, alpha); + renderBeaconBeam(context, pos, colorComponents); + } + + public static void renderFilledThroughWalls(WorldRenderContext context, BlockPos pos, float[] colorComponents, + float alpha) { + Renderer3d.renderThroughWalls(); + renderFilled(context, pos, colorComponents, alpha); + Renderer3d.stopRenderThroughWalls(); + } + + public static void renderFilledIfVisible(WorldRenderContext context, BlockPos pos, float[] colorComponents, + float alpha) { + if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, + pos.getZ() + 1)) { + renderFilled(context, pos, colorComponents, alpha); + } + } + + public static void renderFilled(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + Renderer3d.renderFilled(context.matrixStack(), + new Color(colorComponents[0], colorComponents[1], colorComponents[2], alpha), Vec3d.of(pos), + DIMENSIONS); + } + + public static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) { + context.matrixStack().push(); + context.matrixStack().translate(pos.getX() - context.camera().getPos().x, + pos.getY() - context.camera().getPos().y, pos.getZ() - context.camera().getPos().z); + BeaconBlockEntityRendererInvoker.renderBeam(context.matrixStack(), context.consumers(), context.tickDelta(), + context.world().getTime(), 0, BeaconBlockEntityRenderer.MAX_BEAM_HEIGHT, colorComponents); + context.matrixStack().pop(); + } } -- cgit From fa6c260672468ed412e65a685f89cf2e09e2f1d7 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Tue, 27 Jun 2023 13:26:28 +0800 Subject: Refactor RenderHelper --- .../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 66 ++++++++++------------ 1 file changed, 29 insertions(+), 37 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java index 3c3e30d1..2e942905 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java @@ -10,41 +10,33 @@ import net.minecraft.util.math.Vec3d; import java.awt.*; public class RenderHelper { - private static final Vec3d DIMENSIONS = new Vec3d(1, 1, 1); - - public static void renderFilledThroughWallsWithBeaconBeam(WorldRenderContext context, BlockPos pos, - float[] colorComponents, float alpha) { - renderFilledThroughWalls(context, pos, colorComponents, alpha); - renderBeaconBeam(context, pos, colorComponents); - } - - public static void renderFilledThroughWalls(WorldRenderContext context, BlockPos pos, float[] colorComponents, - float alpha) { - Renderer3d.renderThroughWalls(); - renderFilled(context, pos, colorComponents, alpha); - Renderer3d.stopRenderThroughWalls(); - } - - public static void renderFilledIfVisible(WorldRenderContext context, BlockPos pos, float[] colorComponents, - float alpha) { - if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, - pos.getZ() + 1)) { - renderFilled(context, pos, colorComponents, alpha); - } - } - - public static void renderFilled(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { - Renderer3d.renderFilled(context.matrixStack(), - new Color(colorComponents[0], colorComponents[1], colorComponents[2], alpha), Vec3d.of(pos), - DIMENSIONS); - } - - public static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) { - context.matrixStack().push(); - context.matrixStack().translate(pos.getX() - context.camera().getPos().x, - pos.getY() - context.camera().getPos().y, pos.getZ() - context.camera().getPos().z); - BeaconBlockEntityRendererInvoker.renderBeam(context.matrixStack(), context.consumers(), context.tickDelta(), - context.world().getTime(), 0, BeaconBlockEntityRenderer.MAX_BEAM_HEIGHT, colorComponents); - context.matrixStack().pop(); - } + private static final Vec3d ONE = new Vec3d(1, 1, 1); + + public static void renderFilledThroughWallsWithBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + renderFilledThroughWalls(context, pos, colorComponents, alpha); + renderBeaconBeam(context, pos, colorComponents); + } + + public static void renderFilledThroughWalls(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + Renderer3d.renderThroughWalls(); + renderFilled(context, pos, colorComponents, alpha); + Renderer3d.stopRenderThroughWalls(); + } + + public static void renderFilledIfVisible(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { + renderFilled(context, pos, colorComponents, alpha); + } + } + + public static void renderFilled(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + Renderer3d.renderFilled(context.matrixStack(), new Color(colorComponents[0], colorComponents[1], colorComponents[2], alpha), Vec3d.of(pos), ONE); + } + + public static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) { + context.matrixStack().push(); + context.matrixStack().translate(pos.getX() - context.camera().getPos().x, pos.getY() - context.camera().getPos().y, pos.getZ() - context.camera().getPos().z); + BeaconBlockEntityRendererInvoker.renderBeam(context.matrixStack(), context.consumers(), context.tickDelta(), context.world().getTime(), 0, BeaconBlockEntityRenderer.MAX_BEAM_HEIGHT, colorComponents); + context.matrixStack().pop(); + } } -- cgit From c3dd9419010ba36647ee330ffb4e6873359d494a Mon Sep 17 00:00:00 2001 From: Futuremappermydud <54294576+Futuremappermydud@users.noreply.github.com> Date: Thu, 29 Jun 2023 06:18:23 -0400 Subject: Implement Vampire Slayer Features (#191) Implement Vampire Slayer Features Co-authored-by: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> --- .../skyblocker/config/SkyblockerConfig.java | 39 +++++++++-- .../skyblocker/mixin/ClientPlayerEntityMixin.java | 8 +++ .../xmrvizzy/skyblocker/mixin/InGameHudMixin.java | 8 +-- .../skyblocker/skyblock/FancyStatusBars.java | 28 ++++---- .../skyblocker/skyblock/FishingHelper.java | 8 +-- .../skyblocker/skyblock/rift/EffigyWaypoints.java | 79 ++++++++++++++++++++++ .../skyblock/rift/HealingMelonIndicator.java | 21 ++++++ .../skyblock/rift/MirrorverseWaypoints.java | 2 +- .../skyblocker/skyblock/rift/StakeIndicator.java | 21 ++++++ .../xmrvizzy/skyblocker/skyblock/rift/TheRift.java | 17 +++-- .../skyblock/rift/TwinClawsIndicator.java | 32 +++++++++ .../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 17 +++++ .../me/xmrvizzy/skyblocker/utils/SlayerUtils.java | 66 ++++++++++++++++++ .../java/me/xmrvizzy/skyblocker/utils/Utils.java | 5 ++ .../resources/assets/skyblocker/lang/en_us.json | 19 ++++++ 15 files changed, 337 insertions(+), 33 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/SlayerUtils.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 988f5f77..4b1398e0 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -30,6 +30,10 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Gui.TransitiveObject public Locations locations = new Locations(); + @ConfigEntry.Category("slayer") + @ConfigEntry.Gui.TransitiveObject + public Slayer slayer = new Slayer(); + @ConfigEntry.Category("quickNav") @ConfigEntry.Gui.TransitiveObject public QuickNav quickNav = new QuickNav(); @@ -177,7 +181,7 @@ public class SkyblockerConfig implements ConfigData { public static class TabHudConf { public boolean tabHudEnabled = true; - @ConfigEntry.BoundedDiscrete(min=10, max=200) + @ConfigEntry.BoundedDiscrete(min = 10, max = 200) @ConfigEntry.Gui.Tooltip() public int tabHudScale = 100; } @@ -289,7 +293,7 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Category("dwarvenmines") @ConfigEntry.Gui.CollapsibleObject() public DwarvenMines dwarvenMines = new DwarvenMines(); - + @ConfigEntry.Category("rift") @ConfigEntry.Gui.CollapsibleObject() public Rift rift = new Rift(); @@ -348,7 +352,7 @@ public class SkyblockerConfig implements ConfigData { CLASSIC; @Override - public String toString() { + public String toString() { return switch (this) { case SIMPLE -> "Simple"; case FANCY -> "Fancy"; @@ -361,9 +365,34 @@ public class SkyblockerConfig implements ConfigData { public boolean solveHungryHiker = true; public boolean solveTreasureHunter = true; } - + public static class Rift { - public boolean mirrorverseWaypoints = true; + public boolean mirrorverseWaypoints = true; + } + + public static class Slayer { + @ConfigEntry.Category("vampire") + @ConfigEntry.Gui.CollapsibleObject() + public VampireSlayer vampireSlayer = new VampireSlayer(); + } + + public static class VampireSlayer { + public boolean enableEffigyWaypoints = true; + public boolean compactEffigyWaypoints; + @ConfigEntry.BoundedDiscrete(min = 1, max = 10) + @ConfigEntry.Gui.Tooltip() + public int effigyUpdateFrequency = 5; + public boolean enableHolyIceIndicator = true; + public int holyIceIndicatorTickDelay = 10; + @ConfigEntry.BoundedDiscrete(min = 1, max = 10) + @ConfigEntry.Gui.Tooltip() + public int holyIceUpdateFrequency = 5; + public boolean enableHealingMelonIndicator = true; + public float healingMelonHealthThreshold = 4F; + public boolean enableSteakStakeIndicator = true; + @ConfigEntry.BoundedDiscrete(min = 1, max = 10) + @ConfigEntry.Gui.Tooltip() + public int steakStakeUpdateFrequency = 5; } public static class Messages { diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java index 76c4e8ec..e48e725e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java @@ -2,13 +2,16 @@ package me.xmrvizzy.skyblocker.mixin; import com.mojang.authlib.GameProfile; import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; +import me.xmrvizzy.skyblocker.skyblock.rift.HealingMelonIndicator; import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.network.ClientPlayerEntity; 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) @@ -21,4 +24,9 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity public void skyblocker$dropSelectedItem(boolean dropEntireStack, CallbackInfoReturnable cir) { if (Utils.isOnSkyblock()) HotbarSlotLock.handleDropSelectedItem(this.getInventory().selectedSlot, cir); } + + @Inject(method = "updateHealth", at = @At("HEAD")) + public void skyblocker$updateHealth(float health, CallbackInfo info) { + HealingMelonIndicator.updateHealth(MinecraftClient.getInstance()); + } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java index 4c89d497..7d9182b5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java @@ -6,13 +6,11 @@ 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.skyblock.rift.TheRift; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; @@ -54,7 +52,7 @@ public abstract class InGameHudMixin { @Inject(method = "setOverlayMessage(Lnet/minecraft/text/Text;Z)V", at = @At("HEAD"), cancellable = true) private void skyblocker$onSetOverlayMessage(Text message, boolean tinted, CallbackInfo ci) { - if (!Utils.isOnSkyblock() || !SkyblockerConfig.get().general.bars.enableBars || Utils.getLocationRaw().equals(TheRift.LOCATION)) + if (!Utils.isOnSkyblock() || !SkyblockerConfig.get().general.bars.enableBars || Utils.isInTheRift()) return; String msg = message.getString(); String res = statusBarTracker.update(msg, SkyblockerConfig.get().messages.hideMana); @@ -85,7 +83,7 @@ public abstract class InGameHudMixin { @Inject(method = "renderExperienceBar", at = @At("HEAD"), cancellable = true) private void skyblocker$renderExperienceBar(DrawContext context, int x, CallbackInfo ci) { - if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars && !Utils.getLocationRaw().equals(TheRift.LOCATION)) + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars && !Utils.isInTheRift()) ci.cancel(); } @@ -104,7 +102,7 @@ public abstract class InGameHudMixin { @Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true) private void skyblocker$renderMountHealth(DrawContext context, CallbackInfo ci) { - if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars && !Utils.getLocationRaw().equals(TheRift.LOCATION)) + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars && !Utils.isInTheRift()) ci.cancel(); } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java index 8e0d43da..1a460f5b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java @@ -2,7 +2,6 @@ package me.xmrvizzy.skyblocker.skyblock; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; @@ -11,7 +10,6 @@ import net.minecraft.util.Identifier; public class FancyStatusBars { private static final Identifier BARS = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/bars.png"); - private static final String RIFT_LOCATION = "rift"; private final MinecraftClient client = MinecraftClient.getInstance(); private final StatusBarTracker statusBarTracker = SkyblockerMod.getInstance().statusBarTracker; @@ -42,7 +40,7 @@ public class FancyStatusBars { public boolean render(DrawContext context, int scaledWidth, int scaledHeight) { var player = client.player; - if (!SkyblockerConfig.get().general.bars.enableBars || player == null || Utils.getLocationRaw().equals(TheRift.LOCATION)) + if (!SkyblockerConfig.get().general.bars.enableBars || player == null || Utils.isInTheRift()) return false; anchorsX[0] = scaledWidth / 2 - 91; anchorsY[0] = scaledHeight - 33; @@ -73,10 +71,12 @@ public class FancyStatusBars { moveBar(i, configAnchorNum); } - for (var bar : bars) + for (var bar : bars) { bar.draw(context); - for (var bar : bars) + } + for (var bar : bars) { bar.drawText(context); + } return true; } @@ -152,19 +152,23 @@ public class FancyStatusBars { // Draw the background for the bar context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10, anchorsY[anchorNum], 10, v, 2, 9); - for (int i = 2; i < bar_width - 2; i += 58) + for (int i = 2; i < bar_width - 2; i += 58) { context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10 + i, anchorsY[anchorNum], 12, v, Math.min(58, bar_width - 2 - i), 9); + } context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10 + bar_width - 2, anchorsY[anchorNum], 70, v, 2, 9); // Draw the filled part of the bar for (int i = 0; i < fill.length; i++) { int fill_width = this.fill[i] * (bar_width - 2) / 100; - if (fill_width >= 1) - context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11, anchorsY[anchorNum], 72 + i*60, v, 1, 9); - for (int j = 1; j < fill_width - 1; j += 58) - context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + j, anchorsY[anchorNum], 73 + i*60, v, Math.min(58, fill_width - 1 - j), 9); - if (fill_width == bar_width - 2) - context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + fill_width - 1, anchorsY[anchorNum], 131 + i*60, v, 1, 9); + if (fill_width >= 1) { + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11, anchorsY[anchorNum], 72 + i * 60, v, 1, 9); + } + for (int j = 1; j < fill_width - 1; j += 58) { + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + j, anchorsY[anchorNum], 73 + i * 60, v, Math.min(58, fill_width - 1 - j), 9); + } + if (fill_width == bar_width - 2) { + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + fill_width - 1, anchorsY[anchorNum], 131 + i * 60, v, 1, 9); + } } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java index d82464e1..822b89d9 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java @@ -1,6 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.RenderHelper; import net.fabricmc.fabric.api.event.player.UseItemCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; @@ -8,10 +9,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.FishingRodItem; import net.minecraft.item.ItemStack; import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; -import net.minecraft.sound.SoundEvent; -import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import net.minecraft.util.Identifier; import net.minecraft.util.TypedActionResult; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -51,9 +49,7 @@ public class FishingHelper { if (player != null && player.fishHook != null) { Vec3d soundToFishHook = player.fishHook.getPos().subtract(packet.getX(), 0, packet.getZ()); if (Math.abs(normalYawVector.x * soundToFishHook.z - normalYawVector.z * soundToFishHook.x) < 0.2D && Math.abs(normalYawVector.dotProduct(soundToFishHook)) < 4D && player.getPos().squaredDistanceTo(packet.getX(), packet.getY(), packet.getZ()) > 1D) { - client.inGameHud.setTitleTicks(0, 10, 5); - client.inGameHud.setTitle(Text.translatable("skyblocker.fishing.reelNow").formatted(Formatting.GREEN)); - player.playSound(SoundEvent.of(new Identifier("minecraft", "entity.experience_orb.pickup")), 100f, 0.1f); + RenderHelper.displayTitleAndPlaySound(10, 5, "skyblocker.fishing.reelNow", Formatting.GREEN); reset(); } } else { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java new file mode 100644 index 00000000..0d44900a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java @@ -0,0 +1,79 @@ +package me.xmrvizzy.skyblocker.skyblock.rift; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.RenderHelper; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraft.scoreboard.ScoreboardObjective; +import net.minecraft.scoreboard.ScoreboardPlayerScore; +import net.minecraft.scoreboard.Team; +import net.minecraft.text.Text; +import net.minecraft.text.TextColor; +import net.minecraft.util.DyeColor; +import net.minecraft.util.math.BlockPos; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +public class EffigyWaypoints { + private static final Logger LOGGER = LoggerFactory.getLogger(EffigyWaypoints.class); + private static final List effigies = List.of( + new BlockPos(150, 79, 95), //Effigy 1 + new BlockPos(193, 93, 119), //Effigy 2 + new BlockPos(235, 110, 147), //Effigy 3 + new BlockPos(293, 96, 134), //Effigy 4 + new BlockPos(262, 99, 94), //Effigy 5 + new BlockPos(240, 129, 118) //Effigy 6 + ); + private static final List unBrokenEffigies = new ArrayList<>(); + + public static void updateEffigies() { + if (!SkyblockerConfig.get().slayer.vampireSlayer.enableEffigyWaypoints || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) return; + + unBrokenEffigies.clear(); + try { + ClientPlayerEntity player = MinecraftClient.getInstance().player; + if (player == null) return; + Scoreboard scoreboard = player.getScoreboard(); + ScoreboardObjective objective = scoreboard.getObjectiveForSlot(1); + for (ScoreboardPlayerScore score : scoreboard.getAllPlayerScores(objective)) { + Team team = scoreboard.getPlayerTeam(score.getPlayerName()); + if (team != null) { + String line = team.getPrefix().getString() + team.getSuffix().getString(); + if (line.contains("Effigies")) { + List newList = new ArrayList<>(team.getPrefix().getSiblings()); + newList.addAll(team.getSuffix().getSiblings()); + for (int i = 1; i < newList.size(); i++) { + if (newList.get(i).getStyle().getColor() == TextColor.parse("gray")) { + unBrokenEffigies.add(effigies.get(i - 1)); + } + } + } + } + } + } catch (NullPointerException e) { + LOGGER.error("[Skyblocker] Error while updating effigies.", e); + } + } + + public static void render(WorldRenderContext context) { + if (SkyblockerConfig.get().slayer.vampireSlayer.enableEffigyWaypoints && Utils.getLocation().contains("Stillgore Château")) { + for (BlockPos effigy : unBrokenEffigies) { + float[] colorComponents = DyeColor.RED.getColorComponents(); + if (SkyblockerConfig.get().slayer.vampireSlayer.compactEffigyWaypoints) { + RenderHelper.renderFilledThroughWallsWithBeaconBeam(context, effigy.down(6), colorComponents, 0.5F); + } else { + RenderHelper.renderFilledThroughWallsWithBeaconBeam(context, effigy, colorComponents, 0.5F); + for (int i = 1; i < 6; i++) { + RenderHelper.renderFilledThroughWalls(context, effigy.down(i), colorComponents, 0.5F - (0.075F * i)); + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java new file mode 100644 index 00000000..f98c17e7 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java @@ -0,0 +1,21 @@ +package me.xmrvizzy.skyblocker.skyblock.rift; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.RenderHelper; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.util.Formatting; + +public class HealingMelonIndicator { + private static long lastDisplayTime = 0; + + public static void updateHealth(MinecraftClient client) { + if (!SkyblockerConfig.get().slayer.vampireSlayer.enableHealingMelonIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) return; + ClientPlayerEntity player = client.player; + if (player != null && player.getHealth() <= SkyblockerConfig.get().slayer.vampireSlayer.healingMelonHealthThreshold * 2F && System.currentTimeMillis() - lastDisplayTime > 2500) { + lastDisplayTime = System.currentTimeMillis(); + RenderHelper.displayTitleAndPlaySound(15, 5, "skyblocker.rift.healNow", Formatting.DARK_RED); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java index 630d953b..276ec551 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java @@ -71,7 +71,7 @@ public class MirrorverseWaypoints { public static void render(WorldRenderContext wrc) { //I would also check for the mirrorverse location but the scoreboard stuff is not performant at all... - if (Utils.getLocationRaw().equals(TheRift.LOCATION) && SkyblockerConfig.get().locations.rift.mirrorverseWaypoints) { + if (Utils.isInTheRift() && SkyblockerConfig.get().locations.rift.mirrorverseWaypoints) { for (BlockPos pos : LAVA_PATH_WAYPOINTS) { RenderHelper.renderFilledIfVisible(wrc, pos, COLOR_COMPONENTS, 0.5f); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java new file mode 100644 index 00000000..d1132be8 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java @@ -0,0 +1,21 @@ +package me.xmrvizzy.skyblocker.skyblock.rift; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.RenderHelper; +import me.xmrvizzy.skyblocker.utils.SlayerUtils; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.entity.Entity; +import net.minecraft.util.Formatting; + +public class StakeIndicator { + private static long lastDisplayTime = 0; + + public static void updateStake() { + if (!SkyblockerConfig.get().slayer.vampireSlayer.enableSteakStakeIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château") || !SlayerUtils.isInSlayer()) return; + Entity slayerEntity = SlayerUtils.getSlayerEntity(); + if (slayerEntity != null && slayerEntity.getDisplayName().toString().contains("҉") && System.currentTimeMillis() - lastDisplayTime > 2500) { + lastDisplayTime = System.currentTimeMillis(); + RenderHelper.displayTitleAndPlaySound(25, 5, "skyblocker.rift.stakeNow", Formatting.RED); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java index 24f92238..91b727e2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java @@ -1,11 +1,20 @@ package me.xmrvizzy.skyblocker.skyblock.rift; +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; public class TheRift { - public static final String LOCATION = "rift"; + /** + * @see me.xmrvizzy.skyblocker.utils.Utils#isInTheRift() Utils#isInTheRift(). + */ + public static final String LOCATION = "rift"; - public static void init() { - WorldRenderEvents.AFTER_TRANSLUCENT.register(MirrorverseWaypoints::render); - } + public static void init() { + WorldRenderEvents.AFTER_TRANSLUCENT.register(MirrorverseWaypoints::render); + WorldRenderEvents.AFTER_TRANSLUCENT.register(EffigyWaypoints::render); + SkyblockerMod.getInstance().scheduler.scheduleCyclic(EffigyWaypoints::updateEffigies, SkyblockerConfig.get().slayer.vampireSlayer.effigyUpdateFrequency); + SkyblockerMod.getInstance().scheduler.scheduleCyclic(TwinClawsIndicator::updateIce, SkyblockerConfig.get().slayer.vampireSlayer.holyIceUpdateFrequency); + SkyblockerMod.getInstance().scheduler.scheduleCyclic(StakeIndicator::updateStake, SkyblockerConfig.get().slayer.vampireSlayer.steakStakeUpdateFrequency); + } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java new file mode 100644 index 00000000..7e1d6605 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java @@ -0,0 +1,32 @@ +package me.xmrvizzy.skyblocker.skyblock.rift; + +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.RenderHelper; +import me.xmrvizzy.skyblocker.utils.SlayerUtils; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.entity.Entity; +import net.minecraft.util.Formatting; + +public class TwinClawsIndicator { + private static long lastDisplayTime = 0; + + public static void updateIce() { + if (!SkyblockerConfig.get().slayer.vampireSlayer.enableHolyIceIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) return; + + Entity slayerEntity = SlayerUtils.getSlayerEntity(); + if (slayerEntity == null) return; + + for (Entity entity : SlayerUtils.getEntityArmorStands(slayerEntity)) { + if (entity.getDisplayName().toString().contains("TWINCLAWS")) { + SkyblockerMod.getInstance().scheduler.schedule(() -> { + if (System.currentTimeMillis() - lastDisplayTime > 2500) { + lastDisplayTime = System.currentTimeMillis(); + RenderHelper.displayTitleAndPlaySound(40, 5, "skyblocker.rift.iceNow", Formatting.AQUA); + } + }, SkyblockerConfig.get().slayer.vampireSlayer.holyIceIndicatorTickDelay); + } + } + + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java index 2e942905..a7e1fc99 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java @@ -3,7 +3,12 @@ package me.xmrvizzy.skyblocker.utils; import me.x150.renderer.render.Renderer3d; import me.xmrvizzy.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer; +import net.minecraft.sound.SoundEvent; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -39,4 +44,16 @@ public class RenderHelper { BeaconBlockEntityRendererInvoker.renderBeam(context.matrixStack(), context.consumers(), context.tickDelta(), context.world().getTime(), 0, BeaconBlockEntityRenderer.MAX_BEAM_HEIGHT, colorComponents); context.matrixStack().pop(); } + + public static void displayTitleAndPlaySound(int stayTicks, int fadeOutTicks, String titleKey, Formatting formatting) { + MinecraftClient.getInstance().inGameHud.setTitleTicks(0, stayTicks, fadeOutTicks); + MinecraftClient.getInstance().inGameHud.setTitle(Text.translatable(titleKey).formatted(formatting)); + playNotificationSound(); + } + + private static void playNotificationSound() { + if (MinecraftClient.getInstance().player != null) { + MinecraftClient.getInstance().player.playSound(SoundEvent.of(new Identifier("entity.experience_orb.pickup")), 100f, 0.1f); + } + } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/SlayerUtils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/SlayerUtils.java new file mode 100644 index 00000000..6bc09456 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/SlayerUtils.java @@ -0,0 +1,66 @@ +package me.xmrvizzy.skyblocker.utils; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraft.scoreboard.ScoreboardObjective; +import net.minecraft.scoreboard.ScoreboardPlayerScore; +import net.minecraft.scoreboard.Team; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +//TODO Slayer Packet system that can provide information about the current slayer boss, abstract so that different bosses can have different info +public class SlayerUtils { + private static final Logger LOGGER = LoggerFactory.getLogger(SlayerUtils.class); + + //TODO: Cache this, probably included in Packet system + public static List getEntityArmorStands(Entity entity) { + return entity.getEntityWorld().getOtherEntities(entity, entity.getBoundingBox().expand(1F, 2.5F, 1F), x -> x instanceof ArmorStandEntity && x.hasCustomName()); + } + + //Eventually this should be modified so that if you hit a slayer boss all slayer features will work on that boss. + public static Entity getSlayerEntity() { + if (MinecraftClient.getInstance().world != null) { + for (Entity entity : MinecraftClient.getInstance().world.getEntities()) { + //Check if entity is Bloodfiend + if (entity.hasCustomName() && entity.getCustomName().getString().contains("Bloodfiend")) { + //Grab the players username + String username = MinecraftClient.getInstance().getSession().getUsername(); + //Check all armor stands around the boss + for (Entity armorStand : getEntityArmorStands(entity)) { + //Check if the display name contains the players username + if (armorStand.getDisplayName().getString().contains(username)) { + return entity; + } + } + } + } + } + return null; + } + + public static boolean isInSlayer() { + try { + ClientPlayerEntity client = MinecraftClient.getInstance().player; + if (client == null) return false; + Scoreboard scoreboard = MinecraftClient.getInstance().player.getScoreboard(); + ScoreboardObjective objective = scoreboard.getObjectiveForSlot(1); + for (ScoreboardPlayerScore score : scoreboard.getAllPlayerScores(objective)) { + Team team = scoreboard.getPlayerTeam(score.getPlayerName()); + if (team != null) { + String line = team.getPrefix().getString() + team.getSuffix().getString(); + if (line.contains("Slay the boss!")) { + return true; + } + } + } + } catch (NullPointerException e) { + LOGGER.error("[Skyblocker] Error while checking if player is in slayer", e); + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index d961ba7e..35dfd368 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -4,6 +4,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; +import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; @@ -52,6 +53,10 @@ public class Utils { return isInDungeons; } + public static boolean isInTheRift() { + return getLocationRaw().equals(TheRift.LOCATION); + } + public static boolean isInjected() { return isInjected; } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index d18e180e..647092a9 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -220,6 +220,22 @@ "text.autoconfig.skyblocker.option.messages.hideMana": "Hide Mana Consumption Messages from Action Bar", "text.autoconfig.skyblocker.option.messages.hideMana.@Tooltip": "Gives a better experience with FancyBar", + "text.autoconfig.skyblocker.category.slayer": "Slayers", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer": "Vampire Slayer", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableEffigyWaypoints": "Enable Effigy Waypoints", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.compactEffigyWaypoints": "Compact Effigy Waypoints", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.effigyUpdateFrequency": "Effigy Waypoints Update Frequency (Ticks)", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.effigyUpdateFrequency.@Tooltip": "The lower the value, the more frequent the updates, which may cause lag.", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableHolyIceIndicator": "Enable Holy Ice Indicator", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.holyIceIndicatorTickDelay": "Holy Ice Indicator Delay (Ticks)", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.holyIceUpdateFrequency": "Holy Ice Indicator Update Frequency (Ticks)", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.holyIceUpdateFrequency.@Tooltip": "The lower the value, the more frequent the updates, which may cause lag.", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableHealingMelonIndicator": "Enable Healing Melon Indicator", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.healingMelonHealthThreshold": "Healing Melon Indicator Threshold (Hearts)", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableSteakStakeIndicator": "Enable Steak Stake Indicator", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.steakStakeUpdateFrequency": "Steak Stake Indicator Update Frequency (Ticks)", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.steakStakeUpdateFrequency.@Tooltip": "The lower the value, the more frequent the updates, which may cause lag.", + "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.", @@ -232,6 +248,9 @@ "skyblocker.api.got_key": "§b[§6Skyblocker§b] §2Automatically set your API key!", "skyblocker.fishing.reelNow": "Reel in now!", + "skyblocker.rift.healNow": "Heal now!", + "skyblocker.rift.iceNow": "Ice now!", + "skyblocker.rift.stakeNow": "Stake now!", "skyblocker.fairySouls.markAllFound": "Marked all fairy souls in the current island as found", "skyblocker.fairySouls.markAllMissing": "Marked all fairy souls in the current island as missing" } -- cgit From 64e1de1f4f857d4c126b7610b008120a61f118d2 Mon Sep 17 00:00:00 2001 From: Futuremappermydud <54294576+Futuremappermydud@users.noreply.github.com> Date: Tue, 4 Jul 2023 20:19:40 -0400 Subject: New Slayer Stuff Implement TitleContainer for stacking titles. Implement Mania Indicator to show the player when they are standing on green terracotta during mania. --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 2 + .../skyblocker/config/SkyblockerConfig.java | 4 ++ .../skyblock/rift/HealingMelonIndicator.java | 26 +++++-- .../skyblocker/skyblock/rift/ManiaIndicator.java | 46 ++++++++++++ .../skyblocker/skyblock/rift/StakeIndicator.java | 25 +++++-- .../xmrvizzy/skyblocker/skyblock/rift/TheRift.java | 1 + .../skyblock/rift/TwinClawsIndicator.java | 36 +++++++--- .../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 7 ++ .../me/xmrvizzy/skyblocker/utils/title/Title.java | 13 ++++ .../skyblocker/utils/title/TitleContainer.java | 82 ++++++++++++++++++++++ .../resources/assets/skyblocker/lang/en_us.json | 4 ++ 11 files changed, 224 insertions(+), 22 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index a629f851..4688d90f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -20,6 +20,7 @@ import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.utils.*; +import me.xmrvizzy.skyblocker.utils.title.TitleContainer; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.loader.api.FabricLoader; @@ -84,6 +85,7 @@ public class SkyblockerMod implements ClientModInitializer { TabHud.init(); DungeonMap.init(); TheRift.init(); + TitleContainer.init(); containerSolverManager.init(); scheduler.scheduleCyclic(Utils::update, 20); scheduler.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 100); diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 26e59b40..ab4149fc 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -399,6 +399,10 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.BoundedDiscrete(min = 1, max = 10) @ConfigEntry.Gui.Tooltip() public int steakStakeUpdateFrequency = 5; + public boolean enableManiaIndicator = true; + @ConfigEntry.BoundedDiscrete(min = 1, max = 10) + @ConfigEntry.Gui.Tooltip() + public int maniaUpdateFrequency = 5; } public static class Messages { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java index f98c17e7..050c300f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java @@ -3,19 +3,33 @@ package me.xmrvizzy.skyblocker.skyblock.rift; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.RenderHelper; import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.title.Title; +import me.xmrvizzy.skyblocker.utils.title.TitleContainer; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.text.Text; import net.minecraft.util.Formatting; public class HealingMelonIndicator { - private static long lastDisplayTime = 0; - + private static Title title = null; public static void updateHealth(MinecraftClient client) { - if (!SkyblockerConfig.get().slayer.vampireSlayer.enableHealingMelonIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) return; + if(title == null) + new Title(I18n.translate("skyblocker.rift.healNow"), Formatting.DARK_RED.getColorValue()); + + if (!SkyblockerConfig.get().slayer.vampireSlayer.enableHealingMelonIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) { + title.active = false; + return; + } + title.active = true; ClientPlayerEntity player = client.player; - if (player != null && player.getHealth() <= SkyblockerConfig.get().slayer.vampireSlayer.healingMelonHealthThreshold * 2F && System.currentTimeMillis() - lastDisplayTime > 2500) { - lastDisplayTime = System.currentTimeMillis(); - RenderHelper.displayTitleAndPlaySound(15, 5, "skyblocker.rift.healNow", Formatting.DARK_RED); + if (player != null && player.getHealth() <= SkyblockerConfig.get().slayer.vampireSlayer.healingMelonHealthThreshold * 2F) { + title.active = true; + if(!TitleContainer.titles.contains(title)) + RenderHelper.displayInTitleContainerAndPlaySound(title); + } + else { + title.active = false; } } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java new file mode 100644 index 00000000..7d5a1cb4 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java @@ -0,0 +1,46 @@ +package me.xmrvizzy.skyblocker.skyblock.rift; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.RenderHelper; +import me.xmrvizzy.skyblocker.utils.SlayerUtils; +import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.title.Title; +import me.xmrvizzy.skyblocker.utils.title.TitleContainer; +import net.minecraft.block.Blocks; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.entity.Entity; +import net.minecraft.util.Formatting; + +public class ManiaIndicator { + private static Title title = null; + public static void updateMania() { + if(title == null) + title = new Title("b", Formatting.RED.getColorValue()); + + if (!SkyblockerConfig.get().slayer.vampireSlayer.enableManiaIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) { + title.active = false; + return; + } + + Entity slayerEntity = SlayerUtils.getSlayerEntity(); + if (slayerEntity == null) return; + + boolean anyMania = false; + for (Entity entity : SlayerUtils.getEntityArmorStands(slayerEntity)) { + if (entity.getDisplayName().toString().contains("MANIA")) { + anyMania = true; + title.active = true; + var pos = MinecraftClient.getInstance().player.getBlockPos().down(); + var isGreen = MinecraftClient.getInstance().world.getBlockState(pos).getBlock() == Blocks.GREEN_TERRACOTTA; + title.color = isGreen ? Formatting.GREEN.getColorValue() : Formatting.RED.getColorValue(); + if(!TitleContainer.titles.contains(title)) { + title.text = I18n.translate("skyblocker.rift.mania"); + RenderHelper.displayInTitleContainerAndPlaySound(title); + } + } + } + if(!anyMania) + title.active = false; + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java index d1132be8..01b6b738 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java @@ -4,18 +4,31 @@ import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.RenderHelper; import me.xmrvizzy.skyblocker.utils.SlayerUtils; import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.title.Title; +import me.xmrvizzy.skyblocker.utils.title.TitleContainer; +import net.minecraft.client.resource.language.I18n; import net.minecraft.entity.Entity; +import net.minecraft.text.Text; import net.minecraft.util.Formatting; public class StakeIndicator { - private static long lastDisplayTime = 0; - + private static Title title = null; public static void updateStake() { - if (!SkyblockerConfig.get().slayer.vampireSlayer.enableSteakStakeIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château") || !SlayerUtils.isInSlayer()) return; + if (title == null) + title = new Title("b", Formatting.RED.getColorValue()); + + if (!SkyblockerConfig.get().slayer.vampireSlayer.enableSteakStakeIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château") || !SlayerUtils.isInSlayer()) { + title.active = false; + return; + } Entity slayerEntity = SlayerUtils.getSlayerEntity(); - if (slayerEntity != null && slayerEntity.getDisplayName().toString().contains("҉") && System.currentTimeMillis() - lastDisplayTime > 2500) { - lastDisplayTime = System.currentTimeMillis(); - RenderHelper.displayTitleAndPlaySound(25, 5, "skyblocker.rift.stakeNow", Formatting.RED); + if (slayerEntity != null && slayerEntity.getDisplayName().toString().contains("҉")) { + title.active = true; + title.text = I18n.translate("skyblocker.rift.stakeNow"); + if(!TitleContainer.titles.contains(title)) + RenderHelper.displayInTitleContainerAndPlaySound(title); } + else + title.active = false; } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java index 91b727e2..5ca89dcf 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java @@ -15,6 +15,7 @@ public class TheRift { WorldRenderEvents.AFTER_TRANSLUCENT.register(EffigyWaypoints::render); SkyblockerMod.getInstance().scheduler.scheduleCyclic(EffigyWaypoints::updateEffigies, SkyblockerConfig.get().slayer.vampireSlayer.effigyUpdateFrequency); SkyblockerMod.getInstance().scheduler.scheduleCyclic(TwinClawsIndicator::updateIce, SkyblockerConfig.get().slayer.vampireSlayer.holyIceUpdateFrequency); + SkyblockerMod.getInstance().scheduler.scheduleCyclic(ManiaIndicator::updateMania, SkyblockerConfig.get().slayer.vampireSlayer.maniaUpdateFrequency); SkyblockerMod.getInstance().scheduler.scheduleCyclic(StakeIndicator::updateStake, SkyblockerConfig.get().slayer.vampireSlayer.steakStakeUpdateFrequency); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java index 7e1d6605..a062f7b7 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java @@ -5,28 +5,44 @@ import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.RenderHelper; import me.xmrvizzy.skyblocker.utils.SlayerUtils; import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.title.Title; +import me.xmrvizzy.skyblocker.utils.title.TitleContainer; +import net.minecraft.client.resource.language.I18n; import net.minecraft.entity.Entity; +import net.minecraft.text.Text; import net.minecraft.util.Formatting; public class TwinClawsIndicator { - private static long lastDisplayTime = 0; - + private static Title title = null; + public static boolean scheduling = false; public static void updateIce() { - if (!SkyblockerConfig.get().slayer.vampireSlayer.enableHolyIceIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) return; + if(title == null) + title = new Title("b", Formatting.AQUA.getColorValue()); + + if (!SkyblockerConfig.get().slayer.vampireSlayer.enableHolyIceIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) { + title.active = false; + return; + } Entity slayerEntity = SlayerUtils.getSlayerEntity(); if (slayerEntity == null) return; + boolean anyClaws = false; for (Entity entity : SlayerUtils.getEntityArmorStands(slayerEntity)) { if (entity.getDisplayName().toString().contains("TWINCLAWS")) { - SkyblockerMod.getInstance().scheduler.schedule(() -> { - if (System.currentTimeMillis() - lastDisplayTime > 2500) { - lastDisplayTime = System.currentTimeMillis(); - RenderHelper.displayTitleAndPlaySound(40, 5, "skyblocker.rift.iceNow", Formatting.AQUA); - } - }, SkyblockerConfig.get().slayer.vampireSlayer.holyIceIndicatorTickDelay); + anyClaws = true; + title.active = true; + if(!TitleContainer.titles.contains(title) && !scheduling) { + scheduling = true; + SkyblockerMod.getInstance().scheduler.schedule(() -> { + title.text = I18n.translate("skyblocker.rift.iceNow"); + RenderHelper.displayInTitleContainerAndPlaySound(title); + scheduling = false; + }, SkyblockerConfig.get().slayer.vampireSlayer.holyIceIndicatorTickDelay); + } } } - + if(!anyClaws) + title.active = false; } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java index a7e1fc99..e75538f6 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java @@ -2,6 +2,8 @@ package me.xmrvizzy.skyblocker.utils; import me.x150.renderer.render.Renderer3d; import me.xmrvizzy.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker; +import me.xmrvizzy.skyblocker.utils.title.Title; +import me.xmrvizzy.skyblocker.utils.title.TitleContainer; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer; @@ -51,6 +53,11 @@ public class RenderHelper { playNotificationSound(); } + public static void displayInTitleContainerAndPlaySound(Title title) { + TitleContainer.addTitle(title); + playNotificationSound(); + } + private static void playNotificationSound() { if (MinecraftClient.getInstance().player != null) { MinecraftClient.getInstance().player.playSound(SoundEvent.of(new Identifier("entity.experience_orb.pickup")), 100f, 0.1f); diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java new file mode 100644 index 00000000..44a636d7 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java @@ -0,0 +1,13 @@ +package me.xmrvizzy.skyblocker.utils.title; + +public class Title { + public String text = ""; + public boolean active = true; + public int color; + public float lastX = 0; + + public Title(String text, int color) { + this.text = text; + this.color = color; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java new file mode 100644 index 00000000..c8747596 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java @@ -0,0 +1,82 @@ +package me.xmrvizzy.skyblocker.utils.title; + +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.skyblock.FairySouls; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.entity.decoration.DisplayEntity; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.MathHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; + +public class TitleContainer { + public static List titles = new ArrayList<>(); + private static final Logger LOGGER = LoggerFactory.getLogger("skyblocker"); + public static void init() { + HudRenderCallback.EVENT.register(TitleContainer::draw); + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE) + .then(literal("title") + .then(literal("ice").executes(context -> { + titles.add(new Title(Text.translatable("skyblocker.rift.iceNow").getString(), Formatting.AQUA.getColorValue())); + return 1; + })) + .then(literal("stake").executes(context -> { + titles.add(new Title("Stake", Formatting.RED.getColorValue())); + return 1; + })) + .then(literal("heal").executes(context -> { + titles.add(new Title("Heal", Formatting.DARK_RED.getColorValue())); + return 1; + })) + ))); + } + public static void addTitle(Title title) + { + title.active = true; + title.lastX = 0; + titles.add(title); + } + public static void draw(DrawContext context, float tickDelta) { + var client = MinecraftClient.getInstance(); + TextRenderer textRenderer = client.textRenderer; + + List<Title> toRemove = new ArrayList<>(); + + float x; + float width = 0; + context.getMatrices().push(); + context.getMatrices().scale(3.0F, 3.0F, 3.0F); + for (Title title : titles) { + width += textRenderer.getWidth(title.text) * 3F + 10; + } + context.getMatrices().pop(); + + x = (client.getWindow().getScaledWidth() / 2) - width / 2; + + for (Title title : titles) { + context.getMatrices().push(); + context.getMatrices().translate(title.lastX, client.getWindow().getScaledHeight() * 0.6F, 0); + context.getMatrices().scale(3.0F, 3.0F, 3.0F); + + title.lastX = MathHelper.lerp(tickDelta * 0.5F, title.lastX, x); + x += textRenderer.getWidth(title.text) * 3F + 10; + context.drawText(textRenderer, title.text, 0, 0, title.color, true + ); + context.getMatrices().pop(); + if (!title.active) { + toRemove.add(title); + } + } + titles.removeAll(toRemove); + } +} \ No newline at end of file diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 20c2c27f..4686c31a 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -240,6 +240,9 @@ "text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableSteakStakeIndicator": "Enable Steak Stake Indicator", "text.autoconfig.skyblocker.option.slayer.vampireSlayer.steakStakeUpdateFrequency": "Steak Stake Indicator Update Frequency (Ticks)", "text.autoconfig.skyblocker.option.slayer.vampireSlayer.steakStakeUpdateFrequency.@Tooltip": "The lower the value, the more frequent the updates, which may cause lag.", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableManiaIndicator": "Enable Mania Block Indicator", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.maniaUpdateFrequency": "Mania Indicator Update Frequency (Ticks)", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.maniaUpdateFrequency.@Tooltip": "The lower the value, the more frequent the updates, which may cause lag.", "skyblocker.update.update_message": "§b[§6Skyblocker§b] §2There is a new version available!", "skyblocker.update.update_link": " §2§nClick here§r", @@ -255,6 +258,7 @@ "skyblocker.fishing.reelNow": "Reel in now!", "skyblocker.rift.healNow": "Heal now!", "skyblocker.rift.iceNow": "Ice now!", + "skyblocker.rift.mania": "Mania!", "skyblocker.rift.stakeNow": "Stake now!", "skyblocker.fairySouls.markAllFound": "Marked all fairy souls in the current island as found", "skyblocker.fairySouls.markAllMissing": "Marked all fairy souls in the current island as missing" -- cgit From 77fe811d2347b7fb21da028ffe32205459804e3d Mon Sep 17 00:00:00 2001 From: Futuremappermydud <54294576+Futuremappermydud@users.noreply.github.com> Date: Tue, 4 Jul 2023 20:21:03 -0400 Subject: Change Position --- .gitignore | 1 + src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/.gitignore b/.gitignore index 896dca7f..b95c73fb 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ bin/ # fabric run/ +libs/ diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java index c8747596..472c39fd 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java @@ -65,7 +65,7 @@ public class TitleContainer { for (Title title : titles) { context.getMatrices().push(); - context.getMatrices().translate(title.lastX, client.getWindow().getScaledHeight() * 0.6F, 0); + context.getMatrices().translate(title.lastX, client.getWindow().getScaledHeight() * 0.7F, 0); context.getMatrices().scale(3.0F, 3.0F, 3.0F); title.lastX = MathHelper.lerp(tickDelta * 0.5F, title.lastX, x); -- cgit From f5eca35862beee810c4761a51f274bb89e726e55 Mon Sep 17 00:00:00 2001 From: Futuremappermydud <54294576+Futuremappermydud@users.noreply.github.com> Date: Tue, 4 Jul 2023 20:37:27 -0400 Subject: remove debug stuff --- .../skyblocker/skyblock/rift/HealingMelonIndicator.java | 1 - .../skyblocker/skyblock/rift/StakeIndicator.java | 1 - .../skyblocker/skyblock/rift/TwinClawsIndicator.java | 1 - .../xmrvizzy/skyblocker/utils/title/TitleContainer.java | 17 ----------------- 4 files changed, 20 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java index 63cd2b7e..d1657d67 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java @@ -8,7 +8,6 @@ import me.xmrvizzy.skyblocker.utils.title.TitleContainer; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.resource.language.I18n; -import net.minecraft.text.Text; import net.minecraft.util.Formatting; public class HealingMelonIndicator { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java index 01b6b738..d946df6d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java @@ -8,7 +8,6 @@ import me.xmrvizzy.skyblocker.utils.title.Title; import me.xmrvizzy.skyblocker.utils.title.TitleContainer; import net.minecraft.client.resource.language.I18n; import net.minecraft.entity.Entity; -import net.minecraft.text.Text; import net.minecraft.util.Formatting; public class StakeIndicator { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java index a062f7b7..706aa95e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java @@ -9,7 +9,6 @@ import me.xmrvizzy.skyblocker.utils.title.Title; import me.xmrvizzy.skyblocker.utils.title.TitleContainer; import net.minecraft.client.resource.language.I18n; import net.minecraft.entity.Entity; -import net.minecraft.text.Text; import net.minecraft.util.Formatting; public class TwinClawsIndicator { diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java index 472c39fd..8eaf45a3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java @@ -1,13 +1,11 @@ package me.xmrvizzy.skyblocker.utils.title; import me.xmrvizzy.skyblocker.SkyblockerMod; -import me.xmrvizzy.skyblocker.skyblock.FairySouls; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; -import net.minecraft.entity.decoration.DisplayEntity; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.math.MathHelper; @@ -24,21 +22,6 @@ public class TitleContainer { private static final Logger LOGGER = LoggerFactory.getLogger("skyblocker"); public static void init() { HudRenderCallback.EVENT.register(TitleContainer::draw); - ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE) - .then(literal("title") - .then(literal("ice").executes(context -> { - titles.add(new Title(Text.translatable("skyblocker.rift.iceNow").getString(), Formatting.AQUA.getColorValue())); - return 1; - })) - .then(literal("stake").executes(context -> { - titles.add(new Title("Stake", Formatting.RED.getColorValue())); - return 1; - })) - .then(literal("heal").executes(context -> { - titles.add(new Title("Heal", Formatting.DARK_RED.getColorValue())); - return 1; - })) - ))); } public static void addTitle(Title title) { -- cgit From e393d6f9fa44b0314734ce54927ebf3bf0551d47 Mon Sep 17 00:00:00 2001 From: Futuremappermydud <54294576+Futuremappermydud@users.noreply.github.com> Date: Wed, 5 Jul 2023 17:07:44 -0400 Subject: Make Changes + Add scaling --- .../skyblocker/config/SkyblockerConfig.java | 10 ++++++++ .../skyblocker/utils/title/TitleContainer.java | 28 +++++++--------------- .../resources/assets/skyblocker/lang/en_us.json | 3 +++ 3 files changed, 22 insertions(+), 19 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index ab4149fc..d461dbfe 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -175,6 +175,11 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Gui.CollapsibleObject() public Hitbox hitbox = new Hitbox(); + @ConfigEntry.Gui.Tooltip() + @ConfigEntry.Category("titleContainer") + @ConfigEntry.Gui.CollapsibleObject() + public TitleContainer titleContainer = new TitleContainer(); + @ConfigEntry.Gui.Excluded public List<Integer> lockedSlots = new ArrayList<>(); } @@ -247,6 +252,11 @@ public class SkyblockerConfig implements ConfigData { public boolean oldLeverHitbox = false; } + public static class TitleContainer { + @ConfigEntry.BoundedDiscrete(min = 30, max = 140) + public float titleContainerScale = 100; + } + public static class RichPresence { public boolean enableRichPresence = false; @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java index 8eaf45a3..9728e1eb 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java @@ -1,30 +1,22 @@ package me.xmrvizzy.skyblocker.utils.title; -import me.xmrvizzy.skyblocker.SkyblockerMod; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; import net.minecraft.util.math.MathHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; -import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; - public class TitleContainer { public static List<Title> titles = new ArrayList<>(); - private static final Logger LOGGER = LoggerFactory.getLogger("skyblocker"); + public static void init() { HudRenderCallback.EVENT.register(TitleContainer::draw); } - public static void addTitle(Title title) - { + public static void addTitle(Title title) { title.active = true; title.lastX = 0; titles.add(title); @@ -35,26 +27,24 @@ public class TitleContainer { List<Title> toRemove = new ArrayList<>(); + float scale = 3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F); + float x; float width = 0; - context.getMatrices().push(); - context.getMatrices().scale(3.0F, 3.0F, 3.0F); for (Title title : titles) { - width += textRenderer.getWidth(title.text) * 3F + 10; + width += textRenderer.getWidth(title.text) * scale + 10; } - context.getMatrices().pop(); x = (client.getWindow().getScaledWidth() / 2) - width / 2; for (Title title : titles) { context.getMatrices().push(); context.getMatrices().translate(title.lastX, client.getWindow().getScaledHeight() * 0.7F, 0); - context.getMatrices().scale(3.0F, 3.0F, 3.0F); + context.getMatrices().scale(scale, scale, scale); title.lastX = MathHelper.lerp(tickDelta * 0.5F, title.lastX, x); - x += textRenderer.getWidth(title.text) * 3F + 10; - context.drawText(textRenderer, title.text, 0, 0, title.color, true - ); + x += textRenderer.getWidth(title.text) * scale + 10; + context.drawText(textRenderer, title.text, 0, 0, title.color, true); context.getMatrices().pop(); if (!title.active) { toRemove.add(title); diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 4686c31a..641fd202 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -52,6 +52,9 @@ "text.autoconfig.skyblocker.option.general.hitbox": "Hitboxes", "text.autoconfig.skyblocker.option.general.hitbox.oldFarmlandHitbox": "Enable 1.8 farmland hitbox", "text.autoconfig.skyblocker.option.general.hitbox.oldLeverHitbox": "Enable 1.8 lever hitbox", + "text.autoconfig.skyblocker.option.general.titleContainer": "Title Container", + "text.autoconfig.skyblocker.option.general.titleContainer.@Tooltip": "Used to display multiple titles at once, Example use: Vampire Slayer", + "text.autoconfig.skyblocker.option.general.titleContainer.titleContainerScale": "Title Container Scale", "skyblocker.itemTooltip.nullMessage": "§b[§6Skyblocker§b] §cItem price information on tooltip will renew in max 60 seconds. If not, check latest.log", "skyblocker.itemTooltip.noData": "§cNo Data", -- cgit From a4917d92ab77bc980b68017721adac2091a51f3e Mon Sep 17 00:00:00 2001 From: Futuremappermydud <54294576+Futuremappermydud@users.noreply.github.com> Date: Fri, 7 Jul 2023 18:00:58 -0400 Subject: WIP Title Container movement + Duration methods Added a WIP configuration screen under /Skyblocker hud titleContainer that allows you to move, change alignment, and reorient the titles inside. Added methods(TitleContainer.addTitleWithDismiss, and RenderHelper.displayInTitleContainerWDismissAndPlaySound) that will display the given title and after a set amount of ticks will disable that title. --- .gitignore | 1 - .../skyblocker/config/SkyblockerConfig.java | 34 ++++++++ .../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 5 ++ .../me/xmrvizzy/skyblocker/utils/title/Title.java | 1 + .../skyblocker/utils/title/TitleContainer.java | 81 ++++++++++++++++-- .../utils/title/TitleContainerConfigScreen.java | 95 ++++++++++++++++++++++ 6 files changed, 207 insertions(+), 10 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/.gitignore b/.gitignore index b95c73fb..896dca7f 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,3 @@ bin/ # fabric run/ -libs/ diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index d461dbfe..1aeee35e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -255,6 +255,40 @@ public class SkyblockerConfig implements ConfigData { public static class TitleContainer { @ConfigEntry.BoundedDiscrete(min = 30, max = 140) public float titleContainerScale = 100; + public int x = 540; + public int y = 10; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public Direction direction = Direction.HORIZONTAL; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.DROPDOWN) + public Alignment alignment = Alignment.MIDDLE; + } + + public enum Direction { + HORIZONTAL, + VERTICAL; + + @Override + public String toString() { + return switch (this) { + case HORIZONTAL -> "Horizontal"; + case VERTICAL -> "Vertical"; + }; + } + } + + public enum Alignment { + LEFT, + RIGHT, + MIDDLE; + + @Override + public String toString() { + return switch (this) { + case LEFT -> "Left"; + case RIGHT -> "Right"; + case MIDDLE -> "Middle"; + }; + } } public static class RichPresence { diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java index e75538f6..4a151129 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java @@ -58,6 +58,11 @@ public class RenderHelper { playNotificationSound(); } + public static void displayInTitleContainerWDismissAndPlaySound(Title title, int ticks) { + TitleContainer.addTitleWithDismiss(title, ticks); + playNotificationSound(); + } + private static void playNotificationSound() { if (MinecraftClient.getInstance().player != null) { MinecraftClient.getInstance().player.playSound(SoundEvent.of(new Identifier("entity.experience_orb.pickup")), 100f, 0.1f); diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java index 44a636d7..d1977470 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java @@ -5,6 +5,7 @@ public class Title { public boolean active = true; public int color; public float lastX = 0; + public float lastY = 0; public Title(String text, int color) { this.text = text; diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java index 9728e1eb..e888fbda 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java @@ -1,27 +1,50 @@ package me.xmrvizzy.skyblocker.utils.title; +import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHudConfigScreen; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; +import net.minecraft.text.Text; import net.minecraft.util.math.MathHelper; import java.util.ArrayList; import java.util.List; public class TitleContainer { + public static final MinecraftClient client = MinecraftClient.getInstance(); public static List<Title> titles = new ArrayList<>(); public static void init() { HudRenderCallback.EVENT.register(TitleContainer::draw); + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker") + .then(ClientCommandManager.literal("hud") + .then(ClientCommandManager.literal("titleContainer") + .executes(context -> { + client.send(() -> client.setScreen(new TitleContainerConfigScreen(Text.of("Title Container HUD Config")))); + return 1; + }))))); } public static void addTitle(Title title) { title.active = true; title.lastX = 0; + title.lastY = SkyblockerConfig.get().general.titleContainer.y; titles.add(title); } + public static void addTitleWithDismiss(Title title, int ticks) { + addTitle(title); + SkyblockerMod.getInstance().scheduler.schedule(() -> { + title.active = false; + }, ticks); + } public static void draw(DrawContext context, float tickDelta) { + draw(titles, SkyblockerConfig.get().general.titleContainer.x, SkyblockerConfig.get().general.titleContainer.y, context, tickDelta, false); + } + public static void draw(List<Title> titlesToDraw, int xPos, int yPos, DrawContext context, float tickDelta, boolean example) { var client = MinecraftClient.getInstance(); TextRenderer textRenderer = client.textRenderer; @@ -29,27 +52,67 @@ public class TitleContainer { float scale = 3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F); - float x; + var direction = SkyblockerConfig.get().general.titleContainer.direction; + var alignment = SkyblockerConfig.get().general.titleContainer.alignment; + float x = 0; + float y; float width = 0; - for (Title title : titles) { + for (Title title : titlesToDraw) { width += textRenderer.getWidth(title.text) * scale + 10; } + if (alignment == SkyblockerConfig.Alignment.MIDDLE) { + if(direction == SkyblockerConfig.Direction.HORIZONTAL) { + x = xPos - width / 2; + } else { + if (titlesToDraw.size() > 0) { + if (titlesToDraw.size() > 0) { + x = xPos - (textRenderer.getWidth(titlesToDraw.get(0).text) / 2 * scale); + } + } + } + } else { + if (alignment == SkyblockerConfig.Alignment.LEFT) { + x = xPos; + } else { + if (titlesToDraw.size() > 0) { + x = xPos - (textRenderer.getWidth(titlesToDraw.get(0).text) * scale); + } + } + } + y = yPos; - x = (client.getWindow().getScaledWidth() / 2) - width / 2; - - for (Title title : titles) { + for (Title title : titlesToDraw) { context.getMatrices().push(); - context.getMatrices().translate(title.lastX, client.getWindow().getScaledHeight() * 0.7F, 0); + context.getMatrices().translate(title.lastX, title.lastY, 200); context.getMatrices().scale(scale, scale, scale); title.lastX = MathHelper.lerp(tickDelta * 0.5F, title.lastX, x); - x += textRenderer.getWidth(title.text) * scale + 10; + title.lastY = MathHelper.lerp(tickDelta * 0.5F, title.lastY, y); + + if(direction == SkyblockerConfig.Direction.HORIZONTAL) { + switch (alignment) { + case LEFT -> x += textRenderer.getWidth(title.text) * scale + 10; + case RIGHT -> x -= (textRenderer.getWidth(title.text) * scale + 10); + case MIDDLE -> x += textRenderer.getWidth(title.text) * scale + 10; + } + y = yPos; + } else { + switch (alignment) { + case LEFT -> x = xPos; + case RIGHT -> x = xPos - (textRenderer.getWidth(title.text) * scale); + case MIDDLE -> x = xPos - ((textRenderer.getWidth(title.text) * scale)); + } + y += textRenderer.fontHeight * scale + 10; + } + context.drawText(textRenderer, title.text, 0, 0, title.color, true); context.getMatrices().pop(); - if (!title.active) { + if (!title.active && !example) { toRemove.add(title); } } - titles.removeAll(toRemove); + if (!example) { + titlesToDraw.removeAll(toRemove); + } } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java new file mode 100644 index 00000000..5a693ddb --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java @@ -0,0 +1,95 @@ +package me.xmrvizzy.skyblocker.utils.title; + +import me.shedaniel.autoconfig.AutoConfig; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud; +import me.xmrvizzy.skyblocker.utils.RenderUtils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.input.KeyCodes; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.lwjgl.glfw.GLFW; + +import java.awt.*; +import java.awt.event.KeyEvent; +import java.util.List; + +public class TitleContainerConfigScreen extends Screen { + + private final Title example1 = new Title("Test1", Formatting.RED.getColorValue()); + private final Title example2 = new Title("Test23", Formatting.AQUA.getColorValue()); + private final Title example3 = new Title("Testing123456", Formatting.DARK_GREEN.getColorValue()); + private int hudX = SkyblockerConfig.get().general.titleContainer.x; + private int hudY = SkyblockerConfig.get().general.titleContainer.y; + protected TitleContainerConfigScreen(Text title) { + super(title); + } + + @Override + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + super.render(context, mouseX, mouseY, delta); + renderBackground(context); + TitleContainer.draw(List.of(example1, example2, example3), hudX, hudY, context, delta, true); + context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB()); + int width1 = client.textRenderer.getWidth("Press Q/E to change Alignment"); + int width2 = client.textRenderer.getWidth("Press R to change Direction"); + context.drawText(client.textRenderer, "Press Q/E to change Alignment", (width / 2) - width1 / 2, client.textRenderer.fontHeight * 2, Color.GRAY.getRGB(), true); + context.drawText(client.textRenderer, "Press R to change Direction", (width / 2) - width2 / 2, client.textRenderer.fontHeight * 3 + 5, Color.GRAY.getRGB(), true); + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { + if (RenderUtils.pointExistsInArea((int) mouseX, (int) mouseY, hudX - 100, hudY - 20, hudX + 110, hudY + 30) && button == 0) { + hudX = (int) Math.max(Math.min(mouseX, this.width - 100), 110); + hudY = (int) Math.max(Math.min(mouseY, this.height - 30), 0); + } + return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 1) { + hudX = this.width / 2; + hudY = (int) (this.height * 0.6F); + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if(keyCode == GLFW.GLFW_KEY_Q) { + var current = SkyblockerConfig.get().general.titleContainer.alignment; + SkyblockerConfig.get().general.titleContainer.alignment = switch (current) { + case LEFT -> SkyblockerConfig.Alignment.MIDDLE; + case MIDDLE -> SkyblockerConfig.Alignment.RIGHT; + case RIGHT -> SkyblockerConfig.Alignment.LEFT; + }; + } + if(keyCode == GLFW.GLFW_KEY_E) { + var current = SkyblockerConfig.get().general.titleContainer.alignment; + SkyblockerConfig.get().general.titleContainer.alignment = switch (current) { + case LEFT -> SkyblockerConfig.Alignment.RIGHT; + case MIDDLE -> SkyblockerConfig.Alignment.LEFT; + case RIGHT -> SkyblockerConfig.Alignment.MIDDLE; + }; + } + if(keyCode == GLFW.GLFW_KEY_R) { + var current = SkyblockerConfig.get().general.titleContainer.direction; + SkyblockerConfig.get().general.titleContainer.direction = switch (current) { + case HORIZONTAL -> SkyblockerConfig.Direction.VERTICAL; + case VERTICAL -> SkyblockerConfig.Direction.HORIZONTAL; + }; + } + return super.keyPressed(keyCode, scanCode, modifiers); + } + + @Override + public void close() { + SkyblockerConfig.get().general.titleContainer.x = hudX; + SkyblockerConfig.get().general.titleContainer.y = hudY; + AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); + super.close(); + } +} -- cgit From 558bb3c1b3a52cc4a8ec3610fa88b9552a063433 Mon Sep 17 00:00:00 2001 From: Futuremappermydud <54294576+Futuremappermydud@users.noreply.github.com> Date: Fri, 7 Jul 2023 21:31:19 -0400 Subject: Proper Movement Menu --- .../skyblocker/utils/title/TitleContainer.java | 51 ++++---- .../utils/title/TitleContainerConfigScreen.java | 141 +++++++++++++++++++-- 2 files changed, 159 insertions(+), 33 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java index e888fbda..14db8d6e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java @@ -60,25 +60,18 @@ public class TitleContainer { for (Title title : titlesToDraw) { width += textRenderer.getWidth(title.text) * scale + 10; } - if (alignment == SkyblockerConfig.Alignment.MIDDLE) { - if(direction == SkyblockerConfig.Direction.HORIZONTAL) { - x = xPos - width / 2; - } else { - if (titlesToDraw.size() > 0) { - if (titlesToDraw.size() > 0) { - x = xPos - (textRenderer.getWidth(titlesToDraw.get(0).text) / 2 * scale); - } - } + if(direction == SkyblockerConfig.Direction.HORIZONTAL) { + if (alignment == SkyblockerConfig.Alignment.MIDDLE) { + x = xPos - (width / 2); } } else { - if (alignment == SkyblockerConfig.Alignment.LEFT) { + if (alignment == SkyblockerConfig.Alignment.MIDDLE) { x = xPos; - } else { - if (titlesToDraw.size() > 0) { - x = xPos - (textRenderer.getWidth(titlesToDraw.get(0).text) * scale); - } } } + if(alignment == SkyblockerConfig.Alignment.LEFT || alignment == SkyblockerConfig.Alignment.RIGHT) { + x = xPos; + } y = yPos; for (Title title : titlesToDraw) { @@ -86,22 +79,30 @@ public class TitleContainer { context.getMatrices().translate(title.lastX, title.lastY, 200); context.getMatrices().scale(scale, scale, scale); - title.lastX = MathHelper.lerp(tickDelta * 0.5F, title.lastX, x); + float xToUse = 0; + if(direction == SkyblockerConfig.Direction.HORIZONTAL) { + xToUse = alignment == SkyblockerConfig.Alignment.RIGHT ? + x - (textRenderer.getWidth(title.text) * scale) : + x; + } else { + xToUse = alignment == SkyblockerConfig.Alignment.MIDDLE ? + x - (textRenderer.getWidth(title.text) * scale) / 2 : + alignment == SkyblockerConfig.Alignment.RIGHT ? + x - (textRenderer.getWidth(title.text) * scale) : + x; + } + title.lastX = MathHelper.lerp(tickDelta * 0.5F, title.lastX, xToUse); title.lastY = MathHelper.lerp(tickDelta * 0.5F, title.lastY, y); if(direction == SkyblockerConfig.Direction.HORIZONTAL) { - switch (alignment) { - case LEFT -> x += textRenderer.getWidth(title.text) * scale + 10; - case RIGHT -> x -= (textRenderer.getWidth(title.text) * scale + 10); - case MIDDLE -> x += textRenderer.getWidth(title.text) * scale + 10; + if (alignment == SkyblockerConfig.Alignment.MIDDLE || alignment == SkyblockerConfig.Alignment.LEFT) { + x += textRenderer.getWidth(title.text) * scale + 10; } - y = yPos; - } else { - switch (alignment) { - case LEFT -> x = xPos; - case RIGHT -> x = xPos - (textRenderer.getWidth(title.text) * scale); - case MIDDLE -> x = xPos - ((textRenderer.getWidth(title.text) * scale)); + + if (alignment == SkyblockerConfig.Alignment.RIGHT) { + x -= textRenderer.getWidth(title.text) * scale + 10; } + } else { y += textRenderer.fontHeight * scale + 10; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java index 5a693ddb..41734dcb 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java @@ -20,7 +20,7 @@ public class TitleContainerConfigScreen extends Screen { private final Title example1 = new Title("Test1", Formatting.RED.getColorValue()); private final Title example2 = new Title("Test23", Formatting.AQUA.getColorValue()); - private final Title example3 = new Title("Testing123456", Formatting.DARK_GREEN.getColorValue()); + private final Title example3 = new Title("Testing1234", Formatting.DARK_GREEN.getColorValue()); private int hudX = SkyblockerConfig.get().general.titleContainer.x; private int hudY = SkyblockerConfig.get().general.titleContainer.y; protected TitleContainerConfigScreen(Text title) { @@ -33,17 +33,142 @@ public class TitleContainerConfigScreen extends Screen { renderBackground(context); TitleContainer.draw(List.of(example1, example2, example3), hudX, hudY, context, delta, true); context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB()); - int width1 = client.textRenderer.getWidth("Press Q/E to change Alignment"); - int width2 = client.textRenderer.getWidth("Press R to change Direction"); - context.drawText(client.textRenderer, "Press Q/E to change Alignment", (width / 2) - width1 / 2, client.textRenderer.fontHeight * 2, Color.GRAY.getRGB(), true); - context.drawText(client.textRenderer, "Press R to change Direction", (width / 2) - width2 / 2, client.textRenderer.fontHeight * 3 + 5, Color.GRAY.getRGB(), true); + var direction = SkyblockerConfig.get().general.titleContainer.direction; + var alignment = SkyblockerConfig.get().general.titleContainer.alignment; + int width1 = client.textRenderer.getWidth("Press Q/E to change Alignment: " + alignment.toString()); + int width2 = client.textRenderer.getWidth("Press R to change Direction: " + direction.toString()); + context.drawText(client.textRenderer, "Press Q/E to change Alignment: " + alignment.toString(), (width / 2) - width1 / 2, client.textRenderer.fontHeight * 2, Color.GRAY.getRGB(), true); + context.drawText(client.textRenderer, "Press R to change Direction: " + direction.toString(), (width / 2) - width2 / 2, client.textRenderer.fontHeight * 3 + 5, Color.GRAY.getRGB(), true); + + int midWidth = getSelectionWidth() / 2; + int midHeight = getSelectionHeight() / 2; + int x1 = 0; + int x2 = 0; + int y1 = 0; + int y2 = 0; + if(direction == SkyblockerConfig.Direction.HORIZONTAL) { + switch (alignment) { + case RIGHT: + x1 = hudX - midWidth * 2; + x2 = hudX; + y1 = hudY + 0; + y2 = hudY + midHeight * 2; + break; + case MIDDLE: + x1 = hudX - midWidth; + x2 = hudX + midWidth; + y1 = hudY + 0; + y2 = hudY + midHeight * 2; + break; + case LEFT: + x1 = hudX; + x2 = hudX + midWidth * 2; + y1 = hudY + 0; + y2 = hudY + midHeight * 2; + break; + } + } else { + switch (alignment) { + case RIGHT: + x1 = hudX - midWidth * 2; + x2 = hudX; + y1 = hudY; + y2 = hudY + midHeight; + break; + case MIDDLE: + x1 = hudX - midWidth; + x2 = hudX + midWidth; + y1 = hudY; + y2 = hudY + midHeight; + break; + case LEFT: + x1 = hudX; + x2 = hudX + midWidth * 2; + y1 = hudY; + y2 = hudY + midHeight; + break; + } + } + context.drawHorizontalLine(x1, x2, y1, Color.RED.getRGB()); + context.drawHorizontalLine(x1, x2, y2, Color.RED.getRGB()); + context.drawVerticalLine(x1, y1, y2, Color.RED.getRGB()); + context.drawVerticalLine(x2, y1, y2, Color.RED.getRGB()); + } + + public int getSelectionHeight() + { + int scale = (int) (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F)); + return SkyblockerConfig.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ? + textRenderer.fontHeight * scale : + (textRenderer.fontHeight + 10) * 3 * scale; + } + + public int getSelectionWidth() + { + int scale = (int) (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F)); + return SkyblockerConfig.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ? + (textRenderer.getWidth("Test1") + 10 + textRenderer.getWidth("Test23") + 10 + textRenderer.getWidth("Testing1234")) * scale : + textRenderer.getWidth("Testing1234") * scale; } @Override public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { - if (RenderUtils.pointExistsInArea((int) mouseX, (int) mouseY, hudX - 100, hudY - 20, hudX + 110, hudY + 30) && button == 0) { - hudX = (int) Math.max(Math.min(mouseX, this.width - 100), 110); - hudY = (int) Math.max(Math.min(mouseY, this.height - 30), 0); + int midWidth = getSelectionWidth() / 2; + int midHeight = getSelectionHeight() / 2; + var direction = SkyblockerConfig.get().general.titleContainer.direction; + var alignment = SkyblockerConfig.get().general.titleContainer.alignment; + int x1 = 0; + int x2 = 0; + int y1 = 0; + int y2 = 0; + if(direction == SkyblockerConfig.Direction.HORIZONTAL) { + switch (alignment) { + case RIGHT: + x1 = hudX - midWidth * 2; + x2 = hudX; + y1 = hudY + 0; + y2 = hudY + midHeight * 2; + break; + case MIDDLE: + x1 = hudX - midWidth; + x2 = hudX + midWidth; + y1 = hudY + 0; + y2 = hudY + midHeight * 2; + break; + case LEFT: + x1 = hudX; + x2 = hudX + midWidth * 2; + y1 = hudY + 0; + y2 = hudY + midHeight * 2; + break; + } + } else { + switch (alignment) { + case RIGHT: + x1 = hudX - midWidth * 2; + x2 = hudX; + y1 = hudY + 0; + y2 = hudY + midHeight * 2; + break; + case MIDDLE: + x1 = hudX - midWidth; + x2 = hudX + midWidth; + y1 = hudY + 0; + y2 = hudY + midHeight * 2; + break; + case LEFT: + x1 = hudX; + x2 = hudX + midWidth * 2; + y1 = hudY + 0; + y2 = hudY + midHeight * 2; + break; + } + } + if (RenderUtils.pointExistsInArea((int) mouseX, (int) mouseY, x1, y1, x2, y2) && button == 0) { + hudX = alignment == SkyblockerConfig.Alignment.RIGHT ? + (int) mouseX + midWidth : + (int) mouseX - (midWidth / 2); + hudY = (int) mouseY - (midHeight); } return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); } -- cgit From b6cc175f8782ee94f5aeaef877466f9c81564cf6 Mon Sep 17 00:00:00 2001 From: Futuremappermydud <54294576+Futuremappermydud@users.noreply.github.com> Date: Fri, 7 Jul 2023 21:48:32 -0400 Subject: Remove Duplicate Code --- .../utils/title/TitleContainerConfigScreen.java | 89 +++++++++------------- 1 file changed, 37 insertions(+), 52 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java index 41734dcb..cf59ff66 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java @@ -10,6 +10,8 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.input.KeyCodes; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import net.minecraft.util.math.Box; +import org.joml.Vector4i; import org.lwjgl.glfw.GLFW; import java.awt.*; @@ -40,6 +42,28 @@ public class TitleContainerConfigScreen extends Screen { context.drawText(client.textRenderer, "Press Q/E to change Alignment: " + alignment.toString(), (width / 2) - width1 / 2, client.textRenderer.fontHeight * 2, Color.GRAY.getRGB(), true); context.drawText(client.textRenderer, "Press R to change Direction: " + direction.toString(), (width / 2) - width2 / 2, client.textRenderer.fontHeight * 3 + 5, Color.GRAY.getRGB(), true); + int x1; + int x2; + int y1; + int y2; + + var vec = getSelectionBounding(); + x1 = vec.x; + x2 = vec.y; + y1 = vec.z; + y2 = vec.w; + + context.drawHorizontalLine(x1, x2, y1, Color.RED.getRGB()); + context.drawHorizontalLine(x1, x2, y2, Color.RED.getRGB()); + context.drawVerticalLine(x1, y1, y2, Color.RED.getRGB()); + context.drawVerticalLine(x2, y1, y2, Color.RED.getRGB()); + } + + public Vector4i getSelectionBounding() + { + var direction = SkyblockerConfig.get().general.titleContainer.direction; + var alignment = SkyblockerConfig.get().general.titleContainer.alignment; + int midWidth = getSelectionWidth() / 2; int midHeight = getSelectionHeight() / 2; int x1 = 0; @@ -89,10 +113,7 @@ public class TitleContainerConfigScreen extends Screen { break; } } - context.drawHorizontalLine(x1, x2, y1, Color.RED.getRGB()); - context.drawHorizontalLine(x1, x2, y2, Color.RED.getRGB()); - context.drawVerticalLine(x1, y1, y2, Color.RED.getRGB()); - context.drawVerticalLine(x2, y1, y2, Color.RED.getRGB()); + return new Vector4i(x1, x2, y1, y2); } public int getSelectionHeight() @@ -115,55 +136,19 @@ public class TitleContainerConfigScreen extends Screen { public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { int midWidth = getSelectionWidth() / 2; int midHeight = getSelectionHeight() / 2; - var direction = SkyblockerConfig.get().general.titleContainer.direction; var alignment = SkyblockerConfig.get().general.titleContainer.alignment; - int x1 = 0; - int x2 = 0; - int y1 = 0; - int y2 = 0; - if(direction == SkyblockerConfig.Direction.HORIZONTAL) { - switch (alignment) { - case RIGHT: - x1 = hudX - midWidth * 2; - x2 = hudX; - y1 = hudY + 0; - y2 = hudY + midHeight * 2; - break; - case MIDDLE: - x1 = hudX - midWidth; - x2 = hudX + midWidth; - y1 = hudY + 0; - y2 = hudY + midHeight * 2; - break; - case LEFT: - x1 = hudX; - x2 = hudX + midWidth * 2; - y1 = hudY + 0; - y2 = hudY + midHeight * 2; - break; - } - } else { - switch (alignment) { - case RIGHT: - x1 = hudX - midWidth * 2; - x2 = hudX; - y1 = hudY + 0; - y2 = hudY + midHeight * 2; - break; - case MIDDLE: - x1 = hudX - midWidth; - x2 = hudX + midWidth; - y1 = hudY + 0; - y2 = hudY + midHeight * 2; - break; - case LEFT: - x1 = hudX; - x2 = hudX + midWidth * 2; - y1 = hudY + 0; - y2 = hudY + midHeight * 2; - break; - } - } + + int x1; + int x2; + int y1; + int y2; + + var vec = getSelectionBounding(); + x1 = vec.x; + x2 = vec.y; + y1 = vec.z; + y2 = vec.w; + if (RenderUtils.pointExistsInArea((int) mouseX, (int) mouseY, x1, y1, x2, y2) && button == 0) { hudX = alignment == SkyblockerConfig.Alignment.RIGHT ? (int) mouseX + midWidth : -- cgit From aed3973ad0cc33b3d3128695e6f660dc304bc9d6 Mon Sep 17 00:00:00 2001 From: Futuremappermydud <54294576+Futuremappermydud@users.noreply.github.com> Date: Fri, 7 Jul 2023 23:02:07 -0400 Subject: Simplify Code + Fix Vertical BB --- .../utils/title/TitleContainerConfigScreen.java | 61 ++++++---------------- .../resources/assets/skyblocker/lang/en_us.json | 4 ++ 2 files changed, 21 insertions(+), 44 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java index cf59ff66..a035f862 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java @@ -39,8 +39,8 @@ public class TitleContainerConfigScreen extends Screen { var alignment = SkyblockerConfig.get().general.titleContainer.alignment; int width1 = client.textRenderer.getWidth("Press Q/E to change Alignment: " + alignment.toString()); int width2 = client.textRenderer.getWidth("Press R to change Direction: " + direction.toString()); - context.drawText(client.textRenderer, "Press Q/E to change Alignment: " + alignment.toString(), (width / 2) - width1 / 2, client.textRenderer.fontHeight * 2, Color.GRAY.getRGB(), true); - context.drawText(client.textRenderer, "Press R to change Direction: " + direction.toString(), (width / 2) - width2 / 2, client.textRenderer.fontHeight * 3 + 5, Color.GRAY.getRGB(), true); + context.drawText(client.textRenderer, "Press Q/E to change Alignment: " + alignment.toString(), (width / 2) - width1 / 2, client.textRenderer.fontHeight * 2, Color.WHITE.getRGB(), true); + context.drawText(client.textRenderer, "Press R to change Direction: " + direction.toString(), (width / 2) - width2 / 2, client.textRenderer.fontHeight * 3 + 5, Color.WHITE.getRGB(), true); int x1; int x2; @@ -70,48 +70,21 @@ public class TitleContainerConfigScreen extends Screen { int x2 = 0; int y1 = 0; int y2 = 0; - if(direction == SkyblockerConfig.Direction.HORIZONTAL) { - switch (alignment) { - case RIGHT: - x1 = hudX - midWidth * 2; - x2 = hudX; - y1 = hudY + 0; - y2 = hudY + midHeight * 2; - break; - case MIDDLE: - x1 = hudX - midWidth; - x2 = hudX + midWidth; - y1 = hudY + 0; - y2 = hudY + midHeight * 2; - break; - case LEFT: - x1 = hudX; - x2 = hudX + midWidth * 2; - y1 = hudY + 0; - y2 = hudY + midHeight * 2; - break; - } - } else { - switch (alignment) { - case RIGHT: - x1 = hudX - midWidth * 2; - x2 = hudX; - y1 = hudY; - y2 = hudY + midHeight; - break; - case MIDDLE: - x1 = hudX - midWidth; - x2 = hudX + midWidth; - y1 = hudY; - y2 = hudY + midHeight; - break; - case LEFT: - x1 = hudX; - x2 = hudX + midWidth * 2; - y1 = hudY; - y2 = hudY + midHeight; - break; - } + y1 = hudY; + y2 = hudY + midHeight * 2; + switch (alignment) { + case RIGHT: + x1 = hudX - midWidth * 2; + x2 = hudX; + break; + case MIDDLE: + x1 = hudX - midWidth; + x2 = hudX + midWidth; + break; + case LEFT: + x1 = hudX; + x2 = hudX + midWidth * 2; + break; } return new Vector4i(x1, x2, y1, y2); } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 641fd202..dc3a6cf8 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -55,6 +55,10 @@ "text.autoconfig.skyblocker.option.general.titleContainer": "Title Container", "text.autoconfig.skyblocker.option.general.titleContainer.@Tooltip": "Used to display multiple titles at once, Example use: Vampire Slayer", "text.autoconfig.skyblocker.option.general.titleContainer.titleContainerScale": "Title Container Scale", + "text.autoconfig.skyblocker.option.general.titleContainer.x": "Title Container X Position", + "text.autoconfig.skyblocker.option.general.titleContainer.y": "Title Container Y Position", + "text.autoconfig.skyblocker.option.general.titleContainer.direction": "Title Container Orientation", + "text.autoconfig.skyblocker.option.general.titleContainer.alignment": "Title Container Horizontal Alignment", "skyblocker.itemTooltip.nullMessage": "§b[§6Skyblocker§b] §cItem price information on tooltip will renew in max 60 seconds. If not, check latest.log", "skyblocker.itemTooltip.noData": "§cNo Data", -- cgit From 796177d64aac6c64949973a5604aedc0d1f2651f Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Sat, 8 Jul 2023 17:20:55 +0800 Subject: Refactor Title Container --- .../skyblocker/config/SkyblockerConfig.java | 10 +- .../skyblocker/skyblock/FishingHelper.java | 4 +- .../skyblocker/skyblock/rift/EffigyWaypoints.java | 4 +- .../skyblock/rift/HealingMelonIndicator.java | 19 +-- .../skyblocker/skyblock/rift/ManiaIndicator.java | 27 ++--- .../skyblock/rift/MirrorverseWaypoints.java | 4 +- .../skyblocker/skyblock/rift/StakeIndicator.java | 19 ++- .../skyblock/rift/TwinClawsIndicator.java | 25 ++-- .../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 25 +++- .../me/xmrvizzy/skyblocker/utils/Scheduler.java | 21 ++++ .../me/xmrvizzy/skyblocker/utils/title/Title.java | 31 +++-- .../skyblocker/utils/title/TitleContainer.java | 128 +++++++++++++-------- .../utils/title/TitleContainerConfigScreen.java | 110 +++++++----------- 13 files changed, 237 insertions(+), 190 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 1aeee35e..7da9979a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -1,5 +1,6 @@ package me.xmrvizzy.skyblocker.config; +import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import me.shedaniel.autoconfig.AutoConfig; import me.shedaniel.autoconfig.ConfigData; @@ -10,8 +11,6 @@ import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.chat.ChatFilterResult; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.resource.language.I18n; import java.util.ArrayList; @@ -500,11 +499,8 @@ public class SkyblockerConfig implements ConfigData { private static LiteralArgumentBuilder<FabricClientCommandSource> optionsLiteral(String name) { return literal(name).executes(context -> { // Don't immediately open the next screen as it will be closed by ChatScreen right after this command is executed - SkyblockerMod.getInstance().scheduler.schedule(() -> { - Screen a = AutoConfig.getConfigScreen(SkyblockerConfig.class, null).get(); - MinecraftClient.getInstance().setScreen(a); - }, 0); - return 1; + SkyblockerMod.getInstance().scheduler.queueOpenScreen(AutoConfig.getConfigScreen(SkyblockerConfig.class, null)); + return Command.SINGLE_SUCCESS; }); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java index 822b89d9..8dee3fcb 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java @@ -2,6 +2,7 @@ package me.xmrvizzy.skyblocker.skyblock; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.RenderHelper; +import me.xmrvizzy.skyblocker.utils.title.Title; import net.fabricmc.fabric.api.event.player.UseItemCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; @@ -15,6 +16,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; public class FishingHelper { + private static final Title title = new Title("skyblocker.fishing.reelNow", Formatting.GREEN); private static long startTime; private static Vec3d normalYawVector; @@ -49,7 +51,7 @@ public class FishingHelper { if (player != null && player.fishHook != null) { Vec3d soundToFishHook = player.fishHook.getPos().subtract(packet.getX(), 0, packet.getZ()); if (Math.abs(normalYawVector.x * soundToFishHook.z - normalYawVector.z * soundToFishHook.x) < 0.2D && Math.abs(normalYawVector.dotProduct(soundToFishHook)) < 4D && player.getPos().squaredDistanceTo(packet.getX(), packet.getY(), packet.getZ()) > 1D) { - RenderHelper.displayTitleAndPlaySound(10, 5, "skyblocker.fishing.reelNow", Formatting.GREEN); + RenderHelper.displayInTitleContainerAndPlaySound(title, 10); reset(); } } else { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java index 0d44900a..7376c896 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java @@ -32,7 +32,7 @@ public class EffigyWaypoints { ); private static final List<BlockPos> unBrokenEffigies = new ArrayList<>(); - public static void updateEffigies() { + protected static void updateEffigies() { if (!SkyblockerConfig.get().slayer.vampireSlayer.enableEffigyWaypoints || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) return; unBrokenEffigies.clear(); @@ -61,7 +61,7 @@ public class EffigyWaypoints { } } - public static void render(WorldRenderContext context) { + protected static void render(WorldRenderContext context) { if (SkyblockerConfig.get().slayer.vampireSlayer.enableEffigyWaypoints && Utils.getLocation().contains("Stillgore Château")) { for (BlockPos effigy : unBrokenEffigies) { float[] colorComponents = DyeColor.RED.getColorComponents(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java index d1657d67..fed34796 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java @@ -7,28 +7,21 @@ import me.xmrvizzy.skyblocker.utils.title.Title; import me.xmrvizzy.skyblocker.utils.title.TitleContainer; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.resource.language.I18n; import net.minecraft.util.Formatting; public class HealingMelonIndicator { - private static Title title = null; - public static void updateHealth(MinecraftClient client) { - if(title == null) - title = new Title(I18n.translate("skyblocker.rift.healNow"), Formatting.DARK_RED.getColorValue()); + private static final Title title = new Title("skyblocker.rift.healNow", Formatting.DARK_RED); + public static void updateHealth(MinecraftClient client) { if (!SkyblockerConfig.get().slayer.vampireSlayer.enableHealingMelonIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) { - title.active = false; + TitleContainer.removeTitle(title); return; } - title.active = true; ClientPlayerEntity player = client.player; if (player != null && player.getHealth() <= SkyblockerConfig.get().slayer.vampireSlayer.healingMelonHealthThreshold * 2F) { - title.active = true; - if(!TitleContainer.titles.contains(title)) - RenderHelper.displayInTitleContainerAndPlaySound(title); - } - else { - title.active = false; + RenderHelper.displayInTitleContainerAndPlaySound(title); + } else { + TitleContainer.removeTitle(title); } } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java index 7d5a1cb4..4e873eed 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java @@ -8,18 +8,16 @@ import me.xmrvizzy.skyblocker.utils.title.Title; import me.xmrvizzy.skyblocker.utils.title.TitleContainer; import net.minecraft.block.Blocks; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.resource.language.I18n; import net.minecraft.entity.Entity; import net.minecraft.util.Formatting; +import net.minecraft.util.math.BlockPos; public class ManiaIndicator { - private static Title title = null; - public static void updateMania() { - if(title == null) - title = new Title("b", Formatting.RED.getColorValue()); + private static final Title title = new Title("skyblocker.rift.mania", Formatting.RED); + protected static void updateMania() { if (!SkyblockerConfig.get().slayer.vampireSlayer.enableManiaIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) { - title.active = false; + TitleContainer.removeTitle(title); return; } @@ -30,17 +28,14 @@ public class ManiaIndicator { for (Entity entity : SlayerUtils.getEntityArmorStands(slayerEntity)) { if (entity.getDisplayName().toString().contains("MANIA")) { anyMania = true; - title.active = true; - var pos = MinecraftClient.getInstance().player.getBlockPos().down(); - var isGreen = MinecraftClient.getInstance().world.getBlockState(pos).getBlock() == Blocks.GREEN_TERRACOTTA; - title.color = isGreen ? Formatting.GREEN.getColorValue() : Formatting.RED.getColorValue(); - if(!TitleContainer.titles.contains(title)) { - title.text = I18n.translate("skyblocker.rift.mania"); - RenderHelper.displayInTitleContainerAndPlaySound(title); - } + BlockPos pos = MinecraftClient.getInstance().player.getBlockPos().down(); + boolean isGreen = MinecraftClient.getInstance().world.getBlockState(pos).getBlock() == Blocks.GREEN_TERRACOTTA; + title.setFormatting(isGreen ? Formatting.GREEN : Formatting.RED); + RenderHelper.displayInTitleContainerAndPlaySound(title); } } - if(!anyMania) - title.active = false; + if (!anyMania) { + TitleContainer.removeTitle(title); + } } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java index 276ec551..32551179 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java @@ -34,7 +34,7 @@ public class MirrorverseWaypoints { /** * Loads the waypoint locations into memory */ - public static void loadWaypoints() { + private static void loadWaypoints() { try (BufferedReader reader = CLIENT.getResourceManager().openAsReader(WAYPOINTS_JSON)) { JsonObject file = JsonParser.parseReader(reader).getAsJsonObject(); JsonArray sections = file.get("sections").getAsJsonArray(); @@ -69,7 +69,7 @@ public class MirrorverseWaypoints { } } - public static void render(WorldRenderContext wrc) { + protected static void render(WorldRenderContext wrc) { //I would also check for the mirrorverse location but the scoreboard stuff is not performant at all... if (Utils.isInTheRift() && SkyblockerConfig.get().locations.rift.mirrorverseWaypoints) { for (BlockPos pos : LAVA_PATH_WAYPOINTS) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java index d946df6d..90fc436d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java @@ -6,28 +6,23 @@ import me.xmrvizzy.skyblocker.utils.SlayerUtils; import me.xmrvizzy.skyblocker.utils.Utils; import me.xmrvizzy.skyblocker.utils.title.Title; import me.xmrvizzy.skyblocker.utils.title.TitleContainer; -import net.minecraft.client.resource.language.I18n; import net.minecraft.entity.Entity; +import net.minecraft.text.Text; import net.minecraft.util.Formatting; public class StakeIndicator { - private static Title title = null; - public static void updateStake() { - if (title == null) - title = new Title("b", Formatting.RED.getColorValue()); + private static final Title title = new Title("skyblocker.rift.stakeNow",Formatting.RED); + protected static void updateStake() { if (!SkyblockerConfig.get().slayer.vampireSlayer.enableSteakStakeIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château") || !SlayerUtils.isInSlayer()) { - title.active = false; + TitleContainer.removeTitle(title); return; } Entity slayerEntity = SlayerUtils.getSlayerEntity(); if (slayerEntity != null && slayerEntity.getDisplayName().toString().contains("҉")) { - title.active = true; - title.text = I18n.translate("skyblocker.rift.stakeNow"); - if(!TitleContainer.titles.contains(title)) - RenderHelper.displayInTitleContainerAndPlaySound(title); + RenderHelper.displayInTitleContainerAndPlaySound(title); + } else { + TitleContainer.removeTitle(title); } - else - title.active = false; } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java index 706aa95e..f36b97df 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java @@ -7,19 +7,17 @@ import me.xmrvizzy.skyblocker.utils.SlayerUtils; import me.xmrvizzy.skyblocker.utils.Utils; import me.xmrvizzy.skyblocker.utils.title.Title; import me.xmrvizzy.skyblocker.utils.title.TitleContainer; -import net.minecraft.client.resource.language.I18n; import net.minecraft.entity.Entity; +import net.minecraft.text.Text; import net.minecraft.util.Formatting; public class TwinClawsIndicator { - private static Title title = null; - public static boolean scheduling = false; - public static void updateIce() { - if(title == null) - title = new Title("b", Formatting.AQUA.getColorValue()); + private static final Title title = new Title("skyblocker.rift.iceNow",Formatting.AQUA); + private static boolean scheduled = false; + protected static void updateIce() { if (!SkyblockerConfig.get().slayer.vampireSlayer.enableHolyIceIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) { - title.active = false; + TitleContainer.removeTitle(title); return; } @@ -30,18 +28,17 @@ public class TwinClawsIndicator { for (Entity entity : SlayerUtils.getEntityArmorStands(slayerEntity)) { if (entity.getDisplayName().toString().contains("TWINCLAWS")) { anyClaws = true; - title.active = true; - if(!TitleContainer.titles.contains(title) && !scheduling) { - scheduling = true; + if (!TitleContainer.containsTitle(title) && !scheduled) { + scheduled = true; SkyblockerMod.getInstance().scheduler.schedule(() -> { - title.text = I18n.translate("skyblocker.rift.iceNow"); RenderHelper.displayInTitleContainerAndPlaySound(title); - scheduling = false; + scheduled = false; }, SkyblockerConfig.get().slayer.vampireSlayer.holyIceIndicatorTickDelay); } } } - if(!anyClaws) - title.active = false; + if (!anyClaws) { + TitleContainer.removeTitle(title); + } } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java index 4a151129..6fa93735 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java @@ -53,14 +53,29 @@ public class RenderHelper { playNotificationSound(); } + /** + * Adds the title to {@link TitleContainer} and {@link #playNotificationSound() plays the notification sound} if the title is not in the {@link TitleContainer} already. + * No checking needs to be done on whether the title is in the {@link TitleContainer} already by the caller. + * + * @param title the title + */ public static void displayInTitleContainerAndPlaySound(Title title) { - TitleContainer.addTitle(title); - playNotificationSound(); + if (TitleContainer.addTitle(title)) { + playNotificationSound(); + } } - public static void displayInTitleContainerWDismissAndPlaySound(Title title, int ticks) { - TitleContainer.addTitleWithDismiss(title, ticks); - playNotificationSound(); + /** + * Adds the title to {@link TitleContainer} for a set number of ticks and {@link #playNotificationSound() plays the notification sound} if the title is not in the {@link TitleContainer} already. + * No checking needs to be done on whether the title is in the {@link TitleContainer} already by the caller. + * + * @param title the title + * @param ticks the number of ticks the title will remain + */ + public static void displayInTitleContainerAndPlaySound(Title title, int ticks) { + if (TitleContainer.addTitle(title, ticks)) { + playNotificationSound(); + } } private static void playNotificationSound() { diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java index 02162140..7b19e284 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java @@ -1,10 +1,13 @@ package me.xmrvizzy.skyblocker.utils; import me.xmrvizzy.skyblocker.SkyblockerMod; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.PriorityQueue; +import java.util.function.Supplier; /** * A scheduler for running tasks at a later time. Tasks will be run synchronously on the main client thread. Use the instance stored in {@link SkyblockerMod#scheduler}. Do not instantiate this class. @@ -50,6 +53,24 @@ public class Scheduler { } } + /** + * Schedules a screen to open in the next tick. Used in commands to avoid screen immediately closing after the command is executed. + * + * @param screenSupplier the supplier of the screen to open + */ + public void queueOpenScreen(Supplier<Screen> screenSupplier) { + queueOpenScreen(screenSupplier.get()); + } + + /** + * Schedules a screen to open in the next tick. Used in commands to avoid screen immediately closing after the command is executed. + * + * @param screen the supplier of the screen to open + */ + public void queueOpenScreen(Screen screen) { + MinecraftClient.getInstance().send(() -> MinecraftClient.getInstance().setScreen(screen)); + } + public void tick() { currentTick += 1; ScheduledTask task; diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java index d1977470..ac06eb36 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java @@ -1,14 +1,31 @@ package me.xmrvizzy.skyblocker.utils.title; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + public class Title { - public String text = ""; - public boolean active = true; - public int color; - public float lastX = 0; - public float lastY = 0; + private MutableText text; + protected float lastX = 0; + protected float lastY = 0; + + public MutableText getText() { + return text; + } + + public void setText(MutableText text) { + this.text = text; + } + + public void setFormatting(Formatting formatting) { + this.text.formatted(formatting); + } + + public Title(String textKey, Formatting formatting) { + this(Text.translatable(textKey).formatted(formatting)); + } - public Title(String text, int color) { + public Title(MutableText text) { this.text = text; - this.color = color; } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java index 14db8d6e..c4908a73 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.utils.title; +import com.mojang.brigadier.Command; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHudConfigScreen; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; @@ -12,55 +12,99 @@ import net.minecraft.client.gui.DrawContext; import net.minecraft.text.Text; import net.minecraft.util.math.MathHelper; -import java.util.ArrayList; -import java.util.List; +import java.util.LinkedHashSet; +import java.util.Set; public class TitleContainer { - public static final MinecraftClient client = MinecraftClient.getInstance(); - public static List<Title> titles = new ArrayList<>(); + /** + * The set of titles which will be rendered. + * + * @see #containsTitle(Title) + * @see #addTitle(Title) + * @see #addTitle(Title, int) + * @see #removeTitle(Title) + */ + private static final Set<Title> titles = new LinkedHashSet<>(); public static void init() { - HudRenderCallback.EVENT.register(TitleContainer::draw); + HudRenderCallback.EVENT.register(TitleContainer::render); ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker") .then(ClientCommandManager.literal("hud") .then(ClientCommandManager.literal("titleContainer") .executes(context -> { - client.send(() -> client.setScreen(new TitleContainerConfigScreen(Text.of("Title Container HUD Config")))); - return 1; + SkyblockerMod.getInstance().scheduler.queueOpenScreen(new TitleContainerConfigScreen(Text.of("Title Container HUD Config"))); + return Command.SINGLE_SUCCESS; }))))); } - public static void addTitle(Title title) { - title.active = true; - title.lastX = 0; - title.lastY = SkyblockerConfig.get().general.titleContainer.y; - titles.add(title); + + /** + * Returns {@code true} if the title is currently shown. + * + * @param title the title to check + * @return whether the title in currently shown + */ + public static boolean containsTitle(Title title) { + return titles.contains(title); } - public static void addTitleWithDismiss(Title title, int ticks) { - addTitle(title); - SkyblockerMod.getInstance().scheduler.schedule(() -> { - title.active = false; - }, ticks); + + /** + * Adds a title to be shown + * + * @param title the title to be shown + * @return whether the title is already currently being shown + */ + public static boolean addTitle(Title title) { + if (titles.add(title)) { + title.lastX = 0; + title.lastY = SkyblockerConfig.get().general.titleContainer.y; + return true; + } + return false; } - public static void draw(DrawContext context, float tickDelta) { - draw(titles, SkyblockerConfig.get().general.titleContainer.x, SkyblockerConfig.get().general.titleContainer.y, context, tickDelta, false); + + /** + * Adds a title to be shown for a set number of ticks + * + * @param title the title to be shown + * @param ticks the number of ticks to show the title + * @return whether the title is already currently being shown + */ + public static boolean addTitle(Title title, int ticks) { + if (addTitle(title)) { + SkyblockerMod.getInstance().scheduler.schedule(() -> TitleContainer.removeTitle(title), ticks); + return true; + } + return false; + } + + /** + * Stops showing a title + * + * @param title the title to stop showing + */ + public static void removeTitle(Title title) { + titles.remove(title); } - public static void draw(List<Title> titlesToDraw, int xPos, int yPos, DrawContext context, float tickDelta, boolean example) { + + private static void render(DrawContext context, float tickDelta) { + render(context, titles, SkyblockerConfig.get().general.titleContainer.x, SkyblockerConfig.get().general.titleContainer.y, tickDelta); + } + + protected static void render(DrawContext context, Set<Title> titles, int xPos, int yPos, float tickDelta) { var client = MinecraftClient.getInstance(); TextRenderer textRenderer = client.textRenderer; - List<Title> toRemove = new ArrayList<>(); - float scale = 3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F); - var direction = SkyblockerConfig.get().general.titleContainer.direction; - var alignment = SkyblockerConfig.get().general.titleContainer.alignment; + SkyblockerConfig.Direction direction = SkyblockerConfig.get().general.titleContainer.direction; + SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; float x = 0; float y; float width = 0; - for (Title title : titlesToDraw) { - width += textRenderer.getWidth(title.text) * scale + 10; + for (Title title : titles) { + width += textRenderer.getWidth(title.getText()) * scale + 10; } - if(direction == SkyblockerConfig.Direction.HORIZONTAL) { + if (direction == SkyblockerConfig.Direction.HORIZONTAL) { if (alignment == SkyblockerConfig.Alignment.MIDDLE) { x = xPos - (width / 2); } @@ -69,51 +113,45 @@ public class TitleContainer { x = xPos; } } - if(alignment == SkyblockerConfig.Alignment.LEFT || alignment == SkyblockerConfig.Alignment.RIGHT) { + if (alignment == SkyblockerConfig.Alignment.LEFT || alignment == SkyblockerConfig.Alignment.RIGHT) { x = xPos; } y = yPos; - for (Title title : titlesToDraw) { + for (Title title : titles) { context.getMatrices().push(); context.getMatrices().translate(title.lastX, title.lastY, 200); context.getMatrices().scale(scale, scale, scale); - float xToUse = 0; - if(direction == SkyblockerConfig.Direction.HORIZONTAL) { + float xToUse; + if (direction == SkyblockerConfig.Direction.HORIZONTAL) { xToUse = alignment == SkyblockerConfig.Alignment.RIGHT ? - x - (textRenderer.getWidth(title.text) * scale) : + x - (textRenderer.getWidth(title.getText()) * scale) : x; } else { xToUse = alignment == SkyblockerConfig.Alignment.MIDDLE ? - x - (textRenderer.getWidth(title.text) * scale) / 2 : + x - (textRenderer.getWidth(title.getText()) * scale) / 2 : alignment == SkyblockerConfig.Alignment.RIGHT ? - x - (textRenderer.getWidth(title.text) * scale) : + x - (textRenderer.getWidth(title.getText()) * scale) : x; } title.lastX = MathHelper.lerp(tickDelta * 0.5F, title.lastX, xToUse); title.lastY = MathHelper.lerp(tickDelta * 0.5F, title.lastY, y); - if(direction == SkyblockerConfig.Direction.HORIZONTAL) { + if (direction == SkyblockerConfig.Direction.HORIZONTAL) { if (alignment == SkyblockerConfig.Alignment.MIDDLE || alignment == SkyblockerConfig.Alignment.LEFT) { - x += textRenderer.getWidth(title.text) * scale + 10; + x += textRenderer.getWidth(title.getText()) * scale + 10; } if (alignment == SkyblockerConfig.Alignment.RIGHT) { - x -= textRenderer.getWidth(title.text) * scale + 10; + x -= textRenderer.getWidth(title.getText()) * scale + 10; } } else { y += textRenderer.fontHeight * scale + 10; } - context.drawText(textRenderer, title.text, 0, 0, title.color, true); + context.drawTextWithShadow(textRenderer, title.getText(), 0, 0, 0xFFFFFF); context.getMatrices().pop(); - if (!title.active && !example) { - toRemove.add(title); - } - } - if (!example) { - titlesToDraw.removeAll(toRemove); } } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java index a035f862..b4f3093f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java @@ -2,29 +2,26 @@ package me.xmrvizzy.skyblocker.utils.title; import me.shedaniel.autoconfig.AutoConfig; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud; import me.xmrvizzy.skyblocker.utils.RenderUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.input.KeyCodes; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import net.minecraft.util.math.Box; -import org.joml.Vector4i; +import net.minecraft.util.Pair; +import org.joml.Vector2i; import org.lwjgl.glfw.GLFW; import java.awt.*; -import java.awt.event.KeyEvent; -import java.util.List; +import java.util.Set; public class TitleContainerConfigScreen extends Screen { - - private final Title example1 = new Title("Test1", Formatting.RED.getColorValue()); - private final Title example2 = new Title("Test23", Formatting.AQUA.getColorValue()); - private final Title example3 = new Title("Testing1234", Formatting.DARK_GREEN.getColorValue()); + private final Title example1 = new Title(Text.literal("Test1").formatted(Formatting.RED)); + private final Title example2 = new Title(Text.literal("Test23").formatted(Formatting.AQUA)); + private final Title example3 = new Title(Text.literal("Testing1234").formatted(Formatting.DARK_GREEN)); private int hudX = SkyblockerConfig.get().general.titleContainer.x; private int hudY = SkyblockerConfig.get().general.titleContainer.y; + protected TitleContainerConfigScreen(Text title) { super(title); } @@ -33,25 +30,18 @@ public class TitleContainerConfigScreen extends Screen { public void render(DrawContext context, int mouseX, int mouseY, float delta) { super.render(context, mouseX, mouseY, delta); renderBackground(context); - TitleContainer.draw(List.of(example1, example2, example3), hudX, hudY, context, delta, true); - context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB()); - var direction = SkyblockerConfig.get().general.titleContainer.direction; - var alignment = SkyblockerConfig.get().general.titleContainer.alignment; - int width1 = client.textRenderer.getWidth("Press Q/E to change Alignment: " + alignment.toString()); - int width2 = client.textRenderer.getWidth("Press R to change Direction: " + direction.toString()); - context.drawText(client.textRenderer, "Press Q/E to change Alignment: " + alignment.toString(), (width / 2) - width1 / 2, client.textRenderer.fontHeight * 2, Color.WHITE.getRGB(), true); - context.drawText(client.textRenderer, "Press R to change Direction: " + direction.toString(), (width / 2) - width2 / 2, client.textRenderer.fontHeight * 3 + 5, Color.WHITE.getRGB(), true); - - int x1; - int x2; - int y1; - int y2; - - var vec = getSelectionBounding(); - x1 = vec.x; - x2 = vec.y; - y1 = vec.z; - y2 = vec.w; + TitleContainer.render(context, Set.of(example1, example2, example3), hudX, hudY, delta); + SkyblockerConfig.Direction direction = SkyblockerConfig.get().general.titleContainer.direction; + SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; + context.drawCenteredTextWithShadow(client.textRenderer, "Press Q/E to change Alignment: " + alignment, width / 2, client.textRenderer.fontHeight * 2, Color.WHITE.getRGB()); + context.drawCenteredTextWithShadow(client.textRenderer, "Press R to change Direction: " + direction, width / 2, client.textRenderer.fontHeight * 3 + 5, Color.WHITE.getRGB()); + context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, client.textRenderer.fontHeight * 4 + 10, Color.GRAY.getRGB()); + + Pair<Vector2i, Vector2i> boundingBox = getSelectionBoundingBox(); + int x1 = boundingBox.getLeft().x; + int y1 = boundingBox.getLeft().y; + int x2 = boundingBox.getRight().x; + int y2 = boundingBox.getRight().y; context.drawHorizontalLine(x1, x2, y1, Color.RED.getRGB()); context.drawHorizontalLine(x1, x2, y2, Color.RED.getRGB()); @@ -59,46 +49,39 @@ public class TitleContainerConfigScreen extends Screen { context.drawVerticalLine(x2, y1, y2, Color.RED.getRGB()); } - public Vector4i getSelectionBounding() - { - var direction = SkyblockerConfig.get().general.titleContainer.direction; - var alignment = SkyblockerConfig.get().general.titleContainer.alignment; + public Pair<Vector2i, Vector2i> getSelectionBoundingBox() { + SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; int midWidth = getSelectionWidth() / 2; - int midHeight = getSelectionHeight() / 2; int x1 = 0; int x2 = 0; - int y1 = 0; - int y2 = 0; - y1 = hudY; - y2 = hudY + midHeight * 2; + int y1 = hudY; + int y2 = hudY + getSelectionHeight(); switch (alignment) { - case RIGHT: + case RIGHT -> { x1 = hudX - midWidth * 2; x2 = hudX; - break; - case MIDDLE: + } + case MIDDLE -> { x1 = hudX - midWidth; x2 = hudX + midWidth; - break; - case LEFT: + } + case LEFT -> { x1 = hudX; x2 = hudX + midWidth * 2; - break; + } } - return new Vector4i(x1, x2, y1, y2); + return new Pair<>(new Vector2i(x1, y1), new Vector2i(x2, y2)); } - public int getSelectionHeight() - { + public int getSelectionHeight() { int scale = (int) (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F)); return SkyblockerConfig.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ? textRenderer.fontHeight * scale : (textRenderer.fontHeight + 10) * 3 * scale; } - public int getSelectionWidth() - { + public int getSelectionWidth() { int scale = (int) (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F)); return SkyblockerConfig.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ? (textRenderer.getWidth("Test1") + 10 + textRenderer.getWidth("Test23") + 10 + textRenderer.getWidth("Testing1234")) * scale : @@ -111,16 +94,11 @@ public class TitleContainerConfigScreen extends Screen { int midHeight = getSelectionHeight() / 2; var alignment = SkyblockerConfig.get().general.titleContainer.alignment; - int x1; - int x2; - int y1; - int y2; - - var vec = getSelectionBounding(); - x1 = vec.x; - x2 = vec.y; - y1 = vec.z; - y2 = vec.w; + Pair<Vector2i, Vector2i> boundingBox = getSelectionBoundingBox(); + int x1 = boundingBox.getLeft().x; + int y1 = boundingBox.getLeft().y; + int x2 = boundingBox.getRight().x; + int y2 = boundingBox.getRight().y; if (RenderUtils.pointExistsInArea((int) mouseX, (int) mouseY, x1, y1, x2, y2) && button == 0) { hudX = alignment == SkyblockerConfig.Alignment.RIGHT ? @@ -135,31 +113,31 @@ public class TitleContainerConfigScreen extends Screen { public boolean mouseClicked(double mouseX, double mouseY, int button) { if (button == 1) { hudX = this.width / 2; - hudY = (int) (this.height * 0.6F); + hudY = this.height / 2; } return super.mouseClicked(mouseX, mouseY, button); } @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if(keyCode == GLFW.GLFW_KEY_Q) { - var current = SkyblockerConfig.get().general.titleContainer.alignment; + if (keyCode == GLFW.GLFW_KEY_Q) { + SkyblockerConfig.Alignment current = SkyblockerConfig.get().general.titleContainer.alignment; SkyblockerConfig.get().general.titleContainer.alignment = switch (current) { case LEFT -> SkyblockerConfig.Alignment.MIDDLE; case MIDDLE -> SkyblockerConfig.Alignment.RIGHT; case RIGHT -> SkyblockerConfig.Alignment.LEFT; }; } - if(keyCode == GLFW.GLFW_KEY_E) { - var current = SkyblockerConfig.get().general.titleContainer.alignment; + if (keyCode == GLFW.GLFW_KEY_E) { + SkyblockerConfig.Alignment current = SkyblockerConfig.get().general.titleContainer.alignment; SkyblockerConfig.get().general.titleContainer.alignment = switch (current) { case LEFT -> SkyblockerConfig.Alignment.RIGHT; case MIDDLE -> SkyblockerConfig.Alignment.LEFT; case RIGHT -> SkyblockerConfig.Alignment.MIDDLE; }; } - if(keyCode == GLFW.GLFW_KEY_R) { - var current = SkyblockerConfig.get().general.titleContainer.direction; + if (keyCode == GLFW.GLFW_KEY_R) { + SkyblockerConfig.Direction current = SkyblockerConfig.get().general.titleContainer.direction; SkyblockerConfig.get().general.titleContainer.direction = switch (current) { case HORIZONTAL -> SkyblockerConfig.Direction.VERTICAL; case VERTICAL -> SkyblockerConfig.Direction.HORIZONTAL; -- cgit From 28dde248aae76db0f82df54e7757292ecb5693ea Mon Sep 17 00:00:00 2001 From: Futuremappermydud <54294576+Futuremappermydud@users.noreply.github.com> Date: Sat, 8 Jul 2023 09:33:18 -0400 Subject: Make Some more changes Add +/- to change scale Mouse now properly goes to center for text box Added comments to rendering code --- .../skyblocker/utils/title/TitleContainer.java | 34 +++++++++++++++------- .../utils/title/TitleContainerConfigScreen.java | 22 ++++++++++---- 2 files changed, 40 insertions(+), 16 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java index c4908a73..10b2553a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java @@ -94,62 +94,76 @@ public class TitleContainer { var client = MinecraftClient.getInstance(); TextRenderer textRenderer = client.textRenderer; + // Calculate Scale to use float scale = 3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F); + // Grab direction and alignment values SkyblockerConfig.Direction direction = SkyblockerConfig.get().general.titleContainer.direction; SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; + // x/y refer to the starting position for the text + // y always starts at yPos float x = 0; - float y; + float y = yPos; + + //Calculate the width of combined text float width = 0; for (Title title : titles) { width += textRenderer.getWidth(title.getText()) * scale + 10; } - if (direction == SkyblockerConfig.Direction.HORIZONTAL) { - if (alignment == SkyblockerConfig.Alignment.MIDDLE) { + + if (alignment == SkyblockerConfig.Alignment.MIDDLE) { + if (direction == SkyblockerConfig.Direction.HORIZONTAL) { + //If middle aligned horizontally, start the xPosition at half of the width to the left. x = xPos - (width / 2); - } - } else { - if (alignment == SkyblockerConfig.Alignment.MIDDLE) { + } else { + //If middle aligned vertically, start at xPos, we will shift each text to the left later x = xPos; } } if (alignment == SkyblockerConfig.Alignment.LEFT || alignment == SkyblockerConfig.Alignment.RIGHT) { + //If left or right aligned, start at xPos, we will shift each text later x = xPos; } - y = yPos; for (Title title : titles) { + //Translate the matrix to the texts position and scale context.getMatrices().push(); context.getMatrices().translate(title.lastX, title.lastY, 200); context.getMatrices().scale(scale, scale, scale); + //Calculate which x the text should use float xToUse; if (direction == SkyblockerConfig.Direction.HORIZONTAL) { xToUse = alignment == SkyblockerConfig.Alignment.RIGHT ? - x - (textRenderer.getWidth(title.getText()) * scale) : + x - (textRenderer.getWidth(title.getText()) * scale) : //if right aligned we need the text position to be aligned on the right side. x; } else { xToUse = alignment == SkyblockerConfig.Alignment.MIDDLE ? - x - (textRenderer.getWidth(title.getText()) * scale) / 2 : + x - (textRenderer.getWidth(title.getText()) * scale) / 2 : //if middle aligned we need the text position to be aligned in the middle. alignment == SkyblockerConfig.Alignment.RIGHT ? - x - (textRenderer.getWidth(title.getText()) * scale) : + x - (textRenderer.getWidth(title.getText()) * scale) : //if right aligned we need the text position to be aligned on the right side. x; } + //Lerp the texts x and y variables title.lastX = MathHelper.lerp(tickDelta * 0.5F, title.lastX, xToUse); title.lastY = MathHelper.lerp(tickDelta * 0.5F, title.lastY, y); if (direction == SkyblockerConfig.Direction.HORIZONTAL) { if (alignment == SkyblockerConfig.Alignment.MIDDLE || alignment == SkyblockerConfig.Alignment.LEFT) { + //Move to the right if middle or left aligned x += textRenderer.getWidth(title.getText()) * scale + 10; } if (alignment == SkyblockerConfig.Alignment.RIGHT) { + //Move to the left if right aligned x -= textRenderer.getWidth(title.getText()) * scale + 10; } } else { + //Y always moves by the same amount if vertical y += textRenderer.fontHeight * scale + 10; } + //Draw text context.drawTextWithShadow(textRenderer, title.getText(), 0, 0, 0xFFFFFF); context.getMatrices().pop(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java index b4f3093f..be5cc58d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java @@ -14,6 +14,7 @@ import org.lwjgl.glfw.GLFW; import java.awt.*; import java.util.Set; +import java.util.stream.Collectors; public class TitleContainerConfigScreen extends Screen { private final Title example1 = new Title(Text.literal("Test1").formatted(Formatting.RED)); @@ -33,9 +34,10 @@ public class TitleContainerConfigScreen extends Screen { TitleContainer.render(context, Set.of(example1, example2, example3), hudX, hudY, delta); SkyblockerConfig.Direction direction = SkyblockerConfig.get().general.titleContainer.direction; SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; - context.drawCenteredTextWithShadow(client.textRenderer, "Press Q/E to change Alignment: " + alignment, width / 2, client.textRenderer.fontHeight * 2, Color.WHITE.getRGB()); - context.drawCenteredTextWithShadow(client.textRenderer, "Press R to change Direction: " + direction, width / 2, client.textRenderer.fontHeight * 3 + 5, Color.WHITE.getRGB()); - context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, client.textRenderer.fontHeight * 4 + 10, Color.GRAY.getRGB()); + context.drawCenteredTextWithShadow(textRenderer, "Press Q/E to change Alignment: " + alignment, width / 2, textRenderer.fontHeight * 2, Color.WHITE.getRGB()); + context.drawCenteredTextWithShadow(textRenderer, "Press R to change Direction: " + direction, width / 2, textRenderer.fontHeight * 3 + 5, Color.WHITE.getRGB()); + context.drawCenteredTextWithShadow(textRenderer, "Press +/- to change Scale", width / 2, textRenderer.fontHeight * 4 + 10, Color.WHITE.getRGB()); + context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, textRenderer.fontHeight * 5 + 15, Color.GRAY.getRGB()); Pair<Vector2i, Vector2i> boundingBox = getSelectionBoundingBox(); int x1 = boundingBox.getLeft().x; @@ -101,9 +103,11 @@ public class TitleContainerConfigScreen extends Screen { int y2 = boundingBox.getRight().y; if (RenderUtils.pointExistsInArea((int) mouseX, (int) mouseY, x1, y1, x2, y2) && button == 0) { - hudX = alignment == SkyblockerConfig.Alignment.RIGHT ? - (int) mouseX + midWidth : - (int) mouseX - (midWidth / 2); + hudX = switch (alignment) { + case LEFT ->(int) mouseX - midWidth; + case MIDDLE -> (int) mouseX; + case RIGHT -> (int) mouseX + midWidth; + }; hudY = (int) mouseY - (midHeight); } return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); @@ -143,6 +147,12 @@ public class TitleContainerConfigScreen extends Screen { case VERTICAL -> SkyblockerConfig.Direction.HORIZONTAL; }; } + if (keyCode == GLFW.GLFW_KEY_EQUAL) { + SkyblockerConfig.get().general.titleContainer.titleContainerScale += 10; + } + if (keyCode == GLFW.GLFW_KEY_MINUS) { + SkyblockerConfig.get().general.titleContainer.titleContainerScale -= 10; + } return super.keyPressed(keyCode, scanCode, modifiers); } -- cgit From c2d1d4d98bad10860629b00de89134a7cf590e06 Mon Sep 17 00:00:00 2001 From: Futuremappermydud <54294576+Futuremappermydud@users.noreply.github.com> Date: Sat, 8 Jul 2023 09:45:20 -0400 Subject: Fix scaling issues --- .../utils/title/TitleContainerConfigScreen.java | 65 +++++++++++----------- 1 file changed, 33 insertions(+), 32 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java index be5cc58d..08a902ab 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java @@ -6,6 +6,7 @@ import me.xmrvizzy.skyblocker.utils.RenderUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.util.math.Vector2f; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Pair; @@ -20,8 +21,8 @@ public class TitleContainerConfigScreen extends Screen { private final Title example1 = new Title(Text.literal("Test1").formatted(Formatting.RED)); private final Title example2 = new Title(Text.literal("Test23").formatted(Formatting.AQUA)); private final Title example3 = new Title(Text.literal("Testing1234").formatted(Formatting.DARK_GREEN)); - private int hudX = SkyblockerConfig.get().general.titleContainer.x; - private int hudY = SkyblockerConfig.get().general.titleContainer.y; + private float hudX = SkyblockerConfig.get().general.titleContainer.x; + private float hudY = SkyblockerConfig.get().general.titleContainer.y; protected TitleContainerConfigScreen(Text title) { super(title); @@ -31,7 +32,7 @@ public class TitleContainerConfigScreen extends Screen { public void render(DrawContext context, int mouseX, int mouseY, float delta) { super.render(context, mouseX, mouseY, delta); renderBackground(context); - TitleContainer.render(context, Set.of(example1, example2, example3), hudX, hudY, delta); + TitleContainer.render(context, Set.of(example1, example2, example3), (int) hudX, (int) hudY, delta); SkyblockerConfig.Direction direction = SkyblockerConfig.get().general.titleContainer.direction; SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; context.drawCenteredTextWithShadow(textRenderer, "Press Q/E to change Alignment: " + alignment, width / 2, textRenderer.fontHeight * 2, Color.WHITE.getRGB()); @@ -39,11 +40,11 @@ public class TitleContainerConfigScreen extends Screen { context.drawCenteredTextWithShadow(textRenderer, "Press +/- to change Scale", width / 2, textRenderer.fontHeight * 4 + 10, Color.WHITE.getRGB()); context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, textRenderer.fontHeight * 5 + 15, Color.GRAY.getRGB()); - Pair<Vector2i, Vector2i> boundingBox = getSelectionBoundingBox(); - int x1 = boundingBox.getLeft().x; - int y1 = boundingBox.getLeft().y; - int x2 = boundingBox.getRight().x; - int y2 = boundingBox.getRight().y; + Pair<Vector2f, Vector2f> boundingBox = getSelectionBoundingBox(); + int x1 = (int) boundingBox.getLeft().getX(); + int y1 = (int) boundingBox.getLeft().getY(); + int x2 = (int) boundingBox.getRight().getX(); + int y2 = (int) boundingBox.getRight().getY(); context.drawHorizontalLine(x1, x2, y1, Color.RED.getRGB()); context.drawHorizontalLine(x1, x2, y2, Color.RED.getRGB()); @@ -51,14 +52,14 @@ public class TitleContainerConfigScreen extends Screen { context.drawVerticalLine(x2, y1, y2, Color.RED.getRGB()); } - public Pair<Vector2i, Vector2i> getSelectionBoundingBox() { + public Pair<Vector2f, Vector2f> getSelectionBoundingBox() { SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; - int midWidth = getSelectionWidth() / 2; - int x1 = 0; - int x2 = 0; - int y1 = hudY; - int y2 = hudY + getSelectionHeight(); + float midWidth = getSelectionWidth() / 2F; + float x1 = 0; + float x2 = 0; + float y1 = hudY; + float y2 = hudY + getSelectionHeight(); switch (alignment) { case RIGHT -> { x1 = hudX - midWidth * 2; @@ -73,18 +74,18 @@ public class TitleContainerConfigScreen extends Screen { x2 = hudX + midWidth * 2; } } - return new Pair<>(new Vector2i(x1, y1), new Vector2i(x2, y2)); + return new Pair<>(new Vector2f(x1, y1), new Vector2f(x2, y2)); } - public int getSelectionHeight() { - int scale = (int) (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F)); + public float getSelectionHeight() { + float scale = (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F)); return SkyblockerConfig.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ? - textRenderer.fontHeight * scale : - (textRenderer.fontHeight + 10) * 3 * scale; + (textRenderer.fontHeight * scale) : + (textRenderer.fontHeight + 10F) * 3F * scale; } - public int getSelectionWidth() { - int scale = (int) (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F)); + public float getSelectionWidth() { + float scale = (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F)); return SkyblockerConfig.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ? (textRenderer.getWidth("Test1") + 10 + textRenderer.getWidth("Test23") + 10 + textRenderer.getWidth("Testing1234")) * scale : textRenderer.getWidth("Testing1234") * scale; @@ -92,23 +93,23 @@ public class TitleContainerConfigScreen extends Screen { @Override public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { - int midWidth = getSelectionWidth() / 2; - int midHeight = getSelectionHeight() / 2; + float midWidth = getSelectionWidth() / 2; + float midHeight = getSelectionHeight() / 2; var alignment = SkyblockerConfig.get().general.titleContainer.alignment; - Pair<Vector2i, Vector2i> boundingBox = getSelectionBoundingBox(); - int x1 = boundingBox.getLeft().x; - int y1 = boundingBox.getLeft().y; - int x2 = boundingBox.getRight().x; - int y2 = boundingBox.getRight().y; + Pair<Vector2f, Vector2f> boundingBox = getSelectionBoundingBox(); + float x1 = boundingBox.getLeft().getX(); + float y1 = boundingBox.getLeft().getY(); + float x2 = boundingBox.getRight().getX(); + float y2 = boundingBox.getRight().getY(); - if (RenderUtils.pointExistsInArea((int) mouseX, (int) mouseY, x1, y1, x2, y2) && button == 0) { + if (RenderUtils.pointExistsInArea((int) mouseX, (int) mouseY, (int) x1, (int) y1, (int) x2, (int) y2) && button == 0) { hudX = switch (alignment) { case LEFT ->(int) mouseX - midWidth; case MIDDLE -> (int) mouseX; case RIGHT -> (int) mouseX + midWidth; }; - hudY = (int) mouseY - (midHeight); + hudY = (int) (mouseY - midHeight); } return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); } @@ -158,8 +159,8 @@ public class TitleContainerConfigScreen extends Screen { @Override public void close() { - SkyblockerConfig.get().general.titleContainer.x = hudX; - SkyblockerConfig.get().general.titleContainer.y = hudY; + SkyblockerConfig.get().general.titleContainer.x = (int) hudX; + SkyblockerConfig.get().general.titleContainer.y = (int) hudY; AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); super.close(); } -- cgit From f2fb1c3d1152efc3cc4741f02fd42dce836bcbb1 Mon Sep 17 00:00:00 2001 From: Futuremappermydud <54294576+Futuremappermydud@users.noreply.github.com> Date: Sat, 8 Jul 2023 13:53:26 -0400 Subject: Move to default y position back to 60% --- .../me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java index 08a902ab..23df1f6c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java @@ -118,7 +118,7 @@ public class TitleContainerConfigScreen extends Screen { public boolean mouseClicked(double mouseX, double mouseY, int button) { if (button == 1) { hudX = this.width / 2; - hudY = this.height / 2; + hudY = this.height * 0.6F; } return super.mouseClicked(mouseX, mouseY, button); } -- cgit From 85e5615bac19cf70d00653355f1e01e7d1849f37 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Sun, 9 Jul 2023 10:01:51 +0800 Subject: Refactor Title --- .../me/xmrvizzy/skyblocker/utils/title/Title.java | 33 ++++++++++++++++------ .../utils/title/TitleContainerConfigScreen.java | 13 ++++----- 2 files changed, 30 insertions(+), 16 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java index ac06eb36..7dfef3d9 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java @@ -4,11 +4,36 @@ import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +/** + * Represents a title used for {@link TitleContainer}. + * + * @see TitleContainer + */ public class Title { private MutableText text; protected float lastX = 0; protected float lastY = 0; + /** + * Constructs a new title with the given translation key and formatting to be applied. + * + * @param textKey the translation key + * @param formatting the formatting to be applied to the text + */ + public Title(String textKey, Formatting formatting) { + this(Text.translatable(textKey).formatted(formatting)); + } + + /** + * Constructs a new title with the given {@link MutableText}. + * Use {@link Text#literal(String)} or {@link Text#translatable(String)} to create a {@link MutableText} + * + * @param text the mutable text + */ + public Title(MutableText text) { + this.text = text; + } + public MutableText getText() { return text; } @@ -20,12 +45,4 @@ public class Title { public void setFormatting(Formatting formatting) { this.text.formatted(formatting); } - - public Title(String textKey, Formatting formatting) { - this(Text.translatable(textKey).formatted(formatting)); - } - - public Title(MutableText text) { - this.text = text; - } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java index 23df1f6c..e729ea15 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java @@ -3,19 +3,16 @@ package me.xmrvizzy.skyblocker.utils.title; import me.shedaniel.autoconfig.AutoConfig; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.RenderUtils; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.util.math.Vector2f; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Pair; -import org.joml.Vector2i; import org.lwjgl.glfw.GLFW; import java.awt.*; import java.util.Set; -import java.util.stream.Collectors; public class TitleContainerConfigScreen extends Screen { private final Title example1 = new Title(Text.literal("Test1").formatted(Formatting.RED)); @@ -52,7 +49,7 @@ public class TitleContainerConfigScreen extends Screen { context.drawVerticalLine(x2, y1, y2, Color.RED.getRGB()); } - public Pair<Vector2f, Vector2f> getSelectionBoundingBox() { + private Pair<Vector2f, Vector2f> getSelectionBoundingBox() { SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; float midWidth = getSelectionWidth() / 2F; @@ -77,14 +74,14 @@ public class TitleContainerConfigScreen extends Screen { return new Pair<>(new Vector2f(x1, y1), new Vector2f(x2, y2)); } - public float getSelectionHeight() { + private float getSelectionHeight() { float scale = (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F)); return SkyblockerConfig.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ? (textRenderer.fontHeight * scale) : (textRenderer.fontHeight + 10F) * 3F * scale; } - public float getSelectionWidth() { + private float getSelectionWidth() { float scale = (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F)); return SkyblockerConfig.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ? (textRenderer.getWidth("Test1") + 10 + textRenderer.getWidth("Test23") + 10 + textRenderer.getWidth("Testing1234")) * scale : @@ -105,7 +102,7 @@ public class TitleContainerConfigScreen extends Screen { if (RenderUtils.pointExistsInArea((int) mouseX, (int) mouseY, (int) x1, (int) y1, (int) x2, (int) y2) && button == 0) { hudX = switch (alignment) { - case LEFT ->(int) mouseX - midWidth; + case LEFT -> (int) mouseX - midWidth; case MIDDLE -> (int) mouseX; case RIGHT -> (int) mouseX + midWidth; }; @@ -117,7 +114,7 @@ public class TitleContainerConfigScreen extends Screen { @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (button == 1) { - hudX = this.width / 2; + hudX = (float) this.width / 2; hudY = this.height * 0.6F; } return super.mouseClicked(mouseX, mouseY, button); -- cgit From 675913a65470a228eead892a2b1d58a4e2f253f5 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Sun, 9 Jul 2023 10:49:52 +0800 Subject: Update Title Container rendering --- .../me/xmrvizzy/skyblocker/utils/title/Title.java | 13 +++++++-- .../skyblocker/utils/title/TitleContainer.java | 32 ++++++++++++++-------- 2 files changed, 31 insertions(+), 14 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java index 7dfef3d9..4f6b2fb4 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java @@ -11,8 +11,8 @@ import net.minecraft.util.Formatting; */ public class Title { private MutableText text; - protected float lastX = 0; - protected float lastY = 0; + protected float x = -1; + protected float y = -1; /** * Constructs a new title with the given translation key and formatting to be applied. @@ -45,4 +45,13 @@ public class Title { public void setFormatting(Formatting formatting) { this.text.formatted(formatting); } + + protected boolean isDefaultPos() { + return x == -1 && y == -1; + } + + protected void resetPos() { + this.x = -1; + this.y = -1; + } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java index 10b2553a..a4e445ee 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java @@ -55,8 +55,7 @@ public class TitleContainer { */ public static boolean addTitle(Title title) { if (titles.add(title)) { - title.lastX = 0; - title.lastY = SkyblockerConfig.get().general.titleContainer.y; + title.resetPos(); return true; } return false; @@ -126,10 +125,6 @@ public class TitleContainer { } for (Title title : titles) { - //Translate the matrix to the texts position and scale - context.getMatrices().push(); - context.getMatrices().translate(title.lastX, title.lastY, 200); - context.getMatrices().scale(scale, scale, scale); //Calculate which x the text should use float xToUse; @@ -144,10 +139,27 @@ public class TitleContainer { x - (textRenderer.getWidth(title.getText()) * scale) : //if right aligned we need the text position to be aligned on the right side. x; } + + //Start displaying the title at the correct position, not at the default position + if (title.isDefaultPos()) { + title.x = xToUse; + title.y = y; + } + //Lerp the texts x and y variables - title.lastX = MathHelper.lerp(tickDelta * 0.5F, title.lastX, xToUse); - title.lastY = MathHelper.lerp(tickDelta * 0.5F, title.lastY, y); + title.x = MathHelper.lerp(tickDelta * 0.5F, title.x, xToUse); + title.y = MathHelper.lerp(tickDelta * 0.5F, title.y, y); + + //Translate the matrix to the texts position and scale + context.getMatrices().push(); + context.getMatrices().translate(title.x, title.y, 200); + context.getMatrices().scale(scale, scale, scale); + + //Draw text + context.drawTextWithShadow(textRenderer, title.getText(), 0, 0, 0xFFFFFF); + context.getMatrices().pop(); + //Calculate the x and y positions for the next title if (direction == SkyblockerConfig.Direction.HORIZONTAL) { if (alignment == SkyblockerConfig.Alignment.MIDDLE || alignment == SkyblockerConfig.Alignment.LEFT) { //Move to the right if middle or left aligned @@ -162,10 +174,6 @@ public class TitleContainer { //Y always moves by the same amount if vertical y += textRenderer.fontHeight * scale + 10; } - - //Draw text - context.drawTextWithShadow(textRenderer, title.getText(), 0, 0, 0xFFFFFF); - context.getMatrices().pop(); } } } \ No newline at end of file -- cgit From 324248b4c44d10d3a2cf5412b4ff4beeaa5f681c Mon Sep 17 00:00:00 2001 From: Futuremappermydud <54294576+Futuremappermydud@users.noreply.github.com> Date: Sun, 9 Jul 2023 13:38:46 -0400 Subject: Fix mania indicator --- .../java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java | 3 ++- src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java | 4 ---- 2 files changed, 2 insertions(+), 5 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java index 4e873eed..38f6b018 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java @@ -9,6 +9,7 @@ import me.xmrvizzy.skyblocker.utils.title.TitleContainer; import net.minecraft.block.Blocks; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.Entity; +import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.math.BlockPos; @@ -30,7 +31,7 @@ public class ManiaIndicator { anyMania = true; BlockPos pos = MinecraftClient.getInstance().player.getBlockPos().down(); boolean isGreen = MinecraftClient.getInstance().world.getBlockState(pos).getBlock() == Blocks.GREEN_TERRACOTTA; - title.setFormatting(isGreen ? Formatting.GREEN : Formatting.RED); + title.setText(Text.translatable("skyblocker.rift.mania").formatted(isGreen ? Formatting.GREEN : Formatting.RED)); RenderHelper.displayInTitleContainerAndPlaySound(title); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java index 4f6b2fb4..0a3bc845 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java @@ -42,10 +42,6 @@ public class Title { this.text = text; } - public void setFormatting(Formatting formatting) { - this.text.formatted(formatting); - } - protected boolean isDefaultPos() { return x == -1 && y == -1; } -- cgit