package be.isach.ultracosmetics.cosmetics.particleeffects;
import be.isach.ultracosmetics.UltraCosmetics;
import be.isach.ultracosmetics.UltraCosmeticsData;
import be.isach.ultracosmetics.config.MessageManager;
import be.isach.ultracosmetics.cosmetics.Category;
import be.isach.ultracosmetics.cosmetics.Cosmetic;
import be.isach.ultracosmetics.cosmetics.Updatable;
import be.isach.ultracosmetics.cosmetics.type.ParticleEffectType;
import be.isach.ultracosmetics.player.UltraPlayer;
import be.isach.ultracosmetics.util.MathUtils;
import be.isach.ultracosmetics.util.Particles;
import be.isach.ultracosmetics.util.UtilParticles;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.scheduler.BukkitRunnable;
/**
* Represents an instance of a particle effect summoned by a player.
*
* @author iSach
* @since 08-03-2015
*/
public abstract class ParticleEffect extends Cosmetic<ParticleEffectType> implements Updatable {
/**
* If true, the effect will ignore moving.
*/
protected boolean ignoreMove = false;
public ParticleEffect(UltraCosmetics ultraCosmetics, UltraPlayer ultraPlayer, final ParticleEffectType type) {
super(ultraCosmetics, Category.EFFECTS, ultraPlayer, type);
}
@Override
protected void onEquip() {
if (getOwner().getCurrentParticleEffect() != null) {
getOwner().removeParticleEffect();
}
getOwner().setCurrentParticleEffect(this);
runTaskTimerAsynchronously(getUltraCosmetics(), 0, 1);
}
@Override
public void run() {
super.run();
try {
if (Bukkit.getPlayer(getOwnerUniqueId()) != null
&& getOwner().getCurrentParticleEffect() != null
&& getOwner().getCurrentParticleEffect().getType() == getType()) {
if (getType() != ParticleEffectType.FROZENWALK
&& getType() != ParticleEffectType.ENCHANTED
&& getType() != ParticleEffectType.MUSIC
&& getType() != ParticleEffectType.SANTAHAT
&& getType() != ParticleEffectType.FLAMEFAIRY
&& getType() != ParticleEffectType.ENDERAURA) {
if (!isMoving() || ignoreMove)
onUpdate();
if (isMoving()) {
boolean c = getType() == ParticleEffectType.ANGELWINGS;
if (getType().getEffect() == Particles.REDSTONE) {
if (!ignoreMove) {
for (int i = 0; i < 15; i++) {
if (!c) {
getType().getEffect().display(new Particles.OrdinaryColor(255, 0, 0), getPlayer().getLocation().add(MathUtils.randomDouble(-0.8, 0.8), 1 + MathUtils.randomDouble(-0.8, 0.8), MathUtils.randomDouble(-0.8, 0.8)), 128);
} else {
getType().getEffect().display(new Particles.OrdinaryColor(255, 255, 255), getPlayer().getLocation().add(MathUtils.randomDouble(-0.8, 0.8), 1 + MathUtils.randomDouble(-0.8, 0.8), MathUtils.randomDouble(-0.8, 0.8)), 128);
}
}
}
} else if (getType().getEffect() == Particles.ITEM_CRACK) {
for (int i = 0; i < 15; i++)
Particles.ITEM_CRACK.display(new Particles.ItemData(Material.INK_SACK, ParticleEffectCrushedCandyCane.getRandomColor()), 0.2f, 0.2f, 0.2f, 0, 1, getPlayer().getLocation(), 128);
} else
UtilParticles.display(getType().getEffect(), .4f, .3f, .4f, getPlayer().getLocation().add(0, 1, 0), 3);
}
} else
onUpdate();
} else
cancel();
} catch (NullPointerException exc) {
clear();
cancel();
}
}
protected boolean isMoving() {
return getOwner().isMoving();
}
@Override
protected void onClear() {
}
}