重构部分开火逻辑

This commit is contained in:
17146 2025-04-20 20:53:45 +08:00 committed by Light_Quanta
parent 911517ebde
commit 2cd8947733
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
8 changed files with 43 additions and 17 deletions

View file

@ -737,6 +737,7 @@ public class ClientEventHandler {
actionMove = Mth.lerp(0.125 * times, actionMove, 0); actionMove = Mth.lerp(0.125 * times, actionMove, 0);
} }
// 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;
@ -744,6 +745,8 @@ public class ClientEventHandler {
if (!(stack.getItem() instanceof GunItem)) return; if (!(stack.getItem() instanceof GunItem)) return;
var data = GunData.from(stack); var data = GunData.from(stack);
if (data.projectileAmount() <= 0) return;
PacketDistributor.sendToServer(new ShootMessage(gunSpread, zoom)); PacketDistributor.sendToServer(new ShootMessage(gunSpread, zoom));
fireRecoilTime = 10; fireRecoilTime = 10;

View file

@ -495,7 +495,12 @@ public abstract class GunItem extends Item implements CustomRendererItem {
if (data.defaultActionTime() > 0 && data.ammo.get() > (data.stack.is(ModTags.Items.REVOLVER) ? 0 : 1)) { if (data.defaultActionTime() > 0 && data.ammo.get() > (data.stack.is(ModTags.Items.REVOLVER) ? 0 : 1)) {
data.bolt.needed.set(true); data.bolt.needed.set(true);
} }
}
/**
* 服务端在开火后的额外行为
*/
public void afterShoot(GunData data, Player player) {
if (!data.useBackpackAmmo()) { if (!data.useBackpackAmmo()) {
data.ammo.set(data.ammo.get() - 1); data.ammo.set(data.ammo.get() - 1);
data.isEmpty.set(true); data.isEmpty.set(true);
@ -518,9 +523,10 @@ public abstract class GunItem extends Item implements CustomRendererItem {
// 生成所有子弹 // 生成所有子弹
for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) { for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) {
shootBullet(player, data, spread, zoom); if (!shootBullet(player, data, spread, zoom)) return;
} }
data.item.afterShoot(data, player);
playFireSounds(data, player, zoom); playFireSounds(data, player, zoom);
} }
@ -593,7 +599,7 @@ public abstract class GunItem extends Item implements CustomRendererItem {
/** /**
* 服务端发射单发子弹 * 服务端发射单发子弹
*/ */
public void 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;
float headshot = (float) data.headshot(); float headshot = (float) data.headshot();
@ -668,6 +674,8 @@ public abstract class GunItem extends Item implements CustomRendererItem {
projectile.setPos(player.getX() - 0.1 * player.getLookAngle().x, player.getEyeY() - 0.1 - 0.1 * player.getLookAngle().y, player.getZ() + -0.1 * player.getLookAngle().z); projectile.setPos(player.getX() - 0.1 * player.getLookAngle().x, player.getEyeY() - 0.1 - 0.1 * player.getLookAngle().y, player.getZ() + -0.1 * player.getLookAngle().z);
projectile.shoot(player, player.getLookAngle().x, player.getLookAngle().y + 0.001f, player.getLookAngle().z, stack.is(ModTags.Items.SHOTGUN) && perk == ModPerks.INCENDIARY_BULLET.get() ? 4.5f : velocity, (float) spread); projectile.shoot(player, player.getLookAngle().x, player.getLookAngle().y + 0.001f, player.getLookAngle().z, stack.is(ModTags.Items.SHOTGUN) && perk == ModPerks.INCENDIARY_BULLET.get() ? 4.5f : velocity, (float) spread);
player.level().addFreshEntity(projectile); player.level().addFreshEntity(projectile);
return true;
} }
@SubscribeEvent @SubscribeEvent

View file

@ -121,8 +121,8 @@ public class M79Item extends GunItem implements GeoItem {
} }
@Override @Override
public void shootBullet(Player player, GunData data, double spread, boolean zoom) { public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) {
if (data.reloading()) return; if (data.reloading()) return false;
if (player.level() instanceof ServerLevel serverLevel) { if (player.level() instanceof ServerLevel serverLevel) {
GunGrenadeEntity gunGrenadeEntity = new GunGrenadeEntity(player, serverLevel, GunGrenadeEntity gunGrenadeEntity = new GunGrenadeEntity(player, serverLevel,
@ -157,6 +157,8 @@ public class M79Item extends GunItem implements GeoItem {
player.getZ() + 1.8 * player.getLookAngle().z, player.getZ() + 1.8 * player.getLookAngle().z,
4, 0.1, 0.1, 0.1, 0.002, true); 4, 0.1, 0.1, 0.1, 0.002, true);
} }
return true;
} }
} }

View file

@ -144,10 +144,10 @@ public class RpgItem extends GunItem implements GeoItem {
} }
@Override @Override
public void shootBullet(Player player, GunData data, double spread, boolean zoom) { public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) {
Level level = player.level(); Level level = player.level();
if (data.reloading()) return; if (data.reloading()) return false;
if (player.level() instanceof ServerLevel serverLevel) { if (player.level() instanceof ServerLevel serverLevel) {
RpgRocketEntity rocket = new RpgRocketEntity(player, level, RpgRocketEntity rocket = new RpgRocketEntity(player, level,
@ -188,6 +188,8 @@ public class RpgItem extends GunItem implements GeoItem {
} }
data.isEmpty.set(true); data.isEmpty.set(true);
data.closeHammer.set(true); data.closeHammer.set(true);
return true;
} }
@Override @Override
@ -197,5 +199,4 @@ public class RpgItem extends GunItem implements GeoItem {
behaviors.put(84, data -> data.isEmpty.set(false)); behaviors.put(84, data -> data.isEmpty.set(false));
behaviors.put(9, data -> data.closeHammer.set(false)); behaviors.put(9, data -> data.closeHammer.set(false));
} }
} }

View file

@ -232,9 +232,9 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, EnergyStorag
} }
@Override @Override
public void shootBullet(Player player, GunData data, double spread, boolean zoom) { public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) {
if (data.reloading()) return; if (data.reloading()) return false;
ItemStack stack = data.stack(); var stack = data.stack;
var stackCap = stack.getCapability(Capabilities.EnergyStorage.ITEM); var stackCap = stack.getCapability(Capabilities.EnergyStorage.ITEM);
var hasEnoughEnergy = stackCap != null && stackCap.getEnergyStored() >= 3000; var hasEnoughEnergy = stackCap != null && stackCap.getEnergyStored() >= 3000;
@ -282,6 +282,8 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, EnergyStorag
} }
} }
} }
return true;
} }
@Override @Override

View file

@ -136,6 +136,15 @@ public class HomemadeShotgunItem extends GunItem implements GeoItem {
} }
} }
@Override
public void afterShoot(GunData data, Player player) {
super.afterShoot(data, player);
var stack = data.stack();
stack.hurtAndBreak(1, (ServerLevel) player.level(), player, p -> {
});
}
@Override @Override
public int getAvailableFireModes() { public int getAvailableFireModes() {
return FireMode.SEMI.flag; return FireMode.SEMI.flag;

View file

@ -191,8 +191,8 @@ public class SentinelItem extends GunItem implements GeoItem, EnergyStorageItem
} }
@Override @Override
public void beforeShoot(GunData data, Player player, double spread, boolean zoom) { public void afterShoot(GunData data, Player player) {
super.beforeShoot(data, player, spread, zoom); super.afterShoot(data, player);
var cap = data.stack.getCapability(Capabilities.EnergyStorage.ITEM); var cap = data.stack.getCapability(Capabilities.EnergyStorage.ITEM);
if (cap != null) { if (cap != null) {

View file

@ -112,7 +112,6 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem {
return this.cache; return this.cache;
} }
@Override @Override
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) {
@ -184,15 +183,15 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem {
} }
@Override @Override
public void shootBullet(Player player, GunData data, double spread, boolean zoom) { public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) {
if (data.reloading()) return; if (data.reloading()) return false;
ItemStack stack = data.stack(); var stack = data.stack;
int perkLevel = data.perk.getLevel(ModPerks.VOLT_OVERLOAD); int perkLevel = data.perk.getLevel(ModPerks.VOLT_OVERLOAD);
var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM);
var hasEnoughEnergy = energyStorage != null && energyStorage.getEnergyStored() >= 400 + 100 * perkLevel; var hasEnoughEnergy = energyStorage != null && energyStorage.getEnergyStored() >= 400 + 100 * perkLevel;
if (!hasEnoughEnergy) return; if (!hasEnoughEnergy) return false;
player.getCooldowns().addCooldown(stack.getItem(), 5); player.getCooldowns().addCooldown(stack.getItem(), 5);
@ -212,6 +211,8 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem {
} }
energyStorage.extractEnergy(400 + 100 * perkLevel, false); energyStorage.extractEnergy(400 + 100 * perkLevel, false);
return true;
} }
@Override @Override