重构部分开火逻辑
This commit is contained in:
parent
911517ebde
commit
2cd8947733
8 changed files with 43 additions and 17 deletions
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue