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>
69 lines
1.9 KiB
GDScript
69 lines
1.9 KiB
GDScript
extends Object
|
|
class_name VestMockDefs
|
|
|
|
## Grouping class for mock definition primitives.
|
|
##
|
|
## See [VestMockDefs.Answer][br]
|
|
## See [VestMockDefs.Call][br]
|
|
|
|
## Mock answer definition
|
|
##
|
|
## Each answer manages a mock method. When this method is called, instead of
|
|
## running the underlying code, the answer provides a response.
|
|
class Answer:
|
|
## The method this instance provides the answers for
|
|
var expected_method: Callable
|
|
|
|
## The expected arguments for providing the answers.
|
|
## [br][br]
|
|
## May be empty, in which case any and all parameters are accepted.
|
|
var expected_args: Array = []
|
|
|
|
var _answer_value: Variant
|
|
var _answer_method: Callable
|
|
|
|
func _get_specificity() -> int:
|
|
return expected_args.size()
|
|
|
|
func _is_answering(method: Callable, args: Array) -> bool:
|
|
if method != expected_method:
|
|
return false
|
|
if method.get_object() != expected_method.get_object():
|
|
return false
|
|
if expected_args.is_empty():
|
|
return true
|
|
if args.size() != expected_args.size():
|
|
return false
|
|
if args == expected_args:
|
|
return true
|
|
|
|
# Do a lenient check, so users don't trip on unexpected diffs, like
|
|
# [2, 4] != [2., 4.]
|
|
var lenient_actual := args.map(func(it): return _map_lenient(it))
|
|
var lenient_expected := expected_args.map(func(it): return _map_lenient(it))
|
|
if lenient_actual == lenient_expected:
|
|
return true
|
|
return false
|
|
|
|
func _get_answer(args: Array) -> Variant:
|
|
if _answer_method:
|
|
return _answer_method.call(args)
|
|
else:
|
|
return _answer_value
|
|
|
|
func _map_lenient(value: Variant) -> String:
|
|
if typeof(value) == TYPE_INT or typeof(value) == TYPE_FLOAT:
|
|
return "%.8f" % [value]
|
|
return str(value)
|
|
|
|
func _to_string() -> String:
|
|
return "Answer { %s.%s(%s) }" % [expected_method.get_object(), expected_method.get_method(), expected_args]
|
|
|
|
## A recorded method call
|
|
class Call:
|
|
## The method that was called
|
|
var method: Callable
|
|
|
|
## The arguments used for calling the method
|
|
var args: Array = []
|