aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me
diff options
context:
space:
mode:
authorKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2023-07-08 17:20:55 +0800
committerKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2023-07-08 18:18:17 +0800
commit796177d64aac6c64949973a5604aedc0d1f2651f (patch)
treed42c42a0322d29d0ee0399b771b1de684cd925fb /src/main/java/me
parentaed3973ad0cc33b3d3128695e6f660dc304bc9d6 (diff)
downloadSkyblocker-796177d64aac6c64949973a5604aedc0d1f2651f.tar.gz
Skyblocker-796177d64aac6c64949973a5604aedc0d1f2651f.tar.bz2
Skyblocker-796177d64aac6c64949973a5604aedc0d1f2651f.zip
Refactor Title Container
Diffstat (limited to 'src/main/java/me')
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java10
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java19
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java27
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java19
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java25
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java25
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java21
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java31
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java128
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java110
13 files changed, 237 insertions, 190 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
index 1aeee35e..7da9979a 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
@@ -1,5 +1,6 @@
package me.xmrvizzy.skyblocker.config;
+import com.mojang.brigadier.Command;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import me.shedaniel.autoconfig.AutoConfig;
import me.shedaniel.autoconfig.ConfigData;
@@ -10,8 +11,6 @@ import me.xmrvizzy.skyblocker.SkyblockerMod;
import me.xmrvizzy.skyblocker.chat.ChatFilterResult;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.resource.language.I18n;
import java.util.ArrayList;
@@ -500,11 +499,8 @@ public class SkyblockerConfig implements ConfigData {
private static LiteralArgumentBuilder<FabricClientCommandSource> optionsLiteral(String name) {
return literal(name).executes(context -> {
// Don't immediately open the next screen as it will be closed by ChatScreen right after this command is executed
- SkyblockerMod.getInstance().scheduler.schedule(() -> {
- Screen a = AutoConfig.getConfigScreen(SkyblockerConfig.class, null).get();
- MinecraftClient.getInstance().setScreen(a);
- }, 0);
- return 1;
+ SkyblockerMod.getInstance().scheduler.queueOpenScreen(AutoConfig.getConfigScreen(SkyblockerConfig.class, null));
+ return Command.SINGLE_SUCCESS;
});
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java
index 822b89d9..8dee3fcb 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java
@@ -2,6 +2,7 @@ package me.xmrvizzy.skyblocker.skyblock;
import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
import me.xmrvizzy.skyblocker.utils.RenderHelper;
+import me.xmrvizzy.skyblocker.utils.title.Title;
import net.fabricmc.fabric.api.event.player.UseItemCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
@@ -15,6 +16,7 @@ import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
public class FishingHelper {
+ private static final Title title = new Title("skyblocker.fishing.reelNow", Formatting.GREEN);
private static long startTime;
private static Vec3d normalYawVector;
@@ -49,7 +51,7 @@ public class FishingHelper {
if (player != null && player.fishHook != null) {
Vec3d soundToFishHook = player.fishHook.getPos().subtract(packet.getX(), 0, packet.getZ());
if (Math.abs(normalYawVector.x * soundToFishHook.z - normalYawVector.z * soundToFishHook.x) < 0.2D && Math.abs(normalYawVector.dotProduct(soundToFishHook)) < 4D && player.getPos().squaredDistanceTo(packet.getX(), packet.getY(), packet.getZ()) > 1D) {
- RenderHelper.displayTitleAndPlaySound(10, 5, "skyblocker.fishing.reelNow", Formatting.GREEN);
+ RenderHelper.displayInTitleContainerAndPlaySound(title, 10);
reset();
}
} else {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java
index 0d44900a..7376c896 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java
@@ -32,7 +32,7 @@ public class EffigyWaypoints {
);
private static final List<BlockPos> unBrokenEffigies = new ArrayList<>();
- public static void updateEffigies() {
+ protected static void updateEffigies() {
if (!SkyblockerConfig.get().slayer.vampireSlayer.enableEffigyWaypoints || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) return;
unBrokenEffigies.clear();
@@ -61,7 +61,7 @@ public class EffigyWaypoints {
}
}
- public static void render(WorldRenderContext context) {
+ protected static void render(WorldRenderContext context) {
if (SkyblockerConfig.get().slayer.vampireSlayer.enableEffigyWaypoints && Utils.getLocation().contains("Stillgore Château")) {
for (BlockPos effigy : unBrokenEffigies) {
float[] colorComponents = DyeColor.RED.getColorComponents();
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java
index d1657d67..fed34796 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java
@@ -7,28 +7,21 @@ import me.xmrvizzy.skyblocker.utils.title.Title;
import me.xmrvizzy.skyblocker.utils.title.TitleContainer;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
-import net.minecraft.client.resource.language.I18n;
import net.minecraft.util.Formatting;
public class HealingMelonIndicator {
- private static Title title = null;
- public static void updateHealth(MinecraftClient client) {
- if(title == null)
- title = new Title(I18n.translate("skyblocker.rift.healNow"), Formatting.DARK_RED.getColorValue());
+ private static final Title title = new Title("skyblocker.rift.healNow", Formatting.DARK_RED);
+ public static void updateHealth(MinecraftClient client) {
if (!SkyblockerConfig.get().slayer.vampireSlayer.enableHealingMelonIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) {
- title.active = false;
+ TitleContainer.removeTitle(title);
return;
}
- title.active = true;
ClientPlayerEntity player = client.player;
if (player != null && player.getHealth() <= SkyblockerConfig.get().slayer.vampireSlayer.healingMelonHealthThreshold * 2F) {
- title.active = true;
- if(!TitleContainer.titles.contains(title))
- RenderHelper.displayInTitleContainerAndPlaySound(title);
- }
- else {
- title.active = false;
+ RenderHelper.displayInTitleContainerAndPlaySound(title);
+ } else {
+ TitleContainer.removeTitle(title);
}
}
} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java
index 7d5a1cb4..4e873eed 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java
@@ -8,18 +8,16 @@ import me.xmrvizzy.skyblocker.utils.title.Title;
import me.xmrvizzy.skyblocker.utils.title.TitleContainer;
import net.minecraft.block.Blocks;
import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.resource.language.I18n;
import net.minecraft.entity.Entity;
import net.minecraft.util.Formatting;
+import net.minecraft.util.math.BlockPos;
public class ManiaIndicator {
- private static Title title = null;
- public static void updateMania() {
- if(title == null)
- title = new Title("b", Formatting.RED.getColorValue());
+ private static final Title title = new Title("skyblocker.rift.mania", Formatting.RED);
+ protected static void updateMania() {
if (!SkyblockerConfig.get().slayer.vampireSlayer.enableManiaIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) {
- title.active = false;
+ TitleContainer.removeTitle(title);
return;
}
@@ -30,17 +28,14 @@ public class ManiaIndicator {
for (Entity entity : SlayerUtils.getEntityArmorStands(slayerEntity)) {
if (entity.getDisplayName().toString().contains("MANIA")) {
anyMania = true;
- title.active = true;
- var pos = MinecraftClient.getInstance().player.getBlockPos().down();
- var isGreen = MinecraftClient.getInstance().world.getBlockState(pos).getBlock() == Blocks.GREEN_TERRACOTTA;
- title.color = isGreen ? Formatting.GREEN.getColorValue() : Formatting.RED.getColorValue();
- if(!TitleContainer.titles.contains(title)) {
- title.text = I18n.translate("skyblocker.rift.mania");
- RenderHelper.displayInTitleContainerAndPlaySound(title);
- }
+ BlockPos pos = MinecraftClient.getInstance().player.getBlockPos().down();
+ boolean isGreen = MinecraftClient.getInstance().world.getBlockState(pos).getBlock() == Blocks.GREEN_TERRACOTTA;
+ title.setFormatting(isGreen ? Formatting.GREEN : Formatting.RED);
+ RenderHelper.displayInTitleContainerAndPlaySound(title);
}
}
- if(!anyMania)
- title.active = false;
+ if (!anyMania) {
+ TitleContainer.removeTitle(title);
+ }
}
} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java
index 276ec551..32551179 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java
@@ -34,7 +34,7 @@ public class MirrorverseWaypoints {
/**
* Loads the waypoint locations into memory
*/
- public static void loadWaypoints() {
+ private static void loadWaypoints() {
try (BufferedReader reader = CLIENT.getResourceManager().openAsReader(WAYPOINTS_JSON)) {
JsonObject file = JsonParser.parseReader(reader).getAsJsonObject();
JsonArray sections = file.get("sections").getAsJsonArray();
@@ -69,7 +69,7 @@ public class MirrorverseWaypoints {
}
}
- public static void render(WorldRenderContext wrc) {
+ protected static void render(WorldRenderContext wrc) {
//I would also check for the mirrorverse location but the scoreboard stuff is not performant at all...
if (Utils.isInTheRift() && SkyblockerConfig.get().locations.rift.mirrorverseWaypoints) {
for (BlockPos pos : LAVA_PATH_WAYPOINTS) {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java
index d946df6d..90fc436d 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java
@@ -6,28 +6,23 @@ import me.xmrvizzy.skyblocker.utils.SlayerUtils;
import me.xmrvizzy.skyblocker.utils.Utils;
import me.xmrvizzy.skyblocker.utils.title.Title;
import me.xmrvizzy.skyblocker.utils.title.TitleContainer;
-import net.minecraft.client.resource.language.I18n;
import net.minecraft.entity.Entity;
+import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
public class StakeIndicator {
- private static Title title = null;
- public static void updateStake() {
- if (title == null)
- title = new Title("b", Formatting.RED.getColorValue());
+ private static final Title title = new Title("skyblocker.rift.stakeNow",Formatting.RED);
+ protected static void updateStake() {
if (!SkyblockerConfig.get().slayer.vampireSlayer.enableSteakStakeIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château") || !SlayerUtils.isInSlayer()) {
- title.active = false;
+ TitleContainer.removeTitle(title);
return;
}
Entity slayerEntity = SlayerUtils.getSlayerEntity();
if (slayerEntity != null && slayerEntity.getDisplayName().toString().contains("҉")) {
- title.active = true;
- title.text = I18n.translate("skyblocker.rift.stakeNow");
- if(!TitleContainer.titles.contains(title))
- RenderHelper.displayInTitleContainerAndPlaySound(title);
+ RenderHelper.displayInTitleContainerAndPlaySound(title);
+ } else {
+ TitleContainer.removeTitle(title);
}
- else
- title.active = false;
}
} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java
index 706aa95e..f36b97df 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java
@@ -7,19 +7,17 @@ import me.xmrvizzy.skyblocker.utils.SlayerUtils;
import me.xmrvizzy.skyblocker.utils.Utils;
import me.xmrvizzy.skyblocker.utils.title.Title;
import me.xmrvizzy.skyblocker.utils.title.TitleContainer;
-import net.minecraft.client.resource.language.I18n;
import net.minecraft.entity.Entity;
+import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
public class TwinClawsIndicator {
- private static Title title = null;
- public static boolean scheduling = false;
- public static void updateIce() {
- if(title == null)
- title = new Title("b", Formatting.AQUA.getColorValue());
+ private static final Title title = new Title("skyblocker.rift.iceNow",Formatting.AQUA);
+ private static boolean scheduled = false;
+ protected static void updateIce() {
if (!SkyblockerConfig.get().slayer.vampireSlayer.enableHolyIceIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) {
- title.active = false;
+ TitleContainer.removeTitle(title);
return;
}
@@ -30,18 +28,17 @@ public class TwinClawsIndicator {
for (Entity entity : SlayerUtils.getEntityArmorStands(slayerEntity)) {
if (entity.getDisplayName().toString().contains("TWINCLAWS")) {
anyClaws = true;
- title.active = true;
- if(!TitleContainer.titles.contains(title) && !scheduling) {
- scheduling = true;
+ if (!TitleContainer.containsTitle(title) && !scheduled) {
+ scheduled = true;
SkyblockerMod.getInstance().scheduler.schedule(() -> {
- title.text = I18n.translate("skyblocker.rift.iceNow");
RenderHelper.displayInTitleContainerAndPlaySound(title);
- scheduling = false;
+ scheduled = false;
}, SkyblockerConfig.get().slayer.vampireSlayer.holyIceIndicatorTickDelay);
}
}
}
- if(!anyClaws)
- title.active = false;
+ if (!anyClaws) {
+ TitleContainer.removeTitle(title);
+ }
}
} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java
index 4a151129..6fa93735 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java
@@ -53,14 +53,29 @@ public class RenderHelper {
playNotificationSound();
}
+ /**
+ * Adds the title to {@link TitleContainer} and {@link #playNotificationSound() plays the notification sound} if the title is not in the {@link TitleContainer} already.
+ * No checking needs to be done on whether the title is in the {@link TitleContainer} already by the caller.
+ *
+ * @param title the title
+ */
public static void displayInTitleContainerAndPlaySound(Title title) {
- TitleContainer.addTitle(title);
- playNotificationSound();
+ if (TitleContainer.addTitle(title)) {
+ playNotificationSound();
+ }
}
- public static void displayInTitleContainerWDismissAndPlaySound(Title title, int ticks) {
- TitleContainer.addTitleWithDismiss(title, ticks);
- playNotificationSound();
+ /**
+ * Adds the title to {@link TitleContainer} for a set number of ticks and {@link #playNotificationSound() plays the notification sound} if the title is not in the {@link TitleContainer} already.
+ * No checking needs to be done on whether the title is in the {@link TitleContainer} already by the caller.
+ *
+ * @param title the title
+ * @param ticks the number of ticks the title will remain
+ */
+ public static void displayInTitleContainerAndPlaySound(Title title, int ticks) {
+ if (TitleContainer.addTitle(title, ticks)) {
+ playNotificationSound();
+ }
}
private static void playNotificationSound() {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java
index 02162140..7b19e284 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java
@@ -1,10 +1,13 @@
package me.xmrvizzy.skyblocker.utils;
import me.xmrvizzy.skyblocker.SkyblockerMod;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.screen.Screen;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.PriorityQueue;
+import java.util.function.Supplier;
/**
* A scheduler for running tasks at a later time. Tasks will be run synchronously on the main client thread. Use the instance stored in {@link SkyblockerMod#scheduler}. Do not instantiate this class.
@@ -50,6 +53,24 @@ public class Scheduler {
}
}
+ /**
+ * Schedules a screen to open in the next tick. Used in commands to avoid screen immediately closing after the command is executed.
+ *
+ * @param screenSupplier the supplier of the screen to open
+ */
+ public void queueOpenScreen(Supplier<Screen> screenSupplier) {
+ queueOpenScreen(screenSupplier.get());
+ }
+
+ /**
+ * Schedules a screen to open in the next tick. Used in commands to avoid screen immediately closing after the command is executed.
+ *
+ * @param screen the supplier of the screen to open
+ */
+ public void queueOpenScreen(Screen screen) {
+ MinecraftClient.getInstance().send(() -> MinecraftClient.getInstance().setScreen(screen));
+ }
+
public void tick() {
currentTick += 1;
ScheduledTask task;
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java
index d1977470..ac06eb36 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/Title.java
@@ -1,14 +1,31 @@
package me.xmrvizzy.skyblocker.utils.title;
+import net.minecraft.text.MutableText;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+
public class Title {
- public String text = "";
- public boolean active = true;
- public int color;
- public float lastX = 0;
- public float lastY = 0;
+ private MutableText text;
+ protected float lastX = 0;
+ protected float lastY = 0;
+
+ public MutableText getText() {
+ return text;
+ }
+
+ public void setText(MutableText text) {
+ this.text = text;
+ }
+
+ public void setFormatting(Formatting formatting) {
+ this.text.formatted(formatting);
+ }
+
+ public Title(String textKey, Formatting formatting) {
+ this(Text.translatable(textKey).formatted(formatting));
+ }
- public Title(String text, int color) {
+ public Title(MutableText text) {
this.text = text;
- this.color = color;
}
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java
index 14db8d6e..c4908a73 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java
@@ -1,8 +1,8 @@
package me.xmrvizzy.skyblocker.utils.title;
+import com.mojang.brigadier.Command;
import me.xmrvizzy.skyblocker.SkyblockerMod;
import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
-import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHudConfigScreen;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
@@ -12,55 +12,99 @@ import net.minecraft.client.gui.DrawContext;
import net.minecraft.text.Text;
import net.minecraft.util.math.MathHelper;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.LinkedHashSet;
+import java.util.Set;
public class TitleContainer {
- public static final MinecraftClient client = MinecraftClient.getInstance();
- public static List<Title> titles = new ArrayList<>();
+ /**
+ * The set of titles which will be rendered.
+ *
+ * @see #containsTitle(Title)
+ * @see #addTitle(Title)
+ * @see #addTitle(Title, int)
+ * @see #removeTitle(Title)
+ */
+ private static final Set<Title> titles = new LinkedHashSet<>();
public static void init() {
- HudRenderCallback.EVENT.register(TitleContainer::draw);
+ HudRenderCallback.EVENT.register(TitleContainer::render);
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker")
.then(ClientCommandManager.literal("hud")
.then(ClientCommandManager.literal("titleContainer")
.executes(context -> {
- client.send(() -> client.setScreen(new TitleContainerConfigScreen(Text.of("Title Container HUD Config"))));
- return 1;
+ SkyblockerMod.getInstance().scheduler.queueOpenScreen(new TitleContainerConfigScreen(Text.of("Title Container HUD Config")));
+ return Command.SINGLE_SUCCESS;
})))));
}
- public static void addTitle(Title title) {
- title.active = true;
- title.lastX = 0;
- title.lastY = SkyblockerConfig.get().general.titleContainer.y;
- titles.add(title);
+
+ /**
+ * Returns {@code true} if the title is currently shown.
+ *
+ * @param title the title to check
+ * @return whether the title in currently shown
+ */
+ public static boolean containsTitle(Title title) {
+ return titles.contains(title);
}
- public static void addTitleWithDismiss(Title title, int ticks) {
- addTitle(title);
- SkyblockerMod.getInstance().scheduler.schedule(() -> {
- title.active = false;
- }, ticks);
+
+ /**
+ * Adds a title to be shown
+ *
+ * @param title the title to be shown
+ * @return whether the title is already currently being shown
+ */
+ public static boolean addTitle(Title title) {
+ if (titles.add(title)) {
+ title.lastX = 0;
+ title.lastY = SkyblockerConfig.get().general.titleContainer.y;
+ return true;
+ }
+ return false;
}
- public static void draw(DrawContext context, float tickDelta) {
- draw(titles, SkyblockerConfig.get().general.titleContainer.x, SkyblockerConfig.get().general.titleContainer.y, context, tickDelta, false);
+
+ /**
+ * Adds a title to be shown for a set number of ticks
+ *
+ * @param title the title to be shown
+ * @param ticks the number of ticks to show the title
+ * @return whether the title is already currently being shown
+ */
+ public static boolean addTitle(Title title, int ticks) {
+ if (addTitle(title)) {
+ SkyblockerMod.getInstance().scheduler.schedule(() -> TitleContainer.removeTitle(title), ticks);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Stops showing a title
+ *
+ * @param title the title to stop showing
+ */
+ public static void removeTitle(Title title) {
+ titles.remove(title);
}
- public static void draw(List<Title> titlesToDraw, int xPos, int yPos, DrawContext context, float tickDelta, boolean example) {
+
+ private static void render(DrawContext context, float tickDelta) {
+ render(context, titles, SkyblockerConfig.get().general.titleContainer.x, SkyblockerConfig.get().general.titleContainer.y, tickDelta);
+ }
+
+ protected static void render(DrawContext context, Set<Title> titles, int xPos, int yPos, float tickDelta) {
var client = MinecraftClient.getInstance();
TextRenderer textRenderer = client.textRenderer;
- List<Title> toRemove = new ArrayList<>();
-
float scale = 3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F);
- var direction = SkyblockerConfig.get().general.titleContainer.direction;
- var alignment = SkyblockerConfig.get().general.titleContainer.alignment;
+ SkyblockerConfig.Direction direction = SkyblockerConfig.get().general.titleContainer.direction;
+ SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment;
float x = 0;
float y;
float width = 0;
- for (Title title : titlesToDraw) {
- width += textRenderer.getWidth(title.text) * scale + 10;
+ for (Title title : titles) {
+ width += textRenderer.getWidth(title.getText()) * scale + 10;
}
- if(direction == SkyblockerConfig.Direction.HORIZONTAL) {
+ if (direction == SkyblockerConfig.Direction.HORIZONTAL) {
if (alignment == SkyblockerConfig.Alignment.MIDDLE) {
x = xPos - (width / 2);
}
@@ -69,51 +113,45 @@ public class TitleContainer {
x = xPos;
}
}
- if(alignment == SkyblockerConfig.Alignment.LEFT || alignment == SkyblockerConfig.Alignment.RIGHT) {
+ if (alignment == SkyblockerConfig.Alignment.LEFT || alignment == SkyblockerConfig.Alignment.RIGHT) {
x = xPos;
}
y = yPos;
- for (Title title : titlesToDraw) {
+ for (Title title : titles) {
context.getMatrices().push();
context.getMatrices().translate(title.lastX, title.lastY, 200);
context.getMatrices().scale(scale, scale, scale);
- float xToUse = 0;
- if(direction == SkyblockerConfig.Direction.HORIZONTAL) {
+ float xToUse;
+ if (direction == SkyblockerConfig.Direction.HORIZONTAL) {
xToUse = alignment == SkyblockerConfig.Alignment.RIGHT ?
- x - (textRenderer.getWidth(title.text) * scale) :
+ x - (textRenderer.getWidth(title.getText()) * scale) :
x;
} else {
xToUse = alignment == SkyblockerConfig.Alignment.MIDDLE ?
- x - (textRenderer.getWidth(title.text) * scale) / 2 :
+ x - (textRenderer.getWidth(title.getText()) * scale) / 2 :
alignment == SkyblockerConfig.Alignment.RIGHT ?
- x - (textRenderer.getWidth(title.text) * scale) :
+ x - (textRenderer.getWidth(title.getText()) * scale) :
x;
}
title.lastX = MathHelper.lerp(tickDelta * 0.5F, title.lastX, xToUse);
title.lastY = MathHelper.lerp(tickDelta * 0.5F, title.lastY, y);
- if(direction == SkyblockerConfig.Direction.HORIZONTAL) {
+ if (direction == SkyblockerConfig.Direction.HORIZONTAL) {
if (alignment == SkyblockerConfig.Alignment.MIDDLE || alignment == SkyblockerConfig.Alignment.LEFT) {
- x += textRenderer.getWidth(title.text) * scale + 10;
+ x += textRenderer.getWidth(title.getText()) * scale + 10;
}
if (alignment == SkyblockerConfig.Alignment.RIGHT) {
- x -= textRenderer.getWidth(title.text) * scale + 10;
+ x -= textRenderer.getWidth(title.getText()) * scale + 10;
}
} else {
y += textRenderer.fontHeight * scale + 10;
}
- context.drawText(textRenderer, title.text, 0, 0, title.color, true);
+ context.drawTextWithShadow(textRenderer, title.getText(), 0, 0, 0xFFFFFF);
context.getMatrices().pop();
- if (!title.active && !example) {
- toRemove.add(title);
- }
- }
- if (!example) {
- titlesToDraw.removeAll(toRemove);
}
}
} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java
index a035f862..b4f3093f 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java
@@ -2,29 +2,26 @@ package me.xmrvizzy.skyblocker.utils.title;
import me.shedaniel.autoconfig.AutoConfig;
import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
-import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud;
import me.xmrvizzy.skyblocker.utils.RenderUtils;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.input.KeyCodes;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
-import net.minecraft.util.math.Box;
-import org.joml.Vector4i;
+import net.minecraft.util.Pair;
+import org.joml.Vector2i;
import org.lwjgl.glfw.GLFW;
import java.awt.*;
-import java.awt.event.KeyEvent;
-import java.util.List;
+import java.util.Set;
public class TitleContainerConfigScreen extends Screen {
-
- private final Title example1 = new Title("Test1", Formatting.RED.getColorValue());
- private final Title example2 = new Title("Test23", Formatting.AQUA.getColorValue());
- private final Title example3 = new Title("Testing1234", Formatting.DARK_GREEN.getColorValue());
+ private final Title example1 = new Title(Text.literal("Test1").formatted(Formatting.RED));
+ private final Title example2 = new Title(Text.literal("Test23").formatted(Formatting.AQUA));
+ private final Title example3 = new Title(Text.literal("Testing1234").formatted(Formatting.DARK_GREEN));
private int hudX = SkyblockerConfig.get().general.titleContainer.x;
private int hudY = SkyblockerConfig.get().general.titleContainer.y;
+
protected TitleContainerConfigScreen(Text title) {
super(title);
}
@@ -33,25 +30,18 @@ public class TitleContainerConfigScreen extends Screen {
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
super.render(context, mouseX, mouseY, delta);
renderBackground(context);
- TitleContainer.draw(List.of(example1, example2, example3), hudX, hudY, context, delta, true);
- context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB());
- var direction = SkyblockerConfig.get().general.titleContainer.direction;
- var alignment = SkyblockerConfig.get().general.titleContainer.alignment;
- int width1 = client.textRenderer.getWidth("Press Q/E to change Alignment: " + alignment.toString());
- int width2 = client.textRenderer.getWidth("Press R to change Direction: " + direction.toString());
- context.drawText(client.textRenderer, "Press Q/E to change Alignment: " + alignment.toString(), (width / 2) - width1 / 2, client.textRenderer.fontHeight * 2, Color.WHITE.getRGB(), true);
- context.drawText(client.textRenderer, "Press R to change Direction: " + direction.toString(), (width / 2) - width2 / 2, client.textRenderer.fontHeight * 3 + 5, Color.WHITE.getRGB(), true);
-
- int x1;
- int x2;
- int y1;
- int y2;
-
- var vec = getSelectionBounding();
- x1 = vec.x;
- x2 = vec.y;
- y1 = vec.z;
- y2 = vec.w;
+ TitleContainer.render(context, Set.of(example1, example2, example3), hudX, hudY, delta);
+ SkyblockerConfig.Direction direction = SkyblockerConfig.get().general.titleContainer.direction;
+ SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment;
+ context.drawCenteredTextWithShadow(client.textRenderer, "Press Q/E to change Alignment: " + alignment, width / 2, client.textRenderer.fontHeight * 2, Color.WHITE.getRGB());
+ context.drawCenteredTextWithShadow(client.textRenderer, "Press R to change Direction: " + direction, width / 2, client.textRenderer.fontHeight * 3 + 5, Color.WHITE.getRGB());
+ context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, client.textRenderer.fontHeight * 4 + 10, Color.GRAY.getRGB());
+
+ Pair<Vector2i, Vector2i> boundingBox = getSelectionBoundingBox();
+ int x1 = boundingBox.getLeft().x;
+ int y1 = boundingBox.getLeft().y;
+ int x2 = boundingBox.getRight().x;
+ int y2 = boundingBox.getRight().y;
context.drawHorizontalLine(x1, x2, y1, Color.RED.getRGB());
context.drawHorizontalLine(x1, x2, y2, Color.RED.getRGB());
@@ -59,46 +49,39 @@ public class TitleContainerConfigScreen extends Screen {
context.drawVerticalLine(x2, y1, y2, Color.RED.getRGB());
}
- public Vector4i getSelectionBounding()
- {
- var direction = SkyblockerConfig.get().general.titleContainer.direction;
- var alignment = SkyblockerConfig.get().general.titleContainer.alignment;
+ public Pair<Vector2i, Vector2i> getSelectionBoundingBox() {
+ SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment;
int midWidth = getSelectionWidth() / 2;
- int midHeight = getSelectionHeight() / 2;
int x1 = 0;
int x2 = 0;
- int y1 = 0;
- int y2 = 0;
- y1 = hudY;
- y2 = hudY + midHeight * 2;
+ int y1 = hudY;
+ int y2 = hudY + getSelectionHeight();
switch (alignment) {
- case RIGHT:
+ case RIGHT -> {
x1 = hudX - midWidth * 2;
x2 = hudX;
- break;
- case MIDDLE:
+ }
+ case MIDDLE -> {
x1 = hudX - midWidth;
x2 = hudX + midWidth;
- break;
- case LEFT:
+ }
+ case LEFT -> {
x1 = hudX;
x2 = hudX + midWidth * 2;
- break;
+ }
}
- return new Vector4i(x1, x2, y1, y2);
+ return new Pair<>(new Vector2i(x1, y1), new Vector2i(x2, y2));
}
- public int getSelectionHeight()
- {
+ public int getSelectionHeight() {
int scale = (int) (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F));
return SkyblockerConfig.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ?
textRenderer.fontHeight * scale :
(textRenderer.fontHeight + 10) * 3 * scale;
}
- public int getSelectionWidth()
- {
+ public int getSelectionWidth() {
int scale = (int) (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F));
return SkyblockerConfig.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ?
(textRenderer.getWidth("Test1") + 10 + textRenderer.getWidth("Test23") + 10 + textRenderer.getWidth("Testing1234")) * scale :
@@ -111,16 +94,11 @@ public class TitleContainerConfigScreen extends Screen {
int midHeight = getSelectionHeight() / 2;
var alignment = SkyblockerConfig.get().general.titleContainer.alignment;
- int x1;
- int x2;
- int y1;
- int y2;
-
- var vec = getSelectionBounding();
- x1 = vec.x;
- x2 = vec.y;
- y1 = vec.z;
- y2 = vec.w;
+ Pair<Vector2i, Vector2i> boundingBox = getSelectionBoundingBox();
+ int x1 = boundingBox.getLeft().x;
+ int y1 = boundingBox.getLeft().y;
+ int x2 = boundingBox.getRight().x;
+ int y2 = boundingBox.getRight().y;
if (RenderUtils.pointExistsInArea((int) mouseX, (int) mouseY, x1, y1, x2, y2) && button == 0) {
hudX = alignment == SkyblockerConfig.Alignment.RIGHT ?
@@ -135,31 +113,31 @@ public class TitleContainerConfigScreen extends Screen {
public boolean mouseClicked(double mouseX, double mouseY, int button) {
if (button == 1) {
hudX = this.width / 2;
- hudY = (int) (this.height * 0.6F);
+ hudY = this.height / 2;
}
return super.mouseClicked(mouseX, mouseY, button);
}
@Override
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
- if(keyCode == GLFW.GLFW_KEY_Q) {
- var current = SkyblockerConfig.get().general.titleContainer.alignment;
+ if (keyCode == GLFW.GLFW_KEY_Q) {
+ SkyblockerConfig.Alignment current = SkyblockerConfig.get().general.titleContainer.alignment;
SkyblockerConfig.get().general.titleContainer.alignment = switch (current) {
case LEFT -> SkyblockerConfig.Alignment.MIDDLE;
case MIDDLE -> SkyblockerConfig.Alignment.RIGHT;
case RIGHT -> SkyblockerConfig.Alignment.LEFT;
};
}
- if(keyCode == GLFW.GLFW_KEY_E) {
- var current = SkyblockerConfig.get().general.titleContainer.alignment;
+ if (keyCode == GLFW.GLFW_KEY_E) {
+ SkyblockerConfig.Alignment current = SkyblockerConfig.get().general.titleContainer.alignment;
SkyblockerConfig.get().general.titleContainer.alignment = switch (current) {
case LEFT -> SkyblockerConfig.Alignment.RIGHT;
case MIDDLE -> SkyblockerConfig.Alignment.LEFT;
case RIGHT -> SkyblockerConfig.Alignment.MIDDLE;
};
}
- if(keyCode == GLFW.GLFW_KEY_R) {
- var current = SkyblockerConfig.get().general.titleContainer.direction;
+ if (keyCode == GLFW.GLFW_KEY_R) {
+ SkyblockerConfig.Direction current = SkyblockerConfig.get().general.titleContainer.direction;
SkyblockerConfig.get().general.titleContainer.direction = switch (current) {
case HORIZONTAL -> SkyblockerConfig.Direction.VERTICAL;
case VERTICAL -> SkyblockerConfig.Direction.HORIZONTAL;