BallOfEnergy e7b5240a9d Merge remote-tracking branch 'upstream/master' into Optimization
# Conflicts:
#	src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityAshpit.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityCore.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceSteel.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java
#	src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java
#	src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java
#	src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java
#	src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java
#	src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCoker.java
#	src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java
#	src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java
#	src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java
#	src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java
#	src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineVacuumDistill.java
#	src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java
#	src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java
#	src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java
#	src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java
#	src/main/java/com/hbm/tileentity/network/TileEntityDroneCrate.java
#	src/main/java/com/hbm/tileentity/network/TileEntityDroneRequester.java
#	src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java
#	src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java
#	src/main/java/com/hbm/tileentity/turret/TileEntityTurretRichard.java
#	src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java
#	src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java
2024-09-18 19:07:46 -05:00

294 lines
7.7 KiB
Java

package com.hbm.tileentity.network;
import java.util.List;
import com.hbm.entity.item.EntityDeliveryDrone;
import com.hbm.interfaces.IControlReceiver;
import com.hbm.inventory.FluidStack;
import com.hbm.inventory.container.ContainerDroneCrate;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.inventory.fluid.tank.FluidTank;
import com.hbm.inventory.gui.GUIDroneCrate;
import com.hbm.tileentity.IFluidCopiable;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.TileEntityMachineBase;
import com.hbm.util.BufferUtil;
import com.hbm.util.ParticleUtil;
import com.hbm.util.fauxpointtwelve.BlockPos;
import api.hbm.fluid.IFluidStandardTransceiver;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
public class TileEntityDroneCrate extends TileEntityMachineBase implements IGUIProvider, IControlReceiver, IDroneLinkable, IFluidStandardTransceiver, IFluidCopiable {
public FluidTank tank;
public int nextX = -1;
public int nextY = -1;
public int nextZ = -1;
public boolean sendingMode = false;
public boolean itemType = true;
public TileEntityDroneCrate() {
super(19);
this.tank = new FluidTank(Fluids.NONE, 64_000);
}
@Override
public String getName() {
return "container.droneCrate";
}
@Override
public void updateEntity() {
if(!worldObj.isRemote) {
BlockPos pos = getCoord();
this.tank.setType(18, slots);
if(sendingMode && !itemType && worldObj.getTotalWorldTime() % 20 == 0) {
this.subscribeToAllAround(tank.getTankType(), this);
}
if(!sendingMode && !itemType && worldObj.getTotalWorldTime() % 20 == 0) {
this.sendFluidToAll(tank, this);
}
if(nextY != -1) {
List<EntityDeliveryDrone> drones = worldObj.getEntitiesWithinAABB(EntityDeliveryDrone.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord + 1, zCoord, xCoord + 1, yCoord + 2, zCoord + 1));
for(EntityDeliveryDrone drone : drones) {
if(Vec3.createVectorHelper(drone.motionX, drone.motionY, drone.motionZ).lengthVector() < 0.05) {
drone.setTarget(nextX + 0.5, nextY, nextZ + 0.5);
if(sendingMode && itemType) loadItems(drone);
if(!sendingMode && itemType) unloadItems(drone);
if(sendingMode && !itemType) loadFluid(drone);
if(!sendingMode && !itemType) unloadFluid(drone);
}
}
ParticleUtil.spawnDroneLine(worldObj,
pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5,
(nextX - pos.getX()), (nextY - pos.getY()), (nextZ - pos.getZ()), 0x00ffff);
}
networkPackNT(25);
}
}
@Override
public void serialize(ByteBuf buf) {
BufferUtil.writeIntArray(buf, new int[] {
this.nextX,
this.nextY,
this.nextZ
});
buf.writeBoolean(this.sendingMode);
buf.writeBoolean(this.itemType);
tank.serialize(buf);
}
@Override
public void deserialize(ByteBuf buf) {
int[] pos = BufferUtil.readIntArray(buf);
this.nextX = pos[0];
this.nextY = pos[1];
this.nextZ = pos[2];
this.sendingMode = buf.readBoolean();
this.itemType = buf.readBoolean();
tank.deserialize(buf);
}
protected void loadItems(EntityDeliveryDrone drone) {
if(drone.getAppearance() != 0) return;
boolean loaded = false;
for(int i = 0; i < 18; i++) {
if(this.slots[i] != null) {
loaded = true;
drone.setInventorySlotContents(i, this.slots[i].copy());
this.slots[i] = null;
}
}
if(loaded) {
this.markDirty();
drone.setAppearance(1);
worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:item.unpack", 0.5F, 0.75F);
}
}
protected void unloadItems(EntityDeliveryDrone drone) {
if(drone.getAppearance() != 1) return;
boolean emptied = true;
for(int i = 0; i < 18; i++) {
ItemStack droneSlot = drone.getStackInSlot(i);
if(this.slots[i] == null && droneSlot != null) {
this.slots[i] = droneSlot.copy();
drone.setInventorySlotContents(i, null);
} else if(this.slots[i] != null && droneSlot != null) {
emptied = false;
}
}
this.markDirty();
if(emptied) {
drone.setAppearance(0);
worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:item.unpack", 0.5F, 0.75F);
}
}
protected void loadFluid(EntityDeliveryDrone drone) {
if(drone.getAppearance() != 0) return;
if(this.tank.getFill() > 0) {
drone.fluid = new FluidStack(tank.getTankType(), tank.getFill());
this.tank.setFill(0);
drone.setAppearance(2);
worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:item.unpack", 0.5F, 0.75F);
this.markDirty();
}
}
protected void unloadFluid(EntityDeliveryDrone drone) {
if(drone.getAppearance() != 2) return;
if(drone.fluid != null && drone.fluid.type == tank.getTankType()) {
if(drone.fluid.fill + tank.getFill() <= tank.getMaxFill()) {
tank.setFill(tank.getFill() + drone.fluid.fill);
drone.fluid = null;
drone.setAppearance(0);
} else {
int overshoot = drone.fluid.fill + tank.getFill() - tank.getMaxFill();
tank.setFill(tank.getMaxFill());
drone.fluid.fill = overshoot;
}
worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:item.unpack", 0.5F, 0.75F);
this.markDirty();
}
}
@Override
public int[] getAccessibleSlotsFromSide(int p_94128_1_) {
return new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 };
}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemStack) {
return true;
}
@Override
public boolean canExtractItem(int i, ItemStack itemStack, int j) {
return true;
}
@Override
public BlockPos getPoint() {
return new BlockPos(xCoord, yCoord + 1, zCoord);
}
@Override
public void setNextTarget(int x, int y, int z) {
this.nextX = x;
this.nextY = y;
this.nextZ = z;
this.markDirty();
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
int[] pos = nbt.getIntArray("pos");
this.nextX = pos[0];
this.nextY = pos[1];
this.nextZ = pos[2];
this.sendingMode = nbt.getBoolean("mode");
this.itemType = nbt.getBoolean("type");
tank.readFromNBT(nbt, "t");
}
public BlockPos getCoord() {
return new BlockPos(xCoord, yCoord + 1, zCoord);
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setIntArray("pos", new int[] {nextX, nextY, nextZ});
nbt.setBoolean("mode", sendingMode);
nbt.setBoolean("type", itemType);
tank.writeToNBT(nbt, "t");
}
@Override
public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new ContainerDroneCrate(player.inventory, this);
}
@Override
@SideOnly(Side.CLIENT)
public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new GUIDroneCrate(player.inventory, this);
}
@Override
public boolean hasPermission(EntityPlayer player) {
return this.isUseableByPlayer(player);
}
@Override
public void receiveControl(NBTTagCompound data) {
if(data.hasKey("mode")) {
this.sendingMode = !this.sendingMode;
this.markChanged();
}
if(data.hasKey("type")) {
this.itemType = !this.itemType;
this.markChanged();
}
}
@Override
public FluidTank[] getAllTanks() {
return new FluidTank[] { tank };
}
@Override
public FluidTank[] getSendingTanks() {
return !sendingMode && !itemType ? new FluidTank[] { tank } : new FluidTank[0];
}
@Override
public FluidTank[] getReceivingTanks() {
return sendingMode && !itemType ? new FluidTank[] { tank } : new FluidTank[0];
}
}