Conduit Replacement Retains Connection Data (#160)

* Replacing Conduits Now maintains all Connection Settings

* Only write/read connection nbt.

* Use Correct Connectionset
This commit is contained in:
Drathonix authored and GitHub committed 2024-04-18 10:24:59 +02:00
1 parent 8ecec5b096
commit 56e163c234
3 files changed
+26 -6

No files matched your search

@@ -67,7 +67,6 @@ public abstract class AbstractItemConduit extends Item implements IConduitItem {
if (MicroblocksUtil.supportMicroblocks() && tryAddToMicroblocks(stack, player, world, x, y, z, side)) {
return true;
}
BlockCoord placeAt = Util.canPlaceItem(stack, EnderIO.blockConduitBundle, player, world, x, y, z, side);
if (placeAt != null) {
if (!world.isRemote) {
@@ -84,9 +83,7 @@ public abstract class AbstractItemConduit extends Item implements IConduitItem {
stack.stackSize--;
}
return true;
} else {
ForgeDirection dir = ForgeDirection.values()[side];
int placeX = x + dir.offsetX;
int placeY = y + dir.offsetY;
@@ -116,7 +113,6 @@ public abstract class AbstractItemConduit extends Item implements IConduitItem {
}
}
}
return false;
}
@@ -162,8 +158,7 @@ public abstract class AbstractItemConduit extends Item implements IConduitItem {
System.out.println("AbstractItemConduit.onItemUse: Conduit null.");
return false;
}
bundle.removeConduit(existingConduit);
bundle.addConduit(newConduit);
bundle.replaceConduit(existingConduit, newConduit);
if (!player.capabilities.isCreativeMode) {
stack.stackSize--;
for (ItemStack drop : existingConduit.getDrops()) {
@@ -49,6 +49,8 @@ public interface IConduitBundle extends IInternalPowerHandler, IFluidHandler, II
void addConduit(IConduit conduit);
void replaceConduit(IConduit original, IConduit replacement);
void removeConduit(IConduit conduit);
Collection<IConduit> getConduits();
@@ -404,6 +404,29 @@ public class TileConduitBundle extends TileEntityEio implements IConduitBundle {
dirty();
}
@Override
public void replaceConduit(IConduit original, IConduit replacement) {
if (worldObj.isRemote) {
return;
}
// If you're wondering why I am not using conduit.writeToNBT, it is because there is some data that should not
// persist, some of which causes crashes with energy conduits.
NBTTagCompound[] originalData = new NBTTagCompound[ForgeDirection.values().length];
for (ForgeDirection conduitConnection : original.getExternalConnections()) {
NBTTagCompound tag = new NBTTagCompound();
original.writeConnectionSettingsToNBT(conduitConnection, tag);
originalData[conduitConnection.ordinal()] = tag;
}
removeConduit(original);
addConduit(replacement);
for (int i = 0; i < originalData.length; i++) {
NBTTagCompound nbt = originalData[i];
if (nbt != null) {
replacement.readConduitSettingsFromNBT(ForgeDirection.values()[i], nbt);
}
}
}
@Override
public void removeConduit(IConduit conduit) {
if (conduit != null) {