Skip to content

Commit 319b87c

Browse files
committed
Update MetaTileEntityBuffer.java
buffer V2.0
1 parent 185bd5a commit 319b87c

File tree

1 file changed

+185
-17
lines changed

1 file changed

+185
-17
lines changed

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

Lines changed: 185 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,35 @@
11
package gregtech.common.metatileentities.storage;
22

3+
import codechicken.lib.raytracer.CuboidRayTraceResult;
4+
35
import gregtech.api.capability.impl.FilteredFluidHandler;
46
import gregtech.api.capability.impl.FluidTankList;
57
import gregtech.api.gui.GuiTextures;
68
import gregtech.api.gui.ModularUI;
79
import gregtech.api.gui.widgets.TankWidget;
10+
import gregtech.api.gui.widgets.ToggleButtonWidget;
811
import gregtech.api.items.itemhandlers.GTItemStackHandler;
912
import gregtech.api.metatileentity.ITieredMetaTileEntity;
1013
import gregtech.api.metatileentity.MetaTileEntity;
1114
import gregtech.api.metatileentity.interfaces.IGregTechTileEntity;
1215
import gregtech.api.util.GTUtility;
1316
import gregtech.client.renderer.texture.Textures;
1417

18+
import gregtech.client.utils.RenderUtil;
19+
1520
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
1621
import net.minecraft.client.resources.I18n;
1722
import net.minecraft.entity.player.EntityPlayer;
1823
import net.minecraft.item.ItemStack;
1924
import net.minecraft.nbt.NBTTagCompound;
25+
import net.minecraft.network.PacketBuffer;
2026
import net.minecraft.util.EnumFacing;
27+
import net.minecraft.util.EnumHand;
2128
import net.minecraft.util.ResourceLocation;
2229
import net.minecraft.world.World;
2330
import net.minecraftforge.fml.relauncher.Side;
2431
import net.minecraftforge.fml.relauncher.SideOnly;
32+
import net.minecraftforge.items.IItemHandlerModifiable;
2533
import net.minecraftforge.items.ItemStackHandler;
2634

2735
import codechicken.lib.render.CCRenderState;
@@ -35,13 +43,16 @@
3543

3644
import java.util.List;
3745

38-
public class MetaTileEntityBuffer extends MetaTileEntity implements ITieredMetaTileEntity {
46+
import static gregtech.api.capability.GregtechDataCodes.*;
3947

40-
private static final int TANK_SIZE = 64000;
48+
public class MetaTileEntityBuffer extends MetaTileEntity implements ITieredMetaTileEntity {
4149
private final int tier;
42-
4350
private FluidTankList fluidTankList;
4451
private ItemStackHandler itemStackHandler;
52+
private boolean autoOutputItems;
53+
private boolean autoOutputFluids;
54+
private EnumFacing outputFacingItems;
55+
private EnumFacing outputFacingFluids;
4556

4657
public MetaTileEntityBuffer(ResourceLocation metaTileEntityId, int tier) {
4758
super(metaTileEntityId);
@@ -54,12 +65,27 @@ protected void initializeInventory() {
5465
super.initializeInventory();
5566
FilteredFluidHandler[] fluidHandlers = new FilteredFluidHandler[tier + 2];
5667
for (int i = 0; i < tier + 2; i++) {
57-
fluidHandlers[i] = new FilteredFluidHandler(TANK_SIZE);
68+
fluidHandlers[i] = new FilteredFluidHandler((int) (2000 * Math.pow(2, getTier())));
5869
}
5970
fluidInventory = fluidTankList = new FluidTankList(false, fluidHandlers);
6071
itemInventory = itemStackHandler = new GTItemStackHandler(this, ((int) Math.pow(tier + 2, 2)));
6172
}
6273

74+
@Override
75+
public boolean needsSneakToRotate() {
76+
return true;
77+
}
78+
79+
@Override
80+
public IItemHandlerModifiable getExportItems() {
81+
return itemStackHandler;
82+
}
83+
84+
@Override
85+
public FluidTankList getExportFluids() {
86+
return fluidTankList;
87+
}
88+
6389
@Override
6490
public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) {
6591
return new MetaTileEntityBuffer(metaTileEntityId, tier);
@@ -75,21 +101,29 @@ public Pair<TextureAtlasSprite, Integer> getParticleTexture() {
75101
protected ModularUI createUI(EntityPlayer entityPlayer) {
76102
int invTier = tier + 2;
77103
ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND,
78-
176, Math.max(166, 18 + 18 * invTier + 94));// 176, 166
104+
176, 18 + Math.max(166, 112 + 18 * invTier));// 176, 166
79105
for (int i = 0; i < this.fluidTankList.getTanks(); i++) {
80-
builder.widget(new TankWidget(this.fluidTankList.getTankAt(i), 176 - 8 - 18, 18 + 18 * i, 18, 18)
106+
builder.widget(new TankWidget(this.fluidTankList.getTankAt(i), 151, 18 * (i + 1), 18, 18)
81107
.setAlwaysShowFull(true)
82108
.setBackgroundTexture(GuiTextures.FLUID_SLOT)
83109
.setContainerClicking(true, true));
84110
}
85111
for (int y = 0; y < invTier; y++) {
86112
for (int x = 0; x < invTier; x++) {
87113
int index = y * invTier + x;
88-
builder.slot(itemStackHandler, index, 8 + x * 18, 18 + y * 18, GuiTextures.SLOT);
114+
builder.slot(itemStackHandler, index, 8 + x * 18, 18 * (y + 1), GuiTextures.SLOT);
89115
}
90116
}
117+
builder.widget(new ToggleButtonWidget(8, 18 * invTier + 21, 18, 18,
118+
GuiTextures.BUTTON_ITEM_OUTPUT, this::isAutoOutputItems, this::setAutoOutputItems)
119+
.setTooltipText("gregtech.gui.item_auto_output.tooltip")
120+
.shouldUseBaseBackground());
121+
builder.widget(new ToggleButtonWidget(26, 18 * invTier + 21, 18, 18,
122+
GuiTextures.BUTTON_FLUID_OUTPUT, this::isAutoOutputFluids, this::setAutoOutputFluids)
123+
.setTooltipText("gregtech.gui.item_auto_output.tooltip")
124+
.shouldUseBaseBackground());
91125
return builder.label(6, 6, getMetaFullName())
92-
.bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 8, 18 + 18 * invTier + 12)
126+
.bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 8, 42 + 18 * invTier)
93127
.build(getHolder(), entityPlayer);
94128
}
95129

@@ -98,12 +132,106 @@ public int getTier() {
98132
return tier;
99133
}
100134

135+
public boolean isAutoOutputItems() {
136+
return autoOutputItems;
137+
}
138+
139+
public boolean isAutoOutputFluids() {
140+
return autoOutputFluids;
141+
}
142+
143+
public void setAutoOutputItems(boolean autoOutputItems) {
144+
this.autoOutputItems = autoOutputItems;
145+
if (!getWorld().isRemote) {
146+
writeCustomData(UPDATE_AUTO_OUTPUT_ITEMS, buf -> buf.writeBoolean(autoOutputItems));
147+
markDirty();
148+
}
149+
}
150+
151+
public void setAutoOutputFluids(boolean autoOutputFluids) {
152+
this.autoOutputFluids = autoOutputFluids;
153+
if (!getWorld().isRemote) {
154+
writeCustomData(UPDATE_AUTO_OUTPUT_FLUIDS, buf -> buf.writeBoolean(autoOutputFluids));
155+
markDirty();
156+
}
157+
}
158+
159+
@Override
160+
public boolean onWrenchClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing,
161+
CuboidRayTraceResult hitResult) {
162+
if (!playerIn.isSneaking()) {
163+
if (getOutputFacingItems() == facing) return false;
164+
if (hasFrontFacing() && facing == getFrontFacing()) return false;
165+
if (!getWorld().isRemote) {
166+
setOutputFacing(facing);
167+
}
168+
return true;
169+
}
170+
return super.onWrenchClick(playerIn, hand, facing, hitResult);
171+
}
172+
173+
public void setOutputFacing(EnumFacing outputFacing) {
174+
this.outputFacingItems = outputFacing;
175+
this.outputFacingFluids = outputFacing;
176+
if (!getWorld().isRemote) {
177+
notifyBlockUpdate();
178+
writeCustomData(UPDATE_OUTPUT_FACING, buf -> {
179+
buf.writeByte(outputFacingItems.getIndex());
180+
buf.writeByte(outputFacingFluids.getIndex());
181+
});
182+
markDirty();
183+
}
184+
}
185+
186+
@Override
187+
public void setFrontFacing(EnumFacing frontFacing) {
188+
super.setFrontFacing(frontFacing);
189+
if (this.outputFacingItems == null || this.outputFacingFluids == null) {
190+
setOutputFacing(frontFacing.getOpposite());
191+
}
192+
}
193+
194+
public EnumFacing getOutputFacingItems() {
195+
return outputFacingItems == null ? getFrontFacing().getOpposite() : outputFacingItems;
196+
}
197+
198+
public EnumFacing getOutputFacingFluids() {
199+
return outputFacingFluids == null ? getFrontFacing().getOpposite() : outputFacingFluids;
200+
}
201+
202+
@Override
203+
public void update() {
204+
super.update();
205+
if (!getWorld().isRemote) {
206+
if (getOffsetTimer() % 5 == 0) {
207+
if (isAutoOutputFluids()) {
208+
pushFluidsIntoNearbyHandlers(getOutputFacingFluids());
209+
}
210+
if (isAutoOutputItems()) {
211+
pushItemsIntoNearbyHandlers(getOutputFacingItems());
212+
}
213+
}
214+
}
215+
}
216+
101217
@Override
102218
public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) {
103219
Textures.VOLTAGE_CASINGS[tier].render(renderState, translation, ArrayUtils.add(pipeline,
104220
new ColourMultiplier(GTUtility.convertRGBtoOpaqueRGBA_CL(getPaintingColorForRendering()))));
105221
for (EnumFacing facing : EnumFacing.VALUES) {
106-
Textures.BUFFER_OVERLAY.renderSided(facing, renderState, translation, pipeline);
222+
if (facing == getOutputFacingItems()) {
223+
Textures.PIPE_OUT_OVERLAY.renderSided(facing, renderState, translation, pipeline);
224+
} else {
225+
Textures.BUFFER_OVERLAY.renderSided(facing, renderState, translation, pipeline);
226+
}
227+
}
228+
if (isAutoOutputItems() && outputFacingItems != null) {
229+
Textures.ITEM_OUTPUT_OVERLAY.renderSided(outputFacingItems, renderState,
230+
RenderUtil.adjustTrans(translation, outputFacingItems, 2), pipeline);
231+
}
232+
if (isAutoOutputFluids() && outputFacingFluids != null) {
233+
Textures.FLUID_OUTPUT_OVERLAY.renderSided(outputFacingFluids, renderState,
234+
RenderUtil.adjustTrans(translation, outputFacingFluids, 2), pipeline);
107235
}
108236
}
109237

@@ -112,6 +240,10 @@ public NBTTagCompound writeToNBT(NBTTagCompound tag) {
112240
super.writeToNBT(tag);
113241
tag.setTag("Inventory", itemStackHandler.serializeNBT());
114242
tag.setTag("FluidInventory", fluidTankList.serializeNBT());
243+
tag.setInteger("OutputFacing", getOutputFacingItems().getIndex());
244+
tag.setInteger("OutputFacingF", getOutputFacingFluids().getIndex());
245+
tag.setBoolean("AutoOutputItems", autoOutputItems);
246+
tag.setBoolean("AutoOutputFluids", autoOutputFluids);
115247
return tag;
116248
}
117249

@@ -120,32 +252,68 @@ public void readFromNBT(NBTTagCompound tag) {
120252
super.readFromNBT(tag);
121253
this.itemStackHandler.deserializeNBT(tag.getCompoundTag("Inventory"));
122254
this.fluidTankList.deserializeNBT(tag.getCompoundTag("FluidInventory"));
255+
this.outputFacingItems = EnumFacing.VALUES[tag.getInteger("OutputFacing")];
256+
this.outputFacingFluids = EnumFacing.VALUES[tag.getInteger("OutputFacingF")];
257+
this.autoOutputItems = tag.getBoolean("AutoOutputItems");
258+
this.autoOutputFluids = tag.getBoolean("AutoOutputFluids");
259+
}
260+
261+
@Override
262+
public void writeInitialSyncData(@NotNull PacketBuffer buf) {
263+
super.writeInitialSyncData(buf);
264+
buf.writeBoolean(autoOutputFluids);
265+
buf.writeBoolean(autoOutputItems);
266+
buf.writeByte(getOutputFacingFluids().getIndex());
267+
buf.writeByte(getOutputFacingItems().getIndex());
268+
}
269+
270+
@Override
271+
public void receiveInitialSyncData(@NotNull PacketBuffer buf) {
272+
super.receiveInitialSyncData(buf);
273+
this.autoOutputFluids = buf.readBoolean();
274+
this.autoOutputItems = buf.readBoolean();
275+
this.outputFacingFluids = EnumFacing.VALUES[buf.readByte()];
276+
this.outputFacingItems = EnumFacing.VALUES[buf.readByte()];
277+
}
278+
279+
@Override
280+
public void receiveCustomData(int dataId, @NotNull PacketBuffer buf) {
281+
super.receiveCustomData(dataId, buf);
282+
if (dataId == UPDATE_OUTPUT_FACING) {
283+
this.outputFacingItems = EnumFacing.VALUES[buf.readByte()];
284+
this.outputFacingFluids = EnumFacing.VALUES[buf.readByte()];
285+
scheduleRenderUpdate();
286+
} else if (dataId == UPDATE_AUTO_OUTPUT_ITEMS) {
287+
this.autoOutputItems = buf.readBoolean();
288+
scheduleRenderUpdate();
289+
} else if (dataId == UPDATE_AUTO_OUTPUT_FLUIDS) {
290+
this.autoOutputFluids = buf.readBoolean();
291+
scheduleRenderUpdate();
292+
}
123293
}
124294

125295
@Override
126296
protected boolean shouldSerializeInventories() {
127-
return false;
297+
return true;
128298
}
129299

130300
@Override
131301
public boolean hasFrontFacing() {
132-
return false;
302+
return true;
133303
}
134304

135305
@Override
136-
public void addInformation(ItemStack stack, @Nullable World player, List<String> tooltip, boolean advanced) {
306+
public void addInformation(ItemStack stack, @Nullable World player, @NotNull List<String> tooltip, boolean advanced) {
137307
super.addInformation(stack, player, tooltip, advanced);
138308
tooltip.add(I18n.format("gregtech.machine.buffer.tooltip"));
139309
tooltip.add(I18n.format("gregtech.universal.tooltip.item_storage_capacity", (int) Math.pow(tier + 2, 2)));
140-
tooltip.add(I18n.format("gregtech.universal.tooltip.fluid_storage_capacity_mult", tier + 2, TANK_SIZE));
310+
tooltip.add(I18n.format("gregtech.universal.tooltip.fluid_storage_capacity_mult", tier + 2, (int) (1000 * Math.pow(2, tier))));
141311
}
142312

143313
@Override
144314
public void addToolUsages(ItemStack stack, @Nullable World world, List<String> tooltip, boolean advanced) {
145-
tooltip.add(I18n.format("gregtech.tool_action.screwdriver.access_covers"));
146-
// TODO Add this when the Buffer gets an auto-output side, and change the above to
147-
// "gregtech.tool_action.screwdriver.auto_output_covers"
148-
// tooltip.add(I18n.format("gregtech.tool_action.wrench.set_facing"));
315+
tooltip.add(I18n.format("gregtech.tool_action.screwdriver.auto_output_covers"));
316+
tooltip.add(I18n.format("gregtech.tool_action.wrench.set_facing"));
149317
super.addToolUsages(stack, world, tooltip, advanced);
150318
}
151319

0 commit comments

Comments
 (0)