示例#1
0
        async Task <bool> IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs)
        {
            if (_wirePrototypeID == null)
            {
                return(true);
            }
            if (!eventArgs.InRangeUnobstructed(ignoreInsideBlocker: true, popup: true))
            {
                return(true);
            }
            if (!_mapManager.TryGetGrid(eventArgs.ClickLocation.GetGridId(Owner.EntityManager), out var grid))
            {
                return(true);
            }
            var snapPos = grid.TileIndicesFor(eventArgs.ClickLocation);

            if (grid.GetTileRef(snapPos).Tile.IsEmpty)
            {
                return(true);
            }
            foreach (var anchored in grid.GetAnchoredEntities(snapPos))
            {
                if (Owner.EntityManager.ComponentManager.TryGetComponent <WireComponent>(anchored, out var wire) && wire.WireType == _blockingWireType)
                {
                    return(true);
                }
            }

            if (Owner.HasComponent <StackComponent>())
            {
                var stackUse = new StackUseEvent()
                {
                    Amount = 1
                };
                Owner.EntityManager.EventBus.RaiseLocalEvent(Owner.Uid, stackUse);

                if (!stackUse.Result)
                {
                    return(true);
                }
            }

            Owner.EntityManager.SpawnEntity(_wirePrototypeID, grid.GridTileToLocal(snapPos));
            return(true);
        }
示例#2
0
        async Task <bool> IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs)
        {
            if (!eventArgs.InRangeUnobstructed(ignoreInsideBlocker: true, popup: true))
            {
                return(true);
            }

            if (!Owner.TryGetComponent(out StackComponent? stack))
            {
                return(true);
            }

            var mapManager = IoCManager.Resolve <IMapManager>();

            var location    = eventArgs.ClickLocation.AlignWithClosestGridTile();
            var locationMap = location.ToMap(Owner.EntityManager);

            if (locationMap.MapId == MapId.Nullspace)
            {
                return(true);
            }
            mapManager.TryGetGrid(location.GetGridId(Owner.EntityManager), out var mapGrid);

            if (_outputTiles == null)
            {
                return(true);
            }

            foreach (var currentTile in _outputTiles)
            {
                var currentTileDefinition = (ContentTileDefinition)_tileDefinitionManager[currentTile];

                if (mapGrid != null)
                {
                    var tile     = mapGrid.GetTileRef(location);
                    var baseTurf = (ContentTileDefinition)_tileDefinitionManager[tile.Tile.TypeId];

                    if (HasBaseTurf(currentTileDefinition, baseTurf.Name))
                    {
                        var stackUse = new StackUseEvent()
                        {
                            Amount = 1
                        };
                        Owner.EntityManager.EventBus.RaiseLocalEvent(Owner.Uid, stackUse);

                        if (!stackUse.Result)
                        {
                            continue;
                        }

                        PlaceAt(mapGrid, location, currentTileDefinition.TileId);
                        break;
                    }
                }
                else if (HasBaseTurf(currentTileDefinition, "space"))
                {
                    mapGrid = mapManager.CreateGrid(locationMap.MapId);
                    mapGrid.WorldPosition = locationMap.Position;
                    location = new EntityCoordinates(mapGrid.GridEntityId, Vector2.Zero);
                    PlaceAt(mapGrid, location, _tileDefinitionManager[_outputTiles[0]].TileId, mapGrid.TileSize / 2f);
                    break;
                }
            }

            return(true);
        }