extends "res://scripts/machines/NetworkedMachineGDS.gd" export var team = 0 const accel = 500000 const turn_accel = 50000 remote var sail_out = 0.0 export var sail_speed : float = 0.2 var sail_turn = 0 export var sail_turn_speed = 30 const SAIL_MAX = 90 var rudder_turn : float = 0.0 export var rudder_speed = 25 export var rudder_constant = 1800 const RUDDER_MAX = 60 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 var mainsheet: float = 0.0 func get_init_info(): return {"sail_out" : sail_out, "rudder_turn" : rudder_turn, "sail_turn" : sail_turn, "health" : health, "in_use" : in_use} func mp_init(init_info): for variable in init_info.keys(): set(variable, init_info[variable]) # Called when the node enters the scene tree for the first time. func _ready(): print("adding gunboat to scene",get_tree().get_network_unique_id()) controllable = true for sail in $SAILS.get_children(): sail.set_sheet(sail_out) world = get_tree().get_root().find_node("GAMEWORLD", true, false) if get_tree().get_network_unique_id() == 0: print("enabling navigation for server") $NavigationMeshInstance.set_enabled(true) func on_no_control(): rpc("reset_controls") remotesync func reset_controls(): rudder = 0.0 throttle = 0.0 mainsheet = 0.0 func auto_sail(delta): return var in_range = global_transform.basis.x.dot(world.winddir) >= 0 if in_range: if Vector2(world.winddir.x, world.winddir.z).angle_to(Vector2($Mast.global_transform.basis.x.x,$Mast.global_transform.basis.x.z)) < 0: sail_turn -= sail_turn_speed*delta else: sail_turn += sail_turn_speed*delta else: if abs(Vector2(world.winddir.x, world.winddir.z).angle_to(Vector2(global_transform.basis.z.x,global_transform.basis.z.z))) < PI/2: sail_turn -= sail_turn_speed*delta else: sail_turn += sail_turn_speed*delta func direction_input(fwd,bwd,left,right,_left,_right): throttle = fwd - bwd rudder = left - right mainsheet = _left - _right remotesync func damage(amount, _type, _shooter, _extra = ""): if amount >= damage_threshold: health -= amount print(health) # Called every frame. 'delta' is the elapsed time since the previous frame. func _physics_process(delta): if is_network_master(): if throttle != 0: for sail in $SAILS.get_children(): sail.set_sheet(sail_out) $Rudder.rotation_degrees.y = rudder_turn #$Mast.rotation_degrees.y = sail_turn var push_force = accel*sail_out*world.winddir.dot(global_transform.basis.x) if world.winddir.angle_to(global_transform.basis.x) < PI/2: add_force(global_transform.basis.x*push_force, Vector3.ZERO) add_torque(Vector3(0,-rudder_turn*rudder_constant*(0.5+linear_velocity.dot(global_transform.basis.x)),0)) add_torque(Vector3(-100000*angular_velocity.x,0,0)) add_torque(Vector3(0,0,-100000*angular_velocity.z)) #rudder_turn += rudder_speed*delta*(-0.25 if rudder_turn > 0 else 0.25) for point in $FloatPoints.get_children(): for area in point.get_overlapping_areas(): if area.name == "WaterArea": var depth = area.global_transform.origin.y-point.global_transform.origin.y var floatiness = 0.275 if health <= 0 else 1.0 if floatiness == 0.275: depth = 0.05 add_force(Vector3.UP*weight*depth*floatiness, point.global_transform.origin-global_transform.origin) if in_use: rudder_turn += rudder_speed*delta*(rudder) sail_out += sail_speed*delta*(throttle) sail_turn += sail_turn_speed*delta*(mainsheet) auto_sail(delta) sail_out = clamp(sail_out, 0, 1) rudder_turn = clamp(rudder_turn, -RUDDER_MAX, RUDDER_MAX) sail_turn = clamp(sail_turn, -SAIL_MAX, SAIL_MAX) rset("sail_out", sail_out) #add_force(transform.basis.x*accel*Input.get_action_strength("move_forward"), Vector3.ZERO)