Skip to content

Commit 1e2be60

Browse files
authored
Stricter Optical/Laser cable connections (GregTechCEu#2103)
1 parent 9112d89 commit 1e2be60

File tree

4 files changed

+51
-0
lines changed

4 files changed

+51
-0
lines changed

src/main/java/gregtech/api/pipenet/tile/IPipeTile.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ default long getTickTimer() {
3636

3737
int getConnections();
3838

39+
int getNumConnections();
40+
3941
boolean isConnected(EnumFacing side);
4042

4143
void setConnection(EnumFacing side, boolean connected, boolean fromNeighbor);

src/main/java/gregtech/api/pipenet/tile/TileEntityPipeBase.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,17 @@ public int getConnections() {
143143
return connections;
144144
}
145145

146+
@Override
147+
public int getNumConnections() {
148+
int count = 0;
149+
int connections = getConnections();
150+
while (connections > 0) {
151+
count++;
152+
connections = connections & (connections - 1);
153+
}
154+
return count;
155+
}
156+
146157
@Override
147158
public int getBlockedConnections() {
148159
return canHaveBlockedFaces() ? blockedConnections : 0;

src/main/java/gregtech/common/pipelike/laser/tile/TileEntityLaserPipe.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import gregtech.common.pipelike.laser.net.WorldLaserPipeNet;
1414
import net.minecraft.nbt.NBTTagCompound;
1515
import net.minecraft.network.PacketBuffer;
16+
import net.minecraft.tileentity.TileEntity;
1617
import net.minecraft.util.EnumFacing;
1718
import net.minecraftforge.common.capabilities.Capability;
1819
import net.minecraftforge.common.util.Constants;
@@ -116,6 +117,27 @@ public void transferDataFrom(IPipeTile<LaserPipeType, LaserPipeProperties> tileE
116117
}
117118
}
118119

120+
@Override
121+
public void setConnection(EnumFacing side, boolean connected, boolean fromNeighbor) {
122+
if (!getWorld().isRemote && connected && !fromNeighbor) {
123+
int connections = getConnections();
124+
// block connection if any side other than the requested side and its opposite side are already connected.
125+
connections &= ~(1 << side.getIndex());
126+
connections &= ~(1 << side.getOpposite().getIndex());
127+
if (connections != 0) return;
128+
129+
// check the same for the targeted pipe
130+
TileEntity tile = getWorld().getTileEntity(getPos().offset(side));
131+
if (tile instanceof IPipeTile<?,?> pipeTile && pipeTile.getPipeType().getClass() == this.getPipeType().getClass()) {
132+
connections = pipeTile.getConnections();
133+
connections &= ~(1 << side.getIndex());
134+
connections &= ~(1 << side.getOpposite().getIndex());
135+
if (connections != 0) return;
136+
}
137+
}
138+
super.setConnection(side, connected, fromNeighbor);
139+
}
140+
119141
public boolean isActive() {
120142
return this.isActive;
121143
}

src/main/java/gregtech/common/pipelike/optical/tile/TileEntityOpticalPipe.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import gregtech.common.pipelike.optical.net.OpticalPipeNet;
1515
import gregtech.common.pipelike.optical.net.WorldOpticalPipeNet;
1616
import net.minecraft.network.PacketBuffer;
17+
import net.minecraft.tileentity.TileEntity;
1718
import net.minecraft.util.EnumFacing;
1819
import net.minecraftforge.common.capabilities.Capability;
1920

@@ -125,6 +126,21 @@ public void transferDataFrom(IPipeTile<OpticalPipeType, OpticalPipeProperties> t
125126
}
126127
}
127128

129+
@Override
130+
public void setConnection(EnumFacing side, boolean connected, boolean fromNeighbor) {
131+
if (!getWorld().isRemote && connected && !fromNeighbor) {
132+
// never allow more than two connections total
133+
if (getNumConnections() >= 2) return;
134+
135+
// also check the other pipe
136+
TileEntity tile = getWorld().getTileEntity(getPos().offset(side));
137+
if (tile instanceof IPipeTile<?,?> pipeTile && pipeTile.getPipeType().getClass() == this.getPipeType().getClass()) {
138+
if (pipeTile.getNumConnections() >= 2) return;
139+
}
140+
}
141+
super.setConnection(side, connected, fromNeighbor);
142+
}
143+
128144
public boolean isActive() {
129145
return this.isActive;
130146
}

0 commit comments

Comments
 (0)