From 1c5e168015c8f2d3c295e7f49aa3630cc7160720 Mon Sep 17 00:00:00 2001 From: anyreso Date: Sun, 14 Apr 2024 14:24:30 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Aerial=20control,=20small=20refa?= =?UTF-8?q?ctoring=20and=20dummy=20target=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entities/player/player.gd | 52 ++++++++++--------- entities/player/player_input.gd | 7 +-- .../assets/player_mesh.blend.import | 2 +- entities/target_dummy/target_dummy.tscn | 1 + project.godot | 1 - tests/test_basics.gd | 1 + 6 files changed, 34 insertions(+), 30 deletions(-) diff --git a/entities/player/player.gd b/entities/player/player.gd index 52987f8..7c28186 100644 --- a/entities/player/player.gd +++ b/entities/player/player.gd @@ -1,49 +1,46 @@ -extends RigidBody3D -class_name Player +class_name Player extends RigidBody3D enum PlayerState { PLAYER_ALIVE, PLAYER_DEAD } -# constants -const max_energy : float = 100.0 -const energy_charge_rate : float = 10 # energy per second -const energy_drain_rate : float = 20 # energy per second -const ground_speed : float = 48 / 3.6 # m/s -const jetpack_vertical_force : float = 800 -const jetpack_horizontal_force : float = 400 -const jetpack_force_factor : float = 2 - -# parameters +@export_category("Parameters") +@export var ground_speed : float = 48 / 3.6 # m/s +@export var aerial_control_force : int = 400 @export var max_floor_angle : float = 60 -@export var energy: float = 100.0 -var g : float = ProjectSettings.get_setting("physics/3d/default_gravity") # in m/s² -var gravity : Vector3 = g * ProjectSettings.get_setting("physics/3d/default_gravity_vector") +@export_group("Jetpack") +@export var energy: float = 100.0 +@export var energy_charge_rate : float = 20 # energy per second +@export var energy_drain_rate : float = 25 # energy per second +@export var energy_max : float = 100. +@export var jetpack_force_factor : float = 2. +@export var jetpack_horizontal_force : float = 600 +@export var jetpack_vertical_force : float = 800 + +@export_group("State") +@export var player_state = PlayerState.PLAYER_ALIVE @export var player_id = 1: set(id): player_id = id $PlayerInput.set_multiplayer_authority(id) -@export var player_state = PlayerState.PLAYER_ALIVE - @onready var input : PlayerInput = $PlayerInput @onready var camera = $SpringArm3D/Camera3D - @onready var hud = $HUD @onready var iff = $ThirdPerson/IFF @onready var shape_cast = $ShapeCast3D @onready var weapon = $SpringArm3D/Inventory/SpaceGun @onready var animation_player : AnimationPlayer = $AnimationPlayer @onready var health_component = $HealthComponent - @onready var spring_arm_height = $SpringArm3D.position.y +@onready var _original_weapon_transform : Transform3D = weapon.transform signal died(player) signal energy_changed(energy) +var g : float = ProjectSettings.get_setting("physics/3d/default_gravity") # in m/s² +var gravity : Vector3 = g * ProjectSettings.get_setting("physics/3d/default_gravity_vector") var _jumping = false -@onready var _original_weapon_transform : Transform3D = weapon.transform - func _ready(): energy_changed.connect(hud._on_energy_changed) health_component.health_changed.connect(hud._on_health_changed) @@ -80,12 +77,16 @@ func _jump(): return _jumping = true -func _is_on_floor() -> bool: +func is_on_floor() -> bool: return shape_cast.is_colliding() func _is_skiing() -> bool: return input.skiing +func _handle_aerial_control(delta, direction): + if not input.jetting and not is_on_floor(): + apply_force(direction * aerial_control_force) + func _handle_jetpack(delta, direction): if input.jetting: if energy > 0: @@ -96,7 +97,7 @@ func _handle_jetpack(delta, direction): else: energy += energy_charge_rate * delta - energy = clamp(energy, 0, max_energy) + energy = clamp(energy, 0, energy_max) energy_changed.emit(energy) func _process(_delta): @@ -127,6 +128,7 @@ func _physics_process(delta): # adjust direction based on spring arm rotation _direction = _direction.rotated(Vector3.UP, $SpringArm3D.rotation.y) + _handle_aerial_control(delta, _direction) _handle_jetpack(delta, _direction) # handle ski @@ -135,7 +137,7 @@ func _physics_process(delta): else: physics_material_override.friction = 1 - if _is_on_floor(): + if is_on_floor(): if not _direction.is_zero_approx() and not _is_skiing(): # retrieve collision normal var normal = shape_cast.get_collision_normal(0) @@ -163,7 +165,7 @@ func _update_third_person_animations(): tp_player.set_ground_state(Vanguard.GroundState.GROUND_STATE_DEAD) return - if _is_on_floor(): + if is_on_floor(): tp_player.set_ground_state(Vanguard.GroundState.GROUND_STATE_GROUNDED) else: tp_player.set_ground_state(Vanguard.GroundState.GROUND_STATE_MID_AIR) diff --git a/entities/player/player_input.gd b/entities/player/player_input.gd index 1d07eb3..194e4ee 100644 --- a/entities/player/player_input.gd +++ b/entities/player/player_input.gd @@ -1,11 +1,10 @@ -extends MultiplayerSynchronizer -class_name PlayerInput +class_name PlayerInput extends MultiplayerSynchronizer @export var jetting = false @export var skiing = false @export var direction = Vector2.ZERO @export var camera_rotation : Vector2 -@export var MOUSE_SENSITIVITY : float = 1.0 +@export var MOUSE_SENSITIVITY : float = .6 signal jumped signal fired_primary @@ -35,6 +34,8 @@ func _process(delta): _fire_primary.rpc() jetting = Input.is_action_pressed("jump_and_jet") skiing = Input.is_action_pressed("ski") + +func _physics_process(delta): _update_camera(delta) @rpc("call_local") diff --git a/entities/target_dummy/assets/player_mesh.blend.import b/entities/target_dummy/assets/player_mesh.blend.import index e264b1b..57e42e6 100644 --- a/entities/target_dummy/assets/player_mesh.blend.import +++ b/entities/target_dummy/assets/player_mesh.blend.import @@ -18,7 +18,7 @@ nodes/root_name="" nodes/apply_root_scale=true nodes/root_scale=1.0 meshes/ensure_tangents=true -meshes/generate_lods=true +meshes/generate_lods=false meshes/create_shadow_meshes=true meshes/light_baking=1 meshes/lightmap_texel_size=0.2 diff --git a/entities/target_dummy/target_dummy.tscn b/entities/target_dummy/target_dummy.tscn index 33f3dee..d9b355b 100644 --- a/entities/target_dummy/target_dummy.tscn +++ b/entities/target_dummy/target_dummy.tscn @@ -57,6 +57,7 @@ bones/27/scale = Vector3(1, 1, 1) bones/28/rotation = Quaternion(-0.144176, 0.0367847, -0.00247504, 0.988865) bones/28/scale = Vector3(1, 1, 1) bones/30/rotation = Quaternion(-0.0630717, 0.16283, -0.0971492, 0.979832) +bones/30/scale = Vector3(1, 1, 1) bones/31/rotation = Quaternion(0.0237032, 0.0123211, -0.0433656, 0.998702) bones/31/scale = Vector3(1, 1, 1) bones/32/rotation = Quaternion(0.243143, 0.523041, 0.164477, 0.800161) diff --git a/project.godot b/project.godot index 68f8383..690e672 100644 --- a/project.godot +++ b/project.godot @@ -89,4 +89,3 @@ toggle_mouse_capture={ 3d/physics_engine="JoltPhysics3D" 3d/default_gravity=19.6 -3d/default_linear_damp=0.01 diff --git a/tests/test_basics.gd b/tests/test_basics.gd index c96cf64..63632f5 100644 --- a/tests/test_basics.gd +++ b/tests/test_basics.gd @@ -4,4 +4,5 @@ func _test_projectile_class(): var projectile = Projectile.new() assert(projectile != null, "Projectile class should be instantiated") assert(projectile.speed == 78.4, "Projectile damage should be initialized to 78.4") + projectile.queue_free()