Make recyclers great again (#6653)

Co-authored-by: metalgearsloth <metalgearsloth@gmail.com>
This commit is contained in:
metalgearsloth
2022-02-21 14:39:24 +11:00
committed by GitHub
parent 1cacaebf2d
commit f9c853f100
39 changed files with 181 additions and 66 deletions

View File

@@ -3,6 +3,8 @@ using System.Collections.Generic;
using Content.Server.MachineLinking.Events; using Content.Server.MachineLinking.Events;
using Content.Server.MachineLinking.Models; using Content.Server.MachineLinking.Models;
using Content.Server.Power.Components; using Content.Server.Power.Components;
using Content.Server.Recycling;
using Content.Server.Recycling.Components;
using Content.Server.Stunnable; using Content.Server.Stunnable;
using Content.Shared.Conveyor; using Content.Shared.Conveyor;
using Content.Shared.Item; using Content.Shared.Item;
@@ -20,6 +22,7 @@ namespace Content.Server.Conveyor
{ {
public sealed class ConveyorSystem : EntitySystem public sealed class ConveyorSystem : EntitySystem
{ {
[Dependency] private RecyclerSystem _recycler = default!;
[Dependency] private StunSystem _stunSystem = default!; [Dependency] private StunSystem _stunSystem = default!;
public override void Initialize() public override void Initialize()
@@ -87,6 +90,15 @@ namespace Content.Server.Conveyor
TwoWayLeverSignal.Right => ConveyorState.Forward, TwoWayLeverSignal.Right => ConveyorState.Forward,
_ => ConveyorState.Off _ => ConveyorState.Off
}; };
if (TryComp<RecyclerComponent>(component.Owner, out var recycler))
{
if (component.State != ConveyorState.Off)
_recycler.EnableRecycler(recycler);
else
_recycler.DisableRecycler(recycler);
}
UpdateAppearance(component); UpdateAppearance(component);
} }

View File

@@ -1,13 +1,8 @@
using System;
using System.Collections.Generic;
using Content.Server.Conveyor; using Content.Server.Conveyor;
using Content.Shared.Conveyor; using Content.Shared.Conveyor;
using Content.Shared.Movement.Components; using Content.Shared.Movement.Components;
using Robust.Shared.Containers; using Robust.Shared.Containers;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Maths;
using Robust.Shared.Physics; using Robust.Shared.Physics;
using Robust.Shared.Physics.Controllers; using Robust.Shared.Physics.Controllers;

View File

@@ -1,24 +1,20 @@
using System; using Robust.Shared.Prototypes;
using Robust.Shared.GameObjects; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Robust.Shared.IoC;
using Robust.Shared.Serialization.Manager.Attributes;
namespace Content.Server.Recycling.Components namespace Content.Server.Recycling.Components
{ {
[RegisterComponent] [RegisterComponent, Friend(typeof(RecyclerSystem))]
public sealed class RecyclableComponent : Component public sealed class RecyclableComponent : Component
{ {
[Dependency] private readonly IEntityManager _entMan = default!;
/// <summary> /// <summary>
/// The prototype that will be spawned on recycle. /// The prototype that will be spawned on recycle.
/// </summary> /// </summary>
[DataField("prototype")] private string? _prototype; [DataField("prototype", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))] public string? Prototype;
/// <summary> /// <summary>
/// The amount of things that will be spawned on recycle. /// The amount of things that will be spawned on recycle.
/// </summary> /// </summary>
[DataField("amount")] private int _amount = 1; [DataField("amount")] public int Amount = 1;
/// <summary> /// <summary>
/// Whether this is "safe" to recycle or not. /// Whether this is "safe" to recycle or not.
@@ -26,19 +22,5 @@ namespace Content.Server.Recycling.Components
/// </summary> /// </summary>
[DataField("safe")] [DataField("safe")]
public bool Safe { get; set; } = true; public bool Safe { get; set; } = true;
public void Recycle(float efficiency = 1f)
{
if(!string.IsNullOrEmpty(_prototype))
{
for (var i = 0; i < Math.Max(_amount * efficiency, 1); i++)
{
_entMan.SpawnEntity(_prototype, _entMan.GetComponent<TransformComponent>(Owner).Coordinates);
}
}
_entMan.QueueDeleteEntity(Owner);
}
} }
} }

View File

@@ -6,13 +6,8 @@ using Content.Server.Popups;
using Content.Shared.Body.Components; using Content.Shared.Body.Components;
using Content.Shared.Popups; using Content.Shared.Popups;
using Content.Shared.Recycling; using Content.Shared.Recycling;
using Content.Shared.Sound;
using Robust.Server.GameObjects; using Robust.Server.GameObjects;
using Robust.Shared.Analyzers;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Localization;
using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.ViewVariables;
namespace Content.Server.Recycling.Components namespace Content.Server.Recycling.Components
{ {
@@ -23,6 +18,10 @@ namespace Content.Server.Recycling.Components
{ {
[Dependency] private readonly IEntityManager _entMan = default!; [Dependency] private readonly IEntityManager _entMan = default!;
[ViewVariables]
[DataField("enabled")]
public bool Enabled = true;
/// <summary> /// <summary>
/// Whether or not sentient beings will be recycled /// Whether or not sentient beings will be recycled
/// </summary> /// </summary>
@@ -47,13 +46,15 @@ namespace Content.Server.Recycling.Components
SuicideKind ISuicideAct.Suicide(EntityUid victim, IChatManager chat) SuicideKind ISuicideAct.Suicide(EntityUid victim, IChatManager chat)
{ {
if (_entMan.TryGetComponent(victim, out ActorComponent? actor) && actor.PlayerSession.ContentData()?.Mind is {} mind) if (_entMan.TryGetComponent(victim, out ActorComponent? actor) &&
actor.PlayerSession.ContentData()?.Mind is { } mind)
{ {
EntitySystem.Get<GameTicker>().OnGhostAttempt(mind, false); EntitySystem.Get<GameTicker>().OnGhostAttempt(mind, false);
mind.OwnedEntity?.PopupMessage(Loc.GetString("recycler-component-suicide-message")); mind.OwnedEntity?.PopupMessage(Loc.GetString("recycler-component-suicide-message"));
} }
victim.PopupMessageOtherClients(Loc.GetString("recycler-component-suicide-message-others", ("victim",victim))); victim.PopupMessageOtherClients(Loc.GetString("recycler-component-suicide-message-others",
("victim", victim)));
if (_entMan.TryGetComponent<SharedBodyComponent?>(victim, out var body)) if (_entMan.TryGetComponent<SharedBodyComponent?>(victim, out var body))
{ {
@@ -61,8 +62,16 @@ namespace Content.Server.Recycling.Components
} }
EntitySystem.Get<RecyclerSystem>().Bloodstain(this); EntitySystem.Get<RecyclerSystem>().Bloodstain(this);
return SuicideKind.Bloodloss; return SuicideKind.Bloodloss;
} }
/// <summary>
/// Default sound to play when recycling
/// </summary>
[ViewVariables(VVAccess.ReadWrite)] [DataField("sound")]
public SoundSpecifier? Sound = new SoundPathSpecifier("/Audio/Effects/saw.ogg");
// Ratelimit sounds to avoid spam
public TimeSpan LastSound;
} }
} }

View File

@@ -1,52 +1,93 @@
using Content.Server.Audio;
using Content.Server.Power.Components; using Content.Server.Power.Components;
using Content.Server.Recycling.Components; using Content.Server.Recycling.Components;
using Content.Shared.Audio;
using Content.Shared.Body.Components; using Content.Shared.Body.Components;
using Content.Shared.Recycling;
using Content.Shared.Emag.Systems; using Content.Shared.Emag.Systems;
using Robust.Shared.GameObjects; using Content.Shared.Recycling;
using Robust.Shared.IoC; using Content.Shared.Tag;
using Robust.Shared.Audio;
using Robust.Shared.Physics.Dynamics; using Robust.Shared.Physics.Dynamics;
using Robust.Shared.Player; using Robust.Shared.Player;
using Robust.Shared.Timing;
namespace Content.Server.Recycling namespace Content.Server.Recycling
{ {
internal sealed class RecyclerSystem : EntitySystem public sealed class RecyclerSystem : EntitySystem
{ {
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly AmbientSoundSystem _ambience = default!;
[Dependency] private readonly TagSystem _tags = default!;
private const float RecyclerSoundCooldown = 0.8f;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); SubscribeLocalEvent<RecyclerComponent, StartCollideEvent>(OnCollide);
SubscribeLocalEvent<RecyclerComponent, StartCollideEvent>(HandleCollide);
SubscribeLocalEvent<RecyclerComponent, GotEmaggedEvent>(OnEmagged); SubscribeLocalEvent<RecyclerComponent, GotEmaggedEvent>(OnEmagged);
} }
private void HandleCollide(EntityUid uid, RecyclerComponent component, StartCollideEvent args) public void EnableRecycler(RecyclerComponent component)
{ {
if (component.Enabled) return;
component.Enabled = true;
_ambience.SetAmbience(component.Owner, true);
}
public void DisableRecycler(RecyclerComponent component)
{
if (!component.Enabled) return;
component.Enabled = false;
_ambience.SetAmbience(component.Owner, false);
}
private void OnCollide(EntityUid uid, RecyclerComponent component, StartCollideEvent args)
{
if (component.Enabled && args.OurFixture.ID != "brrt") return;
Recycle(component, args.OtherFixture.Body.Owner); Recycle(component, args.OtherFixture.Body.Owner);
} }
private void Recycle(RecyclerComponent component, EntityUid entity) private void Recycle(RecyclerComponent component, EntityUid entity)
{ {
// TODO: Prevent collision with recycled items RecyclableComponent? recyclable = null;
// Can only recycle things that are recyclable... And also check the safety of the thing to recycle. // Can only recycle things that are recyclable... And also check the safety of the thing to recycle.
if (!EntityManager.TryGetComponent(entity, out RecyclableComponent? recyclable) || !recyclable.Safe && component.Safe) return; if (!_tags.HasTag(entity, "Recyclable") &&
(!TryComp(entity, out recyclable) || !recyclable.Safe && component.Safe))
{
return;
}
// TODO: Prevent collision with recycled items
// Mobs are a special case! // Mobs are a special case!
if (CanGib(component, entity)) if (CanGib(component, entity))
{ {
EntityManager.GetComponent<SharedBodyComponent>(entity).Gib(true); Comp<SharedBodyComponent>(entity).Gib(true);
Bloodstain(component); Bloodstain(component);
return; return;
} }
recyclable.Recycle(component.Efficiency); if (recyclable == null)
QueueDel(entity);
else
Recycle(recyclable, component.Efficiency);
if (component.Sound != null && (_timing.CurTime - component.LastSound).TotalSeconds > RecyclerSoundCooldown)
{
SoundSystem.Play(Filter.Pvs(component.Owner, entityManager: EntityManager), component.Sound.GetSound(), component.Owner, AudioHelpers.WithVariation(0.01f).WithVolume(-3));
component.LastSound = _timing.CurTime;
}
} }
private bool CanGib(RecyclerComponent component, EntityUid entity) private bool CanGib(RecyclerComponent component, EntityUid entity)
{ {
// We suppose this entity has a Recyclable component. // TODO: Power needs a helper for this jeez
return EntityManager.HasComponent<SharedBodyComponent>(entity) && !component.Safe && return HasComp<SharedBodyComponent>(entity) && !component.Safe &&
EntityManager.TryGetComponent(component.Owner, out ApcPowerReceiverComponent? receiver) && receiver.Powered; TryComp<ApcPowerReceiverComponent>(component.Owner, out var receiver) && receiver.Powered;
} }
public void Bloodstain(RecyclerComponent component) public void Bloodstain(RecyclerComponent component)
@@ -57,13 +98,26 @@ namespace Content.Server.Recycling
} }
} }
private void Recycle(RecyclableComponent component, float efficiency = 1f)
{
if (!string.IsNullOrEmpty(component.Prototype))
{
var xform = Transform(component.Owner);
for (var i = 0; i < Math.Max(component.Amount * efficiency, 1); i++)
{
Spawn(component.Prototype, xform.Coordinates);
}
}
QueueDel(component.Owner);
}
private void OnEmagged(EntityUid uid, RecyclerComponent component, GotEmaggedEvent args) private void OnEmagged(EntityUid uid, RecyclerComponent component, GotEmaggedEvent args)
{ {
if (component.Safe == true) if (!component.Safe) return;
{ component.Safe = false;
component.Safe = false; args.Handled = true;
args.Handled = true;
}
} }
} }
} }

Binary file not shown.

View File

@@ -0,0 +1 @@
circular_saw.ogg - https://freesound.org/people/derjuli/sounds/448133/ and clipped - CC0-1.0

View File

@@ -1,20 +1,23 @@
hit_kick.ogg is made by Taira Komori adminhelp.ogg taken from https://github.com/tgstation/tgstation/blob/d775e1ac804eb9d0259573f5f29a18d320c97ef3/sound/effects/adminhelp.ogg
(https://taira-komori.jpn.org/freesounden.html)
smoke.ogg taken from https://github.com/tgstation/tgstation/blob/a5d362ce84e4f0c61026236d5ec84d3c81553664/sound/effects/smoke.ogg
adminhelp.ogg taken from https://github.com/tgstation/tgstation/blob/d775e1ac804eb9d0259573f5f29a18d320c97ef3/sound/effects/adminhelp.ogg
(available in master, therefore see master license: "All assets including icons and sound are under a Creative Commons 3.0 BY-SA license unless otherwise indicated.") (available in master, therefore see master license: "All assets including icons and sound are under a Creative Commons 3.0 BY-SA license unless otherwise indicated.")
"Changed the adminhelpsound to some creative commons sound I pinched. Until somebody can get a better one. I'm sick of MAAAAAAAAOOOOOOW." "Changed the adminhelpsound to some creative commons sound I pinched. Until somebody can get a better one. I'm sick of MAAAAAAAAOOOOOOW."
Actual source is https://freesound.org/people/martian/sounds/19261/ (CC0) Actual source is https://freesound.org/people/martian/sounds/19261/ (CC0)
The sound had been reversed and the volume altered. The sound had been reversed and the volume altered.
voteding.ogg taken from "Bike, Bell Ding, Single, 01-01.wav" by InspectorJ (www.jshaw.co.uk) of Freesound.org at https://freesound.org/people/InspectorJ/sounds/484344/ under CC BY 3.0. The volume has been reduced. hit_kick.ogg is made by Taira Komori
(https://taira-komori.jpn.org/freesounden.html)
fire.ogg taken and edited from https://freesound.org/people/raremess/sounds/222557/
holy.ogg taken from https://freesound.org/people/random_intruder/sounds/392172/ and edited
poster_broken.ogg taken from https://github.com/tgstation/tgstation/blob/2834383245d2129a106acef3afd17b81e1e64777/sound/items/poster_ripped.ogg poster_broken.ogg taken from https://github.com/tgstation/tgstation/blob/2834383245d2129a106acef3afd17b81e1e64777/sound/items/poster_ripped.ogg
poster_being_set.ogg taken from https://github.com/tgstation/tgstation/blob/2834383245d2129a106acef3afd17b81e1e64777/sound/items/poster_ripped.ogg poster_being_set.ogg taken from https://github.com/tgstation/tgstation/blob/2834383245d2129a106acef3afd17b81e1e64777/sound/items/poster_ripped.ogg
fire.ogg taken and edited from https://freesound.org/people/raremess/sounds/222557/ saw.ogg taken from https://freesound.org/people/domiscz/sounds/461728/ and clipped - CC0-1.0
*It's actually an angle grinder
holy.ogg taken from https://freesound.org/people/random_intruder/sounds/392172/ and edited smoke.ogg taken from https://github.com/tgstation/tgstation/blob/a5d362ce84e4f0c61026236d5ec84d3c81553664/sound/effects/smoke.ogg
voteding.ogg taken from "Bike, Bell Ding, Single, 01-01.wav" by InspectorJ (www.jshaw.co.uk) of Freesound.org at https://freesound.org/people/InspectorJ/sounds/484344/ under CC BY 3.0. The volume has been reduced.

Binary file not shown.

View File

@@ -2104,6 +2104,7 @@
sprite: Objects/Consumable/Drinks/ramen.rsi sprite: Objects/Consumable/Drinks/ramen.rsi
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable

View File

@@ -36,6 +36,7 @@
stateOpen: icon_open stateOpen: icon_open
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: ItemCooldown - type: ItemCooldown
- type: Recyclable - type: Recyclable
@@ -56,6 +57,7 @@
- type: Tag - type: Tag
tags: tags:
- Cola - Cola
- Recyclable
- Trash - Trash
- type: Sprite - type: Sprite
sprite: Objects/Consumable/Drinks/cola.rsi sprite: Objects/Consumable/Drinks/cola.rsi

View File

@@ -52,6 +52,7 @@
acts: [ "Destruction" ] acts: [ "Destruction" ]
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable

View File

@@ -55,6 +55,7 @@
netsync: false netsync: false
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable

View File

@@ -7,6 +7,7 @@
abstract: true abstract: true
components: components:
- type: Food - type: Food
- type: Recyclable
- type: Sprite - type: Sprite
netsync: false netsync: false

View File

@@ -195,6 +195,7 @@
- SmallImpassable - SmallImpassable
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: SolutionContainerManager - type: SolutionContainerManager
solutions: solutions:

View File

@@ -208,6 +208,7 @@
HeldPrefix: packet HeldPrefix: packet
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable

View File

@@ -23,6 +23,7 @@
openIcon: open openIcon: open
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable

View File

@@ -14,6 +14,7 @@
- type: Tag - type: Tag
tags: tags:
- Cigarette - Cigarette
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable
- type: Clothing - type: Clothing

View File

@@ -11,6 +11,7 @@
- type: Tag - type: Tag
tags: tags:
- Cigarette - Cigarette
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable
- type: Clothing - type: Clothing
@@ -42,6 +43,7 @@
- type: Tag - type: Tag
tags: tags:
- Cigarette - Cigarette
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable
- type: Clothing - type: Clothing

View File

@@ -7,6 +7,7 @@
- type: Tag - type: Tag
tags: tags:
- CigPack - CigPack
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable
- type: Storage - type: Storage

View File

@@ -57,6 +57,7 @@
size: 2 size: 2
- type: Tag - type: Tag
tags: tags:
- Recyclable
- RollingPaper - RollingPaper
- Trash - Trash
- type: Recyclable - type: Recyclable
@@ -80,5 +81,6 @@
- type: Tag - type: Tag
tags: tags:
- CigFilter - CigFilter
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable

View File

@@ -12,6 +12,7 @@
- type: BurnStateVisualizer - type: BurnStateVisualizer
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable

View File

@@ -9,6 +9,7 @@
tags: tags:
- Write - Write
- Crayon - Crayon
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable
- type: UserInterface - type: UserInterface
@@ -38,6 +39,7 @@
- Write - Write
- Crayon - Crayon
- CrayonWhite - CrayonWhite
- Recyclable
- Trash - Trash
- type: entity - type: entity
@@ -60,6 +62,7 @@
- Write - Write
- Crayon - Crayon
- CrayonWhite - CrayonWhite
- Recyclable
- Trash - Trash
- type: entity - type: entity
@@ -82,6 +85,7 @@
- Write - Write
- Crayon - Crayon
- CrayonBlack - CrayonBlack
- Recyclable
- Trash - Trash
- type: entity - type: entity
@@ -104,6 +108,7 @@
- Write - Write
- Crayon - Crayon
- CrayonRed - CrayonRed
- Recyclable
- Trash - Trash
- type: entity - type: entity
@@ -126,6 +131,7 @@
- Write - Write
- Crayon - Crayon
- CrayonOrange - CrayonOrange
- Recyclable
- Trash - Trash
- type: entity - type: entity
@@ -148,6 +154,7 @@
- Write - Write
- Crayon - Crayon
- CrayonYellow - CrayonYellow
- Recyclable
- Trash - Trash
- type: entity - type: entity
@@ -170,6 +177,7 @@
- Write - Write
- Crayon - Crayon
- CrayonGreen - CrayonGreen
- Recyclable
- Trash - Trash
- type: entity - type: entity
@@ -192,6 +200,7 @@
- Write - Write
- Crayon - Crayon
- CrayonBlue - CrayonBlue
- Recyclable
- Trash - Trash
- type: entity - type: entity
@@ -214,6 +223,7 @@
- Write - Write
- Crayon - Crayon
- CrayonPurple - CrayonPurple
- Recyclable
- Trash - Trash
- type: entity - type: entity

View File

@@ -25,6 +25,7 @@
Slash: 2 Slash: 2
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable

View File

@@ -20,6 +20,7 @@
Slash: 2 Slash: 2
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable

View File

@@ -9,6 +9,7 @@
sprite: Objects/Misc/utensils.rsi sprite: Objects/Misc/utensils.rsi
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable

View File

@@ -54,6 +54,7 @@
- type: LightBulbVisualizer - type: LightBulbVisualizer
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable

View File

@@ -51,6 +51,7 @@
emptySpriteName: medipen_empty emptySpriteName: medipen_empty
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable

View File

@@ -8,6 +8,7 @@
- type: Tag - type: Tag
tags: tags:
- Bottle - Bottle
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable
- type: Sprite - type: Sprite

View File

@@ -7,6 +7,7 @@
- type: Tag - type: Tag
tags: tags:
- Flare - Flare
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable
- type: ExpendableLight - type: ExpendableLight

View File

@@ -6,6 +6,7 @@
components: components:
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable
- type: ExpendableLight - type: ExpendableLight

View File

@@ -17,6 +17,7 @@
- type: Tag - type: Tag
tags: tags:
- Matchstick - Matchstick
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable
- type: Sprite - type: Sprite
@@ -80,5 +81,6 @@
- matchbox3 - matchbox3
- type: Tag - type: Tag
tags: tags:
- Recyclable
- Trash - Trash
- type: Recyclable - type: Recyclable

View File

@@ -6,6 +6,7 @@
- type: Tag - type: Tag
tags: tags:
- Cartridge - Cartridge
- Recyclable
- type: Item - type: Item
size: 1 size: 1
- type: Recyclable - type: Recyclable

View File

@@ -4,22 +4,40 @@
name: recycler name: recycler
description: A large crushing machine used to recycle small items inefficiently. There are lights on the side. description: A large crushing machine used to recycle small items inefficiently. There are lights on the side.
components: components:
- type: AmbientSound
enabled: false
volume: -8
range: 5
sound:
# TODO: https://freesound.org/people/derjuli/sounds/448133/ CC-NC-
path: /Audio/Ambience/Objects/circular_saw.ogg
- type: Physics - type: Physics
- type: Fixtures - type: Fixtures
fixtures: fixtures:
- shape: - shape:
!type:PhysShapeAabb !type:PhysShapeAabb
bounds: "-0.49,-0.49,0.49,0.49" bounds: "-0.2,-0.2,0.2,0.2"
id: brrt
hard: false hard: false
layer: layer:
- Opaque - Opaque
- Impassable - Impassable
- MobImpassable - MobImpassable
- VaultImpassable - VaultImpassable
- shape:
!type:PhysShapeAabb
bounds: "-0.49,-0.49,0.49,0.49"
id: collision
hard: true
mask:
- Impassable
layer:
- Opaque
- type: Transform - type: Transform
anchored: true anchored: true
- type: Sprite - type: Sprite
netsync: false netsync: false
drawdepth: Doors
sprite: Structures/Machines/recycling.rsi sprite: Structures/Machines/recycling.rsi
layers: layers:
- state: grinder-o0 - state: grinder-o0

View File

@@ -240,6 +240,10 @@
- type: Tag - type: Tag
id: Powerdrill id: Powerdrill
# Give this to something that doesn't need any special recycler behavior and just needs deleting.
- type: Tag
id: Recyclable
- type: Tag - type: Tag
id: RCDDeconstructWhitelist id: RCDDeconstructWhitelist

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 16 KiB