From 9abca00aa8cefd6dad780d5532c3bbc19dcec12d Mon Sep 17 00:00:00 2001 From: 4P5 Date: Sat, 13 Jan 2024 00:50:25 +1300 Subject: [PATCH 1/2] getters for actionbar, title, and subtitle - Added `client.getActionbar`, `client.getTitle`, and `client.getSubtitle`, which return their respective components when they're visible, or nil when not. --- .../figuramc/figura/lua/api/ClientAPI.java | 23 +++++++++++++ .../figura/mixin/gui/GuiAccessor.java | 32 +++++++++++++++++++ .../resources/assets/figura/lang/en_us.json | 3 ++ .../main/resources/figura-common.mixins.json | 3 +- 4 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/org/figuramc/figura/mixin/gui/GuiAccessor.java diff --git a/common/src/main/java/org/figuramc/figura/lua/api/ClientAPI.java b/common/src/main/java/org/figuramc/figura/lua/api/ClientAPI.java index c633e39b4..5fbb39c7d 100644 --- a/common/src/main/java/org/figuramc/figura/lua/api/ClientAPI.java +++ b/common/src/main/java/org/figuramc/figura/lua/api/ClientAPI.java @@ -7,6 +7,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.MouseHandler; import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.Gui; import net.minecraft.client.multiplayer.PlayerInfo; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.server.IntegratedServer; @@ -25,6 +26,7 @@ import org.figuramc.figura.lua.docs.LuaTypeDoc; import org.figuramc.figura.math.vector.FiguraVec2; import org.figuramc.figura.math.vector.FiguraVec3; +import org.figuramc.figura.mixin.gui.GuiAccessor; import org.figuramc.figura.mixin.gui.PlayerTabOverlayAccessor; import org.figuramc.figura.mixin.render.ModelManagerAccessor; import org.figuramc.figura.utils.*; @@ -537,6 +539,27 @@ public static double getFrameTime() { return Minecraft.getInstance().getFrameTime(); } + @LuaWhitelist + @LuaMethodDoc("client.get_actionbar") + public static Component getActionbar() { + Gui gui = Minecraft.getInstance().gui; + return ((GuiAccessor) gui).getActionbarTime() > 0 ? ((GuiAccessor) gui).getActionbar() : null; + } + + @LuaWhitelist + @LuaMethodDoc("client.get_title") + public static Component getTitle() { + Gui gui = Minecraft.getInstance().gui; + return ((GuiAccessor) gui).getTime() > 0 ? ((GuiAccessor) gui).getTitle() : null; + } + + @LuaWhitelist + @LuaMethodDoc("client.get_subtitle") + public static Component getSubtitle() { + Gui gui = Minecraft.getInstance().gui; + return ((GuiAccessor) gui).getTime() > 0 ? ((GuiAccessor) gui).getSubtitle() : null; + } + @LuaWhitelist @LuaMethodDoc("client.list_atlases") public static List listAtlases() { diff --git a/common/src/main/java/org/figuramc/figura/mixin/gui/GuiAccessor.java b/common/src/main/java/org/figuramc/figura/mixin/gui/GuiAccessor.java new file mode 100644 index 000000000..128d086ac --- /dev/null +++ b/common/src/main/java/org/figuramc/figura/mixin/gui/GuiAccessor.java @@ -0,0 +1,32 @@ +package org.figuramc.figura.mixin.gui; + +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.ChatScreen; +import net.minecraft.network.chat.Component; +import org.spongepowered.asm.mixin.Intrinsic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(Gui.class) +public interface GuiAccessor { + @Intrinsic + @Accessor("title") + Component getTitle(); + + @Intrinsic + @Accessor("subtitle") + Component getSubtitle(); + + @Intrinsic + @Accessor("overlayMessageString") + Component getActionbar(); + + @Intrinsic + @Accessor("titleTime") + int getTime(); + + @Intrinsic + @Accessor("overlayMessageTime") + int getActionbarTime(); +} diff --git a/common/src/main/resources/assets/figura/lang/en_us.json b/common/src/main/resources/assets/figura/lang/en_us.json index 5d6f42990..a71cc0d14 100644 --- a/common/src/main/resources/assets/figura/lang/en_us.json +++ b/common/src/main/resources/assets/figura/lang/en_us.json @@ -926,6 +926,9 @@ "figura.docs.client.get_server_data": "Returns a table with information on the currently connected server (also for singleplayer worlds)", "figura.docs.client.get_date": "Returns a table with information about the client's current time", "figura.docs.client.get_frame_time": "Returns the current fraction between the last tick and the next tick\nThis is the value used as \"delta\" in the RENDER event", + "figura.docs.client.get_actionbar": "Returns the current actionbar text, or nil if the action bar isn't visible", + "figura.docs.client.get_title": "Returns the current title text, or nil if the title isn't visible", + "figura.docs.client.get_subtitle": "Returns the current subtitle text, or nil if the title or subtitle isn't visible", "figura.docs.client.list_atlases": "Returns a list of all registered atlases paths", "figura.docs.client.get_atlas": "Returns a TextureAtlasAPI object with information about the given atlas\nReturns nil if the atlas was not found", "figura.docs.client.get_tab_list": "Returns a table with the text shown in the tablist", diff --git a/common/src/main/resources/figura-common.mixins.json b/common/src/main/resources/figura-common.mixins.json index bbca59497..8c5372249 100644 --- a/common/src/main/resources/figura-common.mixins.json +++ b/common/src/main/resources/figura-common.mixins.json @@ -28,6 +28,7 @@ "gui.ChatScreenMixin", "gui.ClickEventActionMixin", "gui.DebugScreenOverlayMixin", + "gui.GuiAccessor", "gui.GuiMessageLineMixin", "gui.GuiMessageMixin", "gui.GuiMixin", @@ -71,7 +72,6 @@ "render.layers.items.ItemInHandLayerMixin", "render.layers.items.PlayerItemInHandLayerMixin", "render.renderers.ArrowRendererMixin", - "render.renderers.TridentRendererMixin", "render.renderers.BlockEntityWithoutLevelRendererMixin", "render.renderers.EntityRendererMixin", "render.renderers.HandRenderSelectionAccessor", @@ -83,6 +83,7 @@ "render.renderers.SignRendererMixin", "render.renderers.SimpleVCMixin", "render.renderers.SkullBlockRendererMixin", + "render.renderers.TridentRendererMixin", "sound.ChannelHandleMixin", "sound.SoundEngineMixin", "sound.SoundManagerAccessor", From 6f5b4f3dbb62d4a84c54398d03eb9efd04ee520c Mon Sep 17 00:00:00 2001 From: 4P5 Date: Sat, 13 Jan 2024 19:58:59 +1300 Subject: [PATCH 2/2] client.getScoreboard() - Added `client.getScoreboard` to get information about the currently visible scoreboard(s). --- .../figuramc/figura/lua/api/ClientAPI.java | 54 +++++++++++++++++++ .../resources/assets/figura/lang/en_us.json | 1 + 2 files changed, 55 insertions(+) diff --git a/common/src/main/java/org/figuramc/figura/lua/api/ClientAPI.java b/common/src/main/java/org/figuramc/figura/lua/api/ClientAPI.java index 5fbb39c7d..9d57b4b95 100644 --- a/common/src/main/java/org/figuramc/figura/lua/api/ClientAPI.java +++ b/common/src/main/java/org/figuramc/figura/lua/api/ClientAPI.java @@ -16,6 +16,10 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.repository.Pack; import net.minecraft.world.phys.Vec3; +import net.minecraft.world.scores.Objective; +import net.minecraft.world.scores.PlayerTeam; +import net.minecraft.world.scores.Score; +import net.minecraft.world.scores.Scoreboard; import org.figuramc.figura.FiguraMod; import org.figuramc.figura.lua.LuaNotNil; import org.figuramc.figura.lua.LuaWhitelist; @@ -560,6 +564,56 @@ public static Component getSubtitle() { return ((GuiAccessor) gui).getTime() > 0 ? ((GuiAccessor) gui).getSubtitle() : null; } + @LuaWhitelist + @LuaMethodDoc("client.get_scoreboard") + public static Map> getScoreboard() { + Map> map = new HashMap<>(); + + assert Minecraft.getInstance().level != null; + Scoreboard scoreboard = Minecraft.getInstance().level.getScoreboard(); + + Map objectives = new HashMap<>(); + + // sidebars for different team colours + assert Minecraft.getInstance().player != null; + PlayerTeam playerTeam = scoreboard.getPlayersTeam(Minecraft.getInstance().player.getScoreboardName()); + if (playerTeam != null) { + int id = playerTeam.getColor().getId(); + if (id >= 0) { + objectives.put("sidebar_team_" + playerTeam.getColor().getName(), scoreboard.getDisplayObjective(3 + id)); + } + } + + objectives.put("list", scoreboard.getDisplayObjective(0)); + objectives.put("sidebar", scoreboard.getDisplayObjective(1)); + objectives.put("below_name", scoreboard.getDisplayObjective(2)); + + for (Map.Entry entry : objectives.entrySet()) { + String key = entry.getKey(); + Objective objective = entry.getValue(); + + if (objective != null) { + Map objectiveMap = new HashMap<>(); + + objectiveMap.put("name", objective.getName()); + objectiveMap.put("display_name", objective.getFormattedDisplayName()); + objectiveMap.put("criteria", objective.getCriteria().getName()); + objectiveMap.put("render_type", objective.getRenderType().getSerializedName()); + + Map scoreMap = new HashMap<>(); + for (Score score : scoreboard.getPlayerScores(objective)) { + scoreMap.put(score.getOwner(), score.getScore()); + } + + objectiveMap.put("scores", scoreMap); + + map.put(key, objectiveMap); + } + } + + return map; + } + @LuaWhitelist @LuaMethodDoc("client.list_atlases") public static List listAtlases() { diff --git a/common/src/main/resources/assets/figura/lang/en_us.json b/common/src/main/resources/assets/figura/lang/en_us.json index a71cc0d14..fa7a9c184 100644 --- a/common/src/main/resources/assets/figura/lang/en_us.json +++ b/common/src/main/resources/assets/figura/lang/en_us.json @@ -929,6 +929,7 @@ "figura.docs.client.get_actionbar": "Returns the current actionbar text, or nil if the action bar isn't visible", "figura.docs.client.get_title": "Returns the current title text, or nil if the title isn't visible", "figura.docs.client.get_subtitle": "Returns the current subtitle text, or nil if the title or subtitle isn't visible", + "figura.docs.client.get_scoreboard": "Returns data about the current scoreboard(s). Multiple scoreboards can be visible at the same time (sidebar, team sidebar, list, and below name), so each scoreboard is grouped by its display location", "figura.docs.client.list_atlases": "Returns a list of all registered atlases paths", "figura.docs.client.get_atlas": "Returns a TextureAtlasAPI object with information about the given atlas\nReturns nil if the atlas was not found", "figura.docs.client.get_tab_list": "Returns a table with the text shown in the tablist",