Close a Chest

Discussion in 'Plugin Development' started by 4z3rty, Jun 13, 2012.

Thread Status:
Not open for further replies.
  1. Offline

    4z3rty

    Hello,
    I create a plugin for my server but I'm don't verry good in Java...
    I want it to have only one person who can open a chest at a time.

    My code works, but the chest doesn't close it after the one time :
    Code:
    package fr.az3rty.ChestShop;
     
    import org.bukkit.entity.HumanEntity;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.EventPriority;
    import org.bukkit.event.Listener;
    import org.bukkit.event.inventory.InventoryCloseEvent;
    import org.bukkit.event.inventory.InventoryOpenEvent;
     
    public class ChestShopListener implements Listener{
     
        private ChestShop plugin;
        private boolean ouvert = false;
        private String joueur = "";
     
        public ChestShopListener(ChestShop plugin){
            this.plugin = plugin;
        }
     
        @EventHandler(priority = EventPriority.NORMAL)
        public void ouvreCoffre(InventoryOpenEvent e){
     
     
            e.setCancelled(ouvert);
         
            if(e.isCancelled()){
                plugin.getServer().broadcastMessage("Le coffre est déjà ouvert");
            }
            else{
                ouvert=true;
                HumanEntity p = e.getPlayer();
                joueur = p.getName();
            }
        }
     
        @EventHandler(priority = EventPriority.NORMAL)
        public void fermeCoffre(InventoryCloseEvent e){
         
            HumanEntity p = e.getPlayer();
         
            if(p.getName() == joueur){
                joueur = "";
                ouvert = false;
            }
        }
     
    }
    Thank for help me.

    Escuse me for my spelling, I'm french !
     
  2. Offline

    r0306

    4z3rty
    Add this in.
    Code:
    e.getView().close;
     
  3. Offline

    4z3rty

    I have talk too fast...

    I have always the problem :
    Code:
    package fr.az3rty.ChestShop;
     
    import org.bukkit.entity.HumanEntity;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.EventPriority;
    import org.bukkit.event.Listener;
    import org.bukkit.event.inventory.InventoryCloseEvent;
    import org.bukkit.event.inventory.InventoryOpenEvent;
     
    public class ChestShopListener implements Listener{
     
        private ChestShop plugin;
        private boolean ouvert = false;
        private String joueur = "";
     
        public ChestShopListener(ChestShop plugin){
            this.plugin = plugin;
        }
     
        @EventHandler(priority = EventPriority.NORMAL)
        public void ouvreCoffre(InventoryOpenEvent e){
     
     
            e.setCancelled(ouvert);
         
            if(e.isCancelled()){
                plugin.getServer().broadcastMessage("Le coffre est déjà ouvert");
            }
            else{
                ouvert=true;
                HumanEntity p = e.getPlayer();
                joueur = p.getName();
            }
        }
     
        @EventHandler(priority = EventPriority.NORMAL)
        public void fermeCoffre(InventoryCloseEvent e){
         
            HumanEntity p = e.getPlayer();
         
            if(p.getName() == joueur){
                joueur = "";
                ouvert = false;
                e.getView().close();
            }
        }
     
    }
     
  4. Offline

    Seadragon91

    Do you have look if the code is get called? And For strings please use equals or equalsIgnoreCase:

    Change:
    Code:
    if(p.getName() == joueur){
    to
    Code:
    if(p.getName().equalsIgnoreCase(joueur)){
     
  5. Offline

    4z3rty

    Seadragon91
    I have simplified my code but I have always the bug ! :
    Code:
    package fr.az3rty.CloseChest;
    
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.EventPriority;
    import org.bukkit.event.Listener;
    import org.bukkit.event.inventory.InventoryCloseEvent;
    import org.bukkit.event.inventory.InventoryOpenEvent;
    
    import fr.az3rty.CloseChest.CloseChest;
    
    public class CloseChestListener implements Listener{
        
        private CloseChest plugin;
        
        public CloseChestListener(CloseChest plugin){
            this.plugin = plugin;
        }
        
        @EventHandler(priority = EventPriority.NORMAL)
        public void ouvreCoffre(InventoryOpenEvent e){
            
            
            if(e.getInventory().getName().equalsIgnoreCase("Large chest") || e.getInventory().getName().equalsIgnoreCase("container.chest")){
                
                Player p = (Player) e.getPlayer();
                
                if(!e.getViewers().get(0).getName().equalsIgnoreCase(p.getName())){
                    plugin.getServer().broadcastMessage("Chest already OPEN !");
                    if(!e.isCancelled()){
                        e.setCancelled(true);
                    }
                }
                else {
                    plugin.getServer().broadcastMessage("You can go !");
                }
            }
        }
        
        @EventHandler(priority = EventPriority.NORMAL)
        public void fermeCoffreEvent(InventoryCloseEvent e){
            if(e.getInventory().getName().equalsIgnoreCase("Large chest") || e.getInventory().getName().equalsIgnoreCase("container.chest")){
                e.getView().close();
                plugin.getServer().broadcastMessage("The Chest closes !");
            }
        }
    }
    I have a soluction : use PlayerInterractEvent instead of InventoryOpenEvent !

    Thank

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 26, 2016
  6. Offline

    4z3rty

    I still have a problem with my plugin :
    Code:
    if(!e.getViewers().get(0).getName().equalsIgnoreCase(p.getName()))
    This line only work with a simple chest !
    It's boring...
     
  7. Offline

    Firefly

    You're only getting the first player that shows up in the list that getViewers() returns (get(0) returns the first index of a list), therefore the player you are getting may be in that list, but your logic may not recognize that since you are only testing the first element. You should iterate every InventoryViewer to test all of the people in that list and then check each player against the player you are "targeting."
     
  8. Offline

    4z3rty

    I'm not sure you understand, but here is my code :
    Code:
    @EventHandler(priority = EventPriority.NORMAL)
        public void ouvreCoffre(InventoryOpenEvent e){
            
            Player p = (Player) e.getPlayer();
            
            boolean ouvert = false;
            
            for(int i=0; i<e.getViewers().size(); i++){
                if(!e.getViewers().get(i).getName().equalsIgnoreCase(p.getName())){
                    ouvert = true;
                }
            }
            
            if(ouvert){
                plugin.getServer().broadcastMessage("Chest already OPEN !");
            }
            else {
                plugin.getServer().broadcastMessage("You can go !");
            }
    
        }
     
  9. Offline

    Firefly

    You changed the code from your first post:

     
  10. Offline

    SoThatsIt

    do you want it to broadcast to the whole server that "Chest already OPEN !" or "You can go !" if you only want to send it to the player do this instead.

    p.sendMessage("message");
     
Thread Status:
Not open for further replies.

Share This Page