From 5364f4d2c517a0b5f180b18e954bc08d2c7cd2fa Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 19 May 2026 14:12:03 -0700 Subject: [PATCH] Clean up net cull deprecation warnings --- AGRARIAN_DEVELOPMENT_ROADMAP.md | 9 +++- .../verify_net_cull_deprecation_cleanup.py | 44 +++++++++++++++++++ Scripts/verify_network_relevancy_rules.py | 16 +++---- Source/AgrarianGame/AgrarianCampfire.cpp | 2 +- Source/AgrarianGame/AgrarianItemPickup.cpp | 2 +- Source/AgrarianGame/AgrarianResourceNode.cpp | 2 +- Source/AgrarianGame/AgrarianShelterActor.cpp | 2 +- Source/AgrarianGame/AgrarianWaterSource.cpp | 2 +- .../AgrarianWeatherExposureZone.cpp | 2 +- Source/AgrarianGame/AgrarianWildlifeBase.cpp | 2 +- .../AgrarianWildlifeSpawnManager.cpp | 2 +- 11 files changed, 67 insertions(+), 18 deletions(-) create mode 100644 Scripts/verify_net_cull_deprecation_cleanup.py diff --git a/AGRARIAN_DEVELOPMENT_ROADMAP.md b/AGRARIAN_DEVELOPMENT_ROADMAP.md index 0b67b0b..4604926 100644 --- a/AGRARIAN_DEVELOPMENT_ROADMAP.md +++ b/AGRARIAN_DEVELOPMENT_ROADMAP.md @@ -865,9 +865,14 @@ Target deliverable: A small group can join a server, spawn into one biome, gathe - [x] Can reconnect and retain state. Added a reconnect state-retention QA gate tied to logout/restart player snapshots, safe player identity, transform, survival, care history, inventory restore, normal-spawn fallback behavior, and the two-client manual reconnect evidence path. - [x] Can restart server and retain placed shelter. Added a server-restart shelter persistence QA gate tied to `primitive_shelter` persistent actor state, world actor save/load, game-mode class registration, load-on-server-start behavior, shelter weather protection, and a release smoke requirement to place, save, restart, and confirm the shelter transform remains. - [x] No critical log spam during 30-minute test. Added a 30-minute critical log soak QA gate plus `scan_critical_log_spam.py` so client/server/release logs can be checked for fatal, crash, assertion, ensure, access-violation, callstack, and critical-error spam before a milestone package is treated as investor-stable. -- [ ] Clean up Unreal API deprecation warnings from packaged builds, starting +- [x] Clean up Unreal API deprecation warnings from packaged builds, starting with direct `NetCullDistanceSquared` access on replicated world actors before - future Unreal upgrades turn the warning into a compile blocker. + future Unreal upgrades turn the warning into a compile blocker. Replaced direct + `NetCullDistanceSquared = FMath::Square(...)` assignments with + `SetNetCullDistanceSquared(FMath::Square(...))` on item pickups, resource + nodes, campfires, shelters, wildlife, water sources, weather exposure zones, + and wildlife spawn managers, then added verifier coverage to prevent the + deprecated assignment style from returning. - [ ] Server remains stable with target test player count. ## 0.1.R Knowledge And Skill Foundation diff --git a/Scripts/verify_net_cull_deprecation_cleanup.py b/Scripts/verify_net_cull_deprecation_cleanup.py new file mode 100644 index 0000000..6ea001c --- /dev/null +++ b/Scripts/verify_net_cull_deprecation_cleanup.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +"""Verify replicated world actors no longer use deprecated net cull assignment.""" + +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +ROADMAP = ROOT / "AGRARIAN_DEVELOPMENT_ROADMAP.md" + +EXPECTED_SETTERS = { + "Source/AgrarianGame/AgrarianItemPickup.cpp": "SetNetCullDistanceSquared(FMath::Square(3000.0f));", + "Source/AgrarianGame/AgrarianResourceNode.cpp": "SetNetCullDistanceSquared(FMath::Square(4500.0f));", + "Source/AgrarianGame/AgrarianCampfire.cpp": "SetNetCullDistanceSquared(FMath::Square(6000.0f));", + "Source/AgrarianGame/AgrarianShelterActor.cpp": "SetNetCullDistanceSquared(FMath::Square(6000.0f));", + "Source/AgrarianGame/AgrarianWildlifeBase.cpp": "SetNetCullDistanceSquared(FMath::Square(6000.0f));", + "Source/AgrarianGame/AgrarianWaterSource.cpp": "SetNetCullDistanceSquared(FMath::Square(6500.0f));", + "Source/AgrarianGame/AgrarianWeatherExposureZone.cpp": "SetNetCullDistanceSquared(FMath::Square(6500.0f));", + "Source/AgrarianGame/AgrarianWildlifeSpawnManager.cpp": "SetNetCullDistanceSquared(FMath::Square(8000.0f));", +} + + +def main() -> None: + missing: list[str] = [] + for relative_path, setter in EXPECTED_SETTERS.items(): + path = ROOT / relative_path + text = path.read_text(encoding="utf-8") + if "NetCullDistanceSquared =" in text: + missing.append(f"{relative_path} still uses direct NetCullDistanceSquared assignment") + if setter not in text: + missing.append(f"{relative_path} missing {setter!r}") + + roadmap_text = ROADMAP.read_text(encoding="utf-8") + if "[x] Clean up Unreal API deprecation warnings from packaged builds" not in roadmap_text: + missing.append("roadmap item is not marked complete") + if "SetNetCullDistanceSquared" not in roadmap_text: + missing.append("roadmap summary does not mention SetNetCullDistanceSquared") + + if missing: + raise SystemExit("FAILED: " + "; ".join(missing)) + print("OK: net cull deprecation cleanup uses SetNetCullDistanceSquared across replicated world actors.") + + +if __name__ == "__main__": + main() diff --git a/Scripts/verify_network_relevancy_rules.py b/Scripts/verify_network_relevancy_rules.py index 58a59f4..af9a6b5 100644 --- a/Scripts/verify_network_relevancy_rules.py +++ b/Scripts/verify_network_relevancy_rules.py @@ -22,14 +22,14 @@ def require(content: str, needle: str, context: str) -> None: def main() -> int: errors: list[str] = [] checks = { - "Source/AgrarianGame/AgrarianItemPickup.cpp": ["NetCullDistanceSquared = FMath::Square(3000.0f);"], - "Source/AgrarianGame/AgrarianResourceNode.cpp": ["NetCullDistanceSquared = FMath::Square(4500.0f);"], - "Source/AgrarianGame/AgrarianCampfire.cpp": ["NetCullDistanceSquared = FMath::Square(6000.0f);"], - "Source/AgrarianGame/AgrarianShelterActor.cpp": ["NetCullDistanceSquared = FMath::Square(6000.0f);"], - "Source/AgrarianGame/AgrarianWildlifeBase.cpp": ["NetCullDistanceSquared = FMath::Square(6000.0f);"], - "Source/AgrarianGame/AgrarianWaterSource.cpp": ["NetCullDistanceSquared = FMath::Square(6500.0f);"], - "Source/AgrarianGame/AgrarianWeatherExposureZone.cpp": ["NetCullDistanceSquared = FMath::Square(6500.0f);"], - "Source/AgrarianGame/AgrarianWildlifeSpawnManager.cpp": ["NetCullDistanceSquared = FMath::Square(8000.0f);"], + "Source/AgrarianGame/AgrarianItemPickup.cpp": ["SetNetCullDistanceSquared(FMath::Square(3000.0f));"], + "Source/AgrarianGame/AgrarianResourceNode.cpp": ["SetNetCullDistanceSquared(FMath::Square(4500.0f));"], + "Source/AgrarianGame/AgrarianCampfire.cpp": ["SetNetCullDistanceSquared(FMath::Square(6000.0f));"], + "Source/AgrarianGame/AgrarianShelterActor.cpp": ["SetNetCullDistanceSquared(FMath::Square(6000.0f));"], + "Source/AgrarianGame/AgrarianWildlifeBase.cpp": ["SetNetCullDistanceSquared(FMath::Square(6000.0f));"], + "Source/AgrarianGame/AgrarianWaterSource.cpp": ["SetNetCullDistanceSquared(FMath::Square(6500.0f));"], + "Source/AgrarianGame/AgrarianWeatherExposureZone.cpp": ["SetNetCullDistanceSquared(FMath::Square(6500.0f));"], + "Source/AgrarianGame/AgrarianWildlifeSpawnManager.cpp": ["SetNetCullDistanceSquared(FMath::Square(8000.0f));"], "Docs/MultiplayerNetworkingDesign.md": [ "MVP actor cull distances", "item pickups: 30 meters", diff --git a/Source/AgrarianGame/AgrarianCampfire.cpp b/Source/AgrarianGame/AgrarianCampfire.cpp index d363593..17ae9bc 100644 --- a/Source/AgrarianGame/AgrarianCampfire.cpp +++ b/Source/AgrarianGame/AgrarianCampfire.cpp @@ -45,7 +45,7 @@ AAgrarianCampfire::AAgrarianCampfire() { PrimaryActorTick.bCanEverTick = true; bReplicates = true; - NetCullDistanceSquared = FMath::Square(6000.0f); + SetNetCullDistanceSquared(FMath::Square(6000.0f)); Mesh = CreateDefaultSubobject(TEXT("Mesh")); RootComponent = Mesh; diff --git a/Source/AgrarianGame/AgrarianItemPickup.cpp b/Source/AgrarianGame/AgrarianItemPickup.cpp index 2aac3d3..e49cb48 100644 --- a/Source/AgrarianGame/AgrarianItemPickup.cpp +++ b/Source/AgrarianGame/AgrarianItemPickup.cpp @@ -12,7 +12,7 @@ AAgrarianItemPickup::AAgrarianItemPickup() { bReplicates = true; - NetCullDistanceSquared = FMath::Square(3000.0f); + SetNetCullDistanceSquared(FMath::Square(3000.0f)); Mesh = CreateDefaultSubobject(TEXT("Mesh")); RootComponent = Mesh; diff --git a/Source/AgrarianGame/AgrarianResourceNode.cpp b/Source/AgrarianGame/AgrarianResourceNode.cpp index 70e0df9..daeb508 100644 --- a/Source/AgrarianGame/AgrarianResourceNode.cpp +++ b/Source/AgrarianGame/AgrarianResourceNode.cpp @@ -16,7 +16,7 @@ AAgrarianResourceNode::AAgrarianResourceNode() { bReplicates = true; - NetCullDistanceSquared = FMath::Square(4500.0f); + SetNetCullDistanceSquared(FMath::Square(4500.0f)); Mesh = CreateDefaultSubobject(TEXT("Mesh")); RootComponent = Mesh; diff --git a/Source/AgrarianGame/AgrarianShelterActor.cpp b/Source/AgrarianGame/AgrarianShelterActor.cpp index f807aed..d3fa4e5 100644 --- a/Source/AgrarianGame/AgrarianShelterActor.cpp +++ b/Source/AgrarianGame/AgrarianShelterActor.cpp @@ -34,7 +34,7 @@ namespace AAgrarianShelterActor::AAgrarianShelterActor() { bReplicates = true; - NetCullDistanceSquared = FMath::Square(6000.0f); + SetNetCullDistanceSquared(FMath::Square(6000.0f)); Mesh = CreateDefaultSubobject(TEXT("Mesh")); RootComponent = Mesh; diff --git a/Source/AgrarianGame/AgrarianWaterSource.cpp b/Source/AgrarianGame/AgrarianWaterSource.cpp index afa931a..0c42343 100644 --- a/Source/AgrarianGame/AgrarianWaterSource.cpp +++ b/Source/AgrarianGame/AgrarianWaterSource.cpp @@ -12,7 +12,7 @@ AAgrarianWaterSource::AAgrarianWaterSource() { bReplicates = true; - NetCullDistanceSquared = FMath::Square(6500.0f); + SetNetCullDistanceSquared(FMath::Square(6500.0f)); Mesh = CreateDefaultSubobject(TEXT("Mesh")); RootComponent = Mesh; diff --git a/Source/AgrarianGame/AgrarianWeatherExposureZone.cpp b/Source/AgrarianGame/AgrarianWeatherExposureZone.cpp index 1a8e1a2..fe6cee5 100644 --- a/Source/AgrarianGame/AgrarianWeatherExposureZone.cpp +++ b/Source/AgrarianGame/AgrarianWeatherExposureZone.cpp @@ -6,7 +6,7 @@ AAgrarianWeatherExposureZone::AAgrarianWeatherExposureZone() { bReplicates = true; - NetCullDistanceSquared = FMath::Square(6500.0f); + SetNetCullDistanceSquared(FMath::Square(6500.0f)); ExposureVolume = CreateDefaultSubobject(TEXT("ExposureVolume")); RootComponent = ExposureVolume; diff --git a/Source/AgrarianGame/AgrarianWildlifeBase.cpp b/Source/AgrarianGame/AgrarianWildlifeBase.cpp index b0b4ac4..b25fe3c 100644 --- a/Source/AgrarianGame/AgrarianWildlifeBase.cpp +++ b/Source/AgrarianGame/AgrarianWildlifeBase.cpp @@ -41,7 +41,7 @@ AAgrarianWildlifeBase::AAgrarianWildlifeBase() { PrimaryActorTick.bCanEverTick = true; bReplicates = true; - NetCullDistanceSquared = FMath::Square(6000.0f); + SetNetCullDistanceSquared(FMath::Square(6000.0f)); AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned; AIControllerClass = AAIController::StaticClass(); diff --git a/Source/AgrarianGame/AgrarianWildlifeSpawnManager.cpp b/Source/AgrarianGame/AgrarianWildlifeSpawnManager.cpp index 7bad06b..6ed8233 100644 --- a/Source/AgrarianGame/AgrarianWildlifeSpawnManager.cpp +++ b/Source/AgrarianGame/AgrarianWildlifeSpawnManager.cpp @@ -9,7 +9,7 @@ AAgrarianWildlifeSpawnManager::AAgrarianWildlifeSpawnManager() { PrimaryActorTick.bCanEverTick = true; bReplicates = true; - NetCullDistanceSquared = FMath::Square(8000.0f); + SetNetCullDistanceSquared(FMath::Square(8000.0f)); SetReplicatingMovement(false); }