summaryrefslogtreecommitdiff
path: root/godot/scenes/weapons/grapplinghook.gd
diff options
context:
space:
mode:
authorAnson Bridges <bridges.anson@gmail.com>2022-09-30 11:20:16 -0400
committerAnson Bridges <bridges.anson@gmail.com>2022-09-30 11:20:16 -0400
commit4a17fde692b900393d796675bcf7011aa7399dad (patch)
tree5305dba808a7094192821736a379168cdb549843 /godot/scenes/weapons/grapplinghook.gd
parent7a1d857de96174dfa5a0fa40f8c14acbd2f651c2 (diff)
syncing off main
Diffstat (limited to 'godot/scenes/weapons/grapplinghook.gd')
-rw-r--r--godot/scenes/weapons/grapplinghook.gd98
1 files changed, 98 insertions, 0 deletions
diff --git a/godot/scenes/weapons/grapplinghook.gd b/godot/scenes/weapons/grapplinghook.gd
new file mode 100644
index 0000000..f7c1fa8
--- /dev/null
+++ b/godot/scenes/weapons/grapplinghook.gd
@@ -0,0 +1,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)
+