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,100 @@
|
||||
# Interpolators
|
||||
|
||||
Tracks interpolators for various data types. Provided as a static class.
|
||||
|
||||
To smooth out motion between network ticks, [TickInterpolator] interpolates
|
||||
nodes' state properties between the current and the previous tick. The type of
|
||||
data to be interpolated is not known in advance, and can be any built-in or
|
||||
even custom type configured by the developer.
|
||||
|
||||
*Interpolators* provides methods to register interpolators for any data type,
|
||||
and even provides some for built-in data types.
|
||||
|
||||
## Interpolating values
|
||||
|
||||
*Interpolators* can be used to interpolate between any two values, as long as
|
||||
they hold the same data type:
|
||||
|
||||
```gdscript
|
||||
extends Node3D
|
||||
|
||||
@export var target_node
|
||||
@export var approach_time = 0.5
|
||||
|
||||
func _process(delta):
|
||||
# Approach target node, if it exists
|
||||
if target_node:
|
||||
var from_xform = global_transform
|
||||
var to_xform = target_node.global_transform
|
||||
var factor = delta / approach_time
|
||||
|
||||
global_transform = Interpolators.interpolate(from_xform, to_xform, factor)
|
||||
```
|
||||
|
||||
Note that in this case, *Interpolators* will try to look up the appropriate
|
||||
interpolator based on the provided values. If no interpolator is found, a
|
||||
fallback is used, that simply returns the value closer to *factor* - i.e. the
|
||||
starting value if *factor* is less than 0.5 and the target value otherwise.
|
||||
|
||||
## Caching interpolators
|
||||
|
||||
To avoid having to look up the right interpolator every frame, you can cache
|
||||
it:
|
||||
|
||||
```gdscript
|
||||
extends Node3D
|
||||
|
||||
@export target_node
|
||||
@export approach_time = 0.5
|
||||
|
||||
var interpolator
|
||||
|
||||
func _ready():
|
||||
interpolator = Interpolators.find_for(global_transform)
|
||||
|
||||
func _process(delta):
|
||||
# Approach target node, if it exists
|
||||
if target_node:
|
||||
var from_xform = global_transform
|
||||
var to_xform = target_node.global_transform
|
||||
var factor = delta / approach_time
|
||||
|
||||
global_transform = interpolator.call(from_xform, to_xform, factor)
|
||||
```
|
||||
|
||||
## Custom interpolators
|
||||
|
||||
*Interpolators* supports interpolators for custom data types, and even
|
||||
overriding built-in interpolators. Both can be done by registering an
|
||||
interpolator:
|
||||
|
||||
```gdscript
|
||||
Interpolators.register(
|
||||
func(a): return a is float, # Condition
|
||||
func(a, b, f): return lerpf(a, b, f * f) # Interpolation
|
||||
)
|
||||
```
|
||||
|
||||
The above registers a custom interpolator by specifying a condition function
|
||||
and an interpolation function. Since it applies to an already supported type,
|
||||
it overrides the built-in interpolator.
|
||||
|
||||
During lookup, *Interpolators* calls the *condition* function of each
|
||||
interpolator and returns the one whose *condition* function returns true. If
|
||||
multiple interpolators are applicable, *Interpolators* returns the last
|
||||
registered one.
|
||||
|
||||
The *interpolation* function receives the starting value *a*, the target value
|
||||
*b* and the interpolation factor *f*.
|
||||
|
||||
## Built-in interpolators
|
||||
|
||||
The following types are supported by default:
|
||||
|
||||
* float
|
||||
* Vector2
|
||||
* Vector3
|
||||
* Transform2D
|
||||
* Transform3D
|
||||
|
||||
[TickInterpolator]: ../nodes/tick-interpolator.md
|
||||
Reference in New Issue
Block a user