feat: implement core movement, combat, weapon management, and networking systems

This commit is contained in:
DottsGit
2026-06-07 00:22:21 -04:00
parent 064bc90f53
commit 7f54792ad9
12 changed files with 191 additions and 42 deletions
+23 -8
View File
@@ -5,6 +5,7 @@ signal player_disconnected(id: int)
signal connection_failed
signal connection_succeeded
signal match_state_updated
signal match_ended
signal stats_updated
signal killfeed_event(victim: String, killer: String, weapon: String, v_color: String, k_color: String)
@@ -17,6 +18,7 @@ var player_stats: Dictionary = {}
var match_active: bool = false
var match_time_remaining: float = 0.0
var match_duration_setting: float = 300.0
var current_gamemode: String = "Deathmatch"
var current_scene_path: String = ""
@@ -94,9 +96,6 @@ func _on_peer_connected(id: int) -> void:
print("Player connected: ", id)
if not connected_players.has(id):
connected_players.append(id)
# If server, we wait for the client to register themselves via RPC
pass
func _on_peer_disconnected(id: int) -> void:
print("Player disconnected: ", id)
@@ -130,15 +129,24 @@ func register_player(username: String) -> void:
if multiplayer.is_server():
var sender_id = multiplayer.get_remote_sender_id()
_init_player_stats(sender_id, username)
player_connected.emit(sender_id)
# Sync everyone's stats
rpc("sync_player_stats", player_stats)
# If a match is active, force the late-joiner to load the level
if match_active:
rpc_id(sender_id, "rpc_load_level", current_scene_path)
rpc_id(sender_id, "sync_match_state", match_active, match_time_remaining, current_gamemode)
else:
player_connected.emit(sender_id)
# Sync everyone's stats
rpc("sync_player_stats", player_stats)
@rpc("any_peer", "call_remote", "reliable")
func client_ready_for_spawn() -> void:
if multiplayer.is_server():
var sender_id = multiplayer.get_remote_sender_id()
if sender_id == 0:
sender_id = 1
player_connected.emit(sender_id)
@rpc("any_peer", "call_local", "reliable")
func update_username(new_name: String) -> void:
@@ -170,7 +178,7 @@ func rpc_load_level(scene_path: String) -> void:
current_scene_path = scene_path
if multiplayer.is_server():
match_active = true
match_time_remaining = 300.0 # 5 minutes
match_time_remaining = match_duration_setting
rpc("sync_match_state", match_active, match_time_remaining, current_gamemode)
get_tree().change_scene_to_file(scene_path)
@@ -181,9 +189,16 @@ func _process(delta: float) -> void:
if match_time_remaining <= 0:
match_time_remaining = 0
match_active = false
if multiplayer.is_server() or multiplayer.multiplayer_peer is OfflineMultiplayerPeer:
rpc("rpc_end_match")
# We emit this so HUDs can update their timers smoothly
match_state_updated.emit()
@rpc("authority", "call_local", "reliable")
func rpc_end_match() -> void:
match_active = false
match_ended.emit()
# --- PING SYSTEM ---
func _on_ping_timer() -> void:
if multiplayer.is_server():