Expected behavior
declaring an "@eventhandler ProjectileLaunchEvent" and reading "event.getEntity().getShooter()" should return a BlockProjectileSource source.
Observed/Actual behavior
declaring an "@eventhandler ProjectileLaunchEvent" and reading "event.getEntity().getShooter()" returns null
Steps/models to reproduce
Create an Events class that implements Listener, register it in the plugin class and add this method to the Listener:
@eventhandler
public void ProjectileLaunch(ProjectileLaunchEvent event){
ProjectileSource shooter = event.getEntity().getShooter();
Combat.PLUGIN.getServer().getPlayer("YOUR_USERNAME").sendPlainMessage(
"Shoot, shooter class: " + (shooter == null ? "null" : shooter.getClass().getName())
);
}
when shooting from a dispenser, shooter is null.
Plugin and Datapack List
Tested in an empty paper instance.
Paper version
Paper version 26.2-112-main@c9e894d (2026-08-11T05:18:39Z) (Implementing API version 26.2.build.112-stable)
Other
No response
Expected behavior
declaring an "@eventhandler ProjectileLaunchEvent" and reading "event.getEntity().getShooter()" should return a BlockProjectileSource source.
Observed/Actual behavior
declaring an "@eventhandler ProjectileLaunchEvent" and reading "event.getEntity().getShooter()" returns null
Steps/models to reproduce
Create an Events class that implements Listener, register it in the plugin class and add this method to the Listener:
@eventhandler
public void ProjectileLaunch(ProjectileLaunchEvent event){
ProjectileSource shooter = event.getEntity().getShooter();
Combat.PLUGIN.getServer().getPlayer("YOUR_USERNAME").sendPlainMessage(
"Shoot, shooter class: " + (shooter == null ? "null" : shooter.getClass().getName())
);
}
when shooting from a dispenser, shooter is null.
Plugin and Datapack List
Tested in an empty paper instance.
Paper version
Paper version 26.2-112-main@c9e894d (2026-08-11T05:18:39Z) (Implementing API version 26.2.build.112-stable)
Other
No response