ProjectAres/PGM/src/main/java/tc/oc/pgm/tracker/trackers/TNTTracker.java

72 lines
2.9 KiB
Java

package tc.oc.pgm.tracker.trackers;
import org.bukkit.Material;
import org.bukkit.entity.Entity;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockDispenseEntityEvent;
import org.bukkit.event.entity.ExplosionPrimeByEntityEvent;
import org.bukkit.event.entity.ExplosionPrimeEvent;
import tc.oc.pgm.match.ParticipantState;
import tc.oc.pgm.events.ParticipantBlockTransformEvent;
import tc.oc.pgm.tracker.damage.TNTInfo;
/**
* Updates the state of owned TNT blocks and entities
*/
public class TNTTracker extends AbstractTracker<TNTInfo> {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlace(ParticipantBlockTransformEvent event) {
if(event.getNewState().getMaterial() == Material.TNT) {
blocks().trackBlockState(event.getNewState(), new TNTInfo(event.getPlayerState(), event.getNewState().getLocation()));
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPrime(ExplosionPrimeEvent event) {
if(event.getEntity() instanceof TNTPrimed) {
// Some TNT was activated, try to figure out why
TNTPrimed tnt = (TNTPrimed) event.getEntity();
TNTInfo info = null;
if(event instanceof ExplosionPrimeByEntityEvent) {
Entity primer = ((ExplosionPrimeByEntityEvent) event).getPrimer();
if(primer instanceof TNTPrimed) {
// Primed by another owned explosive, propagate the damage info (e.g. origin location)
info = resolveEntity(primer);
} else {
ParticipantState owner = entities().getOwner(primer);
if(owner != null) {
// Primed by some other type of owned entity e.g. flaming arrow, pet creeper, etc.
info = new TNTInfo(owner, tnt.getLocation());
}
}
}
if(info == null) {
ParticipantState placer = blocks().getOwner(tnt.getLocation().getBlock());
if(placer != null) {
// If no primer was resolved for the event, give the TNT entity to the block placer, if any
info = new TNTInfo(placer, tnt.getLocation());
}
}
if(info != null) {
entities().trackEntity(tnt, info);
}
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onDispense(BlockDispenseEntityEvent event) {
if(event.getEntity() instanceof TNTPrimed) {
ParticipantState owner = blocks().getOwner(event.getBlock());
if(owner != null) {
entities().trackEntity(event.getEntity(), new TNTInfo(owner, event.getEntity().getLocation()));
}
}
}
}