@@ -0,0 +1,3610 @@
+package deterno.fight.tgm.damage.tracker;%0A%0Aimport org.bukkit.entity.LivingEntity;%0Aimport org.bukkit.event.entity.EntityDamageEvent;%0A%0Aimport javax.annotation.Nonnull;%0Aimport java.util.Collection;%0Aimport java.util.Set;%0A%0A/**%0A * Manages the available %7B@link DamageResolver%7Ds and provides a convenience%0A * method to resolve damage using a list of resolvers.%0A *%0A * It is important what order resolvers are called in since a resolver called%0A * after another that returns a non-null damage will override the previous%0A * damage. Order can be specified when registering by indicating the types of%0A * resolvers that should be called first. Note that there is no guarantee of%0A * the order outside of what is specified.%0A */%0Apublic interface DamageResolverManager %7B%0A    /**%0A     * Indicates whether the specified resolver is already registered.%0A     *%0A     * @param resolver Specified resolver%0A     * @return true if the resolver is registered, false otherwise%0A     *%0A     * @throws NullPointerException if resolver is null%0A     */%0A    boolean isRegistered(@Nonnull DamageResolver resolver);%0A%0A    /**%0A     * Registers the specified resolver.%0A     *%0A     * @param resolver Specified resolver%0A     *%0A     * @throws NullPointerException if resolver is null%0A     */%0A    void register(@Nonnull DamageResolver resolver);%0A%0A    /**%0A     * Registers the specified resolver indicating that certain resolvers must%0A     * be called before the specified one.%0A     *%0A     * @param resolver Specified resolver%0A     * @param before Classes of resolvers that must be called before this one%0A     *%0A     * @throws NullPointerException if resolver or before is null%0A     * @throws IllegalArgumentException if the constraints specified by the%0A     *                                  before classes cannot be solved%0A     */%0A    void register(@Nonnull DamageResolver resolver, @Nonnull Class%3C? extends DamageResolver%3E... before);%0A%0A    /**%0A     * Registers the specified resolver indication that certain resolvers must%0A     * be called before the specified one.%0A     *%0A     * @param resolver Specified resolver%0A     * @param before Classes of resolvers that must be called before this one%0A     *%0A     * @throws NullPointerException if resolver or before is null%0A     * @throws IllegalArgumentException if the constraints specified by the%0A     *                                  before classes cannot be solved%0A     */%0A    void register(@Nonnull DamageResolver resolver, @Nonnull Collection%3CClass%3C? extends DamageResolver%3E%3E before);%0A%0A    /**%0A     * Unregisters the specified resolver.%0A     *%0A     * @param resolver Specified resolver%0A     *%0A     * @throws NullPointerException if resolver is null%0A     */%0A    void unregister(@Nonnull DamageResolver resolver);%0A%0A    /**%0A     * Gets the set of resolvers in the order%0A     *%0A     * @return Set of resolvers in the order they should be called%0A     */%0A    @Nonnull%0A    Set%3CDamageResolver%3E getResolvers();%0A%0A    /**%0A     * Resolves the specified damage event using the set of registered%0A     * resolvers.%0A     *%0A     * If no resolver can resolve the specified event, this method will return%0A     * a generic %7B@link BukkitDamageInfo%7D instance.%0A     *%0A     * @param entity Entity that is being damaged%0A     * @param lifetime Lifetime of the entity up to this point%0A     * @param damageEvent Bukkit damage event to resolve%0A     * @return Resolved damage information (never null)%0A     *%0A     * @throws NullPointerException if entity, lifetime, or the event is null%0A     */%0A    @Nonnull%0A    DamageInfo resolve(@Nonnull LivingEntity entity, @Nonnull Lifetime lifetime, @Nonnull EntityDamageEvent damageEvent);%0A%7D%0A

Create DamageResolverManager.java