Skip to content

Commit cac71a5

Browse files
authored
fix: Prevent crash on free when RBS is not last node (#600)
`NOTIFICATION_PREDELETE` runs in reverse order, so if RBS is located in the scene tree _before_ any rollback-managed node, RBS will try to deregister a node that has been already freed. The solution was to deregister nodes in `_exit_tree()`, if the synchronizer's root node is queued for deletion. Fixes #595
1 parent 4047501 commit cac71a5

7 files changed

Lines changed: 30 additions & 25 deletions

File tree

addons/netfox.extras/plugin.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
name="netfox.extras"
44
description="Game-specific utilities for Netfox"
55
author="Tamas Galffy and contributors"
6-
version="1.43.4"
6+
version="1.43.5"
77
script="netfox-extras.gd"

addons/netfox.internals/plugin.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
name="netfox.internals"
44
description="Shared internals for netfox addons"
55
author="Tamas Galffy and contributors"
6-
version="1.43.4"
6+
version="1.43.5"
77
script="plugin.gd"

addons/netfox.noray/plugin.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
name="netfox.noray"
44
description="Bulletproof your connectivity with noray integration for netfox"
55
author="Tamas Galffy and contributors"
6-
version="1.43.4"
6+
version="1.43.5"
77
script="netfox-noray.gd"

addons/netfox/plugin.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
name="netfox"
44
description="Shared internals for netfox addons"
55
author="Tamas Galffy and contributors"
6-
version="1.43.4"
6+
version="1.43.5"
77
script="netfox.gd"

addons/netfox/rollback/predictive-synchronizer.gd

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,14 @@ func _enter_tree() -> void:
116116
func _exit_tree() -> void:
117117
_managed_roots.erase(root)
118118

119+
if root.is_queued_for_deletion():
120+
for node in _sim_nodes:
121+
RollbackSimulationServer.deregister_node(node)
122+
for node in _liveness_nodes:
123+
RollbackLivenessServer.deregister(node)
124+
for subject in _state_properties.get_subjects():
125+
NetworkHistoryServer.deregister(subject)
126+
119127
func _reprocess_settings() -> void:
120128
if not _properties_dirty or Engine.is_editor_hint():
121129
return
@@ -140,13 +148,6 @@ func add_state(node: Variant, property: String):
140148
func _notification(what: int) -> void:
141149
if what == NOTIFICATION_EDITOR_PRE_SAVE:
142150
update_configuration_warnings()
143-
if what == NOTIFICATION_PREDELETE:
144-
for node in _sim_nodes:
145-
RollbackSimulationServer.deregister_node(node)
146-
for node in _liveness_nodes:
147-
RollbackLivenessServer.deregister(node)
148-
for subject in _state_properties.get_subjects():
149-
NetworkHistoryServer.deregister(subject)
150151

151152
func _get_configuration_warnings() -> PackedStringArray:
152153
if not root:

addons/netfox/rollback/rollback-synchronizer.gd

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -330,15 +330,6 @@ func _ready() -> void:
330330
func _notification(what: int) -> void:
331331
if what == NOTIFICATION_EDITOR_PRE_SAVE:
332332
update_configuration_warnings()
333-
elif what == NOTIFICATION_PREDELETE:
334-
for node in _sim_nodes + _state_properties.get_subjects() + _input_properties.get_subjects():
335-
RollbackSimulationServer.deregister_node(node)
336-
NetworkSynchronizationServer.deregister(node)
337-
NetworkIdentityServer.deregister_node(node)
338-
NetworkHistoryServer.deregister(node)
339-
340-
for node in _liveness_nodes:
341-
RollbackLivenessServer.deregister(node)
342333

343334
func _get_configuration_warnings() -> PackedStringArray:
344335
if not root:
@@ -381,6 +372,17 @@ func _enter_tree() -> void:
381372
func _exit_tree() -> void:
382373
_managed_roots.erase(root)
383374

375+
if root.is_queued_for_deletion():
376+
# RBS and its nodes are being freed, time to deregister everything
377+
for node in _sim_nodes + _state_properties.get_subjects() + _input_properties.get_subjects():
378+
RollbackSimulationServer.deregister_node(node)
379+
NetworkSynchronizationServer.deregister(node)
380+
NetworkIdentityServer.deregister_node(node)
381+
NetworkHistoryServer.deregister(node)
382+
383+
for node in _liveness_nodes:
384+
RollbackLivenessServer.deregister(node)
385+
384386
func _reprocess_settings() -> void:
385387
if not _properties_dirty or Engine.is_editor_hint():
386388
return

addons/netfox/state-synchronizer.gd

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,6 @@ func clear_schema() -> void:
130130
func _notification(what) -> void:
131131
if what == NOTIFICATION_EDITOR_PRE_SAVE:
132132
update_configuration_warnings()
133-
elif what == NOTIFICATION_PREDELETE:
134-
for node in _properties.get_subjects():
135-
NetworkSynchronizationServer.deregister(node)
136-
NetworkHistoryServer.deregister(node)
137-
NetworkIdentityServer.deregister_node(node)
138133

139134
func _get_configuration_warnings() -> PackedStringArray:
140135
if not root:
@@ -160,6 +155,13 @@ func _enter_tree() -> void:
160155

161156
process_settings.call_deferred()
162157

158+
func _exit_tree() -> void:
159+
if root.is_queued_for_deletion():
160+
for node in _properties.get_subjects():
161+
NetworkSynchronizationServer.deregister(node)
162+
NetworkHistoryServer.deregister(node)
163+
NetworkIdentityServer.deregister_node(node)
164+
163165
func _ready():
164166
# Reprocess authority
165167
# Important if nodes are pre-placed in the scene - node starts as owned by

0 commit comments

Comments
 (0)