From cfcb9353054d49a2237deacc28cab76e0a5f960a Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Mon, 30 Jan 2023 19:51:58 +0100 Subject: [PATCH] feat: add power relay GUI closes #6 --- .../appeng/block/legacy/BlockPowerRelay.java | 35 +++++++- .../gui/implementations/GuiPowerRelay.java | 40 +++++++++ .../implementations/ContainerPowerRelay.java | 51 +++++++++++ src/main/java/appeng/core/sync/GuiBridge.java | 9 +- .../appeng/tile/legacy/TilePowerRelay.java | 80 +++++++++++++----- .../appliedenergistics2/lang/en_US.lang | 1 + .../textures/guis/me_powerrelay.png | Bin 0 -> 2923 bytes 7 files changed, 192 insertions(+), 24 deletions(-) create mode 100644 src/main/java/appeng/client/gui/implementations/GuiPowerRelay.java create mode 100644 src/main/java/appeng/container/implementations/ContainerPowerRelay.java create mode 100644 src/main/resources/assets/appliedenergistics2/textures/guis/me_powerrelay.png diff --git a/src/main/java/appeng/block/legacy/BlockPowerRelay.java b/src/main/java/appeng/block/legacy/BlockPowerRelay.java index 85cd0c76..5d984bed 100644 --- a/src/main/java/appeng/block/legacy/BlockPowerRelay.java +++ b/src/main/java/appeng/block/legacy/BlockPowerRelay.java @@ -4,15 +4,46 @@ import java.util.EnumSet; import appeng.block.AEBaseTileBlock; import appeng.core.features.AEFeature; +import appeng.core.sync.GuiBridge; import appeng.tile.legacy.TilePowerRelay; +import appeng.util.Platform; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class BlockPowerRelay extends AEBaseTileBlock { - public BlockPowerRelay() { super(Material.iron); this.setTileEntity(TilePowerRelay.class); this.setFeature(EnumSet.of(AEFeature.Legacy)); } - + + @Override + public boolean onBlockActivated( + World w, + int x, + int y, + int z, + EntityPlayer p, + int side, + // useless parameters + float alec1, + float alec2, + float alec3 + ) { + TileEntity tileEntity = w.getTileEntity(x, y, z); + if (tileEntity != null) { + Platform.openGUI( + p, + tileEntity, + ForgeDirection.getOrientation(side), + GuiBridge.GUI_POWER_RELAY + ); + return true; + } else { + return false; + } + } } diff --git a/src/main/java/appeng/client/gui/implementations/GuiPowerRelay.java b/src/main/java/appeng/client/gui/implementations/GuiPowerRelay.java new file mode 100644 index 00000000..1564574c --- /dev/null +++ b/src/main/java/appeng/client/gui/implementations/GuiPowerRelay.java @@ -0,0 +1,40 @@ +package appeng.client.gui.implementations; + +import appeng.client.gui.AEBaseGui; +import appeng.container.implementations.ContainerPowerRelay; +import appeng.tile.legacy.TilePowerRelay; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; + +public class GuiPowerRelay extends AEBaseGui { + public GuiPowerRelay(InventoryPlayer inventoryPlayer, TilePowerRelay tileEntity) { + super(new ContainerPowerRelay(inventoryPlayer, tileEntity)); + this.ySize = 197; + } + + @Override + public void drawFG(int offsetX, int offsetY, int mouseX, int mouseY) { + this.fontRendererObj.drawString( + StatCollector.translateToLocal("gui.appliedenergistics2.PowerRelay"), + 8, + 6, + 4210752 + ); + this.fontRendererObj.drawString( + StatCollector.translateToLocal("container.inventory"), + 8, + this.ySize - 96 + 3, + 4210752 + ); + } + + @Override + public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) { + this.bindTexture("guis/me_powerrelay.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + int x = (this.width - this.xSize) / 2; + int y = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize); + } +} diff --git a/src/main/java/appeng/container/implementations/ContainerPowerRelay.java b/src/main/java/appeng/container/implementations/ContainerPowerRelay.java new file mode 100644 index 00000000..1997780b --- /dev/null +++ b/src/main/java/appeng/container/implementations/ContainerPowerRelay.java @@ -0,0 +1,51 @@ +package appeng.container.implementations; + +import appeng.container.AEBaseContainer; +import appeng.container.slot.SlotOutput; +import appeng.container.slot.SlotPlayerHotBar; +import appeng.container.slot.SlotPlayerInv; +import appeng.container.slot.SlotRestrictedInput; +import appeng.container.slot.SlotRestrictedInput.PlacableItemType; +import appeng.tile.legacy.TilePowerRelay; +import appeng.util.Platform; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; + +public class ContainerPowerRelay extends AEBaseContainer { + TilePowerRelay myte; + + public ContainerPowerRelay(InventoryPlayer ip, TilePowerRelay te) { + super(ip, te); + this.myte = te; + this.addSlotToContainer( + new SlotRestrictedInput(PlacableItemType.POWERED_TOOL, te, 0, 52, 53, ip) + ); + this.addSlotToContainer(new SlotOutput(te, 1, 113, 53, -1)); + this.bindPlayerInventory(ip); + } + + @Override + public void onCraftMatrixChanged(IInventory par1iInventory) { + super.onCraftMatrixChanged(par1iInventory); + if (Platform.isServer()) { + this.myte.markDirty(); + } + } + + protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) { + int i; + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new SlotPlayerInv( + inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 115 + i * 18 + )); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer( + new SlotPlayerHotBar(inventoryPlayer, i, 8 + i * 18, 173) + ); + } + } +} diff --git a/src/main/java/appeng/core/sync/GuiBridge.java b/src/main/java/appeng/core/sync/GuiBridge.java index f8f2c211..ecbb3b8b 100644 --- a/src/main/java/appeng/core/sync/GuiBridge.java +++ b/src/main/java/appeng/core/sync/GuiBridge.java @@ -62,6 +62,7 @@ import appeng.tile.grindstone.TileGrinder; import appeng.tile.legacy.TileAssembler; import appeng.tile.legacy.TileLegacyController; import appeng.tile.legacy.TilePatternEncoder; +import appeng.tile.legacy.TilePowerRelay; import appeng.tile.misc.*; import appeng.tile.networking.TileWireless; import appeng.tile.qnb.TileQuantumBridge; @@ -76,7 +77,6 @@ import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.relauncher.ReflectionHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -296,6 +296,13 @@ public enum GuiBridge implements IGuiHandler { TileAssembler.class, GuiHostType.WORLD, SecurityPermissions.BUILD + ), + + GUI_POWER_RELAY( + ContainerPowerRelay.class, + TilePowerRelay.class, + GuiHostType.WORLD, + SecurityPermissions.EXTRACT ); private final Class tileClass; diff --git a/src/main/java/appeng/tile/legacy/TilePowerRelay.java b/src/main/java/appeng/tile/legacy/TilePowerRelay.java index e790daf8..c3c1530a 100644 --- a/src/main/java/appeng/tile/legacy/TilePowerRelay.java +++ b/src/main/java/appeng/tile/legacy/TilePowerRelay.java @@ -8,6 +8,8 @@ import java.util.Map; import java.util.Set; import appeng.api.config.Actionable; +import appeng.api.config.PowerMultiplier; +import appeng.api.implementations.items.IAEItemPowerStorage; import appeng.api.networking.GridFlags; import appeng.api.networking.IGridNode; import appeng.api.networking.energy.IEnergyGrid; @@ -27,14 +29,18 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; -public class TilePowerRelay extends AEBasePoweredTile implements IGridProxyable, IEnergyGridProvider { - public static final IInventory NULL_INVENTORY = new AppEngInternalInventory(null, 0); +public class TilePowerRelay + extends AEBasePoweredTile implements IGridProxyable, IEnergyGridProvider { public static final int[] ACCESSIBLE_SLOTS_BY_SIDE = {}; + private Map proxies = new HashMap<>(); + private AppEngInternalInventory inv = new AppEngInternalInventory(this, 2); public TilePowerRelay() { - for(ForgeDirection dir : ForgeDirection.values()) { - AENetworkProxy proxy = new AENetworkProxy(this, "proxy" + dir.name().toLowerCase(), this.getItemFromTile(this), true); + for (ForgeDirection dir : ForgeDirection.values()) { + AENetworkProxy proxy = new AENetworkProxy( + this, "proxy" + dir.name().toLowerCase(), this.getItemFromTile(this), true + ); proxy.setFlags(GridFlags.CANNOT_CARRY); if (dir == ForgeDirection.UNKNOWN) { proxy.setValidSides(EnumSet.noneOf(ForgeDirection.class)); @@ -49,6 +55,39 @@ public class TilePowerRelay extends AEBasePoweredTile implements IGridProxyable, @TileEvent(TileEventType.TICK) public void onTick() { + ItemStack stack = this.inv.getStackInSlot(0); + if (stack != null && stack.getItem() instanceof IAEItemPowerStorage) { + if (this.getAECurrentPower() < 5.0) { + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + try { + this.setInternalCurrentPower( + this.getAECurrentPower() + + this.getProxyForSide(dir).getEnergy().extractAEPower( + this.getAEMaxPower() - this.getAECurrentPower(), + Actionable.MODULATE, + PowerMultiplier.ONE + ) + ); + } catch (GridAccessException e) { + // :P + } + } + } + + IAEItemPowerStorage iaeips = (IAEItemPowerStorage) stack.getItem(); + + if (this.inv.getStackInSlot(1) == null + && iaeips.getAEMaxPower(stack) - iaeips.getAECurrentPower(stack) + < 0.001) { + this.inv.setInventorySlotContents(1, stack); + this.inv.setInventorySlotContents(0, null); + } else { + this.setInternalCurrentPower( + iaeips.injectAEPower(stack, this.getAECurrentPower()) + ); + } + } + if (this.getAECurrentPower() > 0.01) { this.onUpdatePower(); } @@ -66,7 +105,8 @@ public class TilePowerRelay extends AEBasePoweredTile implements IGridProxyable, // :P } } - if (demanding.isEmpty()) return; + if (demanding.isEmpty()) + return; final double split = this.getAECurrentPower() / demanding.size(); double current = 0.0; for (ForgeDirection dir : demanding) { @@ -74,7 +114,8 @@ public class TilePowerRelay extends AEBasePoweredTile implements IGridProxyable, try { IEnergyGrid eg = this.getProxyForSide(dir).getEnergy(); double demand = eg.getEnergyDemand(leftover); - leftover = eg.injectPower(Math.min(leftover, demand), Actionable.MODULATE); + leftover + = eg.injectPower(Math.min(leftover, demand), Actionable.MODULATE); current += leftover; } catch (GridAccessException e) { // :P @@ -85,27 +126,27 @@ public class TilePowerRelay extends AEBasePoweredTile implements IGridProxyable, @TileEvent(TileEventType.WORLD_NBT_READ) public void readFromNBT_PowerRelay(final NBTTagCompound data) { - for(ForgeDirection dir : ForgeDirection.values()) { + for (ForgeDirection dir : ForgeDirection.values()) { proxies.get(dir).readFromNBT(data); } } @TileEvent(TileEventType.WORLD_NBT_WRITE) public void writeToNBT_PowerRelay(final NBTTagCompound data) { - for(ForgeDirection dir : ForgeDirection.values()) { + for (ForgeDirection dir : ForgeDirection.values()) { proxies.get(dir).writeToNBT(data); } } @Override public IInventory getInternalInventory() { - return NULL_INVENTORY; + return this.inv; } @Override - public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removed, ItemStack added) { - - } + public void onChangeInventory( + IInventory inv, int slot, InvOperation mc, ItemStack removed, ItemStack added + ) {} @Override public int[] getAccessibleSlotsBySide(ForgeDirection whichSide) { @@ -137,14 +178,12 @@ public class TilePowerRelay extends AEBasePoweredTile implements IGridProxyable, } @Override - public void gridChanged() { - - } + public void gridChanged() {} @Override public void onChunkUnload() { super.onChunkUnload(); - for(ForgeDirection dir : ForgeDirection.values()) { + for (ForgeDirection dir : ForgeDirection.values()) { proxies.get(dir).onChunkUnload(); } } @@ -152,7 +191,7 @@ public class TilePowerRelay extends AEBasePoweredTile implements IGridProxyable, @Override public void onReady() { super.onReady(); - for(ForgeDirection dir : ForgeDirection.values()) { + for (ForgeDirection dir : ForgeDirection.values()) { proxies.get(dir).onReady(); } } @@ -160,7 +199,7 @@ public class TilePowerRelay extends AEBasePoweredTile implements IGridProxyable, @Override public void invalidate() { super.invalidate(); - for(ForgeDirection dir : ForgeDirection.values()) { + for (ForgeDirection dir : ForgeDirection.values()) { proxies.get(dir).invalidate(); } } @@ -168,7 +207,7 @@ public class TilePowerRelay extends AEBasePoweredTile implements IGridProxyable, @Override public void validate() { super.validate(); - for(ForgeDirection dir : ForgeDirection.values()) { + for (ForgeDirection dir : ForgeDirection.values()) { proxies.get(dir).validate(); } } @@ -176,7 +215,7 @@ public class TilePowerRelay extends AEBasePoweredTile implements IGridProxyable, @Override public double extractAEPower(double amt, Actionable mode, Set seen) { double acquiredPower = 0; - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { try { final IEnergyGrid eg = this.getProxyForSide(dir).getEnergy(); acquiredPower += eg.extractAEPower(amt - acquiredPower, mode, seen); @@ -196,5 +235,4 @@ public class TilePowerRelay extends AEBasePoweredTile implements IGridProxyable, public double getEnergyDemand(double amt, Set seen) { return 0; } - } diff --git a/src/main/resources/assets/appliedenergistics2/lang/en_US.lang b/src/main/resources/assets/appliedenergistics2/lang/en_US.lang index 6980b079..733ab74e 100644 --- a/src/main/resources/assets/appliedenergistics2/lang/en_US.lang +++ b/src/main/resources/assets/appliedenergistics2/lang/en_US.lang @@ -75,6 +75,7 @@ gui.appliedenergistics2.PatternEncoder.encode=Encode gui.appliedenergistics2.PatternEncoder=Pattern Encoder gui.appliedenergistics2.Assembler=ME Pattern Provider gui.appliedenergistics2.MAC=ME Molecular Assembler Chamber +gui.appliedenergistics2.PowerRelay=ME Power Relay # Stairs tile.appliedenergistics2.ChiseledQuartzStairBlock.name=Chiseled Certus Quartz Stairs diff --git a/src/main/resources/assets/appliedenergistics2/textures/guis/me_powerrelay.png b/src/main/resources/assets/appliedenergistics2/textures/guis/me_powerrelay.png new file mode 100644 index 0000000000000000000000000000000000000000..e42ba5d1d1fb2e3d051da0e302e39387846a40b4 GIT binary patch literal 2923 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&2?&#~tz_78O`%fY(kk47* z5n0T@z_$~G8F#RW?*|G>mAFQf1m~xflqVLYG6W=M=9TFAxrQi|8S9zq85$UTDO$+D z!1dhI#WAEJ?(Gf6zBp4cm&CHEQ#Y)7)17O0W8d0FX?y=kdJ^_uWM6u`@DJ`?wccB{ z?x*nn$@(Al|NQ&?{*R~qkH_;H%MIR@&V8Fyb7cPJU(ELo=kNdfZMxu($IAbfT)kf} z`E-)`@7L@1`yGFKjq$Vk+J9oZH=Vp~!eF_2|Iu|hpUik2&b`Xts6Bg+FY|=WzoOrq zQp>;0@MO)XvcVT1_nuDIkN;P;zwYm@zxTFhFcgK=cgNn`bGo1XS9#TMU5SP{SMMi< zo4vopAkhGf`lRr0v;TZvztR461;g$)(SLsA|FPctSBwV|;lF*=)Ue7aOU{lEay8Xt~ziRib7!KdP{tijx|4GIhe|OI>{a(9^?Er%cI4$0Pa+^J2 z$M3lMYY10=k#;!t{_TVROBqi@{?#o@-G8#ah@tM<-S0B*_LVJXG+^)qCEhpYKd&*~ zsJ%NG$t-F1gzu*6ybX*VQ4o#Wc@Mlh|9?7?lG$tt-_!3eMlxj@(3F3Bk^Lgka6Sv+ z|2moX={HmFFM?^wxwn)M^QlBbebe3V`&>tKrh3ENa6a(-eTEORQVlv^|L`*0U&weO zh)x3kZ!`Y*^z`)dzrVh|{`Ofu^xVz*V!!>~%oCQ*`(MX!jQ@c#-xC|{=WiC=2PQKk zZ@DjvWS?y=I;U3rD;DV5%}*TlZzbAkKhH5*KFk&Tdd&VI^2wZu#mhh*4KjUS&-`P} zV~(=<|5p^9`!^dB9$)|b6@B17rPyrdWnlS|GELTCgNXzuemVfnl9i~NoS|I+` zVE)t*py2OE<{vsm=T2CHLt^Eu@B0~Rt`)NEK3^YVng0JQBs{AA{p0$ee9Ch6nV036 z44ckOV&9w5{&UTo%_ry7O=nX$ty6iSyKKh!k)Yt;55^iX%k(F6z#$QG_P&_!y%qS& zf&H=#AL|S4U;mJIL=V>Aj1u+@=Pf3D28LzxNDE5z6!W5A{y_S~Vz+ZMK_TIN^-u1_ zC%w4J+V|fdf0S;}xj)7G-n$*QOZRzf(4D#GV&VGNITN2Oj`&mtYUa`c>}id!`^kUy Wxd&(D-VF^P8$4b8T-G@yGywp4)VzcM literal 0 HcmV?d00001