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

2.9 KiB

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:

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:

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:

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