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)