From deec09187e3ca624707c015be8ef58c4c393e46c Mon Sep 17 00:00:00 2001 From: Shoshak Date: Wed, 10 Jul 2024 23:22:04 +0500 Subject: [PATCH 1/5] Add sum of best splits --- .../asodev/islandutils/IslandUtilsClient.java | 26 +- .../mixins/network/PacketListenerMixin.java | 57 ++++- .../modules/splits/LevelSplits.java | 14 ++ .../modules/splits/LevelTimer.java | 63 ++++- .../modules/splits/sob/AdvancedInfo.java | 4 + .../modules/splits/sob/SobCalc.java | 227 ++++++++++++++++++ .../modules/splits/sob/SobRenderer.java | 43 ++++ .../modules/splits/sob/TeamInfo.java | 42 ++++ .../modules/splits/ui/DojoSplitUI.java | 7 - .../options/categories/SplitsCategory.java | 12 + .../resources/assets/island/lang/en_us.json | 2 + 11 files changed, 466 insertions(+), 31 deletions(-) create mode 100644 src/main/java/net/asodev/islandutils/modules/splits/sob/AdvancedInfo.java create mode 100644 src/main/java/net/asodev/islandutils/modules/splits/sob/SobCalc.java create mode 100644 src/main/java/net/asodev/islandutils/modules/splits/sob/SobRenderer.java create mode 100644 src/main/java/net/asodev/islandutils/modules/splits/sob/TeamInfo.java diff --git a/src/main/java/net/asodev/islandutils/IslandUtilsClient.java b/src/main/java/net/asodev/islandutils/IslandUtilsClient.java index 37307a52..d2e5ac4b 100644 --- a/src/main/java/net/asodev/islandutils/IslandUtilsClient.java +++ b/src/main/java/net/asodev/islandutils/IslandUtilsClient.java @@ -2,15 +2,15 @@ import com.mojang.blaze3d.platform.InputConstants; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.noxcrew.noxesium.network.NoxesiumPackets; -import com.noxcrew.noxesium.network.clientbound.ClientboundMccGameStatePacket; -import com.noxcrew.noxesium.network.clientbound.ClientboundMccServerPacket; import net.asodev.islandutils.discord.DiscordPresenceUpdator; import net.asodev.islandutils.modules.DisguiseKeybind; import net.asodev.islandutils.modules.NoxesiumIntegration; import net.asodev.islandutils.modules.plobby.PlobbyFeatures; import net.asodev.islandutils.modules.plobby.PlobbyJoinCodeCopy; +import net.asodev.islandutils.modules.splits.LevelSplits; import net.asodev.islandutils.modules.splits.SplitManager; +import net.asodev.islandutils.modules.splits.sob.AdvancedInfo; +import net.asodev.islandutils.modules.splits.sob.SobCalc; import net.asodev.islandutils.modules.splits.ui.SplitUI; import net.asodev.islandutils.state.Game; import net.asodev.islandutils.state.MccIslandState; @@ -21,6 +21,8 @@ import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.minecraft.client.KeyMapping; import net.minecraft.network.chat.ClickEvent; @@ -28,6 +30,8 @@ import net.minecraft.network.chat.Style; import org.lwjgl.glfw.GLFW; +import java.util.Optional; + @Environment(EnvType.CLIENT) public class IslandUtilsClient implements ClientModInitializer { public static KeyMapping openPlobbyKey; @@ -58,6 +62,22 @@ public void onInitializeClient() { SplitUI.setupFallbackRenderer(); } new NoxesiumIntegration().init(); + + // MCCI Commands but better + ClientCommandRegistrationCallback.EVENT.register(((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("showadvancedpath").executes(context -> { + if (MccIslandState.getGame() != Game.PARKOUR_WARRIOR_DOJO) { + context.getSource().sendFeedback(Component.literal("Not in PKWD")); + return 0; + } + LevelSplits splits = SplitManager.getCourseSplits(MccIslandState.getMap()); + Optional advInfo = SobCalc.advancedTime(splits); + if (advInfo.isEmpty()) { + context.getSource().sendFeedback(Component.literal("Could not get advanced path")); + return 0; + } + context.getSource().sendFeedback(Component.literal(advInfo.get().path())); + return 1; + })))); } public static void onJoinMCCI(boolean isProduction) { diff --git a/src/main/java/net/asodev/islandutils/mixins/network/PacketListenerMixin.java b/src/main/java/net/asodev/islandutils/mixins/network/PacketListenerMixin.java index 15ebc992..7ff26da5 100644 --- a/src/main/java/net/asodev/islandutils/mixins/network/PacketListenerMixin.java +++ b/src/main/java/net/asodev/islandutils/mixins/network/PacketListenerMixin.java @@ -1,14 +1,18 @@ package net.asodev.islandutils.mixins.network; import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.ParseResults; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.suggestion.Suggestion; +import it.unimi.dsi.fastutil.objects.Object2IntMap; import net.asodev.islandutils.IslandUtilsClient; import net.asodev.islandutils.IslandUtilsEvents; import net.asodev.islandutils.discord.DiscordPresenceUpdator; import net.asodev.islandutils.modules.FriendsInGame; +import net.asodev.islandutils.modules.splits.LevelSplits; +import net.asodev.islandutils.modules.splits.SplitManager; +import net.asodev.islandutils.modules.splits.sob.SobCalc; +import net.asodev.islandutils.modules.splits.sob.SobRenderer; +import net.asodev.islandutils.modules.splits.sob.TeamInfo; import net.asodev.islandutils.options.IslandOptions; import net.asodev.islandutils.options.IslandSoundCategories; import net.asodev.islandutils.modules.ClassicAnnouncer; @@ -23,7 +27,7 @@ import net.minecraft.client.multiplayer.*; import net.minecraft.client.resources.sounds.SoundInstance; import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.core.RegistryAccess; import net.minecraft.network.Connection; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; @@ -33,10 +37,13 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.player.ProfileKeyPair; import net.minecraft.world.level.Level; +import net.minecraft.world.scores.*; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -51,11 +58,19 @@ @Mixin(ClientPacketListener.class) public abstract class PacketListenerMixin extends ClientCommonPacketListenerImpl { - // I should really separate these mixins... @Shadow private CommandDispatcher commands; + @Shadow public abstract RegistryAccess.Frozen registryAccess(); + + @Shadow public abstract void setKeyPair(ProfileKeyPair profileKeyPair); + + @Final + @Shadow private Scoreboard scoreboard; + + @Shadow public abstract boolean isAcceptingMessages(); + protected PacketListenerMixin(Minecraft minecraft, Connection connection, CommonListenerCookie commonListenerCookie) { super(minecraft, connection, commonListenerCookie); } @@ -65,8 +80,10 @@ protected PacketListenerMixin(Minecraft minecraft, Connection connection, Common "MAP", Pattern.compile("MAP: (?\\w+(?:,? \\w+)*)"), "MODIFIER", Pattern.compile("MODIFIER: (?\\w+(?:,? \\w+)*)"), "COURSE", Pattern.compile("COURSE: (?.*)"), - "LEAP", Pattern.compile("LEAP \\[(?.*/.*)]") + "LEAP", Pattern.compile("LEAP \\[(?.*/.*)]"), + "TIME", Pattern.compile("(?