下面列出了怎么用org.bukkit.entity.Projectile的API类实例代码及写法,或者点击链接到github查看源代码。
@EventHandler(ignoreCancelled = true)
public void onBlock(MTEntityDamageByEntityEvent event) {
if (event.getPlayer().equals(event.getEvent().getDamager())) return; //Player is attacking
if (event.getEvent().getDamager() instanceof Projectile) return; //Not a melee hit
if (!event.isBlocking()) return;
if (!event.getPlayer().hasPermission("minetinker.modifiers.knockback.use")) return;
ItemStack shield = event.getTool();
if (!ToolType.SHIELD.contains(shield.getType())) return; //Not the shield
int level = modManager.getModLevel(shield, this);
if (level <= 0) return;
//calculate vector
Vector vector = event.getEvent().getDamager().getLocation().subtract(event.getPlayer().getLocation()).toVector();
vector = vector.normalize().multiply(new Vector(1, 0, 1)).add(new Vector(0, 0.2, 0));
vector = vector.multiply(new Vector(level * 0.2, 1, level * 0.2));
event.getEntity().setVelocity(vector);
ChatWriter.logModifier(event.getPlayer(), event, this, shield,
String.format("Vector(%.2f/%.2f/%.2f)", vector.getX(), vector.getY(), vector.getZ()));
}
@EventHandler
public void minecartBreak(VehicleDestroyEvent e) {
Entity entity = e.getVehicle();
if (plugin.getLWC().isProtectable(e.getVehicle().getType())) {
int A = 50000 + entity.getUniqueId().hashCode();
LWC lwc = LWC.getInstance();
Protection protection = lwc.getPhysicalDatabase().loadProtection(entity.getWorld().getName(), A, A, A);
if ((((entity instanceof StorageMinecart)) || ((entity instanceof HopperMinecart)))
&& (protection != null)) {
if (e.getAttacker() instanceof Projectile) {
e.setCancelled(true);
}
Player p = (Player) e.getAttacker();
boolean canAccess = lwc.canAccessProtection(p, protection);
if (canAccess) {
protection.remove();
protection.removeAllPermissions();
protection.removeCache();
return;
}
e.setCancelled(true);
}
}
}
@Repeatable(scope = MatchScope.RUNNING)
public void tick() {
EntityUtils.entities(match.getWorld(), Projectile.class)
.filter(projectile -> projectile.hasMetadata(TRAIL_META))
.forEach(projectile -> {
if(projectile.isDead() || projectile.isOnGround()) {
projectile.removeMetadata(TRAIL_META, PGM.get());
} else {
final Color color = (Color) projectile.getMetadata(TRAIL_META, PGM.get()).value();
// Certain particles can have a specific color if:
// - Count is 0
// - Speed is 1
// - Delta vectors are RGB values from (0,1]
match.getWorld().spawnParticle(
Particle.REDSTONE,
projectile.getLocation(),
0,
rgbToParticle(color.getRed()),
rgbToParticle(color.getGreen()),
rgbToParticle(color.getBlue()),
1
);
}
});
}
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);
}
}
}
}
@Nullable
public static Object getShooter(final @Nullable Projectile p) {
if (p == null)
return null;
try {
return getShooter.invoke(p);
} catch (final IllegalAccessException e) {
assert false;
return null;
} catch (final IllegalArgumentException e) {
assert false;
return null;
} catch (final InvocationTargetException e) {
Skript.exception(e);
return null;
}
}
@Test
public void shouldAllowProjectileLaunchFromAuthedHuman() {
// given
Projectile projectile = mock(Projectile.class);
Player player = mock(Player.class);
given(projectile.getShooter()).willReturn(player);
ProjectileLaunchEvent event = mock(ProjectileLaunchEvent.class);
given(event.getEntity()).willReturn(projectile);
given(listenerService.shouldCancelEvent(player)).willReturn(false);
// when
listener.onProjectileLaunch(event);
// then
verify(listenerService).shouldCancelEvent(player);
verify(event, never()).setCancelled(anyBoolean());
}
@Override
public Relation compare(final DamageCause dc, final EntityData e) {
switch (dc) {
case ENTITY_ATTACK:
return Relation.get(e.isSupertypeOf(EntityData.fromClass(Entity.class)));
case PROJECTILE:
return Relation.get(e.isSupertypeOf(EntityData.fromClass(Projectile.class)));
case WITHER:
return Relation.get(e.isSupertypeOf(EntityData.fromClass(Wither.class)));
case FALLING_BLOCK:
return Relation.get(e.isSupertypeOf(EntityData.fromClass(FallingBlock.class)));
//$CASES-OMITTED$
default:
return Relation.NOT_EQUAL;
}
}
@EventHandler
public void onEntityExplodes(EntityExplodeEvent event) {
if (event.isCancelled()) {
return;
}
if (!SentinelPlugin.instance.preventExplosionBlockDamage) {
return;
}
if (event.getEntity() instanceof Projectile) {
ProjectileSource source = ((Projectile) event.getEntity()).getShooter();
if (source instanceof Entity) {
SentinelTrait sourceSentinel = SentinelUtilities.tryGetSentinel((Entity) source);
if (sourceSentinel != null) {
event.blockList().clear();
}
}
}
}
@EventHandler
public void onBlockIgnites(BlockIgniteEvent event) {
if (event.isCancelled()) {
return;
}
if (!SentinelPlugin.instance.preventExplosionBlockDamage) {
return;
}
if (event.getIgnitingEntity() instanceof Projectile) {
ProjectileSource source = ((Projectile) event.getIgnitingEntity()).getShooter();
if (source instanceof Entity) {
SentinelTrait sourceSentinel = SentinelUtilities.tryGetSentinel((Entity) source);
if (sourceSentinel != null) {
event.setCancelled(true);
}
}
}
}
@EventHandler(ignoreCancelled = true)
public void onDamagePlayer(ProjectileHitEvent event) {
if (event.getHitEntity() instanceof Player) {
Player player = (Player) event.getHitEntity();
Projectile projectile = event.getEntity();
Region r = RedProtect.get().rm.getTopRegion(projectile.getLocation());
double damage;
if (getConfig().getString("projectile-damage").endsWith("%")) {
damage = (player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue() / 100) * Double.valueOf(getConfig().getString("projectile-damage", "100%").replace("%", ""));
} else {
damage = getConfig().getInt("projectile-damage");
}
if (r != null && r.getFlagBool("killer-projectiles") && getConfig().getStringList("allowed-types").contains(projectile.getType().name())) {
player.setHealth(damage);
}
}
}
@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);
}
}
}
}
}
}
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled=true)
public void onLingeringPotionSplash(final LingeringPotionSplashEvent e) {
if (!IslandGuard.inWorld(e.getEntity().getLocation())) {
return;
}
// Try to get the shooter
Projectile projectile = (Projectile) e.getEntity();
if (projectile.getShooter() != null && projectile.getShooter() instanceof Player) {
UUID uuid = ((Player)projectile.getShooter()).getUniqueId();
// Store it and remove it when the effect is gone
thrownPotions.put(e.getAreaEffectCloud().getEntityId(), uuid);
plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable() {
@Override
public void run() {
thrownPotions.remove(e.getAreaEffectCloud().getEntityId());
}}, e.getAreaEffectCloud().getDuration());
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onItemFrameDamage(final EntityDamageByEntityEvent e) {
// Check world
if (!inWorld(e.getEntity()) || !(e.getEntity() instanceof ItemFrame)) {
return;
}
if (e.getDamager() instanceof Projectile) {
if (DEBUG)
plugin.getLogger().info("DEBUG: Projectile damage to itemframe");
// Find out who fired the arrow
Projectile p = (Projectile) e.getDamager();
if (DEBUG)
plugin.getLogger().info("DEBUG: Shooter is " + p.getShooter().toString());
if (p.getShooter() instanceof Skeleton || p.getShooter() instanceof Golem) {
if (DEBUG)
plugin.getLogger().info("DEBUG: Shooter is mob");
if (!Settings.allowMobDamageToItemFrames) {
if (DEBUG)
plugin.getLogger().info("DEBUG: Damage not allowed, cancelling");
e.setCancelled(true);
}
}
}
}
@Override
public void effect(Event e, ItemStack item, final int level) {
if(e instanceof EntityDamageByEntityEvent) {
EntityDamageByEntityEvent event = (EntityDamageByEntityEvent) e;
Entity target = event.getEntity();
if(!(target instanceof Player))
return;
Player p = (Player) ((Projectile) event.getDamager()).getShooter();
Material bountyDrop = getBounty();
for(int i = 10; i>0; i--) {
p.getWorld().playEffect(p.getLocation(), Effect.COLOURED_DUST, 10);
p.getWorld().playEffect(target.getLocation(), Effect.COLOURED_DUST, 10);
}
p.getInventory().addItem(new ItemStack(bountyDrop, Tools.random.nextInt(MaximumBounty+level)+1));
p.sendMessage(ChatColor.GOLD + "You have collected a bounty on " + target.getName() + "!");
this.generateCooldown(p, Cooldown);
}
}
@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);
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onEntityDamage(EntityDamageByEntityEvent event) {
if (!(event.getEntity() instanceof Player)) return;
Player player = (Player) event.getEntity();
double finalHealth = player.getHealth() - event.getFinalDamage();
if (finalHealth > 0.01) return;
player.setMaxHealth(20);
player.setHealth(player.getMaxHealth());
event.setDamage(1);
player.setLastDamageCause(event);
if (event.getActor() instanceof Player) {
killPlayer(player, (Player)event.getActor(), event.getCause());
} else if (event.getActor() instanceof Projectile && ((Projectile) event.getActor()).getShooter() instanceof Player) {
killPlayer(player, (Player)((Projectile) event.getActor()).getShooter(), event.getCause());
} else {
killPlayer(player, null, event.getCause());
}
}
@EventHandler(priority = EventPriority.NORMAL)
public void onHit(EntityDamageByEntityEvent event) {
final Entity damager = event.getDamager();
if (!event.isCancelled()
|| event.getCause() != EntityDamageEvent.DamageCause.PROJECTILE
|| !(damager instanceof Projectile)
|| !damager.hasMetadata(METADATA_KEY)) return;
final Player shooter = (Player) ((Projectile) damager).getShooter();
if (match.getParticipant(shooter) == null) return;
damager.remove();
shooter.getInventory().addItem(new ItemStack(Material.ARROW));
}
@Override
public void onEvent(EntityDamageEvent event) {
super.onEvent(event);
if (event.getEntity() == this.labelEntity) {
event.setCancelled(true);
if (event instanceof EntityDamageByEntityEvent
&& ((EntityDamageByEntityEvent) event).getDamager() instanceof Projectile) {
((EntityDamageByEntityEvent) event).getDamager().remove();
}
}
}
@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);
}
}
@EventHandler(priority = EventPriority.LOW)
public void onEntityDamageEvent(EntityDamageByEntityEvent event) {
if (!enabled) return;
if (event.getDamager() instanceof Projectile && ((Projectile) event.getDamager()).getShooter() == event.getEntity()){
event.setCancelled(true);
}
}
@EventHandler
public void onEntityShootBowEvent(EntityShootBowEvent event) {
if (!projectile.equals(EntityType.ARROW) || velocityMod != 1.0) {
Vector vector = event.getProjectile().getVelocity();
event.setProjectile(GameHandler.getGameHandler().getMatchWorld().spawnEntity(event.getProjectile().getLocation(), projectile));
((Projectile) event.getProjectile()).setShooter(event.getEntity());
event.getProjectile().setVelocity(vector.multiply(velocityMod));
event.getProjectile().setMetadata("custom", new FixedMetadataValue(GameHandler.getGameHandler().getPlugin(), true));
}
}
private void createParticlesFor(Projectile projectile, Player player) {
TeamModule team = Teams.getTeamByPlayer(player).orNull();
if (team != null) {
ProjectileParticleRunnable runnable = new ProjectileParticleRunnable(projectile, team.getColor());
int newTask = Bukkit.getScheduler().scheduleSyncRepeatingTask(Cardinal.getInstance(), runnable, 1L, 1L);
runnable.setTask(newTask);
tasks.add(newTask);
}
}
@EventHandler
public void onEntityHitByProjectile(EntityDamageByEntityEvent event) {
if (event.isCancelled()) return;
if (event.getCause().equals(DamageCause.PROJECTILE)) {
ProjectileSource source = ((Projectile) event.getDamager()).getShooter();
if (source instanceof Player) {
((Player) source).playSound(((Player) source).getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 0.2F, 0.5F);
}
if (event.getDamager().getType().equals(projectile) && event.getDamager().hasMetadata("custom")) {
Entity arrow = event.getEntity().getWorld().spawnEntity(event.getDamager().getLocation(), EntityType.ARROW);
((Projectile) arrow).setShooter(source);
arrow.setVelocity(event.getDamager().getVelocity());
event.getDamager().remove();
if (event.getEntity() instanceof LivingEntity) {
for (PotionEffect effect : potionEffects) {
((LivingEntity) event.getEntity()).addPotionEffect(effect);
}
final Entity entity = event.getEntity();
Bukkit.getServer().getScheduler().runTaskLater(GameHandler.getGameHandler().getPlugin(), new Runnable() {
@Override
public void run() {
((LivingEntity) entity).setArrowsStuck(((LivingEntity) entity).getArrowsStuck() - 1);
}
}, 0);
}
}
}
}
public static Player getAttackerInDamageEvent(EntityDamageByEntityEvent e) {
if (e.getDamager() instanceof Player) {
return (Player) e.getDamager();
} else if (e.getDamager() instanceof Projectile && ((Projectile) e.getDamager()).getShooter() instanceof Player) {
return (Player) ((Projectile) e.getDamager()).getShooter();
} else {
return null;
}
}
@EventHandler
public void hangingBreakByEvent(HangingBreakByEntityEvent event) {
Entity entity = event.getEntity();
if (plugin.getLWC().isProtectable(event.getEntity().getType())) {
int A = 50000 + entity.getUniqueId().hashCode();
LWC lwc = LWC.getInstance();
Protection protection = lwc.getPhysicalDatabase().loadProtection(entity.getWorld().getName(), A, A, A);
if (event.getRemover() instanceof Projectile && protection != null) {
event.setCancelled(true);
}
if (event.getRemover() instanceof Player) {
Player p = (Player) event.getRemover();
if (p.hasPermission("lwc.lockentity." + entity.getType()) || p.hasPermission("lwc.lockentity.all")) {
if (onPlayerEntityInteract(p, entity, event.isCancelled())) {
event.setCancelled(true);
}
}
if (!event.isCancelled() && protection != null) {
boolean canAccess = lwc.canAccessProtection(p, protection);
if (canAccess) {
protection.remove();
protection.removeAllPermissions();
protection.removeCache();
return;
}
event.setCancelled(true);
}
}
}
}
@EventHandler
public void itemFrameItemRemoval(EntityDamageByEntityEvent e) {
if (e.isCancelled())
return;
Entity entity = e.getEntity();
if (plugin.getLWC().isProtectable(e.getEntity().getType())) {
int A = 50000 + entity.getUniqueId().hashCode();
LWC lwc = LWC.getInstance();
Protection protection = lwc.getPhysicalDatabase().loadProtection(entity.getWorld().getName(), A, A, A);
if (!(entity instanceof Player)) {
if (e.getDamager() instanceof Projectile) {
if (protection != null) {
e.setCancelled(true);
}
if ((((entity instanceof StorageMinecart)) || ((entity instanceof HopperMinecart)))
&& (protection != null)) {
e.setCancelled(true);
}
}
if (e.getDamager() instanceof Player) {
Player p = (Player) e.getDamager();
if (protection != null && !lwc.canAccessProtection(p, protection)) {
e.setCancelled(true);
}
if (p.hasPermission("lwc.lockentity." + e.getEntityType())
|| p.hasPermission("lwc.lockentity.all")) {
if (onPlayerEntityInteract(p, entity, e.isCancelled())) {
e.setCancelled(true);
}
}
if ((((entity instanceof StorageMinecart)) || ((entity instanceof HopperMinecart)))
&& (protection != null)) {
e.setCancelled(true);
}
}
}
}
}
@Override
public void onEvent(EntityDamageEvent event) {
super.onEvent(event);
if(event.getEntity() == this.labelEntity) {
event.setCancelled(true);
if(event instanceof EntityDamageByEntityEvent && ((EntityDamageByEntityEvent) event).getDamager() instanceof Projectile) {
((EntityDamageByEntityEvent) event).getDamager().remove();
}
}
}
@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());
}
}
});
}
@EventHandler
public void onProjectileHitEvent(ProjectileHitEvent event) {
final Projectile projectile = event.getEntity();
final ProjectileDefinition projectileDefinition = Projectiles.getProjectileDefinition(projectile);
if(projectileDefinition == null) return;
final Filter filter = projectileDefinition.destroyFilter();
if(filter == null) return;
final BlockIterator blockIterator = new BlockIterator(projectile.getWorld(), projectile.getLocation().toVector(), projectile.getVelocity().normalize(), 0d, 2);
Block hitBlock = null;
while(blockIterator.hasNext()) {
hitBlock = blockIterator.next();
if(hitBlock.getType() != Material.AIR) break;
}
if(hitBlock != null) {
final MatchPlayer shooter = projectile.getShooter() instanceof Player ? getMatch().getPlayer((Player) projectile.getShooter()) : null;
final IQuery query = shooter != null ? new PlayerBlockEventQuery(shooter, event, hitBlock.getState())
: new BlockEventQuery(event, hitBlock);
if(filter.query(query).isAllowed()) {
final BlockTransformEvent bte = new BlockTransformEvent(event, hitBlock, Material.AIR);
match.callEvent(bte);
if(!bte.isCancelled()) {
hitBlock.setType(Material.AIR);
projectile.remove();
}
}
}
}