mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-30 12:07:37 +03:00
## Mirror of PR #25999: [SS14-12462 Nerf food and drink vending machines](https://github.com/space-wizards/space-station-14/pull/25999) from <img src="https://avatars.githubusercontent.com/u/10567778?v=4" alt="space-wizards" width="22"/> [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `41093ab03cc6a643ee7721de3567963b34fe8e54` PR opened by <img src="https://avatars.githubusercontent.com/u/732532?v=4" width="16"/><a href="https://github.com/FairlySadPanda"> FairlySadPanda</a> at 2024-03-11 13:50:33 UTC --- PR changed 3 files with 39 additions and 9 deletions. The PR had the following labels: - Status: Needs Review --- <details open="true"><summary><h1>Original Body</h1></summary> > <!-- Please read these guidelines before opening your PR: https://docs.spacestation14.io/en/getting-started/pr-guideline --> > <!-- The text between the arrows are comments - they will not be visible on your PR. --> > > ## About the PR > Reduces the amount of food in all food and vending machines EXCEPT the Honk meal one by about half. > > ## Why / Balance > Vending machines provide too much food (and drink) at the moment to the crew, robbing the chef/bartender of a reason to exist, and robbing the janitor of a reason to want to refill vending machines early in the round. > > ## Technical details > This PR adds a new "initialStockQuality" field to vending machines and sets it at 0.33 for almost all food and drink vendors. The intent at the moment is to drop food and drink vending machine stocks by somewhere around a half - two thirds of the time, about two-thirds of the stock of a given item will be missing. > > This number can be tuned to discourage people relying on vending machines and make round start a bit more variable when hunting noms. > > ## Media > <!-- > PRs which make ingame changes (adding clothing, items, new features, etc) are required to have media attached that showcase the changes. > Small fixes/refactors are exempt. > Any media may be used in SS14 progress reports, with clear credit given. > > If you're unsure whether your PR will require media, ask a maintainer. > > Check the box below to confirm that you have in fact seen this (put an X in the brackets, like [X]): > --> > > https://github.com/space-wizards/space-station-14/assets/732532/29139d1a-98e4-4b64-9670-cd2ef284d1b1 > > > - [x] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > <!-- > List any breaking changes, including namespace, public class/method/field changes, prototype renames; and provide instructions for fixing them. This will be pasted in #codebase-changes. > --> > > **Changelog** > 🆑 > - tweak: Food and drink stocks in vending machines has been reduced to encourage people to use the kitchen and bar. > </details> Co-authored-by: SimpleStation14 <Unknown>
135 lines
5.2 KiB
C#
135 lines
5.2 KiB
C#
using Content.Shared.Emag.Components;
|
|
using Robust.Shared.Prototypes;
|
|
using System.Linq;
|
|
using Content.Shared.DoAfter;
|
|
using Content.Shared.Interaction;
|
|
using Content.Shared.Popups;
|
|
using Robust.Shared.Audio;
|
|
using Robust.Shared.Audio.Systems;
|
|
using Robust.Shared.Network;
|
|
using Robust.Shared.Random;
|
|
|
|
namespace Content.Shared.VendingMachines;
|
|
|
|
public abstract partial class SharedVendingMachineSystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly INetManager _net = default!;
|
|
[Dependency] protected readonly IPrototypeManager PrototypeManager = default!;
|
|
[Dependency] protected readonly SharedAudioSystem Audio = default!;
|
|
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
|
|
[Dependency] protected readonly SharedPopupSystem Popup = default!;
|
|
[Dependency] protected readonly IRobustRandom Randomizer = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
SubscribeLocalEvent<VendingMachineComponent, ComponentInit>(OnComponentInit);
|
|
SubscribeLocalEvent<VendingMachineRestockComponent, AfterInteractEvent>(OnAfterInteract);
|
|
}
|
|
|
|
protected virtual void OnComponentInit(EntityUid uid, VendingMachineComponent component, ComponentInit args)
|
|
{
|
|
RestockInventoryFromPrototype(uid, component, component.InitialStockQuality);
|
|
}
|
|
|
|
public void RestockInventoryFromPrototype(EntityUid uid,
|
|
VendingMachineComponent? component = null, float restockQuality = 1f)
|
|
{
|
|
if (!Resolve(uid, ref component))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!PrototypeManager.TryIndex(component.PackPrototypeId, out VendingMachineInventoryPrototype? packPrototype))
|
|
return;
|
|
|
|
AddInventoryFromPrototype(uid, packPrototype.StartingInventory, InventoryType.Regular, component, restockQuality);
|
|
AddInventoryFromPrototype(uid, packPrototype.EmaggedInventory, InventoryType.Emagged, component, restockQuality);
|
|
AddInventoryFromPrototype(uid, packPrototype.ContrabandInventory, InventoryType.Contraband, component, restockQuality);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns all of the vending machine's inventory. Only includes emagged and contraband inventories if
|
|
/// <see cref="EmaggedComponent"/> exists and <see cref="VendingMachineComponent.Contraband"/> is true
|
|
/// are <c>true</c> respectively.
|
|
/// </summary>
|
|
/// <param name="uid"></param>
|
|
/// <param name="component"></param>
|
|
/// <returns></returns>
|
|
public List<VendingMachineInventoryEntry> GetAllInventory(EntityUid uid, VendingMachineComponent? component = null)
|
|
{
|
|
if (!Resolve(uid, ref component))
|
|
return new();
|
|
|
|
var inventory = new List<VendingMachineInventoryEntry>(component.Inventory.Values);
|
|
|
|
if (HasComp<EmaggedComponent>(uid))
|
|
inventory.AddRange(component.EmaggedInventory.Values);
|
|
|
|
if (component.Contraband)
|
|
inventory.AddRange(component.ContrabandInventory.Values);
|
|
|
|
return inventory;
|
|
}
|
|
|
|
public List<VendingMachineInventoryEntry> GetAvailableInventory(EntityUid uid, VendingMachineComponent? component = null)
|
|
{
|
|
if (!Resolve(uid, ref component))
|
|
return new();
|
|
|
|
return GetAllInventory(uid, component).Where(_ => _.Amount > 0).ToList();
|
|
}
|
|
|
|
private void AddInventoryFromPrototype(EntityUid uid, Dictionary<string, uint>? entries,
|
|
InventoryType type,
|
|
VendingMachineComponent? component = null, float restockQuality = 1.0f)
|
|
{
|
|
if (!Resolve(uid, ref component) || entries == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Dictionary<string, VendingMachineInventoryEntry> 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<EntityPrototype>(id))
|
|
{
|
|
var restock = amount;
|
|
var chanceOfMissingStock = 1 - restockQuality;
|
|
|
|
var result = Randomizer.NextFloat(0, 1);
|
|
if (result < chanceOfMissingStock)
|
|
{
|
|
restock = (uint) Math.Floor(amount * result / chanceOfMissingStock);
|
|
}
|
|
|
|
if (inventory.TryGetValue(id, out var 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 * restock);
|
|
else
|
|
inventory.Add(id, new VendingMachineInventoryEntry(type, id, restock));
|
|
}
|
|
}
|
|
}
|
|
}
|