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 000000000..38851cb65 Binary files /dev/null and b/src/main/resources/assets/superbwarfare/textures/screens/charging_station.png differ