Cleaned up recoil mechanic to be applied with a delta value instead of absolute.

This commit is contained in:
Andrew Lalis 2022-07-28 23:06:18 +02:00
parent a1c1aad065
commit 492b9f66aa
9 changed files with 23 additions and 24 deletions

View File

@ -1,7 +1,7 @@
package nl.andrewl.aos2_client;
import nl.andrewl.aos2_client.config.ClientConfig;
import nl.andrewl.aos2_client.control.*;
import nl.andrewl.aos2_client.control.InputHandler;
import nl.andrewl.aos2_client.model.Chat;
import nl.andrewl.aos2_client.model.ClientPlayer;
import nl.andrewl.aos2_client.model.OtherPlayer;
@ -200,12 +200,13 @@ public class Client implements Runnable {
if (soundManager != null) {
soundManager.play("chat", 1, myPlayer.getEyePosition(), myPlayer.getVelocity());
}
} else if (msg instanceof ClientOrientationUpdateMessage orientationUpdateMessage) {
} else if (msg instanceof ClientRecoilMessage recoil) {
runLater(() -> {
myPlayer.setOrientation(orientationUpdateMessage.x(), orientationUpdateMessage.y());
myPlayer.setOrientation(myPlayer.getOrientation().x + recoil.dx(), myPlayer.getOrientation().y + recoil.dy());
if (gameRenderer != null) {
gameRenderer.getCamera().setOrientationToPlayer(myPlayer);
}
communicationHandler.sendDatagramPacket(ClientOrientationState.fromPlayer(myPlayer));
});
}
}

View File

@ -55,10 +55,12 @@ public class PlayerInputKeyCallback implements GLFWKeyCallbackI {
case GLFW_KEY_T -> inputHandler.enableChatting();
case GLFW_KEY_SLASH -> {
if (!inputHandler.isChatting()) {
inputHandler.enableChatting();
inputHandler.appendToChat("/");
}
}
}
} else if (action == GLFW_REPEAT) {
switch (key) {
case GLFW_KEY_BACKSPACE -> inputHandler.deleteFromChat();

View File

@ -55,11 +55,7 @@ public class PlayerViewCursorCallback implements GLFWCursorPosCallbackI {
camera.setOrientationToPlayer(client.getMyPlayer());
long now = System.currentTimeMillis();
if (lastOrientationUpdateSentAt + ORIENTATION_UPDATE_LIMIT < now) {
ForkJoinPool.commonPool().submit(() -> comm.sendDatagramPacket(new ClientOrientationState(
client.getMyPlayer().getId(),
client.getMyPlayer().getOrientation().x,
client.getMyPlayer().getOrientation().y
)));
ForkJoinPool.commonPool().submit(() -> comm.sendDatagramPacket(ClientOrientationState.fromPlayer(client.getMyPlayer())));
lastOrientationUpdateSentAt = now;
}
}

View File

@ -369,10 +369,10 @@ public class GuiRenderer {
nvgTextAlign(vgId, NVG_ALIGN_LEFT | NVG_ALIGN_TOP);
nvgFillColor(vgId, GuiUtils.rgba(1, 1, 1, 1, colorA));
var pos = client.getMyPlayer().getPosition();
nvgText(vgId, 5, y, String.format("Pos: x=%.3f, y=%.3f, z=%.3f", pos.x, pos.y, pos.z));
nvgText(vgId, 5, y, String.format("Pos: dx=%.3f, dy=%.3f, z=%.3f", pos.x, pos.y, pos.z));
y += 12;
var vel = client.getMyPlayer().getVelocity();
nvgText(vgId, 5, y, String.format("Vel: x=%.3f, y=%.3f, z=%.3f, speed=%.3f", vel.x, vel.y, vel.z, vel.length()));
nvgText(vgId, 5, y, String.format("Vel: dx=%.3f, dy=%.3f, z=%.3f, speed=%.3f", vel.x, vel.y, vel.z, vel.length()));
y += 12;
var view = client.getMyPlayer().getOrientation();
nvgText(vgId, 5, y, String.format("View: horizontal=%.3f, vertical=%.3f", Math.toDegrees(view.x), Math.toDegrees(view.y)));

View File

@ -48,7 +48,7 @@ public final class Net {
serializer.registerType(19, BlockColorMessage.class);
serializer.registerType(20, ChatMessage.class);
serializer.registerType(21, ChatWrittenMessage.class);
serializer.registerType(22, ClientOrientationUpdateMessage.class);
serializer.registerType(22, ClientRecoilMessage.class);
}
public static ExtendedDataInputStream getInputStream(InputStream in) {

View File

@ -1,5 +1,6 @@
package nl.andrewl.aos_core.net.client;
import nl.andrewl.aos_core.model.Player;
import nl.andrewl.record_net.Message;
/**
@ -11,4 +12,8 @@ import nl.andrewl.record_net.Message;
public record ClientOrientationState(
int clientId,
float x, float y
) implements Message {}
) implements Message {
public static ClientOrientationState fromPlayer(Player player) {
return new ClientOrientationState(player.getId(), player.getOrientation().x, player.getOrientation().y);
}
}

View File

@ -4,8 +4,8 @@ import nl.andrewl.record_net.Message;
/**
* A message that the server sends to clients, to tell them to update their
* player's orientation to the specified values.
* player's orientation according to a recoil event.
*/
public record ClientOrientationUpdateMessage(
float x, float y
public record ClientRecoilMessage(
float dx, float dy
) implements Message {}

View File

@ -39,7 +39,7 @@ public class PlayersCommand {
}
}
@CommandLine.Command(name = "list", description = "Kicks a player from the server.")
@CommandLine.Command(name = "kick", description = "Kicks a player from the server.")
public void kick(
@CommandLine.Parameters(paramLabel = "player", description = "The id or name of the player to kick.") String playerIdent
) {

View File

@ -114,12 +114,7 @@ public class PlayerActionManager {
// Apply recoil!
float recoilFactor = 10f; // Maximum number of degrees to recoil.
float recoil = recoilFactor * gun.getRecoil() + (float) ThreadLocalRandom.current().nextGaussian(0, 0.01);
player.getOrientation().y += Math.toRadians(recoil);
server.getPlayerManager().getHandler(player.getId()).sendDatagramPacket(new ClientOrientationUpdateMessage(
player.getOrientation().x(),
player.getOrientation().y()
));
server.getPlayerManager().broadcastUdpMessageToAllBut(player.getUpdateMessage(now), player);
server.getPlayerManager().getHandler(player.getId()).sendDatagramPacket(new ClientRecoilMessage(0, Math.toRadians(recoil)));
// Play sound!
String shotSound = null;
if (gun instanceof Rifle) {