Skip to content

Commit 30cf93c

Browse files
Quantum Tanks/Chests can now disallow input from their export face via screwdriver (#69)
1 parent 95d1f58 commit 30cf93c

File tree

2 files changed

+90
-28
lines changed

2 files changed

+90
-28
lines changed

src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumChest.java

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import codechicken.lib.vec.Matrix4;
88
import gregtech.api.capability.GregtechTileCapabilities;
99
import gregtech.api.capability.IActiveOutputSide;
10+
import gregtech.api.capability.impl.ItemHandlerProxy;
11+
import gregtech.api.cover.ICoverable;
1012
import gregtech.api.gui.GuiTextures;
1113
import gregtech.api.gui.ModularUI;
1214
import gregtech.api.gui.ModularUI.Builder;
@@ -35,6 +37,7 @@
3537
import net.minecraft.world.World;
3638
import net.minecraftforge.common.capabilities.Capability;
3739
import net.minecraftforge.common.util.Constants.NBT;
40+
import net.minecraftforge.items.CapabilityItemHandler;
3841
import net.minecraftforge.items.IItemHandler;
3942
import net.minecraftforge.items.IItemHandlerModifiable;
4043
import net.minecraftforge.items.ItemStackHandler;
@@ -58,6 +61,7 @@ public class MetaTileEntityQuantumChest extends MetaTileEntity implements ITiere
5861
private static final String NBT_ITEMSTACK = "ItemStack";
5962
private static final String NBT_PARTIALSTACK = "PartialStack";
6063
private static final String NBT_ITEMCOUNT = "ItemAmount";
64+
protected IItemHandler outputItemInventory;
6165

6266
public MetaTileEntityQuantumChest(ResourceLocation metaTileEntityId, int tier, long maxStoredItems) {
6367
super(metaTileEntityId);
@@ -185,6 +189,7 @@ public void addInformation(ItemStack stack, @Nullable World player, List<String>
185189
protected void initializeInventory() {
186190
super.initializeInventory();
187191
this.itemInventory = new QuantumChestItemHandler();
192+
this.outputItemInventory = new ItemHandlerProxy(new ItemStackHandler(0), exportItems);
188193
}
189194

190195
@Override
@@ -285,6 +290,9 @@ public void setOutputFacing(EnumFacing outputFacing) {
285290
@Override
286291
public boolean onWrenchClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, CuboidRayTraceResult hitResult) {
287292
if (!playerIn.isSneaking()) {
293+
if (getOutputFacing() == facing || getFrontFacing() == facing) {
294+
return false;
295+
}
288296
if (!getWorld().isRemote) {
289297
setOutputFacing(facing);
290298
}
@@ -342,17 +350,14 @@ public <T> T getCapability(Capability<T> capability, EnumFacing side) {
342350
}
343351
return null;
344352
}
345-
return super.getCapability(capability, side);
346-
347-
}
348-
349-
@Override
350-
public boolean canPlaceCoverOnSide(EnumFacing side) {
351-
//Done to prevent loops as output always acts as input
352-
if (side == getOutputFacing()) {
353-
return false;
353+
else if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
354+
IItemHandler itemHandler = (side == getOutputFacing() && !isAllowInputFromOutputSide()) ? outputItemInventory : itemInventory;
355+
if (itemHandler.getSlots() > 0) {
356+
return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(itemHandler);
357+
}
358+
return null;
354359
}
355-
return true;
360+
return super.getCapability(capability, side);
356361
}
357362

358363
@Override
@@ -383,6 +388,30 @@ public void clearMachineInventory(NonNullList<ItemStack> itemBuffer) {
383388
clearInventory(itemBuffer, importItems);
384389
}
385390

391+
@Override
392+
public boolean onScrewdriverClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, CuboidRayTraceResult hitResult) {
393+
EnumFacing hitFacing = ICoverable.determineGridSideHit(hitResult);
394+
if (facing == getOutputFacing() || (hitFacing == getOutputFacing() && playerIn.isSneaking())) {
395+
if (!getWorld().isRemote) {
396+
if (isAllowInputFromOutputSide()) {
397+
setAllowInputFromOutputSide(false);
398+
playerIn.sendMessage(new TextComponentTranslation("gregtech.machine.basic.input_from_output_side.disallow"));
399+
} else {
400+
setAllowInputFromOutputSide(true);
401+
playerIn.sendMessage(new TextComponentTranslation("gregtech.machine.basic.input_from_output_side.allow"));
402+
}
403+
}
404+
return true;
405+
}
406+
return super.onScrewdriverClick(playerIn, hand, facing, hitResult);
407+
}
408+
public void setAllowInputFromOutputSide(boolean allowInputFromOutputSide) {
409+
this.allowInputFromOutputSide = allowInputFromOutputSide;
410+
if (!getWorld().isRemote) {
411+
markDirty();
412+
}
413+
}
414+
386415
private class QuantumChestItemHandler implements IItemHandler {
387416

388417
@Override

src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumTank.java

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import codechicken.lib.vec.Matrix4;
88
import gregtech.api.capability.GregtechTileCapabilities;
99
import gregtech.api.capability.IActiveOutputSide;
10+
import gregtech.api.capability.impl.FluidHandlerProxy;
1011
import gregtech.api.capability.impl.FluidTankList;
12+
import gregtech.api.cover.ICoverable;
1113
import gregtech.api.gui.GuiTextures;
1214
import gregtech.api.gui.ModularUI;
1315
import gregtech.api.gui.ModularUI.Builder;
@@ -28,11 +30,14 @@
2830
import net.minecraft.util.NonNullList;
2931
import net.minecraft.util.ResourceLocation;
3032
import net.minecraft.util.math.MathHelper;
33+
import net.minecraft.util.text.TextComponentTranslation;
3134
import net.minecraft.world.World;
3235
import net.minecraftforge.common.capabilities.Capability;
3336
import net.minecraftforge.fluids.FluidRegistry;
3437
import net.minecraftforge.fluids.FluidStack;
3538
import net.minecraftforge.fluids.FluidTank;
39+
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
40+
import net.minecraftforge.fluids.capability.IFluidHandler;
3641
import net.minecraftforge.items.ItemStackHandler;
3742
import org.apache.commons.lang3.ArrayUtils;
3843
import org.apache.commons.lang3.tuple.Pair;
@@ -49,7 +54,8 @@ public class MetaTileEntityQuantumTank extends MetaTileEntity implements ITiered
4954
private final ItemStackHandler containerInventory;
5055
private boolean autoOutputFluids;
5156
private EnumFacing outputFacing;
52-
private final boolean allowInputFromOutputSide = true;
57+
private boolean allowInputFromOutputSide = true;
58+
protected IFluidHandler outputFluidInventory;
5359

5460
public MetaTileEntityQuantumTank(ResourceLocation metaTileEntityId, int tier, int maxFluidCapacity) {
5561
super(metaTileEntityId);
@@ -71,6 +77,7 @@ protected void initializeInventory() {
7177
this.fluidInventory = fluidTank;
7278
this.importFluids = new FluidTankList(false, fluidTank);
7379
this.exportFluids = new FluidTankList(false, fluidTank);
80+
this.outputFluidInventory = new FluidHandlerProxy(new FluidTankList(false), exportFluids);
7481
}
7582

7683
@Override
@@ -153,11 +160,6 @@ protected FluidTankList createExportFluidHandler() {
153160
return new FluidTankList(false, fluidTank);
154161
}
155162

156-
@Override
157-
public boolean hasFrontFacing() {
158-
return false;
159-
}
160-
161163
@Override
162164
public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) {
163165
Textures.VOLTAGE_CASINGS[tier].render(renderState, translation, ArrayUtils.add(pipeline,
@@ -223,6 +225,14 @@ public EnumFacing getOutputFacing() {
223225
return outputFacing == null ? EnumFacing.SOUTH : outputFacing;
224226
}
225227

228+
@Override
229+
public void setFrontFacing(EnumFacing frontFacing) {
230+
super.setFrontFacing(EnumFacing.UP);
231+
if (this.outputFacing == null) {
232+
//set initial output facing as opposite to front
233+
setOutputFacing(frontFacing.getOpposite());
234+
}
235+
}
226236

227237
@Override
228238
public boolean isAutoOutputItems() {
@@ -235,7 +245,7 @@ public boolean isAutoOutputFluids() {
235245

236246
@Override
237247
public boolean isAllowInputFromOutputSide() {
238-
return true;
248+
return allowInputFromOutputSide;
239249
}
240250

241251
@Override
@@ -279,22 +289,24 @@ public <T> T getCapability(Capability<T> capability, EnumFacing side) {
279289
}
280290
return null;
281291
}
282-
return super.getCapability(capability, side);
283-
284-
}
292+
else if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) {
293+
IFluidHandler fluidHandler = (side == getOutputFacing() && !isAllowInputFromOutputSide()) ? outputFluidInventory : fluidInventory;
294+
if (fluidHandler.getTankProperties().length > 0) {
295+
return CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY.cast(fluidHandler);
296+
}
285297

286-
@Override
287-
public boolean canPlaceCoverOnSide(EnumFacing side) {
288-
//Done to prevent loops as output always acts as input
289-
if (side == getOutputFacing()) {
290-
return false;
298+
return null;
291299
}
292-
return true;
300+
return super.getCapability(capability, side);
301+
293302
}
294303

295304
@Override
296305
public boolean onWrenchClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, CuboidRayTraceResult hitResult) {
297306
if (!playerIn.isSneaking()) {
307+
if (getOutputFacing() == facing || getFrontFacing() == facing) {
308+
return false;
309+
}
298310
if (!getWorld().isRemote) {
299311
setOutputFacing(facing);
300312
}
@@ -303,14 +315,35 @@ public boolean onWrenchClick(EntityPlayer playerIn, EnumHand hand, EnumFacing fa
303315
return super.onWrenchClick(playerIn, hand, facing, hitResult);
304316
}
305317

318+
@Override
319+
public boolean onScrewdriverClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, CuboidRayTraceResult hitResult) {
320+
EnumFacing hitFacing = ICoverable.determineGridSideHit(hitResult);
321+
if (facing == getOutputFacing() || (hitFacing == getOutputFacing() && playerIn.isSneaking())) {
322+
if (!getWorld().isRemote) {
323+
if (isAllowInputFromOutputSide()) {
324+
setAllowInputFromOutputSide(false);
325+
playerIn.sendMessage(new TextComponentTranslation("gregtech.machine.basic.input_from_output_side.disallow"));
326+
} else {
327+
setAllowInputFromOutputSide(true);
328+
playerIn.sendMessage(new TextComponentTranslation("gregtech.machine.basic.input_from_output_side.allow"));
329+
}
330+
}
331+
return true;
332+
}
333+
return super.onScrewdriverClick(playerIn, hand, facing, hitResult);
334+
}
306335

336+
public void setAllowInputFromOutputSide(boolean allowInputFromOutputSide) {
337+
this.allowInputFromOutputSide = allowInputFromOutputSide;
338+
if (!getWorld().isRemote) {
339+
markDirty();
340+
}
341+
}
307342
public void setAutoOutputFluids(boolean autoOutputFluids) {
308343
this.autoOutputFluids = autoOutputFluids;
309344
if (!getWorld().isRemote) {
310345
writeCustomData(102, buf -> buf.writeBoolean(autoOutputFluids));
311346
markDirty();
312347
}
313348
}
314-
315-
316349
}

0 commit comments

Comments
 (0)