Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите проблема с инвентарем

StealerSlain

Активный участник
Пользователь
Баллы
88
Имя в Minecraft
StealerSlain
Есть кастомный инвентарь. Хочу чтобы если первый игрок вышел с инвентаря (закрыл его), то у другого автоматически закрывается тоже. InventoryCloseEvent выдает непрерывное количество ошибок, либо я криворук.
 
public class YourClass extends JavaPlugin implements Listener {
Написал ли ты это? И еще
Bukkit.getPluginManager().registerEvents(this, this);
Это в onEnable().
Знаю немного тупо, но вдруг...
Код скинь, пожалуйста.
 
Соглашусь. Никто не будет гадать что ты написал, дай что у тебя есть, посмотрим.
 
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;
            }
        }
    }
Код не скинул, потому что он не так важен. Я же вас попросил объяснить просто: как закрыть инвентарь второго игрока, если первый из него вышел.

Остальной код (самого инвентаря и его манипуляций) не важен, он с этим никак не связан. Только если там сверху где-то торчит булеан closeInventory. Все.
 
Код:
                e.getInventory().getViewers().get(0).closeInventory();// V
                e.getInventory().getViewers().get(1).closeInventory(); //вот это выдает триллион непрекращаемых [/quote]
А что, если после get(0).closeInventory() смотрителей всего 1 чевлоек, и get(1) тупо возращает ошибку, когда возможно нужно get(0).closeInvetory() сделать два раза?

Включай думалку.
 
А что, если после get(0).closeInventory() смотрителей всего 1 чевлоек, и get(1) тупо возращает ошибку, когда возможно нужно get(0).closeInvetory() сделать два раза?

Включай думалку.
Не, не работает. Вся консоль опять непрерывно выводит ошибки. И после того, кстати, как игрок закроет инвентарь (один из них), то другой не может вообще никакие либо gui интерфейсы открывать (то есть даже меню)
Upd.
Вот еще небольшая подсказка, которую забыл сказать: у меня есть хэшмапа и при открытии инвентаря ("TestInventory") я двух игроков закидываю туда. То есть с помощью хэшмапы тоже пробовал закрыть игрокам инвентарь, но тоже самое.
 
Не, не работает. Вся консоль опять непрерывно выводит ошибки. И после того, кстати, как игрок закроет инвентарь (один из них), то другой не может вообще никакие либо 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"))
А про вторую я не знаю.
 

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

Назад
Верх