package noppes.npcs.scripted; import net.minecraft.nbt.NBTTagByte; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagDouble; import net.minecraft.nbt.NBTTagFloat; import net.minecraft.nbt.NBTTagInt; import net.minecraft.nbt.NBTTagString; import noppes.npcs.NoppesUtilServer; import noppes.npcs.api.IParticle; import noppes.npcs.api.IPos; import noppes.npcs.api.IWorld; import noppes.npcs.api.entity.IEntity; import java.lang.reflect.Field; public class ScriptParticle implements IParticle { public String directory; public int HEXColor = 0xFFFFFF; public int HEXColor2 = 0xFFFFFF; public float HEXColorRate = 0.0f; public int HEXColorStart = 0; public int amount = 1; public int maxAge = 20; public double x = 0, y = 0, z = 0; public double motionX = 0, motionY = 0, motionZ = 0; public float gravity = 0; public float scaleX1 = 20.0f, scaleX2 = 20.0f, scaleXRate = 0.0f; public float scaleY1 = 20.0f, scaleY2 = 20.0f, scaleYRate = 0.0f; public float alpha1 = 1.0f, alpha2 = 1.0f, alphaRate = 0.0f; public int scaleXRateStart = 0, scaleYRateStart, alphaRateStart = 0; public float rotationX1 = 0; public float rotationX2 = 0; public float rotationXRate = 0.0F; public int rotationXRateStart = 0; public float rotationY1 = 0; public float rotationY2 = 0; public float rotationYRate = 0.0F; public int rotationYRateStart = 0; public float rotationZ1 = 0; public float rotationZ2 = 0; public float rotationZRate = 0.0F; public int rotationZRateStart = 0; public int width = -1, height = -1; public int offsetX = 0, offsetY = 0; public int animRate = 0; public boolean animLoop = true; public int animStart = 0, animEnd = -1; public boolean facePlayer = true; public boolean glows = true; public boolean noClip = true; public ScriptParticle(String directory) { this.directory = directory; } public NBTTagCompound writeToNBT() { NBTTagCompound compound = new NBTTagCompound(); ScriptParticle newParticle = new ScriptParticle(""); //Iterate through fields, check if they're not equal to a new object, write to NBT for (Field field : ScriptParticle.class.getDeclaredFields()) { try { if (!field.get(this).equals(field.get(newParticle))) { compound = writeNBTTag(compound, field.getType(), field.getName(), field.get(this)); } } catch (Exception ignored) { } } return compound; } public NBTTagCompound writeNBTTag(NBTTagCompound compound, Class c, String key, Object value) { if (c == boolean.class) { compound.setBoolean(key, (Boolean) value); } if (c == int.class) { compound.setInteger(key, (Integer) value); } if (c == double.class) { compound.setDouble(key, (Double) value); } if (c == float.class) { compound.setFloat(key, (Float) value); } if (c == String.class) { compound.setString(key, (String) value); } return compound; } private static Object readNBTTag(NBTTagCompound compound, String key) { if (compound.getTag(key) instanceof NBTTagByte) { return compound.getBoolean(key); } if (compound.getTag(key) instanceof NBTTagInt) { return compound.getInteger(key); } if (compound.getTag(key) instanceof NBTTagDouble) { return compound.getDouble(key); } if (compound.getTag(key) instanceof NBTTagFloat) { return compound.getFloat(key); } if (compound.getTag(key) instanceof NBTTagString) { return compound.getString(key); } return null; } public static ScriptParticle fromNBT(NBTTagCompound compound) { ScriptParticle particle = new ScriptParticle(compound.getString("directory")); //Iterate through fields, check if compound has a key equal to the field's name, and if so set the field equal to that value from NBT. for (Field field : ScriptParticle.class.getDeclaredFields()) { try { if (compound.hasKey(field.getName())) { Object val = ScriptParticle.readNBTTag(compound, field.getName()); if (val != null) { field.set(particle, val); } } } catch (Exception ignored) { } } return particle; } public void spawn(IEntity entity) { int entityID = entity.getMCEntity().getEntityId(); NBTTagCompound compound = this.writeToNBT(); compound.setInteger("EntityID", entityID); NoppesUtilServer.spawnScriptedParticle(compound, entity.getWorld().getDimensionID()); } public void spawn(IWorld world) { NBTTagCompound compound = this.writeToNBT(); NoppesUtilServer.spawnScriptedParticle(compound, world.getDimensionID()); } public void spawn(IWorld world, double x, double y, double z) { double prevX = this.x; double prevY = this.y; double prevZ = this.z; this.x = x; this.y = y; this.z = z; NBTTagCompound compound = this.writeToNBT(); NoppesUtilServer.spawnScriptedParticle(compound, world.getDimensionID()); this.x = prevX; this.y = prevY; this.z = prevZ; } public void spawnOnEntity(IEntity entity) { spawn(entity); } public void spawnInWorld(IWorld world) { spawn(world); } public void spawnInWorld(IWorld world, double x, double y, double z) { spawn(world, x, y, z); } public void setGlows(boolean glows) { this.glows = glows; } public boolean getGlows() { return this.glows; } public void setNoClip(boolean noClip) { this.noClip = noClip; } public boolean getNoClip() { return this.noClip; } public void setFacePlayer(boolean facePlayer) { this.facePlayer = facePlayer; } public boolean getFacePlayer() { return facePlayer; } public String getDirectory() { return directory; } public void setDirectory(String directory) { this.directory = directory; } public void setAmount(int amount) { this.amount = amount; } public int getAmount() { return amount; } public void setMaxAge(int maxAge) { this.maxAge = maxAge; } public int getMaxAge() { return maxAge; } public void setSize(int width, int height) { this.width = width; this.height = height; } public int getWidth() { return width; } public int getHeight() { return height; } public void setOffset(int offsetX, int offsetY) { this.offsetX = offsetX; this.offsetY = offsetY; } public int getOffsetX() { return offsetX; } public int getOffsetY() { return offsetY; } public void setAnim(int animRate, boolean animLoop, int animStart, int animEnd) { this.animRate = animRate; this.animLoop = animLoop; this.animStart = animStart; this.animEnd = animEnd; } public int getAnimRate() { return animRate; } public boolean getAnimLoop() { return animLoop; } public int getAnimStart() { return animStart; } public int getAnimEnd() { return animEnd; } public void setPosition(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } public double getX() { return x; } public double getY() { return y; } public double getZ() { return z; } public void setPosition(IPos pos) { this.setPosition(pos.getXD(), pos.getYD(), pos.getZD()); } public void getPos() { NpcAPI.Instance().getIPos(x, y, z); } public void setMotion(double motionX, double motionY, double motionZ, float gravity) { this.motionX = motionX; this.motionY = motionY; this.motionZ = motionZ; this.gravity = gravity; } public double getMotionX() { return motionX; } public double getMotionY() { return motionY; } public double getMotionZ() { return motionZ; } public float getGravity() { return gravity; } public void setHEXColor(int HEXColor, int HEXColor2, float HEXColorRate, int HEXColorStart) { this.HEXColor = HEXColor; this.HEXColor2 = HEXColor2; this.HEXColorRate = HEXColorRate; this.HEXColorStart = HEXColorStart; } public int getHEXColor1() { return HEXColor; } public int getHEXColor2() { return HEXColor2; } public float getHEXColorRate() { return HEXColorRate; } public int getHEXColorStart() { return HEXColorStart; } public void setAlpha(float alpha1, float alpha2, float alphaRate, int alphaRateStart) { this.alpha1 = alpha1; this.alpha2 = alpha2; this.alphaRate = alphaRate; this.alphaRateStart = alphaRateStart; } public float getAlpha1() { return alpha1; } public float getAlpha2() { return alpha2; } public float getAlphaRate() { return alphaRate; } public int getAlphaRateStart() { return alphaRateStart; } public void setScale(float scale1, float scale2, float scaleRate, int scaleRateStart) { this.scaleX1 = this.scaleY1 = scale1; this.scaleX2 = this.scaleY2 = scale2; this.scaleXRate = this.scaleYRate = scaleRate; this.scaleXRateStart = this.scaleYRateStart = scaleRateStart; } public void setScaleX(float scale1, float scale2, float scaleRate, int scaleRateStart) { this.scaleX1 = scale1; this.scaleX2 = scale2; this.scaleXRate = scaleRate; this.scaleXRateStart = scaleRateStart; } public float getScaleX1() { return scaleX1; } public float getScaleX2() { return scaleX2; } public float getScaleXRate() { return scaleXRate; } public int getScaleXRateStart() { return scaleXRateStart; } public void setScaleY(float scale1, float scale2, float scaleRate, int scaleRateStart) { this.scaleY1 = scale1; this.scaleY2 = scale2; this.scaleYRate = scaleRate; this.scaleYRateStart = scaleRateStart; } public float getScaleY1() { return scaleY1; } public float getScaleY2() { return scaleY2; } public float getScaleYRate() { return scaleYRate; } public int getScaleYRateStart() { return scaleYRateStart; } public void setRotationX(float rotationX1, float rotationX2, float rotationXRate, int rotationXRateStart) { this.rotationX1 = rotationX1; this.rotationX2 = rotationX2; this.rotationXRate = rotationXRate; this.rotationXRateStart = rotationXRateStart; } public float getRotationX1() { return rotationX1; } public float getRotationX2() { return rotationX2; } public float getRotationXRate() { return rotationXRate; } public int getRotationXRateStart() { return rotationXRateStart; } public void setRotationY(float rotationY1, float rotationY2, float rotationYRate, int rotationYRateStart) { this.rotationY1 = rotationY1; this.rotationY2 = rotationY2; this.rotationYRate = rotationYRate; this.rotationYRateStart = rotationYRateStart; } public float getRotationY1() { return rotationY1; } public float getRotationY2() { return rotationY2; } public float getRotationYRate() { return rotationYRate; } public int getRotationYRateStart() { return rotationYRateStart; } public void setRotationZ(float rotationZ1, float rotationZ2, float rotationZRate, int rotationZRateStart) { this.rotationZ1 = rotationZ1; this.rotationZ2 = rotationZ2; this.rotationZRate = rotationZRate; this.rotationZRateStart = rotationZRateStart; } public float getRotationZ1() { return rotationZ1; } public float getRotationZ2() { return rotationZ2; } public float getRotationZRate() { return rotationZRate; } public int getRotationZRateStart() { return rotationZRateStart; } @Deprecated public void setHEXColor(int HEXColor) { this.HEXColor = HEXColor; } @Deprecated public int getHEXColor() { return HEXColor; } }