优化ShootMessage相关调用

This commit is contained in:
Light_Quanta 2025-04-16 20:33:40 +08:00
parent e8fe60b719
commit 229a1050ce
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
5 changed files with 55 additions and 29 deletions

View file

@ -489,6 +489,12 @@ public abstract class GunItem extends Item implements CustomRendererItem {
public void addReloadTimeBehavior(Map<Integer, Consumer<GunData>> behaviors) {
}
/**
* 添加服务端在开火时的额外行为
*/
public void onShoot(GunData data, Player player) {
}
@SubscribeEvent
private static void registerGunExtensions(RegisterClientExtensionsEvent event) {
for (var item : ModItems.GUNS.getEntries()) {

View file

@ -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<Integer, Consumer<GunData>> behaviors) {
super.addReloadTimeBehavior(behaviors);

View file

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

View file

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

View file

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