Merge pull request #2661 from Voxelstice/oc-comp-fix

OC connection with multiblocks bug fix
This commit is contained in:
HbmMods 2026-01-20 10:33:15 +01:00 committed by GitHub
commit 69c1f49f55
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -15,6 +15,7 @@ import api.hbm.redstoneoverradio.IRORInteractive;
import api.hbm.redstoneoverradio.IRORValueProvider; import api.hbm.redstoneoverradio.IRORValueProvider;
import api.hbm.tile.IHeatSource; import api.hbm.tile.IHeatSource;
import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats;
import com.hbm.util.Compat;
import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.Optional;
import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Arguments;
@ -33,7 +34,7 @@ import net.minecraftforge.common.util.ForgeDirection;
@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers") @Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")
}) })
public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergyReceiverMK2, IEnergyConductorMK2, ISidedInventory, IFluidReceiverMK2, IHeatSource, ICrucibleAcceptor, SimpleComponent, OCComponent, IRORValueProvider, IRORInteractive { public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergyReceiverMK2, IEnergyConductorMK2, ISidedInventory, IFluidReceiverMK2, IHeatSource, ICrucibleAcceptor, SimpleComponent, OCComponent, IRORValueProvider, IRORInteractive {
TileEntity tile; TileEntity tile;
boolean inventory; boolean inventory;
boolean power; boolean power;
@ -47,13 +48,13 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
String componentName = CompatHandler.nullComponent; String componentName = CompatHandler.nullComponent;
public TileEntityProxyCombo() { } public TileEntityProxyCombo() { }
public TileEntityProxyCombo(boolean inventory, boolean power, boolean fluid) { public TileEntityProxyCombo(boolean inventory, boolean power, boolean fluid) {
this.inventory = inventory; this.inventory = inventory;
this.power = power; this.power = power;
this.fluid = fluid; this.fluid = fluid;
} }
public TileEntityProxyCombo inventory() { public TileEntityProxyCombo inventory() {
this.inventory = true; this.inventory = true;
return this; return this;
@ -75,12 +76,12 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
this.fluid = true; this.fluid = true;
return this; return this;
} }
public TileEntityProxyCombo heatSource() { public TileEntityProxyCombo heatSource() {
this.heat = true; this.heat = true;
return this; return this;
} }
/** Returns the actual tile entity that represents the core. Only for internal use, and EnergyControl. */ /** Returns the actual tile entity that represents the core. Only for internal use, and EnergyControl. */
public TileEntity getTile() { public TileEntity getTile() {
if(tile == null || tile.isInvalid() || (tile instanceof TileEntityLoadedBase && !((TileEntityLoadedBase) tile).isLoaded)) { if(tile == null || tile.isInvalid() || (tile instanceof TileEntityLoadedBase && !((TileEntityLoadedBase) tile).isLoaded)) {
@ -88,7 +89,7 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
} }
return tile; return tile;
} }
/** Returns the core tile entity, or a delegate object. */ /** Returns the core tile entity, or a delegate object. */
protected Object getCoreObject() { protected Object getCoreObject() {
return getTile(); return getTile();
@ -96,10 +97,10 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
@Override @Override
public void setPower(long i) { public void setPower(long i) {
if(!power) if(!power)
return; return;
if(getCoreObject() instanceof IEnergyReceiverMK2) { if(getCoreObject() instanceof IEnergyReceiverMK2) {
((IEnergyReceiverMK2)getCoreObject()).setPower(i); ((IEnergyReceiverMK2)getCoreObject()).setPower(i);
} }
@ -107,54 +108,54 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
@Override @Override
public long getPower() { public long getPower() {
if(!power) if(!power)
return 0; return 0;
if(getCoreObject() instanceof IEnergyReceiverMK2) { if(getCoreObject() instanceof IEnergyReceiverMK2) {
return ((IEnergyReceiverMK2)getCoreObject()).getPower(); return ((IEnergyReceiverMK2)getCoreObject()).getPower();
} }
return 0; return 0;
} }
@Override @Override
public long getMaxPower() { public long getMaxPower() {
if(!power) if(!power)
return 0; return 0;
if(getCoreObject() instanceof IEnergyReceiverMK2) { if(getCoreObject() instanceof IEnergyReceiverMK2) {
return ((IEnergyReceiverMK2)getCoreObject()).getMaxPower(); return ((IEnergyReceiverMK2)getCoreObject()).getMaxPower();
} }
return 0; return 0;
} }
@Override @Override
public long transferPower(long power) { public long transferPower(long power) {
if(!this.power) if(!this.power)
return power; return power;
if(getCoreObject() instanceof IEnergyReceiverMK2) { if(getCoreObject() instanceof IEnergyReceiverMK2) {
return ((IEnergyReceiverMK2)getCoreObject()).transferPower(power); return ((IEnergyReceiverMK2)getCoreObject()).transferPower(power);
} }
return power; return power;
} }
@Override @Override
public boolean canConnect(ForgeDirection dir) { public boolean canConnect(ForgeDirection dir) {
if(power && getCoreObject() instanceof IEnergyReceiverMK2) { if(power && getCoreObject() instanceof IEnergyReceiverMK2) {
return ((IEnergyReceiverMK2)getCoreObject()).canConnect(dir); return ((IEnergyReceiverMK2)getCoreObject()).canConnect(dir);
} }
if(conductor && getCoreObject() instanceof IEnergyConductorMK2) { if(conductor && getCoreObject() instanceof IEnergyConductorMK2) {
return ((IEnergyConductorMK2)getCoreObject()).canConnect(dir); return ((IEnergyConductorMK2)getCoreObject()).canConnect(dir);
} }
return true; return true;
} }
@ -166,46 +167,46 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
} }
public static final FluidTank[] EMPTY_TANKS = new FluidTank[0]; public static final FluidTank[] EMPTY_TANKS = new FluidTank[0];
@Override @Override
public FluidTank[] getAllTanks() { public FluidTank[] getAllTanks() {
if(!fluid) return EMPTY_TANKS; if(!fluid) return EMPTY_TANKS;
if(getCoreObject() instanceof IFluidReceiverMK2) { if(getCoreObject() instanceof IFluidReceiverMK2) {
return ((IFluidReceiverMK2)getCoreObject()).getAllTanks(); return ((IFluidReceiverMK2)getCoreObject()).getAllTanks();
} }
return EMPTY_TANKS; return EMPTY_TANKS;
} }
@Override @Override
public long transferFluid(FluidType type, int pressure, long amount) { public long transferFluid(FluidType type, int pressure, long amount) {
if(!fluid) return amount; if(!fluid) return amount;
if(getCoreObject() instanceof IFluidReceiverMK2) { if(getCoreObject() instanceof IFluidReceiverMK2) {
return ((IFluidReceiverMK2)getCoreObject()).transferFluid(type, pressure, amount); return ((IFluidReceiverMK2)getCoreObject()).transferFluid(type, pressure, amount);
} }
return amount; return amount;
} }
@Override @Override
public long getDemand(FluidType type, int pressure) { public long getDemand(FluidType type, int pressure) {
if(!fluid) return 0; if(!fluid) return 0;
if(getCoreObject() instanceof IFluidReceiverMK2) { if(getCoreObject() instanceof IFluidReceiverMK2) {
return ((IFluidReceiverMK2)getCoreObject()).getDemand(type, pressure); return ((IFluidReceiverMK2)getCoreObject()).getDemand(type, pressure);
} }
return 0; return 0;
} }
@Override @Override
public boolean canConnect(FluidType type, ForgeDirection dir) { public boolean canConnect(FluidType type, ForgeDirection dir) {
if(!this.fluid) if(!this.fluid)
return false; return false;
if(getCoreObject() instanceof IFluidConnectorMK2) { if(getCoreObject() instanceof IFluidConnectorMK2) {
return ((IFluidConnectorMK2) getCoreObject()).canConnect(type, dir); return ((IFluidConnectorMK2) getCoreObject()).canConnect(type, dir);
} }
@ -214,59 +215,59 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
@Override @Override
public int getSizeInventory() { public int getSizeInventory() {
if(!inventory) if(!inventory)
return 0; return 0;
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
return ((ISidedInventory)getCoreObject()).getSizeInventory(); return ((ISidedInventory)getCoreObject()).getSizeInventory();
} }
return 0; return 0;
} }
@Override @Override
public ItemStack getStackInSlot(int slot) { public ItemStack getStackInSlot(int slot) {
if(!inventory) if(!inventory)
return null; return null;
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
return ((ISidedInventory)getCoreObject()).getStackInSlot(slot); return ((ISidedInventory)getCoreObject()).getStackInSlot(slot);
} }
return null; return null;
} }
@Override @Override
public ItemStack decrStackSize(int i, int j) { public ItemStack decrStackSize(int i, int j) {
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
return ((ISidedInventory)getCoreObject()).decrStackSize(i, j); return ((ISidedInventory)getCoreObject()).decrStackSize(i, j);
} }
return null; return null;
} }
@Override @Override
public ItemStack getStackInSlotOnClosing(int slot) { public ItemStack getStackInSlotOnClosing(int slot) {
if(!inventory) if(!inventory)
return null; return null;
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
return ((ISidedInventory)getCoreObject()).getStackInSlotOnClosing(slot); return ((ISidedInventory)getCoreObject()).getStackInSlotOnClosing(slot);
} }
return null; return null;
} }
@Override @Override
public void setInventorySlotContents(int slot, ItemStack stack) { public void setInventorySlotContents(int slot, ItemStack stack) {
if(!inventory) if(!inventory)
return; return;
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
((ISidedInventory)getCoreObject()).setInventorySlotContents(slot, stack); ((ISidedInventory)getCoreObject()).setInventorySlotContents(slot, stack);
} }
@ -274,62 +275,62 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
@Override @Override
public String getInventoryName() { public String getInventoryName() {
if(!inventory) if(!inventory)
return null; return null;
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
return ((ISidedInventory)getCoreObject()).getInventoryName(); return ((ISidedInventory)getCoreObject()).getInventoryName();
} }
return null; return null;
} }
@Override @Override
public boolean hasCustomInventoryName() { public boolean hasCustomInventoryName() {
if(!inventory) if(!inventory)
return false; return false;
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
return ((ISidedInventory)getCoreObject()).hasCustomInventoryName(); return ((ISidedInventory)getCoreObject()).hasCustomInventoryName();
} }
return false; return false;
} }
@Override @Override
public int getInventoryStackLimit() { public int getInventoryStackLimit() {
if(!inventory) if(!inventory)
return 0; return 0;
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
return ((ISidedInventory)getCoreObject()).getInventoryStackLimit(); return ((ISidedInventory)getCoreObject()).getInventoryStackLimit();
} }
return 0; return 0;
} }
@Override @Override
public boolean isUseableByPlayer(EntityPlayer player) { public boolean isUseableByPlayer(EntityPlayer player) {
if(!inventory) if(!inventory)
return false; return false;
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
return ((ISidedInventory)getCoreObject()).isUseableByPlayer(player); return ((ISidedInventory)getCoreObject()).isUseableByPlayer(player);
} }
return false; return false;
} }
@Override @Override
public void openInventory() { public void openInventory() {
if(!inventory) if(!inventory)
return; return;
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
((ISidedInventory)getCoreObject()).openInventory(); ((ISidedInventory)getCoreObject()).openInventory();
} }
@ -337,10 +338,10 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
@Override @Override
public void closeInventory() { public void closeInventory() {
if(!inventory) if(!inventory)
return; return;
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
((ISidedInventory)getCoreObject()).closeInventory(); ((ISidedInventory)getCoreObject()).closeInventory();
} }
@ -348,68 +349,68 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
@Override @Override
public boolean isItemValidForSlot(int slot, ItemStack stack) { public boolean isItemValidForSlot(int slot, ItemStack stack) {
if(!inventory) if(!inventory)
return false; return false;
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
if(getCoreObject() instanceof IConditionalInvAccess) return ((IConditionalInvAccess) getCoreObject()).isItemValidForSlot(xCoord, yCoord, zCoord, slot, stack); if(getCoreObject() instanceof IConditionalInvAccess) return ((IConditionalInvAccess) getCoreObject()).isItemValidForSlot(xCoord, yCoord, zCoord, slot, stack);
return ((ISidedInventory)getCoreObject()).isItemValidForSlot(slot, stack); return ((ISidedInventory)getCoreObject()).isItemValidForSlot(slot, stack);
} }
return false; return false;
} }
@Override @Override
public int[] getAccessibleSlotsFromSide(int side) { public int[] getAccessibleSlotsFromSide(int side) {
if(!inventory) if(!inventory)
return new int[0]; return new int[0];
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
if(getCoreObject() instanceof IConditionalInvAccess) return ((IConditionalInvAccess) getCoreObject()).getAccessibleSlotsFromSide(xCoord, yCoord, zCoord, side); if(getCoreObject() instanceof IConditionalInvAccess) return ((IConditionalInvAccess) getCoreObject()).getAccessibleSlotsFromSide(xCoord, yCoord, zCoord, side);
return ((ISidedInventory)getCoreObject()).getAccessibleSlotsFromSide(side); return ((ISidedInventory)getCoreObject()).getAccessibleSlotsFromSide(side);
} }
return new int[0]; return new int[0];
} }
@Override @Override
public boolean canInsertItem(int i, ItemStack stack, int j) { public boolean canInsertItem(int i, ItemStack stack, int j) {
if(!inventory) if(!inventory)
return false; return false;
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
if(getCoreObject() instanceof IConditionalInvAccess) return ((IConditionalInvAccess) getCoreObject()).canInsertItem(xCoord, yCoord, zCoord, i, stack, j); if(getCoreObject() instanceof IConditionalInvAccess) return ((IConditionalInvAccess) getCoreObject()).canInsertItem(xCoord, yCoord, zCoord, i, stack, j);
return ((ISidedInventory)getCoreObject()).canInsertItem(i, stack, j); return ((ISidedInventory)getCoreObject()).canInsertItem(i, stack, j);
} }
return false; return false;
} }
@Override @Override
public boolean canExtractItem(int i, ItemStack stack, int j) { public boolean canExtractItem(int i, ItemStack stack, int j) {
if(!inventory) if(!inventory)
return false; return false;
if(getCoreObject() instanceof ISidedInventory) { if(getCoreObject() instanceof ISidedInventory) {
if(getCoreObject() instanceof IConditionalInvAccess) return ((IConditionalInvAccess) getCoreObject()).canExtractItem(xCoord, yCoord, zCoord, i, stack, j); if(getCoreObject() instanceof IConditionalInvAccess) return ((IConditionalInvAccess) getCoreObject()).canExtractItem(xCoord, yCoord, zCoord, i, stack, j);
return ((ISidedInventory)getCoreObject()).canExtractItem(i, stack, j); return ((ISidedInventory)getCoreObject()).canExtractItem(i, stack, j);
} }
return false; return false;
} }
@Override @Override
public void readFromNBT(NBTTagCompound nbt) { public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt); super.readFromNBT(nbt);
@ -424,7 +425,7 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
this.componentName = nbt.getString("ocname"); this.componentName = nbt.getString("ocname");
} }
@Override @Override
public void writeToNBT(NBTTagCompound nbt) { public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt); super.writeToNBT(nbt);
@ -441,23 +442,23 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
@Override @Override
public int getHeatStored() { public int getHeatStored() {
if(!this.heat) if(!this.heat)
return 0; return 0;
if(getCoreObject() instanceof IHeatSource) { if(getCoreObject() instanceof IHeatSource) {
return ((IHeatSource)getCoreObject()).getHeatStored(); return ((IHeatSource)getCoreObject()).getHeatStored();
} }
return 0; return 0;
} }
@Override @Override
public void useUpHeat(int heat) { public void useUpHeat(int heat) {
if(!this.heat) if(!this.heat)
return; return;
if(getCoreObject() instanceof IHeatSource) { if(getCoreObject() instanceof IHeatSource) {
((IHeatSource)getCoreObject()).useUpHeat(heat); ((IHeatSource)getCoreObject()).useUpHeat(heat);
} }
@ -512,10 +513,22 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
@Override @Override
@Optional.Method(modid = "OpenComputers") @Optional.Method(modid = "OpenComputers")
public boolean canConnectNode(ForgeDirection side) { public boolean canConnectNode(ForgeDirection side) {
if(this.getCoreObject() instanceof OCComponent) if(this.getCoreObject() instanceof OCComponent) {
boolean isComponent = false;
if (this.worldObj != null) {
Object nodeTE = Compat.getTileStandard(this.worldObj, this.xCoord + side.offsetX, this.yCoord + side.offsetY, this.zCoord + side.offsetZ);
if (nodeTE instanceof TileEntityProxyCombo) {
TileEntityProxyCombo proxy = (TileEntityProxyCombo)nodeTE;
if (proxy.getCoreObject() == this.getCoreObject()) isComponent = true;
} else if (nodeTE == this.getCoreObject()) {
isComponent = true;
}
}
return (this.getBlockMetadata() >= 6 && this.getBlockMetadata() <= 11) return (this.getBlockMetadata() >= 6 && this.getBlockMetadata() <= 11)
&& (power || fluid) && && (power || fluid) &&
((OCComponent) this.getCoreObject()).canConnectNode(side); ((OCComponent) this.getCoreObject()).canConnectNode(side) &&
!isComponent;
}
return OCComponent.super.canConnectNode(null); return OCComponent.super.canConnectNode(null);
} }