Made more enemies, easier to kill, more slashy. You get passive health regen, health orbs. Little key bindings tooltip.
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
extends Area3D
|
||||
class_name HealthOrb
|
||||
|
||||
## Floating pickup that restores health when a player walks into it.
|
||||
## Server-authoritative pickup; the bob/spin visuals run locally on every peer.
|
||||
|
||||
@export var heal_amount: float = 25.0
|
||||
@export var bob_height: float = 0.3
|
||||
@export var bob_speed: float = 2.0
|
||||
@export var spin_speed: float = 2.0
|
||||
|
||||
var orb_id: int = -1 # Assigned by Level when spawned
|
||||
var _base_y: float = 0.0
|
||||
var _time: float = 0.0
|
||||
var _collected: bool = false
|
||||
@onready var _mesh: Node3D = get_node_or_null("Mesh")
|
||||
|
||||
func _ready():
|
||||
_base_y = position.y
|
||||
_time = randf() * TAU # Random phase so multiple orbs don't bob in unison
|
||||
|
||||
# Detect players (physics layer 1) without colliding with anything
|
||||
collision_layer = 0
|
||||
collision_mask = 1
|
||||
|
||||
# Only the server resolves pickups
|
||||
if multiplayer.is_server():
|
||||
body_entered.connect(_on_body_entered)
|
||||
|
||||
func _process(delta):
|
||||
_time += delta
|
||||
position.y = _base_y + sin(_time * bob_speed) * bob_height
|
||||
if _mesh:
|
||||
_mesh.rotate_y(spin_speed * delta)
|
||||
|
||||
func _on_body_entered(body: Node3D):
|
||||
if _collected or not multiplayer.is_server():
|
||||
return
|
||||
if not (body is Character) or body.is_dead:
|
||||
return
|
||||
# Leave the orb in place if the player is already at full health
|
||||
if body.current_health >= body.max_health:
|
||||
return
|
||||
|
||||
_collected = true
|
||||
body.heal(heal_amount)
|
||||
|
||||
# Remove the orb from every client via the level's centralized system
|
||||
var level = get_tree().get_current_scene()
|
||||
if level and level.has_method("remove_health_orb"):
|
||||
level.remove_health_orb(orb_id)
|
||||
Reference in New Issue
Block a user