允许使用[1-41]标签来展示玩家背包内指定标号的格子内的物品

This commit is contained in:
2024-12-26 04:42:10 +08:00
parent a318136ab5
commit 380f633132
2 changed files with 74 additions and 5 deletions

View File

@@ -10,29 +10,94 @@ import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.inventory.ItemStack;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/// 增强聊天信息
public class ChatEnhancement implements Listener {
private static final Pattern pattern = Pattern.compile("\\[item\\]|\\[(\\d{1,2})\\]");
protected static BaseComponent getComponent(HashMap<Integer, BaseComponent> map, Player player, int n) {
if (map.containsKey(n)) {
return map.get(n);
}
if (n < 0 || n > 41) {
return null;
}
if (n == 0) {
ItemStack mainHandItem = player.getInventory().getItemInMainHand();
if (mainHandItem.getType() == Material.AIR)
return null;
map.put(0, CoordinateRecorder.getItemShowService().addItem(mainHandItem));
return map.get(0);
}
ItemStack item = player.getInventory().getItem(n - 1);
if (item == null || item.getType() == Material.AIR)
return null;
map.put(n, CoordinateRecorder.getItemShowService().addItem(item));
return map.get(n);
}
@EventHandler
public void onPlayerChat(AsyncPlayerChatEvent event) {
Player player = event.getPlayer();
String message = event.getMessage();
if (!message.contains("[item]"))
return;
ItemStack mainHandItem = player.getInventory().getItemInMainHand();
if (mainHandItem.getType() == Material.AIR)
return;
BaseComponent item = CoordinateRecorder.getItemShowService().addItem(mainHandItem);
//BaseComponent item = CoordinateRecorder.getItemShowService().addItem(mainHandItem);
String[] parts = message.split("\\[item\\]", -1);
HashMap<Integer, BaseComponent> hashMap = new HashMap<>();
// 输出消息
TextComponent finalMessage = new TextComponent("<" + player.getName() + "> ");
Matcher matcher = pattern.matcher(message);
// 记录上一个匹配项的结束位置
int lastMatchEnd = 0;
while (matcher.find()) {
// 获取当前匹配项之前的子串(上一个匹配项之后到当前匹配项之前的部分)
String substringBeforeCurrentTag = message.substring(lastMatchEnd, matcher.start());
lastMatchEnd = matcher.end();
finalMessage.addExtra(substringBeforeCurrentTag);
//主手
if (matcher.group(0).equals("[item]")) {
BaseComponent component = getComponent(hashMap, player, 0);
if (component != null)
finalMessage.addExtra(component);
else
finalMessage.addExtra(matcher.group(0));
} else {
//指定格子
try {
int index = Integer.parseInt(matcher.group(1));
BaseComponent component = getComponent(hashMap, player, index);
if (component != null)
finalMessage.addExtra(component);
else
finalMessage.addExtra(matcher.group(0));
} catch (NumberFormatException e) {
finalMessage.addExtra(matcher.group(0));
}
}
}
if (lastMatchEnd < message.length()) {
String remainingText = message.substring(lastMatchEnd);
finalMessage.addExtra(remainingText);
}
/*
String[] parts = message.split("\\[item\\]", -1);
for (int i = 0; i < parts.length; i++) {
finalMessage.addExtra(new TextComponent(parts[i]));
if (i < parts.length - 1) {
finalMessage.addExtra(item);
}
}
}*/
for (Player recipient : event.getRecipients()) {
recipient.spigot().sendMessage(finalMessage);

View File

@@ -46,6 +46,7 @@ public class ItemShowService implements Service {
lockFlag.set(false);
}
@SuppressWarnings("ExtractMethodRecommender")
public BaseComponent addItem(ItemStack item) {
assert item.getItemMeta() != null;
lock();
@@ -59,6 +60,9 @@ public class ItemShowService implements Service {
}
BaseComponent message = new TextComponent("[");
message.addExtra(itemName);
if (item.getAmount() > 1) {
message.addExtra("*" + item.getAmount());
}
message.addExtra("]");
message.setColor(ChatColor.YELLOW);
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text("点击查看物品详情")));