- Баллы
- 76
Всем привет!
Продолжаю делать верстаки. Более-менее функционал сделал, теперь надо наладить взаимодействие игрока с верстаком. Сейчас все это делаю через InventoryClickEvent, только вот он берёт инвентарь, который был до клика (когда игрок ещё не положил предмет), а делать какую-то кнопку для проверки рецепта не хочу.
В общем как получить инвентарь, после того, как игрок положит/вытащит в/из него предмет?
На первой картинке рецепт, который сделал админ. На второй - верстак игрока. Нужно делать лишнее действие (положил третий рычаг, чтобы проверка прошла)
Продолжаю делать верстаки. Более-менее функционал сделал, теперь надо наладить взаимодействие игрока с верстаком. Сейчас все это делаю через InventoryClickEvent, только вот он берёт инвентарь, который был до клика (когда игрок ещё не положил предмет), а делать какую-то кнопку для проверки рецепта не хочу.
В общем как получить инвентарь, после того, как игрок положит/вытащит в/из него предмет?
AdminInvMap AM = new AdminInvMap(); //Мапа <Player, AdminInventory> хранит открытые инвентари админов
UserInventory UM = new UserInventory(); //Мапа <Player, UserInventory> хранит открытые инвентари игроков
@EventHandler
public void invClick(InventoryClickEvent e){
if(e.getClickedInventory == null) return;
Inventory i = e.getClickedInventory();
Player p = (Player) e.getWhoClicked();
//Чтобы игрок не мог шифтом перекинуть предметы в верстак
if((UM.contKey(p)|| AM.contKey(p))&&e.getClickedInventory() == p.getInventory()&&e.isShiftClick()){
e.setCancelled(true);
return;
}
//Если у игрока открыт пользовательский верстак
if(UM.contKey(p)){
//Если ткнул именно в пользовательский верстак
if(i == UM.getInventory();{
if(Это не спец. слот){ //Если это чёрное стекло
e.setCancelled(true); return;
}
if(Это слот матрицы){
if(e.getCursor().getType() == Material.AIR && i.getItem(slot) == null) return; //Если курсор и слот пустые
if(есть рецепт){
if(уровень верстака >= уровень рецепта){
i.setItem(resultSlot, result);
}
}
}
}
}
UserInventory UM = new UserInventory(); //Мапа <Player, UserInventory> хранит открытые инвентари игроков
@EventHandler
public void invClick(InventoryClickEvent e){
if(e.getClickedInventory == null) return;
Inventory i = e.getClickedInventory();
Player p = (Player) e.getWhoClicked();
//Чтобы игрок не мог шифтом перекинуть предметы в верстак
if((UM.contKey(p)|| AM.contKey(p))&&e.getClickedInventory() == p.getInventory()&&e.isShiftClick()){
e.setCancelled(true);
return;
}
//Если у игрока открыт пользовательский верстак
if(UM.contKey(p)){
//Если ткнул именно в пользовательский верстак
if(i == UM.getInventory();{
if(Это не спец. слот){ //Если это чёрное стекло
e.setCancelled(true); return;
}
if(Это слот матрицы){
if(e.getCursor().getType() == Material.AIR && i.getItem(slot) == null) return; //Если курсор и слот пустые
if(есть рецепт){
if(уровень верстака >= уровень рецепта){
i.setItem(resultSlot, result);
}
}
}
}
}
На первой картинке рецепт, который сделал админ. На второй - верстак игрока. Нужно делать лишнее действие (положил третий рычаг, чтобы проверка прошла)
Вложения
Последнее редактирование: