Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@
+
+ // SPIGOT-7923: Avoid create projectiles with empty item
+ if (!singleItemStack.isEmpty()) {
+ Projectile projectile = Projectile.spawnProjectileUsingShoot(this.projectileItem.asProjectile(level, position, org.bukkit.craftbukkit.inventory.CraftItemStack.unwrap(event.getItem()), direction), level, singleItemStack, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), this.dispenseConfig.power(), this.dispenseConfig.uncertainty()); // Paper - track changed items in the dispense event; unwrap is safe here because all uses of the stack make their own copies
+ Projectile projectileEntity = this.projectileItem.asProjectile(level, position, org.bukkit.craftbukkit.inventory.CraftItemStack.unwrap(event.getItem()), direction);
+ Projectile projectile = Projectile.spawnProjectileUsingShoot(projectileEntity, level, singleItemStack, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), this.dispenseConfig.power(), io.papermc.paper.configuration.ProjectileUncertainty.resolve(projectileEntity.getType(), this.dispenseConfig.uncertainty())); // Paper - track changed items in the dispense event; configurable projectile uncertainty
+ projectile.projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource(source.blockEntity());
+ }
+ if (shrink) dispensed.shrink(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,24 @@
}

level.levelEvent(LevelEvent.PARTICLES_TRIAL_SPAWNER_SPAWN_ITEM, this.blockPosition(), 1);
@@ -92,7 +_,7 @@
@@ -92,16 +_,17 @@
ProjectileItem.DispenseConfig dispenseConfig = projectileItem.createDispenseConfig();
dispenseConfig.overrideDispenseEvent().ifPresent(event -> level.levelEvent(event, this.blockPosition(), 0));
Direction direction = Direction.DOWN;
- Projectile projectile = Projectile.spawnProjectileUsingShoot(
- projectileItem.asProjectile(level, this.position(), item, direction),
+ Projectile spawnedProjectile = projectileItem.asProjectile(level, this.position(), item, direction);
+ Projectile projectile = Projectile.spawnProjectileUsingShootDelayed( // Paper - fixes and addition to spawn reason API
projectileItem.asProjectile(level, this.position(), item, direction),
+ spawnedProjectile,
level,
item,
@@ -101,7 +_,7 @@
direction.getStepX(),
direction.getStepY(),
direction.getStepZ(),
dispenseConfig.power(),
dispenseConfig.uncertainty()
- dispenseConfig.uncertainty()
- );
+ io.papermc.paper.configuration.ProjectileUncertainty.resolve(spawnedProjectile.getType(), dispenseConfig.uncertainty()) // Paper - configurable projectile uncertainty
+ ).spawn(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.OMINOUS_ITEM_SPAWNER); // Paper - fixes and addition to spawn reason API
projectile.setOwner(this);
return projectile;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,9 @@
+ return super.getMaxTemper(); // Paper - Missing entity API; delegate to parent
}

+@@ -348,7 +_,7 @@
+ if (this.level() instanceof ServerLevel serverLevel) {
+ Projectile.spawnProjectileUsingShoot(spit, serverLevel, ItemStack.EMPTY, xd, yd + yo, zd, 1.5F, io.papermc.paper.configuration.ProjectileUncertainty.resolve(spit.getType(), 10.0F)); // Paper - configurable projectile uncertainty
+ }
+
@Override
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,22 @@
this.gameEvent(GameEvent.SHEAR, player);
itemStack.hurtAndBreak(1, player, hand.asEquipmentSlot());
}
@@ -151,9 +_,29 @@
@@ -124,7 +_,7 @@
Projectile.spawnProjectile(
new Snowball(serverLevel, this, itemStack),
serverLevel,
itemStack,
- projectile -> projectile.shoot(xd, yd + yo - projectile.getY(), zd, 1.6F, 12.0F)
+ projectile -> projectile.shoot(xd, yd + yo - projectile.getY(), zd, 1.6F, io.papermc.paper.configuration.ProjectileUncertainty.resolve(projectile.getType(), 12.0F)) // Paper - configurable projectile uncertainty
);
}

this.playSound(SoundEvents.SNOW_GOLEM_SHOOT, 1.0F, 0.4F / (this.getRandom().nextFloat() * 0.4F + 0.8F));
}

@Override
protected InteractionResult mobInteract(final Player player, final InteractionHand hand) {
@@ -151,9 +_,29 @@
public void shear(final ServerLevel level, final SoundSource soundSource, final ItemStack tool) {
+ // Paper start - custom shear drops
+ this.shear(level, soundSource, tool, this.generateDefaultDrops(level, tool));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,5 +80,5 @@
+ itemStack = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getPotion());
+ // Paper end - WitchThrowPotionEven
Projectile.spawnProjectileUsingShoot(
ThrownSplashPotion::new, serverLevel, itemStack, this, xd, yd + dist * 0.2, zd, dist <= 2.0 ? 0.45F : 0.75F, 8.0F
ThrownSplashPotion::new, serverLevel, itemStack, this, xd, yd + dist * 0.2, zd, dist <= 2.0 ? 0.45F : 0.75F, io.papermc.paper.configuration.ProjectileUncertainty.resolve(net.minecraft.world.entity.EntityTypes.SPLASH_POTION, 8.0F) // Paper - configurable projectile uncertainty
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
--- a/net/minecraft/world/entity/monster/breeze/Shoot.java
+++ b/net/minecraft/world/entity/monster/breeze/Shoot.java
@@ -93,7 +_,7 @@
double yd = target.getY(target.isPassenger() ? 0.8 : 0.3) - breeze.getFiringYPosition();
double zd = target.getZ() - breeze.getZ();
Projectile.spawnProjectileUsingShoot(
- new BreezeWindCharge(breeze, level), level, ItemStack.EMPTY, xd, yd, zd, 0.7F, 5 - level.getDifficulty().getId() * 4
+ new BreezeWindCharge(breeze, level), level, ItemStack.EMPTY, xd, yd, zd, 0.7F, io.papermc.paper.configuration.ProjectileUncertainty.resolve(net.minecraft.world.entity.EntityTypes.BREEZE_WIND_CHARGE, 5 - level.getDifficulty().getId() * 4) // Paper - configurable projectile uncertainty
);
breeze.playSound(SoundEvents.BREEZE_SHOOT, 1.5F, 1.0F);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
if (this.level() instanceof ServerLevel serverLevel) {
- Projectile.spawnProjectileUsingShoot(
+ Projectile.Delayed<AbstractArrow> delayedEntity = Projectile.spawnProjectileUsingShootDelayed( // Paper - delayed
arrow, serverLevel, projectile, xd, yd + distanceToTarget * 0.2F, zd, 1.6F, 14 - serverLevel.getDifficulty().getId() * 4
arrow, serverLevel, projectile, xd, yd + distanceToTarget * 0.2F, zd, 1.6F, io.papermc.paper.configuration.ProjectileUncertainty.resolve(arrow.getType(), 14 - serverLevel.getDifficulty().getId() * 4) // Paper - configurable projectile uncertainty
);
+
+ // Paper start - call EntityShootBowEvent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
if (this.level() instanceof ServerLevel serverLevel) {
- Projectile.spawnProjectileUsingShoot(
+ Projectile.Delayed<AbstractArrow> delayedEntity = Projectile.spawnProjectileUsingShootDelayed( // Paper - delayed
arrow, serverLevel, projectile, xd, yd + distanceToTarget * 0.2F, zd, 1.6F, 14 - serverLevel.getDifficulty().getId() * 4
arrow, serverLevel, projectile, xd, yd + distanceToTarget * 0.2F, zd, 1.6F, io.papermc.paper.configuration.ProjectileUncertainty.resolve(arrow.getType(), 14 - serverLevel.getDifficulty().getId() * 4) // Paper - configurable projectile uncertainty
);
+
+ // Paper start - call EntityShootBowEvent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,10 @@
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true));
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Axolotl.class, true, false));
this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR));
@@ -288,7 +_,7 @@
if (this.level() instanceof ServerLevel serverLevel) {
Projectile.spawnProjectileUsingShoot(
- trident, serverLevel, tridentItemStack, xd, yd + distanceToTarget * 0.2F, zd, 1.6F, 14 - this.level().getDifficulty().getId() * 4
+ trident, serverLevel, tridentItemStack, xd, yd + distanceToTarget * 0.2F, zd, 1.6F, io.papermc.paper.configuration.ProjectileUncertainty.resolve(trident.getType(), 14 - this.level().getDifficulty().getId() * 4) // Paper - configurable projectile uncertainty
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,15 @@
List<ItemStack> firedProjectiles = draw(itemStack, projectile, player);
if (level instanceof ServerLevel serverLevel && !firedProjectiles.isEmpty()) {
- this.shoot(serverLevel, player, player.getUsedItemHand(), itemStack, firedProjectiles, pow * 3.0F, 1.0F, pow == 1.0F, null);
+ this.shoot(serverLevel, player, player.getUsedItemHand(), itemStack, firedProjectiles, pow * 3.0F, 1.0F, pow == 1.0F, null, pow); // Paper - Pass draw strength
+ this.shoot(serverLevel, player, player.getUsedItemHand(), itemStack, firedProjectiles, pow * 3.0F, 1.0F, pow == 1.0F, null, pow); // Paper - Pass draw strength
}

level.playSound(
@@ -68,7 +_,7 @@
final @Nullable LivingEntity targetOverrride
) {
- projectileEntity.shootFromRotation(shooter, shooter.getXRot(), shooter.getYRot() + angle, 0.0F, power, uncertainty);
+ projectileEntity.shootFromRotation(shooter, shooter.getXRot(), shooter.getYRot() + angle, 0.0F, power, io.papermc.paper.configuration.ProjectileUncertainty.resolve(projectileEntity.getType(), uncertainty)); // Paper - configurable projectile uncertainty
}

public static float getPowerForTime(final int timeHeld) {
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@
}

Projectile projectileEntity = super.createProjectile(level, shooter, heldItem, projectile, isCrit);
@@ -130,7 +_,7 @@
}

- projectileEntity.shoot(shotVector.x(), shotVector.y(), shotVector.z(), power, uncertainty);
+ projectileEntity.shoot(shotVector.x(), shotVector.y(), shotVector.z(), power, io.papermc.paper.configuration.ProjectileUncertainty.resolve(projectileEntity.getType(), uncertainty)); // Paper - configurable projectile uncertainty
float soundPitch = getShotPitch(livingEntity.getRandom(), index);
livingEntity.level()
.playSound(
@@ -187,7 +_,7 @@
if (level instanceof ServerLevel serverLevel) {
ChargedProjectiles charged = weapon.set(DataComponents.CHARGED_PROJECTILES, ChargedProjectiles.EMPTY);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
- Projectile.spawnProjectileFromRotation(ThrownEgg::new, serverLevel, itemStack, player, 0.0F, 1.5F, 1.0F);
- }
+ // Paper start
+ final Projectile.Delayed<ThrownEgg> thrownEgg = Projectile.spawnProjectileFromRotationDelayed(ThrownEgg::new, (ServerLevel) level, itemStack, player, 0.0F, EggItem.PROJECTILE_SHOOT_POWER, 1.0F);
+ final Projectile.Delayed<ThrownEgg> thrownEgg = Projectile.spawnProjectileFromRotationDelayed(ThrownEgg::new, (ServerLevel) level, itemStack, player, 0.0F, EggItem.PROJECTILE_SHOOT_POWER, io.papermc.paper.configuration.ProjectileUncertainty.resolve(net.minecraft.world.entity.EntityTypes.EGG, 1.0F)); // Paper - configurable projectile uncertainty
+ com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) thrownEgg.projectile().getBukkitEntity());
+ if (event.callEvent() && thrownEgg.attemptSpawn()) {
+ if (event.shouldConsume()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
- Projectile.spawnProjectileFromRotation(ThrownEnderpearl::new, serverLevel, itemStack, player, 0.0F, 1.5F, 1.0F);
+ // CraftBukkit start
+ // Paper start - PlayerLaunchProjectileEvent
+ final Projectile.Delayed<ThrownEnderpearl> thrownEnderpearl = Projectile.spawnProjectileFromRotationDelayed(ThrownEnderpearl::new, serverLevel, itemStack, player, 0.0F, EnderpearlItem.PROJECTILE_SHOOT_POWER, 1.0F);
+ final Projectile.Delayed<ThrownEnderpearl> thrownEnderpearl = Projectile.spawnProjectileFromRotationDelayed(ThrownEnderpearl::new, serverLevel, itemStack, player, 0.0F, EnderpearlItem.PROJECTILE_SHOOT_POWER, io.papermc.paper.configuration.ProjectileUncertainty.resolve(net.minecraft.world.entity.EntityTypes.ENDER_PEARL, 1.0F)); // Paper - configurable projectile uncertainty
+ com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) thrownEnderpearl.projectile().getBukkitEntity());
+ if (event.callEvent() && thrownEnderpearl.attemptSpawn()) {
+ if (event.shouldConsume()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
if (level instanceof ServerLevel serverLevel) {
- Projectile.spawnProjectileFromRotation(ThrownExperienceBottle::new, serverLevel, itemStack, player, -20.0F, 0.7F, 1.0F);
+ // Paper start - PlayerLaunchProjectileEvent
+ final Projectile.Delayed<ThrownExperienceBottle> thrownExperienceBottle = Projectile.spawnProjectileFromRotationDelayed(ThrownExperienceBottle::new, serverLevel, itemStack, player, -20.0F, 0.7F, 1.0F);
+ final Projectile.Delayed<ThrownExperienceBottle> thrownExperienceBottle = Projectile.spawnProjectileFromRotationDelayed(ThrownExperienceBottle::new, serverLevel, itemStack, player, -20.0F, 0.7F, io.papermc.paper.configuration.ProjectileUncertainty.resolve(net.minecraft.world.entity.EntityTypes.EXPERIENCE_BOTTLE, 1.0F)); // Paper - configurable projectile uncertainty
+ com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) thrownExperienceBottle.projectile().getBukkitEntity());
+ if (event.callEvent() && thrownExperienceBottle.attemptSpawn()) {
+ if (event.shouldConsume()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
if (level instanceof ServerLevel serverLevel) {
- Projectile.spawnProjectileFromRotation(Snowball::new, serverLevel, itemStack, player, 0.0F, 1.5F, 1.0F);
+ // Paper start - PlayerLaunchProjectileEvent
+ final Projectile.Delayed<Snowball> snowball = Projectile.spawnProjectileFromRotationDelayed(Snowball::new, serverLevel, itemStack, player, 0.0F, SnowballItem.PROJECTILE_SHOOT_POWER, 1.0F);
+ final Projectile.Delayed<Snowball> snowball = Projectile.spawnProjectileFromRotationDelayed(Snowball::new, serverLevel, itemStack, player, 0.0F, SnowballItem.PROJECTILE_SHOOT_POWER, io.papermc.paper.configuration.ProjectileUncertainty.resolve(net.minecraft.world.entity.EntityTypes.SNOWBALL, 1.0F)); // Paper - configurable projectile uncertainty
+ com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) snowball.projectile().getBukkitEntity());
+ if (event.callEvent() && snowball.attemptSpawn()) {
+ player.awardStat(Stats.ITEM_USED.get(this));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
if (level instanceof ServerLevel serverLevel) {
- Projectile.spawnProjectileFromRotation(this::createPotion, serverLevel, itemStack, player, -20.0F, 0.5F, 1.0F);
+ // Paper start - PlayerLaunchProjectileEvent
+ final Projectile.Delayed<AbstractThrownPotion> thrownPotion = Projectile.spawnProjectileFromRotationDelayed(this::createPotion, serverLevel, itemStack, player, -20.0F, 0.5F, 1.0F);
+ final Projectile.Delayed<AbstractThrownPotion> thrownPotion = Projectile.spawnProjectileFromRotationDelayed(this::createPotion, serverLevel, itemStack, player, -20.0F, 0.5F, io.papermc.paper.configuration.ProjectileUncertainty.resolve(itemStack.is(net.minecraft.world.item.Items.LINGERING_POTION) ? net.minecraft.world.entity.EntityTypes.LINGERING_POTION : net.minecraft.world.entity.EntityTypes.SPLASH_POTION, 1.0F)); // Paper - configurable projectile uncertainty
+ com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) thrownPotion.projectile().getBukkitEntity());
+ if (event.callEvent() && thrownPotion.attemptSpawn()) {
+ if (event.shouldConsume()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
- ThrownTrident trident = Projectile.spawnProjectileFromRotation(
+ ItemStack thrownItemStack = itemStack.copyWithCount(1); // Paper
+ Projectile.Delayed<ThrownTrident> tridentDelayed = Projectile.spawnProjectileFromRotationDelayed( // Paper - PlayerLaunchProjectileEvent(
ThrownTrident::new, serverLevel, thrownItemStack, player, 0.0F, 2.5F, 1.0F
ThrownTrident::new, serverLevel, thrownItemStack, player, 0.0F, 2.5F, io.papermc.paper.configuration.ProjectileUncertainty.resolve(net.minecraft.world.entity.EntityTypes.TRIDENT, 1.0F) // Paper - configurable projectile uncertainty
);
+ // Paper start - PlayerLaunchProjectileEvent
+ com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) tridentDelayed.projectile().getBukkitEntity());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
stack,
@@ -37,6 +_,22 @@
1.5F,
1.0F
- 1.0F
+ io.papermc.paper.configuration.ProjectileUncertainty.resolve(net.minecraft.world.entity.EntityTypes.WIND_CHARGE, 1.0F) // Paper - configurable projectile uncertainty
);
+ // Paper start - PlayerLaunchProjectileEvent
+ com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(stack), (org.bukkit.entity.Projectile) windCharge.projectile().getBukkitEntity());
Expand Down
Loading
Loading