76 lines
3.0 KiB
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());
|
|
}
|
|
}
|
|
}
|