public void Trigger(Vector2 position, float rotation, int releaseAmount)
        {
            if (!this.Enabled)
            {
                return;
            }

            if (_owner.TriggerHandlers.Count > 0)
            {
                TriggerContext triggerContext = new TriggerContext
                {
                    Position = position,
                    Rotation = rotation,
                    ReleaseAmount = releaseAmount,
                    Canceled = false,
                };

                _owner.TriggerHandlers.Process(ref triggerContext);
                if (triggerContext.Canceled)
                {
                    return;
                }

                position = triggerContext.Position;
                rotation = triggerContext.Rotation;
                releaseAmount = triggerContext.ReleaseAmount;
            }

            Matrix rotationMatrix = default(Matrix);
            bool isRotated = FlaiMath.RealModulus(rotation, FlaiMath.TwoPi) != 0;
            if (isRotated)
            {
                Matrix.CreateRotationZ(rotation, out rotationMatrix);
            }

            Particle particle = default(Particle);
            for (int i = 0; i < releaseAmount; i++)
            {
                _emitterStyle.GenerateOffsetAndForce(out particle.Position, out particle.Velocity);
                if (isRotated)
                {
                    Vector2.Transform(ref particle.Position, ref rotationMatrix, out particle.Position);
                    Vector2.Transform(ref particle.Velocity, ref rotationMatrix, out particle.Velocity);
                }

                particle.Inception = _totalSeconds;
                particle.Position += position;
                particle.Velocity *= Global.Random.NextFloat(this.ReleaseParameters.Speed);
                particle.Rotation = Global.Random.NextFloat(this.ReleaseParameters.Rotation);
                particle.Scale = Global.Random.NextFloat(this.ReleaseParameters.Scale);
                particle.Color = this.ReleaseParameters.Color.NextVector3(Global.Random);
                particle.Opacity = Global.Random.NextFloat(this.ReleaseParameters.Opacity);
                particle.Noise = Global.Random.NextFloat(0, 1);

                _particleBuffer.AddLast(ref particle);
            }
        }
 private bool ShouldParticleEffectTrigger(ref TriggerContext triggerContext)
 {
     return SkypieaConstants.GetAdjustedCameraArea(CCamera2D.Active).Contains(triggerContext.Position);
 }