11package gregtech .common .metatileentities .storage ;
22
3+ import codechicken .lib .raytracer .CuboidRayTraceResult ;
4+
35import gregtech .api .capability .impl .FilteredFluidHandler ;
46import gregtech .api .capability .impl .FluidTankList ;
57import gregtech .api .gui .GuiTextures ;
68import gregtech .api .gui .ModularUI ;
79import gregtech .api .gui .widgets .TankWidget ;
10+ import gregtech .api .gui .widgets .ToggleButtonWidget ;
811import gregtech .api .items .itemhandlers .GTItemStackHandler ;
912import gregtech .api .metatileentity .ITieredMetaTileEntity ;
1013import gregtech .api .metatileentity .MetaTileEntity ;
1114import gregtech .api .metatileentity .interfaces .IGregTechTileEntity ;
1215import gregtech .api .util .GTUtility ;
1316import gregtech .client .renderer .texture .Textures ;
1417
18+ import gregtech .client .utils .RenderUtil ;
19+
1520import net .minecraft .client .renderer .texture .TextureAtlasSprite ;
1621import net .minecraft .client .resources .I18n ;
1722import net .minecraft .entity .player .EntityPlayer ;
1823import net .minecraft .item .ItemStack ;
1924import net .minecraft .nbt .NBTTagCompound ;
25+ import net .minecraft .network .PacketBuffer ;
2026import net .minecraft .util .EnumFacing ;
27+ import net .minecraft .util .EnumHand ;
2128import net .minecraft .util .ResourceLocation ;
2229import net .minecraft .world .World ;
2330import net .minecraftforge .fml .relauncher .Side ;
2431import net .minecraftforge .fml .relauncher .SideOnly ;
32+ import net .minecraftforge .items .IItemHandlerModifiable ;
2533import net .minecraftforge .items .ItemStackHandler ;
2634
2735import codechicken .lib .render .CCRenderState ;
3543
3644import 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