From c232b92e2dde1277324d1f89d0e75ae641e4ac3b Mon Sep 17 00:00:00 2001 From: Anson Bridges Date: Wed, 7 Sep 2022 14:07:30 -0400 Subject: reorganized, ladders, vehicle control --- godot/scripts/machines/Cannon.gd | 79 ++++++++++++++++++++++++++++++ godot/scripts/machines/NetworkedMachine.gd | 54 ++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 godot/scripts/machines/Cannon.gd create mode 100644 godot/scripts/machines/NetworkedMachine.gd (limited to 'godot/scripts/machines') diff --git a/godot/scripts/machines/Cannon.gd b/godot/scripts/machines/Cannon.gd new file mode 100644 index 0000000..6b636c5 --- /dev/null +++ b/godot/scripts/machines/Cannon.gd @@ -0,0 +1,79 @@ +extends "res://scripts/machines/NetworkedMachine.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 + +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_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} + +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_ballistics = world.get_node("BALLISTICS") + +func on_new_control(): + $YawJoint/PitchJoint/Camera.current = true + +func _physics_process(delta): + if cooldown > 0: + cooldown -= 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 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_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 + 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) diff --git a/godot/scripts/machines/NetworkedMachine.gd b/godot/scripts/machines/NetworkedMachine.gd new file mode 100644 index 0000000..5ce5cbe --- /dev/null +++ b/godot/scripts/machines/NetworkedMachine.gd @@ -0,0 +1,54 @@ +extends RigidBody + +var in_use : bool = false +var user = null +var world = null + +func _ready(): + world = get_tree().get_root().find_node("GAMEWORLD", true, false) + +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) + +func _integrate_forces(_state): + if is_network_master() and mode == MODE_RIGID: + rpc("update_phys_transform", transform, linear_velocity, angular_velocity) + +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 + +func on_no_control(): + pass + +func attack1(): + pass + +func attack2(): + pass + +func direction_input(_fwd,_bwd,_left,_right,_left2,_right2): + pass -- cgit v1.2.3