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)
|