Beispiel #1
0
    private void OnClugUse(EntityUid uid, ClusterGrenadeComponent component, UseInHandEvent args)
    {
        if (component.CountDown || (component.GrenadesContainer.ContainedEntities.Count + component.UnspawnedCount) <= 0)
        {
            return;
        }

        // TODO: Should be an Update loop
        uid.SpawnTimer((int)(component.Delay * 1000), () =>
        {
            if (Deleted(component.Owner))
            {
                return;
            }

            component.CountDown  = true;
            var delay            = 20;
            var grenadesInserted = component.GrenadesContainer.ContainedEntities.Count + component.UnspawnedCount;
            var thrownCount      = 0;
            var segmentAngle     = 360 / grenadesInserted;
            while (TryGetGrenade(component, out var grenade))
            {
                var angleMin = segmentAngle * thrownCount;
                var angleMax = segmentAngle * (thrownCount + 1);
                var angle    = Angle.FromDegrees(_random.Next(angleMin, angleMax));
                // var distance = random.NextFloat() * _throwDistance;

                delay += _random.Next(550, 900);
                thrownCount++;

                // TODO: Suss out throw strength
                grenade.TryThrow(angle.ToVec().Normalized *component.ThrowDistance);

                grenade.SpawnTimer(delay, () =>
                {
                    if ((!EntityManager.EntityExists(grenade) ? EntityLifeStage.Deleted : MetaData(grenade).EntityLifeStage) >= EntityLifeStage.Deleted)
                    {
                        return;
                    }

                    _trigger.Trigger(grenade, args.User);
                });
            }

            EntityManager.DeleteEntity(uid);
        });

        args.Handled = true;
    }
Beispiel #2
0
    public void Cremate(EntityUid uid, CrematoriumComponent?component = null, EntityStorageComponent?storage = null)
    {
        if (!Resolve(uid, ref component, ref storage))
        {
            return;
        }

        if (TryComp <AppearanceComponent>(uid, out var app))
        {
            app.SetData(CrematoriumVisuals.Burning, true);
        }
        component.Cooking = true;

        SoundSystem.Play(component.CrematingSound.GetSound(), Filter.Pvs(uid), uid);

        component.CremateCancelToken?.Cancel();
        component.CremateCancelToken = new CancellationTokenSource();
        uid.SpawnTimer(component.BurnMilis, () =>
        {
            if (Deleted(uid))
            {
                return;
            }
            if (TryComp <AppearanceComponent>(uid, out var app))
            {
                app.SetData(CrematoriumVisuals.Burning, false);
            }
            component.Cooking = false;

            if (storage.Contents.ContainedEntities.Count > 0)
            {
                for (var i = storage.Contents.ContainedEntities.Count - 1; i >= 0; i--)
                {
                    var item = storage.Contents.ContainedEntities[i];
                    storage.Contents.Remove(item);
                    EntityManager.DeleteEntity(item);
                }

                var ash = Spawn("Ash", Transform(uid).Coordinates);
                storage.Contents.Insert(ash);
            }

            _entityStorage.OpenStorage(uid, storage);

            SoundSystem.Play(component.CremateFinishSound.GetSound(), Filter.Pvs(uid), uid);
        }, component.CremateCancelToken.Token);
    }