Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

В разработке ItemStack выдать предмет с зачарованиями

Метки:
Теги Теги
java 8 spigot 1.16.5 плагины
Статус
Закрыто для дальнейших ответов.
а как мне тогда эту строку записпть

ItemStack item = p.getPlayer().getInventory();
 
Сервер выдает ошыбку null
вот код
ругается на эту строку
item.addEnchantment(Enchantment.LOOT_BONUS_BLOCKS, 10);


Код:
    @EventHandler
    public void onHitSnowBall(ProjectileHitEvent e) {
        if(e.getEntity().getShooter() instanceof Player) {
            Player p = (Player) e.getEntity().getShooter();
            Player t = (Player) e.getHitEntity();
            ItemStack item = p.getPlayer().getInventory().getItemInMainHand();
            item.addEnchantment(Enchantment.LOOT_BONUS_BLOCKS, 10);
            item.setType(Material.SNOWBALL);
            if(item != null && item.getType() == Material.SNOWBALL && item.getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS) >= 10) {
                if(e.getHitEntity() instanceof Player) {
                    if (p.getGameMode() == GameMode.SURVIVAL) {
                        p.getInventory().addItem(item);
                        p.updateInventory();

                    }
                    if (p.getGameMode() == GameMode.CREATIVE) {
                     
                    }

                    p.sendMessage(ChatColor.GOLD + "Ты кикнул " + ChatColor.AQUA + t.getName());
                    Bukkit.getScheduler().runTask(main.getInstance(), () -> t.kickPlayer(ChatColor.RED + "Кикнуты администратором"));
                }
            }
        }
    }

@mirrerror​
В данном случае лучше использовать 2 ивента 1 когда игрок бросает снежок другой когда снежок прилетает, это нужно дабы избежать того что в момент полета игрок сменит предмет в руке. При бросании снежка записывай игрока в коллекцию а лучше в мапу пусть ключем будет ентити снежка а значение это будет игрок который бросил и при попадании просто доставай из мапы игрока по ключу и все. А проводить проверки над снежком можно в ивенте бросания его.
 
При бросании снежка записывай игрока в коллекцию а лучше в мапу пусть ключем будет ентити снежка а значение это будет игрок который бросил и при попадании просто доставай из мапы игрока по ключу и все.
Бред
 
В каком же месте и что тебя не устраивает? Если игрок после того как кинул снежок сменит предмет в руке то как ты достанешь именно тот снежок который был кинут? А если у игрока весь инвентарь в сежках? А если игрок выкинет все снежки из инвентаря?
 
В каком же месте и что тебя не устраивает? Если игрок после того как кинул снежок сменит предмет в руке то как ты достанешь именно тот снежок который был кинут? А если у игрока весь инвентарь в сежках? А если игрок выкинет все снежки из инвентаря?
Я уже дал рабочее решение этой проблемы, а то, что ты предлагаешь хранение в мапе - бред и самый обычный костыль.
 
Я уже дал рабочее решение этой проблемы, а то, что ты предлагаешь хранение в мапе - бред и самый обычный костыль.
Ну Дак как получить именно тот снежок который был кинут, из инвентаря игрока?)
 
Тоже самое только без мапы)
Использования двух ивентов я не называл бредом, начнем с этого.

я предложил то что будет понятнее TC, а ты предлагаешь ту же логику только более сложную вот и все.
Работа с мапой как раз будет запарнее, чем с Metadata/PersistentDataContainer, так еще и работать будет криво.
 
Использования двух ивентов я не называл бредом, начнем с этого.


Работа с мапой как раз будет запарнее, чем с Metadata/PersistentDataContainer.
Ну для кого как, по моему мнению использовать мапу куда легче чем записывать данные на предмет а после проверять все предметы в инвенторе на наличие этих данных.
 
Нафига? Ты вообще смотрел мой вариант решения?
Ты куда-то его вообще кидал? Даже если без проверки всего инвентаря все равно по моему мнению легче понять как работает мапа чем MetaData.
 
у меня сейчас такой код

Код:
  @EventHandler
    public void onHitSnowBall(ProjectileHitEvent e) {
        if(e.getEntity().getShooter() instanceof Player) {
            Player p = (Player) e.getEntity().getShooter();
            Player t = (Player) e.getHitEntity();
            ItemStack item = p.getPlayer().getInventory();
            if(item == null) return;
            item.addEnchantment(Enchantment.LOOT_BONUS_BLOCKS, 10);
            item.setType(Material.SNOWBALL);
            if(item != null && item.getType() == Material.SNOWBALL && item.getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS) >= 10) {
                if(e.getHitEntity() instanceof Player) {
                    if (p.getGameMode() == GameMode.SURVIVAL) {
                        p.getInventory().addItem(item);
                        p.updateInventory();

                    }
                    if (p.getGameMode() == GameMode.CREATIVE) {
                        
                    }

                    p.sendMessage(ChatColor.GOLD + "Ты кикнул " + ChatColor.AQUA + t.getName());
                    Bukkit.getScheduler().runTask(main.getInstance(), () -> t.kickPlayer(ChatColor.RED + "Кикнуты администратором"));
                }
            }
        }
    }
 
Это вообще другой топик, по этому и не видел. Но факт остается фактом.
по моему мнению легче понять как работает мапа чем MetaData.
 
у меня сейчас такой код

Код:
  @EventHandler
    public void onHitSnowBall(ProjectileHitEvent e) {
        if(e.getEntity().getShooter() instanceof Player) {
            Player p = (Player) e.getEntity().getShooter();
            Player t = (Player) e.getHitEntity();
            ItemStack item = p.getPlayer().getInventory();
            if(item == null) return;
            item.addEnchantment(Enchantment.LOOT_BONUS_BLOCKS, 10);
            item.setType(Material.SNOWBALL);
            if(item != null && item.getType() == Material.SNOWBALL && item.getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS) >= 10) {
                if(e.getHitEntity() instanceof Player) {
                    if (p.getGameMode() == GameMode.SURVIVAL) {
                        p.getInventory().addItem(item);
                        p.updateInventory();

                    }
                    if (p.getGameMode() == GameMode.CREATIVE) {
                       
                    }

                    p.sendMessage(ChatColor.GOLD + "Ты кикнул " + ChatColor.AQUA + t.getName());
                    Bukkit.getScheduler().runTask(main.getInstance(), () -> t.kickPlayer(ChatColor.RED + "Кикнуты администратором"));
                }
            }
        }
    }
Тебе надо сделать выдачу снежка с энчантом что-ли? Сделай это через команду свою и все.
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх