diff options
Diffstat (limited to 'src/PlayerController.gd')
| -rw-r--r-- | src/PlayerController.gd | 297 |
1 files changed, 0 insertions, 297 deletions
diff --git a/src/PlayerController.gd b/src/PlayerController.gd deleted file mode 100644 index 241cbe0..0000000 --- a/src/PlayerController.gd +++ /dev/null @@ -1,297 +0,0 @@ -extends RigidBody - -# Game -export var team: String = "RED" -export var health: int = 100 -var weapon: Node = null -var world: Spatial = null - -# Camera -export var mouse_sensitivity:float = 12.0 -export var FOV:float = 90.0 -var mouse_axis: Vector2 = Vector2.ZERO -onready var head: Spatial = $Neck/Head -onready var neck: Spatial = $Neck - -# Move -var velocity := Vector3() -var direction := Vector3() -var move_axis := Vector2() -var floorspeed := Vector3() -var jumping:bool = false -var can_jump:bool = true -onready var nav: NavigationAgent = $NavigationAgent - -# Walk -const FLOOR_MAX_ANGLE: float = deg2rad(46.0) -export var jump_height: float = 300.0 -var in_water : bool = false -var swim_speed : float = 450.0 -var climb_speed : float = 5.0 - -# Control -var controlling_machine: bool = false #whether character is riding/controlling something -var machine : RigidBody = null -export var is_player: bool = false #whether character is currently controlled by a player -var ladder_m: Spatial = null - -#physics -var player_state: PhysicsDirectBodyState = null -var is_on_floor:bool -var floor_normal : Vector3 = Vector3.UP -var acceleration:float = 80.0 -export var walk_speed:float = 5.0 -var c_friction:float = 4.0 -var air_control:float = 0.3 - -# Called when the node enters the scene tree -func _ready() -> void: - weapon = preload("res://scenes/weapons/w_Rockets.tscn").instance() - add_child(weapon) - world = get_tree().get_root().get_node("GAMEWORLD") - - $"%UseRay".add_exception(self) - $"%MeleeRay".add_exception(self) - $"%UseRay".add_exception($AreaDetect) - $"%MeleeRay".add_exception($AreaDetect) - -func get_init_info() -> Dictionary: - return {"linear_velocity" : linear_velocity, "angular_velocity" : angular_velocity, "controlling_machine" : controlling_machine, "team" : team, "health" : health, "nametag" : $Nametag.text} - -func mp_init(init_info: Dictionary): - for variable in init_info.keys(): - set(variable, init_info[variable]) - $Nametag.text = init_info["nametag"] - -remote func set_phys_transform(trfrm: Transform, lvel: Vector3): - transform = trfrm - linear_velocity = 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() - - if controlling_machine: - if Input.is_action_just_pressed("fire"): - machine.attack1() - if Input.is_action_just_pressed("fire2"): - 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")) - machine.misc_input(Input.get_action_strength("move_duck"),Input.get_action_strength("move_jump"),Input.get_action_strength("move_walk")) - machine.mouse_input(Input.get_action_strength("fire"), Input.get_action_strength("fire3"),Input.get_action_strength("fire2")) - 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") - move_axis.y = Input.get_action_strength("move_right") - Input.get_action_strength("move_left") - - -func initiate_use(): - if controlling_machine: - machine.relinquish_control() - return - if ladder_m != null: - leave_ladder() - return - if $"%UseRay".is_colliding(): - var area_c = $"%UseRay".get_collider() - match area_c.name: - "SteerArea": - world.rpc_id(1, "_call_on_server", "_client_request_control_vehicle", {"id" : world.client_id, "machine_path" : area_c.get_parent().get_path(), "char_name" : name}) - "LadderArea": - mount_ladder(area_c.get_parent()) - "TugArea": - pass - "PickupArea": - pass - _: - pass - -remotesync func set_net_owner(owner_id: int): - $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 - world.cam.attach(self, "FIRSTPERSON", "./Neck/Head") - else: - $Nametag.visible = true - is_player = false - world.get_node("HUD").update_characters() - -func deselect_character(): - if is_network_master(): - world.player_char = null - if world.client_id != 1: world.cam.attach(world, "STATIC", "./DEFAULTCAM") - rpc("set_net_owner", 1) - -func take_control_of_machine(slave_machine: RigidBody): - machine = slave_machine - controlling_machine = true - -func lose_machine(): - if is_network_master(): world.cam.attach(self, "FIRSTPERSON", "./Neck/Head") - controlling_machine = false - machine = null - -# Called every physics tick. 'delta' is constant -func _physics_process(delta: float) -> void: - if is_network_master(): - if ladder_m != null: - climb_ladder(delta) - elif !on_floor_test() and in_water: - swim(delta) - else: - walk(delta) - is_on_floor = false #reset whether is on floor in between frames - -# called each physics frame -func on_floor_test() -> bool: - if $Feet.is_colliding(): - is_on_floor = true - floor_normal = Vector3.UP - floorspeed = $Feet.get_collider().get_linear_velocity() if $Feet.get_collider().has_method("get_linear_velocity") else Vector3.ZERO - 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: - floor_normal = player_state.get_contact_local_normal(i) - is_on_floor = true - return true - return false - -#modify simulated physics results -func _integrate_forces(state: PhysicsDirectBodyState) -> void: - if !is_network_master(): - return - player_state = state - velocity = state.get_linear_velocity() - $normal_vis.look_at($normal_vis.global_transform.origin + global_transform.basis.z, floor_normal) - 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 - - rpc("set_phys_transform", transform, linear_velocity) - if global_transform.origin.y < -30: - rpc("damage", 500000, "drown", [1, "Davy Jones"]) - -func walk(_delta: float) -> void: - # Input - direction = Vector3() - var aim: Basis = head.get_global_transform().basis - direction += -move_axis.x * aim.z + move_axis.y * aim.x - direction.y = 0 - direction = direction.normalized() - - if floor_normal != Vector3.UP: direction = direction.rotated(floor_normal.cross(Vector3.UP).normalized(), Vector3.UP.angle_to(floor_normal)) - - # Jump - if is_player and jumping and is_on_floor and can_jump: - jump() - - #max walk speed - var _speed = walk_speed - var _temp_accel: float = acceleration - var _cspeed = sqrt(pow(velocity.x-floorspeed.x,2)+pow(velocity.z-floorspeed.z,2)) - - if not is_on_floor: - _temp_accel *= air_control - - 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*_cspeed*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 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: float): - #drag and buoyancy - add_central_force(Vector3.UP*weight*1.0) - add_central_force(-1*linear_velocity*100) - #controls - var dir: Basis = head.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 - -func mount_ladder(target_ladder: Spatial): - var ladder_tracker = Spatial.new() - ladder_tracker.name = name - target_ladder.add_child(ladder_tracker) - ladder_tracker.transform = target_ladder.bottom.transform - - ladder_tracker.global_transform.origin = target_ladder.get_nearest_point_to_route(global_transform.origin) - look_at(global_transform.origin + target_ladder.global_transform.basis.x, target_ladder.global_transform.basis.y) - - ladder_m = ladder_tracker - global_transform.origin = ladder_m.global_transform.origin - global_transform.basis = ladder_m.global_transform.basis.orthonormalized() - linear_velocity = Vector3.ZERO - set_gravity_scale(0.0) - -#called each frame while climbing ladder -func climb_ladder(delta: float): - 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 - global_transform.origin = ladder_m.global_transform.origin - global_transform.basis = ladder_m.global_transform.basis.orthonormalized() - -func leave_ladder(): - if (ladder_m.get_parent().top.global_transform.origin - global_transform.origin).length_squared() < 0.01: - apply_central_impulse(-400*ladder_m.global_transform.basis.z) - global_transform.basis = world.global_transform.basis - set_gravity_scale(1.0) - ladder_m.queue_free() - ladder_m = null - -remotesync func damage(dmg_amt: int, _type: String, shooter: Array, extra: String): - health -= dmg_amt - if health <= 0 and is_network_master(): - if shooter[0] != get_network_master() and shooter[0] != 1: world.rpc_id(shooter[0], "game_killsound") - if get_network_master() == 1: - 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_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() and shooter[0] != 1: world.rpc_id(shooter[0], "game_hitsound") - -remotesync func remove_dead_character(): - if is_network_master() and machine != null: - machine.relinquish_control() - deselect_character() - queue_free() - -remotesync func net_apply_impulse(impulse_v: Vector3): - apply_central_impulse(impulse_v) |
