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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Gate, 10 ноя 2012.

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

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

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

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

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

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

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

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

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

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

    Баллы:
    103
    Имя в Minecraft:
    Gate
    Блин, туплю я жестоко.
    Вот указал я
    Код:
    private Object nick;
    В первом событии я придаю переменной nick значение
    Код:
    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;
    }
    А во втором я просто использую эту переменную
    Код:
    public void onPlayerDeath(PlayerDeathEvent event) {
    event.setDeathMessage(ChatColor.RED + "" + nick + "совершил самоубийство.");
    }
    Ник - переменная которая должна содержать ник игрока. В итоге получается, что в чате вместо ник пишет null:(
     
  7. limito

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

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

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

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

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

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

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

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

    Баллы:
    103
    Имя в Minecraft:
    Gate
    Код:
    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 Старожил Пользователь

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

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

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

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

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

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

    Баллы:
    103
    Имя в Minecraft:
    Gate
    Код:
    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 Старожил Пользователь

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

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

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

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

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

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

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

    Вложения:

    • server.txt
      Размер файла:
      6,1 КБ
      Просмотров:
      5
    Greenberg и I-Am-Black-Overlord нравится это.
  19. limito

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

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

    Код:
    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 Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    Gate
    Вот мой код, все убраны вроде
    Код:
    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() + "совершил самоубийство.");
        }
     
    }
     
    Сникерсни нравится это.
  21. limito

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

    Баллы:
    103
    @EventHandler // Убрать
    publicboolean onCommand
     

Поделиться этой страницей