修复taser开火问题

This commit is contained in:
17146 2025-04-20 21:11:25 +08:00 committed by Light_Quanta
parent 2cd8947733
commit 353b7a1b3b
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
3 changed files with 40 additions and 16 deletions

View file

@ -666,9 +666,10 @@ public class ClientEventHandler {
public static void shootClient(Player player, final CompoundTag tag) { public static void shootClient(Player player, final CompoundTag tag) {
ItemStack stack = player.getMainHandItem(); ItemStack stack = player.getMainHandItem();
if (!(stack.getItem() instanceof GunItem)) return; if (!(stack.getItem() instanceof GunItem gunItem)) return;
var data = GunData.from(stack); var data = GunData.from(stack);
if (!data.hasEnoughAmmoToShoot(player)) return; if (!data.hasEnoughAmmoToShoot(player)) return;
if (!gunItem.canShoot(data)) return;
if (stack.is(ModTags.Items.NORMAL_GUN)) { if (stack.is(ModTags.Items.NORMAL_GUN)) {
int mode = data.fireMode.get(); int mode = data.fireMode.get();
@ -737,15 +738,15 @@ public class ClientEventHandler {
actionMove = Mth.lerp(0.125 * times, actionMove, 0); actionMove = Mth.lerp(0.125 * times, actionMove, 0);
} }
// TODO 添加canShoot()方法提前判断是否能开火 // TODO 完善canShoot()方法提前判断是否能开火
public static void handleClientShoot() { public static void handleClientShoot() {
Player player = Minecraft.getInstance().player; Player player = Minecraft.getInstance().player;
if (player == null) return; if (player == null) return;
ItemStack stack = player.getMainHandItem(); ItemStack stack = player.getMainHandItem();
if (!(stack.getItem() instanceof GunItem)) return; if (!(stack.getItem() instanceof GunItem gunItem)) return;
var data = GunData.from(stack); var data = GunData.from(stack);
if (data.projectileAmount() <= 0) return; if (!gunItem.canShoot(data)) return;
PacketDistributor.sendToServer(new ShootMessage(gunSpread, zoom)); PacketDistributor.sendToServer(new ShootMessage(gunSpread, zoom));
fireRecoilTime = 10; fireRecoilTime = 10;

View file

@ -476,6 +476,13 @@ public abstract class GunItem extends Item implements CustomRendererItem {
public void addReloadTimeBehavior(Map<Integer, Consumer<GunData>> behaviors) { public void addReloadTimeBehavior(Map<Integer, Consumer<GunData>> behaviors) {
} }
/**
* 判断武器能否开火
*/
public boolean canShoot(GunData data) {
return data.projectileAmount() > 0;
}
/** /**
* 服务端在开火前的额外行为 * 服务端在开火前的额外行为
*/ */
@ -598,6 +605,8 @@ public abstract class GunItem extends Item implements CustomRendererItem {
/** /**
* 服务端发射单发子弹 * 服务端发射单发子弹
*
* @return 是否发射成功
*/ */
public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) { public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) {
var stack = data.stack; var stack = data.stack;

View file

@ -184,15 +184,7 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem {
@Override @Override
public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) { public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) {
if (data.reloading()) return false;
var stack = data.stack; var stack = data.stack;
int perkLevel = data.perk.getLevel(ModPerks.VOLT_OVERLOAD);
var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM);
var hasEnoughEnergy = energyStorage != null && energyStorage.getEnergyStored() >= 400 + 100 * perkLevel;
if (!hasEnoughEnergy) return false;
player.getCooldowns().addCooldown(stack.getItem(), 5); player.getCooldowns().addCooldown(stack.getItem(), 5);
if (player instanceof ServerPlayer serverPlayer) { if (player instanceof ServerPlayer serverPlayer) {
@ -200,7 +192,6 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem {
int wireLength = data.perk.getLevel(ModPerks.LONGER_WIRE); int wireLength = data.perk.getLevel(ModPerks.LONGER_WIRE);
var level = serverPlayer.level(); var level = serverPlayer.level();
TaserBulletEntity taserBulletProjectile = new TaserBulletEntity(player, level, TaserBulletEntity taserBulletProjectile = new TaserBulletEntity(player, level,
(float) data.damage(), volt, wireLength); (float) data.damage(), volt, wireLength);
@ -209,12 +200,35 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem {
(float) (zoom ? 0.1 : spread)); (float) (zoom ? 0.1 : spread));
level.addFreshEntity(taserBulletProjectile); level.addFreshEntity(taserBulletProjectile);
} }
energyStorage.extractEnergy(400 + 100 * perkLevel, false);
return true; return true;
} }
@Override
public void afterShoot(GunData data, Player player) {
super.afterShoot(data, player);
var stack = data.stack;
int perkLevel = data.perk.getLevel(ModPerks.VOLT_OVERLOAD);
var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM);
if (energyStorage != null) {
energyStorage.extractEnergy(400 + 100 * perkLevel, false);
}
}
@Override
public boolean canShoot(GunData data) {
var stack = data.stack;
int perkLevel = data.perk.getLevel(ModPerks.VOLT_OVERLOAD);
var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM);
var hasEnoughEnergy = energyStorage != null && energyStorage.getEnergyStored() >= 400 + 100 * perkLevel;
if (!hasEnoughEnergy) return false;
if (data.reloading()) return false;
return super.canShoot(data);
}
@Override @Override
public int getMaxEnergy() { public int getMaxEnergy() {
return MAX_ENERGY; return MAX_ENERGY;