package tc.oc.pgm.tracker.trackers; import java.util.logging.Logger; import javax.annotation.Nullable; import javax.inject.Inject; import com.google.common.reflect.TypeToken; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.event.Listener; import tc.oc.commons.core.logging.Loggers; import tc.oc.pgm.events.ListenerScope; import tc.oc.pgm.match.Match; import tc.oc.pgm.match.MatchScope; import tc.oc.pgm.tracker.damage.TrackerInfo; /** * Base class with a few convenience methods that are useful to trackers. * * Subclasses specify the type of {@link TrackerInfo} they use and the * resolve methods provided by the base class will filter out results of * the wrong type. If subclasses don't want results to be filtered, they * should call the resolve methods directly on the block/entity tracker. */ @ListenerScope(MatchScope.RUNNING) public abstract class AbstractTracker<Info extends TrackerInfo> implements Listener { @Inject protected Match match; @Inject protected EntityTracker entities; @Inject protected BlockTracker blocks; protected Logger logger; @Inject void initLogger(Loggers loggers) { this.logger = loggers.get(getClass()); } private final Class<Info> infoClass; protected AbstractTracker() { this.infoClass = (Class<Info>) new TypeToken<Info>(getClass()){}.getRawType(); } protected EntityTracker entities() { return entities; } protected BlockTracker blocks() { return blocks; } protected @Nullable Info resolveBlock(Block block) { return blocks.resolveInfo(block, infoClass); } protected @Nullable Info resolveEntity(Entity entity) { return entities.resolveInfo(entity, infoClass); } }