diff options
Diffstat (limited to 'scripts/characters')
| -rw-r--r-- | scripts/characters/player_controller_new.gd | 81 |
1 files changed, 58 insertions, 23 deletions
diff --git a/scripts/characters/player_controller_new.gd b/scripts/characters/player_controller_new.gd index 37f8562..9c8f4ee 100644 --- a/scripts/characters/player_controller_new.gd +++ b/scripts/characters/player_controller_new.gd @@ -18,11 +18,14 @@ var velocity := Vector3() var direction := Vector3() var move_axis := Vector2() var floorspeed := Vector3() +var jumping = false onready var nav = $NavigationAgent # Walk const FLOOR_MAX_ANGLE: float = deg2rad(46.0) -export(float) var jump_height = 400 +export(float) var jump_height = 400.0 +var in_water : bool = false +var swim_speed : float = 400.0 # Control var controlling_machine = false #whether character is riding/controlling something @@ -46,9 +49,11 @@ func _ready() -> void: world = get_tree().get_root().get_node("GAMEWORLD") if is_player: cam.current = true + $Head/Camera/UseRay.add_exception(self) $Head/Camera/MeleeRay.add_exception(self) - $Head/Camera/LongRay.add_exception(self) + $Head/Camera/UseRay.add_exception($AreaDetect) + $Head/Camera/MeleeRay.add_exception($AreaDetect) Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) cam.fov = FOV @@ -66,7 +71,6 @@ remote func set_phys_transform(trfrm, lvel): # Called every frame. 'delta' is the elapsed time since the previous frame func _process(_delta: float) -> void: - if is_player and !world.is_chatting: if Input.is_action_just_pressed("use"): initiate_use() @@ -78,6 +82,7 @@ func _process(_delta: float) -> void: machine.attack2() machine.direction_input(Input.get_action_strength("move_forward"),Input.get_action_strength("move_backward"), Input.get_action_strength("move_right"),Input.get_action_strength("move_left"), Input.get_action_strength("alt_right"),Input.get_action_strength("alt_left")) else: + jumping = Input.get_action_strength("move_jump") if Input.is_action_just_pressed("fire"): weapon.attack1() move_axis.x = Input.get_action_strength("move_forward") - Input.get_action_strength("move_backward") @@ -93,28 +98,33 @@ func initiate_use(): cam.current = true return if $Head/Camera/UseRay.is_colliding(): - var type = $Head/Camera/UseRay.get_collider().name - match type: + var area_c = $Head/Camera/UseRay.get_collider() + match area_c.name: "SteerArea": - controlling_machine = true - machine = $Head/Camera/UseRay.get_collider().get_parent().take_control(self) - var gt = global_transform.origin - velocity = Vector3.ZERO - global_transform.origin = gt + world.rpc_id(1, "_call_on_server", "_client_request_control_vehicle", {"id" : world.client_id, "machine" : area_c.get_parent().name}) + #controlling_machine = true + #machine = $Head/Camera/UseRay.get_collider().get_parent().take_control(self) + #var gt = global_transform.origin + #velocity = Vector3.ZERO + #global_transform.origin = gt + "LadderArea": + pass _: pass -remotesync func set_owner(owner_id): +remotesync func set_net_owner(owner_id): $Nametag.text = "" set_network_master(owner_id) if owner_id != 1: $Nametag.text = world.players_info[owner_id][0] if get_tree().get_network_unique_id() != 1: if owner_id == world.client_id: + $Nametag.visible = false world.player_char = self is_player = true cam.current = true else: + $Nametag.visible = true cam.current = false is_player = false world.get_node("HUD").update_characters() @@ -123,7 +133,7 @@ func deselect_character(): if is_network_master(): world.player_char = null world.get_node("DEFAULTCAM").current = true - rpc("set_owner", 1) + rpc("set_net_owner", 1) func regain_control(_gt): controlling_machine = false @@ -131,24 +141,30 @@ func regain_control(_gt): # Called every physics tick. 'delta' is constant func _physics_process(delta: float) -> void: - walk(delta) if is_network_master(): + if !on_floor_test() and in_water: + swim(delta) + else: + walk(delta) rpc("set_phys_transform", transform, linear_velocity) + is_on_floor = false #reset whether is on floor in between frames -# called by signal when character is collided with -func on_floor_test() -> void: +# called each physics frame +func on_floor_test() -> bool: if $Feet.is_colliding(): is_on_floor = true if $Feet.get_collider().has_method("get_linear_velocity"): floorspeed = $Feet.get_collider().get_linear_velocity() else: floorspeed = Vector3.ZERO - return + return true if player_state: 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: is_on_floor = true + return true + return false #modify simulated physics results func _integrate_forces(state) -> void: @@ -167,7 +183,6 @@ func _input(event: InputEvent) -> void: camera_rotation() func walk(_delta:float) -> void: - on_floor_test() # Input direction = Vector3() var aim: Basis = head.get_global_transform().basis @@ -181,7 +196,7 @@ func walk(_delta:float) -> void: # Jump if is_on_floor and is_player: - if Input.is_action_just_pressed("move_jump"): + if jumping: apply_central_impulse(Vector3.UP*jump_height) #max walk speed @@ -202,18 +217,36 @@ func walk(_delta:float) -> void: elif _airspeed_cap - projVel > 0: add_central_force (mass*Vector3(direction.x*_temp_accel, 0, direction.z*_temp_accel)) - is_on_floor = false #reset whether is on floor in between frames +func swim(_delta): + #drag and buoyancy + add_central_force(Vector3.UP*weight*1.0) + add_central_force(-1*linear_velocity*75) + #controls + var dir: Basis = cam.get_global_transform().basis + var m_dir: Vector3 = -move_axis.x * dir.z + move_axis.y * dir.x + m_dir = m_dir.normalized() + add_central_force(swim_speed*m_dir) + if jumping: + add_central_force(Vector3.UP*weight*0.5) + +func enter_water(): + in_water = true + +func exit_water(): + in_water = false remotesync func damage(dmg_amt, type, shooter, extra = ""): health -= dmg_amt if health <= 0 and is_network_master(): + if shooter[0] != get_network_master(): world.rpc_id(shooter[0], "game_killsound") if get_network_master() == 1: - world._call_on_server("_character_death", {"killer" : shooter, "victim_mp_id" : get_network_master(), "victim" : name, "extra" : extra}) + world._call_on_server("_character_death", {"killer_id" : shooter[0], "killer" : shooter[1], "victim_mp_id" : get_network_master(), "victim" : name, "extra" : extra}) else: - world.rpc_id(1, "_call_on_server", "_character_death", {"killer" : shooter, "victim_mp_id" : get_network_master(), "victim" : name, "extra" : extra}) - + world.rpc_id(1, "_call_on_server", "_character_death", {"killer_id" : shooter[0], "killer" : shooter[1], "victim_mp_id" : get_network_master(), "victim" : name, "extra" : extra}) + elif is_network_master(): + if shooter[0] != get_network_master(): world.rpc_id(shooter[0], "game_hitsound") -remotesync func remove_dead(): +remotesync func remove_dead_character(): deselect_character() queue_free() @@ -234,3 +267,5 @@ func camera_rotation() -> void: temp_rot.x = clamp(temp_rot.x, -90, 90) cam.rotation_degrees = temp_rot +remotesync func net_apply_impulse(impulse_v): + apply_central_impulse(impulse_v) |
