From 23bf1b1737e15c1ddc3bb59dc133d81341852e9a Mon Sep 17 00:00:00 2001 From: Atsuihsio <842960157@qq.com> Date: Fri, 29 Nov 2024 04:42:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E7=82=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../superbwarfare/client/ClickHandler.java | 12 ++-- .../client/screens/CannonHudOverlay.java | 8 +-- .../client/screens/CrossHairOverlay.java | 8 ++- .../superbwarfare/entity/Mk42Entity.java | 58 +++++++++---------- .../superbwarfare/entity/Mle1934Entity.java | 30 +++++----- .../event/ClientEventHandler.java | 10 ++-- .../mixins/MouseHandlerMixin.java | 2 +- .../network/message/ZoomMessage.java | 7 +-- .../superbwarfare/tools/TraceTool.java | 31 ++++++++++ 9 files changed, 99 insertions(+), 67 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java index c8323308f..6d295cc55 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java @@ -92,7 +92,7 @@ public class ClickHandler { if (player.getMainHandItem().is(ModTags.Items.GUN) || stack.is(ModItems.MONITOR.get()) || player.hasEffect(ModMobEffects.SHOCK.get()) - || (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity && player.getMainHandItem().getItem() instanceof CannonShellItem)) { + || (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity)) { if (button == GLFW.GLFW_MOUSE_BUTTON_LEFT) { event.setCanceled(true); } @@ -114,9 +114,9 @@ public class ClickHandler { } } - if (player.getMainHandItem().is(ModTags.Items.GUN) + if ((player.getMainHandItem().is(ModTags.Items.GUN) && !(player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity)) || stack.is(ModItems.MONITOR.get()) - || (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity && !player.getMainHandItem().is(ModTags.Items.GUN)) + || (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity) || (stack.is(Items.SPYGLASS) && player.isScoping() && player.getOffhandItem().is(ModItems.FIRING_PARAMETERS.get()))) { if (button == ModKeyMappings.FIRE.getKey().getValue()) { handleWeaponFirePress(player, stack); @@ -235,9 +235,9 @@ public class ClickHandler { ModUtils.PACKET_HANDLER.sendToServer(new SensitivityMessage(false)); } - if (player.getMainHandItem().is(ModTags.Items.GUN) + if ((player.getMainHandItem().is(ModTags.Items.GUN) && !(player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity)) || stack.is(ModItems.MONITOR.get()) - || (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity && !player.getMainHandItem().is(ModTags.Items.GUN)) + || (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity) || (stack.is(Items.SPYGLASS) && player.isScoping() && player.getOffhandItem().is(ModItems.FIRING_PARAMETERS.get()))) { if (key == ModKeyMappings.FIRE.getKey().getValue()) { handleWeaponFirePress(player, stack); @@ -293,7 +293,7 @@ public class ClickHandler { return; } - if (stack.is(ModTags.Items.GUN)) { + if (stack.is(ModTags.Items.GUN) && !(player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity)) { if ((!(stack.getOrCreateTag().getBoolean("is_normal_reloading") || stack.getOrCreateTag().getBoolean("is_empty_reloading")) && !stack.getOrCreateTag().getBoolean("reloading") && !stack.getOrCreateTag().getBoolean("charging") diff --git a/src/main/java/com/atsuishio/superbwarfare/client/screens/CannonHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/screens/CannonHudOverlay.java index 057f8bd42..a337eeb4b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/screens/CannonHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/screens/CannonHudOverlay.java @@ -5,11 +5,10 @@ import com.atsuishio.superbwarfare.client.RenderHelper; import com.atsuishio.superbwarfare.entity.ICannonEntity; import com.atsuishio.superbwarfare.entity.Mk42Entity; import com.atsuishio.superbwarfare.entity.Mle1934Entity; +import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.tools.TraceTool; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; -import com.atsuishio.superbwarfare.event.ClientEventHandler; -import com.atsuishio.superbwarfare.item.gun.GunItem; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.GameRenderer; @@ -72,10 +71,10 @@ public class CannonHudOverlay { int k = (w - i) / 2; int l = (h - j) / 2; if (ClientEventHandler.zoom) { - Entity lookingEntity = TraceTool.findLookingEntity(player, 512); + Entity lookingEntity = TraceTool.cannonFindLookingEntity(player, 512); boolean lookAtEntity = false; double block_range = player.position().distanceTo((Vec3.atLowerCornerOf(player.level().clip( - new ClipContext(player.getEyePosition(), player.getEyePosition().add(player.getLookAngle().scale(512)), + new ClipContext(new Vec3(player.getX(), player.getEyeY() + 1, player.getZ()), new Vec3(player.getX(), player.getEyeY() + 1, player.getZ()).add(player.getLookAngle().scale(512)), ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, player)).getBlockPos()))); double entity_range = 0; @@ -135,7 +134,6 @@ public class CannonHudOverlay { private static boolean shouldRenderCrossHair(Player player) { if (player == null) return false; return !player.isSpectator() - && !(player.getMainHandItem().getItem() instanceof GunItem) && (player.getVehicle() != null && (player.getVehicle() instanceof ICannonEntity)); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/screens/CrossHairOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/screens/CrossHairOverlay.java index d4dfe2184..00ea32bd6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/screens/CrossHairOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/screens/CrossHairOverlay.java @@ -1,16 +1,17 @@ package com.atsuishio.superbwarfare.client.screens; import com.atsuishio.superbwarfare.ModUtils; -import com.atsuishio.superbwarfare.network.ModVariables; -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.systems.RenderSystem; import com.atsuishio.superbwarfare.config.client.DisplayConfig; +import com.atsuishio.superbwarfare.entity.ICannonEntity; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.network.ModVariables; import com.atsuishio.superbwarfare.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -49,6 +50,7 @@ public class CrossHairOverlay { } if (player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).edit) return; + if (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity) return; GuiGraphics guiGraphics = event.getGuiGraphics(); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/Mk42Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/Mk42Entity.java index 66ac713ba..f4ee8c960 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/Mk42Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/Mk42Entity.java @@ -10,6 +10,7 @@ import com.atsuishio.superbwarfare.tools.ParticleTool; import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.syncher.EntityDataAccessor; @@ -45,7 +46,6 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity { public static final EntityDataAccessor COOL_DOWN = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.INT); - public static final EntityDataAccessor TYPE = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.INT); public static final EntityDataAccessor HEALTH = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.FLOAT); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); public static final float MAX_HEALTH = 700.0f; @@ -64,21 +64,18 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity { @Override protected void defineSynchedData() { this.entityData.define(COOL_DOWN, 0); - this.entityData.define(TYPE, 0); this.entityData.define(HEALTH, MAX_HEALTH); } @Override public void addAdditionalSaveData(CompoundTag compound) { compound.putInt("CoolDown", this.entityData.get(COOL_DOWN)); - compound.putInt("Type", this.entityData.get(TYPE)); compound.putFloat("Health", this.entityData.get(HEALTH)); } @Override public void readAdditionalSaveData(CompoundTag compound) { this.entityData.set(COOL_DOWN, compound.getInt("CoolDown")); - this.entityData.set(TYPE, compound.getInt("Type")); if (compound.contains("Health")) { this.entityData.set(HEALTH, compound.getFloat("Health")); } else { @@ -194,14 +191,6 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity { this.entityData.set(COOL_DOWN, this.entityData.get(COOL_DOWN) - 1); } - if (this.entityData.get(COOL_DOWN) > 28) { - if (Math.random() < 0.5) { - this.entityData.set(TYPE, -1); - } else { - this.entityData.set(TYPE, 1); - } - } - this.move(MoverType.SELF, this.getDeltaMovement()); if (this.onGround()) { this.setDeltaMovement(Vec3.ZERO); @@ -363,33 +352,46 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity { if (!(passenger instanceof LivingEntity entity)) return; - float diffY = entity.getYHeadRot() - this.getYRot(); + float passengerY = entity.getYHeadRot(); + + if (passengerY > 180.0f) { + passengerY -= 360.0f; + } else if (passengerY < -180.0f) { + passengerY += 360.0f; + } + + float diffY = passengerY - this.getYRot(); float diffX = entity.getXRot() - 1.3f - this.getXRot(); if (diffY > 180.0f) { diffY -= 360.0f; } else if (diffY < -180.0f) { diffY += 360.0f; } - diffY = diffY * 0.15f; + diffY = Mth.clamp(diffY * 0.15f, -1.75f, 1.75f); diffX = diffX * 0.15f; - this.setYRot(this.getYRot() + Mth.clamp(diffY, -1.75f, 1.75f)); + this.setYRot(this.getYRot() + diffY); + + if (passenger instanceof Player player) { + player.displayClientMessage(Component.literal("Angle:" + new java.text.DecimalFormat("##.##").format(this.getYRot()) + " diffY:" + new java.text.DecimalFormat("##.#").format(diffY)), true); + } this.setXRot(Mth.clamp(this.getXRot() + Mth.clamp(diffX, -3f, 3f), -85, 16.3f)); this.setRot(this.getYRot(), this.getXRot()); } protected void clampRotation(Entity entity) { - ItemStack stack = ItemStack.EMPTY; - if (entity instanceof Player player) { - stack = player.getMainHandItem(); - } - if (!stack.is(ModTags.Items.GUN)) { - float f = Mth.wrapDegrees(entity.getXRot()); - float f1 = Mth.clamp(f, -85.0F, 16.3F); - entity.xRotO += f1 - f; - entity.setXRot(entity.getXRot() + f1 - f); - } + float f = Mth.wrapDegrees(entity.getXRot()); + float f1 = Mth.clamp(f, -85.0F, 16.3F); + entity.xRotO += f1 - f; + entity.setXRot(entity.getXRot() + f1 - f); + +// entity.setYBodyRot(this.getYRot()); +// float f2 = Mth.wrapDegrees(entity.getYRot() - this.getYRot()); +// float f3 = Mth.clamp(f2, -60.0F, 60.0F); +// entity.yRotO += f3 - f2; +// entity.setYRot(entity.getYRot() + f3 - f2); +// entity.setYHeadRot(entity.getYRot()); } @Override @@ -399,11 +401,7 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity { private PlayState movementPredicate(AnimationState event) { if (this.entityData.get(COOL_DOWN) > 10) { - if (this.entityData.get(TYPE) == 1) { - return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mk42.fire")); - } else { - return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mk42.fire2")); - } + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mk42.fire")); } return event.setAndContinue(RawAnimation.begin().thenLoop("animation.mk42.idle")); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/Mle1934Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/Mle1934Entity.java index 47fed072b..cd508f9f1 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/Mle1934Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/Mle1934Entity.java @@ -437,32 +437,34 @@ public class Mle1934Entity extends Entity implements GeoEntity, ICannonEntity { if (!(passenger instanceof LivingEntity entity)) return; - float diffY = entity.getYHeadRot() - this.getYRot(); + float passengerY = entity.getYHeadRot(); + + if (passengerY > 180.0f) { + passengerY -= 360.0f; + } else if (passengerY < -180.0f) { + passengerY += 360.0f; + } + + float diffY = passengerY - this.getYRot(); float diffX = entity.getXRot() - 1.2f - this.getXRot(); if (diffY > 180.0f) { diffY -= 360.0f; } else if (diffY < -180.0f) { diffY += 360.0f; } - diffY = diffY * 0.15f; + diffY = Mth.clamp(diffY * 0.15f, -1.25f, 1.25f); diffX = diffX * 0.15f; - this.setYRot(this.getYRot() + Mth.clamp(diffY, -1.25f, 1.25f)); + + this.setYRot(this.getYRot() + diffY); this.setXRot(Mth.clamp(this.getXRot() + Mth.clamp(diffX, -2f, 2f), -30, 4)); this.setRot(this.getYRot(), this.getXRot()); } protected void clampRotation(Entity entity) { - ItemStack stack = ItemStack.EMPTY; - if (entity instanceof Player player) { - stack = player.getMainHandItem(); - } - - if (!stack.is(ModTags.Items.GUN)) { - float f = Mth.wrapDegrees(entity.getXRot()); - float f1 = Mth.clamp(f, -30.0F, 4.0F); - entity.xRotO += f1 - f; - entity.setXRot(entity.getXRot() + f1 - f); - } + float f = Mth.wrapDegrees(entity.getXRot()); + float f1 = Mth.clamp(f, -30.0F, 4.0F); + entity.xRotO += f1 - f; + entity.setXRot(entity.getXRot() + f1 - f); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index 090e00188..9775557f0 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -495,6 +495,7 @@ public class ClientEventHandler { Player player = Minecraft.getInstance().player; if (player == null) return; if (!player.getMainHandItem().is(ModTags.Items.GUN)) return; + if (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity) return; float pose; float times = 2 * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 0.8); @@ -1014,6 +1015,11 @@ public class ClientEventHandler { ItemStack stack = player.getMainHandItem(); + if (player.isPassenger() && player.getVehicle() instanceof ICannonEntity && zoom) { + event.setFOV(event.getFOV() / 5); + return; + } + if (stack.is(ModTags.Items.GUN)) { if (!event.usedConfiguredFov()) { return; @@ -1038,10 +1044,6 @@ public class ClientEventHandler { return; } - if (player.isPassenger() && player.getVehicle() instanceof ICannonEntity && zoom && !stack.is(ModTags.Items.GUN)) { - event.setFOV(event.getFOV() / 5); - } - if (stack.is(ModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked")) { droneFovLerp = Mth.lerp(0.1 * Minecraft.getInstance().getDeltaFrameTime(), droneFovLerp, droneFov); diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java index bc0eb0466..94fbb9e6a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java @@ -38,7 +38,7 @@ public class MouseHandlerMixin { ItemStack stack = mc.player.getMainHandItem(); - if (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity && !stack.is(ModTags.Items.GUN)) { + if (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity) { if (ClientEventHandler.zoom) { return 0.15; } else { diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/ZoomMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/ZoomMessage.java index dac874d41..e15fb1bda 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/ZoomMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/ZoomMessage.java @@ -1,11 +1,10 @@ package com.atsuishio.superbwarfare.network.message; -import com.atsuishio.superbwarfare.network.ModVariables; import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.entity.ICannonEntity; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModSounds; -import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.network.ModVariables; import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.game.ClientboundStopSoundPacket; @@ -53,7 +52,7 @@ public class ZoomMessage { capability.syncPlayerVariables(player); }); - if (player.isPassenger() && player.getVehicle() instanceof ICannonEntity && !stack.is(ModTags.Items.GUN)) { + if (player.isPassenger() && player.getVehicle() instanceof ICannonEntity) { SoundTool.playLocalSound(player, ModSounds.CANNON_ZOOM_IN.get(), 2, 1); } } @@ -65,7 +64,7 @@ public class ZoomMessage { capability.syncPlayerVariables(player); }); - if (player.isPassenger() && player.getVehicle() instanceof ICannonEntity && !stack.is(ModTags.Items.GUN)) { + if (player.isPassenger() && player.getVehicle() instanceof ICannonEntity) { SoundTool.playLocalSound(player, ModSounds.CANNON_ZOOM_OUT.get(), 2, 1); } diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java b/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java index 0d9cf5809..d7125a187 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java +++ b/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java @@ -38,4 +38,35 @@ public class TraceTool { } return null; } + + public static Entity cannonFindLookingEntity(Entity player, double entityReach) { + double distance = entityReach * entityReach; + Vec3 eyePos = new Vec3(player.getX(), player.getEyeY() + 1, player.getZ()); + HitResult hitResult = player.pick(entityReach, 1.0f, false); + if (hitResult.getType() != HitResult.Type.MISS) { + distance = hitResult.getLocation().distanceToSqr(eyePos); + double blockReach = 5; + if (distance > blockReach * blockReach) { + Vec3 pos = hitResult.getLocation(); + hitResult = BlockHitResult.miss(pos, Direction.getNearest(eyePos.x, eyePos.y, eyePos.z), BlockPos.containing(pos)); + } + } + Vec3 viewVec = player.getViewVector(1.0F); + Vec3 toVec = eyePos.add(viewVec.x * entityReach, viewVec.y * entityReach, viewVec.z * entityReach); + AABB aabb = player.getBoundingBox().expandTowards(viewVec.scale(entityReach)).inflate(1.0D, 1.0D, 1.0D); + EntityHitResult entityhitresult = ProjectileUtil.getEntityHitResult(player, eyePos, toVec, aabb, p -> !p.isSpectator(), distance); + if (entityhitresult != null) { + Vec3 targetPos = entityhitresult.getLocation(); + double distanceToTarget = eyePos.distanceToSqr(targetPos); + if (distanceToTarget > distance || distanceToTarget > entityReach * entityReach) { + hitResult = BlockHitResult.miss(targetPos, Direction.getNearest(viewVec.x, viewVec.y, viewVec.z), BlockPos.containing(targetPos)); + } else if (distanceToTarget < distance) { + hitResult = entityhitresult; + } + } + if (hitResult.getType() == HitResult.Type.ENTITY) { + return ((EntityHitResult) hitResult).getEntity(); + } + return null; + } }