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);