using Content.Shared.Destructible; using Content.Shared.Mining; using Content.Shared.Mining.Components; using Content.Shared.Random; using Content.Shared.Random.Helpers; using Robust.Shared.Prototypes; using Robust.Shared.Random; namespace Content.Server.Mining; /// /// This handles creating ores when the entity is destroyed. /// public sealed class MiningSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly IRobustRandom _random = default!; /// public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnDestruction); } private void OnDestruction(EntityUid uid, OreVeinComponent component, DestructionEventArgs args) { if (component.CurrentOre == null) return; var proto = _proto.Index(component.CurrentOre); if (proto.OreEntity == null) return; var coords = Transform(uid).Coordinates; var toSpawn = _random.Next(proto.MinOreYield, proto.MaxOreYield+1); for (var i = 0; i < toSpawn; i++) { Spawn(proto.OreEntity, coords.Offset(_random.NextVector2(0.2f))); } } private void OnMapInit(EntityUid uid, OreVeinComponent component, MapInitEvent args) { if (component.CurrentOre != null || component.OreRarityPrototypeId == null || !_random.Prob(component.OreChance)) return; component.CurrentOre = _proto.Index(component.OreRarityPrototypeId).Pick(_random); } }