mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
267 lines
6.1 KiB
Java
267 lines
6.1 KiB
Java
package com.hbm.tileentity.machine;
|
|
|
|
import java.util.List;
|
|
|
|
import com.hbm.entity.item.EntityMovingItem;
|
|
import com.hbm.inventory.recipes.PressRecipes;
|
|
import com.hbm.items.machine.ItemStamp;
|
|
import com.hbm.lib.Library;
|
|
import com.hbm.tileentity.TileEntityMachineBase;
|
|
import com.hbm.util.BufferUtil;
|
|
import com.hbm.util.fauxpointtwelve.DirPos;
|
|
|
|
import api.hbm.energymk2.IEnergyReceiverMK2;
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
import io.netty.buffer.ByteBuf;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
import net.minecraftforge.common.util.ForgeDirection;
|
|
|
|
public class TileEntityConveyorPress extends TileEntityMachineBase implements IEnergyReceiverMK2 {
|
|
|
|
public int usage = 100;
|
|
public long power = 0;
|
|
public final static long maxPower = 50000;
|
|
|
|
public double speed = 0.125;
|
|
public double press;
|
|
public double renderPress;
|
|
public double lastPress;
|
|
private double syncPress;
|
|
private int turnProgress;
|
|
protected boolean isRetracting = false;
|
|
private int delay;
|
|
|
|
public ItemStack syncStack;
|
|
|
|
public TileEntityConveyorPress() {
|
|
super(1);
|
|
}
|
|
|
|
@Override
|
|
public String getName() {
|
|
return "";
|
|
}
|
|
|
|
@Override
|
|
public void updateEntity() {
|
|
|
|
if(!worldObj.isRemote) {
|
|
|
|
this.updateConnections();
|
|
|
|
if(delay <= 0) {
|
|
|
|
if(isRetracting) {
|
|
|
|
if(this.canRetract()) {
|
|
this.press -= speed;
|
|
this.power -= this.usage;
|
|
|
|
if(press <= 0) {
|
|
press = 0;
|
|
this.isRetracting = false;
|
|
delay = 0;
|
|
}
|
|
}
|
|
|
|
} else {
|
|
|
|
if(this.canExtend()) {
|
|
this.press += speed;
|
|
this.power -= this.usage;
|
|
|
|
if(press >= 1) {
|
|
press = 1;
|
|
this.isRetracting = true;
|
|
delay = 5;
|
|
this.process();
|
|
}
|
|
}
|
|
}
|
|
|
|
} else {
|
|
delay--;
|
|
}
|
|
|
|
this.networkPackNT(50);
|
|
} else {
|
|
|
|
// approach-based interpolation, GO!
|
|
this.lastPress = this.renderPress;
|
|
|
|
if(this.turnProgress > 0) {
|
|
this.renderPress = this.renderPress + ((this.syncPress - this.renderPress) / (double) this.turnProgress);
|
|
--this.turnProgress;
|
|
} else {
|
|
this.renderPress = this.syncPress;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void updateConnections() {
|
|
for(DirPos pos : getConPos()) this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir());
|
|
}
|
|
|
|
protected DirPos[] getConPos() {
|
|
return new DirPos[] {
|
|
new DirPos(xCoord + 1, yCoord, zCoord, Library.POS_X),
|
|
new DirPos(xCoord - 1, yCoord, zCoord, Library.NEG_X),
|
|
new DirPos(xCoord, yCoord, zCoord + 1, Library.POS_Z),
|
|
new DirPos(xCoord, yCoord, zCoord - 1, Library.NEG_Z),
|
|
};
|
|
}
|
|
|
|
public boolean canExtend() {
|
|
|
|
if(this.power < usage) return false;
|
|
if(slots[0] == null) return false;
|
|
|
|
List<EntityMovingItem> items = worldObj.getEntitiesWithinAABB(EntityMovingItem.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord + 1, zCoord, xCoord + 1, yCoord + 1.5, zCoord + 1));
|
|
if(items.isEmpty()) return false;
|
|
|
|
for(EntityMovingItem item : items) {
|
|
ItemStack stack = item.getItemStack();
|
|
if(PressRecipes.getOutput(stack, slots[0]) != null && stack.stackSize == 1) {
|
|
|
|
double d0 = 0.35;
|
|
double d1 = 0.65;
|
|
if(item.posX > xCoord + d0 && item.posX < xCoord + d1 && item.posZ > zCoord + d0 && item.posZ < zCoord + d1) {
|
|
item.setPosition(xCoord + 0.5, item.posY, zCoord + 0.5);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public void process() {
|
|
|
|
List<EntityMovingItem> items = worldObj.getEntitiesWithinAABB(EntityMovingItem.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord + 1, zCoord, xCoord + 1, yCoord + 1.5, zCoord + 1));
|
|
|
|
for(EntityMovingItem item : items) {
|
|
ItemStack stack = item.getItemStack();
|
|
ItemStack output = PressRecipes.getOutput(stack, slots[0]);
|
|
|
|
if(output != null && stack.stackSize == 1) {
|
|
item.setDead();
|
|
EntityMovingItem out = new EntityMovingItem(worldObj);
|
|
out.setPosition(item.posX, item.posY, item.posZ);
|
|
out.setItemStack(output.copy());
|
|
worldObj.spawnEntityInWorld(out);
|
|
}
|
|
}
|
|
|
|
this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "hbm:block.pressOperate", getVolume(1.5F), 1.0F);
|
|
|
|
if(slots[0].getMaxDamage() != 0) {
|
|
slots[0].setItemDamage(slots[0].getItemDamage() + 1);
|
|
if(slots[0].getItemDamage() >= slots[0].getMaxDamage()) {
|
|
slots[0] = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
public boolean canRetract() {
|
|
return this.power >= usage;
|
|
}
|
|
|
|
@Override
|
|
public void serialize(ByteBuf buf) {
|
|
super.serialize(buf);
|
|
|
|
buf.writeLong(this.power);
|
|
buf.writeDouble(this.syncPress);
|
|
BufferUtil.writeItemStack(buf, syncStack);
|
|
}
|
|
|
|
@Override
|
|
public void deserialize(ByteBuf buf) {
|
|
super.deserialize(buf);
|
|
|
|
this.power = buf.readLong();
|
|
this.syncPress = buf.readDouble();
|
|
this.syncStack = BufferUtil.readItemStack(buf);
|
|
|
|
this.turnProgress = 2;
|
|
}
|
|
|
|
@Override
|
|
public boolean isItemValidForSlot(int i, ItemStack stack) {
|
|
return stack.getItem() instanceof ItemStamp;
|
|
}
|
|
|
|
@Override
|
|
public int[] getAccessibleSlotsFromSide(int side) {
|
|
return new int[] { 0 };
|
|
}
|
|
|
|
@Override
|
|
public boolean canInsertItem(int i, ItemStack itemStack, int j) {
|
|
return this.isItemValidForSlot(i, itemStack);
|
|
}
|
|
|
|
@Override
|
|
public long getPower() {
|
|
return power;
|
|
}
|
|
|
|
@Override
|
|
public long getMaxPower() {
|
|
return maxPower;
|
|
}
|
|
|
|
@Override
|
|
public void setPower(long power) {
|
|
this.power = power;
|
|
}
|
|
|
|
@Override
|
|
public boolean canConnect(ForgeDirection dir) {
|
|
return dir != ForgeDirection.DOWN;
|
|
}
|
|
|
|
@Override
|
|
public void readFromNBT(NBTTagCompound nbt) {
|
|
super.readFromNBT(nbt);
|
|
this.power = nbt.getLong("power");
|
|
this.press = nbt.getDouble("press");
|
|
}
|
|
|
|
@Override
|
|
public void writeToNBT(NBTTagCompound nbt) {
|
|
super.writeToNBT(nbt);
|
|
nbt.setLong("power", power);
|
|
nbt.setDouble("press", press);
|
|
}
|
|
|
|
AxisAlignedBB bb = null;
|
|
|
|
@Override
|
|
public AxisAlignedBB getRenderBoundingBox() {
|
|
|
|
if(bb == null) {
|
|
bb = AxisAlignedBB.getBoundingBox(
|
|
xCoord - 1,
|
|
yCoord,
|
|
zCoord - 1,
|
|
xCoord + 2,
|
|
yCoord + 3,
|
|
zCoord + 2
|
|
);
|
|
}
|
|
|
|
return bb;
|
|
}
|
|
|
|
@Override
|
|
@SideOnly(Side.CLIENT)
|
|
public double getMaxRenderDistanceSquared() {
|
|
return 65536.0D;
|
|
}
|
|
}
|