From bb82b004d1ec3bbf65d53e3e4c65bdd091ccdb5d Mon Sep 17 00:00:00 2001 From: Atsuihsio <842960157@qq.com> Date: Fri, 20 Dec 2024 12:22:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E8=BD=BD=E5=85=B7=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=AD=A6=E5=99=A8=E5=B0=84=E9=80=9F=E9=80=BB=E8=BE=91=E7=A7=BB?= =?UTF-8?q?=E5=88=B0=E5=AE=A2=E6=88=B7=E7=AB=AF=E8=AE=A1=E7=AE=97=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=82=AE=E5=A1=94=E7=9E=84=E5=87=86=E8=A7=86?= =?UTF-8?q?=E8=A7=92hud?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../superbwarfare/client/ClickHandler.java | 13 +- .../model/entity/ProjectileEntityModel.java | 5 +- .../client/screens/VehicleMgHudOverlay.java | 72 +++++++ .../config/server/CannonConfig.java | 2 +- .../entity/AnnihilatorEntity.java | 15 ++ .../superbwarfare/entity/ICannonEntity.java | 3 - .../superbwarfare/entity/IVehicleEntity.java | 7 + .../superbwarfare/entity/Mk42Entity.java | 14 ++ .../superbwarfare/entity/Mle1934Entity.java | 14 ++ .../superbwarfare/entity/SpeedboatEntity.java | 178 +++++++++--------- .../event/ClientEventHandler.java | 71 +++++++ .../mixins/MouseHandlerMixin.java | 6 + .../network/message/VehicleFireMessage.java | 4 +- .../superbwarfare/sounds/m2/m2_fire_1p.ogg | Bin 18682 -> 33684 bytes 14 files changed, 309 insertions(+), 95 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/screens/VehicleMgHudOverlay.java diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java index 211339fc7..edd192157 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java @@ -155,7 +155,7 @@ public class ClickHandler { double scroll = event.getScrollDelta(); - if (stack.is(ModTags.Items.GUN) && player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom) { + if (stack.is(ModTags.Items.GUN) && ClientEventHandler.zoom) { var tag = stack.getOrCreateTag(); if (tag.getBoolean("CanSwitchScope")) { ModUtils.PACKET_HANDLER.sendToServer(new SwitchScopeMessage(scroll)); @@ -165,6 +165,11 @@ public class ClickHandler { event.setCanceled(true); } + if (player.getVehicle() instanceof IVehicleEntity iVehicle && iVehicle.isDriver(player) && ClientEventHandler.zoom) { + ClientEventHandler.vehicleFov = Mth.clamp(ClientEventHandler.vehicleFov + 0.4 * scroll, 1, 6); + event.setCanceled(true); + } + if (stack.is(ModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked")) { ClientEventHandler.droneFov = Mth.clamp(ClientEventHandler.droneFov + 0.4 * scroll, 1, 6); event.setCanceled(true); @@ -293,13 +298,13 @@ public class ClickHandler { ModUtils.PACKET_HANDLER.sendToServer(new DroneFireMessage(0)); } - if (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity) { + if (player.getVehicle() instanceof ICannonEntity) { ModUtils.PACKET_HANDLER.sendToServer(new VehicleFireMessage(0)); return; } - if ((player.getVehicle() != null && player.getVehicle() instanceof SpeedboatEntity boat && boat.getFirstPassenger() == player)) { - ModUtils.PACKET_HANDLER.sendToServer(new FireMessage(0)); + if (player.getVehicle() instanceof IVehicleEntity iVehicle && iVehicle.isDriver(player)) { + ClientEventHandler.holdFire = true; } if (stack.is(ModTags.Items.GUN) && !(player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity)) { diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/entity/ProjectileEntityModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/entity/ProjectileEntityModel.java index 93917605b..9bed90adc 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/entity/ProjectileEntityModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/entity/ProjectileEntityModel.java @@ -1,9 +1,11 @@ package com.atsuishio.superbwarfare.client.model.entity; import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.entity.IVehicleEntity; import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModTags; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; @@ -27,7 +29,8 @@ public class ProjectileEntityModel extends GeoModel { if ((ClientEventHandler.zoom && !player.getMainHandItem().is(ModItems.MINIGUN.get())) || player.getMainHandItem().is(ModItems.GLOCK_17.get()) || player.getMainHandItem().is(ModItems.GLOCK_18.get()) - || player.getMainHandItem().is(ModItems.BOCEK.get())) { + || player.getMainHandItem().is(ModItems.BOCEK.get()) + || (player.getVehicle() instanceof IVehicleEntity iVehicle && iVehicle.isDriver(player) && !player.getMainHandItem().is(ModTags.Items.GUN))) { return new ResourceLocation(ModUtils.MODID, "geo/projectile_entity.geo.json"); } else { return new ResourceLocation(ModUtils.MODID, "geo/projectile_entity2.geo.json"); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/screens/VehicleMgHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/screens/VehicleMgHudOverlay.java new file mode 100644 index 000000000..a47d0802c --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/screens/VehicleMgHudOverlay.java @@ -0,0 +1,72 @@ +package com.atsuishio.superbwarfare.client.screens; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.RenderHelper; +import com.atsuishio.superbwarfare.entity.SpeedboatEntity; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderGuiEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.text.DecimalFormat; + +import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit; + +@Mod.EventBusSubscriber(value = Dist.CLIENT) +public class VehicleMgHudOverlay { + public static float indicatorPosH = 0; + + @SubscribeEvent(priority = EventPriority.NORMAL) + public static void eventHandler(RenderGuiEvent.Pre event) { + int w = event.getWindow().getGuiScaledWidth(); + int h = event.getWindow().getGuiScaledHeight(); + Player player = Minecraft.getInstance().player; + + if (!shouldRenderCrossHair(player)) return; + + Entity cannon = player.getVehicle(); + if (cannon == null) return; + + RenderSystem.disableDepthTest(); + RenderSystem.depthMask(false); + RenderSystem.enableBlend(); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + RenderSystem.setShaderColor(1, 1, 1, 1); + + float fovAdjust = (float) 70 / Minecraft.getInstance().options.fov().get(); + + float f = (float) Math.min(w, h); + float f1 = Math.min((float) w / f, (float) h / f) * fovAdjust; + int i = Mth.floor(f * f1); + int j = Mth.floor(f * f1); + int k = (w - i) / 2; + int l = (h - j) / 2; + RenderHelper.preciseBlit(event.getGuiGraphics(), ModUtils.loc("textures/screens/cannon/cannon_crosshair_notzoom.png"), k, l, 0, 0.0F, i, j, i, j); + + if (ClientEventHandler.vehicleFovLerp > 1.01) { + event.getGuiGraphics().blit(ModUtils.loc("textures/screens/drone_fov.png"), w / 2 + 100, h / 2 - 64, 0, 0, 64, 129, 64, 129); + GuiGraphics guiGraphics = event.getGuiGraphics(); + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/drone_fov_move.png"), (float) w / 2 + 100, (float) (h / 2 - 64 - ((ClientEventHandler.vehicleFovLerp - 1) * 23.8)), 0, 0, 64, 129, 64, 129); + event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.literal(new DecimalFormat("##.#").format(ClientEventHandler.vehicleFovLerp) + "x"), + w / 2 + 144, h / 2 + 56 - (int) ((ClientEventHandler.vehicleFovLerp - 1) * 23.8), -1, false); + } + } + + private static boolean shouldRenderCrossHair(Player player) { + if (player == null) return false; + return !player.isSpectator() + && player.getVehicle() instanceof SpeedboatEntity && ClientEventHandler.zoom; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/config/server/CannonConfig.java b/src/main/java/com/atsuishio/superbwarfare/config/server/CannonConfig.java index b175a286a..16333f3ca 100644 --- a/src/main/java/com/atsuishio/superbwarfare/config/server/CannonConfig.java +++ b/src/main/java/com/atsuishio/superbwarfare/config/server/CannonConfig.java @@ -105,7 +105,7 @@ public class CannonConfig { SPEEDBOAT_MAX_ENERGY = builder.defineInRange("speedboat_max_energy", 100000d, 0d, Double.POSITIVE_INFINITY); builder.comment("The gun damage of Speedboat"); - SPEEDBOAT_GUN_DAMAGE = builder.defineInRange("speedboat_gun_damage", 25, 1, 10000000); + SPEEDBOAT_GUN_DAMAGE = builder.defineInRange("speedboat_gun_damage", 45, 1, 10000000); builder.pop(); } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/AnnihilatorEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/AnnihilatorEntity.java index e74f72e9b..b3c90d0af 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/AnnihilatorEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/AnnihilatorEntity.java @@ -550,4 +550,19 @@ public class AnnihilatorEntity extends Entity implements GeoEntity, ICannonEntit public float getMaxHealth() { return (int)MAX_HEALTH; } + + @Override + public boolean isDriver(Player player) { + return false; + } + + @Override + public int mainGunRpm() { + return 0; + } + + @Override + public boolean canShoot(Player player) { + return true; + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/ICannonEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/ICannonEntity.java index bcbf5772a..ac513e654 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/ICannonEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/ICannonEntity.java @@ -1,9 +1,6 @@ package com.atsuishio.superbwarfare.entity; -import net.minecraft.world.entity.player.Player; - public interface ICannonEntity extends IVehicleEntity { - void cannonShoot(Player player); float getHealth(); float getMaxHealth(); } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/IVehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/IVehicleEntity.java index adb570855..a8b6e8132 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/IVehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/IVehicleEntity.java @@ -1,5 +1,12 @@ package com.atsuishio.superbwarfare.entity; + +import net.minecraft.world.entity.player.Player; + public interface IVehicleEntity { + void cannonShoot(Player player); float getHealth(); float getMaxHealth(); + boolean isDriver(Player player); + int mainGunRpm(); + boolean canShoot(Player player); } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/Mk42Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/Mk42Entity.java index 0b813de9c..370aec7cc 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/Mk42Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/Mk42Entity.java @@ -431,4 +431,18 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity { return (int)MAX_HEALTH; } + @Override + public boolean isDriver(Player player) { + return false; + } + + @Override + public int mainGunRpm() { + return 0; + } + + @Override + public boolean canShoot(Player player) { + return true; + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/Mle1934Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/Mle1934Entity.java index a5ce97c2c..d0559d153 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/Mle1934Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/Mle1934Entity.java @@ -526,4 +526,18 @@ public class Mle1934Entity extends Entity implements GeoEntity, ICannonEntity { return (int)MAX_HEALTH; } + @Override + public boolean isDriver(Player player) { + return false; + } + + @Override + public int mainGunRpm() { + return 0; + } + + @Override + public boolean canShoot(Player player) { + return true; + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java index 6bff33663..d653fbbfd 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java @@ -85,13 +85,13 @@ import java.util.List; public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity, IVehicleEntity, HasCustomInventoryScreen, ContainerEntity { + public static final EntityDataAccessor FIRE_ANIM = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.INT); public static final EntityDataAccessor HEALTH = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor ENERGY = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor ROT_Y = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor DELTA_ROT = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor POWER = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor ROTOR = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT); - public static final EntityDataAccessor COOL_DOWN = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.INT); public static final EntityDataAccessor HEAT = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.INT); protected static final EntityDataAccessor LAST_ATTACKER_UUID = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.STRING); @@ -127,13 +127,13 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity, @Override protected void defineSynchedData() { + this.entityData.define(FIRE_ANIM, 0); this.entityData.define(HEALTH, MAX_HEALTH); this.entityData.define(ENERGY, 0f); this.entityData.define(ROT_Y, 0f); this.entityData.define(DELTA_ROT, 0f); this.entityData.define(POWER, 0f); this.entityData.define(ROTOR, 0f); - this.entityData.define(COOL_DOWN, 0); this.entityData.define(HEAT, 0); this.entityData.define(LAST_ATTACKER_UUID, "undefined"); } @@ -297,14 +297,14 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity, public void baseTick() { super.baseTick(); - if (this.entityData.get(COOL_DOWN) > 0) { - this.entityData.set(COOL_DOWN, this.entityData.get(COOL_DOWN) - 1); - } - if (this.entityData.get(HEAT) > 0) { this.entityData.set(HEAT, this.entityData.get(HEAT) - 1); } + if (this.entityData.get(FIRE_ANIM) > 0) { + this.entityData.set(FIRE_ANIM, this.entityData.get(FIRE_ANIM) - 1); + } + if (this.entityData.get(HEAT) < 40) { cannotFire = false; } @@ -355,7 +355,6 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity, collideBlock(); gunnerAngle(); - gunnerFire(); pickUpItem(); this.refreshDimensions(); @@ -373,89 +372,82 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity, /** * 机枪塔开火 */ - private void gunnerFire() { - if (this.entityData.get(COOL_DOWN) != 0 || this.cannotFire) return; - Entity driver = this.getFirstPassenger(); - if (driver == null) return; + @Override + public void cannonShoot(Player player) { + if (this.cannotFire) return; - if (driver instanceof Player player && !(player.getMainHandItem().is(ModTags.Items.GUN))) { - if (this.getItemStacks().stream().noneMatch(stack -> stack.is(ModItems.HEAVY_AMMO.get())) && !player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get()))) - return; - if (player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).holdFire) { + ProjectileEntity projectile = new ProjectileEntity(player.level()) + .shooter(player) + .damage(CannonConfig.SPEEDBOAT_GUN_DAMAGE.get()) + .headShot(2f) + .zoom(false); - ProjectileEntity projectile = new ProjectileEntity(driver.level()) - .shooter(player) - .damage(CannonConfig.SPEEDBOAT_GUN_DAMAGE.get()) - .headShot(2f) - .zoom(false); + if (this.getItemStacks().size() > 102) { + ItemStack perkItem = this.getItemStacks().get(102); + if (perkItem.getItem() instanceof PerkItem perk) { + if (perk.getPerk() == ModPerks.SILVER_BULLET.get()) { + projectile.undeadMultiple(2.5f); + } else if (perk.getPerk() == ModPerks.BEAST_BULLET.get()) { + projectile.beast(); + } else if (perk.getPerk() == ModPerks.JHP_BULLET.get()) { + projectile.jhpBullet(true, 3); + } else if (perk.getPerk() == ModPerks.HE_BULLET.get()) { + projectile.heBullet(true, 3); + } else if (perk.getPerk() == ModPerks.INCENDIARY_BULLET.get()) { + projectile.fireBullet(true, 3, false); + } - projectile.bypassArmorRate(0.9f); - projectile.setPos(this.xo - this.getViewVector(1).scale(0.54).x - this.getDeltaMovement().x, this.yo + 3.0, this.zo - this.getViewVector(1).scale(0.54).z - this.getDeltaMovement().z); - projectile.shoot(player, player.getLookAngle().x, player.getLookAngle().y + (zooming() ? 0.002f : -0.009f), player.getLookAngle().z, 20, - (float) 0.4); - this.level().addFreshEntity(projectile); - - if (this.getItemStacks().size() > 102) { - ItemStack perkItem = this.getItemStacks().get(102); - if (perkItem.getItem() instanceof PerkItem perk) { - if (perk.getPerk() == ModPerks.SILVER_BULLET.get()) { - projectile.undeadMultiple(2.5f); - } else if (perk.getPerk() == ModPerks.BEAST_BULLET.get()) { - projectile.beast(); - } else if (perk.getPerk() == ModPerks.JHP_BULLET.get()) { - projectile.jhpBullet(true, 3); - } else if (perk.getPerk() == ModPerks.HE_BULLET.get()) { - projectile.heBullet(true, 3); - } else if (perk.getPerk() == ModPerks.INCENDIARY_BULLET.get()) { - projectile.fireBullet(true, 3, false); - } - - if (perk.getPerk() instanceof AmmoPerk ammoPerk) { - projectile.setRGB(ammoPerk.rgb); - if (!ammoPerk.mobEffects.get().isEmpty()) { - ArrayList mobEffectInstances = new ArrayList<>(); - for (MobEffect effect : ammoPerk.mobEffects.get()) { - mobEffectInstances.add(new MobEffectInstance(effect, 160, 2)); - } - projectile.effect(mobEffectInstances); - } + if (perk.getPerk() instanceof AmmoPerk ammoPerk) { + projectile.setRGB(ammoPerk.rgb); + if (!ammoPerk.mobEffects.get().isEmpty()) { + ArrayList mobEffectInstances = new ArrayList<>(); + for (MobEffect effect : ammoPerk.mobEffects.get()) { + mobEffectInstances.add(new MobEffectInstance(effect, 160, 2)); } + projectile.effect(mobEffectInstances); } } - - if (this.getItemStacks().size() > 104) { - ItemStack perkItem = this.getItemStacks().get(104); - if (perkItem.getItem() instanceof PerkItem perk) { - if (perk.getPerk() == ModPerks.MONSTER_HUNTER.get()) { - projectile.monsterMultiple(0.5f); - } - } - } - - float pitch = this.entityData.get(HEAT) <= 60 ? 1 : (float) (1 - 0.011 * java.lang.Math.abs(60 - this.entityData.get(HEAT))); - - if (player instanceof ServerPlayer serverPlayer) { - SoundTool.playLocalSound(serverPlayer, ModSounds.M_2_FIRE_1P.get(), 2, 1); - serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.M_2_FIRE_3P.get(), SoundSource.PLAYERS, 4, pitch); - serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.M_2_FAR.get(), SoundSource.PLAYERS, 12, pitch); - serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.M_2_VERYFAR.get(), SoundSource.PLAYERS, 24, pitch); - } - - Level level = player.level(); - final Vec3 center = new Vec3(this.getX(), this.getEyeY(), this.getZ()); - - for (Entity target : level.getEntitiesOfClass(Entity.class, new AABB(center, center).inflate(4), e -> true).stream().sorted(Comparator.comparingDouble(e -> e.distanceToSqr(center))).toList()) { - if (target instanceof ServerPlayer serverPlayer) { - ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ShakeClientMessage(6, 5, 5, this.getX(), this.getEyeY(), this.getZ())); - } - } - if (level instanceof ServerLevel) { - this.entityData.set(COOL_DOWN, 3); - this.entityData.set(HEAT, this.entityData.get(HEAT) + 4); - } - this.getItemStacks().stream().filter(stack -> stack.is(ModItems.HEAVY_AMMO.get())).findFirst().ifPresent(stack -> stack.shrink(1)); } } + + if (this.getItemStacks().size() > 104) { + ItemStack perkItem = this.getItemStacks().get(104); + if (perkItem.getItem() instanceof PerkItem perk) { + if (perk.getPerk() == ModPerks.MONSTER_HUNTER.get()) { + projectile.monsterMultiple(0.5f); + } + } + } + + projectile.bypassArmorRate(0.9f); + projectile.setPos(this.xo - this.getViewVector(1).scale(0.54).x - this.getDeltaMovement().x, this.yo + 3.0, this.zo - this.getViewVector(1).scale(0.54).z - this.getDeltaMovement().z); + projectile.shoot(player, player.getLookAngle().x, player.getLookAngle().y + (zooming() ? 0.002f : -0.009f), player.getLookAngle().z, 20, + (float) 0.4); + this.level().addFreshEntity(projectile); + + float pitch = this.entityData.get(HEAT) <= 60 ? 1 : (float) (1 - 0.011 * java.lang.Math.abs(60 - this.entityData.get(HEAT))); + + if (!player.level().isClientSide) { + if (player instanceof ServerPlayer serverPlayer) { + serverPlayer.playSound(ModSounds.M_2_FIRE_3P.get(), 4, pitch); + serverPlayer.playSound(ModSounds.M_2_FAR.get(), 12, pitch); + serverPlayer.playSound(ModSounds.M_2_VERYFAR.get(), 24, pitch); + } + } + + + Level level = player.level(); + final Vec3 center = new Vec3(this.getX(), this.getEyeY(), this.getZ()); + + for (Entity target : level.getEntitiesOfClass(Entity.class, new AABB(center, center).inflate(4), e -> true).stream().sorted(Comparator.comparingDouble(e -> e.distanceToSqr(center))).toList()) { + if (target instanceof ServerPlayer serverPlayer) { + ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ShakeClientMessage(6, 5, 5, this.getX(), this.getEyeY(), this.getZ())); + } + } + + this.entityData.set(HEAT, this.entityData.get(HEAT) + 3); + this.entityData.set(FIRE_ANIM, 3); + this.getItemStacks().stream().filter(stack -> stack.is(ModItems.HEAVY_AMMO.get())).findFirst().ifPresent(stack -> stack.shrink(1)); } /** @@ -543,7 +535,7 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity, level().playLocalSound(this.getX(), this.getY() + this.getBbHeight() * 0.5, this.getZ(), this.getEngineSound(), this.getSoundSource(), Math.min((this.getPersistentData().getBoolean("forward") || this.getPersistentData().getBoolean("backward") ? 7.5f : 5f) * 2 * Mth.abs(this.entityData.get(POWER)), 0.25f), (random.nextFloat() * 0.1f + 1f), false); } - this.entityData.set(POWER, this.entityData.get(POWER) * 0.9f); + this.entityData.set(POWER, this.entityData.get(POWER) * 0.87f); this.entityData.set(ROTOR, this.entityData.get(ROTOR) + this.entityData.get(POWER)); this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) * 0.8f); @@ -724,9 +716,10 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity, } private PlayState firePredicate(AnimationState event) { - if (this.entityData.get(COOL_DOWN) > 1 && !cannotFire) { + if (this.entityData.get(FIRE_ANIM) > 1) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.speedboat.fire")); } + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.speedboat.idle")); } @@ -911,4 +904,21 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity, public float getMaxHealth() { return (int) MAX_HEALTH; } + + @Override + public boolean isDriver(Player player) { + return player == this.getFirstPassenger(); + } + + @Override + public int mainGunRpm() { + return 500; + } + + @Override + public boolean canShoot(Player player) { + return (this.getItemStacks().stream().anyMatch(stack -> stack.is(ModItems.HEAVY_AMMO.get())) || player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get()))) + && !player.getMainHandItem().is(ModTags.Items.GUN) + && !cannotFire; + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index cdaeed8f5..16569483d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -5,11 +5,13 @@ import com.atsuishio.superbwarfare.client.ClickHandler; import com.atsuishio.superbwarfare.config.client.DisplayConfig; import com.atsuishio.superbwarfare.entity.DroneEntity; import com.atsuishio.superbwarfare.entity.ICannonEntity; +import com.atsuishio.superbwarfare.entity.IVehicleEntity; import com.atsuishio.superbwarfare.entity.SpeedboatEntity; import com.atsuishio.superbwarfare.init.*; import com.atsuishio.superbwarfare.network.ModVariables; import com.atsuishio.superbwarfare.network.message.LaserShootMessage; import com.atsuishio.superbwarfare.network.message.ShootMessage; +import com.atsuishio.superbwarfare.network.message.VehicleFireMessage; import com.atsuishio.superbwarfare.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -51,6 +53,8 @@ import software.bernie.geckolib.core.animatable.model.CoreGeoBone; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; +import static com.atsuishio.superbwarfare.entity.SpeedboatEntity.HEAT; + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) public class ClientEventHandler { @@ -110,6 +114,7 @@ public class ClientEventHandler { public static double customZoom = 0; public static MillisTimer clientTimer = new MillisTimer(); + public static MillisTimer clientTimerVehicle = new MillisTimer(); public static boolean holdFire = false; @@ -131,6 +136,8 @@ public class ClientEventHandler { public static double shakeAmplitude = 0; public static double[] shakePos = {0, 0, 0}; public static double shakeType = 0; + public static double vehicleFov = 1; + public static double vehicleFovLerp = 1; @SubscribeEvent public static void handleWeaponTurn(RenderHandEvent event) { @@ -537,6 +544,59 @@ public class ClientEventHandler { }); } + @SubscribeEvent + public static void handleVehicleFire(TickEvent.RenderTickEvent event) { + ClientLevel level = Minecraft.getInstance().level; + Player player = Minecraft.getInstance().player; + if (player == null) return; + if (level == null) return; + + if (player.getVehicle() instanceof IVehicleEntity iVehicle && iVehicle.isDriver(player) && iVehicle.canShoot(player)) { + int rpm = iVehicle.mainGunRpm(); + if (rpm == 0) { + rpm = 240; + } + +// player.displayClientMessage(Component.literal("114 : " + clientTimerVehicle.getProgress()), true); + + double rps = (double) rpm / 60; + + // cooldown in ms + int cooldown = (int) (1000 / rps); + + if ((holdFire)) { + if (!clientTimerVehicle.started()) { + clientTimerVehicle.start(); + // 首发瞬间发射 + clientTimerVehicle.setProgress((cooldown + 1)); + } + if (clientTimerVehicle.getProgress() >= cooldown) { + ModUtils.PACKET_HANDLER.sendToServer(new VehicleFireMessage(0)); + playVehicleClientSounds(player, iVehicle); + clientTimerVehicle.setProgress((clientTimerVehicle.getProgress() - cooldown)); + } + + if (notInGame()) { + clientTimerVehicle.stop(); + } + + } else { + clientTimerVehicle.stop(); + } + + } else { + clientTimerVehicle.stop(); + } + } + + public static void playVehicleClientSounds(Player player, IVehicleEntity iVehicle) { + if (iVehicle instanceof SpeedboatEntity speedboat) { + float pitch = speedboat.getEntityData().get(HEAT) <= 60 ? 1 : (float) (1 - 0.011 * java.lang.Math.abs(60 - speedboat.getEntityData().get(HEAT))); + player.playSound(ModSounds.M_2_FIRE_1P.get(), 1f, pitch); + player.playSound(ModSounds.SHELL_CASING_50CAL.get(),0.3f, 1); + } + } + @SubscribeEvent public static void handleWeaponBreathSway(TickEvent.RenderTickEvent event) { Player player = Minecraft.getInstance().player; @@ -1142,6 +1202,13 @@ public class ClientEventHandler { event.setFOV(event.getFOV() / droneFovLerp); } + + if (player.getVehicle() instanceof IVehicleEntity && !(player.getVehicle() instanceof ICannonEntity) && zoom) { + + vehicleFovLerp = Mth.lerp(0.1 * Minecraft.getInstance().getDeltaFrameTime(), vehicleFovLerp, vehicleFov); + + event.setFOV(event.getFOV() / vehicleFovLerp); + } } @SubscribeEvent @@ -1168,6 +1235,10 @@ public class ClientEventHandler { return; } + if (mc.player.getVehicle() instanceof SpeedboatEntity && zoom) { + event.setCanceled(true); + } + if (mc.player.getMainHandItem().is(ModTags.Items.GUN) || (mc.player.getVehicle() != null && mc.player.getVehicle() instanceof ICannonEntity)) { event.setCanceled(true); } diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java index 94fbb9e6a..76c402aa6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java @@ -1,6 +1,7 @@ package com.atsuishio.superbwarfare.mixins; import com.atsuishio.superbwarfare.entity.ICannonEntity; +import com.atsuishio.superbwarfare.entity.IVehicleEntity; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModMobEffects; @@ -16,6 +17,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; import static com.atsuishio.superbwarfare.event.ClientEventHandler.droneFovLerp; +import static com.atsuishio.superbwarfare.event.ClientEventHandler.vehicleFovLerp; /** * Author: MrCrayfish @@ -50,6 +52,10 @@ public class MouseHandlerMixin { return 0.33 / (1 + 0.08 * (droneFovLerp - 1)); } + if (player.getVehicle() instanceof IVehicleEntity iVehicle && iVehicle.isDriver(player) && ClientEventHandler.zoom) { + return 0.33 / (1 + 0.08 * (vehicleFovLerp - 1)); + } + if (!stack.is(ModTags.Items.GUN)) { return original; } diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/VehicleFireMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/VehicleFireMessage.java index 6c4cfb658..0f2c8edee 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/VehicleFireMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/VehicleFireMessage.java @@ -1,6 +1,6 @@ package com.atsuishio.superbwarfare.network.message; -import com.atsuishio.superbwarfare.entity.ICannonEntity; +import com.atsuishio.superbwarfare.entity.IVehicleEntity; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.level.Level; import net.minecraftforge.network.NetworkEvent; @@ -34,7 +34,7 @@ public class VehicleFireMessage { return; } - if (player.getVehicle() instanceof ICannonEntity entity) { + if (player.getVehicle() instanceof IVehicleEntity entity) { entity.cannonShoot(player); } } diff --git a/src/main/resources/assets/superbwarfare/sounds/m2/m2_fire_1p.ogg b/src/main/resources/assets/superbwarfare/sounds/m2/m2_fire_1p.ogg index 1c8a9f1fe73281f98e3999e3ad9b87f7ff415341..b356d674c7dff3464e27abc961ed42502c0fec2c 100644 GIT binary patch delta 29635 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 Xb9SK(4R(QmV=5I890vGv0M7pdy`~79 delta 14515 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