1919
2020package me .zetastormy .akropolis .util .text ;
2121
22+ import java .util .Stack ;
23+
2224import org .bukkit .Bukkit ;
2325import org .bukkit .ChatColor ;
2426import org .bukkit .Location ;
2830import me .clip .placeholderapi .PlaceholderAPI ;
2931import me .zetastormy .akropolis .AkropolisPlugin ;
3032import me .zetastormy .akropolis .module .modules .world .SongPlayerManager ;
33+ import net .kyori .adventure .audience .Audience ;
3134import net .kyori .adventure .text .Component ;
3235import net .kyori .adventure .text .minimessage .tag .Tag ;
3336import net .kyori .adventure .text .minimessage .tag .resolver .TagResolver ;
@@ -41,30 +44,6 @@ private PlaceholderUtil() {
4144 throw new UnsupportedOperationException ();
4245 }
4346
44- public static Component setPlaceholders (String rawText , Player player ) {
45- String text = rawText ;
46-
47- text = text .replace ("<online>" , String .valueOf (Bukkit .getOnlinePlayers ().size ()))
48- .replace ("<online_max>" , String .valueOf (Bukkit .getMaxPlayers ()))
49- .replace ("<current_song>" , getCurrentSong ());
50-
51- if (player != null ) {
52- text = text .replace ("<player>" , player .getName ())
53- .replace ("<ping>" , String .valueOf (player .getPing ()))
54- .replace ("<world>" , player .getWorld ().getName ())
55- .replace ("<location>" , formatLocation (player .getLocation ()));
56-
57- return TextUtil .parse (
58- text ,
59- player ,
60- (papi ) ? papiTag (player ) : TagResolver .empty (),
61- (miniplaceholders ) ? MiniPlaceholders .audienceGlobalPlaceholders () : TagResolver .empty ()
62- );
63- }
64-
65- return TextUtil .parse (text );
66- }
67-
6847 private static String formatLocation (Location loc ) {
6948 return loc .getBlockX () + ", " + loc .getBlockY () + ", " + loc .getBlockZ ();
7049 }
@@ -74,6 +53,44 @@ private static String getCurrentSong() {
7453 return songPlayerManager != null ? songPlayerManager .getCurrentSong () : "None" ;
7554 }
7655
56+ /**
57+ * Pushes a tag resolver onto the stack that inserts (self-closing) the given component for the given name.
58+ * @param tagResolvers the mutable stack of tag resolvers
59+ * @param name the name of the tag to resolve (e.g. "player", "ping", etc.)
60+ * @param component the component to insert when the tag is resolved
61+ */
62+ private static void pushTagResolver (final Stack <TagResolver > tagResolvers , final String name , final Component component ) {
63+ tagResolvers .push (TagResolver .resolver (name , (argumentQueue , context )
64+ -> Tag .selfClosingInserting (component )));
65+ }
66+
67+ public static Component setPlaceholders (String rawText , Audience audience ) {
68+ final Stack <TagResolver > tagResolvers = new Stack <>();
69+
70+ pushTagResolver (tagResolvers , "online" , Component .text (Bukkit .getOnlinePlayers ().size ()));
71+ pushTagResolver (tagResolvers , "online_max" , Component .text (Bukkit .getMaxPlayers ()));
72+ pushTagResolver (tagResolvers , "current_song" , Component .text (getCurrentSong ()));
73+
74+ if ((audience instanceof Player player )) {
75+ pushTagResolver (tagResolvers , "player" , Component .text (player .getName ()));
76+ pushTagResolver (tagResolvers , "ping" , Component .text (player .getPing ()));
77+ pushTagResolver (tagResolvers , "world" , Component .text (player .getWorld ().getName ()));
78+ pushTagResolver (tagResolvers , "location" , Component .text (formatLocation (player .getLocation ())));
79+
80+ if (papi ) {
81+ tagResolvers .push (papiTag (player ));
82+ }
83+
84+ if (miniplaceholders ) {
85+ tagResolvers .push (MiniPlaceholders .audienceGlobalPlaceholders ());
86+
87+ return TextUtil .parse (rawText , audience , TagResolver .resolver (tagResolvers ));
88+ }
89+ }
90+
91+ return TextUtil .parse (rawText , TagResolver .resolver (tagResolvers ));
92+ }
93+
7794 @ SuppressWarnings ("deprecation" )
7895 public static TagResolver papiTag (Player player ) {
7996 return TagResolver .resolver ("papi" , (argumentQueue , context ) -> {
0 commit comments