package net.t7seven7t.craftfx.trigger; import com.google.common.collect.ImmutableList; import net.t7seven7t.craftfx.Target; import net.t7seven7t.craftfx.data.Data; import net.t7seven7t.craftfx.data.DataHolder; import net.t7seven7t.craftfx.data.DataInterface; import net.t7seven7t.craftfx.item.ItemDefinition; import org.bukkit.entity.Player; import org.bukkit.event.Event; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.function.Function; /** * */ public class TriggerContext implements DataInterface { private final Player initiator; private final List<Target> targets = new ArrayList<>(); ItemDefinition itemDefinition; TriggerSpec spec; DataHolder holder; public TriggerContext(Player initiator, Object... targets) { this.initiator = initiator; for (Object o : targets) { if (o instanceof List) { for (Object o1 : (List) o) { this.targets.add(o1 instanceof Target ? (Target) o1 : new Target(o1)); } } this.targets.add(o instanceof Target ? (Target) o : new Target(o)); } if (this.targets.isEmpty()) this.targets.add(new Target(null)); } /** * Create a TriggerContext that will delay calculation of the target until after at least one * trigger is confirmed in the item matching process * * @param initiator player that initiated the trigger * @param function function to calculate the target * @param <T> event class to calculate target from */ public <T extends Event> TriggerContext(Player initiator, Function<T, Object> function) { this(initiator, (Object) function); } @Override public String toString() { return "TriggerContext{" + "initiator=" + initiator + ", targets=" + targets + ", itemDefinition=" + itemDefinition + ", spec=" + spec + ", holder=" + holder + '}'; } public TriggerSpec getSpec() { return spec; } public ItemDefinition getItemDefinition() { return itemDefinition; } public Player getInitiator() { return initiator; } public List<Target> getTargets() { return ImmutableList.copyOf(targets); } public Target getTarget() { return targets.get(0); } public DataHolder getDataHolder() { return holder; } public TriggerContext copy() { return copy(targets); } /** * Copies this context but changes the target to the one supplied. * * @param targets the new target * @return a new TriggerContext */ public TriggerContext copy(Object... targets) { TriggerContext context = new TriggerContext(initiator, targets); context.spec = spec; // item def and holder are filled by trigger context.itemDefinition = itemDefinition; context.holder = holder; return context; } @Override public <T extends Data> Optional<T> getData(Class<T> clazz) { return holder != null ? holder.getData(clazz) : Optional.<T>empty(); } }