Идея Плагин на отключение чата в мирах.

TheChris

Активный участник
Баллы
48
Имя в Minecraft
ChrisDM
Всем доброго времени суток!Я бы хотел предложить разработать такой плагин,что бы в указанных мирах отключался чат.Ну он должен поддерживать плагин MultiWorld.
Надеюсь что какой-то хороший человек рассмотрит моё предложение.
 
Как-то так: https://www.dropbox.com/s/2fn64mg925cn3u8/SilentWorlds.jar

Пример конфига.
Код:
worlds:
  no-chat:
  - world_nether
player-name-mask: '&6%player>%&e'

Пара моментов.
  1. Полностью отключить сообщения в чате нельзя. Буду сообщения от плагинов и т.п.
  2. Игроки с пермишеном "silentworlds.chat" могут писать где угодно. И их сообщения видны везде
  3. Поскольку, рассылка происходит "нестандартным" способом, то для вывода имени игрока используется предопределенная маска. Поскольку никогда до этого не писал плагины для чата, то не знаю будет ли Player.getDisplayName возвращать всякие уникальные префиксы в имени, цвета и т.п.

Код:
package me.fromgate.silentworlds;

import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class SilentWorlds extends JavaPlugin implements Listener{
    String playerMask;
    List<String> worldsWithoutChat = new ArrayList<String>();
    @Override
    public void onEnable(){
        loadCfg();
        saveCfg();
    }
    private void loadCfg(){
        playerMask = getConfig().getString("player-name-mask","&6%player>%&e");
        worldsWithoutChat = getConfig().getStringList("worlds.no-chat");
    }
    private void saveCfg(){
        getConfig().set("player-name-mask",playerMask);
        getServer().getPluginManager().registerEvents(this, this);
        getConfig().set("worlds.no-chat", worldsWithoutChat);
        saveConfig();
    }
    private void sendMessageInWorld (Player sender, String msg){
        if (worldsWithoutChat.contains(sender.getWorld().getName())||(!sender.hasPermission("silentworlds.chat"))) return;
        for (Player player : Bukkit.getOnlinePlayers()){
            if (worldsWithoutChat.contains(player.getWorld().getName())||(!sender.hasPermission("silentworlds.chat"))) continue;
            player.sendMessage(ChatColor.translateAlternateColorCodes('&', playerMask.replace("%player%", sender.getDisplayName()))+" "+msg);
        }
    }
    @EventHandler(priority=EventPriority.HIGHEST, ignoreCancelled = true)
    public void onChat(AsyncPlayerChatEvent event){
        sendMessageInWorld(event.getPlayer(),event.getMessage());
        event.setCancelled(true);
    }
}
 
Как-то так: https://www.dropbox.com/s/2fn64mg925cn3u8/SilentWorlds.jar

Пример конфига.
Код:
worlds:
  no-chat:
  - world_nether
player-name-mask: '&6%player>%&e'

Пара моментов.
  1. Полностью отключить сообщения в чате нельзя. Буду сообщения от плагинов и т.п.
  2. Игроки с пермишеном "silentworlds.chat" могут писать где угодно. И их сообщения видны везде
  3. Поскольку, рассылка происходит "нестандартным" способом, то для вывода имени игрока используется предопределенная маска. Поскольку никогда до этого не писал плагины для чата, то не знаю будет ли Player.getDisplayName возвращать всякие уникальные префиксы в имени, цвета и т.п.

Код:
package me.fromgate.silentworlds;

import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class SilentWorlds extends JavaPlugin implements Listener{
    String playerMask;
    List<String> worldsWithoutChat = new ArrayList<String>();
    @Override
    public void onEnable(){
        loadCfg();
        saveCfg();
    }
    private void loadCfg(){
        playerMask = getConfig().getString("player-name-mask","&6%player>%&e");
        worldsWithoutChat = getConfig().getStringList("worlds.no-chat");
    }
    private void saveCfg(){
        getConfig().set("player-name-mask",playerMask);
        getServer().getPluginManager().registerEvents(this, this);
        getConfig().set("worlds.no-chat", worldsWithoutChat);
        saveConfig();
    }
    private void sendMessageInWorld (Player sender, String msg){
        if (worldsWithoutChat.contains(sender.getWorld().getName())||(!sender.hasPermission("silentworlds.chat"))) return;
        for (Player player : Bukkit.getOnlinePlayers()){
            if (worldsWithoutChat.contains(player.getWorld().getName())||(!sender.hasPermission("silentworlds.chat"))) continue;
            player.sendMessage(ChatColor.translateAlternateColorCodes('&', playerMask.replace("%player%", sender.getDisplayName()))+" "+msg);
        }
    }
    @EventHandler(priority=EventPriority.HIGHEST, ignoreCancelled = true)
    public void onChat(AsyncPlayerChatEvent event){
        sendMessageInWorld(event.getPlayer(),event.getMessage());
        event.setCancelled(true);
    }
}
Ну спасибо :)
По скольку я только начинаю учить Java, то мне может это пригодиться.
 
fromgate, отличная работа! Но действительно существует нюанс: префиксы не будут поддерживаться с других плагинов
 
Последнее редактирование:
JustBlender, если плагин знает о существовании метода Player.setDisplayName, то всё должно быть ок ;)
 
Назад
Верх