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>
101 lines
2.9 KiB
Markdown
101 lines
2.9 KiB
Markdown
# 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
|