- Баллы
- 88
- Имя в Minecraft
- StealerSlain
Есть кастомный инвентарь. Хочу чтобы если первый игрок вышел с инвентаря (закрыл его), то у другого автоматически закрывается тоже. InventoryCloseEvent выдает непрерывное количество ошибок, либо я криворук.
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
Ну, если у тебя из-за этого была первая ошибка - не значит, что она у меня тоже будет.) Другие эвенты у меня работают и сам инвентарь работает.public class YourClass extends JavaPlugin implements Listener {
Написал ли ты это? И еще
Bukkit.getPluginManager().registerEvents(this, this);
Это в onEnable().
Знаю немного тупо, но вдруг...
Код скинь, пожалуйста.
@EventHandler
public void onTradeClose(InventoryCloseEvent e){
if(e.getInventory().getName() == "TestInventory"){
closeInventory = true;
if(closeInventory == true){
e.getInventory().getViewers().get(0).closeInventory();// V
e.getInventory().getViewers().get(1).closeInventory(); //вот это выдает триллион непрекращаемых ошибок
closeInventory = false;
}
}
}
А что, если после get(0).closeInventory() смотрителей всего 1 чевлоек, и get(1) тупо возращает ошибку, когда возможно нужно get(0).closeInvetory() сделать два раза?Код:e.getInventory().getViewers().get(0).closeInventory();// V e.getInventory().getViewers().get(1).closeInventory(); //вот это выдает триллион непрекращаемых [/quote]
Не, не работает. Вся консоль опять непрерывно выводит ошибки. И после того, кстати, как игрок закроет инвентарь (один из них), то другой не может вообще никакие либо gui интерфейсы открывать (то есть даже меню)А что, если после get(0).closeInventory() смотрителей всего 1 чевлоек, и get(1) тупо возращает ошибку, когда возможно нужно get(0).closeInvetory() сделать два раза?
Включай думалку.
значит, нужно глядеть на ошибкиНе, не работает. Вся консоль опять непрерывно выводит ошибки. И после того, кстати, как игрок закроет инвентарь (один из них), то другой не может вообще никакие либо gui интерфейсы открывать (то есть даже меню)
не понял.e.getInventory().getName() == "TestInventory"
UB во все поля?
Увидел первую ошибку:не понял.
Вообщем, ловите весь код.
Код:import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Random; import java.util.logging.Logger; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Egg; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.*********ventory.Inventory; import org.*********ventory.ItemStack; import org.*********ventory.meta.ItemMeta; import org.bukkit.util.BlockIterator; public class MagickaListener implements Listener{ public static MagickaMain plugin; private static Player valueForMethod = null; private static Player keyForMethod = null; public final Logger logger = Logger.getLogger("Minecraft"); // // DON'T // EVER // FORGET // @EVENTHANDLER // // // static HashMap<Player, Player> traders = new HashMap<Player, Player>(); private static Player getPlayer1FromHashMap(){ for ( Map.Entry<Player, Player> entry : traders.entrySet()) { Player key = entry.getKey(); keyForMethod = key; } return keyForMethod; } private static Player getPlayer2FromHashMap(){ for( Map.Entry<Player, Player> entry : traders.entrySet()) { Player value = entry.getValue(); valueForMethod = value; } return valueForMethod; } @EventHandler public void onTrade(PlayerInteractEntityEvent e){ Player p = e.getPlayer(); Player rc = (Player) e.getRightClicked(); Inventory tradeWindow = Bukkit.createInventory(null, 27, "Trade"); if(p.isSneaking() && rc.getType() == EntityType.PLAYER){ traders.put(p, rc); // ItemStack stack = new ItemStack(Material.IRON_FENCE, 1); ItemMeta im = stack.getItemMeta(); im.setDisplayName(ChatColor.BOLD + "BARRIER"); im.setLore(Arrays.asList(ChatColor.RED + "Don't get over it")); stack.setItemMeta(im); // ItemStack stack1 = new ItemStack(Material.EMERALD, 1); ItemMeta im1 = stack1.getItemMeta(); im1.setDisplayName(ChatColor.GREEN + "READY?"); im1.setLore(Arrays.asList(ChatColor.RED + "Press if you're ready to trade")); stack1.setItemMeta(im1); // tradeWindow.setItem(4, stack); tradeWindow.setItem(13, stack); tradeWindow.setItem(22, stack); tradeWindow.setItem(14, stack1); tradeWindow.setItem(12, stack1); // p.openInventory(tradeWindow); rc.openInventory(tradeWindow); } } @EventHandler(priority = EventPriority.HIGH) public void onInvClick(InventoryClickEvent e){ if(e.getInventory().getName() == "Trade"){ ItemStack stack = new ItemStack(Material.IRON_FENCE, 1); ItemMeta im = stack.getItemMeta(); im.setDisplayName(ChatColor.BOLD + "BARRIER"); im.setLore(Arrays.asList(ChatColor.RED + "Don't get over it")); stack.setItemMeta(im); // ItemStack stack1 = new ItemStack(Material.EMERALD, 1); ItemMeta im1 = stack1.getItemMeta(); im1.setDisplayName(ChatColor.GREEN + "READY?"); im1.setLore(Arrays.asList(ChatColor.RED + "Press if you're ready to trade")); stack.setItemMeta(im1); // ItemStack stack2 = new ItemStack(Material.EMERALD_BLOCK, 1); ItemMeta im2 = stack2.getItemMeta(); im2.setDisplayName(ChatColor.GREEN + "READY?"); im2.setLore(Arrays.asList(ChatColor.RED + "Press if you're ready to trade")); stack.setItemMeta(im2); if(e.getRawSlot() == 4 || e.getRawSlot() == 13 || e.getRawSlot() == 22){ e.setCancelled(true); } if( e.getRawSlot() == 0 || e.getRawSlot() == 1 || e.getRawSlot() == 2 || e.getRawSlot() == 3 || e.getRawSlot() == 9 || e.getRawSlot() == 10 || e.getRawSlot() == 11 || e.getRawSlot() == 18 || e.getRawSlot() == 19 || e.getRawSlot() == 20 || e.getRawSlot() == 21){ if( ((Player)e.getWhoClicked()) == getPlayer2FromHashMap()){ e.setCancelled(true); ((Player)e.getWhoClicked()).sendMessage(pluginPrefix + ChatColor.RED + "It's not your part of trade window!"); } } if( e.getRawSlot() == 5 || e.getRawSlot() == 6 || e.getRawSlot() == 7 || e.getRawSlot() == 8 || e.getRawSlot() == 15 || e.getRawSlot() == 16 || e.getRawSlot() == 17 || e.getRawSlot() == 23 || e.getRawSlot() == 24 || e.getRawSlot() == 25 || e.getRawSlot() == 26){ if( ((Player)e.getWhoClicked()) == getPlayer1FromHashMap()){ e.setCancelled(true); ((Player)e.getWhoClicked()).sendMessage(pluginPrefix + ChatColor.RED + "It's not your part of trade window!"); } } } } @EventHandler public void onTradeClose(InventoryCloseEvent e){ if(e.getInventory().getName() == "Trade"){ e.getInventory().getViewers().get(0).closeInventory(); e.getInventory().getViewers().get(0).closeInventory(); } } }
if(e.getInventory().getName() == "Trade")
if(e.getInventory().getName().equals("Trade"))
Так есть шанс поймать NullPointer, лучше всегда брать equals от константы, если это возможно, т.е.Код:if(e.getInventory().getName().equals("Trade"))
if("Trade".equals(e.getInventory().getName()))