package tc.oc.pgm.tracker.trackers; import javax.inject.Inject; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.projectiles.ProjectileSource; import tc.oc.pgm.projectile.EntityLaunchEvent; import tc.oc.pgm.projectile.ProjectileDefinition; import tc.oc.pgm.projectile.Projectiles; import tc.oc.pgm.tracker.ProjectileResolver; import tc.oc.pgm.tracker.damage.PhysicalInfo; import tc.oc.pgm.tracker.damage.ProjectileInfo; /** * Updates the state of launched projectiles with info about the shooter. * Uses {@link Entity} instead of {@link org.bukkit.entity.Projectile} to support custom projectiles */ public class ProjectileTracker implements Listener { private final EntityTracker entities; private final ProjectileResolver projectiles; @Inject ProjectileTracker(EntityTracker entities, ProjectileResolver projectiles) { this.entities = entities; this.projectiles = projectiles; } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onProjectileLaunch(ProjectileLaunchEvent event) { handleLaunch(event.getEntity(), event.getEntity().getShooter()); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onCustomProjectileLaunch(EntityLaunchEvent event) { // OwnedMobTracker handles mob launches if(!(event.getEntity() instanceof LivingEntity)) { handleLaunch(event.getEntity(), event.getSource()); } } void handleLaunch(Entity projectile, ProjectileSource source) { PhysicalInfo projectileInfo = entities.resolveEntity(projectile); if(!(projectileInfo instanceof ProjectileInfo)) { ProjectileDefinition definition = Projectiles.launchingProjectileDefinition(projectile); String customName = definition == null ? null : definition.getName(); entities.trackEntity(projectile, new ProjectileInfo(projectileInfo, projectiles.resolveShooter(source), projectile.getLocation(), customName)); } } }