summaryrefslogtreecommitdiff
path: root/godot/scenes/weapons/grapplinghook.gd
blob: f7c1fa849686156122b63b85edf8d6a0c8302b7c (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
extends Resource

var player_owner: RigidBody = null
const fist_damage: int = 15
var can_throw: bool = true
var hooking: bool = false

var pin_root: PinJoint = PinJoint.new()
var pin_mid: PinJoint = PinJoint.new()
var pin_player: PinJoint = PinJoint.new()

var rope_seg1: RigidBody = null #preload("res://scenes/environment/RopeSegment.tscn").instance()
var rope_seg2: RigidBody = null #preload("res://scenes/environment/RopeSegment.tscn").instance()

const name: String = "GRAPPLINGHOOK"

func init(owner):
	player_owner = owner
	rope_seg1 = preload("res://scenes/environment/RopeSegment.tscn").instance()
	rope_seg2 = preload("res://scenes/environment/RopeSegment.tscn").instance()

func deselect() -> bool:
	if can_throw and !hooking:
		return true
	return false

func select() -> void:
	player_owner.rpc("anim_event", {"VMANIMPLAY" : "rockets_idle_vm"})

func attack1():
	if !can_throw or hooking:
		return
	can_throw = false
	player_owner.rpc("anim_event", {"VMANIMPLAY" : "rockets_launch_vm"})
	yield(player_owner.get_tree().create_timer(0.45), "timeout")
	hooking = true
	player_owner.gun_ray.force_raycast_update()
	if player_owner.gun_ray.is_colliding():
		var hit = player_owner.gun_ray.get_collider()
		var hitpt: Vector3 = player_owner.gun_ray.get_collision_point()
		var vlen: float = (hitpt - player_owner.head.global_transform.origin).length() 
		player_owner.world.add_child(pin_root)
		player_owner.world.add_child(pin_mid)
		player_owner.world.add_child(pin_player)
		player_owner.world.add_child(rope_seg1)
		player_owner.world.add_child(rope_seg2)

		pin_root.global_transform.origin = hitpt
		pin_player.global_transform.origin = player_owner.head.global_transform.origin
		pin_mid.global_transform.origin = hitpt.move_toward(player_owner.head.global_transform.origin, vlen/2)
		pin_player.global_transform.origin += player_owner.velocity*0.0167
		print(pin_root.global_transform.origin)
		print(pin_player.global_transform.origin)
		print(pin_mid.global_transform.origin)
		#should apply to both
		rope_seg1.get_node("CollisionShape").shape.extents = Vector3(0.1,0.1,vlen/2)
		#rope_seg2.get_node("CollisionShape").shape.extents = Vector3(0.1,0.1,vec.length()/2)
		rope_seg1.global_transform.origin = hitpt.move_toward(player_owner.head.global_transform.origin, vlen*0.25)
		rope_seg2.global_transform.origin = hitpt.move_toward(player_owner.head.global_transform.origin, 0.75*vlen)
		rope_seg1.look_at(hitpt, Vector3.UP)
		rope_seg2.look_at(hitpt, Vector3.UP)
		
		pin_root.set_node_a(hit.get_path())
		pin_root.set_node_b(rope_seg1.get_path())
		pin_mid.set_node_a(rope_seg1.get_path())
		pin_mid.set_node_b(rope_seg2.get_path())
		pin_player.set_node_a(rope_seg2.get_path())
		pin_player.set_node_b(player_owner.get_path())
		#rope_seg2.get_node("CollisionShape").shape.extents = Vector3(0.05,0.05,distance/2)
	else:
		can_throw = true

func detach():
	player_owner.world.remove_child(pin_root)
	player_owner.world.remove_child(pin_mid)
	player_owner.world.remove_child(pin_player)
	player_owner.world.remove_child(rope_seg1)
	player_owner.world.remove_child(rope_seg2)
	pin_root.set_node_a("")
	pin_root.set_node_b("")
	pin_mid.set_node_a("")
	pin_mid.set_node_b("")
	pin_player.set_node_a("")
	pin_player.set_node_b("")
	can_throw = true
	hooking = false

func mouse_input(m1: float, _m3: float, m2: float) -> void:
	if m2 > 0 and hooking:
		detach()
	if m1 > 0 and rope_seg1.get_node("CollisionShape").shape.extents.z  > 0.1:
		rope_seg1.get_node("CollisionShape").shape.extents.z -= 0.05
		var trf1: Vector3 = (pin_root.global_transform.origin-pin_mid.global_transform.origin).normalized()
		rope_seg1.global_transform.origin += trf1*0.025
		var trf2: Vector3 = (pin_mid.global_transform.origin-pin_player.global_transform.origin).normalized()
		rope_seg2.global_transform.origin += trf2*0.025
		player_owner.linear_velocity += (trf1*0.05 + trf2*0.05)