Chelimbalo/players/player/player.gd
2025-12-17 01:59:35 +05:00

84 lines
1.5 KiB
GDScript

extends CharacterBody3D
class_name Player
@export var team: Session.TEAMS
@export var weapon_models: Dictionary[StringName,Node3D]
@export var player_id: int = 1:
set(id):
player_id = id
$PlayerInput.set_multiplayer_authority(id)
$Camera3D.set_multiplayer_authority(id)
var passived: bool = false
var previous_velocity: Vector3
signal health_changed(to: int)
signal damaged
signal died
const MAX_HP = 100
@export var hp: int = 100:
set(value):
if dead:
return
if value < 0:
hp = 0
else:
hp = value
health_changed.emit(hp)
if hp == 0:
die()
dead = true
get:
return hp
var dead: bool
func _ready() -> void:
for model in weapon_models.values():
model.hide()
func _physics_process(_delta: float) -> void:
if not multiplayer.is_server():
return
previous_velocity = velocity
move_and_slide()
func die() -> void:
if (not multiplayer.is_server()):
return
Session.add_dead(team)
died.emit()
die_on_peers.rpc()
passived = true
collision_layer = 0
@rpc("authority","call_remote","reliable")
func die_on_peers():
if multiplayer.get_remote_sender_id() != 1:
return
died.emit()
func passive() -> void:
passived = true
func depassive() -> void:
passived = false
func take_damage(damage: int):
if damage == 0:
return
if dead:
return
hp -= damage
damaged.emit()
$DamageAudio.multiplayer_play()
func show_weapon(weapon: StringName):
for model in weapon_models:
weapon_models[model].hide()
if weapon_models.has(weapon):
weapon_models[weapon].show()