Beispiel #1
0
        public override void UpdateBeforeSimulation()
        {
            base.UpdateBeforeSimulation();
            int count = this.m_creationBuffer.Count;

            if (count > 20)
            {
                count /= 10;
            }
            while (true)
            {
                count--;
                if (count <= 0)
                {
                    return;
                }
                DebrisCreationInfo info = this.m_creationBuffer.Dequeue();
                DebrisType         type = info.Type;
                if (type == DebrisType.Voxel)
                {
                    (this.CreateVoxelDebris(50f, info.Ammount).Debris as MyDebrisVoxel.MyDebrisVoxelLogic).Start(info.Position, info.Velocity, info.Material);
                    continue;
                }
                if (type != DebrisType.Random)
                {
                    throw new ArgumentOutOfRangeException();
                }
                MyDebrisBase base2 = this.CreateRandomDebris();
                if (base2 != null)
                {
                    base2.Debris.Start(info.Position, info.Velocity);
                }
            }
        }
Beispiel #2
0
 private void EnqueueDebrisCreation(DebrisCreationInfo info)
 {
     while (this.m_creationBuffer.Count >= 0x21)
     {
         this.m_creationBuffer.Dequeue();
     }
     if (MyFakes.ENABLE_DEBRIS)
     {
         this.m_creationBuffer.Enqueue(info);
     }
 }
Beispiel #3
0
        public void CreateExplosionDebris(ref BoundingSphereD explosionSphere, MyEntity entity, ref BoundingBoxD bb, float scaleMultiplier = 1f, bool applyVelocity = true)
        {
            MyUtils.GetRandomVector3Normalized();
            MyUtils.GetRandomFloat(0f, (float)explosionSphere.Radius);
            this.GeneratePositions(bb, this.m_positionBuffer);
            Vector3 vector = (entity.Physics != null) ? entity.Physics.LinearVelocity : Vector3.Zero;

            foreach (Vector3D vectord in this.m_positionBuffer)
            {
                DebrisCreationInfo info = new DebrisCreationInfo {
                    Type     = DebrisType.Random,
                    Position = vectord,
                    Velocity = applyVelocity ? ((MyUtils.GetRandomVector3Normalized() * MyUtils.GetRandomFloat(4f, 8f)) + vector) : Vector3.Zero
                };
                this.EnqueueDebrisCreation(info);
            }
        }
Beispiel #4
0
 public void CreateDirectedDebris(Vector3 sourceWorldPosition, Vector3 offsetDirection, float minSourceDistance, float maxSourceDistance, float minDeviationAngle, float maxDeviationAngle, int debrisPieces, float initialSpeed, float maxAmount, MyVoxelMaterialDefinition material)
 {
     for (int i = 0; i < debrisPieces; i++)
     {
         float              randomFloat = MyUtils.GetRandomFloat(minSourceDistance, maxSourceDistance);
         float              radians     = MyUtils.GetRandomFloat(minDeviationAngle, maxDeviationAngle);
         Matrix             matrix      = Matrix.CreateRotationX(MyUtils.GetRandomFloat(minDeviationAngle, maxDeviationAngle)) * Matrix.CreateRotationY(radians);
         Vector3            vector      = Vector3.Transform(offsetDirection, matrix);
         Vector3            vector2     = sourceWorldPosition + (vector * randomFloat);
         Vector3            vector3     = vector * initialSpeed;
         DebrisCreationInfo info        = new DebrisCreationInfo {
             Type     = DebrisType.Voxel,
             Position = vector2,
             Velocity = vector3,
             Material = material,
             Ammount  = maxAmount
         };
         this.EnqueueDebrisCreation(info);
     }
 }