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; }
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); }