package shedar.mods.ic2.nuclearcontrol.tileentities;
import ic2.api.network.INetworkClientTileEntityEventListener;
import ic2.api.network.INetworkDataProvider;
import ic2.api.network.INetworkUpdateListener;
import ic2.api.tile.IWrenchable;
import ic2.core.IC2;
import ic2.core.network.ClientModifiable;
import ic2.core.network.NetworkManager;
import java.util.List;
import java.util.Vector;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Facing;
import shedar.mods.ic2.nuclearcontrol.IC2NuclearControl;
import shedar.mods.ic2.nuclearcontrol.IRedstoneConsumer;
import shedar.mods.ic2.nuclearcontrol.utils.BlockDamages;
import shedar.mods.ic2.nuclearcontrol.utils.NCLog;
import shedar.mods.ic2.nuclearcontrol.utils.RedstoneHelper;
import cpw.mods.fml.common.FMLCommonHandler;
public class TileEntityHowlerAlarm extends TileEntity implements
INetworkDataProvider, INetworkUpdateListener, IWrenchable,
IRedstoneConsumer, INetworkClientTileEntityEventListener {
private static final String DEFAULT_SOUND_NAME = "default";
private static final float BASE_SOUND_RANGE = 16F;
private static final String SOUND_PREFIX = "nuclearcontrol:alarm-";
private boolean init;
private boolean soundReceived;
private short prevFacing;
public short facing;
public int range;
private int prevRange;
public boolean powered;
private boolean prevPowered;
@ClientModifiable
public String soundName;
private String prevSoundName;
private int updateTicker;
protected int tickRate;
private TileEntitySound sound;
private int color;
public TileEntityHowlerAlarm() {
facing = 0;
prevFacing = 0;
init = false;
tickRate = 2;
updateTicker = 0;
powered = false;
prevPowered = false;
soundName = "";
range = IC2NuclearControl.instance.alarmRange;
soundReceived = false;
color = 16777215;
if (FMLCommonHandler.instance().getEffectiveSide().isClient()) {
sound = new TileEntitySound();
}
}
private void initData() {
if (!worldObj.isRemote) {
RedstoneHelper.checkPowered(worldObj, this);
}
if (FMLCommonHandler.instance().getEffectiveSide().isServer()
&& "".equals(soundName)) {
setSoundName(DEFAULT_SOUND_NAME);
}
init = true;
}
public int getRange() {
return range;
}
public void setRange(int r) {
range = r;
if (prevRange != r) {
IC2.network.get().updateTileEntityField(this, "range");
}
prevRange = range;
}
public String getSoundName() {
return soundName;
}
public void setSoundName(String name) {
soundName = name;
if (prevSoundName != name){
IC2.network.get().updateTileEntityField(this, "soundName");
}
prevSoundName = name;
}
@Override
public void onNetworkEvent(EntityPlayer entityplayer, int i) {
setRange(i);
}
@Override
public short getFacing() {
return (short) Facing.oppositeSide[facing];
}
@Override
public void setFacing(short f) {
setSide((short) Facing.oppositeSide[f]);
}
private void setSide(short f) {
facing = f;
if(init && prevFacing != f)
((NetworkManager)IC2.network.get()).updateTileEntityField(this, "facing");
prevFacing = f;
}
@Override
public boolean getPowered() {
return powered;
}
@Override
public void invalidate() {
if (FMLCommonHandler.instance().getEffectiveSide().isClient()) {
sound.stopAlarm();
}
super.invalidate();
}
@Override
public void setPowered(boolean value) {
powered = value;
if (prevPowered != value) {
if (powered) {
if (FMLCommonHandler.instance().getEffectiveSide().isClient() && soundReceived)
sound.playAlarm(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, SOUND_PREFIX + soundName, getNormalizedRange(), false);
} else {
if (FMLCommonHandler.instance().getEffectiveSide().isClient()) {
sound.stopAlarm();
}
}
// NetworkHelper.updateTileEntityField(this, "powered");
IC2.network.get().updateTileEntityField(this,
"powered");
}
prevPowered = value;
}
public void setPoweredNoNotify(boolean value) {
powered = value;
if (prevPowered != value) {
if (powered) {
if (FMLCommonHandler.instance().getEffectiveSide().isClient()
&& soundReceived)
sound.playAlarm(xCoord + 0.5D, yCoord + 0.5D,
zCoord + 0.5D, SOUND_PREFIX + soundName,
getNormalizedRange(), false);
} else {
if (FMLCommonHandler.instance().getEffectiveSide().isClient()) {
sound.stopAlarm();
}
}
}
prevPowered = value;
}
private float getNormalizedRange() {
if (worldObj.isRemote) {
return Math.min(range, IC2NuclearControl.instance.SMPMaxAlarmRange) / BASE_SOUND_RANGE;
}
return range / BASE_SOUND_RANGE;
}
@Override
public boolean wrenchCanSetFacing(EntityPlayer entityPlayer, int side) {
return false;
}
@Override
public boolean wrenchCanRemove(EntityPlayer entityPlayer) {
return true;
}
@Override
public float getWrenchDropRate() {
return 1;
}
@Override
public void onNetworkUpdate(String field) {
if (field.equals("facing") && prevFacing != facing) {
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
prevFacing = facing;
}
if (field.equals("powered") && prevPowered != powered) {
setPoweredNoNotify(powered);
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
if (worldObj.isRemote && field.equals("soundName") && prevSoundName != soundName) {
if (IC2NuclearControl.instance.availableAlarms != null && !IC2NuclearControl.instance.availableAlarms.contains(soundName)) {
IC2NuclearControl.logger.info("Can't set sound '%s' at %d,%d,%d, using default", soundName, xCoord, yCoord, zCoord);
soundName = DEFAULT_SOUND_NAME;
}
prevSoundName = soundName;
}
if (field.equals("soundName")) {
soundReceived = true;
}
}
@Override
public List<String> getNetworkedFields() {
Vector<String> vector = new Vector<String>(2);
vector.add("facing");
vector.add("powered");
vector.add("range");
vector.add("soundName");
return vector;
}
@Override
public void updateEntity() {
if (!init) {
initData();
}
super.updateEntity();
if (FMLCommonHandler.instance().getEffectiveSide().isClient()) {
if (tickRate != -1 && updateTicker-- > 0)
return;
updateTicker = tickRate;
checkStatus();
}
}
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
super.readFromNBT(nbttagcompound);
prevFacing = facing = nbttagcompound.getShort("facing");
color = nbttagcompound.getInteger("color");
if (nbttagcompound.hasKey("soundName")) {
prevSoundName = soundName = nbttagcompound.getString("soundName");
prevRange = range = nbttagcompound.getInteger("range");
}
}
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
super.writeToNBT(nbttagcompound);
nbttagcompound.setShort("facing", facing);
nbttagcompound.setString("soundName", soundName);
nbttagcompound.setInteger("range", range);
nbttagcompound.setInteger("color", color);
}
protected void checkStatus() {
if (FMLCommonHandler.instance().getEffectiveSide().isClient()) {
if (powered && soundReceived && !sound.isPlaying()) {
sound.playAlarm(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D,
SOUND_PREFIX + soundName, getNormalizedRange(), true);
}
}
}
@Override
public ItemStack getWrenchDrop(EntityPlayer entityPlayer) {
return new ItemStack(IC2NuclearControl.blockNuclearControlMain, 1, BlockDamages.DAMAGE_HOWLER_ALARM);
}
public int getColor(){
return color;
}
public void setColor(int Color){
this.color = Color;
}
@Override
public Packet getDescriptionPacket()
{
NBTTagCompound syncData = new NBTTagCompound();
syncData.setInteger("Color", color);
return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, syncData);
}
@Override
public void onDataPacket(net.minecraft.network.NetworkManager net, S35PacketUpdateTileEntity pkt)
{
color = pkt.func_148857_g().getInteger("Color");
}
}