package net.t7seven7t.craftfx.effect; import net.t7seven7t.craftfx.CraftFX; import net.t7seven7t.craftfx.Target; import net.t7seven7t.craftfx.data.Data; import net.t7seven7t.craftfx.data.DataInterface; import net.t7seven7t.craftfx.item.ItemDefinition; import net.t7seven7t.craftfx.target.TargetSelector; import net.t7seven7t.craftfx.trigger.Trigger; import net.t7seven7t.craftfx.trigger.TriggerSpec; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Consumer; /** * */ public class EffectContext implements DataInterface { private final Player initiator; private final Target origin; // some kind of targeting params private final ItemDefinition itemDefinition; private final TriggerSpec triggerSpec; private final Trigger trigger; private final Effect effect; TargetSelector selector; private Map<String, Object> properties; /** * The instance of Effect this context is to be passed to */ public EffectContext(Effect effect, Player initiator, Target origin, ItemDefinition itemDefinition, TriggerSpec triggerSpec, Trigger trigger) { this.effect = effect; this.origin = origin; this.initiator = initiator; this.itemDefinition = itemDefinition; this.triggerSpec = triggerSpec; this.trigger = trigger; } public Target getOrigin() { return origin; } @Override public String toString() { return "EffectContext{" + "initiator=" + initiator + ", itemDefinition=" + itemDefinition + ", triggerSpec=" + triggerSpec + '}'; } public TargetSelector getTargetSelector() { return selector; } public List<Target> getTargets() { return selector.getTargets(); } public Trigger getTrigger() { return trigger; } public TriggerSpec getTriggerSpec() { return triggerSpec; } public Player getInitiator() { return initiator; } public ItemDefinition getItemDefinition() { return itemDefinition; } public void setProperty(String propertyName, Object value) { if (properties == null) { properties = new HashMap<>(); } properties.put(propertyName, value); } public Optional<Object> getProperty(String propertyName) { return properties == null ? Optional.empty() : Optional .ofNullable(properties.get(propertyName)); } public <T> Optional<T> getProperty(String propertyName, Class<T> clazz) { return getProperty(propertyName).filter(clazz::isInstance).map(clazz::cast); } public void forTargets(Consumer<Target> consumer) { getTargets().forEach(consumer); } /** * Convenience method for scheduling a task * * @param r runnable to execute one tick later */ public void run(Runnable r) { run(r, 0); } /** * Convenience method for scheduling a task * * @param r runnable to execute * @param delay delay in ticks */ public void run(Runnable r, long delay) { Bukkit.getScheduler().runTaskLater(CraftFX.plugin(), r, delay); } /** * Copies state from another context into this context * * @param context context to copy from */ void copyState(EffectContext context) { this.properties = context.properties; } @Override public <T extends Data> Optional<T> getData(Class<T> clazz) { return effect != null ? effect.getData(clazz) : Optional.<T>empty(); } }