修复taser开火问题
This commit is contained in:
parent
2cd8947733
commit
353b7a1b3b
3 changed files with 40 additions and 16 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue