1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите NullPointerException в плагине

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

  1. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    На мой взгляд, все же лучший вариант PlayerMoveEvent. Можно использовать шедулер, но тогда точность заметно уменьшится.
    Не уверен, как лучше искать ловушку - сравнивать строки, или всё-же проверять координаты всех ловушек с локацией игрока, так что об этом напишет кто-нибудь другой - я лишь начинающий погромист. Если решать в лоб, то я бы ловушку перенёс в отдельный объект
    PHP:
    public class TrapThing {
        private 
    UUID player;
        private 
    int level;
        private 
    boolean active;
       
        public 
    TrapThing(UUID playerint levelboolean active) {
            
    this.player=player;
            
    this.level=level;
            
    this.active=active;
        }
        public 
    TrapThing(String coordsConfigurationSection section) {
            
    this.player=UUID.fromString(section.getString(coords+".player"));
            
    this.level=section.getInt(coords+".level");
            
    this.active=section.getBoolean(coords+".active");
        }
       
        public 
    void setPlayer(UUID player) {
            
    this.player=player;
        }
       
        public 
    void setLevel(int level) {
            
    this.level=level;
        }
       
        public 
    void setActive(boolean active) {
            
    this.active=active;
        }
       
        public 
    UUID getPlayer() {
            return 
    player;
        }
        public 
    int getLevel() {
            return 
    level;
        }
        public 
    boolean isActive() {
            return 
    active;
        }
    }
    И хранил бы это дело в мапе Координаты,Ловушка
    PHP:
        private Map<String,TrapThingtraps;
        private 
    Trap plugin;

        public 
    TrapSet(Trap plugin) {
            
    this.plugin=plugin;
            
    loadTraps();
        }

        public 
    void loadTraps() {
            
    traps=new HashMap<>();
            
    ConfigurationSection section=plugin.config.get("blocks");
            for (
    String coord:section.getKeys(false)) {
                
    traps.put(coord, new TrapThing(coord,section));
            }
        }

        @
    EventHandler
        
    public void rightClickTrap(PlayerInteractEvent e) {
            
    Action act=e.getAction();
            if(!(
    act==Action.RIGHT_CLICK_AIR||act==Action.RIGHT_CLICK_BLOCK)) return;
            
    Player pl=e.getPlayer();
            if(!
    pl.hasPermission("trap.set")) return;
            
    ItemStack item=e.getItem();
            if(
    is==null||is.getType()!=Material.STICK) return;
            
    ItemMeta meta=is.getItemMeta();
            if(!
    meta.hasDisplayName()||!meta.getDisplayName().equals("§cЛовушка")) return;
            
    Location loc=pl.getLocation();
            
    String coord=locationToDLF(loc);
            
    plugin.config.set("blocks." coord ".player"p.getUniqueId());
            
    plugin.config.set("blocks." coord ".level"1);
            
    plugin.config.set("blocks." coord ".active"true);
            
    traps.put(coord,new TrapThing(p.getUniqueId(), 1true));
            
    p.sendTitle(ChatColor.AQUA "Ловушка установлена"""202020);
            
    p.getWorld().spigot().playEffect(locEffect.CLOUD000.3f0f0.3f0.5f1003);
            
    p.sendMessage(ChatColor.AQUA "Вы установили ловушку [" loc.getBlockX() + ", " loc.getBlockY() + ", " loc.getBlockZ() + "]");
        }
       
        @
    EventHandler
        
    public void onPlayerMove(PlayerMoveEvent e) {
            
    Location from e.getFrom();
            
    Location to e.getTo();
           
            
    // Чтобы лишний раз не искать ловушку на одном и том же блоке
            
    if (to.getBlockX() == from.getBlockX()
                    && 
    to.getBlockY() == from.getBlockY()
                    && 
    to.getBlockZ() == from.getBlockZ()) return;
       
            
    TrapThing trap=getTrap(to);
            if(
    trap!=null&&trap.isActive()&&!trap.getPlayer().equals(e.getPlayer().getUniqueId()){
                
    // Игрок в ловушке
            
    }
        }
       
        public 
    String locationToDLF(Location loc) {
            return 
    loc.getBlockX() + "_" + (loc.getBlockY()-1) + "_" loc.getBlockZ();
        }
       
        public 
    TrapThing getTrap(Location loc) {
            return 
    traps.get(locationToDLF(loc));
        }
    Не знаю по поводу работоспособности кода - не проверял, потому, скорее всего, придется править. А ещё не помешала бы проверка на мир игрока.
     
  2. Автор темы
    _MCMaster_

    _MCMaster_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Ну и последний вопрос: как забрать у игрока предмет. Ну т.е., у него в руке палка "Ловушка", он кликает ПКМ, устанавливается ловушка, а палка пропадает
     
  3. DeethzzCoder

    DeethzzCoder Активный участник Пользователь

    Баллы:
    76
    Код:
    Player player = //Getting your player;
    player.getInventory().remove(player.getInventory().getItemInMainHand());
     
  4. Автор темы
    _MCMaster_

    _MCMaster_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Спасибо, пойду закончу плагин.
     
  5. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    setItemInMainHand уже не в моде?
     
  6. DeethzzCoder

    DeethzzCoder Активный участник Пользователь

    Баллы:
    76
    Господи, а я вообще забыл про него.
     
  7. Автор темы
    _MCMaster_

    _MCMaster_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Забирает весь стак... Надо чтобы 1 забирало
     
  8. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    В подобных простых ситуациях советую покопаться на JavaDoc'ах Spigot'а - там информации достаточно практически для всего, что нужно для базовых плагинов.
    PHP:
        if(item.getAmount()==1)
            
    item==null; else
            
    item.setAmount(item.getAmount()-1);
        if(
    e.getHand()==EquipmentSlot.HAND)
            
    pl.getInventory().setItemInMainHand(item); else
            
    pl.getInventory().setItemInOffHand(item);
     
    Последнее редактирование: 6 ноя 2018

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