diff --git a/hero_0.gd b/hero_0.gd index be28406..dcfc647 100644 --- a/hero_0.gd +++ b/hero_0.gd @@ -1,28 +1,23 @@ extends "res://player.gd" -const wallride_speed = 2 +const wallride_speed = 0.5 +const wallride_speed_necessary = 15 -master func _integrate_forces(state): - ._integrate_forces(state) - wallride(state) +func control_player(delta): + wallride(delta) + .control_player(delta) -func wallride(state): - var ray = get_node("Ray") +func wallride(delta): # If our feet aren't touching, but we are colliding, we are wall-riding - if !ray.is_colliding() and get_colliding_bodies(): - print("riding") + if is_on_wall() and velocity.length() > wallride_speed_necessary: var aim = get_node("Yaw").get_global_transform().basis var direction = Vector3() if Input.is_action_pressed("move_forwards"): direction -= aim[2] if Input.is_action_pressed("move_backwards"): direction += aim[2] - #var n = -1 * (state.get_transform() * state.get_contact_local_normal(0)) - #direction = n.slide(direction) * wallride_speed - direction *= 0.1 - set_gravity_scale(-0.1) - apply_impulse(Vector3(), direction) - state.integrate_forces() + velocity += direction * wallride_speed + velocity.y = -gravity # So it's undone in super else: + pass # We need to return to falling (we aren't riding anymore) - set_gravity_scale(1) diff --git a/hero_0.tscn b/hero_0.tscn index 5c69750..f6af39e 100644 --- a/hero_0.tscn +++ b/hero_0.tscn @@ -20,33 +20,19 @@ radial_segments = 64 rings = 8 _sections_unfolded = [ "Resource" ] -[node name="RigidBody" type="RigidBody" index="0"] +[node name="RigidBody" type="KinematicBody"] input_ray_pickable = true input_capture_on_drag = false collision_layer = 1 collision_mask = 1 -mode = 2 -mass = 1.0 -friction = 0.0 -bounce = 0.0 -gravity_scale = 1.0 -custom_integrator = true -continuous_cd = true -contacts_reported = 8 -contact_monitor = true -sleeping = false -can_sleep = false axis_lock_linear_x = false axis_lock_linear_y = false axis_lock_linear_z = false axis_lock_angular_x = false axis_lock_angular_y = false axis_lock_angular_z = false -linear_velocity = Vector3( 0, 0, 0 ) -linear_damp = -1.0 -angular_velocity = Vector3( 0, 0, 0 ) -angular_damp = -1.0 +collision/safe_margin = 0.001 script = ExtResource( 1 ) _sections_unfolded = [ "Angular", "Collision", "Linear", "Transform", "Visibility" ] @@ -87,7 +73,7 @@ h_offset = 0.0 v_offset = 0.0 doppler_tracking = 0 projection = 0 -current = false +current = true fov = 70.0 size = 1.0 near = 0.05 diff --git a/player.gd b/player.gd index 571e616..439dfb2 100644 --- a/player.gd +++ b/player.gd @@ -2,28 +2,28 @@ # This source code form is governed by the MIT license. # Original: https://raw.githubusercontent.com/Calinou/fps-test/master/scripts/player.gd -extends RigidBody +extends KinematicBody var view_sensitivity = 0.25 var yaw = 0 var pitch = 0 -const max_accel = 0.005 const air_accel = 0.02 +var gravity = -1 +var tf = Basis() +var velocity = Vector3() + var timer = 0 # Walking speed and jumping height are defined later. -var walk_speed -var jump_speed +var walk_speed = 3 +var jump_speed = 15 var health = 100 var stamina = 10000 var ray_length = 10 -slave var slave_transform = Basis() -slave var slave_lin_v = Vector3() -slave var slave_ang_v = Vector3() func _ready(): set_process_input(true) @@ -60,21 +60,16 @@ func _input(event): quit() -master func _integrate_forces(state): - control_player(state) - rpc_unreliable("set_status", get_transform(), get_linear_velocity(), get_angular_velocity()) +func _physics_process(delta): + if is_network_master(): + control_player(delta) + rset_unreliable("tf", get_transform()) + rset_unreliable("velocity", velocity) + else: + set_transform(tf) + move_and_slide(velocity) -slave func set_status(tf, lv, av): - set_transform(tf) - set_linear_velocity(lv) - set_angular_velocity(av) - -func control_player(state): - - # Default walk speed: - walk_speed = 5 - # Default jump height: - jump_speed = 3 +func control_player(delta): var aim = get_node("Yaw").get_global_transform().basis @@ -92,52 +87,27 @@ func control_player(state): direction = direction.normalized() var ray = get_node("Ray") - #print("---") - - if ray.is_colliding(): - var up = state.get_total_gravity().normalized() - var normal = ray.get_collision_normal() - var floor_velocity = Vector3() - var object = ray.get_collider() - - if object is RigidBody or object is StaticBody: - var point = ray.get_collision_point() - object.get_translation() - var floor_angular_vel = Vector3() - if object is RigidBody: - floor_velocity = object.get_linear_velocity() - floor_angular_vel = object.get_angular_velocity() - elif object is StaticBody: - floor_velocity = object.get_constant_linear_velocity() - floor_angular_vel = object.get_constant_angular_velocity() - # Surely there should be a function to convert Euler angles to a 3x3 matrix - var tf = Basis(Vector3(1, 0, 0), floor_angular_vel.x) - tf = tf.rotated(Vector3(0, 1, 0), floor_angular_vel.y) - tf = tf.rotated(Vector3(0, 0, 1), floor_angular_vel.z) - floor_velocity += tf.xform_inv(point) - point - yaw = fmod(yaw + rad2deg(floor_angular_vel.y) * state.get_step(), 360) - get_node("Yaw").set_rotation(Vector3(0, deg2rad(yaw), 0)) - print("isRB||isSB") + var friction - var diff = floor_velocity + direction * walk_speed - state.get_linear_velocity() - var vertdiff = aim[1] * diff.dot(aim[1]) - print("VD: " + str(vertdiff)) - diff -= vertdiff - diff = diff.normalized() * clamp(diff.length(), 0, max_accel / state.get_step()) - diff += vertdiff + if is_on_floor(): - print("D: " + str(diff)) - apply_impulse(Vector3(), diff * get_mass()) + friction = 1 - 0.16 + velocity.x *= friction + velocity.z *= friction + velocity.y = 0 + velocity += direction * walk_speed if Input.is_action_pressed("jump"): - apply_impulse(Vector3(), normal * jump_speed * get_mass()) + velocity.y += jump_speed else: - apply_impulse(Vector3(), direction * air_accel * get_mass()) - - print(get_translation()) - print(state.get_linear_velocity()) + friction = 1 - 0.01 + velocity.x *= friction + velocity.z *= friction + velocity.y += gravity + velocity += direction * air_accel - state.integrate_forces() + move_and_slide(velocity, Vector3(0, 1, 0)) func _exit_scene(): Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) diff --git a/player.tscn b/player.tscn index ea38b3f..13f3b9c 100644 --- a/player.tscn +++ b/player.tscn @@ -20,33 +20,19 @@ radial_segments = 64 rings = 8 _sections_unfolded = [ "Resource" ] -[node name="RigidBody" type="RigidBody" index="0"] +[node name="RigidBody" type="KinematicBody"] input_ray_pickable = true input_capture_on_drag = false collision_layer = 1 collision_mask = 1 -mode = 2 -mass = 1.0 -friction = 0.0 -bounce = 0.0 -gravity_scale = 1.0 -custom_integrator = true -continuous_cd = true -contacts_reported = 8 -contact_monitor = true -sleeping = false -can_sleep = false axis_lock_linear_x = false axis_lock_linear_y = false axis_lock_linear_z = false axis_lock_angular_x = false axis_lock_angular_y = false axis_lock_angular_z = false -linear_velocity = Vector3( 0, 0, 0 ) -linear_damp = -1.0 -angular_velocity = Vector3( 0, 0, 0 ) -angular_damp = -1.0 +collision/safe_margin = 0.001 script = ExtResource( 1 ) _sections_unfolded = [ "Angular", "Collision", "Linear", "Transform", "Visibility" ] @@ -87,7 +73,7 @@ h_offset = 0.0 v_offset = 0.0 doppler_tracking = 0 projection = 0 -current = false +current = true fov = 70.0 size = 1.0 near = 0.05