package zmaster587.advancedRocketry.tile.station;
import io.netty.buffer.ByteBuf;
import java.util.LinkedList;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
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.IModularInventory;
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;
import cpw.mods.fml.relauncher.Side;
public class TileStationGravityController extends TileEntity implements IModularInventory, INetworkMachine, ISliderBar {
int gravity;
int progress;
private ModuleText moduleGrav, numGravPylons, maxGravBuildSpeed, targetGrav;
public TileStationGravityController() {
moduleGrav = new ModuleText(6, 15, "Artifical Gravity: ", 0xaa2020);
//numGravPylons = new ModuleText(10, 25, "Number Of Thrusters: ", 0xaa2020);
maxGravBuildSpeed = new ModuleText(6, 25, "Max Gravity Change Rate: ", 0xaa2020);
targetGrav = new ModuleText(6, 35, "Target Gravity:", 0x202020);
}
@Override
public List<ModuleBase> getModules(int id, EntityPlayer player) {
List<ModuleBase> modules = new LinkedList<ModuleBase>();
modules.add(moduleGrav);
//modules.add(numThrusters);
modules.add(maxGravBuildSpeed);
modules.add(targetGrav);
modules.add(new ModuleSlider(6, 60, 0, TextureResources.doubleWarningSideBarIndicator, (ISliderBar)this));
updateText();
return modules;
}
@Override
public Packet getDescriptionPacket() {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setInteger("gravity", gravity);
S35PacketUpdateTileEntity packet = new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, nbt);
return super.getDescriptionPacket();
}
@Override
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
super.onDataPacket(net, pkt);
gravity = pkt.func_148857_g().getInteger("gravity");
}
@Override
public boolean canUpdate() {
return true;
}
private void updateText() {
if(worldObj.isRemote) {
ISpaceObject object = SpaceObjectManager.getSpaceManager().getSpaceStationFromBlockCoords(this.xCoord, this.zCoord);
if(object != null) {
moduleGrav.setText(String.format("Artifical Gravity: %.2f", object.getProperties().getGravitationalMultiplier()));
maxGravBuildSpeed.setText(String.format("Max Gravity Change Rate: %.1f", 7200D*object.getMaxRotationalAcceleration()));
}
//numThrusters.setText("Number Of Thrusters: 0");
targetGrav.setText(String.format("Target Gravity: %d", gravity));
}
}
@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) {
if(gravity == 0)
gravity = 15;
double targetGravity = gravity/100D;
double angVel = object.getProperties().getGravitationalMultiplier();
double acc = 0.001;
double difference = targetGravity - 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.getProperties().setGravitationalMultiplier((float)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.DIM_PROPERTY_UPDATE));
}
else
updateText();
}
}
}
else
updateText();
}
}
@Override
public String getModularInventoryName() {
return "tile.gravityControl.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)gravity);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
gravity = nbt.getShort("numRotations");
progress = gravity -10;
}
@Override
public float getNormallizedProgress(int id) {
return getProgress(0)/(float)getTotalProgress(0);
}
@Override
public void setProgress(int id, int progress) {
this.progress = progress;
gravity = progress + 10;
}
@Override
public int getProgress(int id) {
return this.progress;
}
@Override
public int getTotalProgress(int id) {
return 90;
}
@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));
}
}