From 783728fd0076a0ccc3a6d9fbe8cf54ef9ff9e361 Mon Sep 17 00:00:00 2001 From: InvalidArgument3 Date: Fri, 14 Jun 2024 21:41:48 -0500 Subject: [PATCH 01/11] Update AsteroidSpawner.cs --- .../AsteroidEntities/AsteroidSpawner.cs | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs index 0366e5eb..1f4a57ea 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs @@ -386,7 +386,6 @@ public void SpawnAsteroids(List zones) { int totalSpawnAttempts = 0; - // Check if total asteroids have reached the global limit if (AsteroidSettings.MaxAsteroidCount == 0) { Log.Info("Asteroid spawning is disabled."); @@ -419,7 +418,10 @@ public void SpawnAsteroids(List zones) if (IsNearVanillaAsteroid(newPosition)) { - Log.Info("Skipped spawning asteroid due to proximity to vanilla asteroid."); + if (AsteroidSettings.EnableLogging) + { + Log.Info("Skipped spawning asteroid due to proximity to vanilla asteroid."); + } continue; } @@ -429,14 +431,20 @@ public void SpawnAsteroids(List zones) (float)rand.NextDouble() * MathHelper.TwoPi, (float)rand.NextDouble() * MathHelper.TwoPi); - Log.Info($"Spawning asteroid at {newPosition} with velocity {newVelocity} of type {type}"); + if (AsteroidSettings.EnableLogging) + { + Log.Info($"Spawning asteroid at {newPosition} with velocity {newVelocity} of type {type}"); + } var asteroid = AsteroidEntity.CreateAsteroid(newPosition, size, newVelocity, type, rotation); if (asteroid != null) { _asteroids.Add(asteroid); zone.AsteroidCount++; - Log.Info($"Server: Added new asteroid with ID {asteroid.EntityId} to _asteroids list"); + if (AsteroidSettings.EnableLogging) + { + Log.Info($"Server: Added new asteroid with ID {asteroid.EntityId} to _asteroids list"); + } var message = new AsteroidNetworkMessage(newPosition, size, newVelocity, Vector3D.Zero, type, false, asteroid.EntityId, false, true, rotation); _networkMessages.Add(message); @@ -444,14 +452,23 @@ public void SpawnAsteroids(List zones) } else { - Log.Info($"Failed to create asteroid at position {newPosition}"); + if (AsteroidSettings.EnableLogging) + { + Log.Info($"Failed to create asteroid at position {newPosition}"); + } } } - Log.Info($"Zone spawn complete. Asteroids spawned: {asteroidsSpawned}, Zone spawn attempts: {zoneSpawnAttempts}, Zone asteroid count: {zone.AsteroidCount}"); + if (AsteroidSettings.EnableLogging) + { + Log.Info($"Zone spawn complete. Asteroids spawned: {asteroidsSpawned}, Zone spawn attempts: {zoneSpawnAttempts}, Zone asteroid count: {zone.AsteroidCount}"); + } } - Log.Info($"All zones spawn attempt complete. Total spawn attempts: {totalSpawnAttempts}, New total asteroid count: {_asteroids.Count}"); + if (AsteroidSettings.EnableLogging) + { + Log.Info($"All zones spawn attempt complete. Total spawn attempts: {totalSpawnAttempts}, New total asteroid count: {_asteroids.Count}"); + } } private bool IsValidSpawnPosition(Vector3D position, List zones) From 99c17fb7c42f81cd19987250f92026c56ca2d5dc Mon Sep 17 00:00:00 2001 From: InvalidArgument3 Date: Fri, 14 Jun 2024 21:42:43 -0500 Subject: [PATCH 02/11] Update Log.cs --- Dynamic Asteroids/Data/Scripts/DynamicAsteroids/Log.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/Log.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/Log.cs index 1fbe90fa..c9b191cb 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/Log.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/Log.cs @@ -3,7 +3,7 @@ using DynamicAsteroids; using Sandbox.ModAPI; -namespace SC.SUGMA +namespace Invalid.DynamicRoids { internal class Log { From 0c8082cbda2f13ef5e475235bee7630cb64844f1 Mon Sep 17 00:00:00 2001 From: InvalidArgument3 Date: Fri, 14 Jun 2024 21:46:26 -0500 Subject: [PATCH 03/11] nres change namespace --- .../AsteroidEntities/AsteroidEntity.cs | 2 +- .../AsteroidEntities/AsteroidSpawner.cs | 2 +- .../Data/Scripts/DynamicAsteroids/MainSession.cs | 12 +++++++++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs index c269b5b1..0050ee6b 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs @@ -1,11 +1,11 @@ using System; using System.IO; +using Invalid.DynamicRoids; using Sandbox.Definitions; using Sandbox.Engine.Physics; using Sandbox.Game; using Sandbox.Game.Entities; using Sandbox.ModAPI; -using SC.SUGMA; using VRage; using VRage.Game; using VRage.Game.Components; diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs index 1f4a57ea..fc8612e4 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs @@ -1,6 +1,5 @@ using DynamicAsteroids.AsteroidEntities; using Sandbox.ModAPI; -using SC.SUGMA; using System.Collections.Generic; using VRage.Game.ModAPI; using VRage.ModAPI; @@ -8,6 +7,7 @@ using System.Linq; using System; using DynamicAsteroids; +using Invalid.DynamicRoids; using Sandbox.Game.Entities; public class AsteroidZone diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/MainSession.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/MainSession.cs index 87b3da16..dde06980 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/MainSession.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/MainSession.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; using DynamicAsteroids.AsteroidEntities; +using Invalid.DynamicRoids; using Sandbox.Game.EntityComponents; using Sandbox.ModAPI; -using SC.SUGMA; using VRage.Game.Components; using VRage.Input; using VRageMath; @@ -146,9 +146,14 @@ private void OnMessageReceived(byte[] message) { try { + if (message == null || message.Length == 0) + { + Log.Info("Received empty or null message, skipping processing."); + return; + } + Log.Info($"Client: Received message of {message.Length} bytes"); var asteroidMessage = MyAPIGateway.Utilities.SerializeFromBinary(message); - Log.Info($"Client: Deserialized asteroid message"); if (asteroidMessage.IsRemoval) { @@ -197,9 +202,10 @@ private void OnMessageReceived(byte[] message) } catch (Exception ex) { - Log.Exception(ex, typeof(MainSession)); + Log.Exception(ex, typeof(MainSession), "Error processing received message: "); } } + private AsteroidEntity FindNearestAsteroid(Vector3D characterPosition) { if (_spawner._asteroids == null) return null; From 1279604add34b3f74ded1ccb13164dbff8ac1059 Mon Sep 17 00:00:00 2001 From: InvalidArgument3 Date: Fri, 14 Jun 2024 21:55:32 -0500 Subject: [PATCH 04/11] Update AsteroidSettings.cs --- .../Data/Scripts/DynamicAsteroids/AsteroidSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidSettings.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidSettings.cs index 0b119026..2fa94ee3 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidSettings.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidSettings.cs @@ -16,7 +16,7 @@ public static class AsteroidSettings public static int UpdateInterval = 120; // Default: 120 ticks (2 seconds) // Set to 0 to disable spawning, -1 for no limit, or a positive number for the maximum count - public static int MaxAsteroidCount = 20000; + public static int MaxAsteroidCount = -1; public static int MaxAsteroidsPerZone = 1000; //Each player makes a "Zone" of asteroids. They merge together when players are nearby. public static int MaxTotalAttempts = 100; From ae1438431b1abbd3125a6d4cf59972a79ae75424 Mon Sep 17 00:00:00 2001 From: InvalidArgument3 Date: Fri, 14 Jun 2024 22:02:36 -0500 Subject: [PATCH 05/11] more accurate total roid count --- .../AsteroidEntities/AsteroidSpawner.cs | 10 ++++++++-- .../Scripts/DynamicAsteroids/AsteroidSettings.cs | 2 +- .../Data/Scripts/DynamicAsteroids/Log.cs | 13 ++++++++----- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs index fc8612e4..31a2b888 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs @@ -398,8 +398,7 @@ public void SpawnAsteroids(List zones) int zoneSpawnAttempts = 0; while (zone.AsteroidCount < AsteroidSettings.MaxAsteroidsPerZone && asteroidsSpawned < 10 && - zoneSpawnAttempts < AsteroidSettings.MaxZoneAttempts && totalSpawnAttempts < AsteroidSettings.MaxTotalAttempts && - (AsteroidSettings.MaxAsteroidCount == -1 || _asteroids.Count < AsteroidSettings.MaxAsteroidCount)) + zoneSpawnAttempts < AsteroidSettings.MaxZoneAttempts && totalSpawnAttempts < AsteroidSettings.MaxTotalAttempts) { Vector3D newPosition; do @@ -425,6 +424,13 @@ public void SpawnAsteroids(List zones) continue; } + // Check max asteroid count before actually adding a new asteroid + if (AsteroidSettings.MaxAsteroidCount != -1 && _asteroids.Count >= AsteroidSettings.MaxAsteroidCount) + { + Log.Warning($"Maximum asteroid count of {AsteroidSettings.MaxAsteroidCount} reached. No more asteroids will be spawned until existing ones are removed."); + return; + } + AsteroidType type = AsteroidSettings.GetAsteroidType(newPosition); float size = AsteroidSettings.GetAsteroidSize(newPosition); Quaternion rotation = Quaternion.CreateFromYawPitchRoll((float)rand.NextDouble() * MathHelper.TwoPi, diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidSettings.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidSettings.cs index 2fa94ee3..0b119026 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidSettings.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidSettings.cs @@ -16,7 +16,7 @@ public static class AsteroidSettings public static int UpdateInterval = 120; // Default: 120 ticks (2 seconds) // Set to 0 to disable spawning, -1 for no limit, or a positive number for the maximum count - public static int MaxAsteroidCount = -1; + public static int MaxAsteroidCount = 20000; public static int MaxAsteroidsPerZone = 1000; //Each player makes a "Zone" of asteroids. They merge together when players are nearby. public static int MaxTotalAttempts = 100; diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/Log.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/Log.cs index c9b191cb..99bb0e6b 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/Log.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/Log.cs @@ -13,11 +13,8 @@ internal class Log private Log() { MyAPIGateway.Utilities.DeleteFileInGlobalStorage("DynamicAsteroids.log"); - _writer = MyAPIGateway.Utilities - .WriteFileInGlobalStorage( - "DynamicAsteroids.log"); // Only creating one debug.log to avoid clutter. Might change in the future. - _writer.WriteLine( - $" Dynamic Asteroids - {(MyAPIGateway.Session.IsServer ? "Server" : "Client")} Debug Log\n===========================================\n"); + _writer = MyAPIGateway.Utilities.WriteFileInGlobalStorage("DynamicAsteroids.log"); + _writer.WriteLine($" Dynamic Asteroids - {(MyAPIGateway.Session.IsServer ? "Server" : "Client")} Debug Log\n===========================================\n"); _writer.Flush(); } @@ -27,6 +24,12 @@ public static void Info(string message) I._Log(message); } + public static void Warning(string message) + { + if (AsteroidSettings.EnableLogging) + I._Log("WARNING: " + message); + } + public static void Exception(Exception ex, Type callingType, string prefix = "") { if (AsteroidSettings.EnableLogging) From 8bbc7bbe554101688e434287b5e07e1fb5eb3871 Mon Sep 17 00:00:00 2001 From: InvalidArgument3 Date: Fri, 14 Jun 2024 23:20:20 -0500 Subject: [PATCH 06/11] ugh --- .../DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs | 7 ++++++- Dynamic Asteroids/Data/Scripts/DynamicAsteroids/Log.cs | 6 +++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs index 0050ee6b..a41c735f 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs @@ -89,6 +89,10 @@ public static AsteroidEntity CreateAsteroid(Vector3D position, float size, Vecto { ent.EntityId = entityId.Value; } + else + { + ent.EntityId = MyAPIGateway. + } try { @@ -102,7 +106,8 @@ public static AsteroidEntity CreateAsteroid(Vector3D position, float size, Vecto if (ent.EntityId == 0) { - Log.Info("EntityId is 0 oh no!"); + Log.Warning("EntityId is 0, which is invalid!"); + return null; } return ent; diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/Log.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/Log.cs index 99bb0e6b..252cd003 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/Log.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/Log.cs @@ -21,19 +21,19 @@ private Log() public static void Info(string message) { if (AsteroidSettings.EnableLogging) - I._Log(message); + I?._Log(message); } public static void Warning(string message) { if (AsteroidSettings.EnableLogging) - I._Log("WARNING: " + message); + I?._Log("WARNING: " + message); } public static void Exception(Exception ex, Type callingType, string prefix = "") { if (AsteroidSettings.EnableLogging) - I._LogException(ex, callingType, prefix); + I?._LogException(ex, callingType, prefix); } public static void Init() From a8623012600b0262b7ab7bdfc008280ed3534595 Mon Sep 17 00:00:00 2001 From: InvalidArgument3 Date: Fri, 14 Jun 2024 23:21:59 -0500 Subject: [PATCH 07/11] Update AsteroidEntity.cs --- .../DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs index a41c735f..84c7e512 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs @@ -89,10 +89,6 @@ public static AsteroidEntity CreateAsteroid(Vector3D position, float size, Vecto { ent.EntityId = entityId.Value; } - else - { - ent.EntityId = MyAPIGateway. - } try { From 1bc96c65ef602c293c55cebec1d6e198951d2f2d Mon Sep 17 00:00:00 2001 From: InvalidArgument3 Date: Fri, 14 Jun 2024 23:31:52 -0500 Subject: [PATCH 08/11] Update AsteroidSpawner.cs --- .../AsteroidEntities/AsteroidSpawner.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs index 31a2b888..f8bf9783 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs @@ -109,16 +109,19 @@ public void LoadAsteroidState() private void LoadAsteroidsInRange(Vector3D playerPosition, AsteroidZone zone) { + int skippedCount = 0; + List skippedPositions = new List(); + foreach (var state in _despawnedAsteroids.ToArray()) { if (zone.IsPointInZone(state.Position)) { bool tooClose = _asteroids.Any(a => Vector3D.DistanceSquared(a.PositionComp.GetPosition(), state.Position) < AsteroidSettings.MinDistanceFromPlayer * AsteroidSettings.MinDistanceFromPlayer); - bool exists = _asteroids.Any(a => a.EntityId == state.EntityId); // Check for existing IDs - if (tooClose || exists) + if (tooClose) { - Log.Info($"Skipping respawn of asteroid at {state.Position} due to proximity to other asteroids or duplicate ID"); + skippedCount++; + skippedPositions.Add(state.Position); continue; } @@ -134,6 +137,11 @@ private void LoadAsteroidsInRange(Vector3D playerPosition, AsteroidZone zone) _despawnedAsteroids.Remove(state); } } + + if (skippedCount > 0) + { + Log.Info($"Skipped respawn of {skippedCount} asteroids due to proximity to other asteroids or duplicate ID. Positions: {string.Join(", ", skippedPositions.Select(p => p.ToString()))}"); + } } public void Close() From 8d8252102832d4c4e0e0269689e1053e93e9ba45 Mon Sep 17 00:00:00 2001 From: InvalidArgument3 Date: Sat, 15 Jun 2024 00:19:58 -0500 Subject: [PATCH 09/11] configging; attempt at speed limit --- .../AsteroidEntities/AsteroidSpawner.cs | 151 ++++++++++++++---- 1 file changed, 123 insertions(+), 28 deletions(-) diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs index f8bf9783..a31debb3 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs @@ -10,6 +10,8 @@ using Invalid.DynamicRoids; using Sandbox.Game.Entities; + + public class AsteroidZone { public Vector3D Center { get; set; } @@ -29,6 +31,9 @@ public bool IsPointInZone(Vector3D point) } } + + + public class AsteroidSpawner { public List _asteroids; @@ -40,6 +45,16 @@ public class AsteroidSpawner private Dictionary playerZones = new Dictionary(); private const double ZONE_RADIUS = 10000; + private Dictionary playerMovementData = new Dictionary(); + + + private class PlayerMovementData + { + public Vector3D LastPosition { get; set; } + public DateTime LastUpdateTime { get; set; } + } + + public void Init(int seed) { if (!MyAPIGateway.Session.IsServer) @@ -110,7 +125,9 @@ public void LoadAsteroidState() private void LoadAsteroidsInRange(Vector3D playerPosition, AsteroidZone zone) { int skippedCount = 0; + int respawnedCount = 0; List skippedPositions = new List(); + List respawnedPositions = new List(); foreach (var state in _despawnedAsteroids.ToArray()) { @@ -125,7 +142,9 @@ private void LoadAsteroidsInRange(Vector3D playerPosition, AsteroidZone zone) continue; } - Log.Info($"Respawning asteroid at {state.Position} due to player re-entering range"); + respawnedCount++; + respawnedPositions.Add(state.Position); + var asteroid = AsteroidEntity.CreateAsteroid(state.Position, state.Size, Vector3D.Zero, state.Type); asteroid.EntityId = state.EntityId; // Assign the saved ID _asteroids.Add(asteroid); @@ -140,7 +159,12 @@ private void LoadAsteroidsInRange(Vector3D playerPosition, AsteroidZone zone) if (skippedCount > 0) { - Log.Info($"Skipped respawn of {skippedCount} asteroids due to proximity to other asteroids or duplicate ID. Positions: {string.Join(", ", skippedPositions.Select(p => p.ToString()))}"); + Log.Info($"Skipped respawn of {skippedCount} asteroids due to proximity to other asteroids or duplicate ID."); + } + + if (respawnedCount > 0) + { + Log.Info($"Respawned {respawnedCount} asteroids at positions: {string.Join(", ", respawnedPositions.Select(p => p.ToString()))}"); } } @@ -178,14 +202,14 @@ public void AssignZonesToPlayers() else { // If the player's position is outside the existing zone, create a new zone - AsteroidZone newZone = new AsteroidZone(playerPosition, ZONE_RADIUS); + AsteroidZone newZone = new AsteroidZone(playerPosition, AsteroidSettings.ZoneRadius); updatedZones[player.IdentityId] = newZone; } } else { // If the player doesn't have a zone assigned, create a new zone - AsteroidZone newZone = new AsteroidZone(playerPosition, ZONE_RADIUS); + AsteroidZone newZone = new AsteroidZone(playerPosition, AsteroidSettings.ZoneRadius); updatedZones[player.IdentityId] = newZone; } } @@ -270,7 +294,7 @@ public void UpdateZones() // If the player is not in any zone, create a new zone for them if (!playerInZone) { - AsteroidZone newZone = new AsteroidZone(playerPosition, ZONE_RADIUS); + AsteroidZone newZone = new AsteroidZone(playerPosition, AsteroidSettings.ZoneRadius); updatedZones[player.IdentityId] = newZone; } } @@ -400,11 +424,50 @@ public void SpawnAsteroids(List zones) return; } + int totalAsteroidsSpawned = 0; + int totalZoneSpawnAttempts = 0; + List skippedPositions = new List(); + List spawnedPositions = new List(); + + UpdatePlayerMovementData(); // Update player movement data + foreach (var zone in zones) { int asteroidsSpawned = 0; int zoneSpawnAttempts = 0; + // Check if any player in the zone is moving too fast + bool skipSpawning = false; + List players = new List(); + MyAPIGateway.Players.GetPlayers(players); + + foreach (var player in players) + { + Vector3D playerPosition = player.GetPosition(); + if (zone.IsPointInZone(playerPosition)) + { + PlayerMovementData data; + if (playerMovementData.TryGetValue(player.IdentityId, out data)) + { + double distance = Vector3D.Distance(playerPosition, data.LastPosition); + double timeElapsed = (DateTime.UtcNow - data.LastUpdateTime).TotalSeconds; + double speed = distance / timeElapsed; + + if (speed > 1000) + { + Log.Info($"Skipping asteroid spawning for player {player.DisplayName} due to high speed: {speed} m/s."); + skipSpawning = true; + break; + } + } + } + } + + if (skipSpawning) + { + continue; + } + while (zone.AsteroidCount < AsteroidSettings.MaxAsteroidsPerZone && asteroidsSpawned < 10 && zoneSpawnAttempts < AsteroidSettings.MaxZoneAttempts && totalSpawnAttempts < AsteroidSettings.MaxTotalAttempts) { @@ -425,10 +488,7 @@ public void SpawnAsteroids(List zones) if (IsNearVanillaAsteroid(newPosition)) { - if (AsteroidSettings.EnableLogging) - { - Log.Info("Skipped spawning asteroid due to proximity to vanilla asteroid."); - } + skippedPositions.Add(newPosition); continue; } @@ -445,46 +505,81 @@ public void SpawnAsteroids(List zones) (float)rand.NextDouble() * MathHelper.TwoPi, (float)rand.NextDouble() * MathHelper.TwoPi); - if (AsteroidSettings.EnableLogging) - { - Log.Info($"Spawning asteroid at {newPosition} with velocity {newVelocity} of type {type}"); - } var asteroid = AsteroidEntity.CreateAsteroid(newPosition, size, newVelocity, type, rotation); if (asteroid != null) { _asteroids.Add(asteroid); zone.AsteroidCount++; - if (AsteroidSettings.EnableLogging) - { - Log.Info($"Server: Added new asteroid with ID {asteroid.EntityId} to _asteroids list"); - } + spawnedPositions.Add(newPosition); var message = new AsteroidNetworkMessage(newPosition, size, newVelocity, Vector3D.Zero, type, false, asteroid.EntityId, false, true, rotation); _networkMessages.Add(message); asteroidsSpawned++; } - else - { - if (AsteroidSettings.EnableLogging) - { - Log.Info($"Failed to create asteroid at position {newPosition}"); - } - } } - if (AsteroidSettings.EnableLogging) - { - Log.Info($"Zone spawn complete. Asteroids spawned: {asteroidsSpawned}, Zone spawn attempts: {zoneSpawnAttempts}, Zone asteroid count: {zone.AsteroidCount}"); - } + totalAsteroidsSpawned += asteroidsSpawned; + totalZoneSpawnAttempts += zoneSpawnAttempts; } if (AsteroidSettings.EnableLogging) { Log.Info($"All zones spawn attempt complete. Total spawn attempts: {totalSpawnAttempts}, New total asteroid count: {_asteroids.Count}"); + Log.Info($"Total asteroids spawned: {totalAsteroidsSpawned}, Total zone spawn attempts: {totalZoneSpawnAttempts}"); + if (skippedPositions.Count > 0) + { + Log.Info($"Skipped spawning asteroids due to proximity to vanilla asteroids. Positions: {string.Join(", ", skippedPositions.Select(p => p.ToString()))}"); + } + if (spawnedPositions.Count > 0) + { + Log.Info($"Spawned asteroids at positions: {string.Join(", ", spawnedPositions.Select(p => p.ToString()))}"); + } } } + private void UpdatePlayerMovementData() + { + List players = new List(); + MyAPIGateway.Players.GetPlayers(players); + + foreach (var player in players) + { + Vector3D currentPosition = player.GetPosition(); + DateTime currentTime = DateTime.UtcNow; + + PlayerMovementData data; + if (playerMovementData.TryGetValue(player.IdentityId, out data)) + { + double distance = Vector3D.Distance(currentPosition, data.LastPosition); + double timeElapsed = (currentTime - data.LastUpdateTime).TotalSeconds; + + // Calculate speed in meters per second + double speed = distance / timeElapsed; + + if (speed > 1000) + { + Log.Info($"Skipping asteroid spawning for player {player.DisplayName} due to high speed: {speed} m/s."); + data.LastPosition = currentPosition; + data.LastUpdateTime = currentTime; + continue; + } + } + else + { + playerMovementData[player.IdentityId] = new PlayerMovementData + { + LastPosition = currentPosition, + LastUpdateTime = currentTime + }; + } + + playerMovementData[player.IdentityId].LastPosition = currentPosition; + playerMovementData[player.IdentityId].LastUpdateTime = currentTime; + } + } + + private bool IsValidSpawnPosition(Vector3D position, List zones) { foreach (var zone in zones) From f1aa77b58341579da0b91dc27e0001d8149ba229 Mon Sep 17 00:00:00 2001 From: InvalidArgument3 Date: Sat, 15 Jun 2024 00:36:21 -0500 Subject: [PATCH 10/11] turn off spawning if fast --- .../AsteroidEntities/AsteroidSpawner.cs | 53 +++++++++++-------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs index a31debb3..aced93b1 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs @@ -43,18 +43,16 @@ public class AsteroidSpawner private List _despawnedAsteroids = new List(); private List _networkMessages = new List(); private Dictionary playerZones = new Dictionary(); - private const double ZONE_RADIUS = 10000; private Dictionary playerMovementData = new Dictionary(); - private class PlayerMovementData { public Vector3D LastPosition { get; set; } public DateTime LastUpdateTime { get; set; } + public double Speed { get; set; } // Added to store the calculated speed } - public void Init(int seed) { if (!MyAPIGateway.Session.IsServer) @@ -190,6 +188,17 @@ public void AssignZonesToPlayers() { Vector3D playerPosition = player.GetPosition(); + // Check player speed + PlayerMovementData data; + if (playerMovementData.TryGetValue(player.IdentityId, out data)) + { + if (data.Speed > 1000) + { + Log.Info($"Skipping zone creation for player {player.DisplayName} due to high speed: {data.Speed} m/s."); + continue; + } + } + // Check if the player already has a zone assigned AsteroidZone existingZone; if (playerZones.TryGetValue(player.IdentityId, out existingZone)) @@ -268,6 +277,7 @@ public void MergeZones() } } } + public void UpdateZones() { List players = new List(); @@ -280,6 +290,17 @@ public void UpdateZones() { Vector3D playerPosition = player.GetPosition(); + // Check player speed + PlayerMovementData data; + if (playerMovementData.TryGetValue(player.IdentityId, out data)) + { + if (data.Speed > 1000) + { + Log.Info($"Skipping zone update for player {player.DisplayName} due to high speed: {data.Speed} m/s."); + continue; + } + } + // Check if the player is within any of the existing zones bool playerInZone = false; foreach (var zone in playerZones.Values) @@ -449,13 +470,9 @@ public void SpawnAsteroids(List zones) PlayerMovementData data; if (playerMovementData.TryGetValue(player.IdentityId, out data)) { - double distance = Vector3D.Distance(playerPosition, data.LastPosition); - double timeElapsed = (DateTime.UtcNow - data.LastUpdateTime).TotalSeconds; - double speed = distance / timeElapsed; - - if (speed > 1000) + if (data.Speed > 1000) { - Log.Info($"Skipping asteroid spawning for player {player.DisplayName} due to high speed: {speed} m/s."); + Log.Info($"Skipping asteroid spawning for player {player.DisplayName} due to high speed: {data.Speed} m/s."); skipSpawning = true; break; } @@ -556,30 +573,23 @@ private void UpdatePlayerMovementData() // Calculate speed in meters per second double speed = distance / timeElapsed; + data.Speed = speed; - if (speed > 1000) - { - Log.Info($"Skipping asteroid spawning for player {player.DisplayName} due to high speed: {speed} m/s."); - data.LastPosition = currentPosition; - data.LastUpdateTime = currentTime; - continue; - } + playerMovementData[player.IdentityId].LastPosition = currentPosition; + playerMovementData[player.IdentityId].LastUpdateTime = currentTime; } else { playerMovementData[player.IdentityId] = new PlayerMovementData { LastPosition = currentPosition, - LastUpdateTime = currentTime + LastUpdateTime = currentTime, + Speed = 0 // Initialize speed to 0 }; } - - playerMovementData[player.IdentityId].LastPosition = currentPosition; - playerMovementData[player.IdentityId].LastUpdateTime = currentTime; } } - private bool IsValidSpawnPosition(Vector3D position, List zones) { foreach (var zone in zones) @@ -592,6 +602,7 @@ private bool IsValidSpawnPosition(Vector3D position, List zones) } return false; } + public void SendNetworkMessages() { if (_networkMessages.Count == 0) return; From d2bc120ec18a450f84ed66ef1378660daa18b1a2 Mon Sep 17 00:00:00 2001 From: InvalidArgument3 Date: Sat, 15 Jun 2024 00:46:46 -0500 Subject: [PATCH 11/11] configgable zone speed --- .../AsteroidEntities/AsteroidSpawner.cs | 22 +++---------------- .../DynamicAsteroids/AsteroidSettings.cs | 3 +++ 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs index aced93b1..17dba020 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs @@ -181,52 +181,44 @@ public void AssignZonesToPlayers() List players = new List(); MyAPIGateway.Players.GetPlayers(players); - // Create a new dictionary to store the updated zones Dictionary updatedZones = new Dictionary(); foreach (var player in players) { Vector3D playerPosition = player.GetPosition(); - // Check player speed PlayerMovementData data; if (playerMovementData.TryGetValue(player.IdentityId, out data)) { - if (data.Speed > 1000) + if (AsteroidSettings.DisableZoneWhileMovingFast && data.Speed > AsteroidSettings.ZoneSpeedThreshold) { Log.Info($"Skipping zone creation for player {player.DisplayName} due to high speed: {data.Speed} m/s."); continue; } } - // Check if the player already has a zone assigned AsteroidZone existingZone; if (playerZones.TryGetValue(player.IdentityId, out existingZone)) { - // If the player's position is still within the existing zone, keep the zone if (existingZone.IsPointInZone(playerPosition)) { updatedZones[player.IdentityId] = existingZone; } else { - // If the player's position is outside the existing zone, create a new zone AsteroidZone newZone = new AsteroidZone(playerPosition, AsteroidSettings.ZoneRadius); updatedZones[player.IdentityId] = newZone; } } else { - // If the player doesn't have a zone assigned, create a new zone AsteroidZone newZone = new AsteroidZone(playerPosition, AsteroidSettings.ZoneRadius); updatedZones[player.IdentityId] = newZone; } } - // Update the playerZones dictionary with the updated zones playerZones = updatedZones; } - public void MergeZones() { List mergedZones = new List(); @@ -283,25 +275,22 @@ public void UpdateZones() List players = new List(); MyAPIGateway.Players.GetPlayers(players); - // Create a new dictionary to store the updated zones Dictionary updatedZones = new Dictionary(); foreach (var player in players) { Vector3D playerPosition = player.GetPosition(); - // Check player speed PlayerMovementData data; if (playerMovementData.TryGetValue(player.IdentityId, out data)) { - if (data.Speed > 1000) + if (AsteroidSettings.DisableZoneWhileMovingFast && data.Speed > AsteroidSettings.ZoneSpeedThreshold) { Log.Info($"Skipping zone update for player {player.DisplayName} due to high speed: {data.Speed} m/s."); continue; } } - // Check if the player is within any of the existing zones bool playerInZone = false; foreach (var zone in playerZones.Values) { @@ -312,7 +301,6 @@ public void UpdateZones() } } - // If the player is not in any zone, create a new zone for them if (!playerInZone) { AsteroidZone newZone = new AsteroidZone(playerPosition, AsteroidSettings.ZoneRadius); @@ -320,7 +308,6 @@ public void UpdateZones() } } - // Add any existing zones that still have players in them foreach (var kvp in playerZones) { if (players.Any(p => kvp.Value.IsPointInZone(p.GetPosition()))) @@ -329,10 +316,8 @@ public void UpdateZones() } } - // Update the playerZones dictionary with the updated zones playerZones = updatedZones; } - private int _spawnIntervalTimer = 0; private int _updateIntervalTimer = 0; @@ -571,7 +556,6 @@ private void UpdatePlayerMovementData() double distance = Vector3D.Distance(currentPosition, data.LastPosition); double timeElapsed = (currentTime - data.LastUpdateTime).TotalSeconds; - // Calculate speed in meters per second double speed = distance / timeElapsed; data.Speed = speed; @@ -584,7 +568,7 @@ private void UpdatePlayerMovementData() { LastPosition = currentPosition, LastUpdateTime = currentTime, - Speed = 0 // Initialize speed to 0 + Speed = 0 }; } } diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidSettings.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidSettings.cs index 0b119026..d65e75cf 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidSettings.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidSettings.cs @@ -10,6 +10,9 @@ public static class AsteroidSettings public static bool EnablePersistence = false; //barely works, don't touch this. It's already persistent per-session. This tries to save to a .dat but it's broken. public static bool EnableMiddleMouseAsteroidSpawn = false; //debug + public static bool DisableZoneWhileMovingFast = true; + public static double ZoneSpeedThreshold = 1000.0; + public static int SaveStateInterval = 600; // Default: 600 ticks (10 seconds). for writing the persistence .dat. public static int NetworkMessageInterval = 120; // Default: 120 ticks (2 seconds). Many small packet bad(?) public static int SpawnInterval = 6; // Default: 600 ticks (10 seconds)