summaryrefslogtreecommitdiff
path: root/scripts/machines/Cannon.gd
blob: e7a5441200b3dd90fd65b8e1a3d656844d32410f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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