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

Помогите Размер стака

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Как указать максимальное число стака для определенной вещи? Например чтобы булыжник хранился не 64 в стаке, а 10.
     
  2. alexandrage

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

    Баллы:
    173
    Пропатчить нужный айтемспак на максстаквалуе.
     
  3. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Перевожу:
    Тебе придётся переписывать ядро, т.к. в апи баккита не существует нужной тебе функции.
    Значение максимального размера стака хранится в поле maxStackValue (предположительно в классе Material)
     
  4. Автор темы
    NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Пытаюсь заменить патчинг сие творением -
    Код:
    @EventHandler
    public void onInventoryClick(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        ItemStack i = e.getCurrentItem();
        if(p.getGameMode() == GameMode.SURVIVAL) {
            if(e.getSlot() == -999) return;
            int slot = e.getSlot();
            if(p.getInventory().getItem(slot) == null) return;
                if(p.getInventory().getItem(slot).getType() == Material.COOKIE && p.getInventory().getItem(slot).getAmount() >= 9 ) {
                    p.sendMessage("otmena");
                    e.setCancelled(true);
                    return;           
                }
    
            }
     
        }
    
    То что нужно знать о коде: Когда игрок кликает по предмету количество которого (в слоте) больше восьми , то событие отменяется.
    Работает как мне надо, НО иногда клик проскакивает мимо условия. Например - когда на курсоре один и тот же тип, что и в слоте на который кликают (кликал ПКМ), и в слоте больше 9 предмета, есть шанс , что эвент не отменится, хотя должен. В чем ошибка? Как фиксить?

    UPD Понял, что, когда нажимается ПКМ и сдвигается курсор, предметы из слота по которому щелкнули пропадают и не читаются getCurrentItem'ом
    UPD 2 Познакомился с InventoryDragEvent
    UPD 3 Избавился от проблем
     
    Последнее редактирование: 21 дек 2019
  5. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    И чего, прям полная поддержка твоего кастомного MaxStackSize?
    Даже если с шифтом целый стак в другой инвентарь переносится?
    Думал, там миллион проверок городить придется.
    Приложишь код для интересующихся?
     
  6. Luminate_

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

    Баллы:
    76
    Имя в Minecraft:
    Luminate_
    Ух-ты
     
  7. Studenikin

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

    Баллы:
    123
    Skype:
    vanya.studenikin
    Имя в Minecraft:
    stuvanya
    *сим
     
  8. Автор темы
    NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Код не доделан, проверок будет не очень много, собираюсь пожертвовать действиями с шифтом или клавишами для нужного стека(полностью отменять их). Еще надо дописать поднятие стека с земли. Как доделаю, что хотел, обязательно поделюсь.
     
  9. alexandrage

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

    Баллы:
    173
    А вот так выглядит плагин с патчингом ядра. И у игроков никаких неудобных ограничений.
    Код:
        @EventHandler
        public void on(InventoryClickEvent e) {
            Player p = (Player) e.getWhoClicked();
            if(e.getAction() == InventoryAction.COLLECT_TO_CURSOR) {
                new Scheduler(p).runTask(this.plugin);
            }
            if(e.getAction() == InventoryAction.PLACE_ALL) {
                new Scheduler(p).runTask(this.plugin);
            }
            if(e.getAction() == InventoryAction.NOTHING) {
                new Scheduler(p).runTask(this.plugin);
            }
            if(e.getAction() == InventoryAction.MOVE_TO_OTHER_INVENTORY) {
                new Scheduler(p).runTask(this.plugin);
            }
        }
    Код:
    public class Scheduler extends BukkitRunnable {
    
        private Player player;
        public Scheduler(Player player) {
            this.player = player;
        }
      
        @Override
        public void run() {
            this.player.updateInventory();
        }
    }
    Сам патч.
    [​IMG]
     
  10. Автор темы
    NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Спасибо, полезная информация.
     
  11. alexandrage

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

    Баллы:
    173
    Сам класс сервака. https://cloud.mail.ru/public/Ao4N/U5hPmm9Qa 1.15.1 если че брал.
    И так можно со всеми остальными стаками проделать.
     
  12. Автор темы
    NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Подскажите, почему это работает (заменяет/добавляет (на) нужный стек):

    Код:
    ItemStack IS = new ItemStack(материал, размер);
    int slot = *получаю нужный номер слота*
    *получаю нужный инвентарь*.setItem(slot, IS);
    А это не работает:
    Код:
    for(int i=0; i <*слоты*.size(); i++) {
    ItemStack IS = new ItemStack(Material.COOKIE, 8);
    int slot = *слоты[i]*
    *получаю нужный инвентарь*.setItem(slot, IS);
    }
    При проверке сообщениями заменяет, а на деле нет.
    Что нужно сделать, чтобы заработало?
    *Класс - InventoryDragEvent
     
  13. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Возможно не в тот инвентарь устанавливаешь.
    А возможно и эвент после окончания вызова все твои изменения затирает.
    Что конкретно ты пытаешься сделать этим кодом?
     
  14. Автор темы
    NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    У меня есть интерфейс Map (Map<Integer , ItemStack> NI = e.getNewItems();), Где Integer - номер слота, я перебираю все номера слотов, и ставлю туда нужный мне айтемстек. Если запускать без цикла, то код работает, если с циклом, то он работает(как мне пишет SendMessage), но в итоге ничего не происходит.
    UPD я догнал, сначала происходит код, а потом эвент, этот вопрос исчерпан, фиксится сетканселом.
     
    Последнее редактирование: 24 дек 2019
  15. Автор темы
    NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Еще один вопрос, почему Inventory(Close/Open)Event , регает все инвентари , кроме инвентаря игрока?(который открывается русской буковкой - у). Как фиксить, или , что использовать вместо?
     
  16. alexandrage

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

    Баллы:
    173
    Пхахах. Инвентарь игрока открыт всегда. Все просто.
     
  17. Автор темы
    NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Возникла еще одна проблема. Когда размазываешь ПКМ/ЛКМ предметы по инвентарю, и в финали все предметы из курсора перешли в инвентарь, событие не регистрируется. Не в драгэвенте , не в кликэвенте. У кого-нибудь есть предложения как задетектить этот мув (айтеммувэвент тоже не работает).
     
  18. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    При этом действии должен драг вызываться. Но это до того, как предметы уже "размазаны". События после "размазывания" не существует. Что ты хочешь сейчас сделать?
     
  19. alexandrage

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

    Баллы:
    173
    А всего то нужно было мой патч проюзать. Не сделать тебе по нормальному никогда. Только игроки с сервера свалят от глючного инвентаря, из за запрета почти всех кликов.
     
    Последнее редактирование: 26 дек 2019
  20. Автор темы
    NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Почему глючного? Я и решаю проблемы со всеми кликами, осталось только разобраться с проблемой выше. Все вполне реально реализовать и без патчинга!
     

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