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>
63 lines
2.3 KiB
Markdown
63 lines
2.3 KiB
Markdown
# TickInterpolator
|
|
|
|
Interpolates between network ticks to smooth out motion.
|
|
|
|
Uses [Interpolators] under the hood to support various data types. To read more
|
|
on best practices, see [Interpolation caveats].
|
|
|
|
## Configuring interpolation
|
|
|
|
To use *TickInterpolator*, add it as a child to the target node, specify the
|
|
root node, and configure which properties to interpolate:
|
|
|
|

|
|
|
|
*Root* specifies the root node for resolving *Properties*. Best practice
|
|
dictates to add *TickInterpolator* under its target, so *Root* will most often
|
|
be the *TickInterpolator*'s parent node.
|
|
|
|
*Properties* specify which properties to interpolate. See [Property paths] on
|
|
how to specify these values.
|
|
|
|
*Record First State* will make *TickInterpolator* take a snapshot when the Node
|
|
is instantiated. This snapshot will be used for interpolation, instead of
|
|
waiting for the next network tick. Useful for objects which start moving
|
|
instantly upon entering the scene tree, like projectiles.
|
|
|
|
*Enable Recording* toggles automatic state recording. When enabled,
|
|
*TickInterpolator* will take a new snapshot after each network tick loop and
|
|
interpolate towards that. Disabling this will require you to manually call
|
|
`push_state()` whenever the *properties* are updated.
|
|
|
|
## Sudden changes
|
|
|
|
When a node makes a sudden change, like teleporting from one place to another,
|
|
interpolation may not be desired.
|
|
|
|
Call `teleport()` in these cases to avoid interpolation and just jump to the
|
|
current state. Interpolation will resume after the current state.
|
|
|
|
Example:
|
|
|
|
```gdscript
|
|
func _tick(tick, delta):
|
|
# Respawn after a while
|
|
if _tick == respawn_tick:
|
|
# Jump to spawn point, without interpolation
|
|
position = spawn_position
|
|
$TickInterpolator.teleport()
|
|
```
|
|
|
|
## Changing configuration
|
|
|
|
*TickInterpolator* has to do some setup work whenever the interpolated
|
|
properties change, e.g. when a new property needs to be interpolated.
|
|
|
|
By default, this work is done upon instantiation. If you need to change
|
|
interpolated properties during runtime, make sure to call `process_settings()`,
|
|
otherwise *TickInterpolator* won't apply the changes.
|
|
|
|
[Interpolators]: ../guides/interpolators.md
|
|
[Interpolation caveats]: ../tutorials/interpolation-caveats.md
|
|
[Property paths]: ../guides/property-paths.md
|