diff --git a/scripts/player.gd b/scripts/player.gd index 2adddfa..8d18ca2 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -3,13 +3,20 @@ extends RigidBody +signal spawn + +# Set by lobby. Contains player metadata (hero, nickname, etc) +var player_info + +# Basic movement settings +# These are all public out here because they are customized by heroes + # Walking speed and jumping height are defined later. var walk_speed = 0.8 # Actually acceleration; m/s/s var jump_speed = 5 # m/s var air_accel = .1 # m/s/s var floor_friction = 1-0.08 var air_friction = 1-0.03 -var player_info # Set by lobby var walk_speed_build = 0.006 # `walk_speed` per `switch_charge` var air_speed_build = 0.006 # `air_accel` per `switch_charge` @@ -17,32 +24,22 @@ var air_speed_build = 0.006 # `air_accel` per `switch_charge` sync var switch_charge = 0 var switch_charge_cap = 200 # While switching is always at 100, things like speed boost might go higher! var movement_charge = 0.15 # In percent per meter (except when heroes change that) + +# Nodes onready var switch_text = get_node("MasterOnly/ChargeBar/ChargeText") onready var switch_bar = get_node("MasterOnly/ChargeBar") onready var switch_bar_extra = get_node("MasterOnly/ChargeBar/Extra") onready var switch_hero_action = get_node("MasterOnly/SwitchHero") +onready var tp_camera = get_node("TPCamera") +onready var master_only = get_node("MasterOnly") +onready var debug_node = get_node("/root/Level/Debug") -var fall_height = -400 # This is essentially the respawn timer -var switch_height = -150 # At this point, stop adding to switch_charge. This makes falls not charge you too much - -var debug_node var recording +var ai_instanced = false -slave var slave_transform = Basis() -slave var slave_lin_v = Vector3() -slave var slave_ang_v = Vector3() - -var tp_camera = "TPCamera" -var master_only = "MasterOnly" - -var master_player var friend_color = Color("#4ab0e5") # Blue var enemy_color = Color("#f04273") # Red - -var ai_instanced = false - -signal spawn - +# These meshes get colored with friendliness var colored_meshes = [ "Yaw/MainMesh", "Yaw/Pitch/RotatedHead", @@ -51,11 +48,10 @@ var colored_meshes = [ func _ready(): set_process_input(true) - debug_node = get_node("/root/Level/Debug") if is_network_master(): get_node("TPCamera/Camera/Ray").add_exception(self) - get_node(tp_camera).set_enabled(true) - get_node(tp_camera).cam_view_sensitivity = 0.05 + tp_camera.set_enabled(true) + tp_camera.cam_view_sensitivity = 0.05 spawn() if "is_ai" in player_info and player_info.is_ai and not ai_instanced: add_child(preload("res://scenes/ai.tscn").instance()) @@ -63,7 +59,7 @@ func _ready(): else: get_node("PlayerName").set_text(player_info.username) # Remove HUD - remove_child(get_node(master_only)) + remove_child(master_only) func _input(event): if is_network_master(): @@ -80,10 +76,18 @@ func _input(event): func _process(delta): # All player code not caused by input, and not causing movement if is_network_master(): + + # Check falling (cancel charge and respawn) + var fall_height = -400 # This is essentially the respawn timer + var switch_height = -150 # At this point, stop adding to switch_charge. This makes falls not charge you too much var vel = get_linear_velocity() if translation.y < switch_height: vel.y = 0 # Don't gain charge from falling when below switch_height build_charge(movement_charge * vel.length() * delta) + if get_translation().y < fall_height: + rpc("spawn") + + # Update switch charge GUI switch_text.set_text("%d%%" % int(switch_charge)) # We truncate, rather than round, so that switch is displayed AT 100% if switch_charge >= 100: switch_hero_action.show() @@ -94,15 +98,13 @@ func _process(delta): switch_charge = switch_charge_cap switch_bar.value = switch_charge switch_bar_extra.value = switch_charge - 100 + # ... And it's network value + rset_unreliable("switch_charge", switch_charge) - if get_translation().y < fall_height: - rpc("spawn") - + # AI recording if "record" in player_info: recording.time += delta - rset_unreliable("switch_charge", switch_charge) - func _integrate_forces(state): if is_network_master(): control_player(state) @@ -154,8 +156,8 @@ sync func spawn(): set_transform(Basis()) set_translation(placement) set_linear_velocity(Vector3()) - get_node(tp_camera).cam_yaw = 0 - get_node(tp_camera).cam_pitch = 0 + tp_camera.cam_yaw = 0 + tp_camera.cam_pitch = 0 func event_to_obj(event): var d = {} @@ -176,7 +178,7 @@ func event_to_obj(event): return d func begin(): - master_player = util.get_master_player() + var master_player = util.get_master_player() # Set color to blue (teammate) or red (enemy) var color if master_player and master_player.player_info.is_right_team == player_info.is_right_team: @@ -201,8 +203,8 @@ func toggle_mouse_capture(): # Update visual yaw + pitch components to match camera func set_rotation(): - get_node("Yaw").set_rotation(Vector3(0, deg2rad(get_node(tp_camera).cam_yaw), 0)) - get_node("Yaw/Pitch").set_rotation(Vector3(deg2rad(-get_node(tp_camera).cam_pitch), 0, 0)) + get_node("Yaw").set_rotation(Vector3(0, deg2rad(tp_camera.cam_yaw), 0)) + get_node("Yaw/Pitch").set_rotation(Vector3(deg2rad(-tp_camera.cam_pitch), 0, 0)) func record_status(status): if "record" in player_info: @@ -214,16 +216,16 @@ slave func set_status(s): set_transform(s[0]) set_linear_velocity(s[1]) set_angular_velocity(s[2]) - get_node(tp_camera).cam_yaw = s[3] - get_node(tp_camera).cam_pitch = s[4] + tp_camera.cam_yaw = s[3] + tp_camera.cam_pitch = s[4] func get_status(): return [ get_transform(), get_linear_velocity(), get_angular_velocity(), - get_node(tp_camera).cam_yaw, - get_node(tp_camera).cam_pitch, + tp_camera.cam_yaw, + tp_camera.cam_pitch, ] func control_player(state):