summaryrefslogtreecommitdiff
path: root/godot/scripts/vehicles/Gunboat.gd
blob: 1defce2e7b15500296e51b9b11ab83e60510d098 (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
108
109
110
111
112
113
114
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() == 1:
		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)