extends RigidBody #Basis var in_use : bool = false var user = null var world = null var cooldown = 0 export var fire_rate = 1 #shot/s export var ball_speed = 500 #m/s var pitch :float = 0.0 var turn :float = 0.0 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 = get_node("YawJoint/PitchJoint/Muzzle") remote func update_phys_transform(t, lv, av): transform = t linear_velocity = lv angular_velocity = av func get_init_info(): return {"pitch_rot" : $YawJoint/PitchJoint.rotation_degrees.z, "turn_rot" : $YawJoint.rotation_degrees.y, "in_use" : in_use} 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"] # Called when the node enters the scene tree for the first time. func _ready(): if get_parent().name != "MACHINES": add_collision_exception_with(get_parent()) mode = RigidBody.MODE_STATIC world = get_tree().get_root().find_node("BALLISTICS", true, false) remotesync func set_net_owner(id, char_name): set_network_master(id) if id != 1 or char_name != "NONE": pass func is_in_use(): return in_use func take_control(controller): $YawJoint/PitchJoint/Camera.current = true user = controller in_use = true return self func relinquish_control(): in_use = false user = null rpc("set_owner", 1, "NONE") func _physics_process(delta): if cooldown > 0: cooldown -= delta if in_use: #aim $YawJoint/PitchJoint.rotation_degrees.z += pitch*pitch_speed*delta $YawJoint.rotation_degrees.y += turn*turn_speed*delta if $YawJoint.rotation_degrees.y > max_yaw: $YawJoint.rotation_degrees.y = max_yaw elif $YawJoint.rotation_degrees.y < min_yaw: $YawJoint.rotation_degrees.y = min_yaw if $YawJoint/PitchJoint.rotation_degrees.z > max_pitch: $YawJoint/PitchJoint.rotation_degrees.z = max_pitch elif $YawJoint/PitchJoint.rotation_degrees.z < min_pitch: $YawJoint/PitchJoint.rotation_degrees.z = min_pitch if is_network_master() and mode == MODE_STATIC: rpc("update_phys_transform", transform, linear_velocity, angular_velocity) func direction_input(fwd,bwd,left,right,_left,_right): pitch = fwd - bwd turn = left - right func attack1(): if cooldown > 0: return rpc("fire") remotesync func fire(): $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.add_child(cball) world.add_child(expl) 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 cooldown = fire_rate if mode == RigidBody.MODE_STATIC: 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: apply_impulse($YawJoint/PitchJoint.global_transform.origin - global_transform.origin, -1*cball.mass*ball_speed*muzzle.global_transform.basis.x) func attack2(): pass