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

NoooobKa

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
NoooobKa
Как указать максимальное число стака для определенной вещи? Например чтобы булыжник хранился не 64 в стаке, а 10.
 
Перевожу:
Тебе придётся переписывать ядро, т.к. в апи баккита не существует нужной тебе функции.
Значение максимального размера стака хранится в поле maxStackValue (предположительно в классе Material)
 
Пытаюсь заменить патчинг сие творением -
Код:
@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 Избавился от проблем
 
Последнее редактирование:
Пытаюсь заменить патчинг сие творением -
Код:
@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 Избавился от проблем
И чего, прям полная поддержка твоего кастомного MaxStackSize?
Даже если с шифтом целый стак в другой инвентарь переносится?
Думал, там миллион проверок городить придется.
Приложишь код для интересующихся?
 
Пытаюсь заменить патчинг сие творением -
Код:
@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 Избавился от проблем
Ух-ты
 
И чего, прям полная поддержка твоего кастомного MaxStackSize?
Даже если с шифтом целый стак в другой инвентарь переносится?
Думал, там миллион проверок городить придется.
Приложишь код для интересующихся?
Код не доделан, проверок будет не очень много, собираюсь пожертвовать действиями с шифтом или клавишами для нужного стека(полностью отменять их). Еще надо дописать поднятие стека с земли. Как доделаю, что хотел, обязательно поделюсь.
 
А вот так выглядит плагин с патчингом ядра. И у игроков никаких неудобных ограничений.
Код:
    @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();
    }
}
Сам патч.
b891cd8a29.jpg
 
А вот так выглядит плагин с патчингом ядра. И у игроков никаких неудобных ограничений.
Код:
    @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();
    }
}
Сам патч.
b891cd8a29.jpg
Спасибо, полезная информация.
 
Подскажите, почему это работает (заменяет/добавляет (на) нужный стек):

Код:
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
 
Подскажите, почему это работает (заменяет/добавляет (на) нужный стек):

Код:
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
Возможно не в тот инвентарь устанавливаешь.
А возможно и эвент после окончания вызова все твои изменения затирает.
Что конкретно ты пытаешься сделать этим кодом?
 
Возможно не в тот инвентарь устанавливаешь.
А возможно и эвент после окончания вызова все твои изменения затирает.
Что конкретно ты пытаешься сделать этим кодом?
У меня есть интерфейс Map (Map<Integer , ItemStack> NI = e.getNewItems()😉, Где Integer - номер слота, я перебираю все номера слотов, и ставлю туда нужный мне айтемстек. Если запускать без цикла, то код работает, если с циклом, то он работает(как мне пишет SendMessage), но в итоге ничего не происходит.
UPD я догнал, сначала происходит код, а потом эвент, этот вопрос исчерпан, фиксится сетканселом.
 
Последнее редактирование:
Еще один вопрос, почему Inventory(Close/Open)Event , регает все инвентари , кроме инвентаря игрока?(который открывается русской буковкой - у). Как фиксить, или , что использовать вместо?
 
Еще один вопрос, почему Inventory(Close/Open)Event , регает все инвентари , кроме инвентаря игрока?(который открывается русской буковкой - у). Как фиксить, или , что использовать вместо?
Пхахах. Инвентарь игрока открыт всегда. Все просто.
 
Возникла еще одна проблема. Когда размазываешь ПКМ/ЛКМ предметы по инвентарю, и в финали все предметы из курсора перешли в инвентарь, событие не регистрируется. Не в драгэвенте , не в кликэвенте. У кого-нибудь есть предложения как задетектить этот мув (айтеммувэвент тоже не работает).
 
Возникла еще одна проблема. Когда размазываешь ПКМ/ЛКМ предметы по инвентарю, и в финали все предметы из курсора перешли в инвентарь, событие не регистрируется. Не в драгэвенте , не в кликэвенте. У кого-нибудь есть предложения как задетектить этот мув (айтеммувэвент тоже не работает).
При этом действии должен драг вызываться. Но это до того, как предметы уже "размазаны". События после "размазывания" не существует. Что ты хочешь сейчас сделать?
 
А всего то нужно было мой патч проюзать. Не сделать тебе по нормальному никогда. Только игроки с сервера свалят от глючного инвентаря, из за запрета почти всех кликов.
 
Последнее редактирование:
А всего то нужно было мой патч проюзать. Не сделать тебе по нормальному никогда. Только игроки с сервера свалят от глючного инвентаря, из за запрета почти всех кликов.
Почему глючного? Я и решаю проблемы со всеми кликами, осталось только разобраться с проблемой выше. Все вполне реально реализовать и без патчинга!
 
Назад
Верх