public override void Update(Timestep timestep, EntityUniverseFacade entityUniverseFacade)
        {
            if (TilePower == null)
            {
                return;
            }

            Universe = entityUniverseFacade;

            if (entityUniverseFacade.ReadTile(Location, TileAccessFlags.SynchronousWait, out var tile))
            {
                var config = GameContext.TileDatabase.GetTileConfiguration(Tile);
                if (config.Components.Select <ChargeableComponent>().Any() && tile.Configuration.Code != "staxel.tile.Sky")
                {
                    TilePower.GetPowerFromComponent(config.Components.Select <ChargeableComponent>().First());
                }
                else
                {
                    var itemBlob = BlobAllocator.Blob(true);
                    itemBlob.SetString("kind", "staxel.item.Placer");
                    itemBlob.SetString("tile", Tile);
                    var item = GameContext.ItemDatabase.SpawnItemStack(itemBlob, null);
                    ItemEntityBuilder.SpawnDroppedItem(Entity, entityUniverseFacade, item, Entity.Physics.Position, new Vector3D(0, 1, 0), Vector3D.Zero, SpawnDroppedFlags.None);
                    entityUniverseFacade.RemoveEntity(Entity.Id);
                    return;
                }
                Cycle.RunCycle(RunCycle);
            }
        }
Example #2
0
        public void ResetBall(EntityUniverseFacade universe)
        {
            var item = new ItemStack(_ball, 1);

            ItemEntityBuilder.SpawnDroppedItem(Entity, universe, item, GetSpawningPosition(),
                                               new Vector3D(0, 4, 0) +
                                               new Vector3D(1, 2, 1) * GameContext.RandomSource.NextVector3DInSphere(),
                                               Vector3D.Zero, SpawnDroppedFlags.None);
            _ballSpawned = true;
        }
Example #3
0
        public override void Start(Entity entity, EntityUniverseFacade facade)
        {
            if (entity.Inventory.ActiveItem().Item is LauncherTool launcher)
            {
                var release = launcher.GetAmount();
                if (launcher.UseInventory())
                {
                    if (entity.Inventory.CountItemsWithCode(launcher.GetItemToThrow()) < 1)
                    {
                        if (entity.PlayerEntityLogic != null)
                        {
                            var config =
                                GameContext.NotificationDatabase.GetNotificationConfig(
                                    "nimbusfox.launcherapi.notifications.NoAmmo");

                            config.LangCode = launcher.GetNoAmmoCode();

                            var notifcation = GameContext.NotificationDatabase.CreateNotificationFromCode(
                                "nimbusfox.launcherapi.notifications.NoAmmo", facade.Step, NotificationParams.EmptyParams, true);

                            var blankBlob = BlobAllocator.Blob(true);

                            blankBlob.FetchBlob("textParams");

                            notifcation.Restore(config, blankBlob);

                            entity.PlayerEntityLogic.ShowNotification(notifcation);
                        }
                        goto end;
                    }

                    if (entity.Inventory.CountItemsWithCode(launcher.GetItemToThrow()) < release)
                    {
                        release = (byte)entity.Inventory.CountItemsWithCode(launcher.GetItemToThrow());
                    }
                    entity.Inventory.RemoveItemWithCode(launcher.GetItemToThrow(), release, "");
                }

                Item item = null;

                var configs = GameContext.ItemDatabase.GetConfigsByKind(launcher.GetKind()).ToList();

                if (configs.Any(x => x.Value.Code == launcher.GetItemToThrow()))
                {
                    item = GameContext.ItemDatabase.InstanceFromItemConfiguration(configs
                                                                                  .First(x => x.Value.Code == launcher.GetItemToThrow()).Value);
                }

                if (item == null)
                {
                    goto end;
                }

                for (var i = 0; i < release; i++)
                {
                    ItemEntityBuilder.SpawnDroppedItem(entity, facade, new ItemStack(item, 1), entity.Physics.TopPosition(), entity.Physics.Velocity, entity.Logic.Heading().ToVector(), SpawnDroppedFlags.None, -1, launcher.GetVelocity());
                }
            }
end:
            entity.Logic.ActionFacade.NoNextAction();
        }
Example #4
0
        public override void Control(Entity entity, EntityUniverseFacade facade, ControlState main, ControlState alt)
        {
            if (!main.DownClick && !alt.DownClick)
            {
                return;
            }

            if (main.DownClick)
            {
                if (entity.PlayerEntityLogic.LookingAtTile(out var target, out _))
                {
                    if (facade.AnyInnerCableEntitiesInTile(target, out var entities))
                    {
                        foreach (var lEntity in entities)
                        {
                            var itemBlob = BlobAllocator.Blob(true);
                            itemBlob.SetString("code", ((InnerCableTileEntityLogic)lEntity.Logic).Tile);
                            var item = GameContext.ItemDatabase.SpawnItemStack(itemBlob, null);

                            if (item.IsNull())
                            {
                                itemBlob.Delete("code");
                                itemBlob.SetString("kind", "staxel.item.Placer");
                                itemBlob.SetString("tile", ((InnerCableTileEntityLogic)lEntity.Logic).Tile);
                                item = GameContext.ItemDatabase.SpawnItemStack(itemBlob, null);
                            }

                            ItemEntityBuilder.SpawnDroppedItem(entity, facade, item, target.ToVector3D(), Vector3D.Zero,
                                                               Vector3D.Zero, SpawnDroppedFlags.AttemptPickup);

                            facade.RemoveEntity(lEntity.Id);
                        }
                    }
                    else
                    {
                        if (_targetCode == "nimbusfox.powerapi.verb.none")
                        {
                            var notification = GameContext.NotificationDatabase.CreateNotificationFromCode(
                                "nimbusfox.powerapi.notifications.noCableSelected", facade.Step,
                                new NotificationParams(), true);

                            entity.PlayerEntityLogic.ShowNotification(notification);
                            return;
                        }

                        if (!entity.Inventory.HasItemWithCode(_targetCode))
                        {
                            var nparams = new NotificationParams(1);

                            nparams.SetTranslation(0, _targetCode + ".name");

                            var notification =
                                GameContext.NotificationDatabase.CreateNotificationFromCode(
                                    "nimbusfox.powerapi.notifications.noCable", facade.Step, nparams, true);

                            entity.PlayerEntityLogic.ShowNotification(notification);
                            return;
                        }


                        if (facade.ReadTile(target, TileAccessFlags.SynchronousWait, out var tile))
                        {
                            if (!tile.Configuration.Components.Select <ChargeableComponent>().Any())
                            {
                                var config = BlobAllocator.Blob(true);
                                config.SetString("tile", _targetCode);
                                InnerCableTileEntityBuilder.Spawn(target, config, facade);
                                entity.Inventory.ConsumeItem(new ItemStack(entity.Inventory.GetItemStack(_slot).Item, 1));
                            }
                        }
                    }
                }
            }

            if (alt.DownClick)
            {
                var orig   = _targetCode;
                var looped = false;
loop:
                if (_slot + 1 >= entity.Inventory.SlotCount())
                {
                    _slot = 0;
                }

                for (var i = _slot; i < entity.Inventory.SlotCount(); i++)
                {
                    var current = entity.Inventory.GetItemStack(i);

                    if (current.IsNull())
                    {
                        continue;
                    }

                    if (current.Item.Configuration.Components.Select <CableComponent>().Any())
                    {
                        _slot       = i;
                        _targetCode = current.Item.GetItemCode();
                        break;
                    }
                }

                if (orig == _targetCode)
                {
                    if (!looped)
                    {
                        looped = true;
                        _slot  = 0;
                        goto loop;
                    }

                    _targetCode = "nimbusfox.powerapi.verb.none";
                }
            }

            entity.Inventory.ItemStoreNeedsStorage();
        }