From f30c0e385ca4376ad57a36e32fa9f2cee517c595 Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Thu, 9 Jan 2025 19:49:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=85=85=E7=94=B5=E7=AB=99?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/atsuishio/superbwarfare/ModUtils.java | 1 + .../entity/ChargingStationBlockEntity.java | 10 +- .../client/ClientRenderHandler.java | 2 + .../client/renderer/CustomRenderType.java | 25 +++++ .../ChargingStationBlockEntityRenderer.java | 93 +++++++++++++++++++ .../client/screens/ChargingStationScreen.java | 36 +++++++ .../menu/ChargingStationMenu.java | 8 ++ .../message/ShowChargingRangeMessage.java | 39 ++++++++ .../assets/superbwarfare/lang/en_us.json | 2 + .../assets/superbwarfare/lang/zh_cn.json | 2 + 10 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/CustomRenderType.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/block/ChargingStationBlockEntityRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/network/message/ShowChargingRangeMessage.java diff --git a/src/main/java/com/atsuishio/superbwarfare/ModUtils.java b/src/main/java/com/atsuishio/superbwarfare/ModUtils.java index 37f1164f1..3512f7748 100644 --- a/src/main/java/com/atsuishio/superbwarfare/ModUtils.java +++ b/src/main/java/com/atsuishio/superbwarfare/ModUtils.java @@ -164,6 +164,7 @@ public class ModUtils { addNetworkMessage(RadarSetPosMessage.class, RadarSetPosMessage::encode, RadarSetPosMessage::decode, RadarSetPosMessage::handler); addNetworkMessage(PlayerStopRidingMessage.class, PlayerStopRidingMessage::encode, PlayerStopRidingMessage::decode, PlayerStopRidingMessage::handler); addNetworkMessage(AimVillagerMessage.class, AimVillagerMessage::encode, AimVillagerMessage::decode, AimVillagerMessage::handler); + addNetworkMessage(ShowChargingRangeMessage.class, ShowChargingRangeMessage::encode, ShowChargingRangeMessage::decode, ShowChargingRangeMessage::handler); event.enqueueWork(() -> BrewingRecipeRegistry.addRecipe(Ingredient.of(PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)), Ingredient.of(Items.LIGHTNING_ROD), PotionUtils.setPotion(new ItemStack(Items.POTION), ModPotion.SHOCK.get()))); 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 605825d11..7e4e4e71c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/block/entity/ChargingStationBlockEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/block/entity/ChargingStationBlockEntity.java @@ -45,7 +45,7 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo protected static final int SLOT_CHARGE = 1; public static final int MAX_ENERGY = 4000000; - public static final int MAX_DATA_COUNT = 3; + public static final int MAX_DATA_COUNT = 4; public static final int DEFAULT_FUEL_TIME = 1600; public static final int CHARGE_SPEED = 128; public static final int CHARGE_OTHER_SPEED = 100000; @@ -59,6 +59,8 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo public int fuelTick = 0; public int maxFuelTick = DEFAULT_FUEL_TIME; + public boolean showRange = false; + protected final ContainerEnergyData dataAccess = new ContainerEnergyData() { public long get(int pIndex) { return switch (pIndex) { @@ -69,6 +71,7 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo ChargingStationBlockEntity.this.getCapability(ForgeCapabilities.ENERGY).ifPresent(consumer -> energy.set(consumer.getEnergyStored())); yield energy.get(); } + case 3 -> ChargingStationBlockEntity.this.showRange ? 1 : 0; default -> 0; }; } @@ -84,6 +87,9 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo case 2: ChargingStationBlockEntity.this.getCapability(ForgeCapabilities.ENERGY).ifPresent(consumer -> consumer.receiveEnergy((int) pValue, false)); break; + case 3: + ChargingStationBlockEntity.this.showRange = pValue == 1; + break; } } @@ -217,6 +223,7 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo } this.fuelTick = pTag.getInt("FuelTick"); this.maxFuelTick = pTag.getInt("MaxFuelTick"); + this.showRange = pTag.getBoolean("ShowRange"); this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); ContainerHelper.loadAllItems(pTag, this.items); } @@ -228,6 +235,7 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo getCapability(ForgeCapabilities.ENERGY).ifPresent(handler -> pTag.put("Energy", ((EnergyStorage) handler).serializeNBT())); pTag.putInt("FuelTick", this.fuelTick); pTag.putInt("MaxFuelTick", this.maxFuelTick); + pTag.putBoolean("ShowRange", this.showRange); ContainerHelper.saveAllItems(pTag, this.items); } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ClientRenderHandler.java b/src/main/java/com/atsuishio/superbwarfare/client/ClientRenderHandler.java index be442fb02..338a34052 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ClientRenderHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ClientRenderHandler.java @@ -1,5 +1,6 @@ package com.atsuishio.superbwarfare.client; +import com.atsuishio.superbwarfare.client.renderer.block.ChargingStationBlockEntityRenderer; import com.atsuishio.superbwarfare.client.renderer.block.ContainerBlockEntityRenderer; import com.atsuishio.superbwarfare.client.renderer.block.FuMO25BlockEntityRenderer; import com.atsuishio.superbwarfare.client.tooltip.*; @@ -29,6 +30,7 @@ public class ClientRenderHandler { public static void registerRenderers(EntityRenderersEvent.RegisterRenderers event) { event.registerBlockEntityRenderer(ModBlockEntities.CONTAINER.get(), context -> new ContainerBlockEntityRenderer()); event.registerBlockEntityRenderer(ModBlockEntities.FUMO_25.get(), FuMO25BlockEntityRenderer::new); + event.registerBlockEntityRenderer(ModBlockEntities.CHARGING_STATION.get(), context -> new ChargingStationBlockEntityRenderer()); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/CustomRenderType.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/CustomRenderType.java new file mode 100644 index 000000000..14b99d80f --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/CustomRenderType.java @@ -0,0 +1,25 @@ +package com.atsuishio.superbwarfare.client.renderer; + +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; +import net.minecraft.client.renderer.RenderType; + +public class CustomRenderType extends RenderType { + public CustomRenderType(String pName, VertexFormat pFormat, VertexFormat.Mode pMode, int pBufferSize, boolean pAffectsCrumbling, boolean pSortOnUpload, Runnable pSetupState, Runnable pClearState) { + super(pName, pFormat, pMode, pBufferSize, pAffectsCrumbling, pSortOnUpload, pSetupState, pClearState); + } + + public static final RenderType BLOCK_OVERLAY = create("block_overlay", + DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.QUADS, 256, false, false, + RenderType.CompositeState.builder() + .setShaderState(ShaderStateShard.POSITION_COLOR_SHADER) + .setLayeringState(NO_LAYERING) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setTextureState(NO_TEXTURE) + .setDepthTestState(LEQUAL_DEPTH_TEST) + .setCullState(NO_CULL) + .setLightmapState(NO_LIGHTMAP) + .setWriteMaskState(COLOR_WRITE) + .createCompositeState(false)); + +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/block/ChargingStationBlockEntityRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/block/ChargingStationBlockEntityRenderer.java new file mode 100644 index 000000000..38ab9768d --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/block/ChargingStationBlockEntityRenderer.java @@ -0,0 +1,93 @@ +package com.atsuishio.superbwarfare.client.renderer.block; + +import com.atsuishio.superbwarfare.block.entity.ChargingStationBlockEntity; +import com.atsuishio.superbwarfare.client.renderer.CustomRenderType; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class ChargingStationBlockEntityRenderer implements BlockEntityRenderer { + + @Override + public void render(ChargingStationBlockEntity pBlockEntity, float pPartialTick, PoseStack pPoseStack, MultiBufferSource pBuffer, int pPackedLight, int pPackedOverlay) { + // TODO 正确判断是否开启范围展示 + if (!pBlockEntity.showRange) return; + + pPoseStack.pushPose(); + var pos = pBlockEntity.getBlockPos(); + pPoseStack.translate(-pos.getX(), -pos.getY(), -pos.getZ()); + + var aabb = new AABB(pos).inflate(ChargingStationBlockEntity.CHARGE_RADIUS); + + float startX = (float) aabb.minX - 0.001f; + float startY = (float) aabb.minY - 0.001f; + float startZ = (float) aabb.minZ - 0.001f; + float endX = (float) aabb.maxX + 0.001f; + float endY = (float) aabb.maxY + 0.001f; + float endZ = (float) aabb.maxZ + 0.001f; + + var red = 0.0f; + var green = 1.0f; + var blue = 0.0f; + var alpha = 0.2f; + + + var builder = pBuffer.getBuffer(CustomRenderType.BLOCK_OVERLAY); + var m4f = pPoseStack.last().pose(); + + // east + builder.vertex(m4f, startX, startY, startZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, startX, endY, startZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, endX, endY, startZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, endX, startY, startZ).color(red, green, blue, alpha).endVertex(); + + // west + builder.vertex(m4f, startX, startY, endZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, endX, startY, endZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, endX, endY, endZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, startX, endY, endZ).color(red, green, blue, alpha).endVertex(); + + // south + builder.vertex(m4f, endX, startY, startZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, endX, endY, startZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, endX, endY, endZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, endX, startY, endZ).color(red, green, blue, alpha).endVertex(); + + // north + builder.vertex(m4f, startX, startY, startZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, startX, startY, endZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, startX, endY, endZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, startX, endY, startZ).color(red, green, blue, alpha).endVertex(); + + // top + builder.vertex(m4f, startX, endY, startZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, endX, endY, startZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, endX, endY, endZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, startX, endY, endZ).color(red, green, blue, alpha).endVertex(); + + // bottom + builder.vertex(m4f, startX, startY, startZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, endX, startY, startZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, endX, startY, endZ).color(red, green, blue, alpha).endVertex(); + builder.vertex(m4f, startX, startY, endZ).color(red, green, blue, alpha).endVertex(); + + + pPoseStack.popPose(); + } + + @Override + public boolean shouldRenderOffScreen(ChargingStationBlockEntity pBlockEntity) { + return true; + } + + @Override + public boolean shouldRender(ChargingStationBlockEntity pBlockEntity, Vec3 pCameraPos) { + return true; + } + +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/screens/ChargingStationScreen.java b/src/main/java/com/atsuishio/superbwarfare/client/screens/ChargingStationScreen.java index d87e20ae6..ef1671043 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/screens/ChargingStationScreen.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/screens/ChargingStationScreen.java @@ -3,7 +3,10 @@ package com.atsuishio.superbwarfare.client.screens; import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.block.entity.ChargingStationBlockEntity; import com.atsuishio.superbwarfare.menu.ChargingStationMenu; +import com.atsuishio.superbwarfare.network.message.ShowChargingRangeMessage; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.AbstractButton; +import net.minecraft.client.gui.narration.NarrationElementOutput; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -73,6 +76,35 @@ public class ChargingStationScreen extends AbstractContainerScreen contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + if (context.getSender() == null) return; + + var player = context.getSender(); + var menu = player.containerMenu; + if (menu instanceof ChargingStationMenu chargingStationMenu) { + if (!chargingStationMenu.stillValid(player)) return; + + chargingStationMenu.setShowRange(message.operation); + } + }); + context.setPacketHandled(true); + } +} diff --git a/src/main/resources/assets/superbwarfare/lang/en_us.json b/src/main/resources/assets/superbwarfare/lang/en_us.json index 0874dc4d3..2d9206ab4 100644 --- a/src/main/resources/assets/superbwarfare/lang/en_us.json +++ b/src/main/resources/assets/superbwarfare/lang/en_us.json @@ -216,6 +216,8 @@ "block.superbwarfare.silver_block": "Silver Block", "block.superbwarfare.cemented_carbide_block": "Cemented Carbide Block", "block.superbwarfare.charging_station": "Charging Station", + "container.superbwarfare.charging_station.show_range": "Show Range", + "container.superbwarfare.charging_station.hide_range": "Hide Range", "des.superbwarfare.charging_station.energy": "Energy: %1$s / %2$s FE", "block.superbwarfare.fumo_25": "FuMO25 Fire Control Radar", "des.superbwarfare.fumo_25.current_pos": "Current Pos: %1$s", diff --git a/src/main/resources/assets/superbwarfare/lang/zh_cn.json b/src/main/resources/assets/superbwarfare/lang/zh_cn.json index ed40fd2f0..36b6007ab 100644 --- a/src/main/resources/assets/superbwarfare/lang/zh_cn.json +++ b/src/main/resources/assets/superbwarfare/lang/zh_cn.json @@ -443,6 +443,8 @@ "container.superbwarfare.reforging_table": "枪械重铸台", "container.superbwarfare.charging_station": "充电站", + "container.superbwarfare.charging_station.show_range": "显示范围", + "container.superbwarfare.charging_station.hide_range": "隐藏范围", "config.superbwarfare.title": "卓越前线", "config.superbwarfare.client.reload": "换弹配置",