@EventHandler public void onEntityDamage(EntityDamageByEntityEvent e) { if ((e.getDamager() instanceof Arrow) && (((Arrow) e.getDamager()).getShooter() instanceof Player) && e.getDamager().getCustomName() == name) { e.setDamage(e.getDamage() + damage); if (effect != null) { ((LivingEntity) e.getEntity()).addPotionEffect(effect); } } if ((e.getDamager() instanceof Fireball) && (((Fireball) e.getDamager()).getShooter() instanceof Player) && e.getDamager().getCustomName() == name) { e.setDamage(e.getDamage() + damage); } if ((e.getDamager() instanceof Snowball) && (((Snowball) e.getDamager()).getShooter() instanceof Player) && e.getDamager().getCustomName() == name) { e.setDamage(e.getDamage() + damage); } }
@Override public @Nullable ProjectileModule parse(MapModuleContext context, Logger logger, Document doc) throws InvalidXMLException { final ItemParser itemParser = context.needModule(ItemParser.class); FilterParser filterParser = context.needModule(FilterParser.class); for(Element projectileElement : XMLUtils.flattenElements(doc.getRootElement(), "projectiles", "projectile")) { String name = projectileElement.getAttributeValue("name"); Double damage = XMLUtils.parseNumber(projectileElement.getAttribute("damage"), Double.class, (Double) null); double velocity = XMLUtils.parseNumber(Node.fromChildOrAttr(projectileElement, "velocity"), Double.class, 1.0); ClickAction clickAction = XMLUtils.parseEnum(Node.fromAttr(projectileElement, "click"), ClickAction.class, "click action", ClickAction.BOTH); Class<? extends Entity> entity = XMLUtils.parseEntityTypeAttribute(projectileElement, "projectile", Arrow.class); List<PotionEffect> potionKit = itemParser.parsePotionEffects(projectileElement); Filter destroyFilter = filterParser.parseOptionalProperty(projectileElement, "destroy-filter").orElse(null); Duration coolDown = XMLUtils.parseDuration(projectileElement.getAttribute("cooldown")); boolean throwable = XMLUtils.parseBoolean(projectileElement.getAttribute("throwable"), true); context.features().define(projectileElement, new ProjectileDefinitionImpl(name, damage, velocity, clickAction, entity, potionKit, destroyFilter, coolDown, throwable)); } return null; }
@EventHandler public void onBowShot(EntityShootBowEvent e) { if (e.getEntity() instanceof Player && e.getProjectile() instanceof Arrow) { Bukkit.getScheduler().runTaskLater(this, () -> { if (!e.getProjectile().isDead()) { EntityTrail t = new EntityTrail(this, e.getProjectile(), new ScatteringSupplier(particles, new Vector3(2.0f, 1.0f, 2.0f), Vector3.ORIGIN, 5, 20, 1) , 1); trails.put(e.getProjectile(), t); t.begin(); } }, 5L); } }
@EventHandler public void onBowShot(EntityShootBowEvent e) { if (e.getEntity() instanceof Player && e.getProjectile() instanceof Arrow) { Bukkit.getScheduler().runTaskLater(this, () -> { if (!e.getProjectile().isDead()) { EntityTrail t = new EntityTrail(this, e.getProjectile(), new CircumferenceSupplier(particle, 1.2f, 0.9f, 0.0f, 1) .rotateY(tick -> tick * (2.0f * (float) Math.PI / 20)) , 1); trails.put(e.getProjectile(), t); t.begin(); } }, 5L); } }
/** * Switch players on arrow hit * * @param event Event instance */ @EventHandler(priority = EventPriority.LOWEST) public void onDamage(EntityDamageByEntityEvent event) { if (!event.isCancelled() && event.getDamager() instanceof Arrow && event.getEntity() instanceof Player) { ProjectileSource source = ((Arrow)event.getDamager()).getShooter(); if (source == null || !(source instanceof Player)) return; Player player = (Player)source; Location tmp = player.getLocation(); player.teleport(event.getEntity()); event.getEntity().teleport(tmp); } }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onDamage(EntityDamageByEntityEvent event) { Player player = null; if(!(event.getDamager() instanceof Player)) { if(event.getDamager() instanceof Arrow) { Arrow arrow = (Arrow) event.getDamager(); if(arrow.getShooter() instanceof Player) { player = (Player) arrow.getShooter(); } }else return; }else player = (Player) event.getDamager(); if(player != null && (userManager.get(player.getUniqueId()).isFrozen() || (!options.modeDamage && modeCoordinator.isInMode(player.getUniqueId())))) { event.setCancelled(true); } }
@EventHandler public void onDamage(EntityDamageByEntityEvent event) { if ((event.getEntity() instanceof Player)) { if ((event.getDamager() instanceof Player)) { playerAttacksPlayer((Player) event.getEntity(), (Player) event.getDamager()); return; } if ((event.getDamager() instanceof Arrow)) { Arrow a = (Arrow) event.getDamager(); if ((a.getShooter() instanceof Player)) { playerAttacksPlayer((Player) event.getEntity(), (Player) a.getShooter()); return; } } this.n = null; } }
@EventHandler(priority = EventPriority.HIGHEST) public void onProjectileHit(EntityDamageByEntityEvent e){ Entity entity = e.getEntity(); Entity damager = e.getDamager(); if(entity != null && entity instanceof Player && damager.getType().equals(EntityType.ARROW)){ Player player = (Player) entity; if(isEnabled(player.getWorld())){ ProjectileSource shooter = ((Arrow) damager).getShooter(); if(shooter instanceof Player){ Player shootingPlayer = (Player) shooter; if(player.getUniqueId().equals(shootingPlayer.getUniqueId())){ e.setCancelled(true); debug("We cancelled your bow boost", player); } } } } }
@EventHandler public void onShotArrow(EntityShootBowEvent event) { if(event.getEntity() instanceof Player){ Player p = (Player)event.getEntity(); if(event.getProjectile() instanceof Arrow){ Arena a = am.getArena(p); if(a!=null){ if(a.isGame()){ SPlayer player = SPlayer.getDPlayer(p); player.addShots(1); } } } } }
@EventHandler(priority = EventPriority.NORMAL) public void onPlayerShoot(EntityDamageByEntityEvent evt) { Player damager = null; if (evt.getDamager() instanceof Arrow) { Arrow arrow = (Arrow)evt.getDamager(); if (arrow.getShooter() instanceof Player) { damager = (Player)arrow.getShooter(); } } else if (evt.getDamager() instanceof Player) { damager = (Player)evt.getDamager(); } if (damager != null && perkService.playerHasPerk(damager, ArcherTree.FindWeaknessId)) { if (evt.getEntity() instanceof LivingEntity) { LivingEntity le = (LivingEntity)evt.getEntity(); le.addPotionEffect(new PotionEffect(PotionEffectType.WEAKNESS, 5*20, 1)); } } }
@EventHandler public void onEntityDamageByEntity(EntityDamageByEntityEvent e) { if(!((e.getEntity() instanceof Player) && Main.getConfiguration().getBoolean("disable-spawn-command-in-pvp.enabled"))) return; final Player p = (Player) e.getEntity(); if(e.getDamager() instanceof Player) { pvp(p); pvp((Player) e.getDamager()); } else if((e.getDamager() instanceof Arrow) && (((Arrow) e.getDamager()).getShooter() instanceof Player)) { pvp(p); pvp((Player) ((Arrow) e.getDamager()).getShooter()); } }
private void hitByArrow(EntityDamageByEntityEvent event, BPPlayer bpDamager, Player damager, BPPlayer bpVictim, Player victim) { Arrow arrow = (Arrow) event.getDamager(); GameProperties damagerProps = bpDamager.getGameProperties(); CharacterType ct = damagerProps.getCharacterType(); if(ct == CharacterType.ARCHER) { Location damagerLocation = damager.getLocation(); Location victimLocation = victim.getLocation(); if(AbilityManager.isHeadshot(damagerLocation, victimLocation, arrow)) { String displayName = bpVictim.getPVPName(); event.setDamage(event.getDamage() * 2); AbilityManager.playHeadshotEffect(victim); damager.sendMessage(MessageType.PVP_HEADSHOT.getTranslation().getValue(displayName)); } } }
@EventHandler(ignoreCancelled=1, priority=EventPriority.MONITOR) public void onShoot(ProjectileLaunchEvent e) { Player player; Arrow arrow; if (e.getEntity() instanceof Arrow && (arrow = (Arrow)e.getEntity()).getShooter() != null && arrow.getShooter() instanceof Player && this.bowPull.containsKey((player = (Player)arrow.getShooter()).getUniqueId())) { Long time = System.currentTimeMillis() - this.bowPull.get(player.getUniqueId()); double power = arrow.getVelocity().length(); Long timeLimit = 300; int ping = this.getJanitor().lag.getPing(player); if (ping > 400) { timeLimit = 150; } if (power > 2.5 && time < timeLimit) { this.getJanitor().logCheat(this, player, null, new String[0]); } } }
@EventHandler(priority = EventPriority.NORMAL,ignoreCancelled = true)//确认不会把自己射中 public void OnEntityDamageByEntity(EntityDamageByEntityEvent e){ //System.out.print("监听到了被射中事件:\ndamager:"+e.getDamager().getType().toString()+ // "\n entityType:"+e.getEntityType().toString()+ // "\n entity:"+e.getEntity()); if (e.getDamager() != null//找得到伤害者 && e.getDamager().getType() == EntityType.ARROW//是箭 && ((Arrow) e.getDamager()).getShooter() instanceof Player//射击者是玩家 && e.getEntityType() == EntityType.PLAYER //被击中者是玩家 && isInList((Player)((Arrow) e.getDamager()).getShooter())//发出者在列表中 && isInList((Player)e.getEntity())//被击中者在列表中 && ((Arrow) e.getDamager()).getShooter() == e.getEntity()//是自己发出的 ) { //e.getEntity().setVelocity(e.getDamager().getVelocity()); //System.out.print("监听到了被射中事件2"); ((Player)e.getEntity()).sendMessage(ChatColor.RED+"你已达到最大射程,为了免得你摔死,你正在降落"); e.setCancelled(true); } }
@SuppressWarnings("deprecation") @Test public void testArrowDamage() { dut.start(); List<Player> damagers = dut.getSortedDamagers(player); assertEquals(0, damagers.size()); Arrow arrow = mock(Arrow.class); EntityDamageByEntityEvent damageEvent = new EntityDamageByEntityEvent(arrow, player, null, 5); dut.onEntityDamageByEntity(damageEvent); damagers = dut.getSortedDamagers(player); assertEquals(0, damagers.size()); when(arrow.getShooter()).thenReturn(d1); dut.onEntityDamageByEntity(damageEvent); damagers = dut.getSortedDamagers(player); assertEquals(1, damagers.size()); assertEquals(d1, damagers.get(0)); }
@EventHandler(priority = EventPriority.HIGHEST) public void onDamage(EntityDamageByEntityEvent ev) { if ((ev.getDamager() instanceof Player)) { Player pl = (Player)ev.getDamager(); // Is in game? if (this.am.isInGame(pl)) { if (((ev.getEntity() instanceof Villager)) || ((ev.getEntity() instanceof Player))) { // Cancel damage ev.setCancelled(true); } for (Arena a : this.am.arenas) { if (a.deadPlayers.contains(pl.getName())) { // Avoid damage by dead players ev.setCancelled(true); } } } } else if (ev.getDamager() instanceof Arrow){ // To avoid damage by arrow if (((ev.getEntity() instanceof Villager)) || ((ev.getEntity() instanceof Player))) { ev.setCancelled(true); } } }
@Override public void onDefense(EntityDamageByEntityEvent event) { double damage = event.getDamage(); damage -= this.defense; if (damage < 0.5) { damage = 0.0; Player player = null; if (event.getDamager() instanceof Arrow) { Arrow arrow = (Arrow)event.getDamager(); if (arrow.getShooter() instanceof Player) { player = (Player)arrow.getShooter(); } } else if (event.getDamager() instanceof Player){ player = (Player)event.getDamager(); } if (player != null) { CivMessage.send(player, CivColor.LightGray+"Our attack was ineffective"); } } event.setDamage(damage); }
@Override public void fire(Location turretLoc, Entity targetEntity) { if (!buildable.isValid()) { return; } Location playerLoc = targetEntity.getLocation(); playerLoc.setY(playerLoc.getY()+1); //Target the head instead of feet. turretLoc = adjustTurretLocation(turretLoc, playerLoc); Vector dir = getVectorBetween(playerLoc, turretLoc).normalize(); Arrow arrow = buildable.getCorner().getLocation().getWorld().spawnArrow(turretLoc, dir, (float)power, 0.0f); arrow.setVelocity(dir.multiply(power)); if (buildable.getTown().getBuffManager().hasBuff(Buff.FIRE_BOMB)) { arrow.setFireTicks(1000); } CivCache.arrowsFired.put(arrow.getUniqueId(), new ArrowFiredCache(this, targetEntity, arrow)); }
@Override public CastResult onCast(User user, int power, String[] args) { final Player player = user.getPlayer(); final int amount = this.amount * power; Bukkit.getScheduler().runTaskTimer(Zephyrus.getPlugin(), new Runnable() { int shots = amount; @Override public void run() { if (shots > 0 && player.isOnline()) { player.launchProjectile(Arrow.class) .setMetadata("ignore_pickup", new FixedMetadataValue(Zephyrus.getPlugin(), true)); shots--; } } }, 1, 1); return CastResult.SUCCESS; }
public void resetEntities(final String chunk) { Bukkit.getScheduler().callSyncMethod(SurvivalGames.instance, new Callable<Void>() { @Override public Void call() { String[] split = chunk.split(","); Chunk c = world.getChunkAt(Integer.parseInt(split[0]), Integer.parseInt(split[1])); boolean l = c.isLoaded(); if(!l) c.load(); for(Entity e : c.getEntities()) { if(e instanceof Item || e instanceof LivingEntity || e instanceof Arrow) { e.remove(); } } if(!l) c.unload(); return null; } }); }
@EventHandler public void arrowDamager(EntityDamageByEntityEvent e) { // Making sure the entity that did the damage was an arrow if ((e.getDamager() instanceof Arrow) && (e.getEntity() instanceof Player)) { final Entity arrow = e.getDamager(); final Player p = (Player) e.getEntity(); // Sneaking changes height of the player's head final double headHeight = (p.isSneaking()) ? 1.46 : 1.62; if (arrow.getLocation().getY() > (p.getLocation().getY() + headHeight)) { // Replacing their pumpkin with air if (p.getInventory().getHelmet().getType() == Material.PUMPKIN) { p.getInventory().setHelmet(new ItemStack(Material.AIR)); // Refunding them the jack o lantern if (p.getInventory().firstEmpty() > -1) { p.getInventory().addItem(new ItemStack(Material.JACK_O_LANTERN, 1)); } else { p.getWorld().dropItem(p.getLocation(), new ItemStack(Material.JACK_O_LANTERN, 1)); } ((Player) ((Arrow) arrow).getShooter()).sendMessage(ChatColor.RED + "Headshot!"); } } } }
@EventHandler(ignoreCancelled = true) public void onEntityDamage(EntityDamageEvent event) { if (!(event instanceof EntityDamageByEntityEvent)) return; EntityDamageByEntityEvent subEvent = (EntityDamageByEntityEvent) event; Player attacker = null; Entity damageSource = subEvent.getDamager(); if (damageSource instanceof Player) { attacker = (Player) damageSource; } else if (damageSource instanceof Arrow || damageSource instanceof ThrownPotion) { Projectile proj = (Projectile) damageSource; if (proj.getShooter() instanceof Player) attacker = (Player) proj.getShooter(); } if (attacker != null) PlayerHelper.resetIdleTimer(attacker); }
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onEntityShootBow(EntityShootBowEvent event) { Entity projectile = event.getProjectile(); if (!(projectile instanceof Arrow)) { return; } ItemStack bow = event.getBow(); if (bow != null && bow.containsEnchantment(Enchantment.ARROW_INFINITE)) { projectile.setMetadata(mcMMO.infiniteArrowKey, mcMMO.metadataValue); } projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(plugin, Math.min(event.getForce() * AdvancedConfig.getInstance().getForceMultiplier(), 1.0))); projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(plugin, projectile.getLocation())); }
@Override public void effect(Event e, ItemStack item, int level) { EntityDamageByEntityEvent event = (EntityDamageByEntityEvent) e; Player damager = null; if(event.getDamager() instanceof Player) damager = (Player) event.getDamager(); else damager = (Player) ((Arrow) event.getDamager()).getShooter(); if(damager.getGameMode().equals(GameMode.CREATIVE)) return; double newHeal = ((Damageable) damager).getHealth() + heal + level; if(newHeal < ((Damageable) damager).getMaxHealth()) damager.setHealth(newHeal); else damager.setHealth(((Damageable) damager).getMaxHealth()); EffectManager.playSound(damager.getLocation(), "ENTITY_EXPERIENCE_ORB_PICKUP", 0.3f, 1f); }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void EntityDamageByEntityEvent(EntityDamageByEntityEvent e) { Entity damager = e.getDamager(); Entity damaged = e.getEntity(); // Block self damaging (Enderpearls cause weird behavior) if (damager.getUniqueId().equals(damaged.getUniqueId())) return; if (damaged instanceof Player) CEventHandler.handleEvent((Player) damaged, e, damageTaken); if (damager instanceof Player) CEventHandler.handleEvent((Player) damager, e, damageGiven); else if (damager instanceof Arrow) if (damager.hasMetadata("ce.bow.item") || damager.hasMetadata("ce.bow.enchantment")) CEventHandler.handleBows((Player) ((Projectile) damager).getShooter(), e); }
@Override public boolean use(Player player) { boolean containsBow = false; for (ItemStack item : player.getInventory().getContents()) { if (item != null) { if (item.getType() == Material.BOW) { containsBow = true; break; } } } if (containsBow) { if (player.getInventory().containsAtLeast(new ItemStack(Material.ARROW), 1) && player.getInventory().containsAtLeast(new ItemStack(Material.FERMENTED_SPIDER_EYE), 1)) { Plugin plugin = Bukkit.getServer().getServicesManager().getRegistration(SkillsPlugin.class).getProvider(); final Arrow arrow = player.launchProjectile(Arrow.class); arrow.setMetadata("isPoisonArrow", new FixedMetadataValue(plugin, true)); player.getInventory().removeItem(new ItemStack(Material.ARROW), new ItemStack(Material.FERMENTED_SPIDER_EYE)); return true; } else { player.sendMessage(ChatColor.RED + "You require a fermented spider eye and an arrow to create a poisoned arrow."); } } else { player.sendMessage(ChatColor.RED + "You require a bow to launch a poisoned arrow."); } return false; }
@Override public boolean use(Player player) { boolean containsBow = false; for (ItemStack item : player.getInventory().getContents()) { if (item != null) { if (item.getType() == Material.BOW) { containsBow = true; break; } } } if (containsBow) { if (player.getInventory().containsAtLeast(new ItemStack(Material.ARROW), 1)) { Arrow arrow = player.launchProjectile(Arrow.class); arrow.setMetadata("isPowerShot", new FixedMetadataValue(plugin, true)); player.getInventory().removeItem(new ItemStack(Material.ARROW)); return true; } else { player.sendMessage(ChatColor.RED + "You require an arrow."); } } else { player.sendMessage(ChatColor.RED + "You require a bow."); } return false; }
@Override public boolean use(Player player) { boolean containsBow = false; for (ItemStack item : player.getInventory().getContents()) { if (item != null) { if (item.getType() == Material.BOW) { containsBow = true; break; } } } if (containsBow) { if (player.getInventory().containsAtLeast(new ItemStack(Material.ARROW), 1)) { Arrow arrow = player.launchProjectile(Arrow.class); arrow.setMetadata("isRazorShot", new FixedMetadataValue(plugin, true)); player.getInventory().removeItem(new ItemStack(Material.ARROW)); return true; } else { player.sendMessage(ChatColor.RED + "You require an arrow."); } } else { player.sendMessage(ChatColor.RED + "You require a bow."); } return false; }
@Override public boolean use(Player player) { boolean containsBow = false; for (ItemStack item : player.getInventory().getContents()) { if (item != null) { if (item.getType() == Material.BOW) { containsBow = true; break; } } } if (containsBow) { if (player.getInventory().containsAtLeast(new ItemStack(Material.ARROW), 1)) { player.launchProjectile(Arrow.class); player.getInventory().removeItem(new ItemStack(Material.ARROW)); return true; } else { player.sendMessage(ChatColor.RED + "You require an arrow."); } } else { player.sendMessage(ChatColor.RED + "You require a bow."); } return false; }
@Override public boolean use(Player player) { boolean containsBow = false; for (ItemStack item : player.getInventory().getContents()) { if (item != null) { if (item.getType() == Material.BOW) { containsBow = true; break; } } } if (containsBow) { if (player.getInventory().containsAtLeast(new ItemStack(Material.ARROW), 1) && player.getInventory().containsAtLeast(new ItemStack(Material.STRING), 1)) { Plugin plugin = Bukkit.getServer().getServicesManager().getRegistration(SkillsPlugin.class).getProvider(); final Arrow arrow = player.launchProjectile(Arrow.class); arrow.setMetadata("isSnareShot", new FixedMetadataValue(plugin, true)); player.getInventory().removeItem(new ItemStack(Material.ARROW), new ItemStack(Material.STRING)); return true; } else { player.sendMessage(ChatColor.RED + "You require some string and an arrow to create a snare shot."); } } else { player.sendMessage(ChatColor.RED + "You require a bow to launch a snare shot."); } return false; }
@EventHandler public void onGrinchArrowHitPlayer(EntityDamageByEntityEvent e){ Entity e1 = e.getEntity(); Entity d1 = e.getDamager(); if(e.getEntity().getWorld().getName() != "Christmas"){ return; } if(e1 instanceof Player && d1 instanceof Arrow){ if(((Arrow)d1).getShooter() instanceof Giant){ Player hurt = (Player) e1; hurt.setFireTicks(hurt.getFireTicks() + 20); } } }
@EventHandler(priority = EventPriority.MONITOR) public void onEntityShootBow (EntityShootBowEvent event) { if ( ! (event.getEntity() instanceof Player)) return; if (plugin.getConfig().getBoolean("general.particle-trail") && event.getProjectile() instanceof Arrow) { plugin.addArrow((Arrow) event.getProjectile()); plugin.updateEffectMaker(); } Player player = (Player) event.getEntity(); if ( !player.hasPermission("headshot.bypass.reload-time")) { long cooldown = plugin.getConfig().getLong("general.reload-time", 0) * 50; if (cooldown == 0) return; plugin.setCooldown(player, System.currentTimeMillis() + cooldown); } }
@EventHandler(priority = EventPriority.MONITOR) public void onProjectileLaunch (ProjectileLaunchEvent event) { if ( ! (event.getEntity() instanceof Arrow) || ! (event.getEntity().getShooter() instanceof Player)) return; if ( ((Player) event.getEntity().getShooter()) .hasPermission("headshot")) { event.getEntity() .setMetadata( "spawn-location", new FixedMetadataValue(plugin, event.getEntity() .getLocation())); } }
@Override public void run () { Iterator<Arrow> iter = arrows.iterator(); while (iter.hasNext()) { Arrow arrow = iter.next(); if (arrow.isOnGround() || arrow.isDead()) { iter.remove(); continue; } arrow.getWorld().playEffect(arrow.getLocation(), Effect.MOBSPAWNER_FLAMES, 0, 256); } updateEffectMaker(); }
@Override public void rightClick(Player player) { long cooldown; RPGValue value = RPGValue.get(player, item, "arrow.cooldown"); if (value == null) { cooldown = System.currentTimeMillis() / 50; value = new RPGValue(player, item, "arrow.cooldown", cooldown); } else { cooldown = value.asLong(); } if (cooldown <= System.currentTimeMillis() / 50) { value.set(System.currentTimeMillis() / 50 + cooldownTime); player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f); Arrow arrow = player.launchProjectile(Arrow.class); Events.removeArrows.put(arrow.getEntityId(), (byte) 1); } else { player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); } }
@EventHandler(priority = EventPriority.HIGH) private void onEntityShootBow(EntityShootBowEvent event) { // Return for disabled world if (Zones.inNoDemigodsZone(event.getEntity().getLocation())) return; // If they right clicked a block with the ITEM in hand, do stuff if (Items.areEqual(event.getBow(), ITEM)) { PlayerInventory inventory = null; Arrow startArrow = (Arrow) event.getProjectile(); startArrow.setVelocity(startArrow.getVelocity().multiply(.8)); if (event.getEntity() instanceof Player) inventory = ((Player) event.getEntity()).getInventory(); for (int i = 1; i < 3; i++) { if (inventory != null) { if (!inventory.contains(Material.ARROW, 1)) break; inventory.remove(new ItemStack(Material.ARROW, 1)); } Arrow spawnedArrow = (Arrow) event.getEntity().getWorld().spawnEntity(startArrow.getLocation(), EntityType.ARROW); spawnedArrow.setShooter(event.getEntity()); spawnedArrow.setVelocity(startArrow.getVelocity().multiply(.9 / i)); } } }