Bukkit / Spigot HeroChat 5:格式字符串中的自定义替换

时间:2016-06-09 14:46:02

标签: java minecraft bukkit custom-formatting

这已经让我有一段时间没有找到......

HeroChat在其config.yml文件中有一个名为format:的部分,您可以在其中找到默认格式字符串。这在每个通道的配置中得到了回应。这是我的样子......

format:
  default: '{color}[{nick}]{title} {groupprefix}&f{sender}: {color}{msg}'

{color}表示该频道的配置中定义的颜色 {nick}代表频道的“昵称”
{title}是自定义格式字符串
{groupprefix}是分配给玩家保险库组的前缀 {sender}是发送消息的播放器的显示名称(或昵称)。 {msg}是他们在完成内置审查后输入控制台的消息。

那么,你如何得到{title}或者你的自定义字符串要改变什么?正如我上面所说,这是我长时间无法弄清楚的事情。但是,做了一些研究,我已经弄明白了,实际上并不那么困难。我将此作为Java开发人员遇到同样问题的资源留在这里。

1 个答案:

答案 0 :(得分:0)

我将在下面留下一步一步的解决方案。本教程假设您熟悉所选的IDE,并且可以检索特定于播放器或特定于组的替换字符串......

  1. 将HeroChat.jar加载到您的环境中。
  2. 创建并注册一个新的PlayerListener。
  3. 添加以下导入:
    • import org.bukkit.entity.Player;
    • import org.bukkit.event.EventHandler;
    • import org.bukkit.event.Listener;
    • import org.bukkit.event.player.PlayerJoinEvent;
    • import com.dthielke.herochat.ChannelChatEvent;
    • import com.dthielke.herochat.ChannelManager;
    • import com.dthielke.herochat.Herochat;
  4. 添加以下事件:
  5. @EventHandler
    public void onPlayerChat(ChannelChatEvent event) {
        ChannelManager cm = Herochat.getChannelManager();
        String newFormat;
        Player player = event.getSender().getPlayer();
        String chatReplacement = plugin.classWithReplacer.replacer(player);
    
        // Simple replacement here. If it is equal to "", let it replace as
        // normal. If it actually has a value, surround it with brackets.
        if (!chatTitle.equalsIgnoreCase("")) {
            chatTitle = "[" + chatTitle + "]";
        }
    
        // When the channel being spoken in uses the default format,
        // asking it for the format returns "{format}"
        //
        // We do not need to escape the brackets because
        // String.equalsIgnoreCase does not use regex.
        if (event.getFormat().equalsIgnoreCase("{default}")) {
            // cm.getStandardFormat() returns the format provided in config.yml
            newFormat = cm.getStandardFormat();
    
            // IMPORTANT!! You MUST escape the curly brackets or your plugin WILL throw regex errors!
            // We escape with two backslashes because the java parser takes one away, resulting in \{ and \} respectively.
            // Then, the regex parser comes in and converts \{ into a safe {, and \} into a safe }
            // "your_replacement_here" should be whatever your custom tag is within the config.yml or the channel's config file.
            // In my case, this was {title}.
            // Note: the square brackets can be added to your config file, but I chose to add them here to avoid empty brackets
            // when the player did not have a title.
            newFormat = newFormat.replaceAll("\\{your_replacement_here\\}", chatReplacement);
        } else {
            // event.getFormat() returns the current channel's format or "{default}"
            newFormat = event.getFormat();
            newFormat = newFormat.replaceAll("\\{your_replacement_here\\}", chatReplacement);
        }
    
        // This method performs a "one-time" change to the default format.
        // Because you are providing the same format as the original, only
        // contextually modified for the player or player's group, the chat
        // output will still be determined by the global or channel config
        event.setFormat(newFormat);
    }
    

    这是完整的(虽然没有注释)版本

    package your.package.here;
    
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerJoinEvent;
    
    import com.dthielke.herochat.ChannelChatEvent;
    import com.dthielke.herochat.ChannelManager;
    import com.dthielke.herochat.Herochat;
    import your.package.here.MyPlugin;
    
    public class MyPluginPlayerListener implements Listener {
    
        private MyPlugin plugin;
    
        public MyPluginPlayerListener(MyPlugin plugin) {
            this.plugin = plugin;
        }
    
        @EventHandler
        public void onPlayerChat(ChannelChatEvent event) {
            ChannelManager cm = Herochat.getChannelManager();
            String newFormat;
            Player player = event.getSender().getPlayer();
            String chatTitle = plugin.titlesConfig.getTitle(player);
    
            if (!chatTitle.equalsIgnoreCase("")) {
                chatTitle = "[" + chatTitle + "]";
            }
            if (event.getFormat().equalsIgnoreCase("{default}")) {
                newFormat = cm.getStandardFormat();
                newFormat = newFormat.replaceAll("\\{title\\}", chatTitle");
            } else {
                newFormat = event.getFormat();
                newFormat = newFormat.replaceAll("\\{title\\", chatTitle");
            }
    
            event.setFormat(newFormat);
        }
    }