From 229a1050ce367f777c87e80ddc8bd8d46215c725 Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Wed, 16 Apr 2025 20:33:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96ShootMessage=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../superbwarfare/item/gun/GunItem.java | 6 +++ .../item/gun/machinegun/M60Item.java | 10 +++++ .../item/gun/shotgun/HomemadeShotgunItem.java | 18 +++++++++ .../item/gun/sniper/SentinelItem.java | 11 ++++++ .../network/message/send/ShootMessage.java | 39 +++++-------------- 5 files changed, 55 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java index cd142e6cf..670420c5b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java @@ -489,6 +489,12 @@ public abstract class GunItem extends Item implements CustomRendererItem { public void addReloadTimeBehavior(Map> behaviors) { } + /** + * 添加服务端在开火时的额外行为 + */ + public void onShoot(GunData data, Player player) { + } + @SubscribeEvent private static void registerGunExtensions(RegisterClientExtensionsEvent event) { for (var item : ModItems.GUNS.getEntries()) { diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java index 96894aeaf..a2bfbaccd 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java @@ -14,6 +14,7 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; @@ -160,6 +161,15 @@ public class M60Item extends GunItem implements GeoItem { return FireMode.AUTO.flag; } + @Override + public void onShoot(GunData data, Player player) { + super.onShoot(data, player); + + if (data.ammo.get() <= 5) { + data.hideBulletChain.set(true); + } + } + @Override public void addReloadTimeBehavior(Map> behaviors) { super.addReloadTimeBehavior(behaviors); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java index fa60bc25f..7658856da 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java @@ -9,10 +9,15 @@ import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; +import com.atsuishio.superbwarfare.tools.ParticleTool; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; @@ -118,6 +123,19 @@ public class HomemadeShotgunItem extends GunItem implements GeoItem { return true; } + @Override + public void onShoot(GunData data, Player player) { + super.onShoot(data, player); + + var stack = data.stack(); + stack.hurtAndBreak(1, (ServerLevel) player.level(), player, p -> { + }); + if (player instanceof ServerPlayer serverPlayer && player.level() instanceof ServerLevel serverLevel) { + ParticleTool.sendParticle(serverLevel, ParticleTypes.CLOUD, player.getX() + 1.8 * player.getLookAngle().x, player.getY() + player.getBbHeight() - 0.1 + 1.8 * player.getLookAngle().y, + player.getZ() + 1.8 * player.getLookAngle().z, 30, 0.4, 0.4, 0.4, 0.005, true, serverPlayer); + } + } + @Override public int getAvailableFireModes() { return FireMode.SEMI.flag; diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java index 3280b5e4e..c7b66991a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java @@ -15,6 +15,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; @@ -189,6 +190,16 @@ public class SentinelItem extends GunItem implements GeoItem, EnergyStorageItem return FireMode.SEMI.flag; } + @Override + public void onShoot(GunData data, Player player) { + super.onShoot(data, player); + + var cap = data.stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (cap != null) { + cap.extractEnergy(3000, false); + } + } + @Override public int getMaxEnergy() { return 24000; diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/send/ShootMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/send/ShootMessage.java index 576748a7f..62ff63c51 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/send/ShootMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/send/ShootMessage.java @@ -2,24 +2,23 @@ package com.atsuishio.superbwarfare.network.message.send; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.event.GunEventHandler; -import com.atsuishio.superbwarfare.init.*; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.tools.InventoryTool; -import com.atsuishio.superbwarfare.tools.ParticleTool; import com.atsuishio.superbwarfare.tools.SoundTool; import io.netty.buffer.ByteBuf; -import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.network.handling.IPayloadContext; import org.jetbrains.annotations.NotNull; @@ -54,38 +53,23 @@ public record ShootMessage(double spread, boolean zoom) implements CustomPacketP data.holdOpen.set(true); } + // TODO 替换左轮判断方式 if (stack.is(ModTags.Items.REVOLVER)) { data.canImmediatelyShoot.set(true); } + // TODO 替换左轮判断方式 // 判断是否为栓动武器(BoltActionTime > 0),并在开火后给一个需要上膛的状态 if (data.defaultActionTime() > 0 && data.ammo.get() > (stack.is(ModTags.Items.REVOLVER) ? 0 : 1)) { data.bolt.needed.set(true); } + // 调用事件 + data.item.onShoot(data, player); + data.ammo.set(data.ammo.get() - 1); data.isEmpty.set(true); - if (stack.getItem() == ModItems.M_60.get() && data.ammo.get() <= 5) { - data.hideBulletChain.set(true); - } - - if (stack.getItem() == ModItems.HOMEMADE_SHOTGUN.get()) { - stack.hurtAndBreak(1, (ServerLevel) player.level(), player, p -> { - }); - if (player instanceof ServerPlayer serverPlayer && player.level() instanceof ServerLevel serverLevel) { - ParticleTool.sendParticle(serverLevel, ParticleTypes.CLOUD, player.getX() + 1.8 * player.getLookAngle().x, player.getY() + player.getBbHeight() - 0.1 + 1.8 * player.getLookAngle().y, - player.getZ() + 1.8 * player.getLookAngle().z, 30, 0.4, 0.4, 0.4, 0.005, true, serverPlayer); - } - } - - if (stack.getItem() == ModItems.SENTINEL.get()) { - var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM); - if (cap != null) { - cap.extractEnergy(3000, false); - } - } - var perk = data.perk.get(Perk.Type.AMMO); for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) { @@ -95,9 +79,8 @@ public record ShootMessage(double spread, boolean zoom) implements CustomPacketP GunEventHandler.playGunSounds(player, zoom); } } else if (stack.is(ModItems.MINIGUN.get())) { - var cap = player.getData(ModAttachments.PLAYER_VARIABLE).watch(); - if (data.hasAmmo(player)) { + // TODO 替换为通用过热处理 tag.putDouble("heat", (tag.getDouble("heat") + 0.1)); if (tag.getDouble("heat") >= 50.5) { tag.putDouble("overheat", 40); @@ -125,8 +108,6 @@ public record ShootMessage(double spread, boolean zoom) implements CustomPacketP GunEventHandler.gunShoot(player, data, spared, false); if (!InventoryTool.hasCreativeAmmoBox(player)) { data.consumeAmmo(player, 1); - player.setData(ModAttachments.PLAYER_VARIABLE, cap); - cap.sync(player); } } }