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); } } }
private void EnqueueDebrisCreation(DebrisCreationInfo info) { while (this.m_creationBuffer.Count >= 0x21) { this.m_creationBuffer.Dequeue(); } if (MyFakes.ENABLE_DEBRIS) { this.m_creationBuffer.Enqueue(info); } }
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); } }
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); } }