diff options
Diffstat (limited to 'godot/scenes/weapons/grapplinghook.gd')
| -rw-r--r-- | godot/scenes/weapons/grapplinghook.gd | 98 |
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) + |
