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