From e2f3e4bd7118c8f55d20b29d76cb9a13acf72f8b Mon Sep 17 00:00:00 2001 From: Anson Bridges Date: Thu, 8 Sep 2022 16:42:07 -0400 Subject: gdnative testing. gdnative classes cannot be extended by gdscript --- godot/scripts/characters/player_controller_new.gd | 42 ++++++++++-------- godot/scripts/machines/Cannon.gd | 2 +- godot/scripts/machines/NetworkedMachine.gd | 54 ----------------------- godot/scripts/machines/NetworkedMachineGDS.gd | 54 +++++++++++++++++++++++ 4 files changed, 79 insertions(+), 73 deletions(-) delete mode 100644 godot/scripts/machines/NetworkedMachine.gd create mode 100644 godot/scripts/machines/NetworkedMachineGDS.gd (limited to 'godot/scripts') diff --git a/godot/scripts/characters/player_controller_new.gd b/godot/scripts/characters/player_controller_new.gd index 6aec2d9..6df88f0 100644 --- a/godot/scripts/characters/player_controller_new.gd +++ b/godot/scripts/characters/player_controller_new.gd @@ -19,6 +19,7 @@ var direction := Vector3() var move_axis := Vector2() var floorspeed := Vector3() var jumping = false +var can_jump = true onready var nav = $NavigationAgent # Walk @@ -26,22 +27,21 @@ const FLOOR_MAX_ANGLE: float = deg2rad(46.0) export(float) var jump_height = 400.0 var in_water : bool = false var swim_speed : float = 400.0 +var climb_speed : float = 5.0 # Control var controlling_machine = false #whether character is riding/controlling something var machine = null export var is_player = false #whether character is currently controlled by a player -var should_move = false var ladder_m = null #physics var player_state : PhysicsDirectBodyState var is_on_floor:bool -export(float) var acceleration = 80.0 -export(int) var walk_speed = 6 -export(float) var c_friction = 4.0 -export(float) var _airspeed_cap = 1.0 -export(float) var air_control = 1.0 +var acceleration = 80.0 +export(int) var walk_speed = 5 +var c_friction = 4.0 +var air_control = 0.3 # Called when the node enters the scene tree func _ready() -> void: @@ -174,10 +174,13 @@ func on_floor_test() -> bool: func _integrate_forces(state) -> void: player_state = state velocity = state.get_linear_velocity() - if should_move: - nav.set_velocity(velocity) - if nav.is_target_reached(): - should_move = false + for i in range(player_state.get_contact_count()): + var contact_angle_from_up : float = Vector3.UP.angle_to(player_state.get_contact_local_normal(i)) + if contact_angle_from_up > FLOOR_MAX_ANGLE and !is_on_floor: + friction = 0 + break + if i == player_state.get_contact_count() - 1: + friction = 1 # on input event func _input(event: InputEvent) -> void: @@ -191,16 +194,12 @@ func walk(_delta:float) -> void: direction = Vector3() var aim: Basis = head.get_global_transform().basis direction += -move_axis.x * aim.z + move_axis.y * aim.x - if !is_player and should_move: - direction = nav.get_next_location() - global_transform.origin - if nav.get_next_location().y - global_transform.origin.y > 0.05 and is_on_floor: - apply_central_impulse(Vector3.UP*jump_height) direction.y = 0 direction = direction.normalized() # Jump - if is_on_floor and is_player and jumping: - apply_central_impulse(Vector3.UP*jump_height) + if is_player and jumping and is_on_floor and can_jump: + jump() #max walk speed var _speed = walk_speed @@ -213,13 +212,20 @@ func walk(_delta:float) -> void: var projVel = Vector2(velocity.x-floorspeed.x,velocity.z-floorspeed.z).dot(Vector2(direction.x,direction.z)) if is_on_floor: + add_central_force(-mass*linear_velocity.normalized()*c_friction)#friction if _speed - _cspeed > 0: add_central_force (mass*Vector3(direction.x*_temp_accel, 0, direction.z*_temp_accel))#velocity.x += direction.x*_temp_accel else: add_central_force(mass*Vector3(direction.x*(_speed-projVel), 0, direction.z*(_speed-projVel))) - elif _airspeed_cap - projVel > 0: + elif 1.0 - projVel > 0: add_central_force (mass*Vector3(direction.x*_temp_accel, 0, direction.z*_temp_accel)) +func jump(): + can_jump = false + apply_central_impulse(Vector3.UP*jump_height) + yield(get_tree().create_timer(0.05),"timeout") + can_jump = true + func swim(_delta): #drag and buoyancy add_central_force(Vector3.UP*weight*1.0) @@ -255,7 +261,7 @@ func mount_ladder(target_ladder): #called each frame while climbing ladder func climb_ladder(delta): - var new_ladder_pos = ladder_m.global_transform.origin + ladder_m.global_transform.basis.y.normalized() * move_axis.x * delta + var new_ladder_pos = ladder_m.global_transform.origin + ladder_m.global_transform.basis.y.normalized() * move_axis.x * delta * climb_speed var prog = ladder_m.get_parent().get_climb_scalar(new_ladder_pos) if prog >= 0.0 and prog <= 1.0: ladder_m.global_transform.origin = new_ladder_pos diff --git a/godot/scripts/machines/Cannon.gd b/godot/scripts/machines/Cannon.gd index 6b636c5..15807bf 100644 --- a/godot/scripts/machines/Cannon.gd +++ b/godot/scripts/machines/Cannon.gd @@ -1,4 +1,4 @@ -extends "res://scripts/machines/NetworkedMachine.gd" +extends "res://bin/networked_machine.gdns" var world_ballistics = null diff --git a/godot/scripts/machines/NetworkedMachine.gd b/godot/scripts/machines/NetworkedMachine.gd deleted file mode 100644 index 5ce5cbe..0000000 --- a/godot/scripts/machines/NetworkedMachine.gd +++ /dev/null @@ -1,54 +0,0 @@ -extends RigidBody - -var in_use : bool = false -var user = null -var world = null - -func _ready(): - world = get_tree().get_root().find_node("GAMEWORLD", true, false) - -remote func update_phys_transform(t, lv, av): - transform = t - linear_velocity = lv - angular_velocity = av - -remotesync func net_apply_impulse(impulse_v): - apply_central_impulse(impulse_v) - -func _integrate_forces(_state): - if is_network_master() and mode == MODE_RIGID: - rpc("update_phys_transform", transform, linear_velocity, angular_velocity) - -remotesync func set_net_owner(id, char_name): - set_network_master(id) - if id == 1 and char_name == "NONE": #not under control - on_no_control() - if user != null: - user.lose_machine() - user = null - in_use = false - else: - in_use = true - user = world.get_node("PLAYERS/"+char_name) - user.take_control_of_machine(self) - if is_network_master(): - on_new_control() - -func relinquish_control(): - rpc("set_net_owner", 1, "NONE") - -#TO BE OVERRIDDEN BY CHILDREN -func on_new_control(): - pass - -func on_no_control(): - pass - -func attack1(): - pass - -func attack2(): - pass - -func direction_input(_fwd,_bwd,_left,_right,_left2,_right2): - pass diff --git a/godot/scripts/machines/NetworkedMachineGDS.gd b/godot/scripts/machines/NetworkedMachineGDS.gd new file mode 100644 index 0000000..5ce5cbe --- /dev/null +++ b/godot/scripts/machines/NetworkedMachineGDS.gd @@ -0,0 +1,54 @@ +extends RigidBody + +var in_use : bool = false +var user = null +var world = null + +func _ready(): + world = get_tree().get_root().find_node("GAMEWORLD", true, false) + +remote func update_phys_transform(t, lv, av): + transform = t + linear_velocity = lv + angular_velocity = av + +remotesync func net_apply_impulse(impulse_v): + apply_central_impulse(impulse_v) + +func _integrate_forces(_state): + if is_network_master() and mode == MODE_RIGID: + rpc("update_phys_transform", transform, linear_velocity, angular_velocity) + +remotesync func set_net_owner(id, char_name): + set_network_master(id) + if id == 1 and char_name == "NONE": #not under control + on_no_control() + if user != null: + user.lose_machine() + user = null + in_use = false + else: + in_use = true + user = world.get_node("PLAYERS/"+char_name) + user.take_control_of_machine(self) + if is_network_master(): + on_new_control() + +func relinquish_control(): + rpc("set_net_owner", 1, "NONE") + +#TO BE OVERRIDDEN BY CHILDREN +func on_new_control(): + pass + +func on_no_control(): + pass + +func attack1(): + pass + +func attack2(): + pass + +func direction_input(_fwd,_bwd,_left,_right,_left2,_right2): + pass -- cgit v1.2.3