下面列出了怎么用org.bukkit.entity.Arrow的API类实例代码及写法,或者点击链接到github查看源代码。
@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;
}
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);
}
}
}
}
@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");
}
}
}
}
@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);
}
}
}
}
}
}
}
}
@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));
}
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);
}
@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 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);
}
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;
}
@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);
}
}
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();
}
}
}
@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)));
}
}
@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);
}
});
}
@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());
}
}
});
}
@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()));
}
@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);
}
}
/**
* 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));
}
}
@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()));
}
@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();
}
/**
* 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;
}
@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);
}
});
}
@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));
}
}
}
}
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);
}
@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);
}
}
}
@EventHandler
public void onArrowHit(ProjectileHitEvent e) {
Slimefun.runSync(() -> {
if (e.getEntity().isValid() && e.getEntity() instanceof Arrow) {
projectiles.remove(e.getEntity().getUniqueId());
}
}, 4L);
}
@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());
}
}
@EventHandler
public void onArrowHitEntity(EntityDamageByEntityEvent e) {
if (!isEnabled()) {
return;
}
if (e.getDamager() instanceof Arrow) {
handleGrapplingHook((Arrow) e.getDamager());
}
}
@EventHandler
public void onArrowHitSurface(ProjectileHitEvent e) {
if (!isEnabled()) {
return;
}
Slimefun.runSync(() -> {
if (e.getEntity() instanceof Arrow) {
handleGrapplingHook((Arrow) e.getEntity());
}
}, 2L);
}
@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());
}
}