Gun Plugin

Discussion in 'Plugin Development' started by Bowan, Jan 15, 2015.

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

    Bowan

    Im making a plugin for my server.

    I got it to launch arrows from an Diamond Barding named "gun".
    I then got it to instantly kill the player with 1 arrow.
    I have it as a permission.
    Problem is that the bow launches instant killing arrows too!
    I only want the arrows from the Diamond Barding to be instant kill.


    Here is my Code for the PlayerListener:
    Code:
    package gun;
    
    import org.bukkit.Material;
    import org.bukkit.entity.Arrow;
    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.entity.EntityDamageByEntityEvent;
    import org.bukkit.event.entity.ProjectileHitEvent;
    import org.bukkit.event.player.PlayerInteractEvent;
    
    public class PlayerListener implements Listener {
    
        public PlayerListener(main plugin) {
            plugin.getServer().getPluginManager().registerEvents(this, plugin);
        }
       
        @EventHandler
        public void gun(PlayerInteractEvent e){
            Player p = e.getPlayer();
            if (!(e.getAction() == Action.RIGHT_CLICK_BLOCK | e.getAction() == Action.RIGHT_CLICK_AIR)) return;
            if (!(e.getItem().getType() == Material.DIAMOND_BARDING)) return;
            if (!(e.getItem().getItemMeta().getDisplayName().equalsIgnoreCase("gun"))) return;
            if(!p.hasPermission("gun.use")) return;
            p.launchProjectile(Arrow.class);
            }
        @EventHandler
        public void arrow(ProjectileHitEvent e){
            e.getEntity().remove();
        }
       
        @EventHandler
        public void damage(EntityDamageByEntityEvent e){
            e.setDamage(20);
        }
    
    }
     
  2. Offline

    reider45

    On the entity damage event you need to check if the damager is an arrow, if so, get the shooter and check if it was shot from the barding.
     
  3. Offline

    unrealdesign

    You also don't want this.
    Code:
       @EventHandler
        public void arrow(ProjectileHitEvent e){
            e.getEntity().remove();
        }
    That deletes every projectile as it hits a block or player. So if you shoot a bow, it will remove it once it hits the ground or a player. Do the same check that @reider45 suggested.
     
  4. Offline

    Bowan

    I had that to make sure players dont pick up the arrows or it could be used as infinite source for arrows to people without the permission.

    how do I get the shooter?

    EDIT by Timtower: merged posts
     
    Last edited by a moderator: Jan 15, 2015
  5. Offline

    CheesyFreezy

    Code:
    if(e.getEntity().getShooter() instanceof Player) {
       Player player = (Player)event.getEntity().getShooter();
    }
     
  6. Offline

    Bowan

    that doesnt work?
     
  7. Online

    timtower Administrator Administrator Moderator

    @Bowan Doesn't work as in?
     
  8. Offline

    Bowan

     
  9. Offline

    CheesyFreezy

    Change e.getEntity().getShooter() to event.getEntity().getShooter() my bad :p
     
  10. Offline

    Bowan

    event cannot be resolved
     
  11. Online

    timtower Administrator Administrator Moderator

    @Bowan It is called "e" in your case, most developers put "event" there
     
  12. Offline

    Bowan

    @timtower None of that is working, can I share screens of whats happening?
     
  13. Online

    timtower Administrator Administrator Moderator

    @Bowan Updated code will probably also work
     
  14. Offline

    Bowan

    Code atm:
    Code:
    package gun;
    import org.bukkit.Material;
    import org.bukkit.entity.Arrow;
    import org.bukkit.entity.EntityType;
    import org.bukkit.entity.Player;
    import org.bukkit.entity.Projectile;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.entity.EntityDamageByEntityEvent;
    import org.bukkit.event.entity.ProjectileHitEvent;
    import org.bukkit.event.player.PlayerInteractEvent;
    public class PlayerListener implements Listener {
        public PlayerListener(main plugin) {
            plugin.getServer().getPluginManager().registerEvents(this, plugin);
        }
      
        @EventHandler
        public void gun(PlayerInteractEvent e){
            Player p = e.getPlayer();
            if (!(e.getAction() == Action.RIGHT_CLICK_BLOCK | e.getAction() == Action.RIGHT_CLICK_AIR)) return;
            if (!(e.getItem().getType() == Material.DIAMOND_BARDING)) return;
            if (!(e.getItem().getItemMeta().getDisplayName().equalsIgnoreCase("gun"))) return;
            if(!p.hasPermission("gun.use")) return;
            p.launchProjectile(Arrow.class);
            }
        @EventHandler
        public void arrow(ProjectileHitEvent e){
            e.getEntity().remove();
        }
      
        @EventHandler
        public void damage(EntityDamageByEntityEvent e){
            if (EntityType.ARROW == e.getDamager().getType()) return;
            if(((Projectile) e.getEntity()).getShooter() instanceof Player) {
                e.setDamage(20);
                }
      
        }
    }
    Now the problem is arrows always give default damage.
    when ^ works then Bows would work too, I only want the gun to work.

    How do I fix this?:confused:
     
    Last edited: Jan 16, 2015
  15. Offline

    drpk

    @Bowan you're returning if the entity is an arrow...
     
  16. Offline

    Bowan

    made no difference?
    @drpk
     
  17. Offline

    drpk

    @Bowan
    are you casting the shooter to a projectile?
     
  18. Offline

    Bowan

  19. Offline

    SuperOriginal

    @Bowan Your return statement cancels your code...
     
  20. Offline

    Experminator

    @Bowan You cancels the code when a arrow hit... I believe you must use this:
    Code:
     @EventHandler
        public void damage(EntityDamageByEntityEvent e){
           if(e.getEntity() instanceof Player && e.getDamager() instanceof Arrow){
              Arrow a = (Arrow) e.getDamager();
              if(a.getShooter() instanceof Player){
                 e.setDamage(20.0);
              }
           }
        }
    I think this should work, correct me if not.
     
  21. Offline

    Bowan

  22. Offline

    Experminator

    @Bowan
    Code:
    @EventHandler
        public void damage(EntityDamageByEntityEvent e){
           if(e.getEntity() instanceof Player && e.getDamager() instanceof Arrow){
              Arrow a = (Arrow) e.getDamager();
              Player p = (Player) e.getEntity();
              if(a.getShooter() instanceof Player){
                 p.damage(20.0);
              }
           }
        }
    It works i think. If not say it!
     
  23. Offline

    Bowan

    It doesnt work.
    Only the player gets instantkilled.
    Bows shoot deadly arrows too...
    And it bypasses NonPvp zones


    @Experminator
     
  24. Offline

    Experminator

    @Bowan
    Code:
    @EventHandler
        public void damage(EntityDamageByEntityEvent e){
           if(e.getEntity() instanceof Player && e.getDamager() instanceof Arrow){
              Arrow a = (Arrow) e.getDamager();
              Player p = (Player) e.getEntity();
              if(a.getShooter() instanceof Player){
                 Player shooter = (Player) a.getShooter();
                if(shooter.getItemInHand() == Material.DIAMOND_BARDING){
                     p.damage(20.0);
                }
              }
           }
        }
    This should work.
     
  25. Offline

    Bowan

    @Experminator
    Error message on
    reading:
    Incompatible operand types ItemStack and Material
     
  26. Online

    timtower Administrator Administrator Moderator

    @Bowan
    Code:
    if(shooter.getItemInHand().getType() == Material.DIAMOND_BARDING){
     
  27. Offline

    Experminator

    @Bowan Sorry that was my fault. I was forgotten to add .getType() to it.
    @timtower has fixed that. Thank you, Tim :)
     
  28. Offline

    Bowan

    this is great and all! Thx! Works perfectly, however Can I get it to damage other entities apart from players?

    & the player can shoot with a bow but switch to a the gun when the player gets hit, and player dies from the guns damage.

    Can we check the player is holding the gun when he fired the arrow? if not thats cool.

    Last of all, can we make sure the shooter has the permission?
    All my code now atm if anyone wants it :)
    Code:
    package gun;
    import org.bukkit.Material;
    import org.bukkit.entity.Arrow;
    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.entity.EntityDamageByEntityEvent;
    import org.bukkit.event.entity.ProjectileHitEvent;
    import org.bukkit.event.player.PlayerInteractEvent;
    public class PlayerListener implements Listener {
        public PlayerListener(main plugin) {
            plugin.getServer().getPluginManager().registerEvents(this, plugin);
        }
      
        @EventHandler
        public void gun(PlayerInteractEvent e){
            Player p = e.getPlayer();
            if (!(e.getAction() == Action.RIGHT_CLICK_BLOCK | e.getAction() == Action.RIGHT_CLICK_AIR)) return;
            if (!(e.getItem().getType() == Material.DIAMOND_BARDING)) return;
            if (!(e.getItem().getItemMeta().getDisplayName().equalsIgnoreCase("gun"))) return;
            if(!p.hasPermission("gun.use")) return;
            p.launchProjectile(Arrow.class);
            }
    
        @EventHandler
        public void arrow(ProjectileHitEvent e){
            e.getEntity().remove();
        }
       
        @EventHandler
        public void damage(EntityDamageByEntityEvent e){
           if(e.getEntity() instanceof Player && e.getDamager() instanceof Arrow){
              Arrow a = (Arrow) e.getDamager();
              Player p = (Player) e.getEntity();
              if(a.getShooter() instanceof Player){
                 Player shooter = (Player) a.getShooter();
                 if(shooter.getItemInHand().getType() == Material.DIAMOND_BARDING){
                     if(shooter.getItemInHand().getItemMeta().getDisplayName().equalsIgnoreCase("gun")) {
                     p.damage(20.0);
                     }
                }
              }
           }
        }}
    
     
  29. Offline

    Experminator

    @Bowan You has already checked if the shooter has permission. Look at PlayerInteractEvent (Method: 'gun').
    If you want to cancel it and send a message then you must change
    Code:
    if(!p.hasPermission("gun.use")) return;
    
    // To:
    
    if(!p.hasPermission("gun.use")) {
        // Message if you want.
        e.setCancelled(true);
    }
    @Bowan Check if player is holding a gun:
    Code:
    if ((e.getItem().getType() == Material.DIAMOND_BARDING) && e.getItem().getItemMeta().getDisplayName().equalsIgnoreCase("gun")){
        // Do stuff.
    } 
    @Bowan Damage entities (Without players):
    Code:
    for(Entity en : p.getNearbyEntities(5, 5, 5)){ // Radius is 5.
        if(en instanceof Player){
            e.setCancelled(true); // Or set the damage to 0. (If there's no e.setCancelled().)
         }
    }
    @Bowan Sorry but i don't know how it works with:
    <Please use the Edit button instead of spamming posts @eyamaz>
     
    Last edited by a moderator: Jan 22, 2015
Thread Status:
Not open for further replies.

Share This Page