From 5846c2017ca4f934a6680291834d1ec6a42adc17 Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Thu, 25 Jul 2024 19:46:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=97=A0=E4=BA=BA=E6=9C=BA?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E8=B7=9D=E7=A6=BB=E7=9A=84=E8=AE=BE=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/net/mcreator/target/TargetMod.java | 1 + .../target/client/screens/DroneUIOverlay.java | 21 +++++++------ .../target/event/PlayerEventHandler.java | 27 +++++++++++++++- .../target/network/ClientPacketHandler.java | 7 +++++ .../message/SimulationDistanceMessage.java | 31 +++++++++++++++++++ 5 files changed, 76 insertions(+), 11 deletions(-) create mode 100644 src/main/java/net/mcreator/target/network/message/SimulationDistanceMessage.java diff --git a/src/main/java/net/mcreator/target/TargetMod.java b/src/main/java/net/mcreator/target/TargetMod.java index 52a7c7708..79550dae7 100644 --- a/src/main/java/net/mcreator/target/TargetMod.java +++ b/src/main/java/net/mcreator/target/TargetMod.java @@ -107,6 +107,7 @@ public class TargetMod { addNetworkMessage(InteractMessage.class, InteractMessage::encode, InteractMessage::decode, InteractMessage::handler); addNetworkMessage(DroneMovementMessage.class, DroneMovementMessage::encode, DroneMovementMessage::decode, DroneMovementMessage::handler); addNetworkMessage(DroneFireMessage.class, DroneFireMessage::buffer, DroneFireMessage::new, DroneFireMessage::handler); + addNetworkMessage(SimulationDistanceMessage.class, SimulationDistanceMessage::encode, SimulationDistanceMessage::decode, SimulationDistanceMessage::handle, Optional.of(NetworkDirection.PLAY_TO_CLIENT)); 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), TargetModPotion.SHOCK.get()))); diff --git a/src/main/java/net/mcreator/target/client/screens/DroneUIOverlay.java b/src/main/java/net/mcreator/target/client/screens/DroneUIOverlay.java index e379f3172..d6fb851fe 100644 --- a/src/main/java/net/mcreator/target/client/screens/DroneUIOverlay.java +++ b/src/main/java/net/mcreator/target/client/screens/DroneUIOverlay.java @@ -21,8 +21,8 @@ import static net.mcreator.target.entity.DroneEntity.AMMO; @Mod.EventBusSubscriber(value = Dist.CLIENT) public class DroneUIOverlay { + public static int MAX_DISTANCE = 256; - private static int color = -1; @SubscribeEvent(priority = EventPriority.NORMAL) public static void eventHandler(RenderGuiEvent.Pre event) { int w = event.getWindow().getGuiScaledWidth(); @@ -44,18 +44,19 @@ public class DroneUIOverlay { if (entity != null) { double distance = player.distanceTo(entity); - if (distance > 450) { - event.getGuiGraphics().drawString(Minecraft.getInstance().font,"WARNING", w / 2 + -18, h / 2 + -47, -65536, false); + int color = -1; + + event.getGuiGraphics().drawString(Minecraft.getInstance().font, "MaxDistance:" + new DecimalFormat("##.#").format(MAX_DISTANCE) + "M", w / 2 + 10, h / 2 + 50, color, false); + + if (distance > MAX_DISTANCE) { + event.getGuiGraphics().drawString(Minecraft.getInstance().font, "WARNING", w / 2 + -18, h / 2 + -47, -65536, false); color = -65536; - } else { - color = -1; } - event.getGuiGraphics().drawString(Minecraft.getInstance().font,"Distance:" + new DecimalFormat("##.#").format(distance) + "M", w / 2 + 10, h / 2 + 33, color, false); - event.getGuiGraphics().drawString(Minecraft.getInstance().font,"Health:" + new DecimalFormat("##.#").format(entity.getHealth()) + "/" + new DecimalFormat("##").format(entity.getMaxHealth()), w / 2 - 77, h / 2 + 33, -1, false); - event.getGuiGraphics().drawString(Minecraft.getInstance().font,"AMMO:" + new DecimalFormat("##.#").format(entity.getEntityData().get(AMMO)) + " / 6", w / 2 + 12, h / 2 + -37, -1, false); + + event.getGuiGraphics().drawString(Minecraft.getInstance().font, "Distance:" + new DecimalFormat("##.#").format(distance) + "M", w / 2 + 10, h / 2 + 33, color, false); + event.getGuiGraphics().drawString(Minecraft.getInstance().font, "Health:" + new DecimalFormat("##.#").format(entity.getHealth()) + "/" + new DecimalFormat("##").format(entity.getMaxHealth()), w / 2 - 77, h / 2 + 33, -1, false); + event.getGuiGraphics().drawString(Minecraft.getInstance().font, "AMMO:" + new DecimalFormat("##.#").format(entity.getEntityData().get(AMMO)) + " / 6", w / 2 + 12, h / 2 + -37, -1, false); } - - } RenderSystem.depthMask(true); RenderSystem.defaultBlendFunc(); diff --git a/src/main/java/net/mcreator/target/event/PlayerEventHandler.java b/src/main/java/net/mcreator/target/event/PlayerEventHandler.java index e3f85ae91..6a27b3f58 100644 --- a/src/main/java/net/mcreator/target/event/PlayerEventHandler.java +++ b/src/main/java/net/mcreator/target/event/PlayerEventHandler.java @@ -1,14 +1,18 @@ package net.mcreator.target.event; +import net.mcreator.target.TargetMod; import net.mcreator.target.init.TargetModAttributes; import net.mcreator.target.init.TargetModItems; import net.mcreator.target.init.TargetModSounds; import net.mcreator.target.init.TargetModTags; import net.mcreator.target.network.TargetModVariables; +import net.mcreator.target.network.message.SimulationDistanceMessage; import net.mcreator.target.tools.SoundTool; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.DistanceManager; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; @@ -22,6 +26,10 @@ import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.util.ObfuscationReflectionHelper; +import net.minecraftforge.network.PacketDistributor; + +import java.lang.reflect.Field; @Mod.EventBusSubscriber public class PlayerEventHandler { @@ -73,7 +81,9 @@ public class PlayerEventHandler { handleBocekPulling(player); handleGunRecoil(player); } + handleDistantRange(player); + handleSimulationDistance(player); if ((player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new TargetModVariables.PlayerVariables())).cannonFiring > 0) { player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { @@ -314,7 +324,7 @@ public class PlayerEventHandler { capability.firing = 1; capability.syncPlayerVariables(player); }); - tag.putBoolean("shoot",false); + tag.putBoolean("shoot", false); } /* @@ -448,4 +458,19 @@ public class PlayerEventHandler { recoilThread.start(); } + private static void handleSimulationDistance(Player player) { + if (player.level() instanceof ServerLevel serverLevel && player instanceof ServerPlayer serverPlayer) { + int maxDistance; + Class clazz = DistanceManager.class; + try { + Field field = ObfuscationReflectionHelper.findField(clazz, "simulationDistance"); + field.setAccessible(true); + maxDistance = field.getInt(serverLevel.getChunkSource().chunkMap.getDistanceManager()); + } catch (IllegalAccessException e) { + maxDistance = 16; + } + TargetMod.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new SimulationDistanceMessage(maxDistance)); + } + + } } diff --git a/src/main/java/net/mcreator/target/network/ClientPacketHandler.java b/src/main/java/net/mcreator/target/network/ClientPacketHandler.java index 1c28f8caf..5103b7074 100644 --- a/src/main/java/net/mcreator/target/network/ClientPacketHandler.java +++ b/src/main/java/net/mcreator/target/network/ClientPacketHandler.java @@ -1,6 +1,7 @@ package net.mcreator.target.network; import net.mcreator.target.client.screens.CrossHairOverlay; +import net.mcreator.target.client.screens.DroneUIOverlay; import net.mcreator.target.event.KillMessageHandler; import net.mcreator.target.network.message.ClientIndicatorMessage; import net.mcreator.target.network.message.GunsDataMessage; @@ -41,4 +42,10 @@ public class ClientPacketHandler { } } } + + public static void handleSimulationDistanceMessage(int distance, Supplier ctx) { + if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) { + DroneUIOverlay.MAX_DISTANCE = distance * 16; + } + } } diff --git a/src/main/java/net/mcreator/target/network/message/SimulationDistanceMessage.java b/src/main/java/net/mcreator/target/network/message/SimulationDistanceMessage.java new file mode 100644 index 000000000..75ff8821b --- /dev/null +++ b/src/main/java/net/mcreator/target/network/message/SimulationDistanceMessage.java @@ -0,0 +1,31 @@ +package net.mcreator.target.network.message; + +import net.mcreator.target.network.ClientPacketHandler; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class SimulationDistanceMessage { + public int distance; + + public SimulationDistanceMessage(int distance) { + this.distance = distance; + } + + public static void encode(SimulationDistanceMessage message, FriendlyByteBuf buffer) { + buffer.writeInt(message.distance); + } + + public static SimulationDistanceMessage decode(FriendlyByteBuf buffer) { + return new SimulationDistanceMessage(buffer.readInt()); + } + + public static void handle(SimulationDistanceMessage message, Supplier context) { + context.get().enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, + () -> () -> ClientPacketHandler.handleSimulationDistanceMessage(message.distance, context))); + context.get().setPacketHandled(true); + } +}