Now About Social Code
summaryrefslogtreecommitdiff
path: root/scripts/player.gd
diff options
context:
space:
mode:
authorLucas Fryzek <lucas.fryzek@fryzekconcepts.com>2024-09-17 22:02:33 +0100
committerLucas Fryzek <lucas.fryzek@fryzekconcepts.com>2024-09-17 22:02:33 +0100
commit0abec8156bd944aa883d544850ee1187219ba943 (patch)
tree55e222da361d176b0ba79611704b56e2d942a831 /scripts/player.gd
Initial commit
Diffstat (limited to 'scripts/player.gd')
-rw-r--r--scripts/player.gd76
1 files changed, 76 insertions, 0 deletions
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