/// <summary> /// Try to use an amount of items on this stack. /// See <see cref="StackUseEvent"/> /// </summary> private void OnStackUse(EntityUid uid, StackComponent stack, StackUseEvent args) { // Check if we have enough things in the stack for this... if (stack.Count < args.Amount) { // Not enough things in the stack, so we set the output result to false. args.Result = false; } else { // We do have enough things in the stack, so remove them and set the output result to true. RaiseLocalEvent(uid, new StackChangeCountEvent(stack.Count - args.Amount), false); args.Result = true; } }
private async void HandleAfterInteract(EntityUid uid, SpawnAfterInteractComponent component, AfterInteractEvent args) { if (string.IsNullOrEmpty(component.Prototype)) { return; } if (!_mapManager.TryGetGrid(args.ClickLocation.GetGridId(EntityManager), out var grid)) { return; } if (!grid.TryGetTileRef(args.ClickLocation, out var tileRef)) { return; } bool IsTileClear() { return(tileRef.Tile.IsEmpty == false && args.User.InRangeUnobstructed(args.ClickLocation, popup: true)); } if (!IsTileClear()) { return; } if (component.DoAfterTime > 0 && TryGet <DoAfterSystem>(out var doAfterSystem)) { var doAfterArgs = new DoAfterEventArgs(args.User, component.DoAfterTime) { BreakOnUserMove = true, BreakOnStun = true, PostCheck = IsTileClear, }; var result = await doAfterSystem.DoAfter(doAfterArgs); if (result != DoAfterStatus.Finished) { return; } } if (component.Deleted || component.Owner.Deleted) { return; } var hasStack = component.Owner.HasComponent <StackComponent>(); if (hasStack && component.RemoveOnInteract) { var stackUse = new StackUseEvent() { Amount = 1 }; RaiseLocalEvent(component.Owner.Uid, stackUse); if (!stackUse.Result) { return; } } EntityManager.SpawnEntity(component.Prototype, args.ClickLocation.SnapToGrid(grid)); if (component.RemoveOnInteract && !hasStack && !component.Owner.Deleted) { component.Owner.Delete(); } }