feat: Add core player entity with network-synced properties, character selection, and manager integration.
This commit is contained in:
@@ -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(
|
||||||
@@ -1940,6 +1943,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")
|
||||||
func complete_race(final_position: int):
|
func complete_race(final_position: int):
|
||||||
|
|||||||
@@ -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():
|
||||||
|
|||||||
Reference in New Issue
Block a user