package mods.eln.sound; import mods.eln.misc.Coordonate; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; public class SoundCommand { World world; double x, y, z; String track; double trackLength; float volume = 1, pitch = 1; float rangeNominal, rangeMax, blockFactor; ArrayList<Integer> uuid = new ArrayList<Integer>(); enum Range {Small, Mid, Far} public SoundCommand() { mediumRange(); } public SoundCommand(String track) { this.track = track; mediumRange(); } public SoundCommand(String track, double trackLength) { this.track = track; this.trackLength = trackLength; mediumRange(); } public SoundCommand(SoundTrack s) { track = s.track; volume = s.volume; pitch = s.pitch; rangeNominal = s.rangeNominal; rangeMax = s.rangeMax; blockFactor = s.blockFactor; uuid = (ArrayList<Integer>) s.uuid.clone(); } public SoundCommand copy() { SoundCommand c = new SoundCommand(); c.world = world; c.x = x; c.y = y; c.z = z; c.track = track; c.trackLength = trackLength; c.volume = volume; c.pitch = pitch; c.rangeNominal = rangeNominal; c.rangeMax = rangeMax; c.blockFactor = blockFactor; c.uuid = (ArrayList<Integer>) uuid.clone(); return c; } public void play() { if (world.isRemote) SoundClient.play(this); else SoundServer.play(this); } public void set(Coordonate c) { world = c.world(); x = c.x + 0.5; y = c.y + 0.5; z = c.z + 0.5; } public SoundCommand set(TileEntity c) { world = c.getWorldObj(); x = c.xCoord + 0.5; y = c.yCoord + 0.5; z = c.zCoord + 0.5; //mediumRange(); return this; } void applyRange(Range range) { switch (range) { case Small: smallRange(); break; case Far: longRange(); break; case Mid: default: mediumRange(); break; } } public SoundCommand mediumRange() { rangeNominal = 4; rangeMax = 16; blockFactor = 1; return this; } public SoundCommand smallRange() { rangeNominal = 2; rangeMax = 8; blockFactor = 3; return this; } public SoundCommand verySmallRange() { rangeNominal = 2; rangeMax = 4; blockFactor = 10; return this; } public SoundCommand longRange() { rangeNominal = 8; rangeMax = 48; blockFactor = 0.3f; return this; } public SoundCommand mulVolume(float volume, float pitch) { this.volume *= volume; this.pitch *= pitch; return this; } public SoundCommand addUuid(int uuid) { this.uuid.add(uuid); return this; } public static SoundCommand fromStream(DataInputStream stream, World w) throws IOException { SoundCommand p = new SoundCommand(); p.world = w; p.x = stream.readInt() / 8.0; p.y = stream.readInt() / 8.0; p.z = stream.readInt() / 8.0; p.track = stream.readUTF(); p.volume = stream.readFloat(); p.pitch = stream.readFloat(); p.rangeNominal = stream.readFloat(); p.rangeMax = stream.readFloat(); p.blockFactor = stream.readFloat(); p.uuid = new ArrayList<Integer>(); for (int idx = stream.readByte(); idx != 0; idx--) { p.addUuid(stream.readInt()); } return p; } public void writeTo(DataOutputStream stream) throws IOException { stream.writeInt((int) (x * 8)); stream.writeInt((int) (y * 8)); stream.writeInt((int) (z * 8)); stream.writeUTF(track); stream.writeFloat(volume); stream.writeFloat(pitch); stream.writeFloat(rangeNominal); stream.writeFloat(rangeMax); stream.writeFloat(blockFactor); stream.writeByte(uuid.size()); for (Integer i : uuid) { stream.writeInt(i); } } public SoundCommand mulVolume(double volume) { this.volume *= volume; return this; } public SoundCommand applyNominalVolume(double nominalVolume) { //this.blockFactor *= nominalVolume; mulVolume(nominalVolume); return this; } public SoundCommand mulBlockAttenuation(double factor) { this.blockFactor *= factor; return this; } }