Skip to content
This repository was archived by the owner on Jul 16, 2023. It is now read-only.

Commit 25b21d9

Browse files
committed
copy paste of alot of pipewalker code from ceu
1 parent bc5fe50 commit 25b21d9

File tree

7 files changed

+308
-31
lines changed

7 files changed

+308
-31
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package net.htmlcsjs.htmlTech.common.laserpipe.net;
2+
3+
import gregtech.api.pipenet.PipeNetWalker;
4+
import gregtech.api.pipenet.tile.IPipeTile;
5+
import net.htmlcsjs.htmlTech.api.capability.HtmlTechCapabilities;
6+
import net.htmlcsjs.htmlTech.api.capability.ILaserContainer;
7+
import net.htmlcsjs.htmlTech.common.laserpipe.tile.TileEntityLaserPipe;
8+
import net.minecraft.tileentity.TileEntity;
9+
import net.minecraft.util.EnumFacing;
10+
import net.minecraft.util.math.BlockPos;
11+
import net.minecraft.world.World;
12+
13+
import javax.annotation.Nullable;
14+
import java.util.ArrayList;
15+
import java.util.HashSet;
16+
import java.util.List;
17+
import java.util.Set;
18+
19+
public class LaserNetWalker extends PipeNetWalker {
20+
private final List<LaserRoutePath> routes;
21+
private Set<TileEntityLaserPipe> pipes = new HashSet<>();
22+
23+
protected LaserNetWalker(World world, BlockPos sourcePipe, int walkedBlocks, List<LaserRoutePath> routes) {
24+
super(world, sourcePipe, walkedBlocks);
25+
this.routes = routes;
26+
}
27+
28+
public static List<LaserRoutePath> createNetData(World world, BlockPos sourcePipe) {
29+
LaserNetWalker walker = new LaserNetWalker(world, sourcePipe, 1, new ArrayList<>());
30+
walker.traversePipeNet();
31+
return walker.routes;
32+
}
33+
34+
@Override
35+
protected PipeNetWalker createSubWalker(World world, BlockPos blockPos, int walkedBlocks) {
36+
LaserNetWalker walker = new LaserNetWalker(world, blockPos, walkedBlocks, routes);
37+
walker.pipes = new HashSet<>(pipes);
38+
return walker;
39+
}
40+
41+
@Override
42+
protected void checkPipe(IPipeTile<?, ?> pipeTile, BlockPos blockPos) {
43+
pipes.add((TileEntityLaserPipe) pipeTile);
44+
}
45+
46+
@Override
47+
protected void checkNeighbour(IPipeTile<?, ?> pipeTile, BlockPos blockPos, EnumFacing faceToNeighbour, @Nullable TileEntity neighbourTile) {
48+
if (neighbourTile != null) {
49+
ILaserContainer container = neighbourTile.getCapability(HtmlTechCapabilities.LASER_CONTAINER, faceToNeighbour.getOpposite());
50+
if (container != null) {
51+
routes.add(new LaserRoutePath(new BlockPos(blockPos), faceToNeighbour, new HashSet<>(pipes), getWalkedBlocks()));
52+
}
53+
}
54+
}
55+
56+
@Override
57+
protected boolean isValidPipe(IPipeTile<?, ?> currentPipe, IPipeTile<?, ?> neighbourPipe, BlockPos blockPos, EnumFacing enumFacing) {
58+
return neighbourPipe instanceof TileEntityLaserPipe;
59+
}
60+
}

src/main/java/net/htmlcsjs/htmlTech/common/laserpipe/net/LaserPipeNet.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,76 @@
11
package net.htmlcsjs.htmlTech.common.laserpipe.net;
22

3+
import gregtech.api.pipenet.Node;
34
import gregtech.api.pipenet.PipeNet;
45
import gregtech.api.pipenet.WorldPipeNet;
56
import gregtech.api.pipenet.block.simple.EmptyNodeData;
67
import net.minecraft.nbt.NBTTagCompound;
8+
import net.minecraft.util.EnumFacing;
9+
import net.minecraft.util.math.BlockPos;
10+
import net.minecraft.world.World;
11+
12+
import java.util.Comparator;
13+
import java.util.HashMap;
14+
import java.util.List;
15+
import java.util.Map;
716

817
public class LaserPipeNet extends PipeNet<EmptyNodeData> {
918

19+
private long lastEnergyFluxPerSec;
20+
private long energyFluxPerSec;
21+
private long lastTime;
22+
23+
private final Map<BlockPos, List<LaserRoutePath>> NET_DATA = new HashMap<>();
24+
1025
public LaserPipeNet(WorldPipeNet<EmptyNodeData, ? extends PipeNet> world) {
1126
super(world);
1227
}
1328

29+
public List<LaserRoutePath> getNetData(BlockPos pipePos) {
30+
List<LaserRoutePath> data = NET_DATA.get(pipePos);
31+
if (data == null) {
32+
data = LaserNetWalker.createNetData(getWorldData(), pipePos);
33+
data.sort(Comparator.comparingInt(LaserRoutePath::getDistance));
34+
NET_DATA.put(pipePos, data);
35+
}
36+
return data;
37+
}
38+
39+
public void nodeNeighbourChanged(BlockPos pos) {
40+
NET_DATA.clear();
41+
}
42+
43+
public long getEnergyFluxPerSec() {
44+
World world = getWorldData();
45+
if (world != null && !world.isRemote && (world.getWorldTime() - lastTime) >= 20) {
46+
lastTime = world.getWorldTime();
47+
clearCache();
48+
}
49+
return lastEnergyFluxPerSec;
50+
}
51+
52+
public void addEnergyFluxPerSec(long energy) {
53+
energyFluxPerSec += energy;
54+
}
55+
56+
public void clearCache() {
57+
lastEnergyFluxPerSec = energyFluxPerSec;
58+
energyFluxPerSec = 0;
59+
}
60+
@Override
61+
protected void updateBlockedConnections(BlockPos nodePos, EnumFacing facing, boolean isBlocked) {
62+
super.updateBlockedConnections(nodePos, facing, isBlocked);
63+
NET_DATA.clear();
64+
}
65+
66+
@Override
67+
protected void transferNodeData(Map<BlockPos, Node<EmptyNodeData>> transferredNodes, PipeNet<EmptyNodeData> parentNet) {
68+
super.transferNodeData(transferredNodes, parentNet);
69+
NET_DATA.clear();
70+
((LaserPipeNet) parentNet).NET_DATA.clear();
71+
}
72+
73+
1474
@Override
1575
protected void writeNodeData(EmptyNodeData emptyNodeData, NBTTagCompound nbtTagCompound) {
1676

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package net.htmlcsjs.htmlTech.common.laserpipe.net;
2+
3+
import gregtech.api.capability.GregtechCapabilities;
4+
import gregtech.api.capability.IEnergyContainer;
5+
import net.htmlcsjs.htmlTech.common.laserpipe.tile.TileEntityLaserPipe;
6+
import net.minecraft.tileentity.TileEntity;
7+
import net.minecraft.util.EnumFacing;
8+
import net.minecraft.util.math.BlockPos;
9+
import net.minecraft.world.World;
10+
11+
import java.util.Set;
12+
13+
public class LaserRoutePath {
14+
private final BlockPos destPipePos;
15+
private final EnumFacing destFacing;
16+
private final int distance;
17+
private final Set<TileEntityLaserPipe> path;
18+
19+
public LaserRoutePath(BlockPos destPipePos, EnumFacing destFacing, Set<TileEntityLaserPipe> path, int distance) {
20+
this.destPipePos = destPipePos;
21+
this.destFacing = destFacing;
22+
this.path = path;
23+
this.distance = distance;
24+
}
25+
26+
public int getDistance() {
27+
return distance;
28+
}
29+
30+
public Set<TileEntityLaserPipe> getPath() {
31+
return path;
32+
}
33+
34+
public BlockPos getPipePos() {
35+
return destPipePos;
36+
}
37+
38+
public EnumFacing getFaceToHandler() {
39+
return destFacing;
40+
}
41+
42+
public BlockPos getHandlerPos() {
43+
return destPipePos.offset(destFacing);
44+
}
45+
46+
public IEnergyContainer getHandler(World world) {
47+
TileEntity tile = world.getTileEntity(getHandlerPos());
48+
if(tile != null) {
49+
return tile.getCapability(GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER, destFacing.getOpposite());
50+
}
51+
return null;
52+
}
53+
}
Lines changed: 95 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,145 @@
11
package net.htmlcsjs.htmlTech.common.laserpipe.net;
22

3+
import gregtech.api.capability.IEnergyContainer;
4+
import gregtech.api.util.GTUtility;
5+
import net.htmlcsjs.htmlTech.HtmlTech;
36
import net.htmlcsjs.htmlTech.api.capability.ILaserContainer;
47
import net.htmlcsjs.htmlTech.common.laserpipe.tile.TileEntityLaserPipe;
8+
import net.minecraft.init.Blocks;
59
import net.minecraft.util.EnumFacing;
10+
import net.minecraft.util.EnumParticleTypes;
11+
import net.minecraft.util.math.BlockPos;
12+
import net.minecraft.world.World;
13+
import net.minecraft.world.WorldServer;
14+
15+
import java.util.List;
16+
import java.util.Objects;
617

718
public class PipeLaserContainer implements ILaserContainer {
819

9-
private final TileEntityLaserPipe pipe;
20+
private final LaserPipeNet net;
21+
private final TileEntityLaserPipe cable;
22+
private final EnumFacing facing;
1023

11-
private long diodeVoltage;
12-
private long diodeAmperage;
24+
public PipeLaserContainer(LaserPipeNet net, TileEntityLaserPipe cable, EnumFacing facing) {
25+
this.net = Objects.requireNonNull(net);
26+
this.cable = Objects.requireNonNull(cable);
27+
this.facing = facing;
28+
}
1329

14-
public PipeLaserContainer(TileEntityLaserPipe pipe) {
15-
this.pipe = pipe;
30+
public long getInputPerSec() {
31+
return net.getEnergyFluxPerSec();
1632
}
1733

18-
@Override
19-
public long acceptEnergyFromNetwork(EnumFacing enumFacing, long voltage, long amperage) {
20-
if (enumFacing == null || voltage <= 0 || amperage <= 0) return 0;
21-
ILaserContainer laserContainer = pipe.findLaserContainer(enumFacing);
22-
if (laserContainer != null)
23-
return laserContainer.acceptEnergyFromNetwork(enumFacing, voltage, amperage);
24-
return 0;
34+
public long getOutputPerSec() {
35+
return net.getEnergyFluxPerSec();
2536
}
2637

2738
@Override
28-
public boolean inputsEnergy(EnumFacing enumFacing) {
29-
return false;
39+
public long acceptEnergyFromNetwork(EnumFacing side, long voltage, long amperage) {
40+
if (side == null) {
41+
if (facing == null) return 0;
42+
side = facing;
43+
}
44+
45+
long amperesUsed = 0L;
46+
List<LaserRoutePath> paths = net.getNetData(cable.getPos());
47+
outer:
48+
for (LaserRoutePath path : paths) {
49+
if (GTUtility.arePosEqual(cable.getPos(), path.getPipePos()) && side == path.getFaceToHandler()) {
50+
//Do not insert into source handler
51+
continue;
52+
}
53+
IEnergyContainer dest = path.getHandler(cable.getWorld());
54+
EnumFacing facing = path.getFaceToHandler().getOpposite();
55+
if (dest == null || !dest.inputsEnergy(facing) || dest.getEnergyCanBeInserted() <= 0) continue;
56+
long amps = 0;
57+
if (voltage > 0) {
58+
amps = dest.acceptEnergyFromNetwork(facing, voltage, amperage - amperesUsed);
59+
}
60+
amperesUsed += amps;;
61+
for (TileEntityLaserPipe cable : path.getPath()) {
62+
if(voltage <= 0)
63+
break;
64+
cable.incrementAmperage(amps, voltage);
65+
}
66+
67+
if (amperage == amperesUsed)
68+
break;
69+
}
70+
net.addEnergyFluxPerSec(amperesUsed * voltage);
71+
return amperesUsed;
72+
}
73+
74+
private void burnCable(World world, BlockPos pos) {
75+
world.setBlockState(pos, Blocks.FIRE.getDefaultState());
76+
if (!world.isRemote) {
77+
((WorldServer) world).spawnParticle(EnumParticleTypes.SMOKE_LARGE,
78+
pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5,
79+
5 + world.rand.nextInt(3), 0.0, 0.0, 0.0, 0.1);
80+
}
3081
}
3182

3283
@Override
33-
public long changeEnergy(long l) {
34-
throw new UnsupportedOperationException("Don't use changeEnergy on laser pipes");
84+
public long getInputAmperage() {
85+
return Short.MAX_VALUE;
3586
}
3687

3788
@Override
38-
public long getEnergyStored() {
39-
return 0;
89+
public long getInputVoltage() {
90+
return Integer.MAX_VALUE;
4091
}
4192

4293
@Override
4394
public long getEnergyCapacity() {
44-
return 0;
95+
return getInputVoltage() * getInputAmperage();
4596
}
4697

4798
@Override
48-
public long getInputAmperage() {
49-
return 0;
99+
public long changeEnergy(long energyToAdd) {
100+
HtmlTech.logger.fatal("Do not use changeEnergy() for cables! Use acceptEnergyFromNetwork()");
101+
return acceptEnergyFromNetwork(facing == null ? EnumFacing.UP : facing,
102+
energyToAdd / getInputAmperage(),
103+
energyToAdd / getInputVoltage()) * getInputVoltage();
50104
}
51105

52106
@Override
53-
public long getInputVoltage() {
107+
public boolean outputsEnergy(EnumFacing side) {
108+
return true;
109+
}
110+
111+
@Override
112+
public boolean inputsEnergy(EnumFacing side) {
113+
return true;
114+
}
115+
116+
@Override
117+
public long getEnergyStored() {
54118
return 0;
55119
}
56120

57121
@Override
58122
public long getDiodeAmperage() {
59-
return diodeAmperage;
123+
return 0;
60124
}
61125

62126
@Override
63127
public long getDiodeVoltage() {
64-
return diodeVoltage;
128+
return 0;
65129
}
66130

67131
@Override
68132
public void setDiodeAmperage(long amperage) {
69-
diodeAmperage = amperage;
133+
70134
}
71135

72136
@Override
73137
public void setDiodeVoltage(long voltage) {
74-
diodeVoltage = voltage;
138+
139+
}
140+
141+
@Override
142+
public boolean isOneProbeHidden() {
143+
return true;
75144
}
76145
}

0 commit comments

Comments
 (0)