diff --git a/Content.Client/Damage/DestructibleSystem.cs b/Content.Client/Damage/DestructibleSystem.cs new file mode 100644 index 0000000000..4a79bbfb55 --- /dev/null +++ b/Content.Client/Damage/DestructibleSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.Destructible; + +namespace Content.Client.Damage; + +public sealed class DestructibleSystem : SharedDestructibleSystem +{ + +} diff --git a/Content.Server/Gatherable/Components/GatheringToolComponent.cs b/Content.Server/Gatherable/Components/GatheringToolComponent.cs index 560c46eedc..c4e506e538 100644 --- a/Content.Server/Gatherable/Components/GatheringToolComponent.cs +++ b/Content.Server/Gatherable/Components/GatheringToolComponent.cs @@ -17,13 +17,6 @@ namespace Content.Server.Gatherable.Components [DataField("sound")] public SoundSpecifier GatheringSound { get; set; } = new SoundPathSpecifier("/Audio/Items/Mining/pickaxe.ogg"); - /// - /// This directly plugs into the time delay for gathering. - /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("gatheringTime")] - public float GatheringTime { get; set; } = 1f; - /// /// What damage should be given to objects when /// gathered using this tool? (0 for infinite gathering) diff --git a/Content.Server/Gatherable/GatherableSystem.cs b/Content.Server/Gatherable/GatherableSystem.cs index ee518fba46..f574bd5dd9 100644 --- a/Content.Server/Gatherable/GatherableSystem.cs +++ b/Content.Server/Gatherable/GatherableSystem.cs @@ -1,7 +1,9 @@ using System.Threading; +using Content.Server.Destructible; using Content.Server.DoAfter; using Content.Server.Gatherable.Components; using Content.Shared.Damage; +using Content.Shared.Destructible; using Content.Shared.EntityList; using Content.Shared.Interaction; using Content.Shared.Tag; @@ -12,12 +14,13 @@ namespace Content.Server.Gatherable; public sealed class GatherableSystem : EntitySystem { - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; - [Dependency] private readonly DamageableSystem _damageableSystem = default!; - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly DestructibleSystem _destructible = default!; + [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly TagSystem _tagSystem = default!; public override void Initialize() { @@ -39,10 +42,14 @@ public sealed class GatherableSystem : EntitySystem if (tool.MaxGatheringEntities < tool.GatheringEntities.Count + 1) return; + var damageRequired = _destructible.DestroyedAt(uid); + var damageTime = (damageRequired / tool.Damage.Total).Float(); + damageTime = Math.Max(1f, damageTime); + cancelToken = new CancellationTokenSource(); tool.GatheringEntities[uid] = cancelToken; - var doAfter = new DoAfterEventArgs(args.User, tool.GatheringTime, cancelToken.Token, uid) + var doAfter = new DoAfterEventArgs(args.User, damageTime, cancelToken.Token, uid) { BreakOnDamage = true, BreakOnStun = true, @@ -62,7 +69,7 @@ public sealed class GatherableSystem : EntitySystem return; // Complete the gathering process - _damageableSystem.TryChangeDamage(ev.Resource, tool.Damage, origin: ev.Player); + _destructible.DestroyEntity(uid); _audio.PlayPvs(tool.GatheringSound, ev.Resource); tool.GatheringEntities.Remove(ev.Resource); diff --git a/Content.Server/Mining/MiningSystem.cs b/Content.Server/Mining/MiningSystem.cs index 5cc953ee94..edf23a50e8 100644 --- a/Content.Server/Mining/MiningSystem.cs +++ b/Content.Server/Mining/MiningSystem.cs @@ -38,7 +38,7 @@ public sealed class MiningSystem : EntitySystem var toSpawn = _random.Next(proto.MinOreYield, proto.MaxOreYield); for (var i = 0; i < toSpawn; i++) { - Spawn(proto.OreEntity, coords.Offset(_random.NextVector2(0.3f))); + Spawn(proto.OreEntity, coords.Offset(_random.NextVector2(0.2f))); } } diff --git a/Resources/Prototypes/Entities/Objects/Materials/ore.yml b/Resources/Prototypes/Entities/Objects/Materials/ore.yml index fd97dbec80..dc5ecf4cfc 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/ore.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/ore.yml @@ -13,6 +13,16 @@ - type: Tag tags: - Ore + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.2 + density: 20 + mask: + - ItemMask + restitution: 0.3 + friction: 0.2 - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic