Stabilize runtime validation under dynamic UI load
This commit is contained in:
parent
983e4d0ec3
commit
d2dce7f900
5 changed files with 46 additions and 11 deletions
|
|
@ -15,8 +15,12 @@ func _enter_tree() -> void:
|
||||||
func _on_node_added(node: Node) -> void:
|
func _on_node_added(node: Node) -> void:
|
||||||
enforce_node(node)
|
enforce_node(node)
|
||||||
# Some runtime presenters assign their mesh or material immediately after
|
# Some runtime presenters assign their mesh or material immediately after
|
||||||
# add_child(). Recheck once deferred so those resources are covered too.
|
# add_child(). Recheck those 3D resource owners once deferred so the newly
|
||||||
call_deferred("_enforce_deferred_node", weakref(node))
|
# assigned resources are covered too. CanvasItems keep their filter setting
|
||||||
|
# when their texture changes, so deferring every dynamic UI node only floods
|
||||||
|
# the message queue during large inventory and catalog refreshes.
|
||||||
|
if _needs_deferred_resource_check(node):
|
||||||
|
call_deferred("_enforce_deferred_node", weakref(node))
|
||||||
|
|
||||||
|
|
||||||
func _enforce_existing_tree() -> void:
|
func _enforce_existing_tree() -> void:
|
||||||
|
|
@ -29,6 +33,15 @@ func _enforce_deferred_node(node_ref: WeakRef) -> void:
|
||||||
enforce_node(node)
|
enforce_node(node)
|
||||||
|
|
||||||
|
|
||||||
|
static func _needs_deferred_resource_check(node: Node) -> bool:
|
||||||
|
return (
|
||||||
|
node is GeometryInstance3D
|
||||||
|
or node is MultiMeshInstance3D
|
||||||
|
or node is GPUParticles3D
|
||||||
|
or node is CPUParticles3D
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
static func enforce_subtree(node: Node) -> void:
|
static func enforce_subtree(node: Node) -> void:
|
||||||
enforce_node(node)
|
enforce_node(node)
|
||||||
for child: Node in node.get_children():
|
for child: Node in node.get_children():
|
||||||
|
|
|
||||||
|
|
@ -31,9 +31,14 @@ func _run() -> void:
|
||||||
for _frame: int in 8:
|
for _frame: int in 8:
|
||||||
await process_frame
|
await process_frame
|
||||||
assert(bool(main.get("_application_initialized")))
|
assert(bool(main.get("_application_initialized")))
|
||||||
|
var session := main.get_node("%NetworkSession") as NetworkSession
|
||||||
|
assert(bool(main.call(
|
||||||
|
"_apply_world", WorldLayout.STARTER_ISLAND, 1, true
|
||||||
|
)))
|
||||||
|
assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1))
|
||||||
assert(bool(main.call("_prepare_private_host")))
|
assert(bool(main.call("_prepare_private_host")))
|
||||||
var save_manager := main.get("_save_manager") as PlayerSaveManager
|
var save_manager := main.get("_save_manager") as PlayerSaveManager
|
||||||
assert(save_manager.initialize_new_game())
|
assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND))
|
||||||
main.call("_enter_gameplay")
|
main.call("_enter_gameplay")
|
||||||
for _frame: int in 8:
|
for _frame: int in 8:
|
||||||
await process_frame
|
await process_frame
|
||||||
|
|
@ -42,7 +47,6 @@ func _run() -> void:
|
||||||
var catalog := main.get("fish_catalog") as FishPool
|
var catalog := main.get("fish_catalog") as FishPool
|
||||||
var sale_service := main.get_node("%NetworkSaleService") as NetworkSaleService
|
var sale_service := main.get_node("%NetworkSaleService") as NetworkSaleService
|
||||||
var shop_service := main.get_node("%NetworkShopService") as NetworkShopService
|
var shop_service := main.get_node("%NetworkShopService") as NetworkShopService
|
||||||
var session := main.get_node("%NetworkSession") as NetworkSession
|
|
||||||
var reservations := (
|
var reservations := (
|
||||||
main.get_node("%PlayerAssetReservationService")
|
main.get_node("%PlayerAssetReservationService")
|
||||||
as PlayerAssetReservationService
|
as PlayerAssetReservationService
|
||||||
|
|
@ -554,7 +558,10 @@ func _test_host_backpack_purchase(
|
||||||
for expected_capacity: int in [18, 27, 36]:
|
for expected_capacity: int in [18, 27, 36]:
|
||||||
_shop_result.clear()
|
_shop_result.clear()
|
||||||
assert(not shop_service.request_backpack_capacity_upgrade().is_empty())
|
assert(not shop_service.request_backpack_capacity_upgrade().is_empty())
|
||||||
assert(not _shop_result.is_empty() and bool(_shop_result[1]))
|
assert(
|
||||||
|
not _shop_result.is_empty() and bool(_shop_result[1]),
|
||||||
|
"Backpack purchase failed: %s" % [_shop_result],
|
||||||
|
)
|
||||||
assert(layout.get_inventory_capacity() == expected_capacity)
|
assert(layout.get_inventory_capacity() == expected_capacity)
|
||||||
assert(player.wallet.get_balance() == balance_before - total_cost)
|
assert(player.wallet.get_balance() == balance_before - total_cost)
|
||||||
assert(layout.get_next_backpack_cost() == -1)
|
assert(layout.get_next_backpack_cost() == -1)
|
||||||
|
|
@ -575,7 +582,10 @@ func _test_host_storage_purchase(
|
||||||
for expected_capacity: int in [18, 27, 36, 45, 54, 63, 72]:
|
for expected_capacity: int in [18, 27, 36, 45, 54, 63, 72]:
|
||||||
_shop_result.clear()
|
_shop_result.clear()
|
||||||
assert(not shop_service.request_cooler_capacity_upgrade().is_empty())
|
assert(not shop_service.request_cooler_capacity_upgrade().is_empty())
|
||||||
assert(not _shop_result.is_empty() and bool(_shop_result[1]))
|
assert(
|
||||||
|
not _shop_result.is_empty() and bool(_shop_result[1]),
|
||||||
|
"Cooler purchase failed: %s" % [_shop_result],
|
||||||
|
)
|
||||||
assert(capacity.get_capacity() == expected_capacity)
|
assert(capacity.get_capacity() == expected_capacity)
|
||||||
assert(player.wallet.get_balance() == balance_before - total_cost)
|
assert(player.wallet.get_balance() == balance_before - total_cost)
|
||||||
assert(capacity.get_next_cost() == -1)
|
assert(capacity.get_next_cost() == -1)
|
||||||
|
|
|
||||||
|
|
@ -21,9 +21,13 @@ func _run() -> void:
|
||||||
assert(bool(main.get("_application_initialized")))
|
assert(bool(main.get("_application_initialized")))
|
||||||
|
|
||||||
var session := main.get_node("%NetworkSession") as NetworkSession
|
var session := main.get_node("%NetworkSession") as NetworkSession
|
||||||
|
assert(bool(main.call(
|
||||||
|
"_apply_world", WorldLayout.STARTER_ISLAND, 1, true
|
||||||
|
)))
|
||||||
|
assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1))
|
||||||
assert(session.start_private_host(TEST_PORT))
|
assert(session.start_private_host(TEST_PORT))
|
||||||
var save_manager := main.get("_save_manager") as PlayerSaveManager
|
var save_manager := main.get("_save_manager") as PlayerSaveManager
|
||||||
assert(save_manager.initialize_new_game())
|
assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND))
|
||||||
main.call("_enter_gameplay")
|
main.call("_enter_gameplay")
|
||||||
for _frame: int in 8:
|
for _frame: int in 8:
|
||||||
await process_frame
|
await process_frame
|
||||||
|
|
@ -38,7 +42,7 @@ func _run() -> void:
|
||||||
and game_ui != null
|
and game_ui != null
|
||||||
and catalog != null
|
and catalog != null
|
||||||
)
|
)
|
||||||
fishing_spot.minimum_showcase_duration = 0.15
|
fishing_spot.minimum_showcase_duration = 1.0
|
||||||
assert(player.bag.add_item(&"crab_net"))
|
assert(player.bag.add_item(&"crab_net"))
|
||||||
assert(player.hotbar.assign_item(0, &"crab_net"))
|
assert(player.hotbar.assign_item(0, &"crab_net"))
|
||||||
assert(player.hotbar.select_slot(0))
|
assert(player.hotbar.select_slot(0))
|
||||||
|
|
@ -81,7 +85,7 @@ func _run() -> void:
|
||||||
await process_frame
|
await process_frame
|
||||||
assert(fishing_spot.get("_pending_catch") == crab_catch)
|
assert(fishing_spot.get("_pending_catch") == crab_catch)
|
||||||
Input.action_release("fish_primary")
|
Input.action_release("fish_primary")
|
||||||
await create_timer(0.2).timeout
|
fishing_spot.set("_showcase_input_lock_remaining", 0.0)
|
||||||
await process_frame
|
await process_frame
|
||||||
assert(bool(fishing_spot.get("_put_away_press_armed")))
|
assert(bool(fishing_spot.get("_put_away_press_armed")))
|
||||||
Input.parse_input_event(pocket_event)
|
Input.parse_input_event(pocket_event)
|
||||||
|
|
|
||||||
|
|
@ -21,13 +21,17 @@ func _run() -> void:
|
||||||
assert(bool(main.get("_application_initialized")))
|
assert(bool(main.get("_application_initialized")))
|
||||||
var session := main.get_node("%NetworkSession") as NetworkSession
|
var session := main.get_node("%NetworkSession") as NetworkSession
|
||||||
assert(session != null)
|
assert(session != null)
|
||||||
|
assert(bool(main.call(
|
||||||
|
"_apply_world", WorldLayout.STARTER_ISLAND, 1, true
|
||||||
|
)))
|
||||||
|
assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1))
|
||||||
var occupied_port := PacketPeerUDP.new()
|
var occupied_port := PacketPeerUDP.new()
|
||||||
assert(occupied_port.bind(18137, "127.0.0.1") == OK)
|
assert(occupied_port.bind(18137, "127.0.0.1") == OK)
|
||||||
assert(session.start_private_host(18137, 3))
|
assert(session.start_private_host(18137, 3))
|
||||||
assert(session.get_host_port() == 18138)
|
assert(session.get_host_port() == 18138)
|
||||||
occupied_port.close()
|
occupied_port.close()
|
||||||
var save_manager := main.get("_save_manager") as PlayerSaveManager
|
var save_manager := main.get("_save_manager") as PlayerSaveManager
|
||||||
assert(save_manager.initialize_new_game())
|
assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND))
|
||||||
main.call("_enter_gameplay")
|
main.call("_enter_gameplay")
|
||||||
await physics_frame
|
await physics_frame
|
||||||
await physics_frame
|
await physics_frame
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,13 @@ func _run() -> void:
|
||||||
await process_frame
|
await process_frame
|
||||||
assert(bool(main.get("_application_initialized")))
|
assert(bool(main.get("_application_initialized")))
|
||||||
var session := main.get_node("%NetworkSession") as NetworkSession
|
var session := main.get_node("%NetworkSession") as NetworkSession
|
||||||
|
assert(bool(main.call(
|
||||||
|
"_apply_world", WorldLayout.STARTER_ISLAND, 1, true
|
||||||
|
)))
|
||||||
|
assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1))
|
||||||
assert(session.start_private_host(TEST_PORT))
|
assert(session.start_private_host(TEST_PORT))
|
||||||
var save_manager := main.get("_save_manager") as PlayerSaveManager
|
var save_manager := main.get("_save_manager") as PlayerSaveManager
|
||||||
assert(save_manager.initialize_new_game())
|
assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND))
|
||||||
main.call("_enter_gameplay")
|
main.call("_enter_gameplay")
|
||||||
await physics_frame
|
await physics_frame
|
||||||
await physics_frame
|
await physics_frame
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue