From 3f47b72d409fb43bfdad869d3ce6568fd1f95da6 Mon Sep 17 00:00:00 2001 From: Atsuishio <842960157@qq.com> Date: Wed, 25 Jun 2025 13:23:36 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=BF=91=E6=88=98=E6=94=BB?= =?UTF-8?q?=E5=87=BB=E8=BD=BD=E5=85=B7=E7=9A=84=E7=B2=BE=E7=A1=AE=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/PlayerEventHandler.java | 21 +++++++++++++------ .../superbwarfare/tools/TraceTool.java | 18 ++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java index a2a3e1cc2..42e99fe31 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java @@ -10,6 +10,8 @@ import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.network.message.receive.SimulationDistanceMessage; import com.atsuishio.superbwarfare.tools.InventoryTool; import com.atsuishio.superbwarfare.tools.NBTTool; +import com.atsuishio.superbwarfare.tools.TraceTool; +import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -20,6 +22,7 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.AnvilUpdateEvent; @@ -196,13 +199,19 @@ public class PlayerEventHandler { public static void onAttackEntity(AttackEntityEvent event) { var target = event.getTarget(); if (target instanceof VehicleEntity vehicle) { - if (vehicle.shouldSendHitSounds()) { - vehicle.level().playSound(null, vehicle.getOnPos(), ModSounds.HIT.get(), SoundSource.PLAYERS, 1, 1); - } + Vec3 position; - if (vehicle.shouldSendHitParticles() && vehicle.level() instanceof ServerLevel serverLevel) { - sendParticle(serverLevel, ModParticleTypes.FIRE_STAR.get(), vehicle.getX(), vehicle.getY() + 0.5 * vehicle.getBbHeight(), vehicle.getZ(), - 2, 0.4, 0.4, 0.4, 0.2, false); + position = TraceTool.playerFindLookingPos(event.getEntity(), vehicle, event.getEntity().entityInteractionRange()); + + if (position != null) { + if (vehicle.shouldSendHitSounds()) { + vehicle.level().playSound(null, BlockPos.containing(position), ModSounds.HIT.get(), SoundSource.PLAYERS, 1, 1); + } + + if (vehicle.shouldSendHitParticles() && vehicle.level() instanceof ServerLevel serverLevel) { + sendParticle(serverLevel, ModParticleTypes.FIRE_STAR.get(), position.x, position.y, position.z, + 2, 0, 0, 0, 0.2, false); + } } } } diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java b/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java index fff1ef322..95cefb666 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java +++ b/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java @@ -123,6 +123,24 @@ public class TraceTool { return null; } + public static Vec3 playerFindLookingPos(Player player, VehicleEntity vehicle, double entityReach) { + double distance = entityReach * entityReach; + HitResult hitResult = player.pick(entityReach, 1.0f, false); + + Vec3 viewVec = player.getViewVector(1); + Vec3 toVec = player.getEyePosition().add(viewVec.x * entityReach, viewVec.y * entityReach, viewVec.z * entityReach); + AABB aabb = vehicle.getBoundingBox().expandTowards(viewVec.scale(entityReach)).inflate(1.0D, 1.0D, 1.0D); + EntityHitResult entityhitresult = ProjectileUtil.getEntityHitResult(player, player.getEyePosition(), toVec, aabb, p -> true, distance); + if (entityhitresult != null) { + hitResult = entityhitresult; + + } + if (hitResult.getType() == HitResult.Type.ENTITY) { + return hitResult.getLocation(); + } + return null; + } + public static Entity droneFindLookingEntity(Entity entity, Vec3 pos, double entityReach, float ticks) { double distance = entityReach * entityReach; HitResult hitResult = entity.pick(entityReach, 1.0f, false);