diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index 808b3cb57..412e634fe 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -564,7 +564,7 @@ public class ClientEventHandler { double rps = (double) rpm / 60; // cooldown in ms - int cooldown = (int) (1000 / rps); + int cooldown = (int) Math.round(1000 / rps); //左轮类 if (clientTimer.getProgress() == 0 && stack.is(ModTags.Items.REVOLVER) && ((holdFire && !data.DA.get()) @@ -604,12 +604,19 @@ public class ClientEventHandler { if (!clientTimer.started()) { clientTimer.start(); // 首发瞬间发射 - clientTimer.setProgress((cooldown + 1)); + clientTimer.setProgress(cooldown + 1); } if (clientTimer.getProgress() >= cooldown) { - shootClient(player); - clientTimer.setProgress((clientTimer.getProgress() - cooldown)); + var newProgress = clientTimer.getProgress(); + + // 低帧率下的开火次数补偿 + do { + shootClient(player); + newProgress -= cooldown; + } while (newProgress - cooldown > 0); + + clientTimer.setProgress(newProgress); } } @@ -833,7 +840,7 @@ public class ClientEventHandler { } double rps = (double) rpm / 60; - int cooldown = (int) (1000 / rps); + int cooldown = (int) Math.round(1000 / rps); if ((holdFireVehicle)) { if (!clientTimerVehicle.started()) { @@ -843,10 +850,17 @@ public class ClientEventHandler { } if (clientTimerVehicle.getProgress() >= cooldown) { - PacketDistributor.sendToServer(new VehicleFireMessage(pVehicle.getSeatIndex(player))); + var newProgress = clientTimerVehicle.getProgress(); - playVehicleClientSounds(player, iVehicle, pVehicle.getSeatIndex(player)); - clientTimerVehicle.setProgress((clientTimerVehicle.getProgress() - cooldown)); + // 低帧率下的开火次数补偿 + do { + PacketDistributor.sendToServer(new VehicleFireMessage(pVehicle.getSeatIndex(player))); + playVehicleClientSounds(player, iVehicle, pVehicle.getSeatIndex(player)); + + newProgress -= cooldown; + } while (newProgress - cooldown > 0); + + clientTimerVehicle.setProgress(newProgress); } } else if (clientTimerVehicle.getProgress() >= cooldown) { clientTimerVehicle.stop();