예제 #1
0
 /// <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;
     }
 }
예제 #2
0
        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();
            }
        }