Files
shawn b0c83af092 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>
2026-07-02 20:55:20 -04:00

246 lines
7.5 KiB
Plaintext

[gd_scene load_steps=6 format=3 uid="uid://c3q2g36patykx"]
[ext_resource type="Script" path="res://examples/rollback-debugger/scripts/rollback-debugger.gd" id="1_2emun"]
[ext_resource type="Texture2D" uid="uid://csg26ysqqb4xe" path="res://addons/netfox/icons/rollback-synchronizer.svg" id="2_hjcrm"]
[ext_resource type="Script" path="res://examples/rollback-debugger/scripts/subject.gd" id="3_5kvxc"]
[ext_resource type="Script" path="res://addons/netfox/rollback/rollback-synchronizer.gd" id="3_0135o"]
[ext_resource type="Script" path="res://examples/rollback-debugger/scripts/input.gd" id="4_p1byq"]
[node name="Control" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Rollback Debugger" type="Node" parent="."]
script = ExtResource("1_2emun")
[node name="HBoxContainer" type="HBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="History" type="VBoxContainer" parent="HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
[node name="State History Label" type="Label" parent="HBoxContainer/History"]
layout_mode = 2
text = "State history"
[node name="ScrollContainer" type="ScrollContainer" parent="HBoxContainer/History"]
layout_mode = 2
size_flags_vertical = 3
[node name="Container" type="PanelContainer" parent="HBoxContainer/History/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="State History Data" type="TextEdit" parent="HBoxContainer/History/ScrollContainer/Container"]
unique_name_in_owner = true
layout_mode = 2
[node name="Input History Label" type="Label" parent="HBoxContainer/History"]
layout_mode = 2
text = "Input history"
[node name="ScrollContainer2" type="ScrollContainer" parent="HBoxContainer/History"]
layout_mode = 2
size_flags_vertical = 3
[node name="Container" type="PanelContainer" parent="HBoxContainer/History/ScrollContainer2"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="Input History Data" type="TextEdit" parent="HBoxContainer/History/ScrollContainer2/Container"]
unique_name_in_owner = true
layout_mode = 2
[node name="Data" type="VBoxContainer" parent="HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_stretch_ratio = 0.5
[node name="Has Input" type="HBoxContainer" parent="HBoxContainer/Data"]
layout_mode = 2
[node name="Has Input Label" type="Label" parent="HBoxContainer/Data/Has Input"]
layout_mode = 2
text = "Has input:"
[node name="Has Input Data" type="Label" parent="HBoxContainer/Data/Has Input"]
unique_name_in_owner = true
layout_mode = 2
text = "true"
[node name="Input Age" type="HBoxContainer" parent="HBoxContainer/Data"]
layout_mode = 2
[node name="Input Age Label" type="Label" parent="HBoxContainer/Data/Input Age"]
layout_mode = 2
text = "Input age:"
[node name="Input Age Data" type="Label" parent="HBoxContainer/Data/Input Age"]
unique_name_in_owner = true
layout_mode = 2
text = "2 ticks"
[node name="Simset Label" type="Label" parent="HBoxContainer/Data"]
layout_mode = 2
text = "Simset:"
[node name="Simset List" type="ItemList" parent="HBoxContainer/Data"]
unique_name_in_owner = true
layout_mode = 2
size_flags_vertical = 3
[node name="Skipset Label" type="Label" parent="HBoxContainer/Data"]
layout_mode = 2
text = "Skipset:"
[node name="Skipset List" type="ItemList" parent="HBoxContainer/Data"]
unique_name_in_owner = true
layout_mode = 2
size_flags_vertical = 3
[node name="Transmit State Label" type="Label" parent="HBoxContainer/Data"]
layout_mode = 2
text = "Transmit state:"
[node name="PanelContainer" type="PanelContainer" parent="HBoxContainer/Data"]
layout_mode = 2
size_flags_vertical = 3
[node name="Transmit State Data" type="Label" parent="HBoxContainer/Data/PanelContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_vertical = 3
[node name="Tools" type="VBoxContainer" parent="HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 8
[node name="Tick Container" type="HBoxContainer" parent="HBoxContainer/Tools"]
layout_mode = 2
[node name="Network Tick Label" type="Label" parent="HBoxContainer/Tools/Tick Container"]
layout_mode = 2
text = "Network Tick: "
[node name="Network Tick Data" type="LineEdit" parent="HBoxContainer/Tools/Tick Container"]
unique_name_in_owner = true
layout_mode = 2
text = "0"
[node name="Rollback Tick Label" type="Label" parent="HBoxContainer/Tools/Tick Container"]
layout_mode = 2
text = "Rollback Tick: "
[node name="Rollback Tick Data" type="LineEdit" parent="HBoxContainer/Tools/Tick Container"]
unique_name_in_owner = true
layout_mode = 2
text = "0"
[node name="NT Before Loop Button" type="Button" parent="HBoxContainer/Tools"]
unique_name_in_owner = true
layout_mode = 2
text = "NetworkTime.before_tick_loop"
[node name="HSeparator5" type="HSeparator" parent="HBoxContainer/Tools"]
layout_mode = 2
[node name="NT Before Tick Button" type="Button" parent="HBoxContainer/Tools"]
unique_name_in_owner = true
layout_mode = 2
text = "NetworkTime.before_tick"
[node name="NT On Tick Button" type="Button" parent="HBoxContainer/Tools"]
unique_name_in_owner = true
layout_mode = 2
text = "NetworkTime.on_tick"
[node name="HSeparator6" type="HSeparator" parent="HBoxContainer/Tools"]
layout_mode = 2
[node name="NR Before Loop Button" type="Button" parent="HBoxContainer/Tools"]
unique_name_in_owner = true
layout_mode = 2
text = "NetworkRollback.before_loop"
[node name="HSeparator2" type="HSeparator" parent="HBoxContainer/Tools"]
layout_mode = 2
[node name="NR Prepare Button" type="Button" parent="HBoxContainer/Tools"]
unique_name_in_owner = true
layout_mode = 2
text = "NetworkRollback.on_prepare_tick"
[node name="NR Process Button" type="Button" parent="HBoxContainer/Tools"]
unique_name_in_owner = true
layout_mode = 2
text = "NetworkRollback.on_process_tick"
[node name="NR Record Button" type="Button" parent="HBoxContainer/Tools"]
unique_name_in_owner = true
layout_mode = 2
text = "NetworkRollback.on_record_tick"
[node name="HSeparator3" type="HSeparator" parent="HBoxContainer/Tools"]
layout_mode = 2
[node name="NR After Loop" type="Button" parent="HBoxContainer/Tools"]
unique_name_in_owner = true
layout_mode = 2
text = "NetworkRollback.after_loop"
[node name="HSeparator7" type="HSeparator" parent="HBoxContainer/Tools"]
layout_mode = 2
[node name="NT After Tick Button" type="Button" parent="HBoxContainer/Tools"]
unique_name_in_owner = true
layout_mode = 2
text = "NetworkTime.after_tick"
[node name="HSeparator8" type="HSeparator" parent="HBoxContainer/Tools"]
layout_mode = 2
[node name="NT After Tick Loop Button" type="Button" parent="HBoxContainer/Tools"]
unique_name_in_owner = true
layout_mode = 2
text = "NetworkTime.after_tick_loop"
[node name="HSeparator4" type="HSeparator" parent="HBoxContainer/Tools"]
layout_mode = 2
[node name="Run NR Tick Button" type="Button" parent="HBoxContainer/Tools"]
unique_name_in_owner = true
layout_mode = 2
text = "Run Rollback tick"
[node name="Advance Button" type="Button" parent="HBoxContainer/Tools"]
unique_name_in_owner = true
layout_mode = 2
text = "Advance tick"
[node name="Subject" type="Sprite2D" parent="."]
z_index = -1
position = Vector2(270, 270)
texture = ExtResource("2_hjcrm")
script = ExtResource("3_5kvxc")
[node name="Input" type="Node" parent="Subject"]
script = ExtResource("4_p1byq")
[node name="RollbackSynchronizer" type="Node" parent="Subject" node_paths=PackedStringArray("root")]
script = ExtResource("3_0135o")
root = NodePath("..")
state_properties = Array[String]([":position"])
input_properties = Array[String](["Input:movement"])