feat: Add core player entity with network-synced properties, character selection, and manager integration.

This commit is contained in:
Yogi Wiguna
2026-02-25 12:24:12 +08:00
parent 4990ce3c89
commit 51df6ed4fc
2 changed files with 24 additions and 9 deletions
+5
View File
@@ -12,6 +12,8 @@ var powerup_manager
# Score tracking # Score tracking
var score: int = 0 var score: int = 0
signal position_changed
# Display name (synced across network) # Display name (synced across network)
var _display_name: String = "" var _display_name: String = ""
var display_name: String: var display_name: String:
@@ -1412,6 +1414,7 @@ func start_movement_along_path(path: Array, clear_visual: bool = true):
func update_player_position(grid_position: Vector2i): func update_player_position(grid_position: Vector2i):
position = grid_to_world(grid_position) position = grid_to_world(grid_position)
emit_signal("position_changed")
func grid_to_world(grid_position: Vector2i) -> Vector3: func grid_to_world(grid_position: Vector2i) -> Vector3:
var world_position = Vector3( var world_position = Vector3(
@@ -1939,6 +1942,8 @@ func set_spawn_position(pos: Vector2i):
# Reveal character now that it's in the correct position # Reveal character now that it's in the correct position
visible = true visible = true
emit_signal("position_changed")
@rpc("any_peer", "call_local", "reliable") @rpc("any_peer", "call_local", "reliable")
+19 -9
View File
@@ -30,21 +30,31 @@ func initialize(p_camera: Camera3D, _p_shake_manager: Node):
func set_player(p_player: Node3D): func set_player(p_player: Node3D):
player = p_player player = p_player
unique_id = p_player.name.to_int() unique_id = p_player.name.to_int()
# Try to get movement manager (might be initializing)
var movement_mgr = player.get("movement_manager")
if not movement_mgr and player.get("movement_manager") == null: # Try to get movement manager (might be initializing child)
# Try direct access if script variable var movement_mgr = player.get("movement_manager")
if not movement_mgr and "movement_manager" in player:
movement_mgr = player.movement_manager movement_mgr = player.movement_manager
if movement_mgr: var has_snap_signal = player.has_signal("position_changed")
if movement_mgr and has_snap_signal:
# 1. Follow during movement
if not movement_mgr.movement_finished.is_connected(_on_player_moved): if not movement_mgr.movement_finished.is_connected(_on_player_moved):
movement_mgr.movement_finished.connect(_on_player_moved) movement_mgr.movement_finished.connect(_on_player_moved)
# 2. Snap on spawn/teleport
if not player.position_changed.is_connected(_on_player_moved):
player.position_changed.connect(_on_player_moved)
print("[CameraContextManager] Successfully connected to all player signals")
else: else:
print("[CameraContextManager] Warning: movement_manager not found on player. Retrying in 0.5s...") print("[CameraContextManager] Warning: movement_manager or signal missing. Retrying in 0.5s...")
await get_tree().create_timer(0.5).timeout await get_tree().create_timer(0.5).timeout
if player == p_player: # Ensure player hasn't changed if player == p_player:
set_player(p_player) # Retry set_player(p_player)
return # Exit current (failed) initialization
_update_camera_target() _update_camera_target()
func _on_player_moved(): func _on_player_moved():