package org.arkham.cs.handler;
import org.arkham.cs.CosmeticSuite;
import org.arkham.cs.utils.Rank;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import de.slikey.effectlib.Effect;
import de.slikey.effectlib.EffectLib;
import de.slikey.effectlib.EffectManager;
import de.slikey.effectlib.EffectType;
import de.slikey.effectlib.effect.ArcLocationEffect;
import de.slikey.effectlib.effect.AtomLocationEffect;
import de.slikey.effectlib.effect.BleedEntityEffect;
import de.slikey.effectlib.effect.ConeLocationEffect;
import de.slikey.effectlib.effect.DnaLocationEffect;
import de.slikey.effectlib.effect.ExplodeLocationEffect;
import de.slikey.effectlib.effect.FlameEntityEffect;
import de.slikey.effectlib.effect.FountainLocationEffect;
import de.slikey.effectlib.effect.GridLocationEffect;
import de.slikey.effectlib.effect.HelixLocationEffect;
import de.slikey.effectlib.effect.LoveEntityEffect;
import de.slikey.effectlib.effect.MusicEntityEffect;
import de.slikey.effectlib.effect.ShieldEntityEffect;
import de.slikey.effectlib.effect.SmokeEntityEffect;
import de.slikey.effectlib.effect.StarLocationEffect;
import de.slikey.effectlib.effect.TraceEntityEffect;
import de.slikey.effectlib.effect.VortexLocationEffect;
import de.slikey.effectlib.effect.WarpEntityEffect;
public class ParticleLibManager {
private static EffectManager effectManager;
public ParticleLibManager() {
EffectLib lib = EffectLib.instance();
effectManager = new EffectManager(lib);
}
public enum FancyEffect {
/**
* - Create architectual correct arc of particles
*/
ARCLOCATIONEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Create the orbital-model of the atom
*/
ATOMLOCATIONEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Let the target entity bleed.
*/
BLEEDENTITYEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Cast a cone in all possible directions
*/
CONELOCATIONEFFECT(ParticleClassType.LIB_EFFECT),
/**
* Create DNA molecule
*/
DNALOCATIONEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Create a explosion at location.
*/
EXPLODELOCATIONEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Let the target entity burn.
*/
FLAMEENTITYEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Create a foundtain for you well
*/
FOUNTAINLOCATIONEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Customizable grid for you signwall
*/
GRIDLOCATIONEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Create a customizable static helix.
*/
HELIXLOCATIONEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - The target entity is in love.
*/
LOVEENTITYEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Circle of notes appearers above the entity.
*/
MUSICENTITYEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Spherical Shield around an entity.
*/
SHIELDENTITYEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Let the target entity smoke.
*/
SMOKEENTITYEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Create fully customizable 3D star
*/
STARLOCATIONEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Create a trace along an entitys path.
*/
TRACEENTITYEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Create a vortex of particles at location
*/
VORTEXLOCATIONEFFECT(ParticleClassType.LIB_EFFECT),
/**
* - Create a warp-effect around an entity
*/
WARPENTITYEFFECT(ParticleClassType.LIB_EFFECT);
private ParticleClassType type;
private FancyEffect(ParticleClassType type) {
this.type = type;
}
public ParticleClassType getType() {
return type;
}
public void stop(Player player){
Effect e = null;
switch (this) {
case ARCLOCATIONEFFECT:
e = new ArcLocationEffect(effectManager, player.getEyeLocation(), player.getEyeLocation().getDirection().multiply(-3)
.toLocation(player.getWorld()));
break;
case ATOMLOCATIONEFFECT:
final AtomLocationEffect atom = new AtomLocationEffect(effectManager, player.getLocation().clone().add(0, 1, 0));
atom.radius = 5;
e = atom;
break;
case BLEEDENTITYEFFECT:
e = new BleedEntityEffect(effectManager, player);
break;
case CONELOCATIONEFFECT:
e = new ConeLocationEffect(effectManager, player.getEyeLocation());
break;
case DNALOCATIONEFFECT:
e = new DnaLocationEffect(effectManager, player.getEyeLocation());
break;
case EXPLODELOCATIONEFFECT:
e = new ExplodeLocationEffect(effectManager, player.getEyeLocation());
break;
case FLAMEENTITYEFFECT:
e = new FlameEntityEffect(effectManager, player);
break;
case FOUNTAINLOCATIONEFFECT:
e = new FountainLocationEffect(effectManager, player.getEyeLocation());
break;
case GRIDLOCATIONEFFECT:
e = new GridLocationEffect(effectManager, player.getEyeLocation());
break;
case HELIXLOCATIONEFFECT:
e = new HelixLocationEffect(effectManager, player.getEyeLocation());
break;
case LOVEENTITYEFFECT:
e = new LoveEntityEffect(effectManager, player);
break;
case MUSICENTITYEFFECT:
e = new MusicEntityEffect(effectManager, player);
break;
case SHIELDENTITYEFFECT:
e = new ShieldEntityEffect(effectManager, player);
e.type = EffectType.INSTANT;
break;
case SMOKEENTITYEFFECT:
e = new SmokeEntityEffect(effectManager, player);
break;
case STARLOCATIONEFFECT:
e = new StarLocationEffect(effectManager, player.getEyeLocation());
break;
case TRACEENTITYEFFECT:
e = new TraceEntityEffect(effectManager, player);
break;
case VORTEXLOCATIONEFFECT:
e = new VortexLocationEffect(effectManager, player.getEyeLocation());
break;
case WARPENTITYEFFECT:
e = new WarpEntityEffect(effectManager, player);
break;
default:
break;
}
ParticleLibManager.stop(e, player);
}
public void display(final Player player) {
switch (this.type) {
case LIB_EFFECT:
Effect e = null;
switch (this) {
case ARCLOCATIONEFFECT:
e = new ArcLocationEffect(effectManager, player.getEyeLocation(), player.getEyeLocation().getDirection().multiply(-3)
.toLocation(player.getWorld()));
break;
case ATOMLOCATIONEFFECT:
final AtomLocationEffect atom = new AtomLocationEffect(effectManager, player.getLocation().clone().add(0, 1, 0));
atom.radius = 5;
e = atom;
break;
case BLEEDENTITYEFFECT:
e = new BleedEntityEffect(effectManager, player);
break;
case CONELOCATIONEFFECT:
e = new ConeLocationEffect(effectManager, player.getEyeLocation());
break;
case DNALOCATIONEFFECT:
e = new DnaLocationEffect(effectManager, player.getEyeLocation());
break;
case EXPLODELOCATIONEFFECT:
e = new ExplodeLocationEffect(effectManager, player.getEyeLocation());
break;
case FLAMEENTITYEFFECT:
e = new FlameEntityEffect(effectManager, player);
break;
case FOUNTAINLOCATIONEFFECT:
e = new FountainLocationEffect(effectManager, player.getEyeLocation());
break;
case GRIDLOCATIONEFFECT:
e = new GridLocationEffect(effectManager, player.getEyeLocation());
break;
case HELIXLOCATIONEFFECT:
e = new HelixLocationEffect(effectManager, player.getEyeLocation());
break;
case LOVEENTITYEFFECT:
e = new LoveEntityEffect(effectManager, player);
break;
case MUSICENTITYEFFECT:
e = new MusicEntityEffect(effectManager, player);
break;
case SHIELDENTITYEFFECT:
e = new ShieldEntityEffect(effectManager, player);
e.type = EffectType.REPEATING;
break;
case SMOKEENTITYEFFECT:
e = new SmokeEntityEffect(effectManager, player);
break;
case STARLOCATIONEFFECT:
e = new StarLocationEffect(effectManager, player.getEyeLocation());
break;
case TRACEENTITYEFFECT:
e = new TraceEntityEffect(effectManager, player);
break;
case VORTEXLOCATIONEFFECT:
e = new VortexLocationEffect(effectManager, player.getEyeLocation());
break;
case WARPENTITYEFFECT:
e = new WarpEntityEffect(effectManager, player);
break;
default:
break;
}
run(e, player);
case PARTICLE_EFFECT:
break;
}
}
public enum ParticleClassType {
PARTICLE_EFFECT, LIB_EFFECT;
}
}
public static void run(final Effect atom, final Player player){
atom.start();
new BukkitRunnable() {
@Override
public void run() {
atom.cancel();
player.removeMetadata("effected", CosmeticSuite.getInstance());
}
}.runTaskLaterAsynchronously(CosmeticSuite.getInstance(), 20L*20);;
}
public static void stop(Effect effect, Player player){
effect.cancel();
player.removeMetadata("effected", CosmeticSuite.getInstance());
}
public static String name(FancyEffect effect){
String name = effect.name();
StringBuilder builder = new StringBuilder();
builder.append(ChatColor.YELLOW + ChatColor.BOLD.toString());
if(name.contains("_")){
String[] str = name.split("_");
for(int i = 0; i < str.length; i++){
String s = str[i];
s = s.substring(0,1).toUpperCase() + s.substring(1).toLowerCase();
builder.append(s + " ");
}
} else {
name = name.replace("ENTITY", " Entity");
name = name.replace("LOCATION", " Location");
name = name.replace("EFFECT", " Effect");
String[] str = name.split(" ");
for(int i = 0; i < str.length; i++){
String s = str[i];
s = s.substring(0,1).toUpperCase() + s.substring(1).toLowerCase();
builder.append(s + " ");
}
}
return builder.toString();
}
public static Rank getRank(FancyEffect effect){
switch(effect.getType()){
case LIB_EFFECT:
return Rank.SUPERHERO;
case PARTICLE_EFFECT:
return Rank.HERO;
}
return Rank.HERO;
}
}