From 5553976d70ee6961a8fde2cd49256eae40f961e6 Mon Sep 17 00:00:00 2001 From: Vordenburg <114301317+Vordenburg@users.noreply.github.com> Date: Sun, 1 Jan 2023 18:42:56 -0500 Subject: [PATCH] Add supplies to restock vending machines. (#11506) --- .../Tests/VendingMachineRestockTest.cs | 360 +++++++++++++++++ .../Behaviors/DumpRestockInventory.cs | 61 +++ .../Restock/VendingMachineRestockComponent.cs | 42 ++ .../Restock/VendingMachineRestockSystem.cs | 148 +++++++ .../VendingMachines/VendingMachineSystem.cs | 53 +++ .../SharedVendingMachineSystem.cs | 51 ++- Resources/Audio/Machines/attributions.yml | 10 + .../Audio/Machines/vending_restock_done.ogg | Bin 0 -> 25193 bytes .../Audio/Machines/vending_restock_start.ogg | Bin 0 -> 66397 bytes .../catalog/cargo/cargo-vending.ftl | 48 +++ .../catalog/fills/crates/vending-crates.ftl | 47 +++ .../vending-machine-restock-component.ftl | 4 + .../Catalog/Cargo/cargo_vending.yml | 167 ++++++++ .../Catalog/Fills/Crates/vending.yml | 134 +++++++ .../Spawners/vending_machine_restock.yml | 59 +++ .../Service/vending_machine_restock.yml | 365 ++++++++++++++++++ .../vending_machine_restock.rsi/base.png | Bin 0 -> 241 bytes .../vending_machine_restock.rsi/green_bit.png | Bin 0 -> 175 bytes .../inhand-left.png | Bin 0 -> 171 bytes .../inhand-right.png | Bin 0 -> 172 bytes .../vending_machine_restock.rsi/meta.json | 91 +++++ .../refill_booze.png | Bin 0 -> 215 bytes .../refill_chinese.png | Bin 0 -> 244 bytes .../refill_clothes.png | Bin 0 -> 303 bytes .../refill_cola.png | Bin 0 -> 218 bytes .../refill_costume.png | Bin 0 -> 257 bytes .../refill_custom.png | Bin 0 -> 167 bytes .../refill_dinner.png | Bin 0 -> 221 bytes .../refill_discount.png | Bin 0 -> 202 bytes .../refill_donksoft.png | Bin 0 -> 253 bytes .../refill_donuts.png | Bin 0 -> 276 bytes .../refill_engi.png | Bin 0 -> 240 bytes .../refill_games.png | Bin 0 -> 373 bytes .../refill_joe.png | Bin 0 -> 245 bytes .../refill_medical.png | Bin 0 -> 244 bytes .../refill_parts.png | Bin 0 -> 240 bytes .../refill_plant.png | Bin 0 -> 209 bytes .../refill_ptech.png | Bin 0 -> 220 bytes .../refill_salvage.png | Bin 0 -> 230 bytes .../refill_sec.png | Bin 0 -> 237 bytes .../refill_smoke.png | Bin 0 -> 212 bytes .../refill_snack.png | Bin 0 -> 184 bytes .../refill_tanks.png | Bin 0 -> 232 bytes 43 files changed, 1625 insertions(+), 15 deletions(-) create mode 100644 Content.IntegrationTests/Tests/VendingMachineRestockTest.cs create mode 100644 Content.Server/Destructible/Thresholds/Behaviors/DumpRestockInventory.cs create mode 100644 Content.Server/VendingMachines/Restock/VendingMachineRestockComponent.cs create mode 100644 Content.Server/VendingMachines/Restock/VendingMachineRestockSystem.cs create mode 100644 Resources/Audio/Machines/vending_restock_done.ogg create mode 100644 Resources/Audio/Machines/vending_restock_start.ogg create mode 100644 Resources/Locale/en-US/prototypes/catalog/cargo/cargo-vending.ftl create mode 100644 Resources/Locale/en-US/prototypes/catalog/fills/crates/vending-crates.ftl create mode 100644 Resources/Locale/en-US/vending-machines/vending-machine-restock-component.ftl create mode 100644 Resources/Prototypes/Catalog/Cargo/cargo_vending.yml create mode 100644 Resources/Prototypes/Catalog/Fills/Crates/vending.yml create mode 100644 Resources/Prototypes/Entities/Markers/Spawners/vending_machine_restock.yml create mode 100644 Resources/Prototypes/Entities/Objects/Specific/Service/vending_machine_restock.yml create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/base.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/green_bit.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_booze.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_chinese.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_clothes.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_cola.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_costume.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_custom.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_dinner.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_discount.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_donksoft.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_donuts.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_engi.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_games.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_joe.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_medical.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_parts.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_plant.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_ptech.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_salvage.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_sec.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_smoke.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_snack.png create mode 100644 Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_tanks.png diff --git a/Content.IntegrationTests/Tests/VendingMachineRestockTest.cs b/Content.IntegrationTests/Tests/VendingMachineRestockTest.cs new file mode 100644 index 0000000000..49207b5f55 --- /dev/null +++ b/Content.IntegrationTests/Tests/VendingMachineRestockTest.cs @@ -0,0 +1,360 @@ +#nullable enable +using System.Collections.Generic; +using System.Threading.Tasks; +using NUnit.Framework; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Map; +using Robust.Shared.Prototypes; +using Content.Server.Storage.Components; +using Content.Server.VendingMachines; +using Content.Server.VendingMachines.Restock; +using Content.Server.Wires; +using Content.Shared.Cargo.Prototypes; +using Content.Shared.Damage; +using Content.Shared.Damage.Prototypes; +using Content.Shared.VendingMachines; + +namespace Content.IntegrationTests.Tests +{ + [TestFixture] + [TestOf(typeof(VendingMachineRestockComponent))] + [TestOf(typeof(VendingMachineRestockSystem))] + public sealed class VendingMachineRestockTest : EntitySystem + { + private const string Prototypes = @" +- type: entity + name: HumanDummy + id: HumanDummy + components: + - type: Hands + - type: Body + prototype: Human + +- type: entity + parent: FoodSnackBase + id: TestRamen + name: TestRamen + +- type: vendingMachineInventory + id: TestInventory + startingInventory: + TestRamen: 1 + +- type: vendingMachineInventory + id: OtherTestInventory + startingInventory: + TestRamen: 3 + +- type: vendingMachineInventory + id: BigTestInventory + startingInventory: + TestRamen: 4 + +- type: entity + parent: BaseVendingMachineRestock + id: TestRestockWrong + name: TestRestockWrong + components: + - type: VendingMachineRestock + canRestock: + - OtherTestInventory + +- type: entity + parent: BaseVendingMachineRestock + id: TestRestockCorrect + name: TestRestockCorrect + components: + - type: VendingMachineRestock + canRestock: + - TestInventory + +- type: entity + parent: BaseVendingMachineRestock + id: TestRestockExplode + name: TestRestockExplode + components: + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 20 + behaviors: + - !type:DumpRestockInventory + - !type:DoActsBehavior + acts: [ 'Destruction' ] + - type: VendingMachineRestock + canRestock: + - BigTestInventory + +- type: entity + parent: VendingMachine + id: VendingMachineTest + name: Test Ramen + components: + - type: Wires + LayoutId: Vending + - type: VendingMachine + pack: TestInventory + - type: Sprite + sprite: error.rsi +"; + + [Test] + public async Task TestAllRestocksAreAvailableToBuy() + { + await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings{NoClient = true}); + var server = pairTracker.Pair.Server; + await server.WaitIdleAsync(); + + var prototypeManager = server.ResolveDependency(); + + await server.WaitAssertion(() => + { + HashSet restocks = new(); + Dictionary> restockStores = new(); + + // Collect all the prototypes with restock components. + foreach (var proto in prototypeManager.EnumeratePrototypes()) + { + if (proto.Abstract || + !proto.TryGetComponent(out var restock)) + { + continue; + } + + restocks.Add(proto.ID); + } + + // Collect all the prototypes with StorageFills referencing those entities. + foreach (var proto in prototypeManager.EnumeratePrototypes()) + { + if (!proto.TryGetComponent(out var storage)) + continue; + + List restockStore = new(); + foreach (var spawnEntry in storage.Contents) + { + if (spawnEntry.PrototypeId != null && restocks.Contains(spawnEntry.PrototypeId)) + restockStore.Add(spawnEntry.PrototypeId); + } + + if (restockStore.Count > 0) + restockStores.Add(proto.ID, restockStore); + } + + // Iterate through every CargoProduct and make sure each + // prototype with a restock component is referenced in a + // purchaseable entity with a StorageFill. + foreach (var proto in prototypeManager.EnumeratePrototypes()) + { + if (restockStores.ContainsKey(proto.Product)) + { + foreach (var entry in restockStores[proto.Product]) + restocks.Remove(entry); + + restockStores.Remove(proto.Product); + } + } + + Assert.That(restockStores.Count, Is.EqualTo(0), + $"Some entities containing entities with VendingMachineRestock components are unavailable for purchase: \n - {string.Join("\n - ", restockStores.Keys)}"); + + Assert.That(restocks.Count, Is.EqualTo(0), + $"Some entities with VendingMachineRestock components are unavailable for purchase: \n - {string.Join("\n - ", restocks)}"); + }); + + await pairTracker.CleanReturnAsync(); + } + + [Test] + public async Task TestCompleteRestockProcess() + { + await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings{NoClient = true, ExtraPrototypes = Prototypes}); + var server = pairTracker.Pair.Server; + await server.WaitIdleAsync(); + + var mapManager = server.ResolveDependency(); + var entityManager = server.ResolveDependency(); + var entitySystemManager = server.ResolveDependency(); + + EntityUid packageRight; + EntityUid packageWrong; + EntityUid machine; + EntityUid user; + VendingMachineComponent machineComponent; + VendingMachineRestockComponent restockRightComponent; + VendingMachineRestockComponent restockWrongComponent; + WiresComponent machineWires; + + var testMap = await PoolManager.CreateTestMap(pairTracker); + + await server.WaitAssertion(() => + { + var coordinates = testMap.GridCoords; + + // Spawn the entities. + user = entityManager.SpawnEntity("HumanDummy", coordinates); + machine = entityManager.SpawnEntity("VendingMachineTest", coordinates); + packageRight = entityManager.SpawnEntity("TestRestockCorrect", coordinates); + packageWrong = entityManager.SpawnEntity("TestRestockWrong", coordinates); + + // Sanity test for components existing. + Assert.True(entityManager.TryGetComponent(machine, out machineComponent!), $"Machine has no {nameof(VendingMachineComponent)}"); + Assert.True(entityManager.TryGetComponent(packageRight, out restockRightComponent!), $"Correct package has no {nameof(VendingMachineRestockComponent)}"); + Assert.True(entityManager.TryGetComponent(packageWrong, out restockWrongComponent!), $"Wrong package has no {nameof(VendingMachineRestockComponent)}"); + Assert.True(entityManager.TryGetComponent(machine, out machineWires!), $"Machine has no {nameof(WiresComponent)}"); + + var systemRestock = entitySystemManager.GetEntitySystem(); + var systemMachine = entitySystemManager.GetEntitySystem(); + + // Test that the panel needs to be opened first. + Assert.That(systemRestock.TryAccessMachine(packageRight, restockRightComponent, machineComponent, user, machine), Is.False, "Right package is able to restock without opened access panel"); + Assert.That(systemRestock.TryAccessMachine(packageWrong, restockWrongComponent, machineComponent, user, machine), Is.False, "Wrong package is able to restock without opened access panel"); + + // Open the panel. + machineWires.IsPanelOpen = true; + + // Test that the right package works for the right machine. + Assert.That(systemRestock.TryAccessMachine(packageRight, restockRightComponent, machineComponent, user, machine), Is.True, "Correct package is unable to restock with access panel opened"); + + // Test that the wrong package does not work. + Assert.That(systemRestock.TryMatchPackageToMachine(packageWrong, restockWrongComponent, machineComponent, user, machine), Is.False, "Package with invalid canRestock is able to restock machine"); + + // Test that the right package does work. + Assert.That(systemRestock.TryMatchPackageToMachine(packageRight, restockRightComponent, machineComponent, user, machine), Is.True, "Package with valid canRestock is unable to restock machine"); + + // Make sure there's something in there to begin with. + Assert.That(systemMachine.GetAvailableInventory(machine, machineComponent).Count, Is.GreaterThan(0), + "Machine inventory is empty before emptying."); + + // Empty the inventory. + systemMachine.EjectRandom(machine, false, true, machineComponent); + Assert.That(systemMachine.GetAvailableInventory(machine, machineComponent).Count, Is.EqualTo(0), + "Machine inventory is not empty after ejecting."); + + // Test that the inventory is actually restocked. + systemMachine.TryRestockInventory(machine, machineComponent); + Assert.That(systemMachine.GetAvailableInventory(machine, machineComponent).Count, Is.GreaterThan(0), + "Machine available inventory count is not greater than zero after restock."); + + mapManager.DeleteMap(testMap.MapId); + }); + + await pairTracker.CleanReturnAsync(); + } + + [Test] + public async Task TestRestockBreaksOpen() + { + await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings{NoClient = true, ExtraPrototypes = Prototypes}); + var server = pairTracker.Pair.Server; + await server.WaitIdleAsync(); + + var prototypeManager = server.ResolveDependency(); + var mapManager = server.ResolveDependency(); + var entityManager = server.ResolveDependency(); + var entitySystemManager = server.ResolveDependency(); + + var damageableSystem = entitySystemManager.GetEntitySystem(); + + var testMap = await PoolManager.CreateTestMap(pairTracker); + + EntityUid restock = default; + + await server.WaitAssertion(() => + { + var coordinates = testMap.GridCoords; + + var totalStartingRamen = 0; + + foreach (var meta in entityManager.EntityQuery()) + if (!meta.Deleted && meta.EntityPrototype?.ID == "TestRamen") + totalStartingRamen++; + + Assert.That(totalStartingRamen, Is.EqualTo(0), + "Did not start with zero ramen."); + + restock = entityManager.SpawnEntity("TestRestockExplode", coordinates); + var damageSpec = new DamageSpecifier(prototypeManager.Index("Blunt"), 100); + var damageResult = damageableSystem.TryChangeDamage(restock, damageSpec); + + Assert.IsNotNull(damageResult, + "Received null damageResult when attempting to damage restock box."); + + Assert.That((int) damageResult!.Total, Is.GreaterThan(0), + "Box damage result was not greater than 0."); + }); + await server.WaitRunTicks(15); + await server.WaitAssertion(() => + { + Assert.That(entityManager.Deleted(restock), + "Restock box was not deleted after being damaged."); + + var totalRamen = 0; + + foreach (var meta in entityManager.EntityQuery()) + if (!meta.Deleted && meta.EntityPrototype?.ID == "TestRamen") + totalRamen++; + + Assert.That(totalRamen, Is.EqualTo(2), + "Did not find enough ramen after destroying restock box."); + + mapManager.DeleteMap(testMap.MapId); + }); + + await pairTracker.CleanReturnAsync(); + } + + [Test] + public async Task TestRestockInventoryBounds() + { + await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings{NoClient = true, ExtraPrototypes = Prototypes}); + var server = pairTracker.Pair.Server; + await server.WaitIdleAsync(); + + var mapManager = server.ResolveDependency(); + var entityManager = server.ResolveDependency(); + var entitySystemManager = server.ResolveDependency(); + + var vendingMachineSystem = entitySystemManager.GetEntitySystem(); + + var testMap = await PoolManager.CreateTestMap(pairTracker); + + await server.WaitAssertion(() => + { + var coordinates = testMap.GridCoords; + + EntityUid machine = entityManager.SpawnEntity("VendingMachineTest", coordinates); + + Assert.That(vendingMachineSystem.GetAvailableInventory(machine).Count, Is.EqualTo(1), + "Machine's available inventory did not contain one entry."); + + Assert.That(vendingMachineSystem.GetAvailableInventory(machine)[0].Amount, Is.EqualTo(1), + "Machine's available inventory is not the expected amount."); + + vendingMachineSystem.RestockInventoryFromPrototype(machine); + + Assert.That(vendingMachineSystem.GetAvailableInventory(machine)[0].Amount, Is.EqualTo(2), + "Machine's available inventory is not double its starting amount after a restock."); + + vendingMachineSystem.RestockInventoryFromPrototype(machine); + + Assert.That(vendingMachineSystem.GetAvailableInventory(machine)[0].Amount, Is.EqualTo(3), + "Machine's available inventory is not triple its starting amount after two restocks."); + + vendingMachineSystem.RestockInventoryFromPrototype(machine); + + Assert.That(vendingMachineSystem.GetAvailableInventory(machine)[0].Amount, Is.EqualTo(3), + "Machine's available inventory did not stay the same after a third restock."); + }); + + await pairTracker.CleanReturnAsync(); + } + } +} + +#nullable disable diff --git a/Content.Server/Destructible/Thresholds/Behaviors/DumpRestockInventory.cs b/Content.Server/Destructible/Thresholds/Behaviors/DumpRestockInventory.cs new file mode 100644 index 0000000000..80553f2d33 --- /dev/null +++ b/Content.Server/Destructible/Thresholds/Behaviors/DumpRestockInventory.cs @@ -0,0 +1,61 @@ +using Robust.Shared.Random; +using Content.Shared.Stacks; +using Content.Server.VendingMachines.Restock; +using Content.Shared.Prototypes; +using Content.Shared.VendingMachines; + +namespace Content.Server.Destructible.Thresholds.Behaviors +{ + /// + /// Spawns a portion of the total items from one of the canRestock + /// inventory entries on a VendingMachineRestock component. + /// + [Serializable] + [DataDefinition] + public sealed class DumpRestockInventory: IThresholdBehavior + { + /// + /// The percent of each inventory entry that will be salvaged + /// upon destruction of the package. + /// + [DataField("percent", required: true)] + public float Percent = 0.5f; + + [DataField("offset")] + public float Offset { get; set; } = 0.5f; + + public void Execute(EntityUid owner, DestructibleSystem system) + { + if (!system.EntityManager.TryGetComponent(owner, out var packagecomp) || + !system.EntityManager.TryGetComponent(owner, out var xform)) + return; + + var randomInventory = system.Random.Pick(packagecomp.CanRestock); + + if (!system.PrototypeManager.TryIndex(randomInventory, out VendingMachineInventoryPrototype? packPrototype)) + return; + + foreach (var (entityId, count) in packPrototype.StartingInventory) + { + var toSpawn = (int) Math.Round(count * Percent); + + if (toSpawn == 0) continue; + + if (EntityPrototypeHelpers.HasComponent(entityId, system.PrototypeManager, system.ComponentFactory)) + { + var spawned = system.EntityManager.SpawnEntity(entityId, xform.Coordinates.Offset(system.Random.NextVector2(-Offset, Offset))); + system.StackSystem.SetCount(spawned, toSpawn); + system.EntityManager.GetComponent(spawned).LocalRotation = system.Random.NextAngle(); + } + else + { + for (var i = 0; i < toSpawn; i++) + { + var spawned = system.EntityManager.SpawnEntity(entityId, xform.Coordinates.Offset(system.Random.NextVector2(-Offset, Offset))); + system.EntityManager.GetComponent(spawned).LocalRotation = system.Random.NextAngle(); + } + } + } + } + } +} diff --git a/Content.Server/VendingMachines/Restock/VendingMachineRestockComponent.cs b/Content.Server/VendingMachines/Restock/VendingMachineRestockComponent.cs new file mode 100644 index 0000000000..1825c407cd --- /dev/null +++ b/Content.Server/VendingMachines/Restock/VendingMachineRestockComponent.cs @@ -0,0 +1,42 @@ +using System.Threading; +using Robust.Shared.Audio; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; +using Content.Shared.VendingMachines; + +namespace Content.Server.VendingMachines.Restock +{ + [RegisterComponent] + public sealed class VendingMachineRestockComponent : Component + { + public CancellationTokenSource? CancelToken; + + /// + /// The time (in seconds) that it takes to restock a machine. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("restockDelay")] + public TimeSpan RestockDelay = TimeSpan.FromSeconds(8.0f); + + /// + /// What sort of machine inventory does this restock? + /// This is checked against the VendingMachineComponent's pack value. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("canRestock", customTypeSerializer: typeof(PrototypeIdHashSetSerializer))] + public HashSet CanRestock = new(); + + /// + /// Sound that plays when starting to restock a machine. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("soundRestockStart")] + public SoundSpecifier SoundRestockStart = new SoundPathSpecifier("/Audio/Machines/vending_restock_start.ogg"); + + /// + /// Sound that plays when finished restocking a machine. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("soundRestockDone")] + public SoundSpecifier SoundRestockDone = new SoundPathSpecifier("/Audio/Machines/vending_restock_done.ogg"); + } +} diff --git a/Content.Server/VendingMachines/Restock/VendingMachineRestockSystem.cs b/Content.Server/VendingMachines/Restock/VendingMachineRestockSystem.cs new file mode 100644 index 0000000000..b1a95f0727 --- /dev/null +++ b/Content.Server/VendingMachines/Restock/VendingMachineRestockSystem.cs @@ -0,0 +1,148 @@ +using System.Linq; +using System.Threading; +using Robust.Server.GameObjects; +using Robust.Shared.Audio; +using Robust.Shared.Prototypes; +using Content.Server.Cargo.Systems; +using Content.Server.DoAfter; +using Content.Server.Wires; +using Content.Shared.Interaction; +using Content.Shared.Popups; +using Content.Shared.VendingMachines; + +namespace Content.Server.VendingMachines.Restock +{ + public sealed class VendingMachineRestockSystem : EntitySystem + { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + + [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly AudioSystem _audioSystem = default!; + [Dependency] private readonly PricingSystem _pricingSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAfterInteract); + SubscribeLocalEvent(OnPriceCalculation); + SubscribeLocalEvent(OnRestockCancelled); + } + + public bool TryAccessMachine(EntityUid uid, + VendingMachineRestockComponent component, + VendingMachineComponent machineComponent, + EntityUid user, + EntityUid target) + { + if (!TryComp(target, out var wires) || !wires.IsPanelOpen) { + _popupSystem.PopupCursor(Loc.GetString("vending-machine-restock-needs-panel-open", + ("this", uid), + ("user", user), + ("target", target)), + user); + return false; + } + + return true; + } + + public bool TryMatchPackageToMachine(EntityUid uid, + VendingMachineRestockComponent component, + VendingMachineComponent machineComponent, + EntityUid user, + EntityUid target) + { + if (!component.CanRestock.Contains(machineComponent.PackPrototypeId)) { + _popupSystem.PopupCursor(Loc.GetString("vending-machine-restock-invalid-inventory", + ("this", uid), + ("user", user), + ("target", target) + ), + user); + return false; + } + + return true; + } + + private void OnAfterInteract(EntityUid uid, VendingMachineRestockComponent component, AfterInteractEvent args) + { + if (component.CancelToken != null || args.Target == null || !args.CanReach) + return; + + if (!TryComp(args.Target, out var machineComponent)) + return; + + if (!TryMatchPackageToMachine(uid, component, machineComponent, args.User, args.Target.Value)) + return; + + if (!TryAccessMachine(uid, component, machineComponent, args.User, args.Target.Value)) + return; + + component.CancelToken = new CancellationTokenSource(); + + _doAfterSystem.DoAfter(new DoAfterEventArgs( + args.User, + (float) component.RestockDelay.TotalSeconds, + component.CancelToken.Token, + args.Target, + args.Used) + { + TargetFinishedEvent = new VendingMachineRestockEvent(args.User, uid), + UsedCancelledEvent = new RestockCancelledEvent(), + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnStun = true, + BreakOnDamage = true, + NeedHand = true + }); + + _popupSystem.PopupEntity(Loc.GetString("vending-machine-restock-start", + ("this", uid), + ("user", args.User), + ("target", args.Target) + ), + args.User, + PopupType.Medium); + + _audioSystem.PlayPvs(component.SoundRestockStart, component.Owner, + AudioParams.Default + .WithVolume(-2f) + .WithVariation(0.2f)); + } + + private void OnPriceCalculation(EntityUid uid, VendingMachineRestockComponent component, ref PriceCalculationEvent args) + { + List priceSets = new(); + + // Find the most expensive inventory and use that as the highest price. + foreach (var vendingInventory in component.CanRestock) + { + double total = 0; + + if (_prototypeManager.TryIndex(vendingInventory, out VendingMachineInventoryPrototype? inventoryPrototype)) + { + foreach (var (item, amount) in inventoryPrototype.StartingInventory) + { + if (_prototypeManager.TryIndex(item, out EntityPrototype? entity)) + total += _pricingSystem.GetEstimatedPrice(entity) * amount; + } + } + + priceSets.Add(total); + } + + args.Price += priceSets.Max(); + } + + private void OnRestockCancelled(EntityUid uid, VendingMachineRestockComponent component, RestockCancelledEvent args) + { + component.CancelToken?.Cancel(); + component.CancelToken = null; + } + + public readonly struct RestockCancelledEvent { } + } +} diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs index 85e416f806..a46f955385 100644 --- a/Content.Server/VendingMachines/VendingMachineSystem.cs +++ b/Content.Server/VendingMachines/VendingMachineSystem.cs @@ -3,6 +3,7 @@ using Content.Server.Popups; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Server.UserInterface; +using Content.Server.VendingMachines.Restock; using Content.Shared.Access.Components; using Content.Shared.Access.Systems; using Content.Shared.Actions; @@ -10,6 +11,7 @@ using Content.Shared.Actions.ActionTypes; using Content.Shared.Damage; using Content.Shared.Destructible; using Content.Shared.Emag.Systems; +using Content.Shared.Popups; using Content.Shared.Throwing; using Content.Shared.VendingMachines; using Robust.Server.GameObjects; @@ -51,6 +53,8 @@ namespace Content.Server.VendingMachines SubscribeLocalEvent(OnInventoryEjectMessage); SubscribeLocalEvent(OnSelfDispense); + + SubscribeLocalEvent(OnRestock); } private void OnVendingPrice(EntityUid uid, VendingMachineComponent component, ref PriceCalculationEvent args) @@ -160,6 +164,31 @@ namespace Content.Server.VendingMachines EjectRandom(uid, throwItem: true, forceEject: false, component); } + private void OnRestock(EntityUid uid, VendingMachineComponent component, VendingMachineRestockEvent args) + { + if (!TryComp(args.RestockBox, out var restockComponent)) + { + _sawmill.Error($"{ToPrettyString(args.User)} tried to restock {ToPrettyString(uid)} with {ToPrettyString(args.RestockBox)} which did not have a VendingMachineRestockComponent."); + return; + } + + TryRestockInventory(uid, component); + + _popupSystem.PopupEntity(Loc.GetString("vending-machine-restock-done", + ("this", args.RestockBox), + ("user", args.User), + ("target", uid)), + args.User, + PopupType.Medium); + + _audioSystem.PlayPvs(restockComponent.SoundRestockDone, component.Owner, + AudioParams.Default + .WithVolume(-2f) + .WithVariation(0.2f)); + + Del(args.RestockBox); + } + /// /// Sets the property of the vending machine. /// @@ -412,5 +441,29 @@ namespace Content.Server.VendingMachines } } } + + public void TryRestockInventory(EntityUid uid, VendingMachineComponent? vendComponent = null) + { + if (!Resolve(uid, ref vendComponent)) + return; + + RestockInventoryFromPrototype(uid, vendComponent); + + UpdateVendingMachineInterfaceState(vendComponent); + TryUpdateVisualState(uid, vendComponent); + } + + } + + public sealed class VendingMachineRestockEvent : EntityEventArgs + { + public EntityUid User { get; } + public EntityUid RestockBox { get; } + + public VendingMachineRestockEvent(EntityUid user, EntityUid restockBox) + { + User = user; + RestockBox = restockBox; + } } } diff --git a/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs b/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs index 11436fa57c..96b1f0a1d1 100644 --- a/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs +++ b/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs @@ -15,6 +15,17 @@ public abstract class SharedVendingMachineSystem : EntitySystem protected virtual void OnComponentInit(EntityUid uid, VendingMachineComponent component, ComponentInit args) { + RestockInventoryFromPrototype(uid, component); + } + + public void RestockInventoryFromPrototype(EntityUid uid, + VendingMachineComponent? component = null) + { + if (!Resolve(uid, ref component)) + { + return; + } + if (!_prototypeManager.TryIndex(component.PackPrototypeId, out VendingMachineInventoryPrototype? packPrototype)) return; @@ -64,28 +75,38 @@ public abstract class SharedVendingMachineSystem : EntitySystem return; } - var inventory = new Dictionary(); + Dictionary inventory; + switch (type) + { + case InventoryType.Regular: + inventory = component.Inventory; + break; + case InventoryType.Emagged: + inventory = component.EmaggedInventory; + break; + case InventoryType.Contraband: + inventory = component.ContrabandInventory; + break; + default: + return; + } foreach (var (id, amount) in entries) { if (_prototypeManager.HasIndex(id)) { - inventory.Add(id, new VendingMachineInventoryEntry(type, id, amount)); + if (inventory.TryGetValue(id, out VendingMachineInventoryEntry? entry)) + // Prevent a machine's stock from going over three times + // the prototype's normal amount. This is an arbitrary + // number and meant to be a convenience for someone + // restocking a machine who doesn't want to force vend out + // all the items just to restock one empty slot without + // losing the rest of the restock. + entry.Amount = Math.Min(entry.Amount + amount, 3 * amount); + else + inventory.Add(id, new VendingMachineInventoryEntry(type, id, amount)); } } - - switch (type) - { - case InventoryType.Regular: - component.Inventory = inventory; - break; - case InventoryType.Emagged: - component.EmaggedInventory = inventory; - break; - case InventoryType.Contraband: - component.ContrabandInventory = inventory; - break; - } } } diff --git a/Resources/Audio/Machines/attributions.yml b/Resources/Audio/Machines/attributions.yml index fa297cd1d6..64bb2793db 100644 --- a/Resources/Audio/Machines/attributions.yml +++ b/Resources/Audio/Machines/attributions.yml @@ -1,3 +1,13 @@ +- files: ["vending_restock_start.ogg"] + license: "CC0-1.0" + copyright: "https://freesound.org/people/Defaultv/" + source: "https://freesound.org/people/Defaultv/sounds/534362/" + +- files: ["vending_restock_done.ogg"] + license: "CC-BY-3.0" + copyright: "https://freesound.org/people/felipelnv/" + source: "https://freesound.org/people/felipelnv/sounds/153298/" + - files: ["short_print_and_rip.ogg"] license: "CC0-1.0" copyright: "receipt printing.wav by 13F_Panska_Tlolkova_Matilda. This version is cleaned up, shortened, and converted to OGG." diff --git a/Resources/Audio/Machines/vending_restock_done.ogg b/Resources/Audio/Machines/vending_restock_done.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e1386f4df1805bbf70e6c3e4443e6f675db9679b GIT binary patch literal 25193 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 w{$>2GZN&p9tJ^%m!005Ntt0OZ50qVBoegFUf literal 0 HcmV?d00001 diff --git a/Resources/Audio/Machines/vending_restock_start.ogg b/Resources/Audio/Machines/vending_restock_start.ogg new file mode 100644 index 0000000000000000000000000000000000000000..61e931a99998830fc495c405df6f45902b245707 GIT binary patch literal 66397 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 F_#Z86GQt1= literal 0 HcmV?d00001 diff --git a/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-vending.ftl b/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-vending.ftl new file mode 100644 index 0000000000..53a3fd77bc --- /dev/null +++ b/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-vending.ftl @@ -0,0 +1,48 @@ +ent-CrateVendingMachineRestockBooze = { ent-CrateVendingMachineRestockBoozeFilled } + .desc = { ent-CrateVendingMachineRestockBoozeFilled.desc } + +ent-CrateVendingMachineRestockClothes = { ent-CrateVendingMachineRestockClothesFilled } + .desc = { ent-CrateVendingMachineRestockClothesFilled.desc } + +ent-CrateVendingMachineRestockDinnerware = { ent-CrateVendingMachineRestockDinnerwareFilled } + .desc = { ent-CrateVendingMachineRestockDinnerwareFilled.desc } + +ent-CrateVendingMachineRestockEngineering = { ent-CrateVendingMachineRestockEngineeringFilled } + .desc = { ent-CrateVendingMachineRestockEngineeringFilled.desc } + +ent-CrateVendingMachineRestockGames = { ent-CrateVendingMachineRestockGamesFilled } + .desc = { ent-CrateVendingMachineRestockGamesFilled.desc } + +ent-CrateVendingMachineRestockHotDrinks = { ent-CrateVendingMachineRestockHotDrinksFilled } + .desc = { ent-CrateVendingMachineRestockHotDrinksFilled.desc } + +ent-CrateVendingMachineRestockMedical = { ent-CrateVendingMachineRestockMedicalFilled } + .desc = { ent-CrateVendingMachineRestockMedicalFilled.desc } + +ent-CrateVendingMachineRestockNutriMax = { ent-CrateVendingMachineRestockNutriMaxFilled } + .desc = { ent-CrateVendingMachineRestockNutriMaxFilled.desc } + +ent-CrateVendingMachineRestockPTech = { ent-CrateVendingMachineRestockPTechFilled } + .desc = { ent-CrateVendingMachineRestockPTechFilled.desc } + +ent-CrateVendingMachineRestockRobustSoftdrinks = { ent-CrateVendingMachineRestockRobustSoftdrinksFilled } + .desc = { ent-CrateVendingMachineRestockRobustSoftdrinksFilled.desc } + +ent-CrateVendingMachineRestockSalvageEquipment = { ent-CrateVendingMachineRestockSalvageEquipmentFilled } + .desc = { ent-CrateVendingMachineRestockSalvageEquipmentFilled.desc } + +ent-CrateVendingMachineRestockSecTech = { ent-CrateVendingMachineRestockSecTechFilled } + .desc = { ent-CrateVendingMachineRestockSecTechFilled.desc } + +ent-CrateVendingMachineRestockSeeds = { ent-CrateVendingMachineRestockSeedsFilled } + .desc = { ent-CrateVendingMachineRestockSeedsFilled.desc } + +ent-CrateVendingMachineRestockSmokes = { ent-CrateVendingMachineRestockSmokesFilled } + .desc = { ent-CrateVendingMachineRestockSmokesFilled.desc } + +ent-CrateVendingMachineRestockSnacks = { ent-CrateVendingMachineRestockSnacksFilled } + .desc = { ent-CrateVendingMachineRestockSnacksFilled.desc } + +ent-CrateVendingMachineRestockTankDispenser = { ent-CrateVendingMachineRestockTankDispenserFilled } + .desc = { ent-CrateVendingMachineRestockTankDispenserFilled.desc } + diff --git a/Resources/Locale/en-US/prototypes/catalog/fills/crates/vending-crates.ftl b/Resources/Locale/en-US/prototypes/catalog/fills/crates/vending-crates.ftl new file mode 100644 index 0000000000..4b8451d19e --- /dev/null +++ b/Resources/Locale/en-US/prototypes/catalog/fills/crates/vending-crates.ftl @@ -0,0 +1,47 @@ +ent-CrateVendingMachineRestockBoozeFilled = Booze-O-Mat restock crate + .desc = Contains a restock box for the Booze-O-Mat. + +ent-CrateVendingMachineRestockClothesFilled = Clothing restock crate + .desc = Contains a pair of restock boxes, one for the ClothesMate and one for the AutoDrobe. + +ent-CrateVendingMachineRestockDinnerwareFilled = Plasteel Chef restock crate + .desc = Contains a restock box for the Plasteel Chef vending machine. + +ent-CrateVendingMachineRestockEngineeringFilled = EngiVend restock crate + .desc = Contains a restock box for the EngiVend. Also supports the YouTool. + +ent-CrateVendingMachineRestockGamesFilled = Good Clean Fun restock crate + .desc = Contains a restock box for the Good Clean Fun vending machine. + +ent-CrateVendingMachineRestockHotDrinksFilled = Solar's Best restock crate + .desc = Contains two restock boxes for Solar's Best Hot Drinks vending machine. + +ent-CrateVendingMachineRestockMedicalFilled = NanoMed restock crate + .desc = Contains a restock box, compatible with the NanoMed and NanoMedPlus. + +ent-CrateVendingMachineRestockNutriMaxFilled = NutriMax restock crate + .desc = Contains a restock box for the NutriMax vending machine. + +ent-CrateVendingMachineRestockPTechFilled = PTech restock crate + .desc = Contains a restock box for the PTech bureaucracy dispenser. + +ent-CrateVendingMachineRestockRobustSoftdrinksFilled = Robust Softdrinks restock crate + .desc = Contains two restock boxes for the Robust Softdrinks LLC vending machine. + +ent-CrateVendingMachineRestockSalvageEquipmentFilled = Salvage restock crate + .desc = Contains a restock box for the salvage vendor. + +ent-CrateVendingMachineRestockSecTechFilled = SecTech restock crate + .desc = Contains a restock box for the SecTech vending machine. + +ent-CrateVendingMachineRestockSeedsFilled = MegaSeed restock crate + .desc = Contains a restock box for the MegaSeed vending machine. + +ent-CrateVendingMachineRestockSmokesFilled = ShadyCigs restock crate + .desc = Contains two restock boxes for the ShadyCigs vending machine. + +ent-CrateVendingMachineRestockSnacksFilled = Snack restock crate + .desc = Contains four restock boxes, each covering a different snack vendor. Mr. Chang's, Discount Dans, Robust Donuts, and Getmore Chocolate are featured on the advertisement. + +ent-CrateVendingMachineRestockTankDispenserFilled = Tank dispenser restock crate + .desc = Contains a restock box for an Engineering or Atmospherics tank dispenser. diff --git a/Resources/Locale/en-US/vending-machines/vending-machine-restock-component.ftl b/Resources/Locale/en-US/vending-machines/vending-machine-restock-component.ftl new file mode 100644 index 0000000000..3d1968604a --- /dev/null +++ b/Resources/Locale/en-US/vending-machines/vending-machine-restock-component.ftl @@ -0,0 +1,4 @@ +vending-machine-restock-invalid-inventory = { CAPITALIZE(THE($this)) } isn't the right package to restock { THE($target) }. +vending-machine-restock-needs-panel-open = { CAPITALIZE($target) } needs { POSS-ADJ($target) } maintenance panel opened first. +vending-machine-restock-start = { $user } starts restocking { $target }. +vending-machine-restock-done = { $user } finishes restocking { $target }. diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml new file mode 100644 index 0000000000..17ff47f872 --- /dev/null +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -0,0 +1,167 @@ +# If you've arrived here after a failed NoCargoOrderArbitrage test, it's likely +# because the product in question contains a restock box which links to a +# vending machine inventory that has had items added to it recently and caused +# its calculated price to exceed the cost below. +# +# The costs will need to be kept in line with the inventory of the respective +# vending machines. An extra hundred or two profit margin should be fine. + +- type: cargoProduct + id: CrateVendingMachineRestockBooze + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockBoozeFilled + cost: 3200 + category: Service + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockClothes + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockClothesFilled + cost: 4000 + category: Service + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockDinnerware + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockDinnerwareFilled + cost: 2000 + category: Service + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockEngineering + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockEngineeringFilled + cost: 3000 + category: Engineering + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockGames + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockGamesFilled + cost: 650 + category: Service + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockHotDrinks + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockHotDrinksFilled + cost: 1200 + category: Service + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockMedical + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockMedicalFilled + cost: 1500 + category: Medical + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockNutriMax + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockNutriMaxFilled + cost: 2400 + category: Hydroponics + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockPTech + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockPTechFilled + cost: 800 + category: Service + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockRobustSoftdrinks + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockRobustSoftdrinksFilled + cost: 1200 + category: Service + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockSalvageEquipment + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockSalvageEquipmentFilled + cost: 1000 + category: Engineering + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockSecTech + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockSecTechFilled + cost: 2200 + category: Security + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockSeeds + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockSeedsFilled + cost: 2000 + category: Hydroponics + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockSmokes + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockSmokesFilled + cost: 1200 + category: Service + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockSnacks + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockSnacksFilled + cost: 3000 + category: Service + group: market + +- type: cargoProduct + id: CrateVendingMachineRestockTankDispenser + icon: + sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + product: CrateVendingMachineRestockTankDispenserFilled + cost: 1000 + category: Atmospherics + group: market diff --git a/Resources/Prototypes/Catalog/Fills/Crates/vending.yml b/Resources/Prototypes/Catalog/Fills/Crates/vending.yml new file mode 100644 index 0000000000..ed0a7519b0 --- /dev/null +++ b/Resources/Prototypes/Catalog/Fills/Crates/vending.yml @@ -0,0 +1,134 @@ +- type: entity + id: CrateVendingMachineRestockBoozeFilled + parent: CratePlastic + components: + - type: StorageFill + contents: + - id: VendingMachineRestockBooze + +- type: entity + id: CrateVendingMachineRestockClothesFilled + parent: CratePlastic + components: + - type: StorageFill + contents: + - id: VendingMachineRestockClothes + - id: VendingMachineRestockCostumes + +- type: entity + id: CrateVendingMachineRestockDinnerwareFilled + parent: CratePlastic + components: + - type: StorageFill + contents: + - id: VendingMachineRestockDinnerware + +- type: entity + id: CrateVendingMachineRestockEngineeringFilled + parent: CrateEngineeringSecure + components: + - type: StorageFill + contents: + - id: VendingMachineRestockEngineering + +- type: entity + id: CrateVendingMachineRestockGamesFilled + parent: CratePlastic + components: + - type: StorageFill + contents: + - id: VendingMachineRestockGames + +- type: entity + id: CrateVendingMachineRestockHotDrinksFilled + parent: CratePlastic + components: + - type: StorageFill + contents: + - id: VendingMachineRestockHotDrinks + amount: 2 + +- type: entity + id: CrateVendingMachineRestockMedicalFilled + parent: CrateMedicalSecure + components: + - type: StorageFill + contents: + - id: VendingMachineRestockMedical + +- type: entity + id: CrateVendingMachineRestockNutriMaxFilled + parent: CrateHydroSecure + components: + - type: StorageFill + contents: + - id: VendingMachineRestockNutriMax + +- type: entity + id: CrateVendingMachineRestockPTechFilled + parent: CratePlastic + components: + - type: StorageFill + contents: + - id: VendingMachineRestockPTech + +- type: entity + id: CrateVendingMachineRestockRobustSoftdrinksFilled + parent: CratePlastic + components: + - type: StorageFill + contents: + - id: VendingMachineRestockRobustSoftdrinks + amount: 2 + +- type: entity + id: CrateVendingMachineRestockSalvageEquipmentFilled + parent: CrateGenericSteel + components: + - type: StorageFill + contents: + - id: VendingMachineRestockSalvageEquipment + +- type: entity + id: CrateVendingMachineRestockSecTechFilled + parent: CrateSecgear + components: + - type: StorageFill + contents: + - id: VendingMachineRestockSecTech + +- type: entity + id: CrateVendingMachineRestockSeedsFilled + parent: CrateHydroSecure + components: + - type: StorageFill + contents: + - id: VendingMachineRestockSeeds + +- type: entity + id: CrateVendingMachineRestockSmokesFilled + parent: CratePlastic + components: + - type: StorageFill + contents: + - id: VendingMachineRestockSmokes + amount: 2 + +- type: entity + id: CrateVendingMachineRestockSnacksFilled + parent: CratePlastic + components: + - type: StorageFill + contents: + - id: VendingMachineRestockChang + - id: VendingMachineRestockDiscountDans + - id: VendingMachineRestockDonut + - id: VendingMachineRestockGetmoreChocolateCorp + +- type: entity + id: CrateVendingMachineRestockTankDispenserFilled + parent: CratePlastic + components: + - type: StorageFill + contents: + - id: VendingMachineRestockTankDispenser diff --git a/Resources/Prototypes/Entities/Markers/Spawners/vending_machine_restock.yml b/Resources/Prototypes/Entities/Markers/Spawners/vending_machine_restock.yml new file mode 100644 index 0000000000..f323d2268d --- /dev/null +++ b/Resources/Prototypes/Entities/Markers/Spawners/vending_machine_restock.yml @@ -0,0 +1,59 @@ +- type: entity + id: SpawnVendingMachineRestockFoodDrink + name: Vending Machine Restock + suffix: "food or drink" + parent: MarkerBase + components: + - type: Sprite + layers: + - state: green + - sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + - sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: refill_discount + - type: ConditionalSpawner + prototypes: + - VendingMachineRestockDiscountDans + - VendingMachineRestockChang + - VendingMachineRestockDonut + - VendingMachineRestockGetmoreChocolateCorp + - VendingMachineRestockRobustSoftdrinks + - VendingMachineRestockHotDrinks + +- type: entity + id: SpawnVendingMachineRestockFood + name: Vending Machine Restock + suffix: "food" + parent: MarkerBase + components: + - type: Sprite + layers: + - state: green + - sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + - sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: refill_donuts + - type: ConditionalSpawner + prototypes: + - VendingMachineRestockDiscountDans + - VendingMachineRestockChang + - VendingMachineRestockDonut + - VendingMachineRestockGetmoreChocolateCorp + +- type: entity + id: SpawnVendingMachineRestockDrink + name: Vending Machine Restock + suffix: "drink" + parent: MarkerBase + components: + - type: Sprite + layers: + - state: green + - sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: base + - sprite: Objects/Specific/Service/vending_machine_restock.rsi + state: refill_cola + - type: ConditionalSpawner + prototypes: + - VendingMachineRestockRobustSoftdrinks + - VendingMachineRestockHotDrinks diff --git a/Resources/Prototypes/Entities/Objects/Specific/Service/vending_machine_restock.yml b/Resources/Prototypes/Entities/Objects/Specific/Service/vending_machine_restock.yml new file mode 100644 index 0000000000..4e7a59e2ec --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Specific/Service/vending_machine_restock.yml @@ -0,0 +1,365 @@ +- type: entity + parent: BaseItem + id: BaseVendingMachineRestock + abstract: true + name: vending machine restock box + description: A box for restocking vending machines with corporate goodies. + components: + - type: VendingMachineRestock + - type: Sprite + netsync: false + sprite: Objects/Specific/Service/vending_machine_restock.rsi + layers: + - state: base + - state: green_bit + shader: unshaded + - type: ItemCooldown + - type: MeleeWeapon + damage: + types: + Blunt: 5 + soundHit: + path: /Audio/Weapons/genhit2.ogg + soundSwing: + path: /Audio/Weapons/punchmiss.ogg + - type: Item + size: 50 + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 20 + behaviors: + - !type:PlaySoundBehavior + sound: + path: /Audio/Effects/metalbreak.ogg + - !type:DumpRestockInventory + - !type:DoActsBehavior + acts: [ "Destruction" ] + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockBooze + name: Booze-O-Mat restock box + description: Slot into your Booze-O-Mat to start the party! Not for sale to passengers below the legal age. + components: + - type: VendingMachineRestock + canRestock: + - BoozeOMatInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_booze + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockChang + name: Mr. Chang's restock box + description: A box covered in white labels with bold red Chinese characters, ready to be loaded into the nearest Mr. Chang's vending machine. + components: + - type: VendingMachineRestock + canRestock: + - ChangInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_chinese + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockClothes + name: ClothesMate restock box + description: It's time to step up your fashion! Place inside the ClothesMate restock slot to begin. + components: + - type: VendingMachineRestock + canRestock: + - ClothesMateInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_clothes + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockCostumes + name: AutoDrobe restock box + description: A panoply of NanoTrasen employees are prancing about a colorful theater in a tragicomedy. You can join them too! Load this into your nearest AutoDrobe vending machine. + components: + - type: VendingMachineRestock + canRestock: + - AutoDrobeInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_costume + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockDinnerware + name: Plasteel Chef's restock box + description: It's never raw in this kitchen! Drop into the restock slot on the Plasteel Chef to begin. + components: + - type: VendingMachineRestock + canRestock: + - DinnerwareInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_dinner + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockDiscountDans + name: Discount Dan's restock box + description: A box full of salt and starch. Why suffer Quality when you can have Quantity? Discount Dan's! + components: + - type: VendingMachineRestock + canRestock: + - DiscountDansInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_discount + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockDonut + name: Robust Donuts box + description: A box full of toroidal bundles of fried dough for restocking a vending machine. Use only as directed by Robust Industries, LLC. + components: + - type: VendingMachineRestock + canRestock: + - DonutInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_donuts + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockEngineering + name: EngiVend resupply box + description: Only to be used by certified professionals. + components: + - type: VendingMachineRestock + canRestock: + - EngiVendInventory + - YouToolInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_engi + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockGames + name: Good Clean Fun restock box + description: It's time to roll for initiative, dice dragons! Load up at the Good Clean Fun vending machine! + components: + - type: VendingMachineRestock + canRestock: + - GoodCleanFunInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_games + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockGetmoreChocolateCorp + name: GetMore Chocolate restock box + description: A box loaded with the finest ersatz cacao. Only to be used in official Getmore Chocolate vending machines. + components: + - type: VendingMachineRestock + canRestock: + - GetmoreChocolateCorpInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_snack + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockHotDrinks + name: Solar's Best restock box + description: Toasty! For use in Solar's Best Hot Drinks or other affiliate vending machines. + components: + - type: VendingMachineRestock + canRestock: + - HotDrinksMachineInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_joe + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockMedical + name: NanoMed resupply box + description: Slot into your department's NanoMed or NanoMedPlus to dispense. Handle with care. + components: + - type: VendingMachineRestock + canRestock: + - NanoMedInventory + - NanoMedPlusInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_medical + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockNutriMax + name: NutriMax restock box + description: We'll make your thumbs green with our tools. Let's get to harvesting! Load into a NutriMax vending machine. + components: + - type: VendingMachineRestock + canRestock: + - NutriMaxInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_plant + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockPTech + name: PTech resupply box + description: All the bureaucracy you can handle, and more! Load into the PTech vending machine to get started. + components: + - type: VendingMachineRestock + canRestock: + - PTechInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_ptech + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockRobustSoftdrinks + name: Robust Softdrinks box + description: A cold, clunky container of colliding chilly cylinders. Use only as directed by Robust Industries, LLC. + components: + - type: VendingMachineRestock + canRestock: + - RobustSoftdrinksInventory + - BodaInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_cola + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockSecTech + name: SecTech resupply box + description: "Communists beware: the reinforcements have arrived! A label reads SECURITY PERSONNEL ONLY." + components: + - type: VendingMachineRestock + canRestock: + - SecTechInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_sec + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockSalvageEquipment + name: salvage resupply box + description: Strike the earth ere the space carp nip your behind! Slam into a salvage vendor to begin. + components: + - type: VendingMachineRestock + canRestock: + - SalvageEquipmentInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_salvage + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockSeeds + name: MegaSeed restock box + description: A label says they're heirloom seeds, passed down from our ancestors. Pack it into the MegaSeed Servitor! + components: + - type: VendingMachineRestock + canRestock: + - MegaSeedServitorInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_plant + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockSmokes + name: ShadyCigs restock box + description: It's hard to see anything under all the Surgeon General warnings, but it mentions loading it into a vending machine. + components: + - type: VendingMachineRestock + canRestock: + - CigaretteMachineInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_smoke + +- type: entity + parent: BaseVendingMachineRestock + id: VendingMachineRestockTankDispenser + name: tank dispenser resupply box + description: Capable of replacing tanks in a gas tank dispenser. Handle with care. + components: + - type: VendingMachineRestock + canRestock: + - TankDispenserEVAInventory + - TankDispenserEngineeringInventory + - type: Sprite + layers: + - state: base + - state: green_bit + shader: unshaded + - state: refill_tanks diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/base.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/base.png new file mode 100644 index 0000000000000000000000000000000000000000..01a8c4ed215cd3473a68bc2ec243281307e9007f GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G|&0G|+7 zAg$-6XJ&2Z>gDI@AM70%>K7Ur7Mm24oSBkSRNc}wZSJCl(b`Nvb&MrJe!&b5&u*jv zIoX~rjv*T7lM^Id8urRCaV0Qa-QBpr#KeSS8N-qLa$N!|=5Vq+eY$kv!4piz>3;3p z5%2HuUStv8(6l0=N8kkmvksG^2!}(>CW|W^S_`JKF(q|3izYDXC2Wvb*5D}oXv0YZ hRvxbag9(954EOhV{`}>#VlmKK22WQ%mvv4FO#tw0O9=n~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/green_bit.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/green_bit.png new file mode 100644 index 0000000000000000000000000000000000000000..e362ff17152e40bd6447a9263d5ba02dccb23bb0 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;*0X`wF zg=Hc~j~+EJ(w#nidPqpfA_j&A1_logkCc=Y2IH9w3~7#zj!>FVdQ&MBb@0Ew$F`Tzg` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/inhand-left.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..0c543aa0751c12cf5969a8a87bb29d3128b02e16 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSEa{HEjtmSN`?>!lvI6;>0X`wF zK-$dOE+#p%Bi7au$YCrA@(X5gcy=QV$Z_y=aSX9Iotz-Sx`naN;mnIBl?j|e5l)jF zG&~eiOmy1iI2^=hICwO0Djj(7f!lvI6;>0X`wF zK-$dOE+#p%Bi7au$YCrA@(X5gcy=QV$Z_;^aSX9Iotz-SdWF45hhv*|L;|Oi!eoy| zffk1s858(i4|M4rXbWz*c#%=*0)ub_t6)N@gRp~&5l>?P`>tw121O2zD}D7H_ko5n Nc)I$ztaD0e0sv9>EsOvF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/meta.json b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/meta.json new file mode 100644 index 0000000000..e218106d63 --- /dev/null +++ b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/meta.json @@ -0,0 +1,91 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Original source: https://github.com/tgstation/tgstation/blob/master/icons/obj/vending_restock.dmi @ commit 014c44ef6279beb02a5f3e76824439fa57181c22 - Additions and cleanup by @Vordenburg", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "green_bit" + }, + { + "name": "refill_booze" + }, + { + "name": "refill_chinese" + }, + { + "name": "refill_clothes" + }, + { + "name": "refill_cola" + }, + { + "name": "refill_costume" + }, + { + "name": "refill_custom" + }, + { + "name": "refill_dinner" + }, + { + "name": "refill_discount" + }, + { + "name": "refill_donksoft" + }, + { + "name": "refill_donuts" + }, + { + "name": "refill_engi" + }, + { + "name": "refill_games" + }, + { + "name": "refill_joe" + }, + { + "name": "refill_medical" + }, + { + "name": "refill_parts" + }, + { + "name": "refill_plant" + }, + { + "name": "refill_ptech" + }, + { + "name": "refill_salvage" + }, + { + "name": "refill_sec" + }, + { + "name": "refill_smoke" + }, + { + "name": "refill_snack" + }, + { + "name": "refill_tanks" + } + ] +} diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_booze.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_booze.png new file mode 100644 index 0000000000000000000000000000000000000000..f94fc84281769342b442c258289292a94ba5c3d5 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}50G|-o z3(wS!9zAMcq&t23^pKE{*>VgM3>eO&F{GrV{QdXa(b2KCwl+FCT2YwugU*MuKwXR_ zL4Lsu4$p3+0Xg2DE{-7@=aUm8zBHJcTw!ok*t^Gu!T01B78BozFPK)cWiY+;Nc#}S zAao*a1M7mB6C=CQ*diEi@@!z(B>8e_Mp^@}uk-h~Lksw77NS%G}f0G|+7 zAnoDdQIlf7M9p^Fwrvj>H2(kpZ*zC^1E2(BNswPKgTu2MX+Tb`r;B5V#`)v~373YO zjJ^j<89g?vSfSzYQzug)=;TRH2CW3HpoFA1PdF}TvMB`xJG&%A9S~ZX+3Dqxw!E=q zCx-${kRwx!lvI6B?B-tK0XB>4b@ki@UkGO`0^x$H&LOz(D2q{(C?x7)yfuf*Bm1 z-ADs+$~;{hLnI{M9`xpGHsE1BuzkZ?HpN#zG;6fp)t}SKxtn%ymZZ%)VN>IS@r%-y zbqNNG@~jl$@tkQ8vP|-3cBOvbX_Igj$M`vodFxm^C;M6Lijop4x4L_A>NX{AE9U9j w@;tsZ%gb5sDs>jKd7QG~_6P5hiaVcKSLm|li7{xU16{!2>FVdQ&MBb@05;cY761SM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_cola.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_cola.png new file mode 100644 index 0000000000000000000000000000000000000000..847a7994cd6948cd6668f2c31649cd36eb32c466 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}r0G|+7 z{gAMuM~@m9=}w!lvI6<`0X`wF zK>Fy>qah(7)2C0r*v;^I2gCmp3@Iroj*gBV9v%!yM`~+p8PfhoM@KVwPX7P@|A7Ms z42*QQU7IoWaJE~9F0-@SM4%CjB|(0{3=Yq3qyaezo-U3d5|VEZI&vLR;BmOfpUkA0 z)Kv9o0j&UNS%G}f0G|+7 zhD3&=M~{YtgiN149Vj+;!URW0$NQheIe{F;k|4ie28U-i(tsQTPZ!4!jq}L~5?>lr zRa6;W4_rNal`)i4co&1S2h*$u>0Mn@7)%&%&1ifl&EBTS%8>tvLr)+qRtKn;!PC{x JWt~$(69B9FE}Q@W literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_dinner.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_dinner.png new file mode 100644 index 0000000000000000000000000000000000000000..b44af8677f344f1b767b552acea587e11a44dc28 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}r0G|+7 zAieJC6MYQ{S5IFz6Cn=|k7N(!;;sP0;0F&61UMFltEjU}RAKAt~PI$)pN2 On8DN4&t;ucLK6Tp+DtqE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_discount.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_discount.png new file mode 100644 index 0000000000000000000000000000000000000000..710ff5b29d320d16b50adf9967b7aaa24c90ba8b GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}f0G|+7 zAgx`0&(+Is;s5skX~zH082|tOf5uClZ9oaek|4ie28U-i(tw;`PZ!4!jq}L~5?>k& z1AQ1=9efM|8GU;Lm}WI>Vw~k*w2Ldb#CXyJt%yT+f}A8IL>^w-)Usp;BdfqQr%(=7 t1(r*f8kn*?nDP{K^Iq&LOppM&aqSGA8H(?$p8}0%@O1TaS?83{1OOMjK&t=% literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_donksoft.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_donksoft.png new file mode 100644 index 0000000000000000000000000000000000000000..0332b22a9355ed2377758cda5fc0b1f7372198cc GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;L0X`wF z3<(NHj~)#P37I~9dfFM||3GmdFgBhEBpCkxpJ|+yW}K3e;^^qe@ZY$$wl+FC`u~69 z4~misKxK?2L4Lsu4$p3+0XeCjE{-7*l5Y<>@-;b#upaFD_?;uo=iXm^ZI3%Vrw;8{ z(slX$y426d!mX~>c_Jsp@Z>z{u%chv)eY9M_yv61?gzAx!PC{xWt~$(697~ITZaGu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_donuts.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_donuts.png new file mode 100644 index 0000000000000000000000000000000000000000..95fa792ea38a7eb7a763d256f5421fb01bfd4b6e GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;*0X`wF zK$_ckCSS~Qe)nqOz;?;pjp`jo3}&3Pmtyen@Q6@ljofmt%!Ir8?CWXnOw*@N-_!@pQ|amA7$PD0_MjtEvw{HgfsULMRiYpkz$vin2E^v7;Jg~vSO47=W>)mXMNPG7LC(8=9$UDC1; zsa!UN^*f@rpAqozX80qpE-bH7G1rTM&ysEF#T=uBlasfs5}hn$b$soWhwta||GvS( VHh;yO^*~23c)I$ztaD0e0su?JW-0&x literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_engi.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_engi.png new file mode 100644 index 0000000000000000000000000000000000000000..7b023bb67d3d662bb3c27160b4e8d35b33602327 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;L0X`wF zjP(phj~+EJ(w#nidPqpfA_j&A1_logkCc=Y2IH9w3~7#zjaa>Ex24?w3y7% iC~+=YKP)Kcs(u^7Qoo|Nq##yJJU3Wk^V|iHV(% zkg>YD&z_!KRaJ6EM*s8krJ$gup`rEVgtzdWN}4B$-KPFva*+4TwY2_ zFfuJnOiWTmMS(#D+e0^XRu*6fsY@`V8iMLAz=|wm9BB>4l8|MXp TSXa?k00000NkvXXu0mjfehZX? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_joe.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_joe.png new file mode 100644 index 0000000000000000000000000000000000000000..beade28ef2ee27726f0ea49470a4bc49454eb7fd GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;*0X`wF z3=a+*J$lr@NO$`5=^-H@@rukj>Z~3f9yMM@C2j^ODJhPQj&2B}MB<@?uL*ncY5t50CM{7`5g$R7-zu6{1-oD!M<|G!sE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_medical.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_medical.png new file mode 100644 index 0000000000000000000000000000000000000000..07c186166d399d27a372b91e310aa0eb457778e1 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;*0X`wF z3;_&Bj~)#P37I~9`jM##o4SME#991L`=64M;^^pjc>ns^+S+Z`W<*Cv$IjemV5GZu z@7^9_ z7|RqHB9(8SI pbA&11s?vW)ob4U&+kg6ghh+oP(k+b7w*xI<@O1TaS?83{1OT}dU1tCQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_parts.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_parts.png new file mode 100644 index 0000000000000000000000000000000000000000..7abff08bfd358d21c830c44b7634677233bd6c51 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6Fy>qXtI0)2B}l2?<%mz|g?J;Njtsl9Iw;Jd=ST&C$`Zwzf7pI=Z2u;s5{t$vr;a zD_?v9YGW)3@(X5gcy=QV$cgrJaSX9I{dUquE(S#&=hg*_oG<9e=o z<#~0VKC@t8_)(dA_uY!MhogVZkdwHqeac5v<>b;63_+KaiX4=lGG;Pwt! h|B36q^*iK$R?DpwXP!`_dNS%G}r0G|-o zG_|m!M~@m9=}w8gfOk)oZkCc=YhBL;Fj*hjpwb9YhXZ|y!85^@5EEWT5 zWGo5t3ubV5b|VeQaq@I=4AD5BoFMU~;pUAS46X_$CTkc%In#GB&RTYf#e}g$m*>Zp zGb~IZx&n+Uy2knE=5{W6Dl3q%nf0zYD~~hK$?rKtR{V>c6b3Yn!PC{xWt~$(69AJO BKOq1B literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_ptech.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_ptech.png new file mode 100644 index 0000000000000000000000000000000000000000..d33e43c66e32556389b09a4bdafc8d3490cd076f GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}T0G|+7 zAPoejrfMD@9$9r^)m71T)6!dJ=ggc@x>8wr)vj5gt2kYNDi}+G{DK)Ap4~_Taw0ul z978nDCnrdJX$ah0%h=Tr;69UamC&>lRukVa&I~56j3@~)^8+)P5-u?|QA3>K^T|B>x&H>pQJ$`T JF6*2Ung9d%LTms4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_salvage.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_salvage.png new file mode 100644 index 0000000000000000000000000000000000000000..0c428413a974c8e1b419d33ef4694be3cb2f93ba GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}50G|+7 zAkDzA3J4iit@7~j2n`KwXkch)XaEYW3I*a-t5>i7|3CEq|No6Gc^N>pj3q&S!3+-1 zZlnP@QJyZ2AsXkC6C}PgTr7FXD#G}5g#>$us!cfGg3O}14Qd4tDSI5lu^4rI#GN$l#fvKjDJYr9*qASGcg8bSo=UczD2I2?N9Bmx3}< S$9k!lvI6;*0X`wF zp$rU1j~)#P37I~9x`QF3mnEZzhsXb!3`T~!8R2q?L9!_+DUObgwY9Y=@$u2o(G33? z&KNTo|7UnAX0RD(2xCc*UoeBivm0qZPLQXIV~B+0+k=LD4F)_c2X)W&^{nIg^M9jA zW;3_TNuK@RMOG@xU7cvE_2P(yi?&v#rmMDgMy8)x%`8=|n>%vEmfqNKc9Lk$jkJp* fYc;AKecvj*PnYp%S8VJPpy>>ru6{1-oD!MNS%G}r0G|-o z|8ikRj~+EJ(w#nidPqpf=g*&)MMhq_a3Lin<@)vOj*gBV9v-!|wb9Yh#|jJcw#C!} zH8Pe2`2{mLJiCzw}>Xnh_{$aekipZ{&t;uc GLK6TDn@Pj~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_snack.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_snack.png new file mode 100644 index 0000000000000000000000000000000000000000..088c3cec608294aaa2017c6f170a3e438e2784cc GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}%0G|-o zFb0OBM~@m9=}w_!dGl>8I literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_tanks.png b/Resources/Textures/Objects/Specific/Service/vending_machine_restock.rsi/refill_tanks.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce2aedaf8374a1f14a3c852ffa103944ea230a3 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}r0G|+7 zAgwm#nx2}n!LykbnTu`BOzdo3UA$8~JUo28ywa1C^5$LabaL(A|M^UiXV6^{4xk3c zk|4ie28U-i(tw;uPZ!4!jq}L~5?>lz0|FRa6Rxfb<<0O?kz0`Y%Bn%_1D7xNVa^oi z