| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- using Robust.Shared.Random;
- using Content.Shared.Stacks;
- using Content.Shared.Prototypes;
- using Content.Shared.VendingMachines;
- namespace Content.Server.Destructible.Thresholds.Behaviors
- {
- /// <summary>
- /// Spawns a portion of the total items from one of the canRestock
- /// inventory entries on a VendingMachineRestock component.
- /// </summary>
- [Serializable]
- [DataDefinition]
- public sealed partial class DumpRestockInventory: IThresholdBehavior
- {
- /// <summary>
- /// The percent of each inventory entry that will be salvaged
- /// upon destruction of the package.
- /// </summary>
- [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, EntityUid? cause = null)
- {
- if (!system.EntityManager.TryGetComponent<VendingMachineRestockComponent>(owner, out var packagecomp) ||
- !system.EntityManager.TryGetComponent<TransformComponent>(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<StackComponent>(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<TransformComponent>(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<TransformComponent>(spawned).LocalRotation = system.Random.NextAngle();
- }
- }
- }
- }
- }
- }
|