Remove drones, fix InnateToolSystem (#25372)

* Fix drones

* They dont need a full bloodstream

* Incorrect indentation

* Nuke drones

* Fix ClothingHeadHatCatEars

* Remove last mention of drones

* Implement requested changes
This commit is contained in:
Debug
2024-02-21 07:23:04 +01:00
committed by GitHub
parent 37a4f2db3a
commit 8c6a8c3c5c
57 changed files with 123 additions and 730 deletions

View File

@@ -1,90 +1,99 @@
using System.Linq;
using Content.Shared.Body.Part;
using Content.Shared.Destructible;
using Content.Shared.Hands;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Interaction.Components;
using Content.Shared.Storage;
using Content.Shared.Tag;
using Robust.Shared.Network;
using Robust.Shared.Random;
namespace Content.Server.Tools.Innate
namespace Content.Server.Tools.Innate;
/// <summary>
/// Spawns a list unremovable tools in hands if possible. Used for drones,
/// borgs, or maybe even stuff like changeling armblades!
/// </summary>
public sealed class InnateToolSystem : EntitySystem
{
/// <summary>
/// Spawns a list unremovable tools in hands if possible. Used for drones,
/// borgs, or maybe even stuff like changeling armblades!
/// </summary>
public sealed class InnateToolSystem : EntitySystem
[Dependency] private readonly IRobustRandom _robustRandom = default!;
[Dependency] private readonly SharedHandsSystem _sharedHandsSystem = default!;
[Dependency] private readonly TagSystem _tagSystem = default!;
public override void Initialize()
{
[Dependency] private readonly IRobustRandom _robustRandom = default!;
[Dependency] private readonly SharedHandsSystem _sharedHandsSystem = default!;
[Dependency] private readonly TagSystem _tagSystem = default!;
public override void Initialize()
base.Initialize();
SubscribeLocalEvent<InnateToolComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<InnateToolComponent, HandCountChangedEvent>(OnHandCountChanged);
SubscribeLocalEvent<InnateToolComponent, ComponentShutdown>(OnShutdown);
SubscribeLocalEvent<InnateToolComponent, DestructionEventArgs>(OnDestroyed);
}
private void OnMapInit(EntityUid uid, InnateToolComponent component, MapInitEvent args)
{
if (component.Tools.Count == 0)
return;
component.ToSpawn = EntitySpawnCollection.GetSpawns(component.Tools, _robustRandom);
}
private void OnHandCountChanged(EntityUid uid, InnateToolComponent component, HandCountChangedEvent args)
{
if (component.ToSpawn.Count == 0)
return;
var spawnCoord = Transform(uid).Coordinates;
var toSpawn = component.ToSpawn.First();
var item = Spawn(toSpawn, spawnCoord);
AddComp<UnremoveableComponent>(item);
if (!_sharedHandsSystem.TryPickupAnyHand(uid, item, checkActionBlocker: false))
{
base.Initialize();
SubscribeLocalEvent<InnateToolComponent, ComponentStartup>(OnStartup);
SubscribeLocalEvent<InnateToolComponent, ComponentShutdown>(OnShutdown);
SubscribeLocalEvent<InnateToolComponent, DestructionEventArgs>(OnDestroyed);
QueueDel(item);
component.ToSpawn.Clear();
}
component.ToSpawn.Remove(toSpawn);
component.ToolUids.Add(item);
}
private void OnStartup(EntityUid uid, InnateToolComponent component, ComponentStartup args)
private void OnShutdown(EntityUid uid, InnateToolComponent component, ComponentShutdown args)
{
foreach (var tool in component.ToolUids)
{
if (component.Tools.Count == 0)
return;
var spawnCoord = Transform(uid).Coordinates;
if (TryComp<HandsComponent>(uid, out var hands) && hands.Count >= component.Tools.Count)
{
var items = EntitySpawnCollection.GetSpawns(component.Tools, _robustRandom);
foreach (var entry in items)
{
var item = Spawn(entry, spawnCoord);
AddComp<UnremoveableComponent>(item);
if (!_sharedHandsSystem.TryPickupAnyHand(uid, item, checkActionBlocker: false))
{
QueueDel(item);
continue;
}
component.ToolUids.Add(item);
}
}
RemComp<UnremoveableComponent>(tool);
}
}
private void OnShutdown(EntityUid uid, InnateToolComponent component, ComponentShutdown args)
private void OnDestroyed(EntityUid uid, InnateToolComponent component, DestructionEventArgs args)
{
Cleanup(uid, component);
}
public void Cleanup(EntityUid uid, InnateToolComponent component)
{
foreach (var tool in component.ToolUids)
{
foreach (var tool in component.ToolUids)
if (_tagSystem.HasTag(tool, "InnateDontDelete"))
{
RemComp<UnremoveableComponent>(tool);
}
}
private void OnDestroyed(EntityUid uid, InnateToolComponent component, DestructionEventArgs args)
{
Cleanup(uid, component);
}
public void Cleanup(EntityUid uid, InnateToolComponent component)
{
foreach (var tool in component.ToolUids)
else
{
if (_tagSystem.HasTag(tool, "InnateDontDelete"))
{
RemComp<UnremoveableComponent>(tool);
}
else
{
Del(tool);
}
if (TryComp<HandsComponent>(uid, out var hands))
{
foreach (var hand in hands.Hands)
{
_sharedHandsSystem.TryDrop(uid, hand.Value, checkActionBlocker: false, handsComp: hands);
}
}
Del(tool);
}
component.ToolUids.Clear();
if (TryComp<HandsComponent>(uid, out var hands))
{
foreach (var hand in hands.Hands)
{
_sharedHandsSystem.TryDrop(uid, hand.Value, checkActionBlocker: false, handsComp: hands);
}
}
}
component.ToolUids.Clear();
}
}