@@ -0,0 +1,1970 @@
+package com.elmakers.mine.bukkit.effect.builtin;%0A%0Aimport com.elmakers.mine.bukkit.effect.EffectRepeating;%0Aimport com.elmakers.mine.bukkit.math.VectorTransform;%0Aimport com.elmakers.mine.bukkit.utility.ConfigurationUtils;%0Aimport de.slikey.effectlib.util.DynamicLocation;%0Aimport org.bukkit.Location;%0Aimport org.bukkit.configuration.ConfigurationSection;%0Aimport org.bukkit.plugin.Plugin;%0A%0Apublic class EffectTransform extends EffectRepeating %7B%0A    private VectorTransform positionTransform;%0A    private long playTime;%0A    private long lastIteration;%0A%0A    public EffectTransform() %7B%0A    %7D%0A%0A    public void play() %7B%0A        playTime = 0;%0A        lastIteration = System.currentTimeMillis();%0A        super.play();%0A    %7D%0A%0A    @Override%0A    public void load(Plugin plugin, ConfigurationSection parameters) %7B%0A        super.load(plugin, parameters);%0A        ConfigurationSection transform = ConfigurationUtils.getConfigurationSection(parameters, %22position_transform%22);%0A        if (transform != null) %7B%0A            positionTransform = new VectorTransform(transform);%0A        %7D else %7B%0A            positionTransform = null;%0A        %7D%0A    %7D%0A%0A    public void iterate() %7B%0A        if (positionTransform == null) %7B%0A            playEffect();%0A            return;%0A        %7D%0A        Location origin = getOrigin();%0A        Location target = getTarget();%0A        if (origin == null) return;%0A        Location source = origin;%0A        double t = (double)playTime / 1000;%0A        if (playAtOrigin) %7B%0A            source = source.clone();%0A            source.add(positionTransform.get(source, t));%0A        %7D%0A        if (target != null && playAtTarget) %7B%0A            target = target.clone();%0A            target.add(positionTransform.get(target, t));%0A        %7D%0A        long now = System.currentTimeMillis();%0A        playTime += (now - lastIteration);%0A        lastIteration = now;%0A        playEffect(new DynamicLocation(source, getOriginEntity()), new DynamicLocation(target, getTargetEntity()));%0A    %7D%0A%7D%0A

Add EffectTransform class, for equation-driven FX