11package ch .njol .skript .effects ;
22
3- import java .util .ArrayList ;
4- import java .util .Collections ;
5- import java .util .HashSet ;
6- import java .util .List ;
7- import java .util .Set ;
8- import java .util .regex .Pattern ;
9-
103import ch .njol .skript .Skript ;
114import ch .njol .skript .doc .Description ;
125import ch .njol .skript .doc .Examples ;
2417import ch .njol .skript .util .Utils ;
2518import ch .njol .skript .util .chat .BungeeConverter ;
2619import ch .njol .skript .util .chat .ChatMessages ;
20+ import ch .njol .skript .util .chat .MessageComponent ;
2721import ch .njol .util .Kleenean ;
2822import ch .njol .util .StringUtils ;
2923import ch .njol .util .coll .CollectionUtils ;
3529import org .bukkit .event .server .BroadcastMessageEvent ;
3630import org .jetbrains .annotations .Nullable ;
3731
32+ import java .util .*;
33+ import java .util .regex .Pattern ;
34+
3835@ Name ("Broadcast" )
3936@ Description ("Broadcasts a message to the server." )
4037@ Examples ({
@@ -83,12 +80,15 @@ public void execute(Event event) {
8380 }
8481
8582 for (Expression <?> message : getMessages ()) {
86- if (message instanceof VariableString ) {
87- if (!dispatchEvent (getRawString (event , (VariableString ) message ), receivers ))
83+ if (message instanceof VariableString variableString ) {
84+ // get both unformatted and components with single evaluation: https://github.com/SkriptLang/Skript/issues/7718
85+ StringBuilder unformattedString = new StringBuilder ();
86+ List <MessageComponent > messageComponents = variableString .getMessageComponents (event , unformattedString );
87+ if (!dispatchEvent (unformattedString .toString (), receivers ))
8888 continue ;
89- BaseComponent [] components = BungeeConverter .convert ((( VariableString ) message ). getMessageComponents ( event ) );
89+ BaseComponent [] components = BungeeConverter .convert (messageComponents );
9090 receivers .forEach (receiver -> receiver .spigot ().sendMessage (components ));
91- } else if (message instanceof ExprColoured && (( ExprColoured ) message ) .isUnsafeFormat ()) { // Manually marked as trusted
91+ } else if (message instanceof ExprColoured coloured && coloured .isUnsafeFormat ()) { // Manually marked as trusted
9292 for (Object realMessage : message .getArray (event )) {
9393 if (!dispatchEvent (Utils .replaceChatStyles ((String ) realMessage ), receivers ))
9494 continue ;
@@ -97,7 +97,7 @@ public void execute(Event event) {
9797 }
9898 } else {
9999 for (Object messageObject : message .getArray (event )) {
100- String realMessage = messageObject instanceof String ? ( String ) messageObject : Classes .toString (messageObject );
100+ String realMessage = messageObject instanceof String string ? string : Classes .toString (messageObject );
101101 if (!dispatchEvent (Utils .replaceChatStyles (realMessage ), receivers ))
102102 continue ;
103103 receivers .forEach (receiver -> receiver .sendMessage (realMessage ));
@@ -123,9 +123,9 @@ private Expression<?>[] getMessages() {
123123 * @param message the message
124124 * @return true if the dispatched event does not get cancelled
125125 */
126- @ SuppressWarnings ("deprecation " )
126+ @ SuppressWarnings ("removal " )
127127 private static boolean dispatchEvent (String message , List <CommandSender > receivers ) {
128- Set <CommandSender > recipients = Collections . unmodifiableSet ( new HashSet <>( receivers ) );
128+ Set <CommandSender > recipients = Set . copyOf ( receivers );
129129 BroadcastMessageEvent broadcastEvent ;
130130 if (Skript .isRunningMinecraft (1 , 14 )) {
131131 broadcastEvent = new BroadcastMessageEvent (!Bukkit .isPrimaryThread (), message , recipients );
@@ -136,11 +136,18 @@ private static boolean dispatchEvent(String message, List<CommandSender> receive
136136 return !broadcastEvent .isCancelled ();
137137 }
138138
139- @ Nullable
140- private static String getRawString (Event event , Expression <? extends String > string ) {
141- if (string instanceof VariableString )
142- return ((VariableString ) string ).toUnformattedString (event );
139+ /**
140+ * Gets the raw string from the expression, replacing colour codes.
141+ * @param event the event
142+ * @param string the expression
143+ * @return the raw string
144+ */
145+ private static @ Nullable String getRawString (Event event , Expression <? extends String > string ) {
146+ if (string instanceof VariableString variableString )
147+ return variableString .toUnformattedString (event );
143148 String rawString = string .getSingle (event );
149+ if (rawString == null )
150+ return null ;
144151 rawString = SkriptColor .replaceColorChar (rawString );
145152 if (rawString .toLowerCase ().contains ("&x" )) {
146153 rawString = StringUtils .replaceAll (rawString , HEX_PATTERN , matchResult ->
0 commit comments