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

76 lines
3.0 KiB
Java

package tc.oc.pgm.tracker.trackers;
import java.lang.ref.WeakReference;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Slime;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockDispenseEntityEvent;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.SlimeSplitEvent;
import org.bukkit.event.player.PlayerSpawnEntityEvent;
import tc.oc.pgm.match.ParticipantState;
import tc.oc.pgm.projectile.EntityLaunchEvent;
import tc.oc.pgm.tracker.damage.MobInfo;
/**
* Updates the state of owned mobs with info about the owner.
*/
public class OwnedMobTracker extends AbstractTracker<MobInfo> {
private WeakReference<Slime> splitter = new WeakReference<>(null);
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onMobSpawn(PlayerSpawnEntityEvent event) {
ParticipantState owner = match.getParticipantState(event.getPlayer());
if(event.getEntity() instanceof LivingEntity && owner != null) {
LivingEntity mob = (LivingEntity) event.getEntity();
entities().trackEntity(event.getEntity(), new MobInfo(mob, owner));
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onMobDispense(BlockDispenseEntityEvent event) {
if(event.getEntity() instanceof LivingEntity) {
ParticipantState owner = blocks().getOwner(event.getBlock());
if(owner != null) {
entities().trackEntity(event.getEntity(), new MobInfo((LivingEntity) event.getEntity(), owner));
}
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onMobLaunch(EntityLaunchEvent event) {
if(event.getEntity() instanceof LivingEntity && event.getSource() instanceof Player) {
ParticipantState shooter = match.getParticipantState((Player) event.getSource());
if(shooter != null) {
entities().trackEntity(event.getEntity(), new MobInfo((LivingEntity) event.getEntity(), shooter));
}
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onSlimeSplit(CreatureSpawnEvent event) {
switch(event.getSpawnReason()) {
case SLIME_SPLIT:
Slime parent = splitter.get();
if(parent != null) {
MobInfo info = resolveEntity(parent);
if(info != null) {
entities().trackEntity(event.getEntity(), info);
}
}
break;
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onSlimeSplit(SlimeSplitEvent event) {
if(event.getCount() > 0 && resolveEntity(event.getEntity()) != null) {
splitter = new WeakReference<>(event.getEntity());
}
}
}