View Issue Details

IDProjectCategoryLast Update
0025752AI War 2Bug - GameplayNov 3, 2021 9:57 pm
Reportertom.prince Assigned ToChris_McElligottPark  
Severitymajor 
Status resolvedResolutionfixed 
Product VersionBeta 3.742 "Classic Map" For DLC1 
Fixed in VersionBeta 3.744 Pathfinding 
Summary0025752: Called ... pathfinder from two different contexts!
DescriptionI ran into this a bunch of times, doing hacks on the first planet out from my homeworld. It didn't seem to persist after re-loading the game.
TagsNo tags attached.

Relationships

related to 0025715 resolvedChris_McElligottPark Relentless wave pathfinder exception 

Activities

tom.prince

Nov 1, 2021 1:59 am

developer  

1.save (336,499 bytes)
ArcenDebugLog.txt (32,763 bytes)   
10/31/2021 8:21:21 PM	3.742	SINGLEP	Calculated Initial Strengths For New Full Galaxy Map in 43ms
10/31/2021 8:21:21 PM	3.742	SINGLEP	Generate FULL Map Complete  14018ms Seed: 361944403
10/31/2021 8:21:21 PM	3.742	SINGLEP	DELAYED6: Fixed incorrect count of ships to be granted.  Was 10, now 3 Bomber Drone Hangar from Other Defensive Schematic Server
10/31/2021 8:26:03 PM	3.742	SINGLEP	DELAYED7: Called Relentless AI Wave_facplan pathfinder from two different contexts!  First was LRP_AIRelentlessWave_idx_16, new one is LRP_AIRelentlessWave_idx_17
  at System.Environment.get_StackTrace () [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at Arcen.Universal.ArcenDebugging.ArcenDebugLog (System.String Message, Arcen.Universal.Verbosity Verbosity) [0x00000] in <4796a817b30f4c8cac019c45fcf82a2a>:0 
  at Arcen.AIW2.External.ArcenPathfinder`1[N].FindPathInner (Arcen.Universal.List`1[T] PathToFill, N Origin, N Target, System.Int32 NeedToGetWithinXRangeOfTarget, System.Int32 RequiresNoMoreThanXRangeFromOrigin, System.Boolean DoDebugLog, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.ArcenPathfinder`1[N].FindPath (Arcen.Universal.List`1[T] PathToFill, N Origin, N Target, System.Int32 NeedToGetWithinXRangeOfTarget, System.Int32 RequiresNoMoreThanXRangeFromOrigin, System.Boolean DoDebugLog, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.PathingHelper.InnerFindPath_Raw (Arcen.AIW2.Core.Faction faction, Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.SimPlannerImplementation.InnerFindPath_Raw (Arcen.AIW2.Core.Faction faction, Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.Core.ExternalFactionBaseInfo.FindPathFreshOrFromCache (Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.Core.Faction.FindPathFreshOrFromCache (Arcen.AIW2.Core.Planet origin, Arcen.AIW2.Core.Planet destination, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.External.AIRelentlessAndBorderAggressionFactionDeepInfoRoot.AttackTargetPlanet (Arcen.AIW2.Core.Planet start, Arcen.AIW2.Core.Planet destination, Arcen.Universal.List`1[T] ships, Arcen.AIW2.Core.Faction faction, Arcen.AIW2.External.ArcenLongTermIntermittentPlanningContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.AIRelentlessAndBorderAggressionFactionDeepInfoRoot+<>c__DisplayClass16_1.<DoLongRangePlanning_OnBackgroundNonSimThread_Subclass>b__1 (Arcen.Universal.KeyValuePair`2[TKey,TValue] pair) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.Universal.DictionaryOfLists`2[TKey,TValue].DoFor (Arcen.Universal.DictionaryProcessor`2[TKey,TValue] Processor) [0x00000] in <4796a817b30f4c8cac019c45fcf82a2a>:0 
  at Arcen.AIW2.External.AIRelentlessAndBorderAggressionFactionDeepInfoRoot.DoLongRangePlanning_OnBackgroundNonSimThread_Subclass (Arcen.AIW2.External.ArcenLongTermIntermittentPlanningContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.ExternalFactionDeepInfoRoot.DoLongRangePlanning_OnBackgroundNonSimThread_HostOnly (Arcen.AIW2.Core.ILongRangePlanningHostContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.Core.Faction.Safe_DeepInfo_DoLongRangePlanning_OnBackgroundNonSimThread_HostOnly (Arcen.AIW2.Core.ILongRangePlanningHostContext Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.External.SpecialFactionPlanning.Execute () [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.ArcenHostOnlySimPlanningContext.InnerRun () [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.ArcenThread.InternalActualThreadFunction () [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at System.Threading.ThreadHelper.ThreadStart_Context (System.Object state) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ThreadHelper.ThreadStart () [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 

10/31/2021 8:26:15 PM	3.742	SINGLEP	DELAYED8: Called Relentless AI Wave_facplan pathfinder from two different contexts!  First was LRP_AIRelentlessWave_idx_16, new one is LRP_AIRelentlessWave_idx_17
  at System.Environment.get_StackTrace () [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at Arcen.Universal.ArcenDebugging.ArcenDebugLog (System.String Message, Arcen.Universal.Verbosity Verbosity) [0x00000] in <4796a817b30f4c8cac019c45fcf82a2a>:0 
  at Arcen.AIW2.External.ArcenPathfinder`1[N].FindPathInner (Arcen.Universal.List`1[T] PathToFill, N Origin, N Target, System.Int32 NeedToGetWithinXRangeOfTarget, System.Int32 RequiresNoMoreThanXRangeFromOrigin, System.Boolean DoDebugLog, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.ArcenPathfinder`1[N].FindPath (Arcen.Universal.List`1[T] PathToFill, N Origin, N Target, System.Int32 NeedToGetWithinXRangeOfTarget, System.Int32 RequiresNoMoreThanXRangeFromOrigin, System.Boolean DoDebugLog, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.PathingHelper.InnerFindPath_Raw (Arcen.AIW2.Core.Faction faction, Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.SimPlannerImplementation.InnerFindPath_Raw (Arcen.AIW2.Core.Faction faction, Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.Core.ExternalFactionBaseInfo.FindPathFreshOrFromCache (Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.Core.Faction.FindPathFreshOrFromCache (Arcen.AIW2.Core.Planet origin, Arcen.AIW2.Core.Planet destination, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.External.AIRelentlessAndBorderAggressionFactionDeepInfoRoot.AttackTargetPlanet (Arcen.AIW2.Core.Planet start, Arcen.AIW2.Core.Planet destination, Arcen.Universal.List`1[T] ships, Arcen.AIW2.Core.Faction faction, Arcen.AIW2.External.ArcenLongTermIntermittentPlanningContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.AIRelentlessAndBorderAggressionFactionDeepInfoRoot+<>c__DisplayClass16_1.<DoLongRangePlanning_OnBackgroundNonSimThread_Subclass>b__1 (Arcen.Universal.KeyValuePair`2[TKey,TValue] pair) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.Universal.DictionaryOfLists`2[TKey,TValue].DoFor (Arcen.Universal.DictionaryProcessor`2[TKey,TValue] Processor) [0x00000] in <4796a817b30f4c8cac019c45fcf82a2a>:0 
  at Arcen.AIW2.External.AIRelentlessAndBorderAggressionFactionDeepInfoRoot.DoLongRangePlanning_OnBackgroundNonSimThread_Subclass (Arcen.AIW2.External.ArcenLongTermIntermittentPlanningContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.ExternalFactionDeepInfoRoot.DoLongRangePlanning_OnBackgroundNonSimThread_HostOnly (Arcen.AIW2.Core.ILongRangePlanningHostContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.Core.Faction.Safe_DeepInfo_DoLongRangePlanning_OnBackgroundNonSimThread_HostOnly (Arcen.AIW2.Core.ILongRangePlanningHostContext Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.External.SpecialFactionPlanning.Execute () [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.ArcenHostOnlySimPlanningContext.InnerRun () [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.ArcenThread.InternalActualThreadFunction () [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at System.Threading.ThreadHelper.ThreadStart_Context (System.Object state) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ThreadHelper.ThreadStart () [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 

10/31/2021 8:26:50 PM	3.742	SINGLEP	DELAYED9: Called Relentless AI Wave_facplan pathfinder from two different contexts!  First was LRP_AIRelentlessWave_idx_16, new one is LRP_AIRelentlessWave_idx_17
  at System.Environment.get_StackTrace () [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at Arcen.Universal.ArcenDebugging.ArcenDebugLog (System.String Message, Arcen.Universal.Verbosity Verbosity) [0x00000] in <4796a817b30f4c8cac019c45fcf82a2a>:0 
  at Arcen.AIW2.External.ArcenPathfinder`1[N].FindPathInner (Arcen.Universal.List`1[T] PathToFill, N Origin, N Target, System.Int32 NeedToGetWithinXRangeOfTarget, System.Int32 RequiresNoMoreThanXRangeFromOrigin, System.Boolean DoDebugLog, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.ArcenPathfinder`1[N].FindPath (Arcen.Universal.List`1[T] PathToFill, N Origin, N Target, System.Int32 NeedToGetWithinXRangeOfTarget, System.Int32 RequiresNoMoreThanXRangeFromOrigin, System.Boolean DoDebugLog, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.PathingHelper.InnerFindPath_Raw (Arcen.AIW2.Core.Faction faction, Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.SimPlannerImplementation.InnerFindPath_Raw (Arcen.AIW2.Core.Faction faction, Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.Core.ExternalFactionBaseInfo.FindPathFreshOrFromCache (Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.Core.Faction.FindPathFreshOrFromCache (Arcen.AIW2.Core.Planet origin, Arcen.AIW2.Core.Planet destination, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.External.AIRelentlessAndBorderAggressionFactionDeepInfoRoot.AttackTargetPlanet (Arcen.AIW2.Core.Planet start, Arcen.AIW2.Core.Planet destination, Arcen.Universal.List`1[T] ships, Arcen.AIW2.Core.Faction faction, Arcen.AIW2.External.ArcenLongTermIntermittentPlanningContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.AIRelentlessAndBorderAggressionFactionDeepInfoRoot+<>c__DisplayClass16_1.<DoLongRangePlanning_OnBackgroundNonSimThread_Subclass>b__1 (Arcen.Universal.KeyValuePair`2[TKey,TValue] pair) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.Universal.DictionaryOfLists`2[TKey,TValue].DoFor (Arcen.Universal.DictionaryProcessor`2[TKey,TValue] Processor) [0x00000] in <4796a817b30f4c8cac019c45fcf82a2a>:0 
  at Arcen.AIW2.External.AIRelentlessAndBorderAggressionFactionDeepInfoRoot.DoLongRangePlanning_OnBackgroundNonSimThread_Subclass (Arcen.AIW2.External.ArcenLongTermIntermittentPlanningContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.ExternalFactionDeepInfoRoot.DoLongRangePlanning_OnBackgroundNonSimThread_HostOnly (Arcen.AIW2.Core.ILongRangePlanningHostContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.Core.Faction.Safe_DeepInfo_DoLongRangePlanning_OnBackgroundNonSimThread_HostOnly (Arcen.AIW2.Core.ILongRangePlanningHostContext Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.External.SpecialFactionPlanning.Execute () [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.ArcenHostOnlySimPlanningContext.InnerRun () [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.ArcenThread.InternalActualThreadFunction () [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at System.Threading.ThreadHelper.ThreadStart_Context (System.Object state) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ThreadHelper.ThreadStart () [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 

10/31/2021 8:26:54 PM	3.742	SINGLEP	DELAYED10: Skipped log Achievement To Steam Research Grant because we think it's already there.
10/31/2021 8:27:45 PM	3.742	SINGLEP	DELAYED11: Called AI Sentinels_facplan pathfinder from two different contexts!  First was LRP_AI_idx_2, new one is LRP_AI_idx_4
  at System.Environment.get_StackTrace () [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at Arcen.Universal.ArcenDebugging.ArcenDebugLog (System.String Message, Arcen.Universal.Verbosity Verbosity) [0x00000] in <4796a817b30f4c8cac019c45fcf82a2a>:0 
  at Arcen.AIW2.External.ArcenPathfinder`1[N].FindPathInner (Arcen.Universal.List`1[T] PathToFill, N Origin, N Target, System.Int32 NeedToGetWithinXRangeOfTarget, System.Int32 RequiresNoMoreThanXRangeFromOrigin, System.Boolean DoDebugLog, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.ArcenPathfinder`1[N].FindPath (Arcen.Universal.List`1[T] PathToFill, N Origin, N Target, System.Int32 NeedToGetWithinXRangeOfTarget, System.Int32 RequiresNoMoreThanXRangeFromOrigin, System.Boolean DoDebugLog, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.PathingHelper.InnerFindPath_Raw (Arcen.AIW2.Core.Faction faction, Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.SimPlannerImplementation.InnerFindPath_Raw (Arcen.AIW2.Core.Faction faction, Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.Core.ExternalFactionBaseInfo.FindPathFreshOrFromCache (Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.Core.Faction.FindPathFreshOrFromCache (Arcen.AIW2.Core.Planet origin, Arcen.AIW2.Core.Planet destination, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.External.AISentinelsFactionDeepInfo.HandleExogalacticAttacks (Arcen.AIW2.External.ArcenLongTermIntermittentPlanningContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.AISentinelsFactionDeepInfo.DoLongRangePlanning_OnBackgroundNonSimThread_Subclass (Arcen.AIW2.External.ArcenLongTermIntermittentPlanningContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.ExternalFactionDeepInfoRoot.DoLongRangePlanning_OnBackgroundNonSimThread_HostOnly (Arcen.AIW2.Core.ILongRangePlanningHostContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.Core.Faction.Safe_DeepInfo_DoLongRangePlanning_OnBackgroundNonSimThread_HostOnly (Arcen.AIW2.Core.ILongRangePlanningHostContext Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.External.SpecialFactionPlanning.Execute () [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.ArcenHostOnlySimPlanningContext.InnerRun () [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.ArcenThread.InternalActualThreadFunction () [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at System.Threading.ThreadHelper.ThreadStart_Context (System.Object state) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ThreadHelper.ThreadStart () [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 

10/31/2021 8:27:46 PM	3.742	SINGLEP	DELAYED12: Called AI Sentinels_facplan pathfinder from two different contexts!  First was LRP_AI_idx_2, new one is LRP_AI_idx_4
  at System.Environment.get_StackTrace () [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at Arcen.Universal.ArcenDebugging.ArcenDebugLog (System.String Message, Arcen.Universal.Verbosity Verbosity) [0x00000] in <4796a817b30f4c8cac019c45fcf82a2a>:0 
  at Arcen.AIW2.External.ArcenPathfinder`1[N].FindPathInner (Arcen.Universal.List`1[T] PathToFill, N Origin, N Target, System.Int32 NeedToGetWithinXRangeOfTarget, System.Int32 RequiresNoMoreThanXRangeFromOrigin, System.Boolean DoDebugLog, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.ArcenPathfinder`1[N].FindPath (Arcen.Universal.List`1[T] PathToFill, N Origin, N Target, System.Int32 NeedToGetWithinXRangeOfTarget, System.Int32 RequiresNoMoreThanXRangeFromOrigin, System.Boolean DoDebugLog, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.PathingHelper.InnerFindPath_Raw (Arcen.AIW2.Core.Faction faction, Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.SimPlannerImplementation.InnerFindPath_Raw (Arcen.AIW2.Core.Faction faction, Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.Core.ExternalFactionBaseInfo.FindPathFreshOrFromCache (Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.Core.Faction.FindPathFreshOrFromCache (Arcen.AIW2.Core.Planet origin, Arcen.AIW2.Core.Planet destination, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.External.AISentinelsFactionDeepInfo.HandleExogalacticAttacks (Arcen.AIW2.External.ArcenLongTermIntermittentPlanningContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.AISentinelsFactionDeepInfo.DoLongRangePlanning_OnBackgroundNonSimThread_Subclass (Arcen.AIW2.External.ArcenLongTermIntermittentPlanningContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.ExternalFactionDeepInfoRoot.DoLongRangePlanning_OnBackgroundNonSimThread_HostOnly (Arcen.AIW2.Core.ILongRangePlanningHostContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.Core.Faction.Safe_DeepInfo_DoLongRangePlanning_OnBackgroundNonSimThread_HostOnly (Arcen.AIW2.Core.ILongRangePlanningHostContext Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.External.SpecialFactionPlanning.Execute () [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.ArcenHostOnlySimPlanningContext.InnerRun () [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.ArcenThread.InternalActualThreadFunction () [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at System.Threading.ThreadHelper.ThreadStart_Context (System.Object state) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ThreadHelper.ThreadStart () [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 

10/31/2021 8:28:05 PM	3.742	SINGLEP	DELAYED13: Called AI Sentinels_facplan pathfinder from two different contexts!  First was LRP_AI_idx_2, new one is LRP_AI_idx_4
  at System.Environment.get_StackTrace () [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at Arcen.Universal.ArcenDebugging.ArcenDebugLog (System.String Message, Arcen.Universal.Verbosity Verbosity) [0x00000] in <4796a817b30f4c8cac019c45fcf82a2a>:0 
  at Arcen.AIW2.External.ArcenPathfinder`1[N].FindPathInner (Arcen.Universal.List`1[T] PathToFill, N Origin, N Target, System.Int32 NeedToGetWithinXRangeOfTarget, System.Int32 RequiresNoMoreThanXRangeFromOrigin, System.Boolean DoDebugLog, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.ArcenPathfinder`1[N].FindPath (Arcen.Universal.List`1[T] PathToFill, N Origin, N Target, System.Int32 NeedToGetWithinXRangeOfTarget, System.Int32 RequiresNoMoreThanXRangeFromOrigin, System.Boolean DoDebugLog, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.PathingHelper.InnerFindPath_Raw (Arcen.AIW2.Core.Faction faction, Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.SimPlannerImplementation.InnerFindPath_Raw (Arcen.AIW2.Core.Faction faction, Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.Core.ExternalFactionBaseInfo.FindPathFreshOrFromCache (Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.Core.Faction.FindPathFreshOrFromCache (Arcen.AIW2.Core.Planet origin, Arcen.AIW2.Core.Planet destination, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.External.AISentinelsFactionDeepInfo.HandleExogalacticAttacks (Arcen.AIW2.External.ArcenLongTermIntermittentPlanningContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.AISentinelsFactionDeepInfo.DoLongRangePlanning_OnBackgroundNonSimThread_Subclass (Arcen.AIW2.External.ArcenLongTermIntermittentPlanningContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.ExternalFactionDeepInfoRoot.DoLongRangePlanning_OnBackgroundNonSimThread_HostOnly (Arcen.AIW2.Core.ILongRangePlanningHostContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.Core.Faction.Safe_DeepInfo_DoLongRangePlanning_OnBackgroundNonSimThread_HostOnly (Arcen.AIW2.Core.ILongRangePlanningHostContext Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.External.SpecialFactionPlanning.Execute () [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.ArcenHostOnlySimPlanningContext.InnerRun () [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.ArcenThread.InternalActualThreadFunction () [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at System.Threading.ThreadHelper.ThreadStart_Context (System.Object state) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ThreadHelper.ThreadStart () [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 

10/31/2021 8:28:07 PM	3.742	SINGLEP	DELAYED14: Called AI Sentinels_facplan pathfinder from two different contexts!  First was LRP_AI_idx_2, new one is LRP_AI_idx_4
  at System.Environment.get_StackTrace () [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at Arcen.Universal.ArcenDebugging.ArcenDebugLog (System.String Message, Arcen.Universal.Verbosity Verbosity) [0x00000] in <4796a817b30f4c8cac019c45fcf82a2a>:0 
  at Arcen.AIW2.External.ArcenPathfinder`1[N].FindPathInner (Arcen.Universal.List`1[T] PathToFill, N Origin, N Target, System.Int32 NeedToGetWithinXRangeOfTarget, System.Int32 RequiresNoMoreThanXRangeFromOrigin, System.Boolean DoDebugLog, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.ArcenPathfinder`1[N].FindPath (Arcen.Universal.List`1[T] PathToFill, N Origin, N Target, System.Int32 NeedToGetWithinXRangeOfTarget, System.Int32 RequiresNoMoreThanXRangeFromOrigin, System.Boolean DoDebugLog, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.PathingHelper.InnerFindPath_Raw (Arcen.AIW2.Core.Faction faction, Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.SimPlannerImplementation.InnerFindPath_Raw (Arcen.AIW2.Core.Faction faction, Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.Core.ExternalFactionBaseInfo.FindPathFreshOrFromCache (Arcen.AIW2.Core.Planet Origin, Arcen.AIW2.Core.Planet Target, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.Core.Faction.FindPathFreshOrFromCache (Arcen.AIW2.Core.Planet origin, Arcen.AIW2.Core.Planet destination, Arcen.AIW2.Core.PathingMode mode, Arcen.AIW2.Core.ArcenSimContextAnyStatus Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.External.AISentinelsFactionDeepInfo.HandleExogalacticAttacks (Arcen.AIW2.External.ArcenLongTermIntermittentPlanningContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.AISentinelsFactionDeepInfo.DoLongRangePlanning_OnBackgroundNonSimThread_Subclass (Arcen.AIW2.External.ArcenLongTermIntermittentPlanningContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.ExternalFactionDeepInfoRoot.DoLongRangePlanning_OnBackgroundNonSimThread_HostOnly (Arcen.AIW2.Core.ILongRangePlanningHostContext Context) [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.Core.Faction.Safe_DeepInfo_DoLongRangePlanning_OnBackgroundNonSimThread_HostOnly (Arcen.AIW2.Core.ILongRangePlanningHostContext Context) [0x00000] in <2f251d9ccbcc4e368710e0fc09159ba2>:0 
  at Arcen.AIW2.External.SpecialFactionPlanning.Execute () [0x00000] in <26e2f4f346e44fc9902829d416b960d7>:0 
  at Arcen.AIW2.External.ArcenHostOnlySimPlanningContext.InnerRun () [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at Arcen.AIW2.External.ArcenThread.InternalActualThreadFunction () [0x00000] in <19efc625144043c6869896462b20ab42>:0 
  at System.Threading.ThreadHelper.ThreadStart_Context (System.Object state) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state) [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at System.Threading.ThreadHelper.ThreadStart () [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0 

ArcenDebugLog.txt (32,763 bytes)   

Chris_McElligottPark

Nov 3, 2021 9:57 pm

administrator   ~0063177

Thanks!

* Added a new ThreadStaticWrapperedPooledItem, which is a way for us to keep some sort of complex object -- often a collection, but more things than that are planned -- in a threadstatic, safe way.
** ...What?
*** Okay, so ThreadStatic. Basically, any time a new thread is using that variable, it can initialize its own copy. This is hyper useful.
*** However, with random background worker threads, this does mean that we wind up with some things initialized on threads that may never be used the same way again.
**** I'm referring here to things like Task<>.Run() or things that happen inside Parallel.For() or similar. Or older-school ThreadPool calls, whatever.
*** Additionally, we pool and reuse our own threads between loads of the game (meaning out to the main menu and back), for things like factions.
**** So if thread 554 was Dark Spire in one game, and you go to the main menu and come back into the same game, it might wind up being the AI Hunter thread instead.
*** Essentially this works vaguely like a memory leak, even though it is in no way a memory leak, because we wind up with stuff that has been allocated but will never be used again.
**** During our "before mapgen or savegame load clear," it makes more sense to recall all the threadstatic stuff, and pull those into central pools, and then start over fresh using them again.
** How we do exactly that is... with this new class, ThreadStaticWrapperedPooledItem!
*** This wrapper item is instead now the thing that is threadstatic, and it communicates under the hood with a pool.
*** We can put anything in here. Collections, pathfinders, and so on.
**** A side benefit of this is that for things where we previous had a scope that was a "context" (that can be VERY confusing), the scope can instead be the thread.
**** Recently, we've been having some issues with pathfinders being called from more than one contextual location at a time, which might have been a false alarm or might have been a very dangerous bug. Either way, this will fix that.
***** But even more to the point, we might have been having some pathfinder bugs if people ever decided to use one from a given context in a Task or Parallel call. I don't think anyone was doing that yet, but if they did it would have given scrambled results.
*** A side effect of these changes is that we can allocate fewer lists and pathfinders in general, because not every faction needs them in the first place. And what we do allocate can get much more reuse.
** If we felt like we needed to, we could extend this concept further and push kind of a library "check in, check out" sort of data structure that keeps things for less long than between map-generations.
*** That said, I think that there is potentially performance loss from that, and I don't expect the RAM usage of my current approach to be enough of a problem to warrant that extra CPU usage.
*** If I get proved wrong later, then I can make a second version of this general concept that prioritizes RAM savings instead of CPU savings, and it will be easy to swap out the ones where it's a problem.

* The types of end pathfinders have been condensed down to three: PlanetPathfinderBasic, PlanetPathfinderConservative, and PlanetPathfinderWarden.
** There is nothing in there about any sort of long-term or short-term differences now.
** Additionally, when you find a path, it now requires you to pass in the faction and any extra debug info when you do so.

* Added a new DictionaryOfProtectedValDictionaries, which is presently unused. Thought I would need it on CacheForPathingMode, but those are being pooled by map-reload, so no.
** In general, a lot of the pathing code is now pooled way better between loads of the game. Previously... possibly it was lost and leaked? Maybe it was not leaking, but just kind of allocated in a useless place? Either way, fixed.

* Man, there's a whole bunch of other changes where things with pathfinding were really confusing to me. I didn't have time to document them all.
** However, the new approach is really clear and has comments or naming that explains what the rules are, and why. Also the code reads linearly from top to bottom, rather than jumping all over the place. So that also helps.
** For an end-faction-developer, very little is different. It does ask you for a "debug addendum" string, but that's just so that error messages will be more informatively precise if you should run into any.

* The sum total of these changes saves a LOT of memory, as well as making things load faster, as well as also eliminating the pathfinders-from-multiple-contexts bug. It also leads to some CPU speed improvements in several spots.
** It also solves what was definitively still a memory leak in terms of pathfinders.
*** After 10 loads of the game prior to these changes, there were 169,706 PathBetweenPlanetsForFaction-PathToReadOnly collections, with 25,661,700 capacity and 115,592 stored items. This is absolutely freaking huge!
*** Now, after 8 loads of the game, there are 79 collections, 420 total capacity, and 19 stored items. This is... uh... quite an improvement.

Issue History

Date Modified Username Field Change
Nov 1, 2021 1:59 am tom.prince New Issue
Nov 1, 2021 1:59 am tom.prince File Added: 1.save
Nov 1, 2021 1:59 am tom.prince File Added: ArcenDebugLog.txt
Nov 1, 2021 2:26 am BadgerBadger Relationship added related to 0025715
Nov 2, 2021 1:31 pm Chris_McElligottPark Assigned To => Chris_McElligottPark
Nov 2, 2021 1:31 pm Chris_McElligottPark Status new => assigned
Nov 3, 2021 9:57 pm Chris_McElligottPark Status assigned => resolved
Nov 3, 2021 9:57 pm Chris_McElligottPark Resolution open => fixed
Nov 3, 2021 9:57 pm Chris_McElligottPark Fixed in Version => Beta 3.744 Pathfinding
Nov 3, 2021 9:57 pm Chris_McElligottPark Note Added: 0063177