package zmaster587.advancedRocketry.tile.station;
import io.netty.buffer.ByteBuf;
import java.util.LinkedList;
import java.util.List;
import cpw.mods.fml.relauncher.Side;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import zmaster587.advancedRocketry.api.stations.ISpaceObject;
import zmaster587.advancedRocketry.inventory.TextureResources;
import zmaster587.advancedRocketry.network.PacketStationUpdate;
import zmaster587.advancedRocketry.stations.SpaceObjectManager;
import zmaster587.advancedRocketry.world.provider.WorldProviderSpace;
import zmaster587.libVulpes.inventory.modules.IButtonInventory;
import zmaster587.libVulpes.inventory.modules.IModularInventory;
import zmaster587.libVulpes.inventory.modules.IProgressBar;
import zmaster587.libVulpes.inventory.modules.ISliderBar;
import zmaster587.libVulpes.inventory.modules.ModuleBase;
import zmaster587.libVulpes.inventory.modules.ModuleSlider;
import zmaster587.libVulpes.inventory.modules.ModuleText;
import zmaster587.libVulpes.network.PacketHandler;
import zmaster587.libVulpes.network.PacketMachine;
import zmaster587.libVulpes.util.INetworkMachine;
public class TileStationOrientationControl extends TileEntity implements IModularInventory, INetworkMachine, ISliderBar {
int numRotationsPerHour;
int progress;
private ModuleText moduleAngularVelocity, numThrusters, maxAngularAcceleration, targetRotations;
public TileStationOrientationControl() {
moduleAngularVelocity = new ModuleText(6, 15, "Angular Velocity: ", 0xaa2020);
//numThrusters = new ModuleText(10, 25, "Number Of Thrusters: ", 0xaa2020);
maxAngularAcceleration = new ModuleText(6, 25, "Maximum Angular Acceleration: ", 0xaa2020);
targetRotations = new ModuleText(6, 35, "Target Ang Vel:", 0x202020);
progress = getTotalProgress(0)/2;
}
@Override
public List<ModuleBase> getModules(int id, EntityPlayer player) {
List<ModuleBase> modules = new LinkedList<ModuleBase>();
modules.add(moduleAngularVelocity);
//modules.add(numThrusters);
modules.add(maxAngularAcceleration);
modules.add(targetRotations);
modules.add(new ModuleSlider(6, 60, 0, TextureResources.doubleWarningSideBarIndicator, (ISliderBar)this));
updateText();
return modules;
}
@Override
public boolean canUpdate() {
return true;
}
private void updateText() {
if(worldObj.isRemote) {
ISpaceObject object = SpaceObjectManager.getSpaceManager().getSpaceStationFromBlockCoords(this.xCoord, this.zCoord);
if(object != null) {
moduleAngularVelocity.setText(String.format("Angular Velocity: %.1f", 7200D*object.getDeltaRotation()));
maxAngularAcceleration.setText(String.format("Maximum Angular Acceleration: %.1f", 7200D*object.getMaxRotationalAcceleration()));
}
//numThrusters.setText("Number Of Thrusters: 0");
targetRotations.setText(String.format("Target Ang Vel: %d", numRotationsPerHour));
}
}
@Override
public void updateEntity() {
super.updateEntity();
if(this.worldObj.provider instanceof WorldProviderSpace) {
if(!worldObj.isRemote) {
ISpaceObject object = SpaceObjectManager.getSpaceManager().getSpaceStationFromBlockCoords(this.xCoord, this.zCoord);
if(object != null) {
double targetAngularVelocity = numRotationsPerHour/7200D;
double angVel = object.getDeltaRotation();
double acc = object.getMaxRotationalAcceleration();
double difference = targetAngularVelocity - angVel;
if(difference != 0) {
double finalVel = angVel;
if(difference < 0) {
finalVel = angVel + Math.max(difference, -acc);
}
else if(difference > 0) {
finalVel = angVel + Math.min(difference, acc);
}
object.setDeltaRotation(finalVel);
if(!worldObj.isRemote) {
//PacketHandler.sendToNearby(new PacketStationUpdate(object, PacketStationUpdate.Type.ROTANGLE_UPDATE), this.worldObj.provider.dimensionId, this.xCoord, this.yCoord, this.zCoord, 1024);
PacketHandler.sendToAll(new PacketStationUpdate(object, PacketStationUpdate.Type.ROTANGLE_UPDATE));
}
}
}
else
updateText();
}
else
updateText();
}
}
@Override
public String getModularInventoryName() {
return "tile.orientationControl.name";
}
@Override
public boolean canInteractWithContainer(EntityPlayer entity) {
return true;
}
@Override
public void writeDataToNetwork(ByteBuf out, byte id) {
if(id == 0) {
out.writeShort(progress);
}
}
@Override
public void readDataFromNetwork(ByteBuf in, byte packetId,
NBTTagCompound nbt) {
if(packetId == 0) {
setProgress(0, in.readShort());
}
}
@Override
public void useNetworkData(EntityPlayer player, Side side, byte id,
NBTTagCompound nbt) {
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setShort("numRotations", (short)numRotationsPerHour);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
numRotationsPerHour = nbt.getShort("numRotations");
progress = numRotationsPerHour + getTotalProgress(0)/2;
}
@Override
public float getNormallizedProgress(int id) {
return getProgress(0)/(float)getTotalProgress(0);
}
@Override
public void setProgress(int id, int progress) {
this.progress = progress;
numRotationsPerHour = 1*(progress - getTotalProgress(id)/2);
}
@Override
public int getProgress(int id) {
return this.progress;
}
@Override
public int getTotalProgress(int id) {
return 120;
}
@Override
public void setTotalProgress(int id, int progress) {
}
@Override
public void setProgressByUser(int id, int progress) {
setProgress(id, progress);
PacketHandler.sendToServer(new PacketMachine(this, (byte)0));
}
}