package tc.oc.pgm.kits; import com.google.inject.ImplementedBy; import tc.oc.pgm.features.FeatureDefinition; import tc.oc.pgm.features.FeatureInfo; import tc.oc.pgm.features.FeatureValidationContext; import tc.oc.pgm.filters.Filter; import tc.oc.pgm.filters.FilterMatchModule; import tc.oc.pgm.filters.parser.DynamicFilterValidation; import tc.oc.pgm.match.Match; import tc.oc.pgm.match.MatchPlayer; import tc.oc.pgm.xml.InvalidXMLException; import tc.oc.pgm.xml.NodeSplitter; import tc.oc.pgm.xml.finder.Parent; @FeatureInfo(name = "kit-rule", plural = "kits", singular = {"give", "take", "lend"}) @ImplementedBy(KitRuleImpl.class) public interface KitRule extends FeatureDefinition { enum Action { GIVE, TAKE, LEND } @Property @Nodes(Parent.class) @Split(NodeSplitter.Name.class) Action action(); @Property Kit kit(); @Property @Validate(DynamicFilterValidation.class) Filter filter(); } abstract class KitRuleImpl extends FeatureDefinition.Impl implements KitRule { @Override public void validate(FeatureValidationContext context) throws InvalidXMLException { if(action() == Action.TAKE || action() == Action.LEND) { context.validate(kit(), RemovableValidation.get()); } } @Override public void load(Match match) { final FilterMatchModule fmm = match.needMatchModule(FilterMatchModule.class); switch(action()) { case GIVE: fmm.onRise(MatchPlayer.class, filter(), kit()::apply); break; case TAKE: fmm.onRise(MatchPlayer.class, filter(), kit()::remove); break; case LEND: fmm.onChange(MatchPlayer.class, filter(), (player, response) -> { if(response) { kit().apply(player); } else { kit().remove(player); } }); break; } } }