From 0abec8156bd944aa883d544850ee1187219ba943 Mon Sep 17 00:00:00 2001 From: Lucas Fryzek Date: Tue, 17 Sep 2024 22:02:33 +0100 Subject: Initial commit --- scripts/player.gd | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 scripts/player.gd (limited to 'scripts/player.gd') diff --git a/scripts/player.gd b/scripts/player.gd new file mode 100644 index 0000000..e76b4d1 --- /dev/null +++ b/scripts/player.gd @@ -0,0 +1,76 @@ +extends Node3D + +@export var grapple_distance: float = 10 +@export var grapple_speed: float = 10 +@export var fire_distance: float = 100 + +enum State { + NO_GRAPPLE, + FREE, + GRAPPLING +} + +var current_state: State = State.FREE +var grapple_target: Vector3 = Vector3.ZERO + +var bullet_inst = preload("res://prefabs/bullet.tscn") + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + pass # Replace with function body. + +func do_grapple() -> void: + if Input.is_action_just_pressed("attack") and current_state == State.FREE: + var space_state = get_world_3d().direct_space_state + + var starting_pos = global_position + var ending_pos = starting_pos + grapple_distance * -global_transform.basis.z + var query = PhysicsRayQueryParameters3D.create(starting_pos, ending_pos) + query.collision_mask = 0x2 + var result = space_state.intersect_ray(query) + + if result: + grapple_target = result.position + global_transform.basis.z + current_state = State.GRAPPLING + + if Input.is_action_just_released("attack") and current_state == State.GRAPPLING: + current_state = State.FREE + grapple_target = Vector3.ZERO + + + #print("State ", current_state, " ", grapple_target) + if current_state == State.GRAPPLING: + var dir_to_target = (grapple_target - global_position).normalized() + + get_parent().local_velocity = dir_to_target * grapple_speed + +func fire_weapon() -> void: + if Input.is_action_just_pressed("attack"): + var space_state = get_world_3d().direct_space_state + var starting_pos = global_position + var ending_pos = starting_pos + fire_distance * -global_transform.basis.z + var query = PhysicsRayQueryParameters3D.create(starting_pos, ending_pos) + var result = space_state.intersect_ray(query) + + var end = ending_pos + if result: + print("Hit! ") + if result.collider.has_method("on_hit"): + result.collider.on_hit(result.position) + end = result.position + else: + print("Miss") + + var bullet: Node3D = bullet_inst.instantiate() + bullet.position = starting_pos + bullet.target = end + get_tree().get_root().add_child(bullet) + bullet.look_at(end) + +func _physics_process(_delta: float) -> void: + do_grapple() + fire_weapon() + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(_delta: float) -> void: + pass -- cgit