Added regen, hit sounds, and improved fall damage.

This commit is contained in:
Andrew Lalis 2022-07-29 12:13:46 +02:00
parent dbdfcc554b
commit e065be9b35
5 changed files with 41 additions and 23 deletions

View File

@ -223,10 +223,10 @@ public class GuiRenderer {
nvgSave(vgId);
drawCrosshair(width, height, client.getInputHandler().isScopeEnabled());
drawHeldItemStackInfo(width, height, client.getMyPlayer());
if (!client.getInputHandler().isScopeEnabled()) {
drawChat(width, height, client);
drawHealthBar(width, height, client.getMyPlayer());
drawHeldItemStackInfo(width, height, client.getMyPlayer());
}
if (client.getInputHandler().isDebugEnabled()) {
drawDebugInfo(width, height, client);
@ -259,9 +259,13 @@ public class GuiRenderer {
float cx = w / 2f;
float cy = h / 2f;
float size = 20f;
if (scopeEnabled) size = 3f;
if (scopeEnabled) {
size = 3f;
nvgStrokeColor(vgId, GuiUtils.rgba(1, 0, 0, 0.5f, colorA));
} else {
nvgStrokeColor(vgId, GuiUtils.rgba(1, 1, 1, 0.25f, colorA));
}
nvgBeginPath(vgId);
nvgMoveTo(vgId, cx - size / 2, cy);
nvgLineTo(vgId, cx + size / 2, cy);
@ -329,14 +333,6 @@ public class GuiRenderer {
}
private void drawChat(float w, float h, Client client) {
float chatWidth = w / 3;
float chatHeight = h / 4;
nvgFillColor(vgId, GuiUtils.rgba(0, 0, 0, 0.25f, colorA));
nvgBeginPath(vgId);
nvgRect(vgId, 0, h - chatHeight - 16, chatWidth, chatHeight);
nvgFill(vgId);
var chat = client.getChat();
nvgFontSize(vgId, 12f);
nvgFontFaceId(vgId, jetbrainsMonoFont);

View File

@ -77,6 +77,8 @@ public class SoundManager {
load("block_break_1", "sound/m_block_break_1.wav");
load("block_place_1", "sound/m_block_place_1.wav");
load("chat", "sound/chat.wav");
load("hit_1", "sound/m_hit_1.wav");
load("hit_2", "sound/m_hit_2.wav");
}
public void load(String name, String resource) {

View File

@ -190,7 +190,18 @@ public class ProjectileManager {
if (!server.getTeamManager().isProtected(hitPlayer)) {
Gun gun = (Gun) projectile.getSourceItem();
float damage = gun.getBaseDamage();
if (playerHitType == 1) damage *= 2;
if (playerHitType == 1) {// headshot.
damage *= 2;
if (projectile.getPlayer() != null) {
var shooter = projectile.getPlayer();
server.getPlayerManager().getHandler(shooter).sendDatagramPacket(new SoundMessage("hit_1", 1, shooter.getPosition(), shooter.getVelocity()));
}
} else {
if (projectile.getPlayer() != null) {
var shooter = projectile.getPlayer();
server.getPlayerManager().getHandler(shooter).sendDatagramPacket(new SoundMessage("hit_2", 1, shooter.getPosition(), shooter.getVelocity()));
}
}
hitPlayer.setHealth(hitPlayer.getHealth() - damage);
Vector3f impactAcceleration = new Vector3f(projectile.getVelocity()).normalize().mul(3);
hitPlayer.getVelocity().add(impactAcceleration);

View File

@ -13,13 +13,13 @@ public class ServerConfig {
};
public static class PhysicsConfig {
public float gravity = 9.81f * 3;
public float gravity = 9.81f;
public float walkingSpeed = 4;
public float crouchingSpeed = 1.5f;
public float sprintingSpeed = 9;
public float movementAcceleration = 2;
public float movementDeceleration = 1;
public float jumpVerticalSpeed = 8;
public float jumpVerticalSpeed = 7;
}
public static class ActionsConfig {
@ -34,6 +34,7 @@ public class ServerConfig {
public float teamSpawnProtection = 10;
public float movementAccuracyDecreaseFactor = 0.01f;
public boolean friendlyFire = false;
public float healthRegenPerSecond = 0.01f;
}
public static class TeamConfig {

View File

@ -90,6 +90,11 @@ public class PlayerActionManager {
lastResupplyAt = now;
}
if (server.getConfig().actions.healthRegenPerSecond != 0 && player.getHealth() < 1) {
player.setHealth(player.getHealth() + server.getConfig().actions.healthRegenPerSecond * dt);
server.getPlayerManager().getHandler(player).sendDatagramPacket(new ClientHealthMessage(player.getHealth()));
}
if (player.isCrouching() != input.crouching()) {
player.setCrouching(input.crouching());
updated = true;
@ -208,13 +213,13 @@ public class PlayerActionManager {
boolean grounded = isGrounded(world);
tickHorizontalVelocity(config, grounded);
if (isGrounded(world)) {
if (grounded) {
if (input.jumping()) {
velocity.y = config.jumpVerticalSpeed * (input.sprinting() ? 1.25f : 1f);
updated = true;
}
} else {
velocity.y -= config.gravity * dt;
velocity.y -= config.gravity * dt * 2; // Apply double-gravity to players to make the game feel faster.
updated = true;
}
@ -237,7 +242,7 @@ public class PlayerActionManager {
}
}
private void tickHorizontalVelocity(ServerConfig.PhysicsConfig config, boolean doDeceleration) {
private void tickHorizontalVelocity(ServerConfig.PhysicsConfig config, boolean grounded) {
var velocity = player.getVelocity();
var orientation = player.getOrientation();
Vector3f horizontalVelocity = new Vector3f(
@ -253,7 +258,9 @@ public class PlayerActionManager {
if (acceleration.lengthSquared() > 0) {
acceleration.normalize();
acceleration.rotateAxis(orientation.x, 0, 1, 0);
acceleration.mul(config.movementAcceleration);
float accelerationMagnitude = config.movementAcceleration;
if (!grounded) accelerationMagnitude *= 0.25f;
acceleration.mul(accelerationMagnitude);
horizontalVelocity.add(acceleration);
float maxSpeed;
if (input.crouching()) {
@ -269,10 +276,11 @@ public class PlayerActionManager {
horizontalVelocity.normalize(maxSpeed);
}
updated = true;
} else if (doDeceleration && horizontalVelocity.lengthSquared() > 0) {
Vector3f deceleration = new Vector3f(horizontalVelocity)
.negate().normalize()
.mul(Math.min(horizontalVelocity.length(), config.movementDeceleration));
} else if (horizontalVelocity.lengthSquared() > 0) {
float baseDecel = config.movementDeceleration;
if (!grounded) baseDecel *= 0.25f;
float decelerationMagnitude = Math.min(horizontalVelocity.length(), baseDecel);
Vector3f deceleration = new Vector3f(horizontalVelocity).negate().normalize().mul(decelerationMagnitude);
horizontalVelocity.add(deceleration);
if (horizontalVelocity.length() < 0.1f) {
horizontalVelocity.set(0);
@ -449,7 +457,7 @@ public class PlayerActionManager {
if (collidingWithFloor) {
// This is a special case! We need to check for fall damage.
if (velocity.y < -20) {
float damage = velocity.y / 200f;
float damage = velocity.y / 50f;
player.setHealth(player.getHealth() + damage);
if (player.getHealth() <= 0) {
server.getPlayerManager().playerKilled(player, player);