Fresh start: replace with naxIO/netfox-cs-sample foundation
Complete replacement of the tactical-shooter project with the netfox-cs-sample (MIT) — a CS 1.6 inspired multiplayer FPS built with Godot 4 and netfox. ## What's new - Full CS-style gameplay: teams (T/CT), rounds, economy, buy menu - 6 weapons: Knife, Glock, USP, AK-47, M4A1, AWP - Bomb plant/defuse with 2 bombsites - Flashbang & smoke grenades - Proper netfox rollback netcode at 64 tick - Network popup UI for host/join - HUD, crosshair, round timer, scoreboard - All netfox singletons registered as autoloads (works in exported builds) ## Architecture - Listen-server (host from client, no dedicated server binary) - Multiplayer-fps game lives at examples/multiplayer-fps/ - Netfox addons registered as autoloads for exported build compat - Godot 4.7 with Forward+ renderer ## Removed - Old headless-server architecture (client_main, server_main, player.gd, etc.) - Custom netfox bootstrap with ENet fallback - Old ChaffGames FPS template (2,420 lines, 844 KB) - SimulationServer GDExtension stub - Godot-jolt physics (netfox sample uses default Godot physics) - Duplicate weapon_data.gd, anti_cheat.gd, round_manager.gd, etc. - Server browser API Python venv (87 MB) - test_range map and modular assets ## Preserved - Git history - Server config at config/default_server_config.cfg - Windows export preset - Build directory (gitignored) Co-authored-by: naxIO <naxIO@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
extends Node
|
||||
class_name TeamManager
|
||||
|
||||
enum Team { NONE = -1, T = 0, CT = 1 }
|
||||
|
||||
signal team_changed(peer_id: int, team: Team)
|
||||
|
||||
# peer_id -> Team
|
||||
var assignments: Dictionary = {}
|
||||
|
||||
func _ready():
|
||||
NetworkEvents.on_peer_leave.connect(_handle_peer_leave)
|
||||
|
||||
func get_team(peer_id: int) -> Team:
|
||||
return assignments.get(peer_id, Team.NONE) as Team
|
||||
|
||||
func get_team_members(team: Team) -> Array[int]:
|
||||
var members: Array[int] = []
|
||||
for peer_id in assignments:
|
||||
if assignments[peer_id] == team:
|
||||
members.append(peer_id)
|
||||
return members
|
||||
|
||||
func get_team_name(team: Team) -> String:
|
||||
match team:
|
||||
Team.T: return "Terrorists"
|
||||
Team.CT: return "Counter-Terrorists"
|
||||
_: return "Unassigned"
|
||||
|
||||
func auto_assign(peer_id: int) -> Team:
|
||||
var t_count := get_team_members(Team.T).size()
|
||||
var ct_count := get_team_members(Team.CT).size()
|
||||
var team := Team.T if t_count <= ct_count else Team.CT
|
||||
assign_team(peer_id, team)
|
||||
return team
|
||||
|
||||
func assign_team(peer_id: int, team: Team) -> void:
|
||||
if not multiplayer.is_server():
|
||||
return
|
||||
|
||||
assignments[peer_id] = team
|
||||
_sync_assignment.rpc(peer_id, team)
|
||||
team_changed.emit(peer_id, team)
|
||||
|
||||
@rpc("authority", "call_local", "reliable")
|
||||
func _sync_assignment(peer_id: int, team: int) -> void:
|
||||
assignments[peer_id] = team as Team
|
||||
team_changed.emit(peer_id, team as Team)
|
||||
|
||||
func sync_to_peer(peer_id: int) -> void:
|
||||
## Send all current team assignments to a late-joining peer.
|
||||
for pid in assignments:
|
||||
_sync_assignment.rpc_id(peer_id, pid, assignments[pid])
|
||||
|
||||
func _handle_peer_leave(peer_id: int) -> void:
|
||||
assignments.erase(peer_id)
|
||||
Reference in New Issue
Block a user