How to find player in a PortalCreate event?

Discussion in 'Plugin Development' started by Viperdream, Mar 10, 2012.

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

    Viperdream

    Hi, I'm trying to make a plug-in which only allows players with the right permissions to create and enter portals.

    However, I can't get the player with the PortalCreateEvent method. I tried it then with the PlayerEvent method, but still no luck.

    This is my current code for the listener:

    Code:
    package com.github.viperdream.AntiNether;
     
    import org.bukkit.ChatColor;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerEvent;
    import org.bukkit.event.player.PlayerPortalEvent;
    import org.bukkit.event.world.PortalCreateEvent;
     
    public class PortalListener implements Listener{
       
        public PortalListener(AntiNether plugin){
           
            plugin.getServer().getPluginManager().registerEvents(this, plugin);
        }
     
        @EventHandler
        public void onPortalCreate(PortalCreateEvent event, PlayerEvent player){
           
            Player p = player.getPlayer();
           
            if(p.hasPermission(("antinether.create"))){
                event.setCancelled(false);
            }else
            event.setCancelled(true);
    }
        @EventHandler
        public void onPortalEnter(PlayerPortalEvent event){
           
            Player player = event.getPlayer();
           
            if (player.hasPermission("antinether.enter")){
                event.setCancelled(false);
            }else
           
            event.setCancelled(true);
            player.sendMessage(ChatColor.DARK_PURPLE + "You don't have permission to enter Portals!");
        }
    }
    Is there any method how I could find the player creating the portal?

    Thanks for any help!

    Ok, I tried making a custom event for it by extending the PortalCreateEvent

    However, I'm not sure how I can get the player in it. I've checked the events on the bukkit reference list, but there's not a good example for adding a player.

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

    nisovin

    You can't just add an extra event into the event handler method, and you also can't just create your own event and expect Bukkit to fire it. Try using the PlayerInteractEvent instead, and check for obsidian and flint+steel.
     
  3. Offline

    messageofdeath

    for that use event.getPlayer().getName()
     
  4. Offline

    Viperdream

    I tried it with the PlayerInteractEvent in my listener, but it still doesn't work.
    This is my code.

    Code:
    package com.github.viperdream;
     
     
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerInteractEntityEvent;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.event.player.PlayerPortalEvent;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.plugin.java.JavaPlugin;
     
    public class PortalListener extends JavaPlugin implements Listener{
       
        public PortalListener(NoPortal plugin){
           
            plugin.getServer().getPluginManager().registerEvents(this, plugin);
        }
     
        @EventHandler
        public void onPlayerInteractEvent(PlayerInteractEntityEvent event, PlayerInteractEvent event2){
           
            Player p = event.getPlayer();
            Block b = event.getRightClicked().getLocation().getBlock();
            ItemStack tinder = event2.getItem();
            Location loc1 = event.getPlayer().getLocation();
           
            if(tinder.getType().equals(Material.FLINT_AND_STEEL)){
           
            if(b.getType().equals(Material.OBSIDIAN)){
               
                    if(p.hasPermission("noportal.create")){
                       
                        event.setCancelled(false);
                    }
                    }else               
                        event.setCancelled(true);
                        loc1.getWorld().createExplosion(loc1, 5);
            }
            }
     
        @EventHandler
        public void onPortalEnter(PlayerPortalEvent event){
           
            Player player = event.getPlayer();
           
            if (player.hasPermission("noportal.enter")){
                event.setCancelled(false);
           
            }else{
            event.setCancelled(true);
            Location loc = event.getPlayer().getLocation();
               
            loc.getWorld().createExplosion(loc, 5);
            event.setCancelled(true);
            player.sendMessage(ChatColor.DARK_PURPLE + "The portal has been overloaded by your stupidness!");
            }
           
        }
    }
     
  5. Offline

    heisan213

    PlayerInteractEntityEvent is when a player clicks animals/monsters. Only interact event is needed. Also check if event.getAction().equals(Action.RIGHT_CLICK_BLOCK) == true and then check item used!
     
  6. Offline

    Viperdream

    Ok, the explosion works now.
    But it doesn't cancel the event. It also blows up every time I just lit up obsidian, but that's normal due to the code.

    Current code:
    Code:
    package com.github.viperdream;
     
     
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEntityEvent;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.event.player.PlayerPortalEvent;
    import org.bukkit.event.world.PortalCreateEvent;
    import org.bukkit.event.world.PortalCreateEvent.CreateReason;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.plugin.java.JavaPlugin;
     
    public class PortalListener extends JavaPlugin implements Listener{
     
        public PortalListener(NoPortal plugin){
         
            plugin.getServer().getPluginManager().registerEvents(this, plugin);
        }
     
        @EventHandler
        public void onPlayerInteractEvent(PlayerInteractEvent event){
         
            Player p = event.getPlayer();
            Action a = event.getAction();
            ItemStack tinder = event.getItem();
            Location loc1 = event.getPlayer().getLocation();
            Block b = event.getClickedBlock();
         
            if(a.equals(Action.RIGHT_CLICK_BLOCK)==true)
            {
         
            if(tinder.getType().equals(Material.FLINT_AND_STEEL)){
         
            if(b.getType().equals(Material.OBSIDIAN)){
             
                    if(p.hasPermission("noportal.create")){
                     
                        event.setCancelled(false);
                    }
                    }else             
                        event.setCancelled(false);
                        loc1.getWorld().createExplosion(loc1, 5);
            }
            }
        }
     
        @EventHandler
        public void onPortalEnter(PlayerPortalEvent event){
         
            Player player = event.getPlayer();
         
            if (player.hasPermission("noportal.enter")){
                event.setCancelled(false);
         
            }else{
            event.setCancelled(true);
            Location loc = event.getPlayer().getLocation();
             
            loc.getWorld().createExplosion(loc, 5);
            event.setCancelled(true);
            player.sendMessage(ChatColor.DARK_PURPLE + "The portal has been overloaded by your stupidness!");
            }
         
        }
    }
    Do I now just make a custom event which extends the PlayerInteractEvent? A little push in the right direction would be nice, since I'm not exactly sure how to do this.
     
  7. Offline

    nisovin

    You don't have any code in there that actually cancels the event. You also don't need to uncancel events either, if it shouldn't be canceled just do nothing.
     
Thread Status:
Not open for further replies.

Share This Page