diff options
Diffstat (limited to 'src/main/java')
38 files changed, 650 insertions, 978 deletions
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java index d673aca4..fd6a2eaa 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java @@ -68,8 +68,8 @@ public class SkyblockerMod implements ClientModInitializer { Scheduler.INSTANCE.scheduleCyclic(Utils::update, 20); Scheduler.INSTANCE.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 200); Scheduler.INSTANCE.scheduleCyclic(BackpackPreview::tick, 50); - Scheduler.INSTANCE.scheduleCyclic(DwarvenHud::update, 40); - Scheduler.INSTANCE.scheduleCyclic(CrystalsHud::update, 40); + //Scheduler.INSTANCE.scheduleCyclic(DwarvenHud::update, 40); + //Scheduler.INSTANCE.scheduleCyclic(CrystalsHudWidget::update, 40); Scheduler.INSTANCE.scheduleCyclic(PlayerListMgr::updateList, 20); } diff --git a/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java b/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java index 2e4b8977..ac1d8966 100644 --- a/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java @@ -56,13 +56,13 @@ public abstract class HudConfigScreen extends Screen { } /** - * Renders the widgets using the default {@link HudWidget#render(DrawContext, boolean)} method. Override to change the behavior. + * Renders the widgets using the default {@link HudWidget#render(DrawContext)} method. Override to change the behavior. * @param context the context to render in * @param widgets the widgets to render */ protected void renderWidget(DrawContext context, List<HudWidget> widgets) { for (HudWidget widget : widgets) { - widget.render(context, SkyblockerConfigManager.get().uiAndVisuals.tabHud.enableHudBackground); + widget.render(context); } } diff --git a/src/main/java/de/hysky/skyblocker/config/categories/FarmingCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/FarmingCategory.java index 90b36c72..c540502c 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/FarmingCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/FarmingCategory.java @@ -3,6 +3,9 @@ package de.hysky.skyblocker.config.categories; import de.hysky.skyblocker.config.ConfigUtils; import de.hysky.skyblocker.config.SkyblockerConfig; import de.hysky.skyblocker.skyblock.garden.FarmingHudConfigScreen; +import de.hysky.skyblocker.skyblock.garden.FarmingHudWidget; +import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsConfigurationScreen; +import de.hysky.skyblocker.utils.Location; import dev.isxander.yacl3.api.ButtonOption; import dev.isxander.yacl3.api.ConfigCategory; import dev.isxander.yacl3.api.Option; @@ -30,7 +33,7 @@ public class FarmingCategory { .option(ButtonOption.createBuilder() .name(Text.translatable("skyblocker.config.farming.garden.farmingHud")) .text(Text.translatable("text.skyblocker.open")) - .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new FarmingHudConfigScreen(screen))) + .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new WidgetsConfigurationScreen(Location.GARDEN, FarmingHudWidget.INSTANCE.getInternalID(), screen))) .build()) .option(Option.<Boolean>createBuilder() .name(Text.translatable("skyblocker.config.farming.garden.dicerTitlePrevent")) diff --git a/src/main/java/de/hysky/skyblocker/config/categories/MiningCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/MiningCategory.java index 364e9b07..f53fb562 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/MiningCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/MiningCategory.java @@ -3,10 +3,11 @@ package de.hysky.skyblocker.config.categories; import de.hysky.skyblocker.config.ConfigUtils; import de.hysky.skyblocker.config.SkyblockerConfig; import de.hysky.skyblocker.config.configs.MiningConfig; -import de.hysky.skyblocker.skyblock.dwarven.CrystalsHudConfigScreen; -import de.hysky.skyblocker.skyblock.dwarven.DwarvenHudConfigScreen; import dev.isxander.yacl3.api.*; import dev.isxander.yacl3.api.controller.ColorControllerBuilder; +import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsConfigurationScreen; +import de.hysky.skyblocker.utils.Location; +import dev.isxander.yacl3.api.*; import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder; import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder; import net.minecraft.client.MinecraftClient; @@ -57,15 +58,18 @@ public class MiningCategory { .build()) //Dwarven HUD + // TODO remove .group(OptionGroup.createBuilder() .name(Text.translatable("skyblocker.config.mining.dwarvenHud")) .collapsed(false) + .option(LabelOption.create(Text.literal("Use the hypixel widget."))) .option(Option.<Boolean>createBuilder() .name(Text.translatable("skyblocker.config.mining.dwarvenHud.enabledCommissions")) .binding(defaults.mining.dwarvenHud.enabledCommissions, () -> config.mining.dwarvenHud.enabledCommissions, newValue -> config.mining.dwarvenHud.enabledCommissions = newValue) .controller(ConfigUtils::createBooleanController) + .available(false) .build()) .option(Option.<Boolean>createBuilder() .name(Text.translatable("skyblocker.config.mining.dwarvenHud.enabledPowder")) @@ -73,6 +77,7 @@ public class MiningCategory { () -> config.mining.dwarvenHud.enabledPowder, newValue -> config.mining.dwarvenHud.enabledPowder = newValue) .controller(ConfigUtils::createBooleanController) + .available(false) .build()) .option(Option.<MiningConfig.DwarvenHudStyle>createBuilder() .name(Text.translatable("skyblocker.config.mining.dwarvenHud.style")) @@ -83,11 +88,13 @@ public class MiningCategory { () -> config.mining.dwarvenHud.style, newValue -> config.mining.dwarvenHud.style = newValue) .controller(ConfigUtils::createEnumCyclingListController) + .available(false) .build()) .option(ButtonOption.createBuilder() .name(Text.translatable("skyblocker.config.mining.dwarvenHud.screen")) .text(Text.translatable("text.skyblocker.open")) - .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new DwarvenHudConfigScreen(screen))) + .action((screen, opt) -> screen.tick()) + .available(false) .build()) .build()) @@ -142,7 +149,7 @@ public class MiningCategory { .option(ButtonOption.createBuilder() .name(Text.translatable("skyblocker.config.mining.crystalsHud.screen")) .text(Text.translatable("text.skyblocker.open")) - .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new CrystalsHudConfigScreen(screen))) + .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new WidgetsConfigurationScreen(Location.CRYSTAL_HOLLOWS, "hud_crystals", screen))) .build()) .option(Option.<Float>createBuilder() .name(Text.translatable("skyblocker.config.mining.crystalsHud.mapScaling")) diff --git a/src/main/java/de/hysky/skyblocker/config/categories/OtherLocationsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/OtherLocationsCategory.java index c670c898..d8e87697 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/OtherLocationsCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/OtherLocationsCategory.java @@ -130,7 +130,7 @@ public class OtherLocationsCategory { .option(ButtonOption.createBuilder() .name(Text.translatable("skyblocker.config.otherLocations.end.screen")) .text(Text.translatable("text.skyblocker.open")) // Reusing again lol - .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new WidgetsConfigurationScreen(Location.THE_END, EndHudWidget.INSTANCE.getInternalID()))) + .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new WidgetsConfigurationScreen(Location.THE_END, EndHudWidget.INSTANCE.getInternalID(), screen))) .build()) .option(ButtonOption.createBuilder() .name(Text.translatable("skyblocker.config.otherLocations.end.resetName")) diff --git a/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java index 4e890316..d4f39346 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java @@ -194,12 +194,22 @@ public class UIAndVisualsCategory { .controller(ConfigUtils::createBooleanController) .build()) .option(Option.<Boolean>createBuilder() + .name(Text.literal("Effects from footer")) + .description(OptionDescription.of(Text.literal("If on, will fetch current effects from the tab footer if the hypixel Effects widget is disabled"))) + .controller(ConfigUtils::createBooleanController) + .binding(defaults.uiAndVisuals.tabHud.effectsFromFooter, + () -> config.uiAndVisuals.tabHud.effectsFromFooter, + newValue -> config.uiAndVisuals.tabHud.effectsFromFooter = newValue) + .build()) + // TODO Decide what to do with these options + .option(Option.<Boolean>createBuilder() .name(Text.translatable("skyblocker.config.uiAndVisuals.tabHud.plainPlayerNames")) .description(OptionDescription.of(Text.translatable("skyblocker.config.uiAndVisuals.tabHud.plainPlayerNames.@Tooltip"))) .binding(defaults.uiAndVisuals.tabHud.plainPlayerNames, () -> config.uiAndVisuals.tabHud.plainPlayerNames, newValue -> config.uiAndVisuals.tabHud.plainPlayerNames = newValue) .controller(ConfigUtils::createBooleanController) + .available(false) .build()) .option(Option.<UIAndVisualsConfig.NameSorting>createBuilder() .name(Text.translatable("skyblocker.config.uiAndVisuals.tabHud.nameSorting")) @@ -208,6 +218,7 @@ public class UIAndVisualsCategory { () -> config.uiAndVisuals.tabHud.nameSorting, newValue -> config.uiAndVisuals.tabHud.nameSorting = newValue) .controller(ConfigUtils::createEnumCyclingListController) + .available(false) .build()) .build()) @@ -439,7 +450,7 @@ public class UIAndVisualsCategory { .binding(defaults.uiAndVisuals.compactDamage.precision, () -> config.uiAndVisuals.compactDamage.precision, newValue -> config.uiAndVisuals.compactDamage.precision = newValue) - .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(1,3).step(1)) + .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(1, 3).step(1)) .build()) .option(Option.<Color>createBuilder() .name(Text.translatable("skyblocker.config.uiAndVisuals.compactDamage.normalDamageColor")) diff --git a/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java index 755fb46e..2982804b 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java @@ -162,6 +162,9 @@ public class UIAndVisualsConfig { public boolean enableHudBackground = true; @SerialEntry + public boolean effectsFromFooter = false; + + @SerialEntry public boolean plainPlayerNames = false; @SerialEntry diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudConfigScreen.java deleted file mode 100644 index 1858b214..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudConfigScreen.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.hysky.skyblocker.skyblock.dwarven; - -import de.hysky.skyblocker.config.HudConfigScreen; -import de.hysky.skyblocker.config.SkyblockerConfig; -import de.hysky.skyblocker.skyblock.tabhud.widget.EmptyWidget; -import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; -import it.unimi.dsi.fastutil.ints.IntIntMutablePair; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.text.Text; - -import java.util.List; - -public class CrystalsHudConfigScreen extends HudConfigScreen { - private static final EmptyWidget WIDGET = new EmptyWidget(); - - protected CrystalsHudConfigScreen() { - this(null); - } - - public CrystalsHudConfigScreen(Screen parent) { - super(Text.of("Crystals HUD Config"), parent, WIDGET); - WIDGET.setDimensions(CrystalsHud.getDimensionsForConfig()); - } - - @SuppressWarnings("SuspiciousNameCombination") - @Override - protected List<IntIntMutablePair> getConfigPos(SkyblockerConfig config) { - return List.of(IntIntMutablePair.of(config.mining.crystalsHud.x, config.mining.crystalsHud.y)); - } - - @Override - protected void renderWidget(DrawContext context, List<HudWidget> widgets) { - int size = CrystalsHud.getDimensionsForConfig(); - WIDGET.setDimensions(size); - context.drawTexture(RenderLayer::getGuiTextured, CrystalsHud.MAP_TEXTURE, WIDGET.getX(), WIDGET.getY(), 0, 0, size, size, size, size); - } - - @Override - protected void savePos(SkyblockerConfig configManager, List<HudWidget> widgets) { - configManager.mining.crystalsHud.x = widgets.getFirst().getX(); - configManager.mining.crystalsHud.y = widgets.getFirst().getY(); - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudWidget.java index 8689df83..a47ce135 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudWidget.java @@ -4,6 +4,8 @@ import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.annotations.Init; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.events.HudRenderEvents; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; +import de.hysky.skyblocker.utils.Location; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; @@ -20,23 +22,28 @@ import org.joml.Vector2ic; import java.util.List; import java.util.Map; -public class CrystalsHud { +public class CrystalsHudWidget extends HudWidget { private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); protected static final Identifier MAP_TEXTURE = Identifier.of(SkyblockerMod.NAMESPACE, "textures/gui/crystals_map.png"); private static final Identifier MAP_ICON = Identifier.ofVanilla("textures/map/decorations/player.png"); private static final List<String> SMALL_LOCATIONS = List.of("Fairy Grotto", "King Yolkar", "Corleone", "Odawa", "Key Guardian", "Unknown"); + public static final CrystalsHudWidget INSTANCE = new CrystalsHudWidget(); public static boolean visible = false; + public CrystalsHudWidget() { + super("hud_crystals"); + } + @Init public static void init() { - ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker") + /*ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker") .then(ClientCommandManager.literal("hud") .then(ClientCommandManager.literal("crystals") - .executes(Scheduler.queueOpenScreenCommand(CrystalsHudConfigScreen::new)))))); + .executes(Scheduler.queueOpenScreenCommand(CrystalsHudConfigScreen::new))))));*/ - HudRenderEvents.AFTER_MAIN_HUD.register((context, tickCounter) -> { + /*HudRenderEvents.AFTER_MAIN_HUD.register((context, tickCounter) -> { if (!SkyblockerConfigManager.get().mining.crystalsHud.enabled || CLIENT.player == null || !visible) { @@ -44,7 +51,7 @@ public class CrystalsHud { } render(context, SkyblockerConfigManager.get().mining.crystalsHud.x, SkyblockerConfigManager.get().mining.crystalsHud.y); - }); + });*/ } protected static int getDimensionsForConfig() { @@ -53,21 +60,76 @@ public class CrystalsHud { /** - * Renders the map to the players UI. renders the background image ({@link CrystalsHud#MAP_TEXTURE}) of the map then if enabled special locations on the map. then finally the player to the map. + * Renders the map to the players UI. renders the background image ({@link CrystalsHudWidget#MAP_TEXTURE}) of the map then if enabled special locations on the map. then finally the player to the map. * * @param context DrawContext to draw map to * @param hudX Top left X coordinate of the map * @param hudY Top left Y coordinate of the map */ private static void render(DrawContext context, int hudX, int hudY) { + + } + + /** + * Converts an X and Z coordinate in the crystal hollow to an X and Y coordinate on the map. + * + * @param x the world X coordinate + * @param z the world Z coordinate + * @return a vector representing the x and y values + */ + protected static Vector2ic transformLocation(double x, double z) { + //converts an x and z to a location on the map + int transformedX = (int) ((x - 202) / 621 * 62); + int transformedY = (int) ((z - 202) / 621 * 62); + transformedX = Math.clamp(transformedX, 0, 62); + transformedY = Math.clamp(transformedY, 0, 62); + + return new Vector2i(transformedX, transformedY); + } + + /** + * Converts yaw to the cardinal directions that a player marker can be rotated towards on a map. + * The rotations of a marker follow this order: N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW. + * <br><br> + * Based off code from {@link net.minecraft.client.render.MapRenderer} + */ + private static float yaw2Cardinal(float yaw) { + yaw += 180; //flip direction + byte clipped = (byte) ((yaw + (yaw < 0.0 ? -8.0 : 8.0)) * 16.0 / 360.0); + + return (clipped * 360f) / 16f; + } + + @Override + public boolean shouldRender(Location location) { + return location.equals(Location.CRYSTAL_HOLLOWS) && SkyblockerConfigManager.get().mining.crystalsHud.enabled; + } + + /** + * Works out if the crystals map should be rendered and sets {@link CrystalsHudWidget#visible} accordingly. + * + */ + public void update() { + if (CLIENT.player == null || CLIENT.getNetworkHandler() == null || !SkyblockerConfigManager.get().mining.crystalsHud.enabled) { + visible = false; + return; + } + + //get if the player is in the crystals + visible = Utils.isInCrystalHollows(); + } + + @Override + public void render(DrawContext context, int mouseX, int mouseY, float delta) { float scale = SkyblockerConfigManager.get().mining.crystalsHud.mapScaling; //make sure the map renders infront of some stuff - improve this in the future with better layering (1.20.5?) //and set position and scale MatrixStack matrices = context.getMatrices(); matrices.push(); - matrices.translate(hudX, hudY, 0f); + matrices.translate(x, y, 0f); matrices.scale(scale, scale, 0f); + w = h = (int) (62 * scale); //draw map texture context.drawTexture(RenderLayer::getGuiTextured, MAP_TEXTURE, 0, 0, 0, 0, 62, 62, 62, 62); @@ -90,6 +152,7 @@ public class CrystalsHud { //draw player on map if (CLIENT.player == null || CLIENT.getNetworkHandler() == null) { + matrices.pop(); return; } //get player location diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java index 6d0a13c2..e69de29b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java @@ -1,215 +0,0 @@ -package de.hysky.skyblocker.skyblock.dwarven; - -import de.hysky.skyblocker.annotations.Init; -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.config.configs.MiningConfig; -import de.hysky.skyblocker.events.HudRenderEvents; -import de.hysky.skyblocker.mixins.accessors.PlayerListHudAccessor; -import de.hysky.skyblocker.skyblock.tabhud.util.Colors; -import de.hysky.skyblocker.skyblock.tabhud.widget.hud.HudCommsWidget; -import de.hysky.skyblocker.skyblock.tabhud.widget.hud.HudPowderWidget; -import de.hysky.skyblocker.utils.Utils; -import de.hysky.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; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Stream; - -public class DwarvenHud { - - private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); - private static List<Commission> commissionList = new ArrayList<>(); - - public static String mithrilPowder = "0"; - public static String gemStonePowder = "0"; - public static String glacitePowder = "0"; - - private static final List<Pattern> COMMISSIONS = Stream.of( - "(?:Titanium|Mithril|Hard Stone) Miner", - "(?:Glacite Walker|Golden Goblin|(?<!Golden )Goblin|Goblin Raid|Treasure Hoarder|Automaton|Sludge|Team Treasurite Member|Yog|Boss Corleone|Thyst|Maniac|Mines) Slayer", - "(?:Lava Springs|Cliffside Veins|Rampart's Quarry|Upper Mines|Royal Mines) Mithril", - "(?:Lava Springs|Cliffside Veins|Rampart's Quarry|Upper Mines|Royal Mines) Titanium", - "Goblin Raid", - "(?:Star Sentry|Treasure Hoarder) Puncher", - "(?<!Lucky )Raffle", - "Lucky Raffle", - "2x Mithril Powder Collector", - "First Event", - "(?:Ruby|Amber|Sapphire|Jade|Amethyst|Topaz|Onyx|Aquamarine|Citrine|Peridot) Gemstone Collector", - "(?:Amber|Sapphire|Jade|Amethyst|Topaz) Crystal Hunter", - "(?:Umber|Tungsten|Glacite|Scrap) Collector", - "Mineshaft Explorer", - "(?:Chest|Corpse) Looter").map(s -> Pattern.compile("(" + s + "): (\\d+\\.?\\d*%|DONE)") - ).toList(); - private static final Pattern MITHRIL_PATTERN = Pattern.compile("Mithril: [0-9,]+"); - private static final Pattern GEMSTONE_PATTERN = Pattern.compile("Gemstone: [0-9,]+"); - private static final Pattern GLACITE_PATTERN = Pattern.compile("Glacite: [0-9,]+"); - - @Init - public static void init() { - ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker") - .then(ClientCommandManager.literal("hud") |
