diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs index d6fed34f..d9e20b8b 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidEntity.cs @@ -190,14 +190,33 @@ private int GetRandomDropAmount(AsteroidType type) public void OnDestroy() { - SplitAsteroid(); + try + { + SplitAsteroid(); + } + catch (Exception ex) + { + Log.Exception(ex, typeof(AsteroidEntity), "Exception in OnDestroy:"); + throw; // Rethrow the exception for the debugger + } } public bool DoDamage(float damage, MyStringHash damageSource, bool sync, MyHitInfo? hitInfo = null, long attackerId = 0, long realHitEntityId = 0, bool shouldDetonateAmmo = true, MyStringHash? extraInfo = null) { _integrity -= damage; + Log.Info($"DoDamage called with damage: {damage}, damageSource: {damageSource.String}, attackerId: {attackerId}, realHitEntityId: {realHitEntityId}, new integrity: {_integrity}"); + + if (hitInfo.HasValue) + { + var hit = hitInfo.Value; + Log.Info($"HitInfo - Position: {hit.Position}, Normal: {hit.Normal}, Velocity: {hit.Velocity}"); + } + if (Integrity < 0) + { + Log.Info("Integrity below 0, calling OnDestroy"); OnDestroy(); + } return true; } @@ -292,22 +311,26 @@ private void Init(Vector3D position, float size, Vector3D initialVelocity, Aster private void CreatePhysics() { float mass = 10000 * Size * Size * Size; + float radius = Size / 2; // Assuming Size represents the diameter + PhysicsSettings settings = MyAPIGateway.Physics.CreateSettingsForPhysics( this, WorldMatrix, Vector3.Zero, linearDamping: 0f, // Remove damping angularDamping: 0f, // Remove damping - collisionLayer: CollisionLayers.DefaultCollisionLayer, + rigidBodyFlags: RigidBodyFlag.RBF_DEFAULT, + collisionLayer: CollisionLayers.NoVoxelCollisionLayer, isPhantom: false, mass: new ModAPIMass(PositionComp.LocalAABB.Volume(), mass, Vector3.Zero, mass * PositionComp.LocalAABB.Height * PositionComp.LocalAABB.Height / 6 * Matrix.Identity) ); - MyAPIGateway.Physics.CreateBoxPhysics(settings, PositionComp.LocalAABB.HalfExtents, 0); + MyAPIGateway.Physics.CreateSpherePhysics(settings, radius); Physics.Enabled = true; Physics.Activate(); } + private Vector3D RandVector() { var theta = MainSession.I.Rand.NextDouble() * 2.0 * Math.PI; diff --git a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs index 17308ed6..6890aab8 100644 --- a/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs +++ b/Dynamic Asteroids/Data/Scripts/DynamicAsteroids/AsteroidEntities/AsteroidSpawner.cs @@ -5,7 +5,6 @@ using VRage.Game.ModAPI; using VRage.ModAPI; using VRageMath; -using ProtoBuf; namespace DynamicAsteroids.AsteroidEntities { @@ -13,6 +12,7 @@ internal class AsteroidSpawner { public List _asteroids; private const double MinDistanceFromVanillaAsteroids = 1000; // 1 km + private const double MinDistanceFromPlayer = 3000; // Minimum distance from the player to spawn new asteroids private bool _canSpawnAsteroids = false; private DateTime _worldLoadTime; @@ -84,7 +84,12 @@ public void UpdateTick() int asteroidsSpawned = 0; while (_asteroids.Count < AsteroidSettings.MaxAsteroidCount && asteroidsSpawned < 10) { - Vector3D newPosition = playerPosition + RandVector() * AsteroidSettings.AsteroidSpawnRadius; + Vector3D newPosition; + do + { + newPosition = playerPosition + RandVector() * AsteroidSettings.AsteroidSpawnRadius; + } while (Vector3D.DistanceSquared(newPosition, playerPosition) < MinDistanceFromPlayer * MinDistanceFromPlayer); + Vector3D newVelocity; if (!AsteroidSettings.CanSpawnAsteroidAtPoint(newPosition, out newVelocity)) continue; diff --git a/Dynamic Asteroids/Data/newfile.txt b/Dynamic Asteroids/Data/newfile.txt index 68935190..8e3e8234 100644 --- a/Dynamic Asteroids/Data/newfile.txt +++ b/Dynamic Asteroids/Data/newfile.txt @@ -781,7 +781,6 @@ using SC.SUGMA; using VRage.Game.ModAPI; using VRage.ModAPI; using VRageMath; -using ProtoBuf; namespace DynamicAsteroids.AsteroidEntities { @@ -789,6 +788,7 @@ namespace DynamicAsteroids.AsteroidEntities { public List _asteroids; private const double MinDistanceFromVanillaAsteroids = 1000; // 1 km + private const double MinDistanceFromPlayer = 3000; // Minimum distance from the player to spawn new asteroids private bool _canSpawnAsteroids = false; private DateTime _worldLoadTime; @@ -860,7 +860,12 @@ namespace DynamicAsteroids.AsteroidEntities int asteroidsSpawned = 0; while (_asteroids.Count < AsteroidSettings.MaxAsteroidCount && asteroidsSpawned < 10) { - Vector3D newPosition = playerPosition + RandVector() * AsteroidSettings.AsteroidSpawnRadius; + Vector3D newPosition; + do + { + newPosition = playerPosition + RandVector() * AsteroidSettings.AsteroidSpawnRadius; + } while (Vector3D.DistanceSquared(newPosition, playerPosition) < MinDistanceFromPlayer * MinDistanceFromPlayer); + Vector3D newVelocity; if (!AsteroidSettings.CanSpawnAsteroidAtPoint(newPosition, out newVelocity)) continue;