Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

Помогите Установка сообщения о смерти игрока

Discussion in 'Разработка плагинов для новичков' started by Gate, Nov 10, 2012.

  1. Автор темы
    Gate

    Gate Старожил Пользователь

    Trophy Points:
    103
    Имя в Minecraft:
    Gate
    Напишите пожалуйста, как должно в моем случае получится, а то я что слоупочу...
    Класс KillerCommands, переменная target, события onCommand() и onPlayerDeath()
     
  2. Хостинг MineCraft
    <
  3. limito

    limito Старожил Пользователь

    Trophy Points:
    103
    В моем предыдущем сообщении написано то, что нужно только класс по-другому называется.
     
    Gate likes this.
  4. Автор темы
    Gate

    Gate Старожил Пользователь

    Trophy Points:
    103
    Имя в Minecraft:
    Gate
    Понял, спасибо. Просто не увидел сообщение)
     
  5. Автор темы
    Gate

    Gate Старожил Пользователь

    Trophy Points:
    103
    Имя в Minecraft:
    Gate
    Вообщем спасибо большое Вам то, что помогли и всё объяснили ;)
     
  6. Автор темы
    Gate

    Gate Старожил Пользователь

    Trophy Points:
    103
    Имя в Minecraft:
    Gate
    Блин, туплю я жестоко.
    Вот указал я
    Code:
    private Object nick;
    В первом событии я придаю переменной nick значение
    Code:
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    if(command.getName().equalsIgnoreCase("killer")){
    Player s = (Player)sender;
    s.setHealth(0);
    nick = s;}
    return true;
    }
    А во втором я просто использую эту переменную
    Code:
    public void onPlayerDeath(PlayerDeathEvent event) {
    event.setDeathMessage(ChatColor.RED + "" + nick + "совершил самоубийство.");
    }
    Ник - переменная которая должна содержать ник игрока. В итоге получается, что в чате вместо ник пишет null:(
     
  7. limito

    limito Старожил Пользователь

    Trophy Points:
    103
    Эти 2 метода в одном классе?

    Если да, то попробуйте следующее:
    2) Поменяйте Object на Player
    3) И вместо nick напишите nick.getName()
    4) После выполнения 2,3 должно выкидывать NullPointerException
    5) Попробуйте поставить в обоих методах synchronized (получится public synchronized void)
    6) Попробуйте поставить полю nick модификатор volatile
     
  8. Автор темы
    Gate

    Gate Старожил Пользователь

    Trophy Points:
    103
    Имя в Minecraft:
    Gate
    Да, эти события в 1 классе.
    Проделал все пункты. В итоге вообще сообщение о смерти не меняется (выдаёт стандартное Gate умер)
     
  9. limito

    limito Старожил Пользователь

    Trophy Points:
    103
    Можете полностью скинуть код класса?
     
  10. Автор темы
    Gate

    Gate Старожил Пользователь

    Trophy Points:
    103
    Имя в Minecraft:
    Gate
    Code:
    package KillerPackage;
     
    import java.util.logging.Logger;
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.PlayerDeathEvent;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.entity.Player;
     
    public class KillerCommands extends JavaPlugin implements Listener{
        public static final Logger _log = Logger.getLogger("Minecraft");
        private Player nick;
     
    @Override
    public void onEnable() {
        _log.info("[Killer] Enadled!"); //вывод произвольного текста в консоль сервера
        Bukkit.getPluginManager().registerEvents(this, this);
    }
     
    @EventHandler
    public synchronized boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if(command.getName().equalsIgnoreCase("killer")){
                Player s = (Player)sender;
                s.setHealth(0);
                nick = s;}
            return true;
        }
     
    @EventHandler
    public synchronized void onPlayerDeath(PlayerDeathEvent event) {
        event.setDeathMessage(ChatColor.RED + "" + nick.getName() + "совершил самоубийство.");
        }
     
     
     
     
     
     
     
    }
    Держите
     
  11. limito

    limito Старожил Пользователь

    Trophy Points:
    103
    Можете убирать syncronized.
    Code:
    Bukkit.getPluginManager().registerEvents(this, this);
    замените на
    Code:
    getServer().getPluginManager().registerEvents(this, this);
    И еще (не относится к ошибке) логгер лучше получать с помощью Bukkit, а не самостоятельно. Логгер, выданный баккитом, будет автоматически ставить имя плагина перед каждой строкой лога.
    Уберите присваивание
    Code:
    = Logger.getLogger("Minecraft");
    и в onLoad() напишите
    Code:
    _log = getLogger();
     
  12. Автор темы
    Gate

    Gate Старожил Пользователь

    Trophy Points:
    103
    Имя в Minecraft:
    Gate
    Убрал синхронизед, заменил Bukkit на getServer()
    Но опять же не меняется сообщение о смерти:why:
     
  13. limito

    limito Старожил Пользователь

    Trophy Points:
    103
    Баккит пишет в лог какую-нибудь ошибку?
     
  14. Автор темы
    Gate

    Gate Старожил Пользователь

    Trophy Points:
    103
    Имя в Minecraft:
    Gate
    Code:
    21:06:46 [SEVERE] java.lang.NullPointerException
    21:06:46 [SEVERE]      at net.minecraft.server.NetworkListenThread.a(NetworkLis
    tenThread.java:38)
    21:06:46 [SEVERE]      at net.minecraft.server.NetLoginHandler.a(NetLoginHandle
    r.java:160)
    21:06:46 [SEVERE]      at net.minecraft.server.Packet254GetInfo.handle(SourceFi
    le:16)
    21:06:46 [SEVERE]      at net.minecraft.server.NetworkManager.b(NetworkManager.
    java:246)
    21:06:46 [SEVERE]      at net.minecraft.server.NetLoginHandler.a(NetLoginHandle
    r.java:48)
    21:06:46 [SEVERE]      at net.minecraft.server.NetworkListenThread.a(NetworkLis
    tenThread.java:65)
    21:06:46 [SEVERE]      at net.minecraft.server.MinecraftServer.w(MinecraftServe
    r.java:567)
    21:06:46 [SEVERE]      at net.minecraft.server.MinecraftServer.run(MinecraftSer
    ver.java:459)
    21:06:46 [SEVERE]      at net.minecraft.server.ThreadServerApplication.run(Sour
    ceFile:492)
    Вот что выдаёт
     
  15. limito

    limito Старожил Пользователь

    Trophy Points:
    103
    А еще?
    Что-нибудь, связанное с плагином?
     
    RVXman likes this.
  16. Автор темы
    Gate

    Gate Старожил Пользователь

    Trophy Points:
    103
    Имя в Minecraft:
    Gate
    Я предыдущий пост исправил
     
  17. limito

    limito Старожил Пользователь

    Trophy Points:
    103
    Изменений не заметил. Прикрепите полный лог файлом.
     
  18. Автор темы
    Gate

    Gate Старожил Пользователь

    Trophy Points:
    103
    Имя в Minecraft:
    Gate
    Пожалуйста
     

    Attached Files:

  19. limito

    limito Старожил Пользователь

    Trophy Points:
    103
    Code:
    2012-11-10 21:22:06 [SEVERE] Could not pass event PlayerDeathEvent to Killer
    org.bukkit.event.EventException
    Проверьте, точно оба synchronized убраны?
    Так как у меня этот код на 1.3 работает.

    Code:
    import java.util.logging.Logger;
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.PlayerDeathEvent;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.entity.Player;
     
    public class KillerCommands extends JavaPlugin implements Listener{
        public static final Logger _log = Logger.getLogger("Minecraft");
        private Player nick;
     
        @Override
        public void onEnable() {
            _log.info("[Killer] Enadled!");
            getServer().getPluginManager().registerEvents(this, this);
        }
     
        @EventHandler
        public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
            if(command.getName().equalsIgnoreCase("killer")){
                Player s = (Player)sender;
                s.setHealth(0);
                nick = s;}
            return true;
        }
     
        @EventHandler
        public void onPlayerDeath(PlayerDeathEvent event) {
            event.setDeathMessage(ChatColor.RED + "" + nick.getName() + "совершил самоубийство.");
        }
    }
     
  20. Автор темы
    Gate

    Gate Старожил Пользователь

    Trophy Points:
    103
    Имя в Minecraft:
    Gate
    Вот мой код, все убраны вроде
    Code:
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.PlayerDeathEvent;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.entity.Player;
     
    public class KillerCommands extends JavaPlugin implements Listener{
        public static final Logger _log = Logger.getLogger("Minecraft");
        private Player nick;
     
     
    @Override
    public void onEnable() {
        _log.info("[Killer] Enadled!"); //вывод произвольного текста в консоль сервера
        getServer().getPluginManager().registerEvents(this, this);
       
    }
     
    @EventHandler
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if(command.getName().equalsIgnoreCase("killer")){
                Player s = (Player)sender;
                s.setHealth(0);
                nick = s;}
            return true;
        }
     
    @EventHandler
    public void onPlayerDeath(PlayerDeathEvent event) {
        event.setDeathMessage(ChatColor.RED + "" + nick.getName() + "совершил самоубийство.");
        }
     
    }
     
    Сникерсни likes this.
  21. limito

    limito Старожил Пользователь

    Trophy Points:
    103
    @EventHandler // Убрать
    publicboolean onCommand
     

Share This Page