b0c83af092
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>
58 lines
1.3 KiB
GDScript
58 lines
1.3 KiB
GDScript
extends RefCounted
|
|
class_name _Graph
|
|
|
|
# Represents a graph, in the sense of a set of nodes, arbitrarily connected by
|
|
# links
|
|
|
|
var _links_from := {} # `from` to `to[]`
|
|
var _links_to := {} # `to` to `from[]`
|
|
|
|
func link(from: Variant, to: Variant) -> void:
|
|
if has_link(from, to):
|
|
return
|
|
|
|
_append(_links_from, from, to)
|
|
_append(_links_to, to, from)
|
|
|
|
func unlink(from: Variant, to: Variant) -> void:
|
|
_erase(_links_from, from, to)
|
|
_erase(_links_to, to, from)
|
|
|
|
func erase(node: Variant) -> void:
|
|
var links_to := _links_from.get(node, [])
|
|
var links_from := _links_to.get(node, [])
|
|
|
|
_links_from.erase(node)
|
|
_links_to.erase(node)
|
|
|
|
for link in links_to:
|
|
_erase(_links_to, link, node)
|
|
|
|
for link in links_from:
|
|
_erase(_links_from, link, node)
|
|
|
|
func get_linked_from(from: Variant) -> Array:
|
|
return _links_from.get(from, [])
|
|
|
|
func get_linked_to(to: Variant) -> Array:
|
|
return _links_to.get(to, [])
|
|
|
|
func has_link(from: Variant, to: Variant) -> bool:
|
|
return get_linked_from(from).has(to)
|
|
|
|
func _append(pool: Dictionary, key: Variant, value: Variant) -> void:
|
|
if not pool.has(key):
|
|
pool[key] = [value]
|
|
else:
|
|
pool[key].append(value)
|
|
|
|
func _erase(pool: Dictionary, key: Variant, value: Variant) -> void:
|
|
if not pool.has(key):
|
|
return
|
|
|
|
var values := pool[key] as Array
|
|
values.erase(value)
|
|
|
|
if values.is_empty():
|
|
pool.erase(key)
|