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

Не работает изменение предмета, если игрок заходит в инвентарь.

Тема в разделе "Разработка плагинов для новичков", создана пользователем TS2_YouGame, 18 июл 2023.

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

    TS2_YouGame Новичок

    Баллы:
    6
    Имя в Minecraft:
    TS2_YourGame
    Я делаю систему кулдауна предметам. С помощью Runnable, я делаю задержку, чтобы считать секунды. Всё работало хорошо, но я решил зайти в инвентарь вовремя кулдауна. Как итог, плагин перестал взаимодействовать именно с этим предметом, хотя какой-то предмет он всё ещё видит. Как мне это исправить?

    Код:
    public void reload(Player player, ItemStack item) {
            ItemMeta meta = item.getItemMeta();
            meta.getPersistentDataContainer().set(NamespacedKey.fromString("item_reload_left"), PersistentDataType.STRING, Integer.toString(reloadTime));
            item.setItemMeta(meta);
    
            String reloadMessage = SkillCardSystem.instance.getConfig().getString("reloading item");
            String reloadCompletedMessage = SkillCardSystem.instance.getConfig().getString("reload item completed");
    
            player.sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(SkillCardSystem.color(reloadMessage + Integer.toString(this.getReloadTime()))));
    
            for (int i = this.getReloadTime(); i>0; i--) {
                int finalI = i;
                new DelayedTask(() -> {
    
                    meta.getPersistentDataContainer().set(NamespacedKey.fromString("item_reload_left"), PersistentDataType.STRING, Integer.toString(this.getReloadTime() - finalI));
                    item.setItemMeta(meta);
    
                    if (player.getInventory().getItemInMainHand().equals(item)) {
    
                        player.sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(SkillCardSystem.color(reloadMessage + Integer.toString(this.getReloadTime() - finalI))));
                    }
                }, 20*i);
            }
    
            new DelayedTask(() -> {
                meta.getPersistentDataContainer().set(NamespacedKey.fromString("item_reload_left"), PersistentDataType.STRING, "0");
                item.setItemMeta(meta);
    
                if (player.getInventory().getItemInMainHand().equals(item)) {
    
                    player.sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(SkillCardSystem.color(reloadCompletedMessage)));
                }
            }, 20*this.getReloadTime());
        }
     
  2. Автор темы
    TS2_YouGame

    TS2_YouGame Новичок

    Баллы:
    6
    Имя в Minecraft:
    TS2_YourGame
    Сам класс для задержки, который используется

    Код:
    public class DelayedTask {
        private int id = -1;
    
        public DelayedTask(Runnable runnable, long delay) {
            Plugin plugin = SkillCardSystem.instance;
    
            if (plugin.isEnabled()) {
                this.id = Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, runnable, delay);
    
            } else {
                runnable.run();
            }
        }
    }
     
  3. Автор темы
    TS2_YouGame

    TS2_YouGame Новичок

    Баллы:
    6
    Имя в Minecraft:
    TS2_YourGame
    Ладно... Никто не ответил. Если кто-то столкнётся с такой проблемой, то нужно просто обновить инвентарь игрока, после редактирования предмета с помощью
    Код:
    player.updateInventory() 
    . Мне помогли на зарубежном форуме.
     

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