package net.fourbytes.shadow.systems; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.reflect.ClassReflection; import net.fourbytes.shadow.Layer; import net.fourbytes.shadow.Level; import net.fourbytes.shadow.Particle; import net.fourbytes.shadow.ParticleType; import net.fourbytes.shadow.mod.ModManager; import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class DefaultParticleManager implements IParticleManager { public Level level; public final ObjectMap<String, ParticleType> types = new ObjectMap<String, ParticleType>(); private final Array<Particle> particles = new Array<Particle>(Particle.class); public DefaultParticleManager(Level level) { this.level = level; } @Override public Particle create(String typeName, Vector2 pos, Layer layer, Color color, float size, float time, Object... args) { ParticleType type = ModManager.getParticleType(typeName); if (type == null) { try { Class<ParticleType> clazz = ClassReflection.forName("net.fourbytes.shadow.particles."+typeName); Constructor<ParticleType> constructor = clazz.getConstructor(); constructor.setAccessible(true); type = constructor.newInstance(); } catch (Exception e) { e.printStackTrace(); } } if (!types.containsKey(typeName)) { types.put(typeName, type); } return create(type, pos, layer, color, size, time, args); } @Override public Particle create(ParticleType type, Vector2 pos, Layer layer, Color color, float size, float time, Object... args) { Class<? extends ParticleType> typeClazz = type.getClass(); String typeName = typeClazz.getSimpleName(); if (!types.containsKey(typeName)) { types.put(typeName, type); } Particle particle; if (particles.size == 0) { particle = new Particle(); } else { particle = particles.removeIndex(0); } particle.create(pos, layer, type); if (args.length == 0) { type.create(particle, color, size, time); } else { try { Object[] allargs = new Object[args.length+4]; allargs[0] = particle; allargs[1] = color; allargs[2] = size; allargs[3] = time; System.arraycopy(args, 0, allargs, 4, args.length); Class[] types = new Class[args.length+4]; types[0] = Particle.class; types[1] = Color.class; types[2] = float.class; types[3] = float.class; for (int i = 0; i < args.length; i++) { types[i+4] = args[i].getClass(); } Method method = typeClazz.getMethod("create", types); method.setAccessible(true); method.invoke(type, allargs); } catch (Exception e) { e.printStackTrace(); } } return particle; } @Override public void reset(Particle particle) { particle.type.reset(particle); particle.reset(); particles.add(particle); } @Override public String getName(ParticleType type) { return type.getClass().getSimpleName(); } @Override public String getName() { return "ParticleManager"; } }