From fc65ff5b469fb384d2df422a5a6d8437012a819b Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Sat, 22 Jul 2023 14:43:00 +0800 Subject: Refactor utils package --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 13 +- .../skyblocker/config/SkyblockerConfig.java | 2 +- .../me/xmrvizzy/skyblocker/gui/ColorHighlight.java | 24 --- .../xmrvizzy/skyblocker/gui/ContainerSolver.java | 44 ------ .../skyblocker/gui/ContainerSolverManager.java | 124 --------------- .../skyblocker/mixin/HandledScreenMixin.java | 2 +- .../skyblocker/mixin/accessor/FrustumInvoker.java | 2 +- .../xmrvizzy/skyblocker/skyblock/FairySouls.java | 2 +- .../skyblocker/skyblock/FishingHelper.java | 4 +- .../skyblocker/skyblock/TeleportOverlay.java | 2 +- .../skyblocker/skyblock/dungeon/CroesusHelper.java | 4 +- .../skyblocker/skyblock/dungeon/DungeonBlaze.java | 51 +++--- .../skyblocker/skyblock/dungeon/DungeonMap.java | 2 +- .../skyblock/dungeon/DungeonMapConfigScreen.java | 8 +- .../skyblock/dungeon/terminal/ColorTerminal.java | 4 +- .../skyblock/dungeon/terminal/OrderTerminal.java | 4 +- .../dungeon/terminal/StartsWithTerminal.java | 4 +- .../skyblocker/skyblock/dwarven/DwarvenHud.java | 2 +- .../skyblock/dwarven/DwarvenHudConfigScreen.java | 4 +- .../skyblock/experiment/ChronomatronSolver.java | 2 +- .../skyblock/experiment/ExperimentSolver.java | 2 +- .../skyblock/experiment/SuperpairsSolver.java | 2 +- .../skyblock/experiment/UltrasequencerSolver.java | 2 +- .../skyblocker/skyblock/item/WikiLookup.java | 4 +- .../skyblocker/skyblock/rift/EffigyWaypoints.java | 2 +- .../skyblock/rift/HealingMelonIndicator.java | 6 +- .../skyblocker/skyblock/rift/ManiaIndicator.java | 6 +- .../skyblock/rift/MirrorverseWaypoints.java | 2 +- .../skyblocker/skyblock/rift/StakeIndicator.java | 9 +- .../skyblock/rift/TwinClawsIndicator.java | 9 +- .../skyblocker/skyblock/shortcut/Shortcuts.java | 2 +- .../java/me/xmrvizzy/skyblocker/utils/Boxes.java | 7 +- .../me/xmrvizzy/skyblocker/utils/FrustumUtils.java | 22 --- .../me/xmrvizzy/skyblocker/utils/ItemUtils.java | 8 +- .../skyblocker/utils/MessageScheduler.java | 63 -------- .../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 176 --------------------- .../me/xmrvizzy/skyblocker/utils/RenderUtils.java | 99 ------------ .../skyblocker/utils/RenderUtilsLiving.java | 151 ------------------ .../me/xmrvizzy/skyblocker/utils/Scheduler.java | 123 -------------- .../me/xmrvizzy/skyblocker/utils/Vertexer.java | 164 ------------------- .../xmrvizzy/skyblocker/utils/color/LineColor.java | 66 -------- .../xmrvizzy/skyblocker/utils/color/QuadColor.java | 107 ------------- .../skyblocker/utils/color/RenderColor.java | 27 ---- .../skyblocker/utils/culling/OcclusionCulling.java | 48 ------ .../skyblocker/utils/culling/WorldProvider.java | 29 ---- .../skyblocker/utils/culling/package-info.java | 4 - .../skyblocker/utils/render/FrustumUtils.java | 21 +++ .../skyblocker/utils/render/RenderHelper.java | 174 ++++++++++++++++++++ .../utils/render/culling/OcclusionCulling.java | 47 ++++++ .../utils/render/culling/WorldProvider.java | 28 ++++ .../utils/render/culling/package-info.java | 4 + .../utils/render/gui/ColorHighlight.java | 24 +++ .../utils/render/gui/ContainerSolver.java | 44 ++++++ .../utils/render/gui/ContainerSolverManager.java | 124 +++++++++++++++ .../skyblocker/utils/render/title/Title.java | 53 +++++++ .../utils/render/title/TitleContainer.java | 175 ++++++++++++++++++++ .../render/title/TitleContainerConfigScreen.java | 164 +++++++++++++++++++ .../utils/scheduler/MessageScheduler.java | 63 ++++++++ .../skyblocker/utils/scheduler/Scheduler.java | 123 ++++++++++++++ .../me/xmrvizzy/skyblocker/utils/title/Title.java | 53 ------- .../skyblocker/utils/title/TitleContainer.java | 175 -------------------- .../utils/title/TitleContainerConfigScreen.java | 164 ------------------- 62 files changed, 1128 insertions(+), 1752 deletions(-) delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/gui/ColorHighlight.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolver.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtils.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtilsLiving.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/Vertexer.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/color/LineColor.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/color/QuadColor.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/color/RenderColor.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/culling/OcclusionCulling.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/culling/WorldProvider.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/culling/package-info.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/render/FrustumUtils.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/render/culling/OcclusionCulling.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/render/culling/WorldProvider.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/render/culling/package-info.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/render/gui/ColorHighlight.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/render/gui/ContainerSolver.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/render/gui/ContainerSolverManager.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/render/title/Title.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/MessageScheduler.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index 4ec579ae..cc365ecf 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -5,7 +5,6 @@ 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.*; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMap; @@ -22,9 +21,13 @@ import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; import me.xmrvizzy.skyblocker.skyblock.shortcut.Shortcuts; 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.culling.OcclusionCulling; -import me.xmrvizzy.skyblocker.utils.title.TitleContainer; +import me.xmrvizzy.skyblocker.utils.NEURepo; +import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.render.culling.OcclusionCulling; +import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolverManager; +import me.xmrvizzy.skyblocker.utils.render.title.TitleContainer; +import me.xmrvizzy.skyblocker.utils.scheduler.MessageScheduler; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.loader.api.FabricLoader; @@ -87,6 +90,7 @@ public class SkyblockerMod implements ClientModInitializer { FishingHelper.init(); TabHud.init(); DungeonMap.init(); + DungeonBlaze.init(); TheRift.init(); TitleContainer.init(); OcclusionCulling.init(); @@ -97,7 +101,6 @@ public class SkyblockerMod implements ClientModInitializer { containerSolverManager.init(); scheduler.scheduleCyclic(Utils::update, 20); scheduler.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 100); - scheduler.scheduleCyclic(DungeonBlaze::update, 4); scheduler.scheduleCyclic(LividColor::update, 10); scheduler.scheduleCyclic(BackpackPreview::tick, 50); scheduler.scheduleCyclic(DwarvenHud::update, 40); diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 104c9c7a..5d370b52 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -14,7 +14,7 @@ import me.shedaniel.autoconfig.serializer.GsonConfigSerializer; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.chat.ChatFilterResult; import me.xmrvizzy.skyblocker.skyblock.item.CustomArmorTrims; -import me.xmrvizzy.skyblocker.utils.Scheduler; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.resource.language.I18n; diff --git a/src/main/java/me/xmrvizzy/skyblocker/gui/ColorHighlight.java b/src/main/java/me/xmrvizzy/skyblocker/gui/ColorHighlight.java deleted file mode 100644 index 4367e6e7..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/gui/ColorHighlight.java +++ /dev/null @@ -1,24 +0,0 @@ -package me.xmrvizzy.skyblocker.gui; - -public record ColorHighlight(int slot, int color) { - private static final int RED_HIGHLIGHT = 64 << 24 | 255 << 16; - private static final int YELLOW_HIGHLIGHT = 128 << 24 | 255 << 16 | 255 << 8; - private static final int GREEN_HIGHLIGHT = 128 << 24 | 64 << 16 | 196 << 8 | 64; - private static final int GRAY_HIGHLIGHT = 128 << 24 | 64 << 16 | 64 << 8 | 64; - - public static ColorHighlight red(int slot) { - return new ColorHighlight(slot, RED_HIGHLIGHT); - } - - public static ColorHighlight yellow(int slot) { - return new ColorHighlight(slot, YELLOW_HIGHLIGHT); - } - - public static ColorHighlight green(int slot) { - return new ColorHighlight(slot, GREEN_HIGHLIGHT); - } - - public static ColorHighlight gray(int slot) { - return new ColorHighlight(slot, GRAY_HIGHLIGHT); - } -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolver.java b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolver.java deleted file mode 100644 index c5e3cf09..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolver.java +++ /dev/null @@ -1,44 +0,0 @@ -package me.xmrvizzy.skyblocker.gui; - -import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; -import net.minecraft.item.ItemStack; - -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -/** - * Abstract class for gui solvers. Extend this class to add a new gui solver, like terminal solvers or experiment solvers. - */ -public abstract class ContainerSolver { - private final Pattern containerName; - - protected ContainerSolver(String containerName) { - this.containerName = Pattern.compile(containerName); - } - - protected abstract boolean isEnabled(); - - public Pattern getName() { - return containerName; - } - - protected void start(GenericContainerScreen screen) { - } - - protected void reset() { - } - - protected abstract List getColors(String[] groups, Map slots); - - protected void trimEdges(Map slots, int rows) { - for (int i = 0; i < rows; i++) { - slots.remove(9 * i); - slots.remove(9 * i + 8); - } - for (int i = 1; i < 8; i++) { - slots.remove(i); - slots.remove((rows - 1) * 9 + i); - } - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java deleted file mode 100644 index 7d187caa..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java +++ /dev/null @@ -1,124 +0,0 @@ -package me.xmrvizzy.skyblocker.gui; - -import com.mojang.blaze3d.systems.RenderSystem; -import me.xmrvizzy.skyblocker.mixin.accessor.HandledScreenAccessor; -import me.xmrvizzy.skyblocker.skyblock.dungeon.CroesusHelper; -import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.ColorTerminal; -import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.OrderTerminal; -import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.StartsWithTerminal; -import me.xmrvizzy.skyblocker.skyblock.experiment.ChronomatronSolver; -import me.xmrvizzy.skyblocker.skyblock.experiment.SuperpairsSolver; -import me.xmrvizzy.skyblocker.skyblock.experiment.UltrasequencerSolver; -import me.xmrvizzy.skyblocker.utils.Utils; -import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; -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; -import net.minecraft.screen.slot.Slot; -import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -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 { - private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile(""); - private final ContainerSolver[] solvers; - private ContainerSolver currentSolver = null; - private String[] groups; - private List highlights; - - public ContainerSolverManager() { - solvers = new ContainerSolver[]{ - new ColorTerminal(), - new OrderTerminal(), - new StartsWithTerminal(), - new CroesusHelper(), - new ChronomatronSolver(), - new SuperpairsSolver(), - new UltrasequencerSolver() - }; - } - - public ContainerSolver getCurrentSolver() { - return currentSolver; - } - - public void init() { - ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> { - if (Utils.isOnSkyblock() && screen instanceof GenericContainerScreen genericContainerScreen) { - 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(context, genericContainerScreen.getScreenHandler().slots.subList(0, genericContainerScreen.getScreenHandler().getRows() * 9)); - matrices.pop(); - }); - ScreenEvents.remove(screen).register(screen1 -> clearScreen()); - onSetScreen(genericContainerScreen); - } else { - clearScreen(); - } - }); - } - - public void onSetScreen(@NotNull GenericContainerScreen screen) { - String screenName = screen.getTitle().getString(); - Matcher matcher = PLACEHOLDER_PATTERN.matcher(screenName); - for (ContainerSolver solver : solvers) { - if (solver.isEnabled()) { - matcher.usePattern(solver.getName()); - matcher.reset(); - if (matcher.matches()) { - currentSolver = solver; - groups = new String[matcher.groupCount()]; - for (int i = 0; i < groups.length; i++) { - groups[i] = matcher.group(i + 1); - } - currentSolver.start(screen); - return; - } - } - } - clearScreen(); - } - - public void clearScreen() { - if (currentSolver != null) { - currentSolver.reset(); - currentSolver = null; - } - } - - public void markDirty() { - highlights = null; - } - - public void onDraw(DrawContext context, List slots) { - if (currentSolver == null) - return; - if (highlights == null) - highlights = currentSolver.getColors(groups, slotMap(slots)); - RenderSystem.enableDepthTest(); - RenderSystem.colorMask(true, true, true, false); - for (ColorHighlight highlight : highlights) { - Slot slot = slots.get(highlight.slot()); - int color = highlight.color(); - context.fillGradient(slot.x, slot.y, slot.x + 16, slot.y + 16, color, color); - } - RenderSystem.colorMask(true, true, true, true); - } - - private Map slotMap(List slots) { - Map slotMap = new TreeMap<>(); - for (int i = 0; i < slots.size(); i++) - slotMap.put(i, slots.get(i).getStack()); - return slotMap; - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index 8a57f752..af6f6aa7 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -2,7 +2,6 @@ package me.xmrvizzy.skyblocker.mixin; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.gui.ContainerSolver; import me.xmrvizzy.skyblocker.skyblock.BackpackPreview; import me.xmrvizzy.skyblocker.skyblock.experiment.ChronomatronSolver; import me.xmrvizzy.skyblocker.skyblock.experiment.ExperimentSolver; @@ -10,6 +9,7 @@ import me.xmrvizzy.skyblocker.skyblock.experiment.SuperpairsSolver; import me.xmrvizzy.skyblocker.skyblock.experiment.UltrasequencerSolver; import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; 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 3cde115e..9dacbe34 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java @@ -5,7 +5,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; /** - * Use {@link me.xmrvizzy.skyblocker.utils.FrustumUtils#isVisible(double, double, double, double, double, double) FrustumUtils#isVisible} which is shorter. For the purpose of avoiding object allocations! + * Use {@link me.xmrvizzy.skyblocker.utils.render.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 { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java index b7c4ff2f..ab6fa767 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java @@ -8,8 +8,8 @@ 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 me.xmrvizzy.skyblocker.utils.render.RenderHelper; 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; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java index b53157c5..f039a79d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java @@ -1,8 +1,8 @@ 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 me.xmrvizzy.skyblocker.utils.render.RenderHelper; +import me.xmrvizzy.skyblocker.utils.render.title.Title; import net.fabricmc.fabric.api.event.player.UseItemCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/TeleportOverlay.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/TeleportOverlay.java index e7c76160..6d7500a1 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/TeleportOverlay.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/TeleportOverlay.java @@ -3,8 +3,8 @@ package me.xmrvizzy.skyblocker.skyblock; import com.mojang.blaze3d.systems.RenderSystem; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; -import me.xmrvizzy.skyblocker.utils.RenderHelper; import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.render.RenderHelper; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; import net.minecraft.block.BlockState; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java index 44c8803f..0e56ece0 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.gui.ColorHighlight; -import me.xmrvizzy.skyblocker.gui.ContainerSolver; +import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight; +import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver; import net.minecraft.item.ItemStack; import java.util.ArrayList; 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 d0dcf1e1..94a81f15 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java @@ -1,11 +1,10 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; import it.unimi.dsi.fastutil.objects.ObjectIntPair; +import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.utils.RenderHelper; -import me.xmrvizzy.skyblocker.utils.RenderUtils; import me.xmrvizzy.skyblocker.utils.Utils; -import me.xmrvizzy.skyblocker.utils.color.QuadColor; +import me.xmrvizzy.skyblocker.utils.render.RenderHelper; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; import net.minecraft.client.MinecraftClient; @@ -22,31 +21,32 @@ import java.util.List; public class DungeonBlaze { private static final Logger LOGGER = LoggerFactory.getLogger(DungeonBlaze.class.getName()); + private static final float[] GREEN_COLOR_COMPONENTS = {0.0F, 1.0F, 0.0F}; private static final float[] WHITE_COLOR_COMPONENTS = { 1.0f, 1.0f, 1.0f }; static Entity highestBlaze = null; static Entity lowestBlaze = null; static Entity nextHighestBlaze = null; static Entity nextLowestBlaze = null; - static boolean renderHooked = false; - + + public static void init() { + SkyblockerMod.getInstance().scheduler.scheduleCyclic(DungeonBlaze::update, 10); + WorldRenderEvents.BEFORE_DEBUG_RENDER.register(DungeonBlaze::blazeRenderer); + } + public static void update() { + if (!SkyblockerConfig.get().locations.dungeons.blazesolver) return; ClientWorld world = MinecraftClient.getInstance().world; if (world == null || !Utils.isInDungeons()) return; - if (!renderHooked){ - - WorldRenderEvents.BEFORE_DEBUG_RENDER.register(DungeonBlaze::blazeRenderer); - renderHooked = true; - } Iterable entities = world.getEntities(); List> blazes = new ArrayList<>(); for (Entity entity : entities) { String blazeName = entity.getName().getString(); - + if (blazeName.contains("Blaze") && blazeName.contains("/")) { try { int health = Integer.parseInt(blazeName.substring(blazeName.indexOf("/") + 1, blazeName.length() - 1)); - + blazes.add(ObjectIntPair.of(entity, health)); } catch (NumberFormatException ex) { ex.printStackTrace(); @@ -70,36 +70,33 @@ public class DungeonBlaze { nextHighestBlaze = blazes.get(highestIndex - 1).left(); } } - + } - public static void blazeRenderer(WorldRenderContext wrc) { - QuadColor outlineColorRed = QuadColor.single( 0.0F, 1.0F, 0.0F, 1f); - QuadColor outlineColorGreen = QuadColor.single(1.0F, 0.0F, 0.0F, 1f); - QuadColor outlineColorWhite = QuadColor.single(1.0f, 1.0f, 1.0f, 1.0f); - + + public static void blazeRenderer(WorldRenderContext context) { try { - if (highestBlaze != null && lowestBlaze != null && highestBlaze.isAlive() && lowestBlaze.isAlive() && SkyblockerConfig.get().locations.dungeons.blazesolver){ + if (SkyblockerConfig.get().locations.dungeons.blazesolver && highestBlaze != null && lowestBlaze != null && highestBlaze.isAlive() && lowestBlaze.isAlive()) { /* Outline */ if (highestBlaze.getY() < 69) { Box blaze = highestBlaze.getBoundingBox().expand(0.3, 0.9, 0.3).offset(0, -1.1, 0); - RenderUtils.drawBoxOutline(blaze, outlineColorRed, 5f); - + RenderHelper.renderOutline(context, blaze, GREEN_COLOR_COMPONENTS); + if (nextHighestBlaze != null && nextHighestBlaze.isAlive() && nextHighestBlaze != highestBlaze) { Box nextBlaze = nextHighestBlaze.getBoundingBox().expand(0.3, 0.9, 0.3).offset(0, -1.1, 0); - RenderUtils.drawBoxOutline(nextBlaze, outlineColorWhite, 5f); - RenderHelper.renderLinesFromPoints(wrc, new Vec3d[] { blaze.getCenter(), nextBlaze.getCenter() }, WHITE_COLOR_COMPONENTS, 1f, 5f); + RenderHelper.renderOutline(context, nextBlaze, WHITE_COLOR_COMPONENTS); + RenderHelper.renderLinesFromPoints(context, new Vec3d[] { blaze.getCenter(), nextBlaze.getCenter() }, WHITE_COLOR_COMPONENTS, 1f, 5f); } } /* Outline */ if (lowestBlaze.getY() > 69) { Box blaze = lowestBlaze.getBoundingBox().expand(0.3, 0.9, 0.3).offset(0, -1.1, 0); - RenderUtils.drawBoxOutline(blaze, outlineColorRed, 5f); - + RenderHelper.renderOutline(context, blaze, GREEN_COLOR_COMPONENTS); + if (nextLowestBlaze != null && nextLowestBlaze.isAlive() && nextLowestBlaze != lowestBlaze) { Box nextBlaze = nextLowestBlaze.getBoundingBox().expand(0.3, 0.9, 0.3).offset(0, -1.1, 0); - RenderUtils.drawBoxOutline(nextBlaze, outlineColorWhite, 5f); - RenderHelper.renderLinesFromPoints(wrc, new Vec3d[] { blaze.getCenter(), nextBlaze.getCenter() }, WHITE_COLOR_COMPONENTS, 1f, 5f); + RenderHelper.renderOutline(context, nextBlaze, WHITE_COLOR_COMPONENTS); + RenderHelper.renderLinesFromPoints(context, new Vec3d[] { blaze.getCenter(), nextBlaze.getCenter() }, WHITE_COLOR_COMPONENTS, 1f, 5f); } } } 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 040c8aed..12e3f9d5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java @@ -1,7 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.utils.Scheduler; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.minecraft.client.MinecraftClient; 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 ef782c3b..f0ae1590 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java @@ -1,14 +1,14 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; -import java.awt.Color; - import me.shedaniel.autoconfig.AutoConfig; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.utils.RenderUtils; +import me.xmrvizzy.skyblocker.utils.render.RenderHelper; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Text; +import java.awt.*; + public class DungeonMapConfigScreen extends Screen { private int hudX = SkyblockerConfig.get().locations.dungeons.mapX; @@ -30,7 +30,7 @@ public class DungeonMapConfigScreen extends Screen { public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { float scaling = SkyblockerConfig.get().locations.dungeons.mapScaling; int size = (int) (128 * scaling); - if (RenderUtils.pointExistsInArea((int) mouseX, (int) mouseY, hudX, hudY, hudX + size, hudY + size) && button == 0) { + if (RenderHelper.pointIsInArea(mouseX, mouseY, hudX, hudY, hudX + size, hudY + size) && button == 0) { hudX = (int) Math.max(Math.min(mouseX - (size >> 1), this.width - size), 0); hudY = (int) Math.max(Math.min(mouseY - (size >> 1), this.height - size), 0); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java index add30907..7aac04b5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon.terminal; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.gui.ColorHighlight; -import me.xmrvizzy.skyblocker.gui.ContainerSolver; +import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight; +import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java index 3b4e1c50..01437919 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon.terminal; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.gui.ColorHighlight; -import me.xmrvizzy.skyblocker.gui.ContainerSolver; +import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight; +import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java index 18326254..988b570e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon.terminal; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.gui.ColorHighlight; -import me.xmrvizzy.skyblocker.gui.ContainerSolver; +import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight; +import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver; import net.minecraft.item.ItemStack; import java.util.ArrayList; 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 a52f288c..f7931d11 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java @@ -2,7 +2,7 @@ package me.xmrvizzy.skyblocker.skyblock.dwarven; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.CommsWidget; -import me.xmrvizzy.skyblocker.utils.Scheduler; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; 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; 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 10e62d88..3ab08bfb 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java @@ -2,7 +2,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 me.xmrvizzy.skyblocker.utils.render.RenderHelper; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Text; @@ -29,7 +29,7 @@ public class DwarvenHudConfigScreen extends Screen { @Override public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { - if (RenderUtils.pointExistsInArea((int) mouseX, (int) mouseY, hudX, hudY, hudX + 200, hudY + 40) && button == 0) { + if (RenderHelper.pointIsInArea(mouseX, mouseY, hudX, hudY, hudX + 200, hudY + 40) && button == 0) { hudX = (int) Math.max(Math.min(mouseX - 100, this.width - 200), 0); hudY = (int) Math.max(Math.min(mouseY - 20, this.height - 40), 0); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java index 40793169..d62383be 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java @@ -2,7 +2,7 @@ package me.xmrvizzy.skyblocker.skyblock.experiment; import com.google.common.collect.ImmutableMap; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.gui.ColorHighlight; +import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.inventory.Inventory; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java index 5dad908e..d0e5522d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java @@ -1,7 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.experiment; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.gui.ContainerSolver; +import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java index 9f6e8b2a..f329a395 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java @@ -1,7 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.experiment; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.gui.ColorHighlight; +import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.item.ItemStack; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java index 45d6c0c6..d4d80ee6 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java @@ -1,7 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.experiment; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.gui.ColorHighlight; +import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.inventory.Inventory; 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 d05e5cb8..a6412cf7 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java @@ -1,6 +1,5 @@ package me.xmrvizzy.skyblocker.skyblock.item; -import com.google.gson.Gson; import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; @@ -20,9 +19,8 @@ public class WikiLookup { public static KeyBinding wikiLookup; static final MinecraftClient client = MinecraftClient.getInstance(); static String id; - public static Gson gson = new Gson(); - public static void init(){ + public static void init() { wikiLookup = KeyBindingHelper.registerKeyBinding(new KeyBinding( "key.wikiLookup", InputUtil.Type.KEYSYM, 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 7376c896..1bd31653 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java @@ -1,8 +1,8 @@ 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.render.RenderHelper; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; 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 aa730c31..b547ebb5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java @@ -1,10 +1,10 @@ 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 me.xmrvizzy.skyblocker.utils.render.RenderHelper; +import me.xmrvizzy.skyblocker.utils.render.title.Title; +import me.xmrvizzy.skyblocker.utils.render.title.TitleContainer; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.util.Formatting; 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 38f6b018..16ab250a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java @@ -1,11 +1,11 @@ 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 me.xmrvizzy.skyblocker.utils.render.RenderHelper; +import me.xmrvizzy.skyblocker.utils.render.title.Title; +import me.xmrvizzy.skyblocker.utils.render.title.TitleContainer; import net.minecraft.block.Blocks; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.Entity; 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 32551179..d59745d8 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java @@ -5,8 +5,8 @@ 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.RenderHelper; import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.render.RenderHelper; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.minecraft.client.MinecraftClient; import net.minecraft.util.DyeColor; 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 90fc436d..1d969514 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java @@ -1,17 +1,16 @@ 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 me.xmrvizzy.skyblocker.utils.render.RenderHelper; +import me.xmrvizzy.skyblocker.utils.render.title.Title; +import me.xmrvizzy.skyblocker.utils.render.title.TitleContainer; import net.minecraft.entity.Entity; -import net.minecraft.text.Text; import net.minecraft.util.Formatting; public class StakeIndicator { - private static final Title title = new Title("skyblocker.rift.stakeNow",Formatting.RED); + 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()) { 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 f36b97df..e141b6a8 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java @@ -2,17 +2,16 @@ 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 me.xmrvizzy.skyblocker.utils.title.Title; -import me.xmrvizzy.skyblocker.utils.title.TitleContainer; +import me.xmrvizzy.skyblocker.utils.render.RenderHelper; +import me.xmrvizzy.skyblocker.utils.render.title.Title; +import me.xmrvizzy.skyblocker.utils.render.title.TitleContainer; import net.minecraft.entity.Entity; -import net.minecraft.text.Text; import net.minecraft.util.Formatting; public class TwinClawsIndicator { - private static final Title title = new Title("skyblocker.rift.iceNow",Formatting.AQUA); + private static final Title title = new Title("skyblocker.rift.iceNow", Formatting.AQUA); private static boolean scheduled = false; protected static void updateIce() { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java index 36ff98c9..8a2ad40e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java @@ -7,7 +7,7 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.utils.Scheduler; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Boxes.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Boxes.java index 445bcbe5..17874c9c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Boxes.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Boxes.java @@ -1,12 +1,10 @@ package me.xmrvizzy.skyblocker.utils; - import net.minecraft.util.math.Box; import net.minecraft.util.math.Direction.Axis; import net.minecraft.util.math.Vec3d; public class Boxes { - /** Returns the vector of the min pos of this box. **/ public static Vec3d getMinVec(Box box) { return new Vec3d(box.minX, box.minY, box.minZ); @@ -17,6 +15,11 @@ public class Boxes { return new Vec3d(box.maxX, box.maxY, box.maxZ); } + /** Returns the vector of the side lengths of this box. **/ + public static Vec3d getLengthVec(Box box) { + return new Vec3d(box.getXLength(), box.getYLength(), box.getZLength()); + } + /** Offsets this box so that minX, minY and minZ are all zero. **/ public static Box moveToZero(Box box) { return box.offset(getMinVec(box).negate()); diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java deleted file mode 100644 index fd8ffdbd..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java +++ /dev/null @@ -1,22 +0,0 @@ -package me.xmrvizzy.skyblocker.utils; - -import me.xmrvizzy.skyblocker.mixin.accessor.WorldRendererAccessor; -import me.xmrvizzy.skyblocker.mixin.accessor.FrustumInvoker; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.Frustum; -import net.minecraft.util.math.Box; - -public class FrustumUtils { - - public static Frustum getFrustum() { - return ((WorldRendererAccessor) MinecraftClient.getInstance().worldRenderer).getFrustum(); - } - - 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()).invokeIsVisible(minX, minY, minZ, maxX, maxY, maxZ); - } -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/ItemUtils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/ItemUtils.java index a4d1ee7b..4f74ce3a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/ItemUtils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/ItemUtils.java @@ -11,17 +11,13 @@ import java.util.List; import java.util.regex.Pattern; public class ItemUtils { + private final static Pattern WHITESPACES = Pattern.compile("^\\s*$"); public static List getTooltip(ItemStack item) { MinecraftClient client = MinecraftClient.getInstance(); - if (client.player != null && item != null) - // return item.getTooltip(client.player, TooltipContext.Default.NORMAL); - return item.getTooltip(client.player, TooltipContext.Default.BASIC); - return Collections.emptyList(); + return client.player == null || item == null ? Collections.emptyList() : item.getTooltip(client.player, TooltipContext.Default.BASIC); } - private final static Pattern WHITESPACES = Pattern.compile("^\\s*$"); - public static List getTooltipStrings(ItemStack item) { List lines = getTooltip(item); List list = new ArrayList<>(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java deleted file mode 100644 index ffb16632..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/MessageScheduler.java +++ /dev/null @@ -1,63 +0,0 @@ -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 { - /** - * 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 + MIN_DELAY < System.currentTimeMillis()) { - sendMessage(message); - lastMessage = System.currentTimeMillis(); - } else { - queueMessage(message, 0); - } - } - - private void sendMessage(String message) { - if (MinecraftClient.getInstance().player != null) { - if (message.startsWith("/")) { - MinecraftClient.getInstance().player.networkHandler.sendCommand(message.substring(1)); - } else { - MinecraftClient.getInstance().inGameHud.getChatHud().addToMessageHistory(message); - MinecraftClient.getInstance().player.networkHandler.sendChatMessage(message); - } - } - } - - /** - * 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 + MIN_DELAY < System.currentTimeMillis()) { - task.run(); - lastMessage = System.currentTimeMillis(); - return true; - } - return false; - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java deleted file mode 100644 index 8f0f7860..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java +++ /dev/null @@ -1,176 +0,0 @@ -package me.xmrvizzy.skyblocker.utils; - -import me.x150.renderer.render.Renderer3d; -import me.xmrvizzy.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker; -import me.xmrvizzy.skyblocker.utils.culling.OcclusionCulling; -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.BufferBuilder; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.VertexFormats; -import net.minecraft.client.render.VertexFormat.DrawMode; -import net.minecraft.client.util.math.MatrixStack; -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; -import java.awt.*; - -import org.joml.Matrix3f; -import org.joml.Matrix4f; -import org.joml.Vector3f; -import org.lwjgl.opengl.GL11; - -import com.mojang.blaze3d.platform.GlStateManager.DstFactor; -import com.mojang.blaze3d.platform.GlStateManager.SrcFactor; -import com.mojang.blaze3d.systems.RenderSystem; - -public class RenderHelper { - private static final Vec3d ONE = new Vec3d(1, 1, 1); - private static final int MAX_OVERWORLD_BUILD_HEIGHT = 319; - - 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) { - if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { - Renderer3d.renderThroughWalls(); - renderFilled(context, pos, colorComponents, alpha); - Renderer3d.stopRenderThroughWalls(); - } - } - - public static void renderFilledIfVisible(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { - if (OcclusionCulling.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { - renderFilled(context, pos, colorComponents, alpha); - } - } - - private 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); - } - - private static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) { - if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, MAX_OVERWORLD_BUILD_HEIGHT, pos.getZ() + 1)) { - MatrixStack matrices = context.matrixStack(); - Vec3d camera = context.camera().getPos(); - - matrices.push(); - matrices.translate(pos.getX() - camera.x, pos.getY() - camera.y, pos.getZ() - camera.z); - - Tessellator tessellator = RenderSystem.renderThreadTesselator(); - BufferBuilder buffer = tessellator.getBuffer(); - VertexConsumerProvider.Immediate consumer = VertexConsumerProvider.immediate(buffer); - - BeaconBlockEntityRendererInvoker.renderBeam(matrices, consumer, context.tickDelta(), context.world().getTime(), 0, MAX_OVERWORLD_BUILD_HEIGHT, colorComponents); - - consumer.draw(); - matrices.pop(); - } - } - - /** - * Draws lines from point to point.

- * - * Tip: To draw lines from the center of a block, offset the X, Y and Z each by 0.5 - * - * @param context The WorldRenderContext which supplies the matrices and tick delta - * @param points The points from which to draw lines between - * @param colorComponents An array of R, G and B color components - * @param alpha The alpha of the lines - * @param lineWidth The width of the lines - */ - public static void renderLinesFromPoints(WorldRenderContext context, Vec3d[] points, float[] colorComponents, float alpha, float lineWidth) { - Vec3d camera = context.camera().getPos(); - MatrixStack matrices = context.matrixStack(); - - matrices.push(); - matrices.translate(-camera.x, -camera.y, -camera.z); - - Tessellator tessellator = RenderSystem.renderThreadTesselator(); - BufferBuilder buffer = tessellator.getBuffer(); - Matrix4f projectionMatrix = matrices.peek().getPositionMatrix(); - Matrix3f normalMatrix = matrices.peek().getNormalMatrix(); - - GL11.glEnable(GL11.GL_LINE_SMOOTH); - GL11.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_NICEST); - - RenderSystem.setShader(GameRenderer::getRenderTypeLinesProgram); - RenderSystem.setShaderColor(1f, 1f, 1f, 1f); - RenderSystem.lineWidth(lineWidth); - RenderSystem.enableBlend(); - RenderSystem.blendFunc(SrcFactor.SRC_ALPHA, DstFactor.ONE_MINUS_SRC_ALPHA); - RenderSystem.disableCull(); - RenderSystem.enableDepthTest(); - - buffer.begin(DrawMode.LINE_STRIP, VertexFormats.LINES); - - for (int i = 0; i < points.length; i++) { - Vec3d point = points[i]; - Vec3d nextPoint = (i + 1 == points.length) ? points[i - 1] : points[i + 1]; - Vector3f normalVec = new Vector3f((float) nextPoint.getX(), (float) nextPoint.getY(), (float) nextPoint.getZ()).sub((float) point.getX(), (float) point.getY(), (float) point.getZ()).normalize(); - - buffer - .vertex(projectionMatrix, (float) point.getX(), (float) point.getY(), (float) point.getZ()) - .color(colorComponents[0], colorComponents[1], colorComponents[2], alpha) - .normal(normalMatrix, normalVec.x, normalVec.y, normalVec.z) - .next(); - } - - tessellator.draw(); - - matrices.pop(); - GL11.glDisable(GL11.GL_LINE_SMOOTH); - RenderSystem.lineWidth(1f); - RenderSystem.disableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.enableCull(); - RenderSystem.disableDepthTest(); - } - - 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(); - } - - /** - * 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) { - if (TitleContainer.addTitle(title)) { - 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() { - 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/RenderUtils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtils.java deleted file mode 100644 index d20cfefe..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtils.java +++ /dev/null @@ -1,99 +0,0 @@ -package me.xmrvizzy.skyblocker.utils; - -import com.mojang.blaze3d.systems.RenderSystem; - -import me.xmrvizzy.skyblocker.utils.color.QuadColor; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.render.VertexFormats; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -// import net.minecraft.util.math.Vec3f; -import net.minecraft.util.math.RotationAxis; - -public class RenderUtils { - - // -------------------- Outline Boxes -------------------- - - public static void drawBoxOutline(BlockPos blockPos, QuadColor color, float lineWidth, Direction... excludeDirs) { - drawBoxOutline(new Box(blockPos), color, lineWidth, excludeDirs); - } - - public static void drawBoxOutline(Box box, QuadColor color, float lineWidth, Direction... excludeDirs) { - if (!FrustumUtils.isBoxVisible(box)) { - return; - } - - setup(); - - MatrixStack matrices = matrixFrom(box.minX, box.minY, box.minZ); - - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder buffer = tessellator.getBuffer(); - - // Outline - RenderSystem.enableDepthTest(); - RenderSystem.disableCull(); - RenderSystem.setShader(GameRenderer::getRenderTypeLinesProgram); - RenderSystem.lineWidth(lineWidth); - - buffer.begin(VertexFormat.DrawMode.LINES, VertexFormats.LINES); - Vertexer.vertexBoxLines(matrices, buffer, Boxes.moveToZero(box), color, excludeDirs); - tessellator.draw(); - - RenderSystem.enableCull(); - RenderSystem.disableDepthTest(); - - cleanup(); - } - - // -------------------- Utils -------------------- - - public static MatrixStack matrixFrom(double x, double y, double z) { - MatrixStack matrices = new MatrixStack(); - - Camera camera = MinecraftClient.getInstance().gameRenderer.getCamera(); - // matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(camera.getPitch())); - matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(camera.getPitch())); - // matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(camera.getYaw() + 180.0F)); - matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(camera.getYaw() + 180.0F)); - - matrices.translate(x - camera.getPos().x, y - camera.getPos().y, z - camera.getPos().z); - - return matrices; - } - - public static Vec3d getInterpolationOffset(Entity e) { - if (MinecraftClient.getInstance().isPaused()) { - return Vec3d.ZERO; - } - - double tickDelta = MinecraftClient.getInstance().getTickDelta(); - return new Vec3d( - e.getX() - MathHelper.lerp(tickDelta, e.lastRenderX, e.getX()), - e.getY() - MathHelper.lerp(tickDelta, e.lastRenderY, e.getY()), - e.getZ() - MathHelper.lerp(tickDelta, e.lastRenderZ, e.getZ())); - } - - public static boolean pointExistsInArea(int x, int y, int x1, int y1, int x2, int y2) { - return x >= x1 && x <= x2 && y >= y1 && y <= y2; - } - - public static void setup() { - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - } - - public static void cleanup() { - RenderSystem.disableBlend(); - } -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtilsLiving.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtilsLiving.java deleted file mode 100644 index 79ec18e9..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtilsLiving.java +++ /dev/null @@ -1,151 +0,0 @@ -package me.xmrvizzy.skyblocker.utils; - -/* - * This file is part of the MacHack distribution (https://github.com/BleachDrinker420/bleachhack-1.14/). - * Copyright (c) 2019 Bleach. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.render.*; -import net.minecraft.client.render.model.json.ModelTransformationMode; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import net.minecraft.util.math.RotationAxis; -import org.apache.commons.lang3.reflect.FieldUtils; -import org.joml.Vector3f; - -import java.lang.reflect.Field; - -public class RenderUtilsLiving { - - private static final MinecraftClient mc = MinecraftClient.getInstance(); - private static Field shaderLightField; - - /** Draws text in the world. **/ - public static void drawText(Text text, double x, double y, double z, double scale, boolean shadow) { - drawText(text, x, y, z, 0, 0, scale, shadow); - } - - /** Draws text in the world. **/ - public static void drawText(Text text, double x, double y, double z, double offX, double offY, double scale, boolean fill) { - MatrixStack matrices = matrixFrom(x, y, z); - - Camera camera = mc.gameRenderer.getCamera(); - // matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(-camera.getYaw())); - matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-camera.getYaw())); - // matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(camera.getPitch())); - matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(camera.getPitch())); - - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - - matrices.translate(offX, offY, 0); - matrices.scale(-0.025f * (float) scale, -0.025f * (float) scale, 1); - - int halfWidth = mc.textRenderer.getWidth(text) / 2; - - VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer()); - - if (fill) { - int opacity = (int) (MinecraftClient.getInstance().options.getTextBackgroundOpacity(0.25F) * 255.0F) << 24; - mc.textRenderer.draw(text, -halfWidth, 0f, 553648127, false, matrices.peek().getPositionMatrix(), immediate, TextRenderer.TextLayerType.NORMAL, opacity, 0xf000f0); - immediate.draw(); - } else { - matrices.push(); - matrices.translate(1, 1, 0); - mc.textRenderer.draw(text.copyContentOnly(), -halfWidth, 0f, 0x202020, false, matrices.peek().getPositionMatrix(), immediate, TextRenderer.TextLayerType.NORMAL, 0, 0xf000f0); - immediate.draw(); - matrices.pop(); - } - - mc.textRenderer.draw(text, -halfWidth, 0f, -1, false, matrices.peek().getPositionMatrix(), immediate, TextRenderer.TextLayerType.NORMAL, 0, 0xf000f0); - immediate.draw(); - - RenderSystem.disableBlend(); - } - - /** Draws a 2D gui items somewhere in the world. **/ - public static void drawGuiItem(double x, double y, double z, double offX, double offY, double scale, ItemStack item) { - if (item.isEmpty()) { - return; - } - - MatrixStack matrices = matrixFrom(x, y, z); - - Camera camera = mc.gameRenderer.getCamera(); - // matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(-camera.getYaw())); - matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-camera.getYaw())); - // matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(camera.getPitch())); - matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(camera.getPitch())); - - matrices.translate(offX, offY, 0); - matrices.scale((float) scale, (float) scale, 0.001f); - - // matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(180f)); - matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(180f)); - - //mc.getBufferBuilders().getEntityVertexConsumers().draw(); - - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - - // Vec3f[] currentLight = getCurrentLight(); - Vector3f[] currentLight = getCurrentLight(); - DiffuseLighting.disableGuiDepthLighting(); - - mc.getBufferBuilders().getEntityVertexConsumers().draw(); - - mc.getItemRenderer().renderItem(item, ModelTransformationMode.GUI, 0xF000F0, - OverlayTexture.DEFAULT_UV, matrices, mc.getBufferBuilders().getEntityVertexConsumers(), mc.world, 0); - - mc.getBufferBuilders().getEntityVertexConsumers().draw(); - - RenderSystem.setShaderLights(currentLight[0], currentLight[1]); - RenderSystem.disableBlend(); - } - - public static MatrixStack matrixFrom(double x, double y, double z) { - MatrixStack matrices = new MatrixStack(); - - Camera camera = mc.gameRenderer.getCamera(); - // matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(camera.getPitch())); - matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(camera.getPitch())); - // matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(camera.getYaw() + 180.0F)); - matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(camera.getYaw() + 180.0F)); - - matrices.translate(x - camera.getPos().x, y - camera.getPos().y, z - camera.getPos().z); - - return matrices; - } - - // public static Vec3f[] getCurrentLight() { - public static Vector3f[] getCurrentLight() { - if (shaderLightField == null) { - shaderLightField = FieldUtils.getField(RenderSystem.class, "shaderLightDirections", true); - } - - try { - // return (Vec3f[]) shaderLightField.get(null); - return (Vector3f[]) shaderLightField.get(null); - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java deleted file mode 100644 index 1ee3e040..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java +++ /dev/null @@ -1,123 +0,0 @@ -package me.xmrvizzy.skyblocker.utils; - -import com.mojang.brigadier.Command; -import me.xmrvizzy.skyblocker.SkyblockerMod; -import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; -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. - */ -public class Scheduler { - private static final Logger LOGGER = LoggerFactory.getLogger(Scheduler.class); - private int currentTick = 0; - private final PriorityQueue tasks = new PriorityQueue<>(); - - /** - * Do not instantiate this class. Use {@link SkyblockerMod#scheduler} instead. - */ - @SuppressWarnings("DeprecatedIsStillUsed") - @Deprecated - public Scheduler() { - } - - /** - * 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(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"); - } else { - new CyclicTask(task, period).run(); - } - } - - public static Command queueOpenScreenCommand(Supplier screenSupplier) { - return context -> SkyblockerMod.getInstance().scheduler.queueOpenScreen(screenSupplier); - } - - /** - * 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 - * @see #queueOpenScreenCommand(Supplier) - */ - public int queueOpenScreen(Supplier screenSupplier) { - MinecraftClient.getInstance().send(() -> MinecraftClient.getInstance().setScreen(screenSupplier.get())); - return Command.SINGLE_SUCCESS; - } - - public void tick() { - currentTick += 1; - ScheduledTask task; - while ((task = tasks.peek()) != null && task.schedule <= currentTick && runTask(task)) { - tasks.poll(); - } - } - - /** - * 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; - } - - /** - * 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 - */ - protected record CyclicTask(Runnable inner, int period) implements Runnable { - @Override - public void run() { - SkyblockerMod.getInstance().scheduler.schedule(this, period); - inner.run(); - } - } - - /** - * 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 - */ - protected record ScheduledTask(Runnable inner, int schedule) implements Comparable, Runnable { - @Override - public int compareTo(ScheduledTask o) { - return schedule - o.schedule; - } - - @Override - public void run() { - inner.run(); - } - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Vertexer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Vertexer.java deleted file mode 100644 index cf6d90b6..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Vertexer.java +++ /dev/null @@ -1,164 +0,0 @@ -package me.xmrvizzy.skyblocker.utils; - -import me.xmrvizzy.skyblocker.utils.color.LineColor; -import me.xmrvizzy.skyblocker.utils.color.QuadColor; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -// import net.minecraft.util.math.Matrix3f; -// import net.minecraft.util.math.Matrix4f; -// import net.minecraft.util.math.Vec3f; -import org.joml.Matrix3f; -import org.joml.Matrix4f; -import org.joml.Vector3f; -import org.apache.commons.lang3.ArrayUtils; - -public class Vertexer { - - public static final int CULL_BACK = 0; - public static final int CULL_FRONT = 1; - public static final int CULL_NONE = 2; - - public static void vertexBoxQuads(MatrixStack matrices, VertexConsumer vertexConsumer, Box box, QuadColor quadColor, Direction... excludeDirs) { - float x1 = (float) box.minX; - float y1 = (float) box.minY; - float z1 = (float) box.minZ; - float x2 = (float) box.maxX; - float y2 = (float) box.maxY; - float z2 = (float) box.maxZ; - - int cullMode = excludeDirs.length == 0 ? CULL_BACK : CULL_NONE; - - if (!ArrayUtils.contains(excludeDirs, Direction.DOWN)) { - vertexQuad(matrices, vertexConsumer, x1, y1, z1, x2, y1, z1, x2, y1, z2, x1, y1, z2, cullMode, quadColor); - } - - if (!ArrayUtils.contains(excludeDirs, Direction.WEST)) { - vertexQuad(matrices, vertexConsumer, x1, y1, z2, x1, y2, z2, x1, y2, z1, x1, y1, z1, cullMode, quadColor); - } - - if (!ArrayUtils.contains(excludeDirs, Direction.EAST)) { - vertexQuad(matrices, vertexConsumer, x2, y1, z1, x2, y2, z1, x2, y2, z2, x2, y1, z2, cullMode, quadColor); - } - - if (!ArrayUtils.contains(excludeDirs, Direction.NORTH)) { - vertexQuad(matrices, vertexConsumer, x1, y1, z1, x1, y2, z1, x2, y2, z1, x2, y1, z1, cullMode, quadColor); - } - - if (!ArrayUtils.contains(excludeDirs, Direction.SOUTH)) { - vertexQuad(matrices, vertexConsumer, x2, y1, z2, x2, y2, z2, x1, y2, z2, x1, y1, z2, cullMode, quadColor); - } - - if (!ArrayUtils.contains(excludeDirs, Direction.UP)) { - vertexQuad(matrices, vertexConsumer, x1, y2, z2, x2, y2, z2, x2, y2, z1, x1, y2, z1, cullMode, quadColor); - } - } - - public static void vertexQuad(MatrixStack matrices, VertexConsumer vertexConsumer, float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, float x4, float y4, float z4, int cullMode, QuadColor quadColor) { - int[] color = quadColor.getAllColors(); - - if (cullMode != CULL_FRONT) { - vertexConsumer.vertex(matrices.peek().getPositionMatrix(), x1, y1, z1).color(color[0], color[1], color[2], color[3]).next(); - vertexConsumer.vertex(matrices.peek().getPositionMatrix(), x2, y2, z2).color(color[4], color[5], color[6], color[7]).next(); - vertexConsumer.vertex(matrices.peek().getPositionMatrix(), x3, y3, z3).color(color[8], color[9], color[10], color[11]).next(); - vertexConsumer.vertex(matrices.peek().getPositionMatrix(), x4, y4, z4).color(color[12], color[13], color[14], color[15]).next(); - } - - if (cullMode != CULL_BACK) { - vertexConsumer.vertex(matrices.peek().getPositionMatrix(), x4, y4, z4).color(color[0], color[1], color[2], color[3]).next(); - vertexConsumer.vertex(matrices.peek().getPositionMatrix(), x3, y3, z3).color(color[4], color[5], color[6], color[7]).next(); - vertexConsumer.vertex(matrices.peek().getPositionMatrix(), x2, y2, z2).color(color[8], color[9], color[10], color[11]).next(); - vertexConsumer.vertex(matrices.peek().getPositionMatrix(), x1, y1, z1).color(color[12], color[13], color[14], color[15]).next(); - } - } - - public static void vertexBoxLines(MatrixStack matrices, VertexConsumer vertexConsumer, Box box, QuadColor quadColor, Direction... excludeDirs) { - float x1 = (float) box.minX; - float y1 = (float) box.minY; - float z1 = (float) box.minZ; - float x2 = (float) box.maxX; - float y2 = (float) box.maxY; - float z2 = (float) box.maxZ; - - boolean exDown = ArrayUtils.contains(excludeDirs, Direction.DOWN); - boolean exWest = ArrayUtils.contains(excludeDirs, Direction.WEST); - boolean exEast = ArrayUtils.contains(excludeDirs, Direction.EAST); - boolean exNorth = ArrayUtils.contains(excludeDirs, Direction.NORTH); - boolean exSouth = ArrayUtils.contains(excludeDirs, Direction.SOUTH); - boolean exUp = ArrayUtils.contains(excludeDirs, Direction.UP); - - int[] color = quadColor.getAllColors(); - - if (!exDown) { - vertexLine(matrices, vertexConsumer, x1, y1, z1, x2, y1, z1, LineColor.single(color[0], color[1], color[2], color[3])); - vertexLine(matrices, vertexConsumer, x2, y1, z1, x2, y1, z2, LineColor.single(color[4], color[5], color[6], color[7])); - vertexLine(matrices, vertexConsumer, x2, y1, z2, x1, y1, z2, LineColor.single(color[8], color[9], color[10], color[11])); - vertexLine(matrices, vertexConsumer, x1, y1, z2, x1, y1, z1, LineColor.single(color[12], color[13], color[14], color[15])); - } - - if (!exWest) { - if (exDown) vertexLine(matrices, vertexConsumer, x1, y1, z1, x1, y1, z2, LineColor.single(color[0], color[1], color[2], color[3])); - vertexLine(matrices, vertexConsumer, x1, y1, z2, x1, y2, z2, LineColor.single(color[4], color[5], color[6], color[7])); - vertexLine(matrices, vertexConsumer, x1, y1, z1, x1, y2, z1, LineColor.single(color[8], color[9], color[10], color[11])); - if (exUp) vertexLine(matrices, vertexConsumer, x1, y2, z1, x1, y2, z2, LineColor.single(color[12], color[13], color[14], color[15])); - } - - if (!exEast) { - if (exDown) vertexLine(matrices, vertexConsumer, x2, y1, z1, x2, y1, z2, LineColor.single(color[0], color[1], color[2], color[3])); - vertexLine(matrices, vertexConsumer, x2, y1, z2, x2, y2, z2, LineColor.single(color[4], color[5], color[6], color[7])); - vertexLine(matrices, vertexConsumer, x2, y1, z1, x2, y2, z1, LineColor.single(color[8], color[9], color[10], color[11])); - if (exUp) vertexLine(matrices, vertexConsumer, x2, y2, z1, x2, y2, z2, LineColor.single(color[12], color[13], color[14], color[15])); - } - - if (!exNorth) { - if (exDown) vertexLine(matrices, vertexConsumer, x1, y1, z1, x2, y1, z1, LineColor.single(color[0], color[1], color[2], color[3])); - if (exEast) vertexLine(matrices, vertexConsumer, x2, y1, z1, x2, y2, z1, LineColor.single(color[4], color[5], color[6], color[7])); - if (exWest) vertexLine(matrices, vertexConsumer, x1, y1, z1, x1, y2, z1, LineColor.single(color[8], color[9], color[10], color[11])); - if (exUp) vertexLine(matrices, vertexConsumer, x1, y2, z1, x2, y2, z1, LineColor.single(color[12], color[13], color[14], color[15])); - } - - if (!exSouth) { - if (exDown) vertexLine(matrices, vertexConsumer, x1, y1, z2, x2, y1, z2, LineColor.single(color[0], color[1], color[2], color[3])); - if (exEast) vertexLine(matrices, vertexConsumer, x2, y1, z2, x2, y2, z2, LineColor.single(color[4], color[5], color[6], color[7])); - if (exWest) vertexLine(matrices, vertexConsumer, x1, y1, z2, x1, y2, z2, LineColor.single(color[8], color[9], color[10], color[11])); - if (exUp) vertexLine(matrices, vertexConsumer, x1, y2, z2, x2, y2, z2, LineColor.single(color[12], color[13], color[14], color[15])); - } - - if (!exUp) { - vertexLine(matrices, vertexConsumer, x1, y2, z1, x2, y2, z1, LineColor.single(color[0], color[1], color[2], color[3])); - vertexLine(matrices, vertexConsumer, x2, y2, z1, x2, y2, z2, LineColor.single(color[4], color[5], color[6], color[7])); - vertexLine(matrices, vertexConsumer, x2, y2, z2, x1, y2, z2, LineColor.single(color[8], color[9], color[10], color[11])); - vertexLine(matrices, vertexConsumer, x1, y2, z2, x1, y2, z1, LineColor.single(color[12], color[13], color[14], color[15])); - } - } - - public static void vertexLine(MatrixStack matrices, VertexConsumer vertexConsumer, float x1, float y1, float z1, float x2, float y2, float z2, LineColor lineColor) { - Matrix4f model = matrices.peek().getPositionMatrix(); - Matrix3f normal = matrices.peek().getNormalMatrix(); - - // Vec3f normalVec = getNormal(normal, x1, y1, z1, x2, y2, z2); - Vector3f normalVec = getNormal(normal, x1, y1, z1, x2, y2, z2); - - int[] color1 = lineColor.getColor(x1, y1, z1, 0); - int[] color2 = lineColor.getColor(x2, y2, z2, 1); - - // vertexConsumer.vertex(model, x1, y1, z1).color(color1[0], color1[1], color1[2], color1[3]).normal(normal, normalVec.getX(), normalVec.getY(), normalVec.getZ()).next(); - vertexConsumer.vertex(model, x1, y1, z1).color(color1[0], color1[1], color1[2], color1[3]).normal(normal, normalVec.x(), normalVec.y(), normalVec.z()).next(); - // vertexConsumer.vertex(model, x2, y2, z2).color(color2[0], color2[1], color2[2], color2[3]).normal(normal, normalVec.getX(), normalVec.getY(), normalVec.getZ()).next(); - vertexConsumer.vertex(model, x2, y2, z2).color(color2[0], color2[1], color2[2], color2[3]).normal(normal, normalVec.x(), normalVec.y(), normalVec.z()).next(); - } - - // public static Vec3f getNormal(Matrix3f normal, float x1, float y1, float z1, float x2, float y2, float z2) { - public static Vector3f getNormal(Matrix3f normal, float x1, float y1, float z1, float x2, float y2, float z2) { - float xNormal = x2 - x1; - float yNormal = y2 - y1; - float zNormal = z2 - z1; - float normalSqrt = MathHelper.sqrt(xNormal * xNormal + yNormal * yNormal + zNormal * zNormal); - - // return new Vec3f(xNormal / normalSqrt, yNormal / normalSqrt, zNormal / normalSqrt); - return new Vector3f(xNormal / normalSqrt, yNormal / normalSqrt, zNormal / normalSqrt); - } - -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/color/LineColor.java b/src/main/java/me/xmrvizzy/skyblocker/utils/color/LineColor.java deleted file mode 100644 index 42cf5926..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/color/LineColor.java +++ /dev/null @@ -1,66 +0,0 @@ -package me.xmrvizzy.skyblocker.utils.color; - -import com.mojang.datafixers.util.Function4; - -public class LineColor extends RenderColor { - - private final Function4 getColorFunc; - - public static LineColor single(float red, float green, float blue, float alpha) { - return LineColor.single((int) (red * 255f), (int) (green * 255f), (int) (blue * 255f), (int) (alpha * 255f)); - } - - public static LineColor single(int color) { - return LineColor.single((color & 0xff0000) >> 16, (color & 0xff00) >> 8, color & 0xff, color >> 24 & 0xff); - } - - public static LineColor single(int red, int green, int blue, int alpha) { - return new LineColor((x, y, z, curVertex) -> new int[] { red, green, blue, alpha }); - } - - public static LineColor gradient(float red1, float green1, float blue1, float alpha1, float red2, float green2, float blue2, float alpha2) { - return LineColor.gradient( - (int) (red1 * 255f), (int) (green1 * 255f), (int) (blue1 * 255f), (int) (alpha1 * 255f), - (int) (red2 * 255f), (int) (green2 * 255f), (int) (blue2 * 255f), (int) (alpha2 * 255f)); - } - - public static LineColor gradient(int color1, int color2) { - return LineColor.gradient( - (color1 & 0xff0000) >> 16, (color1 & 0xff00) >> 8, color1 & 0xff, color1 >> 24 & 0xff, - (color2 & 0xff0000) >> 16, (color2 & 0xff00) >> 8, color2 & 0xff, color2 >> 24 & 0xff); - } - - public static LineColor gradient(int red1, int green1, int blue1, int alpha1, int red2, int green2, int blue2, int alpha2) { - return new LineColor((x, y, z, curVertex) -> { - if (curVertex == 0) { - return new int[] { red1, green1, blue1, alpha1 }; - } - - return new int[] { red2, green2, blue2, alpha2 }; - }); - } - - private LineColor(Function4 getColorFunc) { - this.getColorFunc = getColorFunc; - } - - public int[] getColor(float x, float y, float z, int curVertex) { - int[] outColor = getColorFunc.apply(x, y, z, curVertex); - - for (int i = 0; i < 4; i++) { - if (overwriteColor[i] != null) { - outColor[i] = overwriteColor[i]; - } - } - - return outColor; - } - - public LineColor clone() { - LineColor newColor = new LineColor(getColorFunc); - cloneOverwriteTo(newColor); - - return newColor; - } - -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/color/QuadColor.java b/src/main/java/me/xmrvizzy/skyblocker/utils/color/QuadColor.java deleted file mode 100644 index cb1ce66e..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/color/QuadColor.java +++ /dev/null @@ -1,107 +0,0 @@ -package me.xmrvizzy.skyblocker.utils.color; - - -import java.util.function.Function; - -public class QuadColor extends RenderColor { - - private final Function getColorFunc; - - public static QuadColor single(float red, float green, float blue, float alpha) { - return QuadColor.single((int) (red * 255f), (int) (green * 255f), (int) (blue * 255f), (int) (alpha * 255f)); - } - - public static QuadColor single(int red, int green, int blue, int alpha) { - return new QuadColor(curVertex -> new int[]{red, green, blue, alpha}); - } - - public static QuadColor gradient(int red1, int green1, int blue1, int alpha1, int red2, int green2, int blue2, int alpha2, CardinalDirection direction) { - return new QuadColor(curVertex -> { - if (direction.isStartVertex(curVertex)) { - return new int[]{red1, green1, blue1, alpha1}; - } - - return new int[]{red2, green2, blue2, alpha2}; - }); - } - - public static QuadColor custom(float red1, float green1, float blue1, float alpha1, float red2, float green2, float blue2, float alpha2, float red3, float green3, float blue3, float alpha3, float red4, float green4, float blue4, float alpha4) { - return QuadColor.custom( - (int) (red1 * 255f), (int) (green1 * 255f), (int) (blue1 * 255f), (int) (alpha1 * 255f), - (int) (red2 * 255f), (int) (green2 * 255f), (int) (blue2 * 255f), (int) (alpha2 * 255f), - (int) (red3 * 255f), (int) (green3 * 255f), (int) (blue3 * 255f), (int) (alpha3 * 255f), - (int) (red4 * 255f), (int) (green4 * 255f), (int) (blue4 * 255f), (int) (alpha4 * 255f)); - } - - public static QuadColor custom(int color1, int color2, int color3, int color4) { - return QuadColor.custom( - (color1 & 0xff0000) >> 16, (color1 & 0xff00) >> 8, color1 & 0xff, color1 >> 24 & 0xff, - (color2 & 0xff0000) >> 16, (color2 & 0xff00) >> 8, color2 & 0xff, color2 >> 24 & 0xff, - (color3 & 0xff0000) >> 16, (color3 & 0xff00) >> 8, color3 & 0xff, color3 >> 24 & 0xff, - (color4 & 0xff0000) >> 16, (color4 & 0xff00) >> 8, color4 & 0xff, color4 >> 24 & 0xff); - } - - public static QuadColor custom(int red1, int green1, int blue1, int alpha1, int red2, int green2, int blue2, int alpha2, int red3, int green3, int blue3, int alpha3, int red4, int green4, int blue4, int alpha4) { - return new QuadColor(curVertex -> switch (curVertex) { - case 0 -> new int[]{red1, green1, blue1, alpha1}; - case 1 -> new int[]{red2, green2, blue2, alpha2}; - case 2 -> new int[]{red3, green3, blue3, alpha3}; - default -> new int[]{red4, green4, blue4, alpha4}; - }); - } - - private QuadColor(Function getColorFunc) { - this.getColorFunc = getColorFunc; - } - - public int[] getColor(int curVertex) { - int[] outColor = getColorFunc.apply(curVertex); - - for (int i = 0; i < 4; i++) { - if (overwriteColor[i] != null) { - outColor[i] = overwriteColor[i]; - } - } - - return outColor; - } - - public int[] getAllColors() { - int[] outColor = new int[16]; - - for (int i = 0; i < 4; i++) { - int[] curColor = getColor(i); - - System.arraycopy(curColor, 0, outColor, i * 4, 4); - } - - return outColor; - } - - public QuadColor clone() { - QuadColor newColor = new QuadColor(getColorFunc); - cloneOverwriteTo(newColor); - - return newColor; - } - - public enum CardinalDirection { - NORTH(3, 0), - EAST(0, 1), - SOUTH(1, 2), - WEST(2, 3); - - public final int vertex1; - public final int vertex2; - - CardinalDirection(int vertex1, int vertex2) { - this.vertex1 = vertex1; - this.vertex2 = vertex2; - } - - public boolean isStartVertex(int vertex) { - return vertex == vertex1 || vertex == vertex2; - } - } - -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/color/RenderColor.java b/src/main/java/me/xmrvizzy/skyblocker/utils/color/RenderColor.java deleted file mode 100644 index 89dc37ca..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/color/RenderColor.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.xmrvizzy.skyblocker.utils.color; - -public abstract class RenderColor implements Cloneable { - - protected Integer[] overwriteColor = new Integer[4]; - - public void overwriteRed(Integer red) { - overwriteColor[0] = red; - } - - public void overwriteGreen(Integer green) { - overwriteColor[1] = green; - } - - public void overwriteBlue(Integer blue) { - overwriteColor[2] = blue; - } - - public void overwriteAlpha(Integer alpha) { - overwriteColor[3] = alpha; - } - - protected void cloneOverwriteTo(RenderColor otherColor) { - otherColor.overwriteColor = overwriteColor.clone(); - } - -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/culling/OcclusionCulling.java b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/OcclusionCulling.java deleted file mode 100644 index e9a25fc3..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/culling/OcclusionCulling.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.xmrvizzy.skyblocker.utils.culling; - -import com.logisticscraft.occlusionculling.OcclusionCullingInstance; -import com.logisticscraft.occlusionculling.cache.ArrayOcclusionCache; -import com.logisticscraft.occlusionculling.util.Vec3d; - -import me.xmrvizzy.skyblocker.utils.FrustumUtils; -import net.minecraft.client.MinecraftClient; - -public class OcclusionCulling { - private static final int TRACING_DISTANCE = 128; - private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); - private static OcclusionCullingInstance instance = null; - - // Reused objects to reduce allocation overhead - private static Vec3d cameraPos = new Vec3d(0, 0, 0); - private static Vec3d min = new Vec3d(0, 0, 0); - private static Vec3d max = new Vec3d(0, 0, 0); - - /** - * Initializes the occlusion culling instance - */ - public static void init() { - instance = new OcclusionCullingInstance(TRACING_DISTANCE, new WorldProvider(), new ArrayOcclusionCache(TRACING_DISTANCE), 2); - } - - private static void updateCameraPos() { - var camera = CLIENT.gameRenderer.getCamera().getPos(); - cameraPos.set(camera.x, camera.y, camera.z); - } - - /** - * This first checks checks if the bounding box is within the camera's FOV, if - * it is then it checks for whether it's occluded or not. - * - * @return A boolean representing whether the bounding box is fully visible or - * not. - */ - public static boolean isVisible(double x1, double y1, double z1, double x2, double y2, double z2) { - if (!FrustumUtils.isVisible(x1, y1, z1, x2, y2, z2)) return false; - - updateCameraPos(); - min.set(x1, y1, z1); - max.set(x2, y2, z2); - - return instance.isAABBVisible(min, max, cameraPos); - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/culling/WorldProvider.java b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/WorldProvider.java deleted file mode 100644 index 47d92c1f..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/culling/WorldProvider.java +++ /dev/null @@ -1,29 +0,0 @@ -package me.xmrvizzy.skyblocker.utils.culling; - -import com.logisticscraft.occlusionculling.DataProvider; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.util.math.BlockPos; - -public class WorldProvider implements DataProvider { - private final static MinecraftClient CLIENT = MinecraftClient.getInstance(); - private ClientWorld world = null; - - @Override - public boolean prepareChunk(int chunkX, int chunkZ) { - this.world = CLIENT.world; - return this.world != null; - } - - @Override - public boolean isOpaqueFullCube(int x, int y, int z) { - BlockPos pos = new BlockPos(x, y, z); - return this.world.getBlockState(pos).isOpaqueFullCube(this.world, pos); - } - - @Override - public void cleanup() { - this.world = null; - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/culling/package-info.java b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/package-info.java deleted file mode 100644 index c25e7f7a..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/culling/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Package dedicated to occlusion culling utilities - */ -package me.xmrvizzy.skyblocker.utils.culling; \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/FrustumUtils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/FrustumUtils.java new file mode 100644 index 00000000..d4dd8b18 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/FrustumUtils.java @@ -0,0 +1,21 @@ +package me.xmrvizzy.skyblocker.utils.render; + +import me.xmrvizzy.skyblocker.mixin.accessor.WorldRendererAccessor; +import me.xmrvizzy.skyblocker.mixin.accessor.FrustumInvoker; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.Frustum; +import net.minecraft.util.math.Box; + +public class FrustumUtils { + public static Frustum getFrustum() { + return ((WorldRendererAccessor) MinecraftClient.getInstance().worldRenderer).getFrustum(); + } + + public static boolean isVisible(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()).invokeIsVisible(minX, minY, minZ, maxX, maxY, maxZ); + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java new file mode 100644 index 00000000..77da702a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java @@ -0,0 +1,174 @@ +package me.xmrvizzy.skyblocker.utils.render; + +import com.mojang.blaze3d.platform.GlStateManager.DstFactor; +import com.mojang.blaze3d.platform.GlStateManager.SrcFactor; +import com.mojang.blaze3d.systems.RenderSystem; +import me.x150.renderer.render.Renderer3d; +import me.xmrvizzy.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker; +import me.xmrvizzy.skyblocker.utils.Boxes; +import me.xmrvizzy.skyblocker.utils.render.culling.OcclusionCulling; +import me.xmrvizzy.skyblocker.utils.render.title.Title; +import me.xmrvizzy.skyblocker.utils.render.title.TitleContainer; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.*; +import net.minecraft.client.render.VertexFormat.DrawMode; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.sound.SoundEvent; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import org.joml.Matrix3f; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import org.lwjgl.opengl.GL11; + +import java.awt.*; + +public class RenderHelper { + private static final Vec3d ONE = new Vec3d(1, 1, 1); + private static final int MAX_OVERWORLD_BUILD_HEIGHT = 319; + + 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) { + if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { + Renderer3d.renderThroughWalls(); + renderFilled(context, pos, colorComponents, alpha); + Renderer3d.stopRenderThroughWalls(); + } + } + + public static void renderFilledIfVisible(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + if (OcclusionCulling.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { + renderFilled(context, pos, colorComponents, alpha); + } + } + + private 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); + } + + private static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) { + if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, MAX_OVERWORLD_BUILD_HEIGHT, pos.getZ() + 1)) { + MatrixStack matrices = context.matrixStack(); + Vec3d camera = context.camera().getPos(); + + matrices.push(); + matrices.translate(pos.getX() - camera.x, pos.getY() - camera.y, pos.getZ() - camera.z); + + Tessellator tessellator = RenderSystem.renderThreadTesselator(); + BufferBuilder buffer = tessellator.getBuffer(); + VertexConsumerProvider.Immediate consumer = VertexConsumerProvider.immediate(buffer); + + BeaconBlockEntityRendererInvoker.renderBeam(matrices, consumer, context.tickDelta(), context.world().getTime(), 0, MAX_OVERWORLD_BUILD_HEIGHT, colorComponents); + + consumer.draw(); + matrices.pop(); + } + } + + public static void renderOutline(WorldRenderContext context, Box box, float[] colorComponents) { + if (FrustumUtils.isVisible(box)) { + Renderer3d.renderOutline(context.matrixStack(), new Color(colorComponents[0], colorComponents[1], colorComponents[2]), Boxes.getMinVec(box), Boxes.getLengthVec(box)); + } + } + + /** + * Draws lines from point to point.

+ *

+ * Tip: To draw lines from the center of a block, offset the X, Y and Z each by 0.5 + * + * @param context The WorldRenderContext which supplies the matrices and tick delta + * @param points The points from which to draw lines between + * @param colorComponents An array of R, G and B color components + * @param alpha The alpha of the lines + * @param lineWidth The width of the lines + */ + public static void renderLinesFromPoints(WorldRenderContext context, Vec3d[] points, float[] colorComponents, float alpha, float lineWidth) { + Vec3d camera = context.camera().getPos(); + MatrixStack matrices = context.matrixStack(); + + matrices.push(); + matrices.translate(-camera.x, -camera.y, -camera.z); + + Tessellator tessellator = RenderSystem.renderThreadTesselator(); + BufferBuilder buffer = tessellator.getBuffer(); + Matrix4f projectionMatrix = matrices.peek().getPositionMatrix(); + Matrix3f normalMatrix = matrices.peek().getNormalMatrix(); + + GL11.glEnable(GL11.GL_LINE_SMOOTH); + GL11.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_NICEST); + + RenderSystem.setShader(GameRenderer::getRenderTypeLinesProgram); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + RenderSystem.lineWidth(lineWidth); + RenderSystem.enableBlend(); + RenderSystem.blendFunc(SrcFactor.SRC_ALPHA, DstFactor.ONE_MINUS_SRC_ALPHA); + RenderSystem.disableCull(); + RenderSystem.enableDepthTest(); + + buffer.begin(DrawMode.LINE_STRIP, VertexFormats.LINES); + + for (int i = 0; i < points.length; i++) { + Vec3d point = points[i]; + Vec3d nextPoint = (i + 1 == points.length) ? points[i - 1] : points[i + 1]; + Vector3f normalVec = new Vector3f((float) nextPoint.getX(), (float) nextPoint.getY(), (float) nextPoint.getZ()).sub((float) point.getX(), (float) point.getY(), (float) point.getZ()).normalize(); + + buffer + .vertex(projectionMatrix, (float) point.getX(), (float) point.getY(), (float) point.getZ()) + .color(colorComponents[0], colorComponents[1], colorComponents[2], alpha) + .normal(normalMatrix, normalVec.x, normalVec.y, normalVec.z) + .next(); + } + + tessellator.draw(); + + matrices.pop(); + GL11.glDisable(GL11.GL_LINE_SMOOTH); + RenderSystem.lineWidth(1f); + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.enableCull(); + RenderSystem.disableDepthTest(); + } + + /** + * 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) { + if (TitleContainer.addTitle(title)) { + 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() { + if (MinecraftClient.getInstance().player != null) { + MinecraftClient.getInstance().player.playSound(SoundEvent.of(new Identifier("entity.experience_orb.pickup")), 100f, 0.1f); + } + } + + public static boolean pointIsInArea(double x, double y, double x1, double y1, double x2, double y2) { + return x >= x1 && x <= x2 && y >= y1 && y <= y2; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/culling/OcclusionCulling.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/culling/OcclusionCulling.java new file mode 100644 index 00000000..5c7f69ad --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/culling/OcclusionCulling.java @@ -0,0 +1,47 @@ +package me.xmrvizzy.skyblocker.utils.render.culling; + +import com.logisticscraft.occlusionculling.OcclusionCullingInstance; +import com.logisticscraft.occlusionculling.cache.ArrayOcclusionCache; +import com.logisticscraft.occlusionculling.util.Vec3d; +import me.xmrvizzy.skyblocker.utils.render.FrustumUtils; +import net.minecraft.client.MinecraftClient; + +public class OcclusionCulling { + private static final int TRACING_DISTANCE = 128; + private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); + private static OcclusionCullingInstance instance = null; + + // Reused objects to reduce allocation overhead + private static final Vec3d cameraPos = new Vec3d(0, 0, 0); + private static final Vec3d min = new Vec3d(0, 0, 0); + private static final Vec3d max = new Vec3d(0, 0, 0); + + /** + * Initializes the occlusion culling instance + */ + public static void init() { + instance = new OcclusionCullingInstance(TRACING_DISTANCE, new WorldProvider(), new ArrayOcclusionCache(TRACING_DISTANCE), 2); + } + + private static void updateCameraPos() { + var camera = CLIENT.gameRenderer.getCamera().getPos(); + cameraPos.set(camera.x, camera.y, camera.z); + } + + /** + * This first checks checks if the bounding box is within the camera's FOV, if + * it is then it checks for whether it's occluded or not. + * + * @return A boolean representing whether the bounding box is fully visible or + * not. + */ + public static boolean isVisible(double x1, double y1, double z1, double x2, double y2, double z2) { + if (!FrustumUtils.isVisible(x1, y1, z1, x2, y2, z2)) return false; + + updateCameraPos(); + min.set(x1, y1, z1); + max.set(x2, y2, z2); + + return instance.isAABBVisible(min, max, cameraPos); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/culling/WorldProvider.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/culling/WorldProvider.java new file mode 100644 index 00000000..09a7bc79 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/culling/WorldProvider.java @@ -0,0 +1,28 @@ +package me.xmrvizzy.skyblocker.utils.render.culling; + +import com.logisticscraft.occlusionculling.DataProvider; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.util.math.BlockPos; + +public class WorldProvider implements DataProvider { + private final static MinecraftClient CLIENT = MinecraftClient.getInstance(); + private ClientWorld world = null; + + @Override + public boolean prepareChunk(int chunkX, int chunkZ) { + this.world = CLIENT.world; + return this.world != null; + } + + @Override + public boolean isOpaqueFullCube(int x, int y, int z) { + BlockPos pos = new BlockPos(x, y, z); + return this.world.getBlockState(pos).isOpaqueFullCube(this.world, pos); + } + + @Override + public void cleanup() { + this.world = null; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/culling/package-info.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/culling/package-info.java new file mode 100644 index 00000000..97ebac86 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/culling/package-info.java @@ -0,0 +1,4 @@ +/** + * Package dedicated to occlusion culling utilities + */ +package me.xmrvizzy.skyblocker.utils.render.culling; \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/gui/ColorHighlight.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/gui/ColorHighlight.java new file mode 100644 index 00000000..41cd0778 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/gui/ColorHighlight.java @@ -0,0 +1,24 @@ +package me.xmrvizzy.skyblocker.utils.render.gui; + +public record ColorHighlight(int slot, int color) { + private static final int RED_HIGHLIGHT = 64 << 24 | 255 << 16; + private static final int YELLOW_HIGHLIGHT = 128 << 24 | 255 << 16 | 255 << 8; + private static final int GREEN_HIGHLIGHT = 128 << 24 | 64 << 16 | 196 << 8 | 64; + private static final int GRAY_HIGHLIGHT = 128 << 24 | 64 << 16 | 64 << 8 | 64; + + public static ColorHighlight red(int slot) { + return new ColorHighlight(slot, RED_HIGHLIGHT); + } + + public static ColorHighlight yellow(int slot) { + return new ColorHighlight(slot, YELLOW_HIGHLIGHT); + } + + public static ColorHighlight green(int slot) { + return new ColorHighlight(slot, GREEN_HIGHLIGHT); + } + + public static ColorHighlight gray(int slot) { + return new ColorHighlight(slot, GRAY_HIGHLIGHT); + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/gui/ContainerSolver.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/gui/ContainerSolver.java new file mode 100644 index 00000000..83c0f717 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/gui/ContainerSolver.java @@ -0,0 +1,44 @@ +package me.xmrvizzy.skyblocker.utils.render.gui; + +import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; +import net.minecraft.item.ItemStack; + +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +/** + * Abstract class for gui solvers. Extend this class to add a new gui solver, like terminal solvers or experiment solvers. + */ +public abstract class ContainerSolver { + private final Pattern containerName; + + protected ContainerSolver(String containerName) { + this.containerName = Pattern.compile(containerName); + } + + protected abstract boolean isEnabled(); + + public Pattern getName() { + return containerName; + } + + protected void start(GenericContainerScreen screen) { + } + + protected void reset() { + } + + protected abstract List getColors(String[] groups, Map slots); + + protected void trimEdges(Map slots, int rows) { + for (int i = 0; i < rows; i++) { + slots.remove(9 * i); + slots.remove(9 * i + 8); + } + for (int i = 1; i < 8; i++) { + slots.remove(i); + slots.remove((rows - 1) * 9 + i); + } + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/gui/ContainerSolverManager.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/gui/ContainerSolverManager.java new file mode 100644 index 00000000..be1d01b4 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/gui/ContainerSolverManager.java @@ -0,0 +1,124 @@ +package me.xmrvizzy.skyblocker.utils.render.gui; + +import com.mojang.blaze3d.systems.RenderSystem; +import me.xmrvizzy.skyblocker.mixin.accessor.HandledScreenAccessor; +import me.xmrvizzy.skyblocker.skyblock.dungeon.CroesusHelper; +import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.ColorTerminal; +import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.OrderTerminal; +import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.StartsWithTerminal; +import me.xmrvizzy.skyblocker.skyblock.experiment.ChronomatronSolver; +import me.xmrvizzy.skyblocker.skyblock.experiment.SuperpairsSolver; +import me.xmrvizzy.skyblocker.skyblock.experiment.UltrasequencerSolver; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; +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; +import net.minecraft.screen.slot.Slot; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.regex.Matcher; +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 { + private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile(""); + private final ContainerSolver[] solvers; + private ContainerSolver currentSolver = null; + private String[] groups; + private List highlights; + + public ContainerSolverManager() { + solvers = new ContainerSolver[]{ + new ColorTerminal(), + new OrderTerminal(), + new StartsWithTerminal(), + new CroesusHelper(), + new ChronomatronSolver(), + new SuperpairsSolver(), + new UltrasequencerSolver() + }; + } + + public ContainerSolver getCurrentSolver() { + return currentSolver; + } + + public void init() { + ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> { + if (Utils.isOnSkyblock() && screen instanceof GenericContainerScreen genericContainerScreen) { + 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(context, genericContainerScreen.getScreenHandler().slots.subList(0, genericContainerScreen.getScreenHandler().getRows() * 9)); + matrices.pop(); + }); + ScreenEvents.remove(screen).register(screen1 -> clearScreen()); + onSetScreen(genericContainerScreen); + } else { + clearScreen(); + } + }); + } + + public void onSetScreen(@NotNull GenericContainerScreen screen) { + String screenName = screen.getTitle().getString(); + Matcher matcher = PLACEHOLDER_PATTERN.matcher(screenName); + for (ContainerSolver solver : solvers) { + if (solver.isEnabled()) { + matcher.usePattern(solver.getName()); + matcher.reset(); + if (matcher.matches()) { + currentSolver = solver; + groups = new String[matcher.groupCount()]; + for (int i = 0; i < groups.length; i++) { + groups[i] = matcher.group(i + 1); + } + currentSolver.start(screen); + return; + } + } + } + clearScreen(); + } + + public void clearScreen() { + if (currentSolver != null) { + currentSolver.reset(); + currentSolver = null; + } + } + + public void markDirty() { + highlights = null; + } + + public void onDraw(DrawContext context, List slots) { + if (currentSolver == null) + return; + if (highlights == null) + highlights = currentSolver.getColors(groups, slotMap(slots)); + RenderSystem.enableDepthTest(); + RenderSystem.colorMask(true, true, true, false); + for (ColorHighlight highlight : highlights) { + Slot slot = slots.get(highlight.slot()); + int color = highlight.color(); + context.fillGradient(slot.x, slot.y, slot.x + 16, slot.y + 16, color, color); + } + RenderSystem.colorMask(true, true, true, true); + } + + private Map slotMap(List slots) { + Map slotMap = new TreeMap<>(); + for (int i = 0; i < slots.size(); i++) + slotMap.put(i, slots.get(i).getStack()); + return slotMap; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/Title.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/Title.java new file mode 100644 index 00000000..b48771ee --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/Title.java @@ -0,0 +1,53 @@ +package me.xmrvizzy.skyblocker.utils.render.title; + +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 x = -1; + protected float y = -1; + + /** + * 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; + } + + public void setText(MutableText text) { + this.text = text; + } + + 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/render/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java new file mode 100644 index 00000000..6e15c871 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java @@ -0,0 +1,175 @@ +package me.xmrvizzy.skyblocker.utils.render.title; + +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; +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.util.math.MathHelper; + +import java.util.LinkedHashSet; +import java.util.Set; + +public class TitleContainer { + /** + * 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 titles = new LinkedHashSet<>(); + + public static void init() { + HudRenderCallback.EVENT.register(TitleContainer::render); + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker") + .then(ClientCommandManager.literal("hud") + .then(ClientCommandManager.literal("titleContainer") + .executes(Scheduler.queueOpenScreenCommand(TitleContainerConfigScreen::new)))))); + } + + /** + * 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); + } + + /** + * 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.resetPos(); + return true; + } + return 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); + } + + 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; + + // 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 = yPos; + + //Calculate the width of combined text + float width = 0; + for (Title title : titles) { + width += textRenderer.getWidth(title.getText()) * scale + 10; + } + + 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 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; + } + + for (Title title : titles) { + + //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) : //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 : //if middle aligned we need the text position to be aligned in the middle. + alignment == SkyblockerConfig.Alignment.RIGHT ? + 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.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 + 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; + } + } + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java new file mode 100644 index 00000000..8d31e2ea --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java @@ -0,0 +1,164 @@ +package me.xmrvizzy.skyblocker.utils.render.title; + +import me.shedaniel.autoconfig.AutoConfig; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.render.RenderHelper; +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.lwjgl.glfw.GLFW; + +import java.awt.*; +import java.util.Set; + +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 float hudX = SkyblockerConfig.get().general.titleContainer.x; + private float hudY = SkyblockerConfig.get().general.titleContainer.y; + + protected TitleContainerConfigScreen() { + super(Text.of("Title Container HUD Config")); + } + + @Override + 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), (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()); + 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<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()); + context.drawVerticalLine(x1, y1, y2, Color.RED.getRGB()); + context.drawVerticalLine(x2, y1, y2, Color.RED.getRGB()); + } + + private Pair<Vector2f, Vector2f> getSelectionBoundingBox() { + SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; + + 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; + x2 = hudX; + } + case MIDDLE -> { + x1 = hudX - midWidth; + x2 = hudX + midWidth; + } + case LEFT -> { + x1 = hudX; + x2 = hudX + midWidth * 2; + } + } + return new Pair<>(new Vector2f(x1, y1), new Vector2f(x2, y2)); + } + + 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; + } + + 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 : + textRenderer.getWidth("Testing1234") * scale; + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { + float midWidth = getSelectionWidth() / 2; + float midHeight = getSelectionHeight() / 2; + var alignment = SkyblockerConfig.get().general.titleContainer.alignment; + + 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 (RenderHelper.pointIsInArea(mouseX, mouseY, x1, y1, x2, y2) && button == 0) { + 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); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 1) { + hudX = (float) this.width / 2; + hudY = 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) { + 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) { + 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) { + 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; + }; + } + 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); + } + + @Override + public void close() { + SkyblockerConfig.get().general.titleContainer.x = (int) hudX; + SkyblockerConfig.get().general.titleContainer.y = (int) hudY; + AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); + super.close(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/MessageScheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/MessageScheduler.java new file mode 100644 index 00000000..bde29c13 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/MessageScheduler.java @@ -0,0 +1,63 @@ +package me.xmrvizzy.skyblocker.utils.scheduler; + +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 { + /** + * 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 + MIN_DELAY < System.currentTimeMillis()) { + sendMessage(message); + lastMessage = System.currentTimeMillis(); + } else { + queueMessage(message, 0); + } + } + + private void sendMessage(String message) { + if (MinecraftClient.getInstance().player != null) { + if (message.startsWith("/")) { + MinecraftClient.getInstance().player.networkHandler.sendCommand(message.substring(1)); + } else { + MinecraftClient.getInstance().inGameHud.getChatHud().addToMessageHistory(message); + MinecraftClient.getInstance().player.networkHandler.sendChatMessage(message); + } + } + } + + /** + * 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 + MIN_DELAY < System.currentTimeMillis()) { + task.run(); + lastMessage = System.currentTimeMillis(); + return true; + } + return false; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java new file mode 100644 index 00000000..76112e0d --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java @@ -0,0 +1,123 @@ +package me.xmrvizzy.skyblocker.utils.scheduler; + +import com.mojang.brigadier.Command; +import me.xmrvizzy.skyblocker.SkyblockerMod; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +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. + */ +public class Scheduler { + private static final Logger LOGGER = LoggerFactory.getLogger(Scheduler.class); + private int currentTick = 0; + private final PriorityQueue<ScheduledTask> tasks = new PriorityQueue<>(); + + /** + * Do not instantiate this class. Use {@link SkyblockerMod#scheduler} instead. + */ + @SuppressWarnings("DeprecatedIsStillUsed") + @Deprecated + public Scheduler() { + } + + /** + * 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(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"); + } else { + new CyclicTask(task, period).run(); + } + } + + public static Command<FabricClientCommandSource> queueOpenScreenCommand(Supplier<Screen> screenSupplier) { + return context -> SkyblockerMod.getInstance().scheduler.queueOpenScreen(screenSupplier); + } + + /** + * 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 + * @see #queueOpenScreenCommand(Supplier) + */ + public int queueOpenScreen(Supplier<Screen> screenSupplier) { + MinecraftClient.getInstance().send(() -> MinecraftClient.getInstance().setScreen(screenSupplier.get())); + return Command.SINGLE_SUCCESS; + } + + public void tick() { + currentTick += 1; + ScheduledTask task; + while ((task = tasks.peek()) != null && task.schedule <= currentTick && runTask(task)) { + tasks.poll(); + } + } + + /** + * 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; + } + + /** + * 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 + */ + protected record CyclicTask(Runnable inner, int period) implements Runnable { + @Override + public void run() { + SkyblockerMod.getInstance().scheduler.schedule(this, period); + inner.run(); + } + } + + /** + * 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 + */ + protected record ScheduledTask(Runnable inner, int schedule) implements Comparable<ScheduledTask>, Runnable { + @Override + public int compareTo(ScheduledTask o) { + return schedule - o.schedule; + } + + @Override + public void run() { + inner.run(); + } + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java deleted file mode 100644 index 0a3bc845..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java +++ /dev/null @@ -1,53 +0,0 @@ -package me.xmrvizzy.skyblocker.utils.title; - -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 x = -1; - protected float y = -1; - - /** - * 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; - } - - public void setText(MutableText text) { - this.text = text; - } - - 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 deleted file mode 100644 index a485d37b..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java +++ /dev/null @@ -1,175 +0,0 @@ -package me.xmrvizzy.skyblocker.utils.title; - -import me.xmrvizzy.skyblocker.SkyblockerMod; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.utils.Scheduler; -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.util.math.MathHelper; - -import java.util.LinkedHashSet; -import java.util.Set; - -public class TitleContainer { - /** - * 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::render); - ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker") - .then(ClientCommandManager.literal("hud") - .then(ClientCommandManager.literal("titleContainer") - .executes(Scheduler.queueOpenScreenCommand(TitleContainerConfigScreen::new)))))); - } - - /** - * 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); - } - - /** - * 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.resetPos(); - return true; - } - return 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); - } - - 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; - - // 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 = yPos; - - //Calculate the width of combined text - float width = 0; - for (Title title : titles) { - width += textRenderer.getWidth(title.getText()) * scale + 10; - } - - 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 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; - } - - for (Title title : titles) { - - //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) : //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 : //if middle aligned we need the text position to be aligned in the middle. - alignment == SkyblockerConfig.Alignment.RIGHT ? - 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.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 - 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; - } - } - } -} \ 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 deleted file mode 100644 index c0c4d63c..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java +++ /dev/null @@ -1,164 +0,0 @@ -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.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.lwjgl.glfw.GLFW; - -import java.awt.*; -import java.util.Set; - -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 float hudX = SkyblockerConfig.get().general.titleContainer.x; - private float hudY = SkyblockerConfig.get().general.titleContainer.y; - - protected TitleContainerConfigScreen() { - super(Text.of("Title Container HUD Config")); - } - - @Override - 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), (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()); - 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<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()); - context.drawVerticalLine(x1, y1, y2, Color.RED.getRGB()); - context.drawVerticalLine(x2, y1, y2, Color.RED.getRGB()); - } - - private Pair<Vector2f, Vector2f> getSelectionBoundingBox() { - SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment; - - 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; - x2 = hudX; - } - case MIDDLE -> { - x1 = hudX - midWidth; - x2 = hudX + midWidth; - } - case LEFT -> { - x1 = hudX; - x2 = hudX + midWidth * 2; - } - } - return new Pair<>(new Vector2f(x1, y1), new Vector2f(x2, y2)); - } - - 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; - } - - 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 : - textRenderer.getWidth("Testing1234") * scale; - } - - @Override - public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { - float midWidth = getSelectionWidth() / 2; - float midHeight = getSelectionHeight() / 2; - var alignment = SkyblockerConfig.get().general.titleContainer.alignment; - - 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, (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); - } - return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (button == 1) { - hudX = (float) this.width / 2; - hudY = 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) { - 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) { - 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) { - 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; - }; - } - 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); - } - - @Override - public void close() { - SkyblockerConfig.get().general.titleContainer.x = (int) hudX; - SkyblockerConfig.get().general.titleContainer.y = (int) hudY; - AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); - super.close(); - } -} -- cgit From b80f6df13b8dfb97f1569f5802b66fc837480eef Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Sat, 22 Jul 2023 14:48:12 +0800 Subject: Refactor chat and discord packages --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 4 +- .../xmrvizzy/skyblocker/chat/ChatFilterResult.java | 18 --- .../skyblocker/chat/ChatMessageListener.java | 88 --------------- .../skyblocker/chat/ChatPatternListener.java | 30 ----- .../skyblocker/chat/filters/AbilityFilter.java | 15 --- .../xmrvizzy/skyblocker/chat/filters/AdFilter.java | 39 ------- .../skyblocker/chat/filters/AoteFilter.java | 15 --- .../skyblocker/chat/filters/AutopetFilter.java | 35 ------ .../skyblocker/chat/filters/ComboFilter.java | 16 --- .../skyblocker/chat/filters/HealFilter.java | 15 --- .../skyblocker/chat/filters/ImplosionFilter.java | 15 --- .../skyblocker/chat/filters/MoltenWaveFilter.java | 15 --- .../skyblocker/chat/filters/ShowOffFilter.java | 18 --- .../skyblocker/chat/filters/SimpleChatFilter.java | 17 --- .../skyblocker/chat/filters/TeleportPadFilter.java | 16 --- .../skyblocker/config/SkyblockerConfig.java | 2 +- .../skyblocker/discord/DiscordRPCManager.java | 122 --------------------- .../skyblocker/skyblock/barn/HungryHiker.java | 4 +- .../skyblocker/skyblock/barn/TreasureHunter.java | 4 +- .../skyblocker/skyblock/dungeon/Reparty.java | 4 +- .../skyblocker/skyblock/dungeon/ThreeWeirdos.java | 4 +- .../skyblocker/skyblock/dungeon/Trivia.java | 4 +- .../skyblocker/skyblock/dwarven/Fetchur.java | 4 +- .../skyblocker/skyblock/dwarven/Puzzler.java | 4 +- .../skyblocker/skyblock/filters/AbilityFilter.java | 15 +++ .../skyblocker/skyblock/filters/AdFilter.java | 39 +++++++ .../skyblocker/skyblock/filters/AoteFilter.java | 15 +++ .../skyblocker/skyblock/filters/AutopetFilter.java | 35 ++++++ .../skyblocker/skyblock/filters/ComboFilter.java | 16 +++ .../skyblocker/skyblock/filters/HealFilter.java | 15 +++ .../skyblock/filters/ImplosionFilter.java | 15 +++ .../skyblock/filters/MoltenWaveFilter.java | 15 +++ .../skyblocker/skyblock/filters/ShowOffFilter.java | 18 +++ .../skyblock/filters/SimpleChatFilter.java | 17 +++ .../skyblock/filters/TeleportPadFilter.java | 16 +++ .../skyblocker/utils/chat/ChatFilterResult.java | 18 +++ .../skyblocker/utils/chat/ChatMessageListener.java | 88 +++++++++++++++ .../skyblocker/utils/chat/ChatPatternListener.java | 30 +++++ .../utils/discord/DiscordRPCManager.java | 122 +++++++++++++++++++++ .../skyblocker/chat/ChatPatternListenerTest.java | 27 ----- .../skyblocker/chat/filters/AbilityFilterTest.java | 19 ---- .../skyblocker/chat/filters/AdFilterTest.java | 67 ----------- .../skyblocker/chat/filters/AoteFilterTest.java | 14 --- .../skyblocker/chat/filters/AutopetFilterTest.java | 15 --- .../skyblocker/chat/filters/ChatFilterTest.java | 10 -- .../skyblocker/chat/filters/ComboFilterTest.java | 29 ----- .../skyblocker/chat/filters/HealFilterTest.java | 19 ---- .../chat/filters/ImplosionFilterTest.java | 19 ---- .../chat/filters/TeleportPadFilterTest.java | 19 ---- .../skyblock/dungeon/AcceptRepartyTest.java | 6 +- .../skyblock/dungeon/ThreeWeirdosTest.java | 2 +- .../skyblocker/skyblock/dungeon/TriviaTest.java | 2 +- .../skyblocker/skyblock/dwarven/FetchurTest.java | 2 +- .../skyblocker/skyblock/dwarven/PuzzlerTest.java | 2 +- .../skyblock/filters/AbilityFilterTest.java | 19 ++++ .../skyblocker/skyblock/filters/AdFilterTest.java | 68 ++++++++++++ .../skyblock/filters/AoteFilterTest.java | 14 +++ .../skyblock/filters/AutopetFilterTest.java | 15 +++ .../skyblock/filters/ChatFilterTest.java | 10 ++ .../skyblock/filters/ComboFilterTest.java | 29 +++++ .../skyblock/filters/HealFilterTest.java | 19 ++++ .../skyblock/filters/ImplosionFilterTest.java | 19 ++++ .../skyblock/filters/TeleportPadFilterTest.java | 19 ++++ .../utils/chat/ChatPatternListenerTest.java | 28 +++++ 64 files changed, 739 insertions(+), 735 deletions(-) delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/ChatFilterResult.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/ChatPatternListener.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilter.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/AdFilter.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilter.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/AutopetFilter.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/ComboFilter.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/HealFilter.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilter.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/MoltenWaveFilter.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/ShowOffFilter.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/SimpleChatFilter.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/TeleportPadFilter.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AbilityFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AdFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AoteFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AutopetFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ComboFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/HealFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ImplosionFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/MoltenWaveFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ShowOffFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/SimpleChatFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/TeleportPadFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/chat/ChatFilterResult.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/chat/ChatMessageListener.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/chat/ChatPatternListener.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java delete mode 100644 src/test/java/me/xmrvizzy/skyblocker/chat/ChatPatternListenerTest.java delete mode 100644 src/test/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilterTest.java delete mode 100644 src/test/java/me/xmrvizzy/skyblocker/chat/filters/AdFilterTest.java delete mode 100644 src/test/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilterTest.java delete mode 100644 src/test/java/me/xmrvizzy/skyblocker/chat/filters/AutopetFilterTest.java delete mode 100644 src/test/java/me/xmrvizzy/skyblocker/chat/filters/ChatFilterTest.java delete mode 100644 src/test/java/me/xmrvizzy/skyblocker/chat/filters/ComboFilterTest.java delete mode 100644 src/test/java/me/xmrvizzy/skyblocker/chat/filters/HealFilterTest.java delete mode 100644 src/test/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilterTest.java delete mode 100644 src/test/java/me/xmrvizzy/skyblocker/chat/filters/TeleportPadFilterTest.java create mode 100644 src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AbilityFilterTest.java create mode 100644 src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AdFilterTest.java create mode 100644 src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AoteFilterTest.java create mode 100644 src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AutopetFilterTest.java create mode 100644 src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/ChatFilterTest.java create mode 100644 src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/ComboFilterTest.java create mode 100644 src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/HealFilterTest.java create mode 100644 src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/ImplosionFilterTest.java create mode 100644 src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/TeleportPadFilterTest.java create mode 100644 src/test/java/me/xmrvizzy/skyblocker/utils/chat/ChatPatternListenerTest.java (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index cc365ecf..c30dab62 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -2,9 +2,7 @@ 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.skyblock.*; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMap; @@ -23,6 +21,8 @@ import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.utils.NEURepo; import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.chat.ChatMessageListener; +import me.xmrvizzy.skyblocker.utils.discord.DiscordRPCManager; import me.xmrvizzy.skyblocker.utils.render.culling.OcclusionCulling; import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolverManager; import me.xmrvizzy.skyblocker.utils.render.title.TitleContainer; diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatFilterResult.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatFilterResult.java deleted file mode 100644 index 85c3f3e3..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatFilterResult.java +++ /dev/null @@ -1,18 +0,0 @@ -package me.xmrvizzy.skyblocker.chat; - -import net.minecraft.client.resource.language.I18n; -public enum ChatFilterResult { - // Skip this one / no action - PASS, - // Filter - FILTER, - // Move to action bar - ACTION_BAR; - // Skip remaining checks, don't filter - // null - - @Override - public String toString() { - return I18n.translate("text.autoconfig.skyblocker.option.messages.chatFilterResult." + name()); - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java deleted file mode 100644 index 5ea3e2a9..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java +++ /dev/null @@ -1,88 +0,0 @@ -package me.xmrvizzy.skyblocker.chat; - -import me.xmrvizzy.skyblocker.chat.filters.*; -import me.xmrvizzy.skyblocker.skyblock.barn.HungryHiker; -import me.xmrvizzy.skyblocker.skyblock.barn.TreasureHunter; -import me.xmrvizzy.skyblocker.skyblock.dungeon.Reparty; -import me.xmrvizzy.skyblocker.skyblock.dungeon.ThreeWeirdos; -import me.xmrvizzy.skyblocker.skyblock.dungeon.Trivia; -import me.xmrvizzy.skyblocker.skyblock.dwarven.Fetchur; -import me.xmrvizzy.skyblocker.skyblock.dwarven.Puzzler; -import me.xmrvizzy.skyblocker.utils.Utils; -import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.text.Text; - -@FunctionalInterface -public interface ChatMessageListener { - /** - * An event called when a game message is received. Register your listeners in {@link ChatMessageListener#init()}. - */ - Event<ChatMessageListener> EVENT = EventFactory.createArrayBacked(ChatMessageListener.class, - (listeners) -> (message, asString) -> { - for (ChatMessageListener listener : listeners) { - ChatFilterResult result = listener.onMessage(message, asString); - if (result != ChatFilterResult.PASS) return result; - } - return ChatFilterResult.PASS; - }); - - /** - * Registers {@link ChatMessageListener}s to {@link ChatMessageListener#EVENT} and registers {@link ChatMessageListener#EVENT} to {@link ClientReceiveMessageEvents#ALLOW_GAME} - */ - static void init() { - ChatMessageListener[] listeners = new ChatMessageListener[]{ - // Features - new Fetchur(), - new Puzzler(), - new Reparty(), - new ThreeWeirdos(), - new Trivia(), - new TreasureHunter(), - new HungryHiker(), - // Filters - new AbilityFilter(), - new AdFilter(), - new AoteFilter(), - new ComboFilter(), - new HealFilter(), - new ImplosionFilter(), - new MoltenWaveFilter(), - new TeleportPadFilter(), - new AutopetFilter(), - new ShowOffFilter() - }; - // Register all listeners to EVENT - for (ChatMessageListener listener : listeners) { - EVENT.register(listener); - } - // Register EVENT to ClientReceiveMessageEvents.ALLOW_GAME from fabric api - ClientReceiveMessageEvents.ALLOW_GAME.register((message, overlay) -> { - if (!Utils.isOnSkyblock()) { - return true; - } - ChatFilterResult result = EVENT.invoker().onMessage(message, message.getString()); - switch (result) { - case ACTION_BAR -> { - if (overlay) { - return true; - } - ClientPlayerEntity player = MinecraftClient.getInstance().player; - if (player != null) { - player.sendMessage(message, true); - return false; - } - } - case FILTER -> { - return false; - } - } - return true; - }); - } - - ChatFilterResult onMessage(Text message, String asString); -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatPatternListener.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatPatternListener.java deleted file mode 100644 index 8a32715e..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatPatternListener.java +++ /dev/null @@ -1,30 +0,0 @@ -package me.xmrvizzy.skyblocker.chat; - -import net.minecraft.text.Text; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public abstract class ChatPatternListener implements ChatMessageListener { - protected static final String NUMBER = "-?[0-9]{1,3}(?>,[0-9]{3})*(?:\\.[1-9])?"; - public final Pattern pattern; - - public ChatPatternListener(String pattern) { - this.pattern = Pattern.compile(pattern); - } - - @Override - public final ChatFilterResult onMessage(Text message, String asString) { - ChatFilterResult state = state(); - if (state == ChatFilterResult.PASS) return ChatFilterResult.PASS; - Matcher m = pattern.matcher(asString); - if (m.matches() && onMatch(message, m)) { - return state; - } - return ChatFilterResult.PASS; - } - - protected abstract ChatFilterResult state(); - - protected abstract boolean onMatch(Text message, Matcher matcher); -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilter.java deleted file mode 100644 index 3a357a00..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilter.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; - -public class AbilityFilter extends SimpleChatFilter { - public AbilityFilter() { - super("^(?:This ability is on cooldown for " + NUMBER + "s\\.|No more charges, next one in " + NUMBER + "s!)$"); - } - - @Override - protected ChatFilterResult state() { - return SkyblockerConfig.get().messages.hideAbility; - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AdFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AdFilter.java deleted file mode 100644 index a813346b..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AdFilter.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.chat.ChatPatternListener; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import net.minecraft.text.Text; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class AdFilter extends ChatPatternListener { - private static final Pattern[] AD_FILTERS = new Pattern[] { - Pattern.compile("^(?:i(?:m|'m| am)? |(?:is )?any(?: ?one|1) )?(?:buy|sell|lowball|trade?)(?:ing)?(?:\\W|$)", Pattern.CASE_INSENSITIVE), - Pattern.compile("(.)\\1{7,}"), - Pattern.compile("\\W(?:on|in|check|at) my (?:ah|bin)(?:\\W|$)", Pattern.CASE_INSENSITIVE), }; - private static final String EMBLEMS = "\u2E15\u273F\u2741\u2E19\u03B1\u270E\u2615\u2616\u2663\u213B\u2694\u27B6\u26A1\u2604\u269A\u2693\u2620\u269B\u2666\u2660\u2764\u2727\u238A\u1360\u262C\u269D\u29C9\uA214\u32D6\u2E0E\u26A0\uA541\u3020\u30C4\u2948\u2622\u2623\u273E\u269C\u0BD0\u0A6D\u2742\u16C3\u3023\u10F6\u0444\u266A\u266B\u04C3\u26C1\u26C3\u16DD\uA03E\u1C6A\u03A3\u09EB\u2603\u2654\u12DE"; - - public AdFilter() { - // Groups: - // 1. Player name - // 2. Message - // (?:§8\[[§feadbc0-9]+§8\] )?(?:[§76l]+[<INSERT EMBLEMS>] )?§[67abc](?:\[[§A-Za-z0-9+]+\] )?([A-Za-z0-9_]+)§[f7]: (.+) - super("(?:§8\\[[§feadbc0-9]+§8\\] )?(?:[§76l]+[" + EMBLEMS + "] )?§[67abc](?:\\[[§A-Za-z0-9+]+\\] )?([A-Za-z0-9_]+)§[f7]: (.+)"); - } - - @Override - public boolean onMatch(Text _message, Matcher matcher) { - String message = matcher.group(2); - for (Pattern adFilter : AD_FILTERS) - if (adFilter.matcher(message).find()) - return true; - return false; - } - - @Override - protected ChatFilterResult state() { - return SkyblockerConfig.get().messages.hideAds; - } -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilter.java deleted file mode 100644 index 029cf433..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilter.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; - -public class AoteFilter extends SimpleChatFilter { - public AoteFilter() { - super("^There are blocks in the way!$"); - } - - @Override - public ChatFilterResult state() { - return SkyblockerConfig.get().messages.hideAOTE; - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AutopetFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AutopetFilter.java deleted file mode 100644 index f1545db4..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AutopetFilter.java +++ /dev/null @@ -1,35 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.chat.ChatPatternListener; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import net.minecraft.client.MinecraftClient; -import net.minecraft.text.Text; - -import java.util.Objects; -import java.util.regex.Matcher; - -public class AutopetFilter extends ChatPatternListener { - public AutopetFilter() { - super("^§cAutopet §eequipped your §7.*§e! §a§lVIEW RULE$"); - } - - @Override - public boolean onMatch(Text _message, Matcher matcher) { - if (SkyblockerConfig.get().messages.hideAutopet == ChatFilterResult.ACTION_BAR) { - Objects.requireNonNull(MinecraftClient.getInstance().player).sendMessage( - Text.literal( - _message.getString().replace("§a§lVIEW RULE", "") - ), true); - } - return true; - } - - @Override - public ChatFilterResult state() { - if (SkyblockerConfig.get().messages.hideAutopet == ChatFilterResult.ACTION_BAR) - return ChatFilterResult.FILTER; - else - return SkyblockerConfig.get().messages.hideAutopet; - } -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ComboFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ComboFilter.java deleted file mode 100644 index 714ee9c9..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ComboFilter.java +++ /dev/null @@ -1,16 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; - -public class ComboFilter extends SimpleChatFilter { - public ComboFilter() { - super("^(\\+\\d+ Kill Combo \\+\\d+(% ✯ Magic Find| coins per kill|% Combat Exp)" + - "|Your Kill Combo has expired! You reached a \\d+ Kill Combo!)$"); - } - - @Override - public ChatFilterResult state() { - return SkyblockerConfig.get().messages.hideCombo; - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/HealFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/HealFilter.java deleted file mode 100644 index 62b41749..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/HealFilter.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; - -public class HealFilter extends SimpleChatFilter { - public HealFilter() { - super("^(?:You healed yourself for " + NUMBER + " health!|[a-zA-Z0-9_]{2,16} healed you for " + NUMBER + " health!)$"); - } - - @Override - public ChatFilterResult state() { - return SkyblockerConfig.get().messages.hideHeal; - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilter.java deleted file mode 100644 index 9cc684ed..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilter.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; - -public class ImplosionFilter extends SimpleChatFilter { - public ImplosionFilter() { - super("^Your Implosion hit " + NUMBER + " enem(?:y|ies) for " + NUMBER + " damage\\.$"); - } - - @Override - public ChatFilterResult state() { - return SkyblockerConfig.get().messages.hideImplosion; - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/MoltenWaveFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/MoltenWaveFilter.java deleted file mode 100644 index da082c2d..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/MoltenWaveFilter.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; - -public class MoltenWaveFilter extends SimpleChatFilter { - public MoltenWaveFilter() { - super("^Your Molten Wave hit " + NUMBER + " enem(?:y|ies) for " + NUMBER + " damage\\.$"); - } - - @Override - public ChatFilterResult state() { - return SkyblockerConfig.get().messages.hideMoltenWave; - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ShowOffFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ShowOffFilter.java deleted file mode 100644 index 3b5ea41a..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ShowOffFilter.java +++ /dev/null @@ -1,18 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; - -public class ShowOffFilter extends SimpleChatFilter { - private static final String EMBLEMS = "\u2E15\u273F\u2741\u2E19\u03B1\u270E\u2615\u2616\u2663\u213B\u2694\u27B6\u26A1\u2604\u269A\u2693\u2620\u269B\u2666\u2660\u2764\u2727\u238A\u1360\u262C\u269D\u29C9\uA214\u32D6\u2E0E\u26A0\uA541\u3020\u30C4\u2948\u2622\u2623\u273E\u269C\u0BD0\u0A6D\u2742\u16C3\u3023\u10F6\u0444\u266A\u266B\u04C3\u26C1\u26C3\u16DD\uA03E\u1C6A\u03A3\u09EB\u2603\u2654\u12DE"; - private static final String[] SHOW_TYPES = { "is holding", "is wearing", "is friends with a", "has" }; - - public ShowOffFilter() { - super("(?:§8\\[[§feadbc0-9]+§8\\] )?(?:[§76l]+[" + EMBLEMS + "] )?§[67abc](?:\\[[§A-Za-z0-9+]+\\] )?([A-Za-z0-9_]+)[§f7]+ (?:" + String.join("|", SHOW_TYPES) + ") §8\\[(.+)§8\\]"); - } - - @Override - protected ChatFilterResult state() { - return SkyblockerConfig.get().messages.hideShowOff; - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/SimpleChatFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/SimpleChatFilter.java deleted file mode 100644 index e23dbf33..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/SimpleChatFilter.java +++ /dev/null @@ -1,17 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatPatternListener; -import net.minecraft.text.Text; - -import java.util.regex.Matcher; - -public abstract class SimpleChatFilter extends ChatPatternListener { - public SimpleChatFilter(String pattern) { - super(pattern); - } - - @Override - protected final boolean onMatch(Text message, Matcher matcher) { - return true; - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/TeleportPadFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/TeleportPadFilter.java deleted file mode 100644 index f7fab6d5..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/TeleportPadFilter.java +++ /dev/null @@ -1,16 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; - -public class TeleportPadFilter extends SimpleChatFilter { - public TeleportPadFilter() { - super("^(Warped from the .* Teleport Pad to the .* Teleport Pad!" + - "|This Teleport Pad does not have a destination set!)$"); - } - - @Override - public ChatFilterResult state() { - return SkyblockerConfig.get().messages.hideTeleportPad; - } -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 5d370b52..c9a67ade 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -12,7 +12,7 @@ import me.shedaniel.autoconfig.annotation.ConfigEntry; import me.shedaniel.autoconfig.serializer.ConfigSerializer; import me.shedaniel.autoconfig.serializer.GsonConfigSerializer; import me.xmrvizzy.skyblocker.SkyblockerMod; -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; import me.xmrvizzy.skyblocker.skyblock.item.CustomArmorTrims; import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java deleted file mode 100644 index 325f271a..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java +++ /dev/null @@ -1,122 +0,0 @@ -package me.xmrvizzy.skyblocker.discord; - - -import me.shedaniel.autoconfig.AutoConfig; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.utils.SkyblockEvents; -import me.xmrvizzy.skyblocker.utils.Utils; -import meteordevelopment.discordipc.DiscordIPC; -import meteordevelopment.discordipc.RichPresence; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.text.DecimalFormat; -import java.util.concurrent.CompletableFuture; - -/** - * Manages the discord rich presence. Automatically connects to discord and displays a customizable activity when playing Skyblock. - */ -public class DiscordRPCManager { - public static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("###,###.##"); - public static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Discord RPC"); - /** - * The update task used to avoid multiple update tasks running simultaneously. - */ - public static CompletableFuture<Void> updateTask; - public static long startTimeStamp; - public static int cycleCount; - - public static void init() { - SkyblockEvents.LEAVE.register(DiscordRPCManager::initAndUpdatePresence); - SkyblockEvents.JOIN.register(() -> { - startTimeStamp = System.currentTimeMillis(); - initAndUpdatePresence(true); - }); - } - - /** - * Checks the {@link SkyblockerConfig.RichPresence#customMessage custom message}, updates {@link #cycleCount} if enabled, and updates rich presence. - */ - 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 (SkyblockerConfig.get().richPresence.cycleMode) cycleCount = (cycleCount + 1) % 3; - initAndUpdatePresence(); - } - - /** - * @see #initAndUpdatePresence(boolean) - */ - private static void initAndUpdatePresence() { - initAndUpdatePresence(false); - } - - /** - * Updates discord presence asynchronously. - * <p> - * When the {@link #updateTask previous update} does not exist or {@link CompletableFuture#isDone() has completed}: - * <p> - * 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() { - RichPresence presence = new RichPresence(); - presence.setLargeImage("skyblocker-default", null); - presence.setStart(startTimeStamp); - presence.setDetails(SkyblockerConfig.get().richPresence.customMessage); - presence.setState(getInfo()); - return presence; - } - - public static String getInfo() { - String info = null; - if (!SkyblockerConfig.get().richPresence.cycleMode) { - 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(); - } - } 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(); - } - } - return info; - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/HungryHiker.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/HungryHiker.java index b0f0445a..a5d02d93 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/HungryHiker.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/HungryHiker.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.barn; -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener; import net.minecraft.client.MinecraftClient; import net.minecraft.text.Text; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/TreasureHunter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/TreasureHunter.java index ad5db522..ba42d2ba 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/TreasureHunter.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/TreasureHunter.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.barn; -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener; import net.minecraft.client.MinecraftClient; import net.minecraft.text.Text; 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 8ae7ce7b..e1194632 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java @@ -1,10 +1,10 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; import me.xmrvizzy.skyblocker.SkyblockerMod; -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java index da964f07..9f522942 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.decoration.ArmorStandEntity; import net.minecraft.text.Text; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java index 9c7452ac..8497041b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.skyblock.FairySouls; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java index 4c2ac002..5e284452 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.dwarven; -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener; import net.minecraft.client.MinecraftClient; import net.minecraft.text.Text; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java index 0599b5b2..96ccdaf2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.dwarven; -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener; import net.minecraft.block.Blocks; import net.minecraft.client.MinecraftClient; import net.minecraft.client.world.ClientWorld; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AbilityFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AbilityFilter.java new file mode 100644 index 00000000..97e5e8dd --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AbilityFilter.java @@ -0,0 +1,15 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; + +public class AbilityFilter extends SimpleChatFilter { + public AbilityFilter() { + super("^(?:This ability is on cooldown for " + NUMBER + "s\\.|No more charges, next one in " + NUMBER + "s!)$"); + } + + @Override + protected ChatFilterResult state() { + return SkyblockerConfig.get().messages.hideAbility; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AdFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AdFilter.java new file mode 100644 index 00000000..c8335699 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AdFilter.java @@ -0,0 +1,39 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener; +import net.minecraft.text.Text; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class AdFilter extends ChatPatternListener { + private static final Pattern[] AD_FILTERS = new Pattern[] { + Pattern.compile("^(?:i(?:m|'m| am)? |(?:is )?any(?: ?one|1) )?(?:buy|sell|lowball|trade?)(?:ing)?(?:\\W|$)", Pattern.CASE_INSENSITIVE), + Pattern.compile("(.)\\1{7,}"), + Pattern.compile("\\W(?:on|in|check|at) my (?:ah|bin)(?:\\W|$)", Pattern.CASE_INSENSITIVE), }; + private static final String EMBLEMS = "\u2E15\u273F\u2741\u2E19\u03B1\u270E\u2615\u2616\u2663\u213B\u2694\u27B6\u26A1\u2604\u269A\u2693\u2620\u269B\u2666\u2660\u2764\u2727\u238A\u1360\u262C\u269D\u29C9\uA214\u32D6\u2E0E\u26A0\uA541\u3020\u30C4\u2948\u2622\u2623\u273E\u269C\u0BD0\u0A6D\u2742\u16C3\u3023\u10F6\u0444\u266A\u266B\u04C3\u26C1\u26C3\u16DD\uA03E\u1C6A\u03A3\u09EB\u2603\u2654\u12DE"; + + public AdFilter() { + // Groups: + // 1. Player name + // 2. Message + // (?:§8\[[§feadbc0-9]+§8\] )?(?:[§76l]+[<INSERT EMBLEMS>] )?§[67abc](?:\[[§A-Za-z0-9+]+\] )?([A-Za-z0-9_]+)§[f7]: (.+) + super("(?:§8\\[[§feadbc0-9]+§8\\] )?(?:[§76l]+[" + EMBLEMS + "] )?§[67abc](?:\\[[§A-Za-z0-9+]+\\] )?([A-Za-z0-9_]+)§[f7]: (.+)"); + } + + @Override + public boolean onMatch(Text _message, Matcher matcher) { + String message = matcher.group(2); + for (Pattern adFilter : AD_FILTERS) + if (adFilter.matcher(message).find()) + return true; + return false; + } + + @Override + protected ChatFilterResult state() { + return SkyblockerConfig.get().messages.hideAds; + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AoteFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AoteFilter.java new file mode 100644 index 00000000..15c1ce6a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AoteFilter.java @@ -0,0 +1,15 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; + +public class AoteFilter extends SimpleChatFilter { + public AoteFilter() { + super("^There are blocks in the way!$"); + } + + @Override + public ChatFilterResult state() { + return SkyblockerConfig.get().messages.hideAOTE; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AutopetFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AutopetFilter.java new file mode 100644 index 00000000..8c9ce9f6 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AutopetFilter.java @@ -0,0 +1,35 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; + +import java.util.Objects; +import java.util.regex.Matcher; + +public class AutopetFilter extends ChatPatternListener { + public AutopetFilter() { + super("^§cAutopet §eequipped your §7.*§e! §a§lVIEW RULE$"); + } + + @Override + public boolean onMatch(Text _message, Matcher matcher) { + if (SkyblockerConfig.get().messages.hideAutopet == ChatFilterResult.ACTION_BAR) { + Objects.requireNonNull(MinecraftClient.getInstance().player).sendMessage( + Text.literal( + _message.getString().replace("§a§lVIEW RULE", "") + ), true); + } + return true; + } + + @Override + public ChatFilterResult state() { + if (SkyblockerConfig.get().messages.hideAutopet == ChatFilterResult.ACTION_BAR) + return ChatFilterResult.FILTER; + else + return SkyblockerConfig.get().messages.hideAutopet; + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ComboFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ComboFilter.java new file mode 100644 index 00000000..4a714e6d --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ComboFilter.java @@ -0,0 +1,16 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; + +public class ComboFilter extends SimpleChatFilter { + public ComboFilter() { + super("^(\\+\\d+ Kill Combo \\+\\d+(% ✯ Magic Find| coins per kill|% Combat Exp)" + + "|Your Kill Combo has expired! You reached a \\d+ Kill Combo!)$"); + } + + @Override + public ChatFilterResult state() { + return SkyblockerConfig.get().messages.hideCombo; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/HealFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/HealFilter.java new file mode 100644 index 00000000..652d47c7 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/HealFilter.java @@ -0,0 +1,15 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; + +public class HealFilter extends SimpleChatFilter { + public HealFilter() { + super("^(?:You healed yourself for " + NUMBER + " health!|[a-zA-Z0-9_]{2,16} healed you for " + NUMBER + " health!)$"); + } + + @Override + public ChatFilterResult state() { + return SkyblockerConfig.get().messages.hideHeal; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ImplosionFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ImplosionFilter.java new file mode 100644 index 00000000..d7748313 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ImplosionFilter.java @@ -0,0 +1,15 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; + +public class ImplosionFilter extends SimpleChatFilter { + public ImplosionFilter() { + super("^Your Implosion hit " + NUMBER + " enem(?:y|ies) for " + NUMBER + " damage\\.$"); + } + + @Override + public ChatFilterResult state() { + return SkyblockerConfig.get().messages.hideImplosion; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/MoltenWaveFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/MoltenWaveFilter.java new file mode 100644 index 00000000..9f6138f0 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/MoltenWaveFilter.java @@ -0,0 +1,15 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; + +public class MoltenWaveFilter extends SimpleChatFilter { + public MoltenWaveFilter() { + super("^Your Molten Wave hit " + NUMBER + " enem(?:y|ies) for " + NUMBER + " damage\\.$"); + } + + @Override + public ChatFilterResult state() { + return SkyblockerConfig.get().messages.hideMoltenWave; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ShowOffFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ShowOffFilter.java new file mode 100644 index 00000000..3b5ea41a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ShowOffFilter.java @@ -0,0 +1,18 @@ +package me.xmrvizzy.skyblocker.chat.filters; + +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; + +public class ShowOffFilter extends SimpleChatFilter { + private static final String EMBLEMS = "\u2E15\u273F\u2741\u2E19\u03B1\u270E\u2615\u2616\u2663\u213B\u2694\u27B6\u26A1\u2604\u269A\u2693\u2620\u269B\u2666\u2660\u2764\u2727\u238A\u1360\u262C\u269D\u29C9\uA214\u32D6\u2E0E\u26A0\uA541\u3020\u30C4\u2948\u2622\u2623\u273E\u269C\u0BD0\u0A6D\u2742\u16C3\u3023\u10F6\u0444\u266A\u266B\u04C3\u26C1\u26C3\u16DD\uA03E\u1C6A\u03A3\u09EB\u2603\u2654\u12DE"; + private static final String[] SHOW_TYPES = { "is holding", "is wearing", "is friends with a", "has" }; + + public ShowOffFilter() { + super("(?:§8\\[[§feadbc0-9]+§8\\] )?(?:[§76l]+[" + EMBLEMS + "] )?§[67abc](?:\\[[§A-Za-z0-9+]+\\] )?([A-Za-z0-9_]+)[§f7]+ (?:" + String.join("|", SHOW_TYPES) + ") §8\\[(.+)§8\\]"); + } + + @Override + protected ChatFilterResult state() { + return SkyblockerConfig.get().messages.hideShowOff; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/SimpleChatFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/SimpleChatFilter.java new file mode 100644 index 00000000..20017443 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/SimpleChatFilter.java @@ -0,0 +1,17 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener; +import net.minecraft.text.Text; + +import java.util.regex.Matcher; + +public abstract class SimpleChatFilter extends ChatPatternListener { + public SimpleChatFilter(String pattern) { + super(pattern); + } + + @Override + protected final boolean onMatch(Text message, Matcher matcher) { + return true; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/TeleportPadFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/TeleportPadFilter.java new file mode 100644 index 00000000..1961d78a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/TeleportPadFilter.java @@ -0,0 +1,16 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; + +public class TeleportPadFilter extends SimpleChatFilter { + public TeleportPadFilter() { + super("^(Warped from the .* Teleport Pad to the .* Teleport Pad!" + + "|This Teleport Pad does not have a destination set!)$"); + } + + @Override + public ChatFilterResult state() { + return SkyblockerConfig.get().messages.hideTeleportPad; + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/chat/ChatFilterResult.java b/src/main/java/me/xmrvizzy/skyblocker/utils/chat/ChatFilterResult.java new file mode 100644 index 00000000..cd364eb5 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/chat/ChatFilterResult.java @@ -0,0 +1,18 @@ +package me.xmrvizzy.skyblocker.utils.chat; + +import net.minecraft.client.resource.language.I18n; +public enum ChatFilterResult { + // Skip this one / no action + PASS, + // Filter + FILTER, + // Move to action bar + ACTION_BAR; + // Skip remaining checks, don't filter + // null + + @Override + public String toString() { + return I18n.translate("text.autoconfig.skyblocker.option.messages.chatFilterResult." + name()); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/chat/ChatMessageListener.java b/src/main/java/me/xmrvizzy/skyblocker/utils/chat/ChatMessageListener.java new file mode 100644 index 00000000..7bb75947 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/chat/ChatMessageListener.java @@ -0,0 +1,88 @@ +package me.xmrvizzy.skyblocker.utils.chat; + +import me.xmrvizzy.skyblocker.skyblock.barn.HungryHiker; +import me.xmrvizzy.skyblocker.skyblock.barn.TreasureHunter; +import me.xmrvizzy.skyblocker.skyblock.dungeon.Reparty; +import me.xmrvizzy.skyblocker.skyblock.dungeon.ThreeWeirdos; +import me.xmrvizzy.skyblocker.skyblock.dungeon.Trivia; +import me.xmrvizzy.skyblocker.skyblock.dwarven.Fetchur; +import me.xmrvizzy.skyblocker.skyblock.dwarven.Puzzler; +import me.xmrvizzy.skyblocker.skyblock.filters.*; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.text.Text; + +@FunctionalInterface +public interface ChatMessageListener { + /** + * An event called when a game message is received. Register your listeners in {@link ChatMessageListener#init()}. + */ + Event<ChatMessageListener> EVENT = EventFactory.createArrayBacked(ChatMessageListener.class, + (listeners) -> (message, asString) -> { + for (ChatMessageListener listener : listeners) { + ChatFilterResult result = listener.onMessage(message, asString); + if (result != ChatFilterResult.PASS) return result; + } + return ChatFilterResult.PASS; + }); + + /** + * Registers {@link ChatMessageListener}s to {@link ChatMessageListener#EVENT} and registers {@link ChatMessageListener#EVENT} to {@link ClientReceiveMessageEvents#ALLOW_GAME} + */ + static void init() { + ChatMessageListener[] listeners = new ChatMessageListener[]{ + // Features + new Fetchur(), + new Puzzler(), + new Reparty(), + new ThreeWeirdos(), + new Trivia(), + new TreasureHunter(), + new HungryHiker(), + // Filters + new AbilityFilter(), + new AdFilter(), + new AoteFilter(), + new ComboFilter(), + new HealFilter(), + new ImplosionFilter(), + new MoltenWaveFilter(), + new TeleportPadFilter(), + new AutopetFilter(), + new ShowOffFilter() + }; + // Register all listeners to EVENT + for (ChatMessageListener listener : listeners) { + EVENT.register(listener); + } + // Register EVENT to ClientReceiveMessageEvents.ALLOW_GAME from fabric api + ClientReceiveMessageEvents.ALLOW_GAME.register((message, overlay) -> { + if (!Utils.isOnSkyblock()) { + return true; + } + ChatFilterResult result = EVENT.invoker().onMessage(message, message.getString()); + switch (result) { + case ACTION_BAR -> { + if (overlay) { + return true; + } + ClientPlayerEntity player = MinecraftClient.getInstance().player; + if (player != null) { + player.sendMessage(message, true); + return false; + } + } + case FILTER -> { + return false; + } + } + return true; + }); + } + + ChatFilterResult onMessage(Text message, String asString); +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/chat/ChatPatternListener.java b/src/main/java/me/xmrvizzy/skyblocker/utils/chat/ChatPatternListener.java new file mode 100644 index 00000000..3b363a85 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/chat/ChatPatternListener.java @@ -0,0 +1,30 @@ +package me.xmrvizzy.skyblocker.utils.chat; + +import net.minecraft.text.Text; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public abstract class ChatPatternListener implements ChatMessageListener { + protected static final String NUMBER = "-?[0-9]{1,3}(?>,[0-9]{3})*(?:\\.[1-9])?"; + public final Pattern pattern; + + public ChatPatternListener(String pattern) { + this.pattern = Pattern.compile(pattern); + } + + @Override + public final ChatFilterResult onMessage(Text message, String asString) { + ChatFilterResult state = state(); + if (state == ChatFilterResult.PASS) return ChatFilterResult.PASS; + Matcher m = pattern.matcher(asString); + if (m.matches() && onMatch(message, m)) { + return state; + } + return ChatFilterResult.PASS; + } + + protected abstract ChatFilterResult state(); + + protected abstract boolean onMatch(Text message, Matcher matcher); +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java new file mode 100644 index 00000000..58408944 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java @@ -0,0 +1,122 @@ +package me.xmrvizzy.skyblocker.utils.discord; + + +import me.shedaniel.autoconfig.AutoConfig; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.SkyblockEvents; +import me.xmrvizzy.skyblocker.utils.Utils; +import meteordevelopment.discordipc.DiscordIPC; +import meteordevelopment.discordipc.RichPresence; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.text.DecimalFormat; +import java.util.concurrent.CompletableFuture; + +/** + * Manages the discord rich presence. Automatically connects to discord and displays a customizable activity when playing Skyblock. + */ +public class DiscordRPCManager { + public static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("###,###.##"); + public static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Discord RPC"); + /** + * The update task used to avoid multiple update tasks running simultaneously. + */ + public static CompletableFuture<Void> updateTask; + public static long startTimeStamp; + public static int cycleCount; + + public static void init() { + SkyblockEvents.LEAVE.register(DiscordRPCManager::initAndUpdatePresence); + SkyblockEvents.JOIN.register(() -> { + startTimeStamp = System.currentTimeMillis(); + initAndUpdatePresence(true); + }); + } + + /** + * Checks the {@link SkyblockerConfig.RichPresence#customMessage custom message}, updates {@link #cycleCount} if enabled, and updates rich presence. + */ + 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 (SkyblockerConfig.get().richPresence.cycleMode) cycleCount = (cycleCount + 1) % 3; + initAndUpdatePresence(); + } + + /** + * @see #initAndUpdatePresence(boolean) + */ + private static void initAndUpdatePresence() { + initAndUpdatePresence(false); + } + + /** + * Updates discord presence asynchronously. + * <p> + * When the {@link #updateTask previous update} does not exist or {@link CompletableFuture#isDone() has completed}: + * <p> + * 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() { + RichPresence presence = new RichPresence(); + presence.setLargeImage("skyblocker-default", null); + presence.setStart(startTimeStamp); + presence.setDetails(SkyblockerConfig.get().richPresence.customMessage); + presence.setState(getInfo()); + return presence; + } + + public static String getInfo() { + String info = null; + if (!SkyblockerConfig.get().richPresence.cycleMode) { + 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(); + } + } 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(); + } + } + return info; + } +} diff --git a/src/test/java/me/xmrvizzy/skyblocker/chat/ChatPatternListenerTest.java b/src/test/java/me/xmrvizzy/skyblocker/chat/ChatPatternListenerTest.java deleted file mode 100644 index a4d6010a..00000000 --- a/src/test/java/me/xmrvizzy/skyblocker/chat/ChatPatternListenerTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.xmrvizzy.skyblocker.chat; - -import java.util.regex.Matcher; - -import static org.junit.jupiter.api.Assertions.*; - -public abstract class ChatPatternListenerTest<T extends ChatPatternListener> { - protected final T listener; - - public ChatPatternListenerTest(T listener) { - this.listener = listener; - } - - protected Matcher matcher(String message) { - return listener.pattern.matcher(message); - } - - protected void assertMatches(String message) { - assertTrue(matcher(message).matches()); - } - - protected void assertGroup(String message, int group, String expect) { - Matcher matcher = matcher(message); - assertTrue(matcher.matches()); - assertEquals(expect, matcher.group(group)); - } -} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilterTest.java deleted file mode 100644 index 65faef5b..00000000 --- a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilterTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import org.junit.jupiter.api.Test; - -class AbilityFilterTest extends ChatFilterTest<AbilityFilter> { - public AbilityFilterTest() { - super(new AbilityFilter()); - } - - @Test - void charges() { - assertMatches("No more charges, next one in 13.2s!"); - } - - @Test - void cooldown() { - assertMatches("This ability is on cooldown for 42s."); - } -} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/AdFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/chat/filters/AdFilterTest.java deleted file mode 100644 index 8a776ab7..00000000 --- a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/AdFilterTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatPatternListenerTest; -import org.junit.jupiter.api.Test; - -import java.util.regex.Matcher; - -import static org.junit.jupiter.api.Assertions.*; - -class AdFilterTest extends ChatPatternListenerTest<AdFilter> { - public AdFilterTest() { - super(new AdFilter()); - } - - @Test - void noRank() { - assertMatches("§8[§a86§8] §7Advertiser§7: advertisement"); - } - - @Test - void vip() { - assertMatches("§8[§b280§8] §a[VIP] Advertiser§f: advertisement"); - } - - @Test - void mvp() { - assertMatches("§8[§d256§8] §6§l⚡ §b[MVP§c+§b] Advertiser§f: advertisement"); - } - - @Test - void plusPlus() { - assertMatches("§8[§6222§8] §6[MVP§c++§6] Advertiser§f: advertisement"); - } - - @Test - void capturesMessage() { - assertGroup("§8[§c325§8] §b[MVP§c+§b] b2dderr§f: buying prismapump", 2, "buying prismapump"); - } - - @Test - void simpleAd() { - assertFilters("§8[§e320§8] §b[MVP§c+§b] b2dderr§f: buying prismapump"); - } - - @Test - void uppercaseAd() { - assertFilters("§8[§f70§8] §a[VIP] Tecnoisnoob§f: SELLING REJUVENATE 5 Book on ah!"); - } - - @Test - void characterSpam() { - assertFilters("§8[§9144§8] §a[VIP] Benyyy_§f: Hey, Visit my Island, i spent lots of time to build it! I also made donate room! <<<<<<<<<<<<<<<<<<<"); - } - - @Test - void notAd() { - Matcher matcher = listener.pattern.matcher("§8[§6200§8] §a[VIP] NotMatching§f: This message shouldn't match!"); - assertTrue(matcher.matches()); - assertFalse(listener.onMatch(null, matcher)); - } - - void assertFilters(String message) { - Matcher matcher = listener.pattern.matcher(message); - assertTrue(matcher.matches()); - assertTrue(listener.onMatch(null, matcher)); - } -} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilterTest.java deleted file mode 100644 index 4f736bd3..00000000 --- a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilterTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import org.junit.jupiter.api.Test; - -class AoteFilterTest extends ChatFilterTest<AoteFilter> { - public AoteFilterTest() { - super(new AoteFilter()); - } - - @Test - void testRegex() { - assertMatches("There are blocks in the way!"); - } -} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/AutopetFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/chat/filters/AutopetFilterTest.java deleted file mode 100644 index 534ce2b7..00000000 --- a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/AutopetFilterTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatPatternListenerTest; -import org.junit.jupiter.api.Test; - -class AutopetFilterTest extends ChatPatternListenerTest<AutopetFilter> { - public AutopetFilterTest() { - super(new AutopetFilter()); - } - - @Test - void testAutopet() { - assertMatches("§cAutopet §eequipped your §7[Lvl 85] §6Tiger§e! §a§lVIEW RULE"); - } -} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/ChatFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/chat/filters/ChatFilterTest.java deleted file mode 100644 index 867386b3..00000000 --- a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/ChatFilterTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatPatternListener; -import me.xmrvizzy.skyblocker.chat.ChatPatternListenerTest; - -public class ChatFilterTest<T extends ChatPatternListener> extends ChatPatternListenerTest<T> { - public ChatFilterTest(T listener) { - super(listener); - } -} diff --git a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/ComboFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/chat/filters/ComboFilterTest.java deleted file mode 100644 index 85d38f44..00000000 --- a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/ComboFilterTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import org.junit.jupiter.api.Test; - -public class ComboFilterTest extends ChatFilterTest<ComboFilter> { - public ComboFilterTest() { - super(new ComboFilter()); - } - - @Test - void testComboMF() { - assertMatches("+5 Kill Combo +3% ✯ Magic Find"); - } - - @Test - void testComboCoins() { - assertMatches("+10 Kill Combo +10 coins per kill"); - } - - @Test - void testComboEXP() { - assertMatches("+20 Kill Combo +15% Combat Exp"); - } - - @Test - void testComboExpired() { - assertMatches("Your Kill Combo has expired! You reached a 11 Kill Combo!"); - } -} diff --git a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/HealFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/chat/filters/HealFilterTest.java deleted file mode 100644 index 5d8c12cf..00000000 --- a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/HealFilterTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import org.junit.jupiter.api.Test; - -class HealFilterTest extends ChatFilterTest<HealFilter> { - public HealFilterTest() { - super(new HealFilter()); - } - - @Test - void healSelf() { - assertMatches("You healed yourself for 18.3 health!"); - } - - @Test - void healedYou() { - assertMatches("H3aler_ healed you for 56 health!"); - } -} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilterTest.java deleted file mode 100644 index 59451167..00000000 --- a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilterTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import org.junit.jupiter.api.Test; - -class ImplosionFilterTest extends ChatFilterTest<ImplosionFilter> { - public ImplosionFilterTest() { - super(new ImplosionFilter()); - } - - @Test - void oneEnemy() { - assertMatches("Your Implosion hit 1 enemy for 636,116.8 damage."); - } - - @Test - void multipleEnemies() { - assertMatches("Your Implosion hit 7 enemies for 4,452,817.4 damage."); - } -} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/TeleportPadFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/chat/filters/TeleportPadFilterTest.java deleted file mode 100644 index a3eadc7b..00000000 --- a/src/test/java/me/xmrvizzy/skyblocker/chat/filters/TeleportPadFilterTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import org.junit.jupiter.api.Test; - -public class TeleportPadFilterTest extends ChatFilterTest<TeleportPadFilter> { - public TeleportPadFilterTest() { - super(new TeleportPadFilter()); - } - - @Test - void testTeleport() { - assertMatches("Warped from the Base Teleport Pad to the Minion Teleport Pad!"); - } - - @Test - void testNoDestination() { - assertMatches("This Teleport Pad does not have a destination set!"); - } -} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/AcceptRepartyTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/AcceptRepartyTest.java index 2465f7a2..eb867a37 100644 --- a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/AcceptRepartyTest.java +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/AcceptRepartyTest.java @@ -1,10 +1,12 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; -import me.xmrvizzy.skyblocker.chat.ChatPatternListenerTest; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListenerTest; import org.junit.jupiter.api.Test; + +import java.util.regex.Matcher; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.regex.Matcher; public class AcceptRepartyTest extends ChatPatternListenerTest<Reparty> { diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdosTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdosTest.java index 555753b6..6a5dd2a7 100644 --- a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdosTest.java +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdosTest.java @@ -1,6 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; -import me.xmrvizzy.skyblocker.chat.ChatPatternListenerTest; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListenerTest; import org.junit.jupiter.api.Test; class ThreeWeirdosTest extends ChatPatternListenerTest<ThreeWeirdos> { diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/TriviaTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/TriviaTest.java index 37f077fb..a787967d 100644 --- a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/TriviaTest.java +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/TriviaTest.java @@ -1,6 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; -import me.xmrvizzy.skyblocker.chat.ChatPatternListenerTest; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListenerTest; import org.junit.jupiter.api.Test; class TriviaTest extends ChatPatternListenerTest<Trivia> { diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dwarven/FetchurTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dwarven/FetchurTest.java index f8e0af18..5d78beeb 100644 --- a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dwarven/FetchurTest.java +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dwarven/FetchurTest.java @@ -1,6 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.dwarven; -import me.xmrvizzy.skyblocker.chat.ChatPatternListenerTest; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListenerTest; import org.junit.jupiter.api.Test; class FetchurTest extends ChatPatternListenerTest<Fetchur> { diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dwarven/PuzzlerTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dwarven/PuzzlerTest.java index e26e306e..8b92e9f5 100644 --- a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dwarven/PuzzlerTest.java +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dwarven/PuzzlerTest.java @@ -1,6 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.dwarven; -import me.xmrvizzy.skyblocker.chat.ChatPatternListenerTest; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListenerTest; import org.junit.jupiter.api.Test; class PuzzlerTest extends ChatPatternListenerTest<Puzzler> { diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AbilityFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AbilityFilterTest.java new file mode 100644 index 00000000..de82039e --- /dev/null +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AbilityFilterTest.java @@ -0,0 +1,19 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import org.junit.jupiter.api.Test; + +class AbilityFilterTest extends ChatFilterTest<AbilityFilter> { + public AbilityFilterTest() { + super(new AbilityFilter()); + } + + @Test + void charges() { + assertMatches("No more charges, next one in 13.2s!"); + } + + @Test + void cooldown() { + assertMatches("This ability is on cooldown for 42s."); + } +} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AdFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AdFilterTest.java new file mode 100644 index 00000000..30315131 --- /dev/null +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AdFilterTest.java @@ -0,0 +1,68 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListenerTest; +import org.junit.jupiter.api.Test; + +import java.util.regex.Matcher; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class AdFilterTest extends ChatPatternListenerTest<AdFilter> { + public AdFilterTest() { + super(new AdFilter()); + } + + @Test + void noRank() { + assertMatches("§8[§a86§8] §7Advertiser§7: advertisement"); + } + + @Test + void vip() { + assertMatches("§8[§b280§8] §a[VIP] Advertiser§f: advertisement"); + } + + @Test + void mvp() { + assertMatches("§8[§d256§8] §6§l⚡ §b[MVP§c+§b] Advertiser§f: advertisement"); + } + + @Test + void plusPlus() { + assertMatches("§8[§6222§8] §6[MVP§c++§6] Advertiser§f: advertisement"); + } + + @Test + void capturesMessage() { + assertGroup("§8[§c325§8] §b[MVP§c+§b] b2dderr§f: buying prismapump", 2, "buying prismapump"); + } + + @Test + void simpleAd() { + assertFilters("§8[§e320§8] §b[MVP§c+§b] b2dderr§f: buying prismapump"); + } + + @Test + void uppercaseAd() { + assertFilters("§8[§f70§8] §a[VIP] Tecnoisnoob§f: SELLING REJUVENATE 5 Book on ah!"); + } + + @Test + void characterSpam() { + assertFilters("§8[§9144§8] §a[VIP] Benyyy_§f: Hey, Visit my Island, i spent lots of time to build it! I also made donate room! <<<<<<<<<<<<<<<<<<<"); + } + + @Test + void notAd() { + Matcher matcher = listener.pattern.matcher("§8[§6200§8] §a[VIP] NotMatching§f: This message shouldn't match!"); + assertTrue(matcher.matches()); + assertFalse(listener.onMatch(null, matcher)); + } + + void assertFilters(String message) { + Matcher matcher = listener.pattern.matcher(message); + assertTrue(matcher.matches()); + assertTrue(listener.onMatch(null, matcher)); + } +} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AoteFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AoteFilterTest.java new file mode 100644 index 00000000..52903b1b --- /dev/null +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AoteFilterTest.java @@ -0,0 +1,14 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import org.junit.jupiter.api.Test; + +class AoteFilterTest extends ChatFilterTest<AoteFilter> { + public AoteFilterTest() { + super(new AoteFilter()); + } + + @Test + void testRegex() { + assertMatches("There are blocks in the way!"); + } +} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AutopetFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AutopetFilterTest.java new file mode 100644 index 00000000..2c8f1425 --- /dev/null +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/AutopetFilterTest.java @@ -0,0 +1,15 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListenerTest; +import org.junit.jupiter.api.Test; + +class AutopetFilterTest extends ChatPatternListenerTest<AutopetFilter> { + public AutopetFilterTest() { + super(new AutopetFilter()); + } + + @Test + void testAutopet() { + assertMatches("§cAutopet §eequipped your §7[Lvl 85] §6Tiger§e! §a§lVIEW RULE"); + } +} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/ChatFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/ChatFilterTest.java new file mode 100644 index 00000000..5d397d16 --- /dev/null +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/ChatFilterTest.java @@ -0,0 +1,10 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener; +import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListenerTest; + +public class ChatFilterTest<T extends ChatPatternListener> extends ChatPatternListenerTest<T> { + public ChatFilterTest(T listener) { + super(listener); + } +} diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/ComboFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/ComboFilterTest.java new file mode 100644 index 00000000..2914db39 --- /dev/null +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/ComboFilterTest.java @@ -0,0 +1,29 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import org.junit.jupiter.api.Test; + +public class ComboFilterTest extends ChatFilterTest<ComboFilter> { + public ComboFilterTest() { + super(new ComboFilter()); + } + + @Test + void testComboMF() { + assertMatches("+5 Kill Combo +3% ✯ Magic Find"); + } + + @Test + void testComboCoins() { + assertMatches("+10 Kill Combo +10 coins per kill"); + } + + @Test + void testComboEXP() { + assertMatches("+20 Kill Combo +15% Combat Exp"); + } + + @Test + void testComboExpired() { + assertMatches("Your Kill Combo has expired! You reached a 11 Kill Combo!"); + } +} diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/HealFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/HealFilterTest.java new file mode 100644 index 00000000..d720d4be --- /dev/null +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/HealFilterTest.java @@ -0,0 +1,19 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import org.junit.jupiter.api.Test; + +class HealFilterTest extends ChatFilterTest<HealFilter> { + public HealFilterTest() { + super(new HealFilter()); + } + + @Test + void healSelf() { + assertMatches("You healed yourself for 18.3 health!"); + } + + @Test + void healedYou() { + assertMatches("H3aler_ healed you for 56 health!"); + } +} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/ImplosionFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/ImplosionFilterTest.java new file mode 100644 index 00000000..b9b872d9 --- /dev/null +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/ImplosionFilterTest.java @@ -0,0 +1,19 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import org.junit.jupiter.api.Test; + +class ImplosionFilterTest extends ChatFilterTest<ImplosionFilter> { + public ImplosionFilterTest() { + super(new ImplosionFilter()); + } + + @Test + void oneEnemy() { + assertMatches("Your Implosion hit 1 enemy for 636,116.8 damage."); + } + + @Test + void multipleEnemies() { + assertMatches("Your Implosion hit 7 enemies for 4,452,817.4 damage."); + } +} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/TeleportPadFilterTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/TeleportPadFilterTest.java new file mode 100644 index 00000000..b8a96703 --- /dev/null +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/filters/TeleportPadFilterTest.java @@ -0,0 +1,19 @@ +package me.xmrvizzy.skyblocker.skyblock.filters; + +import org.junit.jupiter.api.Test; + +public class TeleportPadFilterTest extends ChatFilterTest<TeleportPadFilter> { + public TeleportPadFilterTest() { + super(new TeleportPadFilter()); + } + + @Test + void testTeleport() { + assertMatches("Warped from the Base Teleport Pad to the Minion Teleport Pad!"); + } + + @Test + void testNoDestination() { + assertMatches("This Teleport Pad does not have a destination set!"); + } +} \ No newline at end of file diff --git a/src/test/java/me/xmrvizzy/skyblocker/utils/chat/ChatPatternListenerTest.java b/src/test/java/me/xmrvizzy/skyblocker/utils/chat/ChatPatternListenerTest.java new file mode 100644 index 00000000..5d6f5727 --- /dev/null +++ b/src/test/java/me/xmrvizzy/skyblocker/utils/chat/ChatPatternListenerTest.java @@ -0,0 +1,28 @@ +package me.xmrvizzy.skyblocker.utils.chat; + +import java.util.regex.Matcher; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public abstract class ChatPatternListenerTest<T extends ChatPatternListener> { + protected final T listener; + + public ChatPatternListenerTest(T listener) { + this.listener = listener; + } + + protected Matcher matcher(String message) { + return listener.pattern.matcher(message); + } + + protected void assertMatches(String message) { + assertTrue(matcher(message).matches()); + } + + protected void assertGroup(String message, int group, String expect) { + Matcher matcher = matcher(message); + assertTrue(matcher.matches()); + assertEquals(expect, matcher.group(group)); + } +} \ No newline at end of file -- cgit From e45a296f062b791f09e36d848d2590388125292e Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sun, 30 Jul 2023 23:40:51 -0400 Subject: Fix broken package references --- .../java/me/xmrvizzy/skyblocker/skyblock/filters/ShowOffFilter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ShowOffFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ShowOffFilter.java index 3b5ea41a..6692e612 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ShowOffFilter.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ShowOffFilter.java @@ -1,6 +1,6 @@ -package me.xmrvizzy.skyblocker.chat.filters; +package me.xmrvizzy.skyblocker.skyblock.filters; -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; public class ShowOffFilter extends SimpleChatFilter { -- cgit From f703df1f93a7730e818730095df8f6e569f3d647 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Tue, 1 Aug 2023 23:33:59 -0400 Subject: Vanilla box rendering --- .../skyblocker/skyblock/dungeon/DungeonBlaze.java | 8 +++---- .../skyblocker/utils/render/RenderHelper.java | 28 +++++++++++++++++++--- 2 files changed, 29 insertions(+), 7 deletions(-) (limited to 'src') 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 94a81f15..c024e189 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java @@ -79,11 +79,11 @@ public class DungeonBlaze { /* Outline */ if (highestBlaze.getY() < 69) { Box blaze = highestBlaze.getBoundingBox().expand(0.3, 0.9, 0.3).offset(0, -1.1, 0); - RenderHelper.renderOutline(context, blaze, GREEN_COLOR_COMPONENTS); + RenderHelper.renderBox(context, blaze, GREEN_COLOR_COMPONENTS); if (nextHighestBlaze != null && nextHighestBlaze.isAlive() && nextHighestBlaze != highestBlaze) { Box nextBlaze = nextHighestBlaze.getBoundingBox().expand(0.3, 0.9, 0.3).offset(0, -1.1, 0); - RenderHelper.renderOutline(context, nextBlaze, WHITE_COLOR_COMPONENTS); + RenderHelper.renderBox(context, nextBlaze, WHITE_COLOR_COMPONENTS); RenderHelper.renderLinesFromPoints(context, new Vec3d[] { blaze.getCenter(), nextBlaze.getCenter() }, WHITE_COLOR_COMPONENTS, 1f, 5f); } } @@ -91,11 +91,11 @@ public class DungeonBlaze { /* Outline */ if (lowestBlaze.getY() > 69) { Box blaze = lowestBlaze.getBoundingBox().expand(0.3, 0.9, 0.3).offset(0, -1.1, 0); - RenderHelper.renderOutline(context, blaze, GREEN_COLOR_COMPONENTS); + RenderHelper.renderBox(context, blaze, GREEN_COLOR_COMPONENTS); if (nextLowestBlaze != null && nextLowestBlaze.isAlive() && nextLowestBlaze != lowestBlaze) { Box nextBlaze = nextLowestBlaze.getBoundingBox().expand(0.3, 0.9, 0.3).offset(0, -1.1, 0); - RenderHelper.renderOutline(context, nextBlaze, WHITE_COLOR_COMPONENTS); + RenderHelper.renderBox(context, nextBlaze, WHITE_COLOR_COMPONENTS); RenderHelper.renderLinesFromPoints(context, new Vec3d[] { blaze.getCenter(), nextBlaze.getCenter() }, WHITE_COLOR_COMPONENTS, 1f, 5f); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java index 77da702a..d3a547a9 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java @@ -5,7 +5,6 @@ import com.mojang.blaze3d.platform.GlStateManager.SrcFactor; import com.mojang.blaze3d.systems.RenderSystem; import me.x150.renderer.render.Renderer3d; import me.xmrvizzy.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker; -import me.xmrvizzy.skyblocker.utils.Boxes; import me.xmrvizzy.skyblocker.utils.render.culling.OcclusionCulling; import me.xmrvizzy.skyblocker.utils.render.title.Title; import me.xmrvizzy.skyblocker.utils.render.title.TitleContainer; @@ -13,6 +12,8 @@ import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.*; import net.minecraft.client.render.VertexFormat.DrawMode; +import net.minecraft.client.render.VertexFormats; +import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.sound.SoundEvent; import net.minecraft.util.Identifier; @@ -72,9 +73,30 @@ public class RenderHelper { } } - public static void renderOutline(WorldRenderContext context, Box box, float[] colorComponents) { + public static void renderBox(WorldRenderContext wrc, Box box, float[] colorComponents) { if (FrustumUtils.isVisible(box)) { - Renderer3d.renderOutline(context.matrixStack(), new Color(colorComponents[0], colorComponents[1], colorComponents[2]), Boxes.getMinVec(box), Boxes.getLengthVec(box)); + Vec3d camera = wrc.camera().getPos(); + MatrixStack matrices = wrc.matrixStack(); + Tessellator tessellator = RenderSystem.renderThreadTesselator(); + BufferBuilder buffer = tessellator.getBuffer(); + + RenderSystem.setShader(GameRenderer::getRenderTypeLinesProgram); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + RenderSystem.lineWidth(2.5f); + RenderSystem.disableCull(); + RenderSystem.enableDepthTest(); + + matrices.push(); + matrices.translate(-camera.x, -camera.y, -camera.z); + + buffer.begin(DrawMode.LINES, VertexFormats.LINES); + WorldRenderer.drawBox(matrices, buffer, box, colorComponents[0] * 255f, colorComponents[1] * 255f, colorComponents[2] * 255f, 1f); + tessellator.draw(); + + matrices.pop(); + RenderSystem.lineWidth(1f); + RenderSystem.enableCull(); + RenderSystem.disableDepthTest(); } } -- cgit From 953932e3f0803f78e745e202dc3e4e25bc444593 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Wed, 2 Aug 2023 12:18:37 +0800 Subject: Refactor RenderHelper --- .../skyblocker/skyblock/dungeon/DungeonBlaze.java | 15 +++++++-------- .../skyblocker/utils/render/RenderHelper.java | 19 ++++++++++--------- 2 files changed, 17 insertions(+), 17 deletions(-) (limited to 'src') 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 c024e189..ef94d9ec 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java @@ -48,8 +48,8 @@ public class DungeonBlaze { int health = Integer.parseInt(blazeName.substring(blazeName.indexOf("/") + 1, blazeName.length() - 1)); blazes.add(ObjectIntPair.of(entity, health)); - } catch (NumberFormatException ex) { - ex.printStackTrace(); + } catch (NumberFormatException e) { + LOGGER.error("[Skyblocker DungeonBlazeSolver] Failed to parse blaze health: " + blazeName, e); } } } @@ -79,11 +79,11 @@ public class DungeonBlaze { /* Outline */ if (highestBlaze.getY() < 69) { Box blaze = highestBlaze.getBoundingBox().expand(0.3, 0.9, 0.3).offset(0, -1.1, 0); - RenderHelper.renderBox(context, blaze, GREEN_COLOR_COMPONENTS); + RenderHelper.renderOutline(context, blaze, GREEN_COLOR_COMPONENTS, 5f); if (nextHighestBlaze != null && nextHighestBlaze.isAlive() && nextHighestBlaze != highestBlaze) { Box nextBlaze = nextHighestBlaze.getBoundingBox().expand(0.3, 0.9, 0.3).offset(0, -1.1, 0); - RenderHelper.renderBox(context, nextBlaze, WHITE_COLOR_COMPONENTS); + RenderHelper.renderOutline(context, nextBlaze, WHITE_COLOR_COMPONENTS, 5f); RenderHelper.renderLinesFromPoints(context, new Vec3d[] { blaze.getCenter(), nextBlaze.getCenter() }, WHITE_COLOR_COMPONENTS, 1f, 5f); } } @@ -91,18 +91,17 @@ public class DungeonBlaze { /* Outline */ if (lowestBlaze.getY() > 69) { Box blaze = lowestBlaze.getBoundingBox().expand(0.3, 0.9, 0.3).offset(0, -1.1, 0); - RenderHelper.renderBox(context, blaze, GREEN_COLOR_COMPONENTS); + RenderHelper.renderOutline(context, blaze, GREEN_COLOR_COMPONENTS, 5f); if (nextLowestBlaze != null && nextLowestBlaze.isAlive() && nextLowestBlaze != lowestBlaze) { Box nextBlaze = nextLowestBlaze.getBoundingBox().expand(0.3, 0.9, 0.3).offset(0, -1.1, 0); - RenderHelper.renderBox(context, nextBlaze, WHITE_COLOR_COMPONENTS); + RenderHelper.renderOutline(context, nextBlaze, WHITE_COLOR_COMPONENTS, 5f); RenderHelper.renderLinesFromPoints(context, new Vec3d[] { blaze.getCenter(), nextBlaze.getCenter() }, WHITE_COLOR_COMPONENTS, 1f, 5f); } } } } catch (Exception e) { - LOGGER.warn("[Skyblocker BlazeRenderer] " + e); - e.printStackTrace(); + LOGGER.warn("[Skyblocker DungeonBlazeRenderer] Failed to render blaze boxes", e); } } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java index d3a547a9..9dd8fa22 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java @@ -12,11 +12,8 @@ import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.*; import net.minecraft.client.render.VertexFormat.DrawMode; -import net.minecraft.client.render.VertexFormats; -import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.sound.SoundEvent; -import net.minecraft.util.Identifier; +import net.minecraft.sound.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.Vec3d; @@ -73,16 +70,20 @@ public class RenderHelper { } } - public static void renderBox(WorldRenderContext wrc, Box box, float[] colorComponents) { + /** + * Renders the outline of a box with the specified color components and line width. + * This does not use renderer since renderer draws outline using debug lines with a fixed width. + */ + public static void renderOutline(WorldRenderContext context, Box box, float[] colorComponents, float lineWidth) { if (FrustumUtils.isVisible(box)) { - Vec3d camera = wrc.camera().getPos(); - MatrixStack matrices = wrc.matrixStack(); + MatrixStack matrices = context.matrixStack(); + Vec3d camera = context.camera().getPos(); Tessellator tessellator = RenderSystem.renderThreadTesselator(); BufferBuilder buffer = tessellator.getBuffer(); RenderSystem.setShader(GameRenderer::getRenderTypeLinesProgram); RenderSystem.setShaderColor(1f, 1f, 1f, 1f); - RenderSystem.lineWidth(2.5f); + RenderSystem.lineWidth(lineWidth); RenderSystem.disableCull(); RenderSystem.enableDepthTest(); @@ -186,7 +187,7 @@ public class RenderHelper { private static void playNotificationSound() { if (MinecraftClient.getInstance().player != null) { - MinecraftClient.getInstance().player.playSound(SoundEvent.of(new Identifier("entity.experience_orb.pickup")), 100f, 0.1f); + MinecraftClient.getInstance().player.playSound(SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, 100f, 0.1f); } } -- cgit From 6620bf8f93e12b7e78c5074012e67fce312d48d9 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Wed, 2 Aug 2023 12:26:01 +0800 Subject: Fix broken package reference in EitherwarpOverlay --- src/main/java/me/xmrvizzy/skyblocker/skyblock/TeleportOverlay.java | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/TeleportOverlay.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/TeleportOverlay.java index 6d7500a1..f1d6e986 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/TeleportOverlay.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/TeleportOverlay.java @@ -77,6 +77,7 @@ public class TeleportOverlay { /** * Renders the teleport overlay with a given range. Uses {@link MinecraftClient#crosshairTarget} if it is a block and within range. Otherwise, raycasts from the player with the given range. + * * @implNote {@link MinecraftClient#player} and {@link MinecraftClient#world} must not be null when calling this method. */ private static void render(WorldRenderContext wrc, int range) { @@ -93,6 +94,7 @@ public class TeleportOverlay { /** * Renders the teleport overlay at the given {@link BlockHitResult}. + * * @implNote {@link MinecraftClient#world} must not be null when calling this method. */ private static void render(WorldRenderContext wrc, BlockHitResult blockHitResult) { -- cgit From 872372876716ac9be20c47224f567940da64ef92 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Wed, 2 Aug 2023 01:03:58 -0400 Subject: Add text rendering method --- .../skyblocker/utils/render/RenderHelper.java | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java index 9dd8fa22..4b9d5aa4 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java @@ -10,10 +10,13 @@ import me.xmrvizzy.skyblocker.utils.render.title.Title; import me.xmrvizzy.skyblocker.utils.render.title.TitleContainer; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.font.TextRenderer.TextLayerType; import net.minecraft.client.render.*; import net.minecraft.client.render.VertexFormat.DrawMode; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.sound.SoundEvents; +import net.minecraft.text.OrderedText; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.Vec3d; @@ -27,6 +30,7 @@ import java.awt.*; public class RenderHelper { private static final Vec3d ONE = new Vec3d(1, 1, 1); private static final int MAX_OVERWORLD_BUILD_HEIGHT = 319; + private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); public static void renderFilledThroughWallsWithBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { renderFilledThroughWalls(context, pos, colorComponents, alpha); @@ -158,6 +162,41 @@ public class RenderHelper { RenderSystem.defaultBlendFunc(); RenderSystem.enableCull(); RenderSystem.disableDepthTest(); + } + + /** + * Renders text in the world space. + * + * @param seeThrough Whether the text should be able to be seen through walls or not. + */ + public static void renderText(WorldRenderContext context, Vec3d pos, OrderedText text, float scale, boolean seeThrough) { + Vec3d camera = context.camera().getPos(); + MatrixStack matrices = context.matrixStack(); + TextRenderer textRenderer = CLIENT.textRenderer; + + Vec3d transformedPosition = pos.subtract(camera); + scale = 0.025f * scale; + + matrices.push(); + matrices.translate(transformedPosition.x, transformedPosition.y, transformedPosition.z); + matrices.peek().getPositionMatrix().mul(RenderSystem.getModelViewMatrix()); + matrices.multiply(context.camera().getRotation()); + matrices.scale(-scale, -scale, scale); + + Matrix4f positionMatrix = matrices.peek().getPositionMatrix(); + float h = -textRenderer.getWidth(text) / 2f; + + Tessellator tessellator = RenderSystem.renderThreadTesselator(); + BufferBuilder buffer = tessellator.getBuffer(); + VertexConsumerProvider.Immediate consumers = VertexConsumerProvider.immediate(buffer); + + RenderSystem.depthFunc(seeThrough ? GL11.GL_ALWAYS : GL11.GL_LEQUAL); + + textRenderer.draw(text, h, 0, 0xFFFFFFFF, false, positionMatrix, consumers, TextLayerType.SEE_THROUGH, 0, LightmapTextureManager.MAX_LIGHT_COORDINATE); + consumers.draw(); + + RenderSystem.depthFunc(GL11.GL_LEQUAL); + matrices.pop(); } /** -- cgit From 5ab2838f463d80d87ddf00540d68f6e61186832e Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Wed, 2 Aug 2023 17:25:57 +0800 Subject: Refactor RenderHelper --- .../skyblocker/utils/render/RenderHelper.java | 47 +++++++++++----------- 1 file changed, 23 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java index 4b9d5aa4..18d9b28a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/RenderHelper.java @@ -30,7 +30,7 @@ import java.awt.*; public class RenderHelper { private static final Vec3d ONE = new Vec3d(1, 1, 1); private static final int MAX_OVERWORLD_BUILD_HEIGHT = 319; - private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); + private static final MinecraftClient client = MinecraftClient.getInstance(); public static void renderFilledThroughWallsWithBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { renderFilledThroughWalls(context, pos, colorComponents, alpha); @@ -61,7 +61,7 @@ public class RenderHelper { Vec3d camera = context.camera().getPos(); matrices.push(); - matrices.translate(pos.getX() - camera.x, pos.getY() - camera.y, pos.getZ() - camera.z); + matrices.translate(pos.getX() - camera.getX(), pos.getY() - camera.getY(), pos.getZ() - camera.getZ()); Tessellator tessellator = RenderSystem.renderThreadTesselator(); BufferBuilder buffer = tessellator.getBuffer(); @@ -92,7 +92,7 @@ public class RenderHelper { RenderSystem.enableDepthTest(); matrices.push(); - matrices.translate(-camera.x, -camera.y, -camera.z); + matrices.translate(-camera.getX(), -camera.getY(), -camera.getZ()); buffer.begin(DrawMode.LINES, VertexFormats.LINES); WorldRenderer.drawBox(matrices, buffer, box, colorComponents[0] * 255f, colorComponents[1] * 255f, colorComponents[2] * 255f, 1f); @@ -162,7 +162,7 @@ public class RenderHelper { RenderSystem.defaultBlendFunc(); RenderSystem.enableCull(); RenderSystem.disableDepthTest(); - } + } /** * Renders text in the world space. @@ -170,33 +170,32 @@ public class RenderHelper { * @param seeThrough Whether the text should be able to be seen through walls or not. */ public static void renderText(WorldRenderContext context, Vec3d pos, OrderedText text, float scale, boolean seeThrough) { - Vec3d camera = context.camera().getPos(); - MatrixStack matrices = context.matrixStack(); - TextRenderer textRenderer = CLIENT.textRenderer; + MatrixStack matrices = context.matrixStack(); + Vec3d camera = context.camera().getPos(); + TextRenderer textRenderer = client.textRenderer; - Vec3d transformedPosition = pos.subtract(camera); - scale = 0.025f * scale; + scale *= 0.025f; - matrices.push(); - matrices.translate(transformedPosition.x, transformedPosition.y, transformedPosition.z); - matrices.peek().getPositionMatrix().mul(RenderSystem.getModelViewMatrix()); - matrices.multiply(context.camera().getRotation()); - matrices.scale(-scale, -scale, scale); + matrices.push(); + matrices.translate(pos.getX() - camera.getX(), pos.getY() - camera.getY(), pos.getZ() - camera.getZ()); + matrices.peek().getPositionMatrix().mul(RenderSystem.getModelViewMatrix()); + matrices.multiply(context.camera().getRotation()); + matrices.scale(-scale, -scale, scale); - Matrix4f positionMatrix = matrices.peek().getPositionMatrix(); - float h = -textRenderer.getWidth(text) / 2f; + Matrix4f positionMatrix = matrices.peek().getPositionMatrix(); + float xOffset = -textRenderer.getWidth(text) / 2f; - Tessellator tessellator = RenderSystem.renderThreadTesselator(); - BufferBuilder buffer = tessellator.getBuffer(); - VertexConsumerProvider.Immediate consumers = VertexConsumerProvider.immediate(buffer); + Tessellator tessellator = RenderSystem.renderThreadTesselator(); + BufferBuilder buffer = tessellator.getBuffer(); + VertexConsumerProvider.Immediate consumers = VertexConsumerProvider.immediate(buffer); - RenderSystem.depthFunc(seeThrough ? GL11.GL_ALWAYS : GL11.GL_LEQUAL); + RenderSystem.depthFunc(seeThrough ? GL11.GL_ALWAYS : GL11.GL_LEQUAL); - textRenderer.draw(text, h, 0, 0xFFFFFFFF, false, positionMatrix, consumers, TextLayerType.SEE_THROUGH, 0, LightmapTextureManager.MAX_LIGHT_COORDINATE); - consumers.draw(); + textRenderer.draw(text, xOffset, 0, 0xFFFFFFFF, false, positionMatrix, consumers, TextLayerType.SEE_THROUGH, 0, LightmapTextureManager.MAX_LIGHT_COORDINATE); + consumers.draw(); - RenderSystem.depthFunc(GL11.GL_LEQUAL); - matrices.pop(); + RenderSystem.depthFunc(GL11.GL_LEQUAL); + matrices.pop(); } /** -- cgit From fea919794608128b6c436f1a64d1be38e935241d Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Tue, 8 Aug 2023 12:27:01 +0800 Subject: Fix scheduler package --- src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java | 2 +- src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java | 2 +- src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) (limited to 'src') 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 12e3f9d5..a70dd501 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java @@ -21,7 +21,7 @@ public class DungeonMap { public static void render(MatrixStack matrices) { MinecraftClient client = MinecraftClient.getInstance(); - if (client.player == null && client.world == null) return; + if (client.player == null || client.world == null) return; ItemStack item = client.player.getInventory().main.get(8); NbtCompound tag = item.getNbt(); 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 f7931d11..5d6df319 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java @@ -101,7 +101,7 @@ public class DwarvenHud { public static void update() { commissionList = new ArrayList<>(); - if (client.player == null || !SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enabled) return; + if (client.player == null || client.getNetworkHandler() == null || !SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enabled) return; client.getNetworkHandler().getPlayerList().forEach(playerListEntry -> { if (playerListEntry.getDisplayName() != null) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java index 8a2ad40e..89329c6c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java @@ -103,6 +103,7 @@ public class Shortcuts { commands.put("/vp", "/visit portalhub"); } + @SuppressWarnings("unused") private static void registerMoreDefaultShortcuts() { // Combat commands.put("/spider", "/warp spider"); -- cgit From 30a7b733b0c5a0e7b5002dfd68ec6ece04c02ecc Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Tue, 5 Sep 2023 19:07:17 -0400 Subject: Fix blaze solver update period --- src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') 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 09bef802..6e354ddc 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java @@ -35,7 +35,7 @@ public class DungeonBlaze { private static ArmorStandEntity nextLowestBlaze = null; public static void init() { - SkyblockerMod.getInstance().scheduler.scheduleCyclic(DungeonBlaze::update, 10); + SkyblockerMod.getInstance().scheduler.scheduleCyclic(DungeonBlaze::update, 4); WorldRenderEvents.BEFORE_DEBUG_RENDER.register(DungeonBlaze::blazeRenderer); } -- cgit