extends "res://scripts/machines/NetworkedMachineGDS.gd" var world_ballistics = null var cooldown = 0 export var fire_rate = 1 #shot/s export var ball_speed = 400 #m/s var pitch: float = 0.0 var turn: float = 0.0 remotesync var loaded: bool = false export var turn_speed = 7.5 #deg/s export var pitch_speed = 10 export var max_pitch = 50 export var min_pitch = -10 export var min_yaw = -15 export var max_yaw = 15 onready var muzzle: Spatial = get_node("YawJoint/PitchJoint/Muzzle") onready var status: Label3D = get_node("StatusNotifier") onready var steer_area: Area = get_node("SteerArea") const ammo_type = "cannonball" var load_time: float = 3.0 var load_progress: float = 0.0 func increase_load(delta) -> float: if loaded: return -1.0 load_progress += delta if load_progress >= load_time: rpc("load_cannonball") return load_progress/load_time func reset_load(): load_progress = 0 remote func update_aim(pitch_z, yaw_y): $YawJoint/PitchJoint.rotation_degrees.z = pitch_z $YawJoint.rotation_degrees.y = yaw_y func get_init_info(): return {"pitch_rot" : $YawJoint/PitchJoint.rotation_degrees.z, "turn_rot" : $YawJoint.rotation_degrees.y, "in_use" : in_use, "loaded" : loaded} func mp_init(init_info): $YawJoint/PitchJoint.rotation_degrees.z = init_info["pitch_rot"] $YawJoint.rotation_degrees.y = init_info["turn_rot"] in_use = init_info["in_use"] loaded = init_info["loaded"] # Called when the node enters the scene tree for the first time. func _ready(): if get_parent().name != "MACHINES": #if cannon is aboard ship add_collision_exception_with(get_parent().get_parent()) mode = RigidBody.MODE_STATIC print("kinematic") world_ballistics = world.get_node("BALLISTICS") if loaded: controllable = true func on_new_control(): if is_network_master() and get_network_master() != 1: world.cam.attach(self, "STATIC", "./YawJoint/PitchJoint/CameraPoint") func _physics_process(delta): if in_use and is_network_master(): #aim $YawJoint/PitchJoint.rotation_degrees.z += pitch*pitch_speed*delta $YawJoint.rotation_degrees.y += turn*turn_speed*delta $YawJoint.rotation_degrees.y = clamp($YawJoint.rotation_degrees.y, min_yaw, max_yaw) $YawJoint/PitchJoint.rotation_degrees.z = clamp($YawJoint/PitchJoint.rotation_degrees.z, min_pitch, max_pitch) rpc("update_aim", $YawJoint/PitchJoint.rotation_degrees.z, $YawJoint.rotation_degrees.y) func direction_input(fwd,bwd,left,right,_left,_right): pitch = fwd - bwd turn = right - left func attack1(): if !loaded: return rpc("fire") remotesync func fire(): loaded = false controllable = false status.set_visible(true) $YawJoint/PitchJoint/Muzzle/explosion_sound.play() var expl = preload("res://particles/p_Explosion.tscn").instance() var cball = preload("res://scenes/ballistics/Cannonball.tscn").instance() world_ballistics.add_child(cball, true) world.add_child(expl) expl.scale = Vector3(0.25,0.25,0.25) expl.init(muzzle.global_transform.origin, Vector3.ZERO) add_collision_exception_with(cball) cball.global_transform.origin = muzzle.global_transform.origin cball.linear_velocity = muzzle.global_transform.basis.x*ball_speed cball.set_network_master(1) cball.shooter = user.name if user.get_network_master() != 1: cball.shooter += " (" + world.players_info[user.get_network_master()][0] + ")" cball.shooter_id = user.get_network_master() if mode == RigidBody.MODE_STATIC: get_parent().get_parent().apply_impulse($YawJoint/PitchJoint.global_transform.origin - get_parent().global_transform.origin, -1*cball.mass*ball_speed*muzzle.global_transform.basis.x) else: if is_network_master(): apply_impulse($YawJoint/PitchJoint.global_transform.origin - global_transform.origin, -1*cball.mass*ball_speed*muzzle.global_transform.basis.x) remotesync func load_cannonball(): loaded = true controllable = true $StatusNotifier.visible = false