diff --git a/addons/netfox/rollback/rollback-synchronizer.gd b/addons/netfox/rollback/rollback-synchronizer.gd index bcff3176..ed8162ec 100644 --- a/addons/netfox/rollback/rollback-synchronizer.gd +++ b/addons/netfox/rollback/rollback-synchronizer.gd @@ -328,7 +328,9 @@ func _ready() -> void: multiplayer.connected_to_server.connect(process_settings) func _notification(what: int) -> void: - if what == NOTIFICATION_EDITOR_PRE_SAVE: + if what == NOTIFICATION_PREDELETE: + _cleanup() + elif what == NOTIFICATION_EDITOR_PRE_SAVE: update_configuration_warnings() func _get_configuration_warnings() -> PackedStringArray: @@ -373,15 +375,23 @@ func _exit_tree() -> void: _managed_roots.erase(root) if root.is_queued_for_deletion(): - # RBS and its nodes are being freed, time to deregister everything - for node in _sim_nodes + _state_properties.get_subjects() + _input_properties.get_subjects(): - RollbackSimulationServer.deregister_node(node) - NetworkSynchronizationServer.deregister(node) - NetworkIdentityServer.deregister_node(node) - NetworkHistoryServer.deregister(node) - - for node in _liveness_nodes: - RollbackLivenessServer.deregister(node) + _cleanup() + +func _cleanup() -> void: + if _sim_nodes.is_empty(): + return + + for node in _sim_nodes + _state_properties.get_subjects() + _input_properties.get_subjects(): + RollbackSimulationServer.deregister_node(node) + NetworkSynchronizationServer.deregister(node) + NetworkIdentityServer.deregister_node(node) + NetworkHistoryServer.deregister(node) + + for node in _liveness_nodes: + RollbackLivenessServer.deregister(node) + + _sim_nodes.clear() + _liveness_nodes.clear() func _reprocess_settings() -> void: if not _properties_dirty or Engine.is_editor_hint(): diff --git a/addons/netfox/servers/network-history-server.gd b/addons/netfox/servers/network-history-server.gd index cce5325f..f1369b16 100644 --- a/addons/netfox/servers/network-history-server.gd +++ b/addons/netfox/servers/network-history-server.gd @@ -181,6 +181,9 @@ func _record(tick: int, history: _PerObjectHistory, snapshots: _HistoryBuffer, p if _ignored_subjects.has(subject): continue + + if not subject.is_inside_tree(): + continue var is_auth := auth_filter.call(subject) diff --git a/addons/netfox/servers/rollback-simulation-server.gd b/addons/netfox/servers/rollback-simulation-server.gd index 40e74adb..85c0d3c0 100644 --- a/addons/netfox/servers/rollback-simulation-server.gd +++ b/addons/netfox/servers/rollback-simulation-server.gd @@ -116,6 +116,13 @@ func simulate(delta: float, tick: int) -> void: # Determine predicted nodes for node in _callbacks.keys(): + if not is_instance_valid(node): + _callbacks.erase(node) + continue + + if not node.is_inside_tree(): + continue + if _is_predicting(input_snapshot, node): _predicted_nodes.add(node)