修复标枪发射问题

This commit is contained in:
Light_Quanta 2025-04-05 05:36:35 +08:00
parent 10a807adf2
commit 1153af4061
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
8 changed files with 31 additions and 43 deletions

View file

@ -1,6 +1,5 @@
package com.atsuishio.superbwarfare.item.gun; package com.atsuishio.superbwarfare.item.gun;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
@ -16,7 +15,7 @@ public interface SpecialFireWeapon {
* @param player 玩家 * @param player 玩家
*/ */
default void fireOnPress(Player player, final CompoundTag tag) { default void fireOnPress(Player player, final GunData data) {
} }
/** /**
@ -24,7 +23,7 @@ public interface SpecialFireWeapon {
* *
* @param player 玩家 * @param player 玩家
*/ */
default void fireOnRelease(Player player, final CompoundTag tag) { default void fireOnRelease(Player player, final GunData data) {
} }
} }

View file

@ -293,8 +293,9 @@ public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon {
} }
@Override @Override
public void fireOnRelease(Player player, final CompoundTag tag) { public void fireOnRelease(Player player, final GunData data) {
fire(player); fire(player);
var tag = data.getTag();
tag.putBoolean("Seeking", false); tag.putBoolean("Seeking", false);
tag.putInt("SeekTime", 0); tag.putInt("SeekTime", 0);
tag.putString("TargetEntity", "none"); tag.putString("TargetEntity", "none");
@ -305,10 +306,8 @@ public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon {
} }
@Override @Override
public void fireOnPress(Player player, CompoundTag tag) { public void fireOnPress(Player player, final GunData data) {
var stack = player.getMainHandItem(); var tag = data.getTag();
var data = GunData.from(stack);
tag = data.getTag();
var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE);
if (cap != null && !cap.zoom || data.getAmmo() <= 0) return; if (cap != null && !cap.zoom || data.getAmmo() <= 0) return;

View file

@ -23,7 +23,6 @@ import com.atsuishio.superbwarfare.tools.SoundTool;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.LocalPlayer;
import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
@ -171,12 +170,12 @@ public class M79Item extends GunItem implements GeoItem, SpecialFireWeapon {
} }
@Override @Override
public void fireOnPress(Player player, final CompoundTag tag) { public void fireOnPress(Player player, final GunData data) {
ItemStack stack = player.getMainHandItem();
var data = GunData.from(stack);
if (data.isReloading()) return; if (data.isReloading()) return;
ItemStack stack = data.getStack();
if (player.getCooldowns().isOnCooldown(stack.getItem()) || data.getAmmo() <= 0) return; if (player.getCooldowns().isOnCooldown(stack.getItem()) || data.getAmmo() <= 0) return;
var tag = data.getTag();
var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE);
boolean zooming = cap != null && cap.zoom; boolean zooming = cap != null && cap.zoom;
double spread = data.spread(); double spread = data.spread();
@ -226,6 +225,5 @@ public class M79Item extends GunItem implements GeoItem, SpecialFireWeapon {
player.getCooldowns().addCooldown(stack.getItem(), 2); player.getCooldowns().addCooldown(stack.getItem(), 2);
data.setAmmo(data.getAmmo() - 1); data.setAmmo(data.getAmmo() - 1);
data.save();
} }
} }

View file

@ -23,7 +23,6 @@ import com.atsuishio.superbwarfare.tools.SoundTool;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.LocalPlayer;
import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
@ -181,11 +180,10 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon {
} }
@Override @Override
public void fireOnPress(Player player, CompoundTag tag) { public void fireOnPress(Player player, final GunData data) {
Level level = player.level(); Level level = player.level();
ItemStack stack = player.getMainHandItem(); ItemStack stack = player.getMainHandItem();
var data = GunData.from(stack); var tag = data.getTag();
tag = data.getTag();
if (data.isReloading() if (data.isReloading()
|| player.getCooldowns().isOnCooldown(stack.getItem()) || player.getCooldowns().isOnCooldown(stack.getItem())
@ -249,6 +247,5 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon {
player.getCooldowns().addCooldown(stack.getItem(), 10); player.getCooldowns().addCooldown(stack.getItem(), 10);
data.setAmmo(data.getAmmo() - 1); data.setAmmo(data.getAmmo() - 1);
data.save();
} }
} }

View file

@ -21,7 +21,6 @@ import com.atsuishio.superbwarfare.tools.SoundTool;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.LocalPlayer;
import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
@ -270,12 +269,12 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW
} }
@Override @Override
public void fireOnPress(Player player, final CompoundTag tag) { public void fireOnPress(Player player, final GunData data) {
ItemStack stack = player.getMainHandItem();
var data = GunData.from(stack);
if (data.isReloading()) return; if (data.isReloading()) return;
ItemStack stack = data.getStack();
if (player.getCooldowns().isOnCooldown(stack.getItem()) || data.getAmmo() <= 0) return; if (player.getCooldowns().isOnCooldown(stack.getItem()) || data.getAmmo() <= 0) return;
var tag = data.getTag();
var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE);
boolean zooming = cap != null && cap.zoom; boolean zooming = cap != null && cap.zoom;
double spread = data.spread(); double spread = data.spread();
@ -343,7 +342,6 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW
} }
data.setAmmo(data.getAmmo() - 1); data.setAmmo(data.getAmmo() - 1);
data.save();
player.getCooldowns().addCooldown(stack.getItem(), 6); player.getCooldowns().addCooldown(stack.getItem(), 6);
} }

View file

@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModPerks;
import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.init.ModTags;
import com.atsuishio.superbwarfare.item.gun.GunData;
import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon;
import com.atsuishio.superbwarfare.network.message.receive.ShootClientMessage; import com.atsuishio.superbwarfare.network.message.receive.ShootClientMessage;
@ -21,7 +22,6 @@ import com.atsuishio.superbwarfare.tools.NBTTool;
import com.atsuishio.superbwarfare.tools.SoundTool; import com.atsuishio.superbwarfare.tools.SoundTool;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.LocalPlayer;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
@ -169,10 +169,11 @@ public class BocekItem extends GunItem implements GeoItem, SpecialFireWeapon {
} }
@Override @Override
public void fireOnRelease(Player player, final CompoundTag tag) { public void fireOnRelease(Player player, final GunData data) {
if (player.level().isClientSide()) return; if (player.level().isClientSide()) return;
ItemStack stack = player.getMainHandItem(); var tag = data.getTag();
var stack = data.getStack();
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO); var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
if (player instanceof ServerPlayer serverPlayer) { if (player instanceof ServerPlayer serverPlayer) {
@ -209,7 +210,6 @@ public class BocekItem extends GunItem implements GeoItem, SpecialFireWeapon {
player.getCooldowns().addCooldown(stack.getItem(), 7); player.getCooldowns().addCooldown(stack.getItem(), 7);
GunsTool.setGunIntTag(tag, "ArrowEmpty", 7); GunsTool.setGunIntTag(tag, "ArrowEmpty", 7);
GunsTool.setGunDoubleTag(tag, "Power", 0); GunsTool.setGunDoubleTag(tag, "Power", 0);
NBTTool.saveTag(stack, tag);
if (!InventoryTool.hasCreativeAmmoBox(player) && !player.isCreative()) { if (!InventoryTool.hasCreativeAmmoBox(player) && !player.isCreative()) {
player.getInventory().clearOrCountMatchingItems(p -> Items.ARROW == p.getItem(), 1, player.inventoryMenu.getCraftSlots()); player.getInventory().clearOrCountMatchingItems(p -> Items.ARROW == p.getItem(), 1, player.inventoryMenu.getCraftSlots());
@ -218,7 +218,7 @@ public class BocekItem extends GunItem implements GeoItem, SpecialFireWeapon {
} }
@Override @Override
public void fireOnPress(Player player, final CompoundTag tag) { public void fireOnPress(Player player, final GunData data) {
var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE);
if (cap != null) { if (cap != null) {
cap.bowPullHold = true; cap.bowPullHold = true;

View file

@ -22,7 +22,6 @@ import com.atsuishio.superbwarfare.tools.NBTTool;
import com.atsuishio.superbwarfare.tools.SoundTool; import com.atsuishio.superbwarfare.tools.SoundTool;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.LocalPlayer;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvent;
@ -224,10 +223,10 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon, En
} }
@Override @Override
public void fireOnPress(Player player, final CompoundTag tag) { public void fireOnPress(Player player, final GunData data) {
ItemStack stack = player.getMainHandItem();
var data = GunData.from(stack);
if (data.isReloading()) return; if (data.isReloading()) return;
ItemStack stack = data.getStack();
var tag = data.getTag();
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.VOLT_OVERLOAD.get(), tag); int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.VOLT_OVERLOAD.get(), tag);
var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM);
@ -266,7 +265,6 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon, En
data.setAmmo(data.getAmmo() - 1); data.setAmmo(data.getAmmo() - 1);
data.getTag().putBoolean("shoot", true); data.getTag().putBoolean("shoot", true);
data.save();
energyStorage.extractEnergy(400 + 100 * perkLevel, false); energyStorage.extractEnergy(400 + 100 * perkLevel, false);
} }

View file

@ -46,15 +46,15 @@ public record FireMessage(int msgType) implements CustomPacketPayload {
if (player.isSpectator()) return; if (player.isSpectator()) return;
ItemStack stack = player.getMainHandItem(); ItemStack stack = player.getMainHandItem();
if (!stack.is(ModTags.Items.GUN)) return; if (!stack.is(ModTags.Items.GUN)) return;
final var tag = NBTTool.getTag(stack); var data = GunData.from(stack);
final var tag = data.getTag();
handleGunBolt(player, stack, tag); handleGunBolt(player, stack);
var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE);
if (type == 0) { if (type == 0) {
var data = GunData.from(stack);
if (tag.getDouble("prepare") == 0 && data.isReloading() && data.getAmmo() > 0) { if (tag.getDouble("prepare") == 0 && data.isReloading() && data.getAmmo() > 0) {
NBTTool.saveTag(stack, tag); tag.putDouble("force_stop", 1);
} }
if (cap != null) { if (cap != null) {
@ -66,7 +66,7 @@ public record FireMessage(int msgType) implements CustomPacketPayload {
if (cap != null) cap.syncPlayerVariables(player); if (cap != null) cap.syncPlayerVariables(player);
return; return;
} }
specialFireWeapon.fireOnPress(player, tag); specialFireWeapon.fireOnPress(player, data);
if (cap != null) { if (cap != null) {
cap.holdFire = true; cap.holdFire = true;
@ -81,17 +81,16 @@ public record FireMessage(int msgType) implements CustomPacketPayload {
// 松开开火 // 松开开火
if (stack.getItem() instanceof SpecialFireWeapon specialFireWeapon) { if (stack.getItem() instanceof SpecialFireWeapon specialFireWeapon) {
specialFireWeapon.fireOnRelease(player, tag); specialFireWeapon.fireOnRelease(player, data);
} }
} }
data.save();
NBTTool.saveTag(stack, tag);
} }
private static void handleGunBolt(Player player, ItemStack stack, CompoundTag tag) { private static void handleGunBolt(Player player, ItemStack stack) {
if (!stack.is(ModTags.Items.GUN)) return; if (!stack.is(ModTags.Items.GUN)) return;
var data = GunData.from(stack); var data = GunData.from(stack);
tag = data.getTag(); CompoundTag tag = data.getTag();
if (data.boltActionTime() > 0 if (data.boltActionTime() > 0
&& data.getAmmo() > (stack.is(ModTags.Items.REVOLVER) ? -1 : 0) && data.getAmmo() > (stack.is(ModTags.Items.REVOLVER) ? -1 : 0)