Files
shawn e7299b17e9 Phase 7: netfox + godot-jolt stack upgrade
Stack installed:
- netfox v1.35.3 (core + extras + noray + internals)
- godot-jolt v0.16.0-stable

Architecture:
- Server: ENet transport (works headless, no netfox deps)
- Client/Editor: netfox rollback (RollbackSynchronizer, TickInterpolator)

New/modified:
- docs/migration-netfox-plan.md — migration architecture
- scripts/network/network_manager.gd — netfox-aware ENet fallback
- scripts/network/player.gd — clean base player
- client/characters/player_netfox.gd — rollback player w/ WeaponManager
- client/characters/input/player_net_input.gd — BaseNetInput subclass
- client/characters/character/fps_character_controller.gd — netfox input feed
- client/weapons/ — weapon data, registry, TacticalWeaponHitscan, WeaponManager
- client/scripts/round_replicator.gd — client-side round state bridge
- server/scripts/round_manager.gd — improved state machine
- server/scripts/plugin_api/plugin_manager.gd — refined plugin system
- config: enemy_tag, ally_tag for meatball targeting

Removed: old C++ SimulationServer GDExtension (replaced by netfox rollback)
2026-07-02 17:39:22 -04:00

87 lines
2.5 KiB
GDScript

extends Node
class_name PhysicsDriver
# Physics driver based on netfox ticks
# Step physics in time with netfox and participates in rollback
var physics_space: RID
var snapshots: Dictionary = {}
# Number of physics steps to take per network tick
@export var physics_factor: int = 2
# Snapshot and Rollback entire physics space.
@export var rollback_physics_space: bool = true
func _enter_tree():
#regular ticks
NetworkTime.before_tick.connect(before_tick)
NetworkTime.after_tick_loop.connect(after_tick_loop)
#rollback ticks
if rollback_physics_space:
NetworkRollback.on_prepare_tick.connect(on_prepare_tick)
NetworkRollback.on_process_tick.connect(on_process_tick)
func _exit_tree():
NetworkTime.before_tick.disconnect(before_tick)
NetworkTime.after_tick_loop.disconnect(after_tick_loop)
#rollback ticks
if NetworkRollback.on_prepare_tick.is_connected(on_prepare_tick):
NetworkRollback.on_prepare_tick.disconnect(on_prepare_tick)
NetworkRollback.on_process_tick.disconnect(on_process_tick)
func _ready() -> void:
_init_physics_space()
# Emitted before a tick is run.
func before_tick(_delta: float, tick: int) -> void:
_snapshot_space(tick)
step_physics(_delta)
func on_prepare_tick(tick: int) -> void:
if NetworkRollback._rollback_from == tick:
# First tick of rollback loop, rewind
_rollback_space(tick)
else:
# Subsequent ticks are re-writing history.
_snapshot_space(tick)
func on_process_tick(_tick: int) -> void:
step_physics(NetworkTime.ticktime)
func after_tick_loop() -> void:
# Remove old snapshots
for i in snapshots.keys():
if i < NetworkRollback.history_start:
snapshots.erase(i)
func step_physics(_delta: float) -> void:
# Break up physics into smaller steps if needed
var frac_delta = _delta / physics_factor
var rollback_participants = get_tree().get_nodes_in_group("network_rigid_body")
for i in range(physics_factor):
for net_rigid_body in rollback_participants:
net_rigid_body._physics_rollback_tick(frac_delta, NetworkTime.tick)
_physics_step(frac_delta)
## Override this method to initialize the physics space.
func _init_physics_space() -> void:
pass
## Override this method to take one step in the physics space.
## [br][br]
## It should also flush and update all Godot nodes
func _physics_step(_delta) -> void:
pass
## Override this method to record the current state of the physics space.
func _snapshot_space(_tick: int) -> void:
pass
## Override this method to restore the physics space to a previous state.
func _rollback_space(_tick) -> void:
pass