From f910e509bc1d60008711c767491ffed63cf45c77 Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Fri, 6 Dec 2024 23:32:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0screen=E5=92=8Cmenu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/ChargingStationBlockEntity.java | 37 ++++- .../block/menu/ChargingStationMenu.java | 129 ++++++++++++++++++ .../client/screens/ChargingStationScreen.java | 49 +++++++ .../superbwarfare/init/ModMenuTypes.java | 5 + .../superbwarfare/init/ModScreens.java | 3 + .../textures/screens/charging_station.png | Bin 0 -> 2014 bytes 6 files changed, 221 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/block/menu/ChargingStationMenu.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/screens/ChargingStationScreen.java create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/charging_station.png diff --git a/src/main/java/com/atsuishio/superbwarfare/block/entity/ChargingStationBlockEntity.java b/src/main/java/com/atsuishio/superbwarfare/block/entity/ChargingStationBlockEntity.java index 65c1240dd..f16f092d6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/block/entity/ChargingStationBlockEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/block/entity/ChargingStationBlockEntity.java @@ -1,5 +1,6 @@ package com.atsuishio.superbwarfare.block.entity; +import com.atsuishio.superbwarfare.block.menu.ChargingStationMenu; import com.atsuishio.superbwarfare.entity.IChargeEntity; import com.atsuishio.superbwarfare.init.ModBlockEntities; import net.minecraft.core.BlockPos; @@ -16,6 +17,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerData; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -41,7 +43,7 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo private static final int[] SLOTS_FOR_DOWN = new int[]{0}; public static final int MAX_ENERGY = 4000000; - public static final int MAX_DATA_COUNT = 2; + public static final int MAX_DATA_COUNT = 3; public static final int DEFAULT_FUEL_TIME = 1600; public static final int CHARGE_SPEED = 128; public static final int CHARGE_RADIUS = 4; @@ -53,6 +55,36 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo public int fuelTick = 0; public int maxFuelTick = DEFAULT_FUEL_TIME; + public int energy; + + protected final ContainerData dataAccess = new ContainerData() { + public int get(int pIndex) { + return switch (pIndex) { + case 0 -> ChargingStationBlockEntity.this.fuelTick; + case 1 -> ChargingStationBlockEntity.this.maxFuelTick; + case 2 -> ChargingStationBlockEntity.this.energy; + default -> 0; + }; + } + + public void set(int pIndex, int pValue) { + switch (pIndex) { + case 0: + ChargingStationBlockEntity.this.fuelTick = pValue; + break; + case 1: + ChargingStationBlockEntity.this.maxFuelTick = pValue; + break; + case 2: + ChargingStationBlockEntity.this.energy = pValue; + break; + } + } + + public int getCount() { + return MAX_DATA_COUNT; + } + }; public ChargingStationBlockEntity(BlockPos pos, BlockState state) { super(ModBlockEntities.CHARGING_STATION.get(), pos, state); @@ -109,6 +141,7 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo blockEntity.energyHandler.ifPresent(handler -> { int energy = handler.getEnergyStored(); + blockEntity.energy = energy; if (energy > 0) { List entities = pLevel.getEntitiesOfClass(Entity.class, new AABB(pPos).inflate(CHARGE_RADIUS)); entities.forEach(entity -> { @@ -231,7 +264,7 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo @Nullable @Override public AbstractContainerMenu createMenu(int pContainerId, Inventory pPlayerInventory, Player pPlayer) { - return null; + return new ChargingStationMenu(pContainerId, pPlayerInventory, this, this.dataAccess); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/block/menu/ChargingStationMenu.java b/src/main/java/com/atsuishio/superbwarfare/block/menu/ChargingStationMenu.java new file mode 100644 index 000000000..75185ea23 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/block/menu/ChargingStationMenu.java @@ -0,0 +1,129 @@ +package com.atsuishio.superbwarfare.block.menu; + +import com.atsuishio.superbwarfare.block.entity.ChargingStationBlockEntity; +import com.atsuishio.superbwarfare.init.ModMenuTypes; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerData; +import net.minecraft.world.inventory.SimpleContainerData; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.capabilities.ForgeCapabilities; + +public class ChargingStationMenu extends AbstractContainerMenu { + + private final Container container; + private final ContainerData containerData; + + public static final int X_OFFSET = 0; + public static final int Y_OFFSET = 11; + + public ChargingStationMenu(int id, Inventory inventory) { + this(id, inventory, new SimpleContainer(2), new SimpleContainerData(ChargingStationBlockEntity.MAX_DATA_COUNT)); + } + + public ChargingStationMenu(int id, Inventory inventory, Container container, ContainerData containerData) { + super(ModMenuTypes.CHARGING_STATION_MENU.get(), id); + + checkContainerSize(container, 2); + checkContainerDataCount(containerData, ChargingStationBlockEntity.MAX_DATA_COUNT); + + this.container = container; + this.containerData = containerData; + + this.addSlot(new Slot(container, 0, 51, 43)); + this.addSlot(new ChargingStationMenu.ChargingSlot(container, 1, 110, 43)); + + this.addDataSlots(containerData); + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlot(new Slot(inventory, j + i * 9 + 9, 8 + j * 18 + X_OFFSET, 84 + i * 18 + Y_OFFSET)); + } + } + + for (int k = 0; k < 9; ++k) { + this.addSlot(new Slot(inventory, k, 8 + k * 18 + X_OFFSET, 142 + Y_OFFSET)); + } + } + + @Override + public ItemStack quickMoveStack(Player pPlayer, int pIndex) { + ItemStack itemstack = ItemStack.EMPTY; + Slot slot = this.slots.get(pIndex); + if (slot.hasItem()) { + ItemStack itemstack1 = slot.getItem(); + itemstack = itemstack1.copy(); + if (pIndex == 1) { + if (!this.moveItemStackTo(itemstack1, 2, 38, true)) { + return ItemStack.EMPTY; + } + } else if (pIndex != 0) { + if (itemstack1.getCapability(ForgeCapabilities.ENERGY).isPresent()) { + if (!this.moveItemStackTo(itemstack1, 1, 2, true)) { + return ItemStack.EMPTY; + } + } else if (itemstack1.getBurnTime(null) > 0 || itemstack1.getFoodProperties(null) != null) { + if (!this.moveItemStackTo(itemstack1, 0, 1, false)) { + return ItemStack.EMPTY; + } + } else if (pIndex >= 2 && pIndex < 29) { + if (!this.moveItemStackTo(itemstack1, 29, 38, false)) { + return ItemStack.EMPTY; + } + } else if (pIndex >= 29 && pIndex < 38 && !this.moveItemStackTo(itemstack1, 2, 29, false)) { + return ItemStack.EMPTY; + } + } else if (!this.moveItemStackTo(itemstack1, 2, 38, false)) { + return ItemStack.EMPTY; + } + + if (itemstack1.isEmpty()) { + slot.setByPlayer(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + + if (itemstack1.getCount() == itemstack.getCount()) { + return ItemStack.EMPTY; + } + + slot.onTake(pPlayer, itemstack1); + } + + return itemstack; + } + + @Override + public boolean stillValid(Player pPlayer) { + return this.container.stillValid(pPlayer); + } + + public int getFuelTick() { + return this.containerData.get(0); + } + + public int getMaxFuelTick() { + return this.containerData.get(1); + } + + public int getEnergy() { + return this.containerData.get(2); + } + + class ChargingSlot extends Slot { + + public ChargingSlot(Container pContainer, int pSlot, int pX, int pY) { + super(pContainer, pSlot, pX, pY); + } + + @Override + public boolean mayPlace(ItemStack pStack) { + return super.mayPlace(pStack); + } + } + +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/screens/ChargingStationScreen.java b/src/main/java/com/atsuishio/superbwarfare/client/screens/ChargingStationScreen.java new file mode 100644 index 000000000..d3364c59f --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/screens/ChargingStationScreen.java @@ -0,0 +1,49 @@ +package com.atsuishio.superbwarfare.client.screens; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.block.menu.ChargingStationMenu; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class ChargingStationScreen extends AbstractContainerScreen { + + private static final ResourceLocation TEXTURE = ModUtils.loc("textures/gui/charging_station.png"); + + public ChargingStationScreen(ChargingStationMenu pMenu, Inventory pPlayerInventory, Component pTitle) { + super(pMenu, pPlayerInventory, pTitle); + imageWidth = 176; + imageHeight = 166; + } + + @Override + protected void renderBg(GuiGraphics pGuiGraphics, float pPartialTick, int pMouseX, int pMouseY) { + int i = (this.width - this.imageWidth) / 2; + int j = (this.height - this.imageHeight) / 2; + pGuiGraphics.blit(TEXTURE, i, j, 0, 0, this.imageWidth, this.imageHeight); + + + } + + @Override + public void render(GuiGraphics pGuiGraphics, int pMouseX, int pMouseY, float pPartialTick) { + this.renderBackground(pGuiGraphics); + super.render(pGuiGraphics, pMouseX, pMouseY, pPartialTick); + this.renderTooltip(pGuiGraphics, pMouseX, pMouseY); + } + + @Override + protected void init() { + super.init(); + this.titleLabelX = 8; + this.titleLabelY = 5; + this.inventoryLabelX = 8; + this.inventoryLabelY = 74; + } + +} diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModMenuTypes.java b/src/main/java/com/atsuishio/superbwarfare/init/ModMenuTypes.java index b23610dac..bb132d55b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModMenuTypes.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModMenuTypes.java @@ -1,6 +1,7 @@ package com.atsuishio.superbwarfare.init; import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.block.menu.ChargingStationMenu; import com.atsuishio.superbwarfare.block.menu.ReforgingTableMenu; import net.minecraft.world.inventory.MenuType; import net.minecraftforge.common.extensions.IForgeMenuType; @@ -9,9 +10,13 @@ import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; public class ModMenuTypes { + public static final DeferredRegister> REGISTRY = DeferredRegister.create(ForgeRegistries.MENU_TYPES, ModUtils.MODID); public static final RegistryObject> REFORGING_TABLE_MENU = REGISTRY.register("reforging_table_menu", () -> IForgeMenuType.create((windowId, inv, data) -> new ReforgingTableMenu(windowId, inv))); + public static final RegistryObject> CHARGING_STATION_MENU = + REGISTRY.register("charging_station_menu", + () -> IForgeMenuType.create((windowId, inv, data) -> new ChargingStationMenu(windowId, inv))); } diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModScreens.java b/src/main/java/com/atsuishio/superbwarfare/init/ModScreens.java index d8f710121..bedcc910c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModScreens.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModScreens.java @@ -1,5 +1,6 @@ package com.atsuishio.superbwarfare.init; +import com.atsuishio.superbwarfare.client.screens.ChargingStationScreen; import com.atsuishio.superbwarfare.client.screens.ReforgingTableScreen; import net.minecraft.client.gui.screens.MenuScreens; import net.minecraftforge.api.distmarker.Dist; @@ -9,10 +10,12 @@ import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) public class ModScreens { + @SubscribeEvent public static void clientLoad(FMLClientSetupEvent event) { event.enqueueWork(() -> { MenuScreens.register(ModMenuTypes.REFORGING_TABLE_MENU.get(), ReforgingTableScreen::new); + MenuScreens.register(ModMenuTypes.CHARGING_STATION_MENU.get(), ChargingStationScreen::new); }); } } diff --git a/src/main/resources/assets/superbwarfare/textures/screens/charging_station.png b/src/main/resources/assets/superbwarfare/textures/screens/charging_station.png new file mode 100644 index 0000000000000000000000000000000000000000..38851cb65c2ec406f320c2477f4060f84eed6a6d GIT binary patch literal 2014 zcmcJQYfzKt633qeNJu0IGE5MRL2IdnRuM5!Vj*a_C}J2OhFFCZEEtiC6o?o?BGd+C zKs|_{2*`AhTZD#76dXxf1uRg32E>5Dl%Pm7g%}`&n|-4_&N=;ZrXS8T^Um(hKKtAM zv-{!A2|DP9LEEAM0GNIL(5C^^N?*B7bpq0ys7 zIfQ?cx%tH&g*rDzJ)M!R?O@zdPd0|F$tv&OfW!IpQU#QDu2n+B?z>5^+lC=u%0W8) z_TUKEfX6q~yCtq+v)PuGLa`XXBLvmV%@OJEt0Q*SfNkrS2UQR>ZZ|i5PND6h)$#Ph zM=+pzD5a7kT^{Vkv(Sl!fMHYSm7iVU#P=*!Q^pG%H+=yk&22+2zN)LzQNmZ$D&+Pt zmhH?XaN|rtTt*wrPLGmt)RRp80{Gd#vqTFMU*Mv^f5X*q!i|^|4Pt^;j2ub)rBwGOy_sa9wn1 zk7@F=6(cfP>oVKbwqt&N9?jl)vZ!+9HI+B)<+J-jvDsp-vY{k<@)i*uW6CoROrXn0 zMv{uY;X7ote(G_h6x`v<=iU=Jk`q7?}wL;-^)pGdptfm z=g=OWFh0EY+LPng!eTdf#ywz;c5)w$E_BiDru#-tb3O9K_NEg{1_R$7LITH!Ws z^d)cA5a*S2yR}_$=_!vpqooh-w`9*bjC)HDl(8;kYejiYgz@|C<6@$Y~}Pn&DGp78U?k{AgL*K!wZid~4D#()5IxSZo3|z?$?0tpDuPfrJ+k z=CR;8R2BleYz1&G+UI7)8Z7ANy#n0@&>j;Kjt|NeW;t%y_ zUbK8d(h1(hCm4_>Yf|e8BLz`!b~7_%l8c)mm!8Pwc}k_yWbP){CBv)CWGn3`NaS+v?tRm47%9o6rBHYK zcf-K#FO`&q3a%QK;~$y5^X=t2Lmtja_l&$`xGIrg(q5D|8a80|B#`B2Ub8O9uu`K` zsa4KiG~BS1i;~GqhG~}99+N~o+`gv5Y}J$nALB#7hctM2y_+TveIpyZluRPR@P{V& zgoTebhu47fD4y~6%?eg2(`2S3ujOulaAE@Uq#eXX7eD39La<6Jd!SuG1H?;{~F^0GF4!!%{|G)pS(Bu$tH=Boa9?aPSmyWALl|kpD^gdlR9Z z&M0iK;nx#>#93*c*!-lQy?VByRF6Bm>@hR`#L}O5FQF@+Bo`t+i1|C>KXm?AD%yZ* z$F)Vhw?udf1R9y*5L1m+`MdtH(j7!Nvr4D#FSTPCXL>e%)IaWS^6yaz?XWO4T2SiQ zyi@GtoEt@B7&_-l<)_g9T=x6oHV9H1MN@QqKm-*s^?i{7KeE&{ke!@7(R1$DO>2^N zc1l{9YW&B~a7AP<_pEyV85k>O#t8bE{$GwW=`C_tM(8&Gj+ts`u+Qfpxqc5L^H1#e BL2Cd2 literal 0 HcmV?d00001