package com.taiter.ce;
import java.lang.reflect.Constructor;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import net.md_5.bungee.api.ChatColor;
/*
* This file is part of Custom Enchantments
* Copyright (C) Taiterio 2015
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
public class EffectManager {
//The particle enum as of 1.9
public enum ParticleEffect {
EXPLOSION_NORMAL,
EXPLOSION_LARGE,
EXPLOSION_HUGE,
FIREWORKS_SPARK,
WATER_BUBBLE,
WATER_SPLASH,
WATER_WAKE,
SUSPENDED,
SUSPENDED_DEPTH,
CRIT,
CRIT_MAGIC,
SMOKE_NORMAL,
SMOKE_LARGE,
SPELL,
SPELL_INSTANT,
SPELL_MOB,
SPELL_MOB_AMBIENT,
SPELL_WITCH,
DRIP_WATER,
DRIP_LAVA,
VILLAGER_ANGRY,
VILLAGER_HAPPY,
TOWN_AURA,
NOTE,
PORTAL,
ENCHANTMENT_TABLE,
FLAME,
LAVA,
FOOTSTEP,
CLOUD,
REDSTONE,
SNOWBALL,
SNOW_SHOVEL,
SLIME,
HEART,
BARRIER,
ITEM_CRACK,
BLOCK_CRACK,
BLOCK_DUST,
WATER_DROP,
ITEM_TAKE,
MOB_APPEARANCE,
//1.9 Only
END_ROD,
DAMAGE_INDICATOR,
SWEEP_ATTACK
}
private static Constructor<?> effectConstructor;
private static Object[] particles;
public EffectManager() {
try {
effectConstructor = ReflectionHelper.getEffectPacketConstructor();
particles = (Object[]) ReflectionHelper.loadEnumParticleValues();
} catch (Exception e) {
Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "[CE] Could not load particle effects. ERROR:");
e.printStackTrace();
}
}
public static void playSound(Location loc, String sound, float volume, float pitch) {
Sound s;
try {
s = Sound.valueOf(sound);
} catch (IllegalArgumentException ex) {
try {
//Try to resolve the 1.8 Sounds
s = Sound.valueOf(sound.substring(sound.indexOf("_") + 1, sound.length()).replace("_AMBIENT", "").replace("GENERIC_", "").replace("EXPERIENCE_", "").replace("PLAYER_", ""));
} catch (IllegalArgumentException ex2) {
return;
}
}
loc.getWorld().playSound(loc, s, volume, pitch);
}
public static void sendBlockEffect(List<Player> targets, Location loc, Vector offset, int blockID, float speed, int amount, byte data) {
Object packet = null;
try {
packet = effectConstructor.newInstance(particles[5], true, (float) loc.getX(), (float) loc.getY(), (float) loc.getZ(), (float) offset.getX(), (float) offset.getY(), (float) offset.getZ(),
speed, amount, new int[] { blockID, data });
} catch (Exception e) {
}
if (packet != null)
for (Player p : targets)
ReflectionHelper.sendPacket(p, packet);
}
public static void sendEffect(List<Player> targets, ParticleEffect particle, Location loc, float speed, int amount) {
sendEffect(targets, particle, loc, new Vector(Math.random(), Math.random(), Math.random()), speed, amount);
}
public static void sendEffect(List<Player> targets, ParticleEffect particle, Location loc, Vector offset, float speed, int amount) {
Object packet = null;
try {
packet = effectConstructor.newInstance(particles[particle.ordinal()], true, (float) loc.getX(), (float) loc.getY(), (float) loc.getZ(), (float) offset.getX(), (float) offset.getY(),
(float) offset.getZ(), speed, amount, null);
} catch (Exception e) {
}
if (packet != null)
for (Player p : targets)
ReflectionHelper.sendPacket(p, packet);
}
}