类org.bukkit.entity.Arrow源码实例Demo

下面列出了怎么用org.bukkit.entity.Arrow的API类实例代码及写法,或者点击链接到github查看源代码。

源代码1 项目: ProjectAres   文件: ProjectileModule.java
@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;
}
 
源代码2 项目: UhcCore   文件: PlayerDamageListener.java
private void handleArrow(EntityDamageByEntityEvent event){

		PlayersManager pm = GameManager.getGameManager().getPlayersManager();
		
		if(event.getEntity() instanceof Player && event.getDamager() instanceof Arrow){
			Projectile arrow = (Projectile) event.getDamager();
			final Player shot = (Player) event.getEntity();
			if(arrow.getShooter() instanceof Player){
				
				if(!GameManager.getGameManager().getPvp()){
					event.setCancelled(true);
					return;
				}

				UhcPlayer uhcDamager = pm.getUhcPlayer((Player) arrow.getShooter());
				UhcPlayer uhcDamaged = pm.getUhcPlayer(shot);

				if(!friendlyFire && uhcDamager.getState().equals(PlayerState.PLAYING) && uhcDamager.isInTeamWith(uhcDamaged)){
					uhcDamager.sendMessage(Lang.PLAYERS_FF_OFF);
					event.setCancelled(true);
				}
			}
		}
	}
 
源代码3 项目: RedProtect   文件: Compat19.java
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent e) {
    // Deny arrow booster
    Region r = RedProtect.get().rm.getTopRegion(e.getEntity().getLocation());
    if (r == null && e.getEntity() instanceof Player && e.getDamager() instanceof Arrow) {
        Player p = (Player) e.getEntity();
        Arrow arrow = (Arrow)e.getDamager();
        if (arrow.getShooter() instanceof Player && p.isGliding()) {
            if (arrow.getShooter().equals(p) && !p.hasPermission("redprotect.bypass.glide") &&
                    !RedProtect.get().config.globalFlagsRoot().worlds.get(p.getWorld().getName()).player_glide.allow_boost) {
                e.setCancelled(true);
                arrow.remove();
                RedProtect.get().lang.sendMessage(p, "globallistener.elytra.cantboost");
            }
        }
    }
}
 
源代码4 项目: SkyWarsReloaded   文件: ParticleEffectListener.java
@EventHandler
public void projectileLaunch(ProjectileLaunchEvent e) {
	 Projectile projectile = e.getEntity();
	 if (projectile instanceof Snowball || projectile instanceof Egg || projectile instanceof Arrow) {
		 if (projectile.getShooter() instanceof Player) {
			 Player player = (Player) projectile.getShooter();
			 GameMap gMap = MatchManager.get().getPlayerMap(player);
			 if (gMap != null) {
			 	PlayerStat ps = PlayerStat.getPlayerStats(player.getUniqueId());
			 	if (ps != null) {
                       String key = ps.getProjectileEffect();
                       ProjectileEffectOption peo = (ProjectileEffectOption) ProjectileEffectOption.getPlayerOptionByKey(key);
                       if (peo != null) {
                           List<ParticleEffect> effects = peo.getEffects();
                           if (key != null && effects != null) {
                               if (!key.equalsIgnoreCase("none")) {
                                   SkyWarsReloaded.getOM().addProjectile(projectile, effects);
                               }
                           }
                       }
                   }
			 }
		 }
	 }
}
 
源代码5 项目: civcraft   文件: ProjectileArrowComponent.java
@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));
}
 
源代码6 项目: Slimefun4   文件: GrapplingHookListener.java
public void addGrapplingHook(Player p, Arrow arrow, Bat bat, boolean dropItem, long despawnTicks) {
    GrapplingHookEntity hook = new GrapplingHookEntity(p, arrow, bat, dropItem);
    UUID uuid = p.getUniqueId();

    activeHooks.put(uuid, hook);

    // To fix issue #253
    Slimefun.runSync(() -> {
        GrapplingHookEntity entity = activeHooks.get(uuid);

        if (entity != null) {
            SlimefunPlugin.getBowListener().getProjectileData().remove(uuid);
            entity.remove();

            Slimefun.runSync(() -> {
                activeHooks.remove(uuid);
                invulnerability.remove(uuid);
            }, 20L);
        }
    }, despawnTicks);
}
 
源代码7 项目: ce   文件: CEListener.java
@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);

}
 
源代码8 项目: PGM   文件: ModifyBowProjectileModule.java
@Override
public ModifyBowProjectileModule parse(MapFactory factory, Logger logger, Document doc)
    throws InvalidXMLException {
  boolean changed = false;
  Class<? extends Entity> projectile = Arrow.class;
  float velocityMod = 1;
  Set<PotionEffect> potionEffects = new HashSet<>();

  for (Element parent : doc.getRootElement().getChildren("modifybowprojectile")) {
    if (factory.getProto().isNoOlderThan(MapProtos.FILTER_FEATURES)) {
      throw new InvalidXMLException(
          "Module is discontinued as of " + MapProtos.FILTER_FEATURES.toString(),
          doc.getRootElement().getChild("modifybowprojectile"));
    }

    Element projectileElement = parent.getChild("projectile");
    if (projectileElement != null) {
      projectile = XMLUtils.parseEntityType(projectileElement);
      changed = true;
    }

    Element velocityModElement = parent.getChild("velocityMod");
    if (velocityModElement != null) {
      velocityMod = XMLUtils.parseNumber(velocityModElement, Float.class);
      changed = true;
    }

    for (Element potionElement : parent.getChildren("potion")) {
      potionEffects.add(XMLUtils.parsePotionEffect(potionElement));
      changed = true;
    }
  }

  return !changed
      ? null
      : new ModifyBowProjectileModule(projectile, velocityMod, potionEffects);
}
 
源代码9 项目: PGM   文件: RageMatchModule.java
private boolean isRage(Entity damager) {
  if (damager instanceof Player) {
    Player player = (Player) damager;
    return player.getItemInHand().containsEnchantment(Enchantment.DAMAGE_ALL);
  } else if (damager instanceof Arrow) {
    Arrow arrow = (Arrow) damager; // Arrows with damage > 2 are from power bows.
    return arrow.getShooter() instanceof Player && arrow.spigot().getDamage() > 2.0D;
  }
  return false;
}
 
源代码10 项目: MineTinker   文件: Infinity.java
@EventHandler
public void onShoot(ProjectileLaunchEvent event) {
	if (!this.isAllowed()) return;

	Projectile arrow = event.getEntity();
	if (!(arrow instanceof Arrow)) return;

	if (!(arrow.getShooter() instanceof Player)) return;

	Player player = (Player) arrow.getShooter();
	if (!player.hasPermission("minetinker.modifiers.infinity.use")) return;

	ItemStack tool = player.getInventory().getItemInMainHand();

	if (!ToolType.CROSSBOW.contains(tool.getType())) return;

	if (!modManager.isToolViable(tool)) return;

	if (!modManager.hasMod(tool, this)) return;

	if(!((Arrow) arrow).hasCustomEffects()) {
		if (player.getInventory().addItem(new ItemStack(Material.ARROW, 1)).size() != 0) { //adds items to (full) inventory
			player.getWorld().dropItem(player.getLocation(), new ItemStack(Material.ARROW, 1)); //drops item when inventory is full
		} // no else as it gets added in if

		((Arrow) arrow).setPickupStatus(AbstractArrow.PickupStatus.CREATIVE_ONLY);
		ChatWriter.logModifier(player, event, this, tool);
	}
}
 
源代码11 项目: ProjectAres   文件: ModifyBowProjectileModule.java
public static ModifyBowProjectileModule parse(MapModuleContext context, Logger logger, Document doc) throws InvalidXMLException {
    boolean changed = false;
    Class<? extends Entity> projectile = Arrow.class;
    float velocityMod = 1;
    Set<PotionEffect> potionEffects = new HashSet<>();

    for(Element parent : doc.getRootElement().getChildren("modifybowprojectile")) {
        if(context.getProto().isNoOlderThan(ProtoVersions.FILTER_FEATURES)) {
            throw new InvalidXMLException("Module is discontinued as of " + ProtoVersions.FILTER_FEATURES.toString(), doc.getRootElement().getChild("modifybowprojectile"));
        }

        Element projectileElement = parent.getChild("projectile");
        if(projectileElement != null) {
            projectile = XMLUtils.parseEntityType(projectileElement);
            changed = true;
        }

        Element velocityModElement = parent.getChild("velocityMod");
        if(velocityModElement != null) {
            velocityMod = XMLUtils.parseNumber(velocityModElement, Float.class);
            changed = true;
        }

        for(Element elEffect : XMLUtils.getChildren(parent, "effect", "potion")) {
            potionEffects.add(XMLUtils.parsePotionEffect(elEffect));
            changed = true;
        }
    }

    return !changed ? null : new ModifyBowProjectileModule(projectile, velocityMod, potionEffects);
}
 
@EventHandler(priority = EventPriority.NORMAL)
public void handleFriendlyFire(EntityDamageByEntityEvent event) {
    if(event.isCancelled() && event.getDamager() instanceof Arrow) {
        Arrow arrow = (Arrow) event.getDamager();
        if(arrow.getPickupStatus() == Arrow.PickupStatus.ALLOWED && arrow.getShooter() != null && arrow.getShooter() instanceof Player){
            Player owner = (Player) arrow.getShooter();
            owner.getInventory().addItem(new ItemStack(Material.ARROW));
            arrow.remove();
        }
    }
}
 
源代码13 项目: ProjectAres   文件: ArcherySymptom.java
@Override
public void onShoot(ProjectileLaunchEvent event) {
    super.onShoot(event);

    if(event.getEntity() instanceof Arrow) {
        Arrow arrow = (Arrow) event.getEntity();
        arrow.setDamage(modifier.apply(arrow.getDamage()));
        arrow.setVelocity(arrow.getVelocity().multiply(modifier.apply(1d)));
    }
}
 
源代码14 项目: ProjectAres   文件: ProjectileTrailMatchModule.java
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onProjectileLaunch(ProjectileLaunchEvent event) {
    match.player(event.getActor()).ifPresent(shooter -> {
        final Projectile projectile = event.getEntity();
        projectile.setMetadata(TRAIL_META, new FixedMetadataValue(PGM.get(), shooter.getParty().getFullColor()));
        // Set critical metadata to false in order to remove default particle trail.
        // The metadata will be restored just before the arrow hits something.
        if(projectile instanceof Arrow) {
            final Arrow arrow = (Arrow) projectile;
            arrow.setMetadata(CRITICAL_META, new FixedMetadataValue(PGM.get(), arrow.isCritical()));
            arrow.setCritical(false);
        }
    });
}
 
源代码15 项目: ProjectAres   文件: ProjectileTrailMatchModule.java
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onProjectileHit(ProjectileHitEvent event) {
    match.player(event.getActor()).ifPresent(shooter -> {
        final Projectile projectile = event.getEntity();
        projectile.removeMetadata(TRAIL_META, PGM.get());
        // Restore critical metadata to arrows if applicable
        if(projectile instanceof Arrow) {
            final Arrow arrow = (Arrow) projectile;
            if(arrow.hasMetadata(CRITICAL_META)) {
                arrow.setCritical(arrow.getMetadata(CRITICAL_META, PGM.get()).asBoolean());
            }
        }
    });
}
 
源代码16 项目: ProjectAres   文件: BlockTransformListener.java
@EventWrapper
public void onEntityChangeBlock(final EntityChangeBlockEvent event) {
    // Igniting TNT with an arrow is already handled from the ExplosionPrimeEvent
    if(event.getEntity() instanceof Arrow &&
       event.getBlock().getType() == Material.TNT &&
       event.getTo() == Material.AIR) return;

    callEvent(event, event.getBlock().getState(), BlockStateUtils.cloneWithMaterial(event.getBlock(), event.getToData()), entityResolver.getOwner(event.getEntity()));
}
 
源代码17 项目: ProjectAres   文件: RageMatchModule.java
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void handlePlayerDamage(EntityDamageByEntityEvent event) {
    if(event.getDamager() instanceof Player) {
        if(((Player) event.getDamager()).getItemInHand().containsEnchantment(Enchantment.DAMAGE_ALL)) event.setDamage(1000);
    } else if(event.getDamager() instanceof Arrow && ((Arrow) event.getDamager()).getShooter() instanceof Player) {
        if(((Arrow) event.getDamager()).getDamage() > 2D) event.setDamage(1000);
    }
}
 
源代码18 项目: Guilds   文件: EntityListener.java
/**
 * Handles flame arrows
 *
 * @param event
 */
@EventHandler
public void onFlameArrow(EntityCombustByEntityEvent event) {

    if (!(event.getEntity() instanceof Player))
        return;

    if (!(event.getCombuster() instanceof Arrow))
        return;

    Arrow arrow = (Arrow) event.getCombuster();

    if (!(arrow.getShooter() instanceof Player))
        return;

    Player damagee = (Player) event.getEntity();
    Player damager = (Player) arrow.getShooter();

    if (settingsManager.getProperty(GuildSettings.RESPECT_WG_PVP_FLAG)) {
        event.setCancelled(ClaimUtils.checkPvpDisabled(damagee));
        return;
    }

    if (guildHandler.isSameGuild(damagee, damager)) {
        arrow.setFireTicks(0);
        event.setCancelled(!settingsManager.getProperty(GuildSettings.GUILD_DAMAGE));
        return;
    }

    if (guildHandler.isAlly(damagee, damager)) {
        arrow.setFireTicks(0);
        event.setCancelled(!settingsManager.getProperty(GuildSettings.ALLY_DAMAGE));
    }
}
 
源代码19 项目: UhcCore   文件: SwitcherooListener.java
@EventHandler
public void onPlayerDamage(EntityDamageByEntityEvent e){
    if (!(e.getEntity() instanceof Player)){
        return;
    }

    Player player = ((Player) e.getEntity()).getPlayer();

    if (!(e.getDamager() instanceof Arrow)){
        return;
    }

    Arrow arrow = (Arrow) e.getDamager();

    if (!(arrow.getShooter() instanceof  Player)){
        return;
    }

    Player shooter = ((Player) arrow.getShooter()).getPlayer();

    if (player.equals(shooter)){
        return;
    }

    arrow.remove();

    Location playerLoc = player.getLocation();
    Location shooterLoc = shooter.getLocation();

    player.teleport(shooterLoc);
    shooter.teleport(playerLoc);

    player.sendMessage(Lang.SCENARIO_SWITCHEROO_SWITCH.replace("%player%", shooter.getName()));
    shooter.sendMessage(Lang.SCENARIO_SWITCHEROO_SWITCH.replace("%player%", player.getName()));
}
 
源代码20 项目: EliteMobs   文件: EliteMobs.java
@Override
public void onDisable() {

    Bukkit.getServer().getScheduler().cancelTasks(MetadataHandler.PLUGIN);

    EntityTracker.shutdownPurger();

    for (World world : validWorldList) {
        world.save();
    }

    /*
    Flush lingering arrows from the arrow tracking power
     */
    for (Arrow arrow : SkeletonTrackingArrow.trackingArrowList)
        arrow.remove();
    SkeletonTrackingArrow.trackingArrowList.clear();

    /*
    todo: Flush lingering blocks
     */


    CustomItemConstructor.customItemList.clear();
    CustomItemConstructor.staticCustomItemHashMap.clear();
    CustomItemConstructor.dynamicRankedItemStacks.clear();
    UniqueItemInitializer.uniqueItemsList.clear();
    validWorldList.clear();

    //save cached data
    Bukkit.getScheduler().cancelTask(PlayerData.databaseSyncTaskID);
    Bukkit.getLogger().info("[EliteMobs] Saving EliteMobs databases...");
    PlayerData.saveDatabases();
    Bukkit.getLogger().info("[EliteMobs] All saved! Good night.");
    PlayerData.clearPlayerData();

}
 
源代码21 项目: Thermos   文件: CraftEventFactory.java
/**
 * EntityShootBowEvent
 */
public static EntityShootBowEvent callEntityShootBowEvent(net.minecraft.entity.EntityLivingBase who, net.minecraft.item.ItemStack itemstack, net.minecraft.entity.projectile.EntityArrow entityArrow, float force) {
    LivingEntity shooter = (LivingEntity) who.getBukkitEntity();
    CraftItemStack itemInHand = CraftItemStack.asCraftMirror(itemstack);
    Arrow arrow = (Arrow) entityArrow.getBukkitEntity();

    if (itemInHand != null && (itemInHand.getType() == Material.AIR || itemInHand.getAmount() == 0)) {
        itemInHand = null;
    }

    EntityShootBowEvent event = new EntityShootBowEvent(shooter, itemInHand, arrow, force);
    Bukkit.getPluginManager().callEvent(event);

    return event;
}
 
源代码22 项目: FastAsyncWorldedit   文件: AsyncWorld.java
@Override
public Arrow spawnArrow(final Location location, final Vector direction, final float speed, final float spread) {
    return TaskManager.IMP.sync(new RunnableVal<Arrow>() {
        @Override
        public void run(Arrow value) {
            this.value = parent.spawnArrow(location, direction, speed, spread);
        }
    });
}
 
源代码23 项目: civcraft   文件: BlockListener.java
@EventHandler(priority = EventPriority.NORMAL)
public void onProjectileHitEvent(ProjectileHitEvent event) {
	if (event.getEntity() instanceof Arrow) {
		ArrowFiredCache afc = CivCache.arrowsFired.get(event.getEntity().getUniqueId());
		if (afc != null) {
			afc.setHit(true);
		}
	}

	if (event.getEntity() instanceof Fireball) {
		CannonFiredCache cfc = CivCache.cannonBallsFired.get(event.getEntity().getUniqueId());
		if (cfc != null) {

			cfc.setHit(true);

			FireworkEffect fe = FireworkEffect.builder().withColor(Color.RED).withColor(Color.BLACK).flicker(true).with(Type.BURST).build();

			Random rand = new Random();
			int spread = 30;
			for (int i = 0; i < 15; i++) {
				int x = rand.nextInt(spread) - spread/2;
				int y = rand.nextInt(spread) - spread/2;
				int z = rand.nextInt(spread) - spread/2;


				Location loc = event.getEntity().getLocation();
				Location location = new Location(loc.getWorld(), loc.getX(),loc.getY(), loc.getZ());
				location.add(x, y, z);

				TaskMaster.syncTask(new FireWorkTask(fe, loc.getWorld(), loc, 5), rand.nextInt(30));
			}

		}
	}
}
 
源代码24 项目: civcraft   文件: ArrowFiredCache.java
public ArrowFiredCache(ProjectileArrowComponent tower, Entity targetEntity, Arrow arrow) {
	this.setFromTower(tower);
	this.target = targetEntity.getLocation();
	this.targetEntity = targetEntity;
	this.setArrow(arrow);
	this.uuid = arrow.getUniqueId();
	expired = Calendar.getInstance();
	expired.add(Calendar.SECOND, 5);
}
 
源代码25 项目: Slimefun4   文件: SlimefunBowListener.java
@EventHandler
public void onBowUse(EntityShootBowEvent e) {
    if (e.getEntity() instanceof Player && e.getProjectile() instanceof Arrow) {
        SlimefunItem bow = SlimefunItem.getByItem(e.getBow());

        if (bow instanceof SlimefunBow) {
            projectiles.put(e.getProjectile().getUniqueId(), (SlimefunBow) bow);
        }
    }
}
 
源代码26 项目: Slimefun4   文件: SlimefunBowListener.java
@EventHandler
public void onArrowHit(ProjectileHitEvent e) {
    Slimefun.runSync(() -> {
        if (e.getEntity().isValid() && e.getEntity() instanceof Arrow) {
            projectiles.remove(e.getEntity().getUniqueId());
        }
    }, 4L);
}
 
源代码27 项目: Slimefun4   文件: SlimefunBowListener.java
@EventHandler
public void onArrowSuccessfulHit(EntityDamageByEntityEvent e) {
    if (e.getDamager() instanceof Arrow && e.getEntity() instanceof LivingEntity && e.getCause() != EntityDamageEvent.DamageCause.ENTITY_EXPLOSION) {
        SlimefunBow bow = projectiles.get(e.getDamager().getUniqueId());

        if (bow != null) {
            bow.callItemHandler(BowShootHandler.class, handler -> handler.onHit(e, (LivingEntity) e.getEntity()));
        }

        projectiles.remove(e.getDamager().getUniqueId());
    }
}
 
源代码28 项目: Slimefun4   文件: GrapplingHookListener.java
@EventHandler
public void onArrowHitEntity(EntityDamageByEntityEvent e) {
    if (!isEnabled()) {
        return;
    }

    if (e.getDamager() instanceof Arrow) {
        handleGrapplingHook((Arrow) e.getDamager());
    }
}
 
源代码29 项目: Slimefun4   文件: GrapplingHookListener.java
@EventHandler
public void onArrowHitSurface(ProjectileHitEvent e) {
    if (!isEnabled()) {
        return;
    }

    Slimefun.runSync(() -> {
        if (e.getEntity() instanceof Arrow) {
            handleGrapplingHook((Arrow) e.getEntity());
        }
    }, 2L);
}
 
源代码30 项目: Slimefun4   文件: GrapplingHookListener.java
@EventHandler
public void onArrowHitHanging(HangingBreakByEntityEvent e) {
    if (!isEnabled()) {
        return;
    }

    // This is called when the arrow shoots off a painting or an item frame
    if (e.getRemover() instanceof Arrow) {
        handleGrapplingHook((Arrow) e.getRemover());
    }
}
 
 类所在包
 同包方法