Advertisement
TnKnight

Minecraft - Hex Color

Mar 28th, 2022
1,424
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.14 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5.  
  6. import org.bukkit.event.EventHandler;
  7. import org.bukkit.event.Listener;
  8.  
  9. import io.papermc.paper.event.player.AsyncChatEvent;
  10. import net.kyori.adventure.text.Component;
  11. import net.kyori.adventure.text.format.TextColor;
  12. import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
  13.  
  14. public class EventListener implements Listener
  15. {
  16.  
  17.     @EventHandler
  18.     public void onPlayerChat( AsyncChatEvent event ) {
  19.  
  20.         // Lấy tin nhắn của người chơi
  21.         Component message = event.message();
  22.  
  23.         // Chuyển tin nhắn về đoạn ký tự
  24.         String msg = PlainTextComponentSerializer.plainText().serialize(message);
  25.  
  26.         // Gửi tin nhắn đã qua chỉnh sửa lên khung chat
  27.         event.message(hexConverter(msg));
  28.     }
  29.  
  30.     // Khai báo cấu trúc của mã HEX
  31.     final Pattern HEX_PATTERN = Pattern.compile("#[a-fA-F0-9]{6}");
  32.  
  33.     /*
  34.      * Dò mã HEX
  35.      * tách mã
  36.      * xóa mã
  37.      * tạo component
  38.      * thêm màu
  39.      * trả kết quả
  40.      */
  41.     private Component hexConverter( String a ) {
  42.         // Nếu không tìm thấy đoạn mã HEX thì trả về.
  43.         if ( !HEX_PATTERN.matcher(a).find() ) { return Component.text(a); }
  44.        
  45.         //Khai báo danh sách điểm bắt đầu của mã HEX
  46.         List<Integer> ints = new ArrayList<>();
  47.         Matcher matcher = HEX_PATTERN.matcher(a);
  48.         // Tìm và thêm vào các điểm bắt đầu
  49.         while ( matcher.find() ) { ints.add(matcher.start()); }
  50.        
  51.         // Khai báo danh sách chưa các đoạn ký tự được tách ra
  52.         List<String> list = new ArrayList<>();
  53.                
  54.         for ( int i = 0 ; i < ints.size() ; i++ ) {
  55.  
  56.             // Lấy điểm bắt đầu và kết thúc
  57.             int start = ints.get(i), end = a.length();
  58.  
  59.             /*
  60.              * Nếu là điểm đầu tiên nhưng lớn hơn 0
  61.              * thì thêm đoạn đằng trước vào danh sách
  62.              * các đoạn ký tự
  63.              *
  64.              */
  65.             if ( i == 0 & start > 0 )
  66.                 list.add(a.substring(0, start));
  67.  
  68.             /*
  69.              * Nếu điểm tiếp theo không phải là điểm cuối
  70.              * thì lấy điểm tiếp theo làm điểm cuối
  71.              *
  72.              */
  73.             if ( i < ints.size() - 1 )
  74.                 end = ints.get(i + 1);
  75.  
  76.             // Thêm đoạn ký tự vào danh sách
  77.             list.add(a.substring(start, end));
  78.         }
  79.         // Tạo biến cho builder (để gộp nhiều component lại)
  80.         var builder = Component.text();
  81.  
  82.         // Đi qua các giá trị trong danh sách trên
  83.         for ( String str : list ) {
  84.  
  85.             Matcher m = HEX_PATTERN.matcher(str);
  86.            
  87.             // Khai báo màu mặc định
  88.             String color = "#FFFFFF";
  89.            
  90.             // Kiểm tra nếu đoạn ký tự có tồn tại mã HEX
  91.             while ( m.find() ) {
  92.                
  93.                 // Đặt màu thành mã HEX
  94.                 color = str.substring(m.start(), m.end());
  95.                
  96.                 // Xóa mã HEX ra khỏi đoạn ký tự
  97.                 str = str.replace(color, "");
  98.             }
  99.            
  100.             // Tạo component cho đoạn ký tự
  101.             Component comp = Component.text(str);
  102.            
  103.             // Thêm màu vào component
  104.             comp = comp.color(TextColor.fromHexString(color));
  105.  
  106.             builder.append(comp);
  107.         }
  108.  
  109.         // Trả về
  110.         return builder.build();
  111.     }
  112.  
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement