Skip to content

Commit ebc0338

Browse files
ghzdudeserenibyss
andauthored
Implement Quantum Storage Controller Network (#1963)
Co-authored-by: Serenibyss <[email protected]>
1 parent 067d32f commit ebc0338

File tree

47 files changed

+1620
-54
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1620
-54
lines changed

src/main/java/gregtech/api/capability/GregtechDataCodes.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ public static int assignId() {
140140
public static final int UPDATE_ITEM_COUNT = assignId();
141141
public static final int UPDATE_FLUID_AMOUNT = assignId();
142142

143+
// Quantum Storage Controller
144+
public static final int UPDATE_CONTROLLER_POS = assignId();
145+
public static final int REMOVE_CONTROLLER = assignId();
146+
public static final int LOCATE_CONTROLLER = assignId();
147+
143148
// Detector Covers
144149
public static final int UPDATE_INVERTED = assignId();
145150

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package gregtech.api.capability;
2+
3+
import net.minecraftforge.items.IItemHandler;
4+
5+
public interface IDualHandler {
6+
7+
boolean hasFluidTanks();
8+
9+
boolean hasItemHandlers();
10+
11+
IMultipleTankHandler getFluidTanks();
12+
13+
IItemHandler getItemHandlers();
14+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package gregtech.api.capability;
2+
3+
import net.minecraft.util.math.BlockPos;
4+
import net.minecraftforge.common.capabilities.ICapabilityProvider;
5+
6+
// ICapabilityProvider is needed because getCapability is called in the quantum proxy against this interface
7+
public interface IQuantumController extends ICapabilityProvider {
8+
9+
/**
10+
* Constructs the network upon placement and when storages are added/removed
11+
* <br />
12+
*/
13+
void rebuildNetwork();
14+
15+
/**
16+
* Return whether this storage block can connect. Can be used to implement a maximum distance from controller for
17+
* example.
18+
*/
19+
boolean canConnect(IQuantumStorage<?> storage);
20+
21+
BlockPos getPos();
22+
23+
IDualHandler getHandler();
24+
25+
boolean isPowered();
26+
27+
long getEnergyUsage();
28+
29+
int getCount(IQuantumStorage.Type type);
30+
31+
long getTypeEnergy(IQuantumStorage<?> storage);
32+
33+
void updateHandler();
34+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package gregtech.api.capability;
2+
3+
import gregtech.api.cover.CoverableView;
4+
import gregtech.api.metatileentity.MetaTileEntity;
5+
import gregtech.api.metatileentity.interfaces.IGregTechTileEntity;
6+
7+
import net.minecraft.util.EnumFacing;
8+
import net.minecraft.util.math.BlockPos;
9+
10+
import org.jetbrains.annotations.Nullable;
11+
12+
public interface IQuantumStorage<T> extends CoverableView {
13+
14+
Type getType();
15+
16+
void setConnected(IQuantumController controller);
17+
18+
void setDisconnected();
19+
20+
BlockPos getControllerPos();
21+
22+
@Nullable
23+
IQuantumController getQuantumController();
24+
25+
BlockPos getPos();
26+
27+
default boolean isConnected() {
28+
// use controllerPos here because it is synced
29+
// on both sides, where controller is not
30+
return getControllerPos() != null;
31+
}
32+
33+
default void tryFindNetwork() {
34+
for (EnumFacing facing : EnumFacing.VALUES) {
35+
var offset = getPos().offset(facing);
36+
var state = getWorld().getBlockState(offset);
37+
if (state.getBlock().isAir(state, getWorld(), offset)) continue;
38+
MetaTileEntity mte;
39+
if (getNeighbor(facing) instanceof IGregTechTileEntity gtte) {
40+
mte = gtte.getMetaTileEntity();
41+
} else {
42+
continue;
43+
}
44+
45+
IQuantumController candidate = null;
46+
if (mte instanceof IQuantumStorage<?>storage) {
47+
if (storage.isConnected()) {
48+
IQuantumController controller = storage.getQuantumController();
49+
if (controller != null && controller.canConnect(this)) {
50+
candidate = controller;
51+
}
52+
}
53+
} else if (mte instanceof IQuantumController quantumController) {
54+
if (quantumController.canConnect(this)) {
55+
candidate = quantumController;
56+
}
57+
}
58+
if (candidate != null) {
59+
candidate.rebuildNetwork();
60+
return;
61+
}
62+
}
63+
}
64+
65+
T getTypeValue();
66+
67+
enum Type {
68+
69+
ITEM,
70+
FLUID,
71+
EXTENDER,
72+
PROXY,
73+
ENERGY;
74+
75+
public static final Type[] VALUES = values();
76+
}
77+
}

src/main/java/gregtech/api/gui/widgets/ClickButtonWidget.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import net.minecraft.item.ItemStack;
1616
import net.minecraft.network.PacketBuffer;
1717

18-
import com.google.common.base.Preconditions;
1918
import org.lwjgl.input.Mouse;
2019

2120
import java.util.Arrays;
@@ -64,7 +63,6 @@ public ClickButtonWidget setDisplayFunction(Supplier<Boolean> displayFunction) {
6463
}
6564

6665
public ClickButtonWidget setTooltipText(String tooltipText, Object... args) {
67-
Preconditions.checkNotNull(tooltipText, "tooltipText");
6866
this.tooltipText = tooltipText;
6967
this.tooltipArgs = args;
7068
return this;

src/main/java/gregtech/client/renderer/handler/BlockPosHighlightRenderer.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,33 @@
1919
public class BlockPosHighlightRenderer {
2020

2121
private static BlockPos posHighLight;
22-
private static long hlEndTime;
22+
private static long duration;
23+
private static long offset;
24+
private static long start;
2325

2426
public static void renderBlockBoxHighLight(BlockPos blockpos, long durTimeMillis) {
2527
posHighLight = blockpos;
26-
hlEndTime = System.currentTimeMillis() + durTimeMillis;
28+
duration = durTimeMillis;
29+
offset = 1500;
30+
start = System.currentTimeMillis();
31+
}
32+
33+
public static void renderBlockBoxHighLight(BlockPos blockpos, long durTimeMillis, long offsetTimeMillis) {
34+
posHighLight = blockpos;
35+
duration = durTimeMillis;
36+
offset = offsetTimeMillis;
37+
start = System.currentTimeMillis();
2738
}
2839

2940
public static void renderWorldLastEvent(RenderWorldLastEvent evt) {
3041
if (posHighLight != null) {
3142
long time = System.currentTimeMillis();
32-
if (time > hlEndTime) {
43+
if (time > duration + start) {
3344
posHighLight = null;
34-
hlEndTime = 0;
45+
duration = 0;
3546
return;
3647
}
37-
if (((time / 500) & 1) == 0) {
48+
if (time % offset >= offset / 2) {
3849
return;
3950
}
4051
EntityPlayerSP p = Minecraft.getMinecraft().player;

src/main/java/gregtech/client/renderer/texture/Textures.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,32 @@ public class Textures {
9797
"casings/pipe/machine_casing_grate");
9898
public static final SimpleOverlayRenderer HIGH_POWER_CASING = new SimpleOverlayRenderer(
9999
"casings/computer/high_power_casing");
100+
public static final SimpleOverlayRenderer QUANTUM_CASING = new SimpleOverlayRenderer(
101+
"casings/quantum/quantum_casing");
102+
public static final SimpleOverlayRenderer QUANTUM_CONTROLLER_FRONT_INACTIVE = new SimpleOverlayRenderer(
103+
"casings/quantum/controller_front_inactive");
104+
public static final SimpleOverlayRenderer QUANTUM_CONTROLLER_FRONT_ACTIVE = new SimpleOverlayRenderer(
105+
"casings/quantum/controller_front_active");
106+
public static final SimpleOverlayRenderer QUANTUM_CONTROLLER_ACTIVE = new SimpleOverlayRenderer(
107+
"casings/quantum/controller_active");
108+
public static final SimpleOverlayRenderer QUANTUM_CONTROLLER_INACTIVE = new SimpleOverlayRenderer(
109+
"casings/quantum/controller_inactive");
110+
public static final SimpleOverlayRenderer QUANTUM_PROXY_INACTIVE = new SimpleOverlayRenderer(
111+
"casings/quantum/proxy_inactive");
112+
public static final SimpleOverlayRenderer QUANTUM_PROXY_ACTIVE = new SimpleOverlayRenderer(
113+
"casings/quantum/proxy_active");
114+
public static final SimpleOverlayRenderer QUANTUM_EXTENDER = new SimpleOverlayRenderer("casings/quantum/extender");
115+
public static final SimpleOverlayRenderer QUANTUM_EXTENDER_ACTIVE = new SimpleOverlayRenderer(
116+
"casings/quantum/extender_active");
117+
118+
public static final SimpleOverlayRenderer QUANTUM_INDICATOR = new SimpleOverlayRenderer(
119+
"casings/quantum/quantum_indicator_disconnected");
120+
121+
public static final SimpleOverlayRenderer QUANTUM_INDICATOR_CONNECTED = new SimpleOverlayRenderer(
122+
"casings/quantum/quantum_indicator_connected");
123+
124+
public static final SimpleOverlayRenderer QUANTUM_INDICATOR_POWERED = new SimpleOverlayRenderer(
125+
"casings/quantum/quantum_indicator_powered");
100126

101127
// Simple Sided Cube Renderers
102128
public static final SimpleSidedCubeRenderer STEAM_CASING_BRONZE = new SimpleSidedCubeRenderer(

src/main/java/gregtech/client/renderer/texture/custom/QuantumStorageRenderer.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
import gregtech.api.gui.resources.TextTexture;
44
import gregtech.api.metatileentity.ITieredMetaTileEntity;
5-
import gregtech.api.metatileentity.MetaTileEntity;
65
import gregtech.api.util.TextFormattingUtil;
76
import gregtech.client.renderer.texture.Textures;
87
import gregtech.client.renderer.texture.cube.SimpleSidedCubeRenderer.RenderSide;
98
import gregtech.client.utils.RenderUtil;
109
import gregtech.common.ConfigHolder;
1110
import gregtech.common.metatileentities.storage.MetaTileEntityQuantumChest;
11+
import gregtech.common.metatileentities.storage.MetaTileEntityQuantumStorage;
1212

1313
import net.minecraft.client.Minecraft;
1414
import net.minecraft.client.renderer.GlStateManager;
@@ -69,10 +69,10 @@ public void registerIcons(TextureMap textureMap) {
6969
.registerSprite(new ResourceLocation("gregtech:blocks/overlay/machine/overlay_screen_glass"));
7070
}
7171

72-
public <T extends MetaTileEntity & ITieredMetaTileEntity> void renderMachine(CCRenderState renderState,
73-
Matrix4 translation,
74-
IVertexOperation[] pipeline,
75-
T mte) {
72+
public <T extends MetaTileEntityQuantumStorage<?> & ITieredMetaTileEntity> void renderMachine(CCRenderState renderState,
73+
Matrix4 translation,
74+
IVertexOperation[] pipeline,
75+
T mte) {
7676
EnumFacing frontFacing = mte.getFrontFacing();
7777
int tier = mte.getTier();
7878
Textures.renderFace(renderState, translation, pipeline, frontFacing, glassBox, glassTexture,
@@ -81,6 +81,10 @@ public <T extends MetaTileEntity & ITieredMetaTileEntity> void renderMachine(CCR
8181
TextureAtlasSprite hullTexture = Textures.VOLTAGE_CASINGS[tier]
8282
.getSpriteOnSide(RenderSide.bySide(EnumFacing.NORTH));
8383

84+
if (mte.isConnected()) {
85+
hullTexture = Textures.QUANTUM_CASING.getParticleSprite();
86+
}
87+
8488
for (var facing : boxFacingMap.keySet()) {
8589
// do not render the box at the front face when "facing" is "frontFacing"
8690
if (facing == frontFacing) continue;

src/main/java/gregtech/common/items/behaviors/TricorderBehavior.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import gregtech.api.capability.GregtechTileCapabilities;
66
import gregtech.api.capability.IElectricItem;
77
import gregtech.api.capability.IEnergyContainer;
8+
import gregtech.api.capability.IQuantumController;
9+
import gregtech.api.capability.IQuantumStorage;
810
import gregtech.api.capability.IWorkable;
911
import gregtech.api.capability.impl.FluidTankList;
1012
import gregtech.api.items.metaitem.stats.IItemBehaviour;
@@ -284,6 +286,30 @@ else if (metaTileEntity instanceof IDataInfoProvider)
284286
list.addAll(provider.getDataInfo());
285287
}
286288

289+
// quantum storage
290+
if (metaTileEntity instanceof IQuantumController quantumController) {
291+
list.add(new TextComponentTranslation("behavior.tricorder.divider"));
292+
long eut = quantumController.getEnergyUsage(); // eu per 10 ticks
293+
int tier = GTUtility.getTierByVoltage(eut / 10);
294+
list.add(new TextComponentTranslation("behavior.tricorder.quantum_controller.usage",
295+
TextFormatting.RED + String.format("%.1f", eut / 10d) + TextFormatting.RESET,
296+
GTValues.VNF[tier]));
297+
var handler = quantumController.getHandler();
298+
list.add(new TextComponentTranslation("behavior.tricorder.quantum_controller.connected_items",
299+
TextFormatting.RED.toString() + handler.getItemHandlers().getSlots()));
300+
list.add(new TextComponentTranslation("behavior.tricorder.quantum_controller.connected_fluids",
301+
TextFormatting.RED.toString() + handler.getFluidTanks().getTanks()));
302+
} else if (metaTileEntity instanceof IQuantumStorage<?>storage) {
303+
var qcontrollor = storage.getQuantumController();
304+
if (qcontrollor != null) {
305+
long eut = qcontrollor.getTypeEnergy(storage);
306+
307+
list.add(new TextComponentTranslation("behavior.tricorder.divider"));
308+
list.add(new TextComponentTranslation("behavior.tricorder.quantum_storage.usage",
309+
TextFormatting.RED + String.format("%.1f", eut / 10d)));
310+
}
311+
}
312+
287313
} else if (tileEntity instanceof IPipeTile) {
288314
// pipes need special name handling
289315
IPipeTile<?, ?> pipeTile = (IPipeTile<?, ?>) tileEntity;

src/main/java/gregtech/common/metatileentities/MetaTileEntities.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@
124124
import gregtech.common.metatileentities.storage.MetaTileEntityCreativeTank;
125125
import gregtech.common.metatileentities.storage.MetaTileEntityDrum;
126126
import gregtech.common.metatileentities.storage.MetaTileEntityQuantumChest;
127+
import gregtech.common.metatileentities.storage.MetaTileEntityQuantumExtender;
128+
import gregtech.common.metatileentities.storage.MetaTileEntityQuantumProxy;
129+
import gregtech.common.metatileentities.storage.MetaTileEntityQuantumStorageController;
127130
import gregtech.common.metatileentities.storage.MetaTileEntityQuantumTank;
128131
import gregtech.common.metatileentities.storage.MetaTileEntityWorkbench;
129132
import gregtech.common.pipelike.fluidpipe.longdistance.MetaTileEntityLDFluidEndpoint;
@@ -222,6 +225,9 @@ public class MetaTileEntities {
222225
public static final MetaTileEntityRotorHolder[] ROTOR_HOLDER = new MetaTileEntityRotorHolder[6]; // HV, EV, IV, LuV, ZPM, UV
223226
public static final MetaTileEntityMufflerHatch[] MUFFLER_HATCH = new MetaTileEntityMufflerHatch[GTValues.UV + 1]; // LV-UV
224227
public static final MetaTileEntityFusionReactor[] FUSION_REACTOR = new MetaTileEntityFusionReactor[3];
228+
public static MetaTileEntityQuantumStorageController QUANTUM_STORAGE_CONTROLLER;
229+
public static MetaTileEntityQuantumProxy QUANTUM_STORAGE_PROXY;
230+
public static MetaTileEntityQuantumExtender QUANTUM_STORAGE_EXTENDER;
225231
public static final MetaTileEntityQuantumChest[] QUANTUM_CHEST = new MetaTileEntityQuantumChest[10];
226232
public static final MetaTileEntityQuantumTank[] QUANTUM_TANK = new MetaTileEntityQuantumTank[10];
227233
public static final MetaTileEntityBuffer[] BUFFER = new MetaTileEntityBuffer[3];
@@ -977,6 +983,14 @@ public static void init() {
977983
PUMP[2] = registerMetaTileEntity(1532, new MetaTileEntityPump(gregtechId("pump.hv"), 3));
978984
PUMP[3] = registerMetaTileEntity(1533, new MetaTileEntityPump(gregtechId("pump.ev"), 4));
979985

986+
// Quantum Storage Network 1757 - 1759
987+
QUANTUM_STORAGE_CONTROLLER = registerMetaTileEntity(1757,
988+
new MetaTileEntityQuantumStorageController(gregtechId("quantum_storage_controller")));
989+
QUANTUM_STORAGE_PROXY = registerMetaTileEntity(1758,
990+
new MetaTileEntityQuantumProxy(gregtechId("quantum_storage_proxy")));
991+
QUANTUM_STORAGE_EXTENDER = registerMetaTileEntity(1759,
992+
new MetaTileEntityQuantumExtender(gregtechId("quantum_storage_extender")));
993+
980994
// Super / Quantum Chests, IDs 1560-1574
981995
for (int i = 0; i < 5; i++) {
982996
String voltageName = GTValues.VN[i + 1].toLowerCase();

0 commit comments

Comments
 (0)