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/GameBase.gd | 2 + godot/scripts/World.gd | 37 +++++--- godot/scripts/ballistics/Cannonball.gd | 2 +- godot/scripts/cameras/PlayerCamGDS.gd | 79 ++++++++++++++++ godot/scripts/cameras/plane_armcam.gd | 6 -- godot/scripts/cameras/player_firstperson.gd | 33 ------- godot/scripts/characters/player_controller_new.gd | 67 +++++-------- godot/scripts/machines/Cannon.gd | 10 +- godot/scripts/machines/NetworkedMachineGDS.gd | 7 ++ godot/scripts/vehicles/Airplane.gd | 109 ++++++++++++++++------ godot/scripts/vehicles/Gunboat.gd | 7 +- 11 files changed, 227 insertions(+), 132 deletions(-) create mode 100644 godot/scripts/cameras/PlayerCamGDS.gd delete mode 100644 godot/scripts/cameras/player_firstperson.gd (limited to 'godot/scripts') diff --git a/godot/scripts/GameBase.gd b/godot/scripts/GameBase.gd index 0df53dd..be430d4 100644 --- a/godot/scripts/GameBase.gd +++ b/godot/scripts/GameBase.gd @@ -8,6 +8,7 @@ var local_server_tree = null var player_name : String var player_team : String var player_char = null +onready var cam = $PLAYERCAM var players_info = {} #dictionary of id : name, team, ping, etc. @@ -28,6 +29,7 @@ remote func set_up_server_info(info): $HUD/ServerJoinMenu/MOTD.text = info["MOTD"] $HUD/ServerJoinMenu/ServerName.text = info["server_name"] $DEFAULTCAM.transform = info["cam_pos"] + cam.attach($DEFAULTCAM, "STATIC") rpc_id(1, "_call_on_server", "_client_connection_confirmed", {"id" : client_id, "username" : player_name}) diff --git a/godot/scripts/World.gd b/godot/scripts/World.gd index fa5a306..7e60423 100644 --- a/godot/scripts/World.gd +++ b/godot/scripts/World.gd @@ -5,19 +5,25 @@ var m = SpatialMaterial.new() var winddir = Vector3(1,0,0) onready var pathfinder = get_node("PLAYERS/Player2") var path = [] -var map_rid +var map_rids var client_id var player_char var players_info = {} +var WORLD_MAP_RID : RID # Called when the node enters the scene tree for the first time. func _ready(): - map_rid = NavigationServer.get_maps() - for rid in map_rid: - NavigationServer.map_set_edge_connection_margin(rid,1) + map_rids = NavigationServer.get_maps() + for rid in map_rids: + NavigationServer.map_set_edge_connection_margin(rid,1.5) m.flags_unshaded = true m.flags_use_point_size = true m.albedo_color = Color.white + + #merge all nav meshes onto the main map + yield(get_tree().create_timer(1.0), "timeout") + WORLD_MAP_RID = get_world().get_navigation_map() + find_path() remotesync func update_players_info(info): players_info = info @@ -26,13 +32,22 @@ remote func _call_on_server(function, arguments): print('Remote server call: ' + function) $Server.call(function, arguments) -func find_path(to): - pathfinder.nav.set_target_location(to) - var t_path = pathfinder.nav.get_next_location() - pathfinder.should_move = true - t_path = pathfinder.nav.get_nav_path() - print(to) - print(t_path) +func find_path(): + var start_pos = $START.global_transform.origin + var end_pos = $END.global_transform.origin + var t_path = NavigationServer.map_get_path(WORLD_MAP_RID, start_pos, end_pos, true) + var path_end = t_path[len(t_path)-1] + #is path end near desired end + #if not, is the end point in an unreachable region? + for rid in map_rids: + print("map " + str(rid.get_id())) + for region_rid in NavigationServer.map_get_regions(rid): + print("region " + str(region_rid.get_id())) + if NavigationServer.region_owns_point(region_rid, end_pos): + print("owns target point") + if NavigationServer.region_owns_point(region_rid, path_end): + print("owns end point") + print( (end_pos - t_path[len(t_path)-1]).length() ) draw_path(t_path) pass diff --git a/godot/scripts/ballistics/Cannonball.gd b/godot/scripts/ballistics/Cannonball.gd index 14de00c..d1937f4 100644 --- a/godot/scripts/ballistics/Cannonball.gd +++ b/godot/scripts/ballistics/Cannonball.gd @@ -13,5 +13,5 @@ func get_init_info(): func _on_collision(body): if oldvel.length() > 20 and !damage_exceptions.has(body) and body.has_method("damage"): - body.rpc("damage", oldvel.length(), "blunt", shooter, "using 'cannon'") + body.rpc("damage", oldvel.length(), "blunt", [shooter_id, shooter], "using 'cannon'") damage_exceptions.append(body) diff --git a/godot/scripts/cameras/PlayerCamGDS.gd b/godot/scripts/cameras/PlayerCamGDS.gd new file mode 100644 index 0000000..ec46cf8 --- /dev/null +++ b/godot/scripts/cameras/PlayerCamGDS.gd @@ -0,0 +1,79 @@ +extends ClippedCamera + +var _modes = ["STATIC", "FIRSTPERSON", "THIRDPERSON", "ARM", "FREECAM"] +var mode = "STATIC" #STATIC, FIRSTPERSON, THIRDPERSON, ARM, FREECAM + +#first/third person variables +var head : Spatial = null +var neck : Spatial = null +var player : RigidBody = null + +#third person/arm variables +var arm : SpringArm = null + +var mouse_axis := Vector2() +var mouse_sensitivity = 12.0 + +func _ready(): + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + current = true + +func _input(event): + if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: + mouse_axis = event.relative + match mode: + "FIRSTPERSON": + mouse_firstperson() + "THIRDPERSON": + mouse_thirdperson() + "STATIC": + pass + "ARM": + mouse_arm() + "FREECAM": + mouse_freecam() + _: + pass + +func attach(new_parent: Node, c_mode, extra_path = "."): + if get_parent(): + get_parent().remove_child(self) + if c_mode in _modes: + mode = c_mode + if mode == "FIRSTPERSON": + head = new_parent.head; neck = new_parent.neck; + arm = null; + elif mode == "THIRDPERSON": + head = new_parent.head; neck = new_parent.neck; + arm = new_parent.arm + elif mode == "ARM": + head = null; neck = null; + arm = new_parent.arm + else: + head = null; neck = null; arm = null; + new_parent.get_node(extra_path).add_child(self) + transform = Transform.IDENTITY + +func mouse_firstperson() -> void: + if mouse_axis.length_squared() > 0: + var horizontal: float = -mouse_axis.x * (mouse_sensitivity / 100) + var vertical: float = -mouse_axis.y * (mouse_sensitivity / 100) + + neck.rotate_y(deg2rad(horizontal)) + head.rotate_x(deg2rad(vertical)) + + #vertical clamp + head.rotation_degrees.x = clamp(head.rotation_degrees.x, -90, 90) + +func mouse_thirdperson() -> void: + arm.rotation_degrees.x = clamp(rotation_degrees.x-mouse_axis.y*(mouse_sensitivity / 100),-90,90) + arm.rotation_degrees.y -= mouse_axis.x*(mouse_sensitivity / 100) + head.rotation_degrees.x = arm.rotation_degrees.x + neck.rotation_degrees.y = arm.rotation_degrees.y + +func mouse_arm() -> void: + arm.rotation_degrees.x = clamp(rotation_degrees.x-mouse_axis.y*(mouse_sensitivity / 100),-70,70) + arm.rotation_degrees.y -= mouse_axis.x*(mouse_sensitivity / 100) + +func mouse_freecam() -> void: + pass diff --git a/godot/scripts/cameras/plane_armcam.gd b/godot/scripts/cameras/plane_armcam.gd index edb0284..68b4852 100644 --- a/godot/scripts/cameras/plane_armcam.gd +++ b/godot/scripts/cameras/plane_armcam.gd @@ -14,12 +14,6 @@ func _ready(): func _input(event): if $ClippedCamera.current: - if Input.is_action_just_pressed("menu"): #toggle mouse capture on esc - if Input.get_mouse_mode() == Input.MOUSE_MODE_VISIBLE: - Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) - else: - Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) - if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: if event is InputEventMouseMotion: rotation_degrees.x = clamp(rotation_degrees.x-event.relative.y*0.1,-70,70) diff --git a/godot/scripts/cameras/player_firstperson.gd b/godot/scripts/cameras/player_firstperson.gd deleted file mode 100644 index ace49e6..0000000 --- a/godot/scripts/cameras/player_firstperson.gd +++ /dev/null @@ -1,33 +0,0 @@ -extends Camera - - -var mouse_axis := Vector2() -var mouse_sensitivity = 12.0 - -func _ready(): - Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) - current = false - - -func _input(event): - if current: - if Input.is_action_just_pressed("menu"): #toggle mouse capture on esc - if Input.get_mouse_mode() == Input.MOUSE_MODE_VISIBLE: - Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) - else: - Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) - if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: - mouse_axis = event.relative - if mouse_axis.length() > 0: - var horizontal: float = -mouse_axis.x * (mouse_sensitivity / 100) - var vertical: float = -mouse_axis.y * (mouse_sensitivity / 100) - - mouse_axis = Vector2() - - get_parent().rotate_y(deg2rad(horizontal)) - rotate_x(deg2rad(vertical)) - - var temp_rot: Vector3 = rotation_degrees - temp_rot.x = clamp(temp_rot.x, -90, 90) - get_parent().animationcontroller.rpc("lean",-1*temp_rot.x/90) - rotation_degrees = temp_rot diff --git a/godot/scripts/characters/player_controller_new.gd b/godot/scripts/characters/player_controller_new.gd index 6df88f0..deaea79 100644 --- a/godot/scripts/characters/player_controller_new.gd +++ b/godot/scripts/characters/player_controller_new.gd @@ -10,8 +10,8 @@ var world export(float) var mouse_sensitivity = 12.0 export(float) var FOV = 90.0 var mouse_axis := Vector2() -onready var head: Spatial = $Head -onready var cam: Camera = $Head/Camera +onready var head: Spatial = $Neck/Head +onready var neck: Spatial = $Neck # Move var velocity := Vector3() @@ -38,6 +38,7 @@ var ladder_m = null #physics var player_state : PhysicsDirectBodyState var is_on_floor:bool +var floor_normal : Vector3 = Vector3.UP var acceleration = 80.0 export(int) var walk_speed = 5 var c_friction = 4.0 @@ -48,15 +49,11 @@ func _ready() -> void: weapon = preload("res://scenes/weapons/w_Rockets.tscn").instance() add_child(weapon) 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/UseRay.add_exception($AreaDetect) - $Head/Camera/MeleeRay.add_exception($AreaDetect) - Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) - cam.fov = FOV + $"%UseRay".add_exception(self) + $"%MeleeRay".add_exception(self) + $"%UseRay".add_exception($AreaDetect) + $"%MeleeRay".add_exception($AreaDetect) func get_init_info(): return {"linear_velocity" : linear_velocity, "angular_velocity" : angular_velocity, "controlling_machine" : controlling_machine, "team" : team, "health" : health, "nametag" : $Nametag.text} @@ -82,6 +79,8 @@ func _process(_delta: float) -> void: 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"): @@ -97,8 +96,8 @@ func initiate_use(): if ladder_m != null: leave_ladder() return - if $Head/Camera/UseRay.is_colliding(): - var area_c = $Head/Camera/UseRay.get_collider() + 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}) @@ -121,17 +120,16 @@ remotesync func set_net_owner(owner_id): $Nametag.visible = false world.player_char = self is_player = true - cam.current = true + world.cam.attach(self, "FIRSTPERSON", "./Neck/Head") else: $Nametag.visible = true - cam.current = false is_player = false world.get_node("HUD").update_characters() func deselect_character(): if is_network_master(): world.player_char = null - world.get_node("DEFAULTCAM").current = true + if world.client_id != 1: world.cam.attach(world, "STATIC", "./DEFAULTCAM") rpc("set_net_owner", 1) func take_control_of_machine(slave_machine): @@ -139,8 +137,7 @@ func take_control_of_machine(slave_machine): controlling_machine = true func lose_machine(): - if is_player: - cam.current = true + if is_network_master(): world.cam.attach(self, "FIRSTPERSON", "./Neck/Head") controlling_machine = false machine = null @@ -153,19 +150,20 @@ func _physics_process(delta: float) -> void: 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 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 @@ -174,6 +172,7 @@ func on_floor_test() -> bool: func _integrate_forces(state) -> void: 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: @@ -181,13 +180,8 @@ func _integrate_forces(state) -> void: break if i == player_state.get_contact_count() - 1: friction = 1 - -# on input event -func _input(event: InputEvent) -> void: - if is_player: - if event is InputEventMouseMotion: - mouse_axis = event.relative - camera_rotation() + if is_network_master(): + rpc("set_phys_transform", transform, linear_velocity) func walk(_delta:float) -> void: # Input @@ -197,6 +191,8 @@ func walk(_delta:float) -> void: 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() @@ -212,7 +208,7 @@ 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 + 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: @@ -231,7 +227,7 @@ func swim(_delta): 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 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) @@ -293,22 +289,5 @@ remotesync func remove_dead_character(): deselect_character() queue_free() -func camera_rotation() -> void: - if Input.get_mouse_mode() != Input.MOUSE_MODE_CAPTURED: - return - if mouse_axis.length() > 0: - var horizontal: float = -mouse_axis.x * (mouse_sensitivity / 100) - var vertical: float = -mouse_axis.y * (mouse_sensitivity / 100) - - mouse_axis = Vector2() - - head.rotate_y(deg2rad(horizontal)) - cam.rotate_x(deg2rad(vertical)) - - # Clamp mouse rotation - var temp_rot: Vector3 = cam.rotation_degrees - 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) diff --git a/godot/scripts/machines/Cannon.gd b/godot/scripts/machines/Cannon.gd index 15807bf..437a20b 100644 --- a/godot/scripts/machines/Cannon.gd +++ b/godot/scripts/machines/Cannon.gd @@ -1,4 +1,4 @@ -extends "res://bin/networked_machine.gdns" +extends "res://scripts/machines/NetworkedMachineGDS.gd" var world_ballistics = null @@ -33,13 +33,13 @@ func mp_init(init_info): # Called when the node enters the scene tree for the first time. func _ready(): - if get_parent().name != "MACHINES": + if get_parent().name != "MACHINES": #if cannon is aboard ship add_collision_exception_with(get_parent()) mode = RigidBody.MODE_STATIC world_ballistics = world.get_node("BALLISTICS") func on_new_control(): - $YawJoint/PitchJoint/Camera.current = true + if is_network_master(): world.cam.attach(self, "STATIC", "./YawJoint/PitchJoint/CameraPoint") func _physics_process(delta): if cooldown > 0: @@ -72,8 +72,10 @@ remotesync func fire(): add_collision_exception_with(cball) cball.global_transform.origin = muzzle.global_transform.origin cball.linear_velocity = muzzle.global_transform.basis.x*ball_speed + cball.shooter = user.name + " (" + world.players_info[user.get_network_master()][0] + ")" + cball.shooter_id = user.get_network_master() cooldown = fire_rate if mode == RigidBody.MODE_STATIC: get_parent().apply_impulse($YawJoint/PitchJoint.global_transform.origin - get_parent().global_transform.origin, -5*cball.mass*ball_speed*muzzle.global_transform.basis.x) else: - apply_impulse($YawJoint/PitchJoint.global_transform.origin - global_transform.origin, -1*cball.mass*ball_speed*muzzle.global_transform.basis.x) + if is_network_master(): apply_impulse($YawJoint/PitchJoint.global_transform.origin - global_transform.origin, -1*cball.mass*ball_speed*muzzle.global_transform.basis.x) diff --git a/godot/scripts/machines/NetworkedMachineGDS.gd b/godot/scripts/machines/NetworkedMachineGDS.gd index 5ce5cbe..3f2d420 100644 --- a/godot/scripts/machines/NetworkedMachineGDS.gd +++ b/godot/scripts/machines/NetworkedMachineGDS.gd @@ -5,6 +5,7 @@ var user = null var world = null func _ready(): + print("net machine loads world") world = get_tree().get_root().find_node("GAMEWORLD", true, false) remote func update_phys_transform(t, lv, av): @@ -52,3 +53,9 @@ func attack2(): func direction_input(_fwd,_bwd,_left,_right,_left2,_right2): pass + +func misc_input(_ctrl,_space,_shift): + pass + +func mouse_input(_m1,_m3,_m2): #used for long-press actions + pass 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) + diff --git a/godot/scripts/vehicles/Gunboat.gd b/godot/scripts/vehicles/Gunboat.gd index e1a61c5..8c3f54e 100644 --- a/godot/scripts/vehicles/Gunboat.gd +++ b/godot/scripts/vehicles/Gunboat.gd @@ -1,4 +1,4 @@ -extends "res://scripts/machines/NetworkedMachine.gd" +extends "res://scripts/machines/NetworkedMachineGDS.gd" export var team = 0 @@ -16,11 +16,14 @@ export var rudder_speed = 25 export var rudder_constant = 1800 const RUDDER_MAX = 60 -const health_max = 1000 +const health_max = 3000 var health = health_max const damage_threshold = 20 const max_depth = 2 +#boat ids +onready var nav_rid = $NavigationMeshInstance.get_region_rid() + #controls var throttle: float = 0.0 var rudder: float = 0.0 -- cgit v1.2.3