From 50785bb041d7a10f3ce217394c20a133dc8e472c Mon Sep 17 00:00:00 2001 From: TheDarkDnKTv Date: Sun, 4 Apr 2021 19:57:52 +0300 Subject: [PATCH] Added NEI input handler for fluid slots --- .../containers/GT_Container_Electrolyzer.java | 4 +- .../mistaqur/nei/GT_NEIInputHandler.java | 45 +++++++++++++++ .../mistaqur/nei/NEI_GregTech_Config.java | 5 +- .../mistaqur/nei/PositionedFluidStack.java | 52 +++++++++++------- .../AlloySmelterRecipeHandler.java | 3 +- .../textures/gui/Electrolyzer.png | Bin 3975 -> 3513 bytes .../textures/gui/NEIElectrolyzer.png | Bin 3430 -> 3345 bytes 7 files changed, 84 insertions(+), 25 deletions(-) create mode 100644 src/main/java/gregtechmod/mistaqur/nei/GT_NEIInputHandler.java rename src/main/java/gregtechmod/mistaqur/nei/{ => handlers}/AlloySmelterRecipeHandler.java (98%) diff --git a/src/main/java/gregtechmod/common/containers/GT_Container_Electrolyzer.java b/src/main/java/gregtechmod/common/containers/GT_Container_Electrolyzer.java index 1d8c6f0..7ab12dd 100644 --- a/src/main/java/gregtechmod/common/containers/GT_Container_Electrolyzer.java +++ b/src/main/java/gregtechmod/common/containers/GT_Container_Electrolyzer.java @@ -1,7 +1,7 @@ package gregtechmod.common.containers; import gregtechmod.api.gui.GT_ContainerMetaTile_Machine; -import gregtechmod.api.gui.GT_Slot_Holo; +import gregtechmod.api.gui.GT_FluidSlot; import gregtechmod.api.gui.GT_Slot_Output; import gregtechmod.api.interfaces.IGregTechTileEntity; @@ -21,7 +21,7 @@ public class GT_Container_Electrolyzer extends GT_ContainerMetaTile_Machine { addSlotToContainer(new GT_Slot_Output (mTileEntity, 3, 70, 16)); addSlotToContainer(new GT_Slot_Output (mTileEntity, 4, 90, 16)); addSlotToContainer(new GT_Slot_Output (mTileEntity, 5, 110, 16)); - addSlotToContainer(new GT_Slot_Holo (mTileEntity, 6, 110, 46, false, false, 64)); + addFluidSlot(new GT_FluidSlot(mTileEntity, 6, 110, 46, 0)); } public int getSlotCount() { diff --git a/src/main/java/gregtechmod/mistaqur/nei/GT_NEIInputHandler.java b/src/main/java/gregtechmod/mistaqur/nei/GT_NEIInputHandler.java new file mode 100644 index 0000000..26a1285 --- /dev/null +++ b/src/main/java/gregtechmod/mistaqur/nei/GT_NEIInputHandler.java @@ -0,0 +1,45 @@ +package gregtechmod.mistaqur.nei; + +import codechicken.nei.NEIClientConfig; +import codechicken.nei.guihook.GuiContainerManager; +import codechicken.nei.guihook.IContainerInputHandler; +import codechicken.nei.recipe.GuiCraftingRecipe; +import codechicken.nei.recipe.GuiUsageRecipe; + +import gregtechmod.api.gui.GT_FluidSlot; +import gregtechmod.api.util.GT_Utility; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.inventory.Slot; +import net.minecraftforge.fluids.FluidStack; + +/** + * @author TheDarkDnKTv + * + */ +public class GT_NEIInputHandler implements IContainerInputHandler { + + @Override + public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyID) { + if (keyID == NEIClientConfig.getKeyBinding("gui.usage") || keyID == NEIClientConfig.getKeyBinding("gui.recipe")) { + Slot slot = GuiContainerManager.getSlotMouseOver(gui); + if (slot != null && slot instanceof GT_FluidSlot) { + FluidStack fluid = ((GT_FluidSlot) slot).getFluid(); + if (GT_Utility.isFluidStackValid(fluid)) { + return keyID == NEIClientConfig.getKeyBinding("gui.usage") ? GuiUsageRecipe.openRecipeGui("liquid", fluid.copy()) : GuiCraftingRecipe.openRecipeGui("liquid", fluid.copy()); + } + } + } + + return false; + } + + @Override public boolean mouseClicked(GuiContainer gui, int mousex, int mousey, int button) { return false; } + @Override public boolean keyTyped(GuiContainer gui, char keyChar, int keyCode) { return false; } + @Override public void onKeyTyped(GuiContainer gui, char keyChar, int keyID) {} + @Override public void onMouseClicked(GuiContainer gui, int mousex, int mousey, int button) {} + @Override public void onMouseUp(GuiContainer gui, int mousex, int mousey, int button) {} + @Override public boolean mouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) { return false; } + @Override public void onMouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {} + @Override public void onMouseDragged(GuiContainer gui, int mousex, int mousey, int button, long heldTime) {} +} diff --git a/src/main/java/gregtechmod/mistaqur/nei/NEI_GregTech_Config.java b/src/main/java/gregtechmod/mistaqur/nei/NEI_GregTech_Config.java index b235f6f..ac5e6cd 100644 --- a/src/main/java/gregtechmod/mistaqur/nei/NEI_GregTech_Config.java +++ b/src/main/java/gregtechmod/mistaqur/nei/NEI_GregTech_Config.java @@ -11,6 +11,7 @@ import gregtechmod.common.gui.GT_GUIContainer_PlasmaGenerator; import gregtechmod.common.gui.GT_GUIContainer_SemifluidGenerator; import gregtechmod.common.gui.GT_GUIContainer_ThermalGenerator; import gregtechmod.common.recipe.RecipeMaps; +import gregtechmod.mistaqur.nei.handlers.AlloySmelterRecipeHandler; import gregtechmod.mistaqur.nei.handlers.AssemblerRecipeHandler; import gregtechmod.mistaqur.nei.handlers.BenderRecipeHandler; import gregtechmod.mistaqur.nei.handlers.BlastRecipeHandler; @@ -31,6 +32,7 @@ import gregtechmod.mistaqur.nei.handlers.SawmillRecipeHandler; import gregtechmod.mistaqur.nei.handlers.VacuumFreezerRecipeHandler; import gregtechmod.mistaqur.nei.handlers.WiremillRecipeHandler; import codechicken.nei.api.IConfigureNEI; +import codechicken.nei.guihook.GuiContainerManager; public class NEI_GregTech_Config implements IConfigureNEI { public static boolean sIsAdded = true; @@ -65,6 +67,8 @@ public class NEI_GregTech_Config implements IConfigureNEI { new GeneratorHandler(RecipeMaps.PLASMA_FUELS , "plasma_generator" , GT_GUIContainer_PlasmaGenerator.class); new GeneratorHandler(RecipeMaps.MAGIC_FUELS , "magic_generator" , GT_GUIContainer_MagicEnergyConverter.class); + GuiContainerManager.addInputHandler(new GT_NEIInputHandler()); + try { Class.forName("codechicken.nei.api.API"); codechicken.nei.api.API.registerGuiOverlay(GT_GUIContainer_AdvancedWorkbench.class, "crafting", 57, 22); @@ -89,6 +93,5 @@ public class NEI_GregTech_Config implements IConfigureNEI { public String getVersion() { return "(3.08)"; } - } diff --git a/src/main/java/gregtechmod/mistaqur/nei/PositionedFluidStack.java b/src/main/java/gregtechmod/mistaqur/nei/PositionedFluidStack.java index 0ef7c9c..469ac58 100644 --- a/src/main/java/gregtechmod/mistaqur/nei/PositionedFluidStack.java +++ b/src/main/java/gregtechmod/mistaqur/nei/PositionedFluidStack.java @@ -5,15 +5,20 @@ import java.awt.Rectangle; import org.lwjgl.opengl.GL11; -import codechicken.lib.gui.GuiDraw; import codechicken.nei.recipe.GuiCraftingRecipe; import codechicken.nei.recipe.GuiUsageRecipe; + +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; + +import gregtechmod.api.GregTech_API; import gregtechmod.api.util.GT_Utility; -import net.minecraft.client.renderer.Tessellator; +import gregtechmod.common.render.GTRenderHelper; + import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.FluidStack; /** @@ -22,16 +27,29 @@ import net.minecraftforge.fluids.FluidStack; */ public class PositionedFluidStack { + @SideOnly(Side.CLIENT) + protected static ResourceLocation DEFAULT_SLOT_OVERLAY; + protected boolean renderOverlay; + public int x; public int y; public FluidStack fluid; - /** - * - */ - public PositionedFluidStack(FluidStack fluid, int x, int y) { + + static { + if (FMLCommonHandler.instance().getSide().isClient()) { + DEFAULT_SLOT_OVERLAY = new ResourceLocation(GregTech_API.GUI_PATH + "overlays/FluidSlot.png"); + } + } + + PositionedFluidStack(FluidStack fluid, int x, int y) { + this(fluid, x, y, false); + } + + PositionedFluidStack(FluidStack fluid, int x, int y, boolean renderOverlay) { this.x = x; this.y = y; this.fluid = fluid; + this.renderOverlay = renderOverlay; } public boolean transfer(boolean usage) { @@ -52,29 +70,21 @@ public class PositionedFluidStack { @SideOnly(Side.CLIENT) public void draw() { + if (renderOverlay) { + GTRenderHelper.bindTexture(DEFAULT_SLOT_OVERLAY); + GTRenderHelper.drawQuad(x-1, y-1, 0, 18, 18, 0.0F, 1.0F, 0.0F, 1.0F); + } + if (GT_Utility.isFluidStackValid(fluid)) { IIcon fluidIcon = fluid.getFluid().getIcon(fluid); fluidIcon = fluidIcon != null ? fluidIcon : fluid.getFluid().getFlowingIcon(); fluidIcon = fluidIcon != null ? fluidIcon : fluid.getFluid().getStillIcon(); if (fluidIcon == null) return; - - GuiDraw.changeTexture(TextureMap.locationBlocksTexture); + GTRenderHelper.bindTexture(TextureMap.locationBlocksTexture); int color = fluid.getFluid().getColor(fluid); GL11.glColor3ub((byte) (color >> 16 & 0xFF), (byte) (color >> 8 & 0xFF), (byte) (color & 0xFF)); GL11.glDisable(GL11.GL_BLEND); - - double minU = fluidIcon.getMinU(); - double maxU = fluidIcon.getMaxU(); - double minV = fluidIcon.getMinV(); - double maxV = fluidIcon.getMaxV(); - - Tessellator.instance.startDrawingQuads(); - Tessellator.instance.addVertexWithUV(x , y + 16 , 0, maxU, minV); - Tessellator.instance.addVertexWithUV(x + 16 , y + 16 , 0, minU, minV); - Tessellator.instance.addVertexWithUV(x + 16 , y , 0, minU, maxV); - Tessellator.instance.addVertexWithUV(x , y , 0, maxU, maxV); - Tessellator.instance.draw(); - + GTRenderHelper.drawQuad(x, y, 0, fluidIcon); GL11.glEnable(GL11.GL_BLEND); } } diff --git a/src/main/java/gregtechmod/mistaqur/nei/AlloySmelterRecipeHandler.java b/src/main/java/gregtechmod/mistaqur/nei/handlers/AlloySmelterRecipeHandler.java similarity index 98% rename from src/main/java/gregtechmod/mistaqur/nei/AlloySmelterRecipeHandler.java rename to src/main/java/gregtechmod/mistaqur/nei/handlers/AlloySmelterRecipeHandler.java index fd1c0c3..70fee19 100644 --- a/src/main/java/gregtechmod/mistaqur/nei/AlloySmelterRecipeHandler.java +++ b/src/main/java/gregtechmod/mistaqur/nei/handlers/AlloySmelterRecipeHandler.java @@ -1,4 +1,4 @@ -package gregtechmod.mistaqur.nei; +package gregtechmod.mistaqur.nei.handlers; import gregtechmod.api.GregTech_API; import gregtechmod.api.recipe.Recipe; @@ -12,6 +12,7 @@ import gregtechmod.common.gui.GT_GUIContainer_BasicMachine_Extractor; import gregtechmod.common.gui.GT_GUIContainer_BasicMachine_Macerator; import gregtechmod.common.gui.GT_GUIContainer_Scrapboxinator; import gregtechmod.common.recipe.RecipeMaps; +import gregtechmod.mistaqur.nei.GT_RecipeHandler; import java.awt.Rectangle; import java.util.ArrayList; diff --git a/src/main/resources/assets/gregtech_addon/textures/gui/Electrolyzer.png b/src/main/resources/assets/gregtech_addon/textures/gui/Electrolyzer.png index cbd30e1b9fe06f940d76911b59cafece1b949be9..bb1e0cdedca11c4b709c22cd5c3b08535e997f1f 100644 GIT binary patch literal 3513 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 F{|^@?R>S}R diff --git a/src/main/resources/assets/gregtech_addon/textures/gui/NEIElectrolyzer.png b/src/main/resources/assets/gregtech_addon/textures/gui/NEIElectrolyzer.png index 6a3cf7d897afe235c1d02c1a8be898d2918fee64..36c6305f6545f44e8bce293b7e79b47b782ea6c2 100644 GIT binary patch literal 3345 zcmds3c~}!?8lQloC<@9xibY5ow~DPvCI^H>LO?){8bCk+4=I2!O4YCJauBCg z4>By~`PX>AuwG|bdt{@}S2p9fwe{_5< z2dV014hwfa6V)kZP1On0BP5k6pU-!)Ln5qV!p*Rszkwj2DjPS_1N-dcL zOL*i+R{INVkJ!RjJaU3crQp(NDJdz`6ebl_#?$a(;m|+^jlrPc2nv>lsD!B$ z1e-Ie!56~BN?4(SQG{gHC={VdDjpg4bT|aLVoWW9jnIS>MoSecXml!Q4rvG|5s%>% zNlMv}afz4)$sjp|s4yH$AHymVP!)aIFi(Ect0#o@V<6(>t z@?JC+k*0uXVGxEUDaDXqGVbOab2JLBj}j89P-O&)%0?3vI_ffsL8mfEE|D-IK~u2# zZykVqg(`?gHfN1O2PvRi1Ow!{x^o$fFF+<21c#vlR02!W#-MZx$ijaSbPku{_AV4J z8HrFO{EuLXm@7qftEEmQ@GzAh*CXLa^^+9E*5;u%{$9#J~5Fac`R0_-R5AP0` zA#Vi&ZXklGgoqdl^yQIpZm2LU;WF7`7L(2vQN$cKSBe|Rl2C*kAxM$1q+&?IW`hhC zXY{-;Do!$2!036&|9Cz`3F93ol>Kf!c&Ge}iBT=yctjYUVr-<37761=BpK{!4%6%= zC=!cAA~A=;5V^4^5R>Ifac4>y6cB_sETPoZ9H$4(+%)(h(y%nFi1u-dL#50OfXyDH zjo1x`){c2V8meBdP;Bl>9$9QIM@T{**@l02Muyd*kCf>!3`3==6rmFGj>oe% zS|1;51KKD7!*S5w4RMI3w`R>K93Nn2acpwpi?P`YA^5;m;*&Kwdty62up0w?y(3Z! ze{EfeJYF^X@}r$D^?5h49Y0@Qy?AlG=gGf3k1JtS?@y3U`ZBMU()rj?*UKW>+YoC9 zH#ZU%#h8qS$OGSo)g$Ewqd|W+R}@+%<^#o|@|KLu%p9Z3rnx{+;677W{YnfjZ`t1O z?hx78H!~i%Xq}Z{LD~asnF|!XE8cHu+-%d`sNpw1lvKq;E^}>aVHC}`3Jr=bYmRgp zeDUJux_mUJ99od)l zv1#O8*Yk!j+os!cu%I(eLF{jw#!CZi)%CgZ_D3ND_HcUvyT&->S?{kCsOScRA-sr2 zqw!iX|Hkvy$mP?kFTQyG5R-4|{QC*x>5MnoX^m&ZX+59Wts3RyJ`>&GxSL(3U*#z3 z(0X zMXcV1mJj&Gu6&bM@8tIVyECY5@{F23|AJWH&}OS8>SME>6Q<7aupKONZqmrk5eip6 z)1M}Q#)4u;uUTtcwr8H4Z*`-MP0^<`ZmYf6W$1cRpmo^REz&xr=apI1d^hpKmGb`j z`G4NMztX5_Mf3v$oNk}>kE&)gh5RkD$#&@P)qnS>-kCnjK&ZAo+aj-^%I9O7W z!%nN}m{xPj4!F5seg3&u(+|h|GW(cf&#uN3JN?h9U4Y_J>jS(eFYRI-jAwt|xYz2T z^Gg?DfRq1V-Nt={{Bu8lb|bL-__lG?x1G-0q=WbP7ape#q?TFG#j9gfp7v*EZJ=?4o1;6|<~p(|56Xfl=3XuGfK z_4?_dHx27?~W5T04FD{RlxGFmg=!@an&q@?t7Zy>w4pogfw+j^#p zKmadvD5GN&G*dpgzM-o}QLZsmqSK!f93rYFB$O#$88R?=6~VpSRMEQ{)L20)8jkDs z+F#7n@*mps^YjFV+qf9jLCj7ye5Gh#sxzI{)y>NCJ`?*wCN=(YOS`tm_ryI}=|3Jl zFxAY;;=r~U`kCvfGUsvC*-3DF4?SkQD73Au?fQoAqgx)lT6AN5OXi$w&RO17T5Z|# zqdB_dB#nt!#&bUjS5Mz^v+(MHFP)byOKKYz>wb6o7Vk5=y|z!*jnjBo_s5Vr*HpH~ zyo5DJJ#D%wy$g2US(D_^cD1ADen{5COSn(_-jsB87KWC6jhOl`O^MGM%xzduWRyI$ QG?zo5U$AfKqPPwJ1T{Gdq5uE@ literal 3430 zcmeH}`BxKJ7RO%|F>InlTmVrJkVPbdO@NkG3R&XPESh$p*>MJKK_CH?t(6K2N`rv5 z$f9hmAPNB#A_2vuZCMoA8V&m*Q3DMUAV`P=(uF#6=3kgOR{ikmy>sv9zI)&Io_dKc zPGltobp-%`(*AvRhXH`FPYB52vB5L6_!u_ej@vle0B|o=QR24(o6CmpceI!7li$4B zcyo80t`@eW9&YazP6;^{9^n`24_y3C1cwuy?0?WY{SA>sG&M1q4J`m*<(vI>Ha|pq zzaIz+?Xz4T|N6zx#?XmDzLnt(PG`8cV`0Z0qbm0s=CWb>Ff6et6D%6gM3 zLpj;vc4QWeQ&0@R;ZJkb0!bZ%DMKCzp(Y}_m*0*X5zzFz+!Ex%yVSKCQiEodSb_O~^4LygxtS|F9M`qN-oq3-le~CvAR_$=PnZuLU z#6N!!qPck1rzU;_&6t8B9XcR(0QuJj4iR}CqN)dQT2In_qE=y`?XWwpN>26O;4;%_ zz-q+(KS(qP=|jIT|G<*ff}1g)Wm-%ec+nThh_#3yj-2Gj_zN98ldzP1=xlQh&zl`;JEcfXQr8^gqBHH(^e$Ko>3)5>QzM;>Kj6kD!>(KfEaQ1L`%rtWTV?^~qytekIYA=m<*w7SG-k`?*Otp?!#QVI zqI-0?^Z<5wq|&aA#JjKvqy3kVtr0VluExr1Ai+I3iNz2-|29_(bi}q)KS&hR2EU)r zjn;sQsdMh8k-vbd$$B5Lty&K|M?|D=0XSdLMtVSXA2)9L2<%cT6g)pA2zcaOb`XnK z1g`55yY0c-(%+Uy)cnh>DzkNf?hT zkBm9osvDyla-twi`NLPh_UqDgm|A7NTr-9uJ!?Ib;V9h(85plz129K*>)u`E4H>7Q zYcbMtW%RJnXW-1m?1QP%n<;>Tj;!@9VO75y^I_s$u>B4{TIgFLcXDY=<(zXiT*{wk zu8Lq1QuioU+`2UCkrp`AMM<>(C>*O2rLZ%MC_$2yER{Di{ zVVpViEJ8$ccEe5dFp^u=<_B)k2Gc9WliWwY_AK@)G!e_wKhl-7p z)DuPZnQbD#*cFgp|g@>sr%h2zJRy zDH>#~rCuT<>S>av&op~#l6NO~V}0c!lNgB1sOaYE(n&}LlB1-)~%D7(70LtZh{F=&9 zuLaGHtw8-p9sM#o6KMD?{`o<)RJYY2hHtiFpJ${eEA>v>eZMZp-PW$1^UQKD?^H}4 zv$QZJ4S7y_!;ZQH(0_y4+IK-XcjZEzA?J{err%Ol*A{RT1;J(X-eY?z-B?>;k8*ur zq0ip1VQ0!h@hu0?Y9{5@{ysR4{gx46(S@8)pcaY)eQZIn(;j|ZTU1Qq;$`sCeC8Do zQ|u>;7W3g(_#JgASU8EdXOrcm4gt=Wuc3~pcdMXRVivX|Bfq`w7JWOnb1ug5<9Jtj zTb_07(qiTkJ7OZsBidtfWq)moAt2ajDv?Y`Z|-;S@m@>8OCoMqr@$RIJo=%~3ck&k zM{H+msG7u|k8kF}6|d&W?7($swx0E_1T1S@yNe7NHt~~6x>e}cj5*%~f|$lNXu_MJ zvG2+TWY0|aE#4Pr2&Ig%C$0i`;>-bREfLZJa`^>#E^H!=bp~^1+0`u9UispvTwtb~ z**W*Rs_va%T`&7&lYgZ%+s8sW*ve6>vNi(aJOZF0K#5c__*Y4msJu%ig$wDK7N3~u zHFkj8(La?7u-8pq|-nRD6SMqGYs-i z*ISRAg(x5nU8Nr2YYaRnaW${`@d(_mJVo$&l9_il+DwY8)oAq^!X~~ R^Fsi8_S-wzmF@M7`x|jYbe{kK