Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
@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;
}
}
}
И чего, прям полная поддержка твоего кастомного 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 Избавился от проблем
Ух-тыПытаюсь заменить патчинг сие творением -
То что нужно знать о коде: Когда игрок кликает по предмету количество которого (в слоте) больше восьми , то событие отменяется.Код:@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();
}
}
Спасибо, полезная информация.А вот так выглядит плагин с патчингом ядра. И у игроков никаких неудобных ограничений.
Код:@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(); } }
![]()
Сам класс сервака. https://cloud.mail.ru/public/Ao4N/U5hPmm9Qa 1.15.1 если че брал.Спасибо, полезная информация.
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);
}
Возможно не в тот инвентарь устанавливаешь.Подскажите, почему это работает (заменяет/добавляет (на) нужный стек):
Код: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), но в итоге ничего не происходит.Возможно не в тот инвентарь устанавливаешь.
А возможно и эвент после окончания вызова все твои изменения затирает.
Что конкретно ты пытаешься сделать этим кодом?
Пхахах. Инвентарь игрока открыт всегда. Все просто.Еще один вопрос, почему Inventory(Close/Open)Event , регает все инвентари , кроме инвентаря игрока?(который открывается русской буковкой - у). Как фиксить, или , что использовать вместо?
При этом действии должен драг вызываться. Но это до того, как предметы уже "размазаны". События после "размазывания" не существует. Что ты хочешь сейчас сделать?Возникла еще одна проблема. Когда размазываешь ПКМ/ЛКМ предметы по инвентарю, и в финали все предметы из курсора перешли в инвентарь, событие не регистрируется. Не в драгэвенте , не в кликэвенте. У кого-нибудь есть предложения как задетектить этот мув (айтеммувэвент тоже не работает).
Почему глючного? Я и решаю проблемы со всеми кликами, осталось только разобраться с проблемой выше. Все вполне реально реализовать и без патчинга!А всего то нужно было мой патч проюзать. Не сделать тебе по нормальному никогда. Только игроки с сервера свалят от глючного инвентаря, из за запрета почти всех кликов.