From 4068e66756966983973ab20b68ec5382e398548b Mon Sep 17 00:00:00 2001 From: Anson Bridges Date: Tue, 13 Sep 2022 18:15:01 -0400 Subject: incomplete airplane implementation (needs addl. network sync) --- godot/scripts/vehicles/Airplane.gd | 109 ++++++++++++++++++++++++++----------- 1 file changed, 78 insertions(+), 31 deletions(-) (limited to 'godot/scripts/vehicles/Airplane.gd') diff --git a/godot/scripts/vehicles/Airplane.gd b/godot/scripts/vehicles/Airplane.gd index cf3c21a..aa1f492 100644 --- a/godot/scripts/vehicles/Airplane.gd +++ b/godot/scripts/vehicles/Airplane.gd @@ -2,8 +2,10 @@ extends VehicleBody var countdown var boosting = false +var boost_pressed = false const booster_force = 2500 const brake_force = 50 +var brake_control : float = 0.0 const boost_length = 8 const turn_constant = 0.45 const roll_constant = 0.5 @@ -20,35 +22,94 @@ var vel_slow var parentvel = [Vector3.ZERO, Vector3.ZERO] export var roll_curve : CurveTexture +#net machine variables +var in_use : bool = false +var user = null +var world = null +func get_init_info(): + return {"." : 0} + +func mp_init(init_info): + pass + +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) + +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#user.add_collision_exception_with(self) + #user.global_transform.origin = $Cockpit.global_transform.origin + +func on_no_control(): + pass#user.remove_collision_exception_with(self) + #user.global_transform.origin = $PilotExit.global_transform.origin + +func attack1(): + pass + +func attack2(): + pass + +func direction_input(fwd,bwd,left,right,_left2,_right2): + roll_dir = left - right + pitch_dir = bwd - fwd + +func misc_input(_ctrl,space,shift): + brake_control = shift + if space > 0.1 and !boosting: #if boost is pressed + trigger_boost() + +func mouse_input(_m1,_m3,_m2): #used for long-press actions + pass func _ready(): + world = get_tree().get_root().find_node("GAMEWORLD", true, false) countdown = boost_length brake = 5 - set_network_master(-1) - set_physics_process(true) - #mode = RigidBody.MODE_STATIC func trigger_boost(): - if not boosting: - print("boosting") - boosting = true + print("boosting") + boosting = true + $"%RocketTrail".emitting = true func _process(delta): if is_network_master(): if boosting and countdown <= 0: + $"%RocketTrail".emitting = false print("stopped boosting") boosting = false countdown = boost_length - if Input.is_action_just_pressed("boost"): - trigger_boost() - roll_dir = Input.get_action_strength("roll_left") - Input.get_action_strength("roll_right") - pitch_dir = Input.get_action_strength("pitch_up") - Input.get_action_strength("pitch_down") - $rearwheel.brake = lerp($rearwheel.brake, Input.get_action_strength("brake")*brake_force, 0.05) - func _physics_process(delta): + if in_use and user.get_network_master() == world.client_id: + user.global_transform.origin = $Cockpit.global_transform.origin + user.global_transform.basis = $Cockpit.global_transform.basis.orthonormalized() if is_network_master(): + $rearwheel.brake = lerp($rearwheel.brake, brake_force*brake_control, 0.05) v_angle = atan2(global_transform.basis.x.y,sqrt(global_transform.basis.x.z*global_transform.basis.x.z + global_transform.basis.x.x*global_transform.basis.x.x)) roll_angle = global_transform.basis.x.cross(Vector3.UP).angle_to($rightaileron.global_transform.origin-$wingcenter.global_transform.origin) if $rightaileron.global_transform.origin.y < $leftaileron.global_transform.origin.y: @@ -61,25 +122,11 @@ func _physics_process(delta): #slow plane by drag and gravity if linear_velocity.length() > 16 and linear_velocity.angle_to(global_transform.basis.x) < 0.25: var v_dir = 1 if linear_velocity.y > 0 else -1 - vel_slow = v_dir*sqrt(abs(2*9.8*linear_velocity.y*delta)) + drag_constant + Input.get_action_strength("brake")*5 + vel_slow = v_dir*sqrt(abs(2*9.8*linear_velocity.y*delta)) + drag_constant + brake_control*5 add_force(-1*linear_velocity.normalized()*vel_slow*mass,Vector3.ZERO) - - - #pass #"inherit" linear and angular velocity of what plane is landed on - func _integrate_forces(state): if is_network_master(): - #linear_velocity -= parentvel[0]; angular_velocity -= parentvel[1] -# if $rightwheel.get_rpm() < 60 and $rightwheel.is_in_contact(): -# if $rightwheel/Area.get_overlapping_bodies()[0].has_method("get_linear_velocity"): -# var ulv = $rightwheel/Area.get_overlapping_bodies()[0].linear_velocity -# var uav = $rightwheel/Area.get_overlapping_bodies()[0].angular_velocity -# var upos = $rightwheel/Area.get_overlapping_bodies()[0].global_transform.origin -# ulv += (global_transform.origin - upos).rotated(uav.normalized(),uav.length()*state.get_step()) + global_transform.origin -# parentvel = [ulv,uav] -# else: -# parentvel = [Vector3.ZERO, Vector3.ZERO] if linear_velocity.length() > 25: #linear_velocity = linear_velocity.normalized()*(linear_velocity.length()-vel_slow) var ang_vel_target = Vector3.ZERO @@ -91,7 +138,8 @@ func _integrate_forces(state): #roll (rotate around lengthwise axis) var is_returning = 3 if roll_dir == 0 else 1 #return to flat quicker - ang_vel_target -= roll_constant*is_returning*(roll_dir*roll_curve.curve.interpolate(roll_angle_max-roll_angle))*global_transform.basis.x + print(roll_constant*is_returning*(roll_dir*roll_curve.curve.interpolate((roll_angle_max-roll_angle)/roll_angle_max))*global_transform.basis.x) + ang_vel_target += roll_constant*is_returning*(roll_dir*roll_curve.curve.interpolate(roll_angle_max-roll_angle))*global_transform.basis.x #turn (based on how much the plane is rolled (need to add ang_vel_target += turn_constant*Vector3.UP*roll_angle @@ -101,6 +149,5 @@ func _integrate_forces(state): if linear_velocity.angle_to(global_transform.basis.x) < 0.25: set_linear_velocity(get_linear_velocity().slerp(transform.basis.x*linear_velocity.length(),0.1)) #linear_velocity += parentvel[0]; angular_velocity += parentvel[1] - rpc("_set_position", global_transform, linear_velocity) - elif get_network_master() == -1 and get_tree().get_network_unique_id() == 1: - rpc("_set_position", global_transform, linear_velocity) + rpc("update_phys_transform", transform, linear_velocity, angular_velocity) + -- cgit v1.2.3