2016-06-09 8 views
0

Это было что-то, что ускользает от меня в течение некоторого времени ...Bukkit/Патрубок HeroChat 5: Выборочная замена в строке формата

HeroChat, в его файле config.yml, имеет раздел под названием format:, в соответствии с которым вы будете найдите строку формата по умолчанию. Это отражается в конфигурации для каждого канала. Это пример того, что мои выглядят ...

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

{color} представляет цвет, определенный в конфигурации этого канала
{nick} представляет канал «прозвище»
{title} является строкой пользовательского форматирования
{groupprefix} Является ли префикс, присвоенный группе Vault игрока.
{sender} - отображаемое имя (или ник) игрока, отправляющего сообщение. {msg} - это сообщение, которое они набрали в консоли, пройдя через встроенную цензуру.

Итак, как вы можете получить {title} или что бы изменить вашу пользовательскую строку? Как я сказал выше, это то, что я не мог понять в течение долгого времени. Но, делая некоторые исследования, я понял это, и на самом деле это не так сложно. Я оставляю это здесь как ресурс для разработчиков Java, работающих в одной и той же проблеме.

+0

Это был разнесен [Это патрубком форум резьбы] (HTTPS: //www.spigotmc.org/threads/bukkit-spigot-herochat-5-custom-replacement-in-format-string.154256/#post-1638156). –

ответ

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. Добавить следующее событие:
@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); 
    } 
}