Revert Paint (#26593)
* Revert "Fix build (#26258)" This reverts commit6de5fbfafb. * Revert "Spray Paint (Review Ready) (#23003)" This reverts commite4d5e7f1ae. # Conflicts: # Resources/Prototypes/Entities/Structures/Holographic/projections.yml
@@ -1,116 +0,0 @@
|
||||
using System.Linq;
|
||||
using Robust.Client.GameObjects;
|
||||
using static Robust.Client.GameObjects.SpriteComponent;
|
||||
using Content.Shared.Clothing;
|
||||
using Content.Shared.Hands;
|
||||
using Content.Shared.Paint;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Client.Paint;
|
||||
|
||||
public sealed class PaintedVisualizerSystem : VisualizerSystem<PaintedComponent>
|
||||
{
|
||||
/// <summary>
|
||||
/// Visualizer for Paint which applies a shader and colors the entity.
|
||||
/// </summary>
|
||||
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
[Dependency] private readonly IPrototypeManager _protoMan = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<PaintedComponent, HeldVisualsUpdatedEvent>(OnHeldVisualsUpdated);
|
||||
SubscribeLocalEvent<PaintedComponent, ComponentShutdown>(OnShutdown);
|
||||
SubscribeLocalEvent<PaintedComponent, EquipmentVisualsUpdatedEvent>(OnEquipmentVisualsUpdated);
|
||||
}
|
||||
|
||||
protected override void OnAppearanceChange(EntityUid uid, PaintedComponent component, ref AppearanceChangeEvent args)
|
||||
{
|
||||
var shader = _protoMan.Index<ShaderPrototype>(component.ShaderName).Instance();
|
||||
|
||||
if (args.Sprite == null)
|
||||
return;
|
||||
|
||||
// What is this even doing? It's not even checking what the value is.
|
||||
if (!_appearance.TryGetData(uid, PaintVisuals.Painted, out bool isPainted))
|
||||
return;
|
||||
|
||||
var sprite = args.Sprite;
|
||||
|
||||
foreach (var spriteLayer in sprite.AllLayers)
|
||||
{
|
||||
if (spriteLayer is not Layer layer)
|
||||
continue;
|
||||
|
||||
if (layer.Shader == null) // If shader isn't null we dont want to replace the original shader.
|
||||
{
|
||||
layer.Shader = shader;
|
||||
layer.Color = component.Color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnHeldVisualsUpdated(EntityUid uid, PaintedComponent component, HeldVisualsUpdatedEvent args)
|
||||
{
|
||||
if (args.RevealedLayers.Count == 0)
|
||||
return;
|
||||
|
||||
if (!TryComp(args.User, out SpriteComponent? sprite))
|
||||
return;
|
||||
|
||||
foreach (var revealed in args.RevealedLayers)
|
||||
{
|
||||
if (!sprite.LayerMapTryGet(revealed, out var layer))
|
||||
continue;
|
||||
|
||||
sprite.LayerSetShader(layer, component.ShaderName);
|
||||
sprite.LayerSetColor(layer, component.Color);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnEquipmentVisualsUpdated(EntityUid uid, PaintedComponent component, EquipmentVisualsUpdatedEvent args)
|
||||
{
|
||||
if (args.RevealedLayers.Count == 0)
|
||||
return;
|
||||
|
||||
if (!TryComp(args.Equipee, out SpriteComponent? sprite))
|
||||
return;
|
||||
|
||||
foreach (var revealed in args.RevealedLayers)
|
||||
{
|
||||
if (!sprite.LayerMapTryGet(revealed, out var layer))
|
||||
continue;
|
||||
|
||||
sprite.LayerSetShader(layer, component.ShaderName);
|
||||
sprite.LayerSetColor(layer, component.Color);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnShutdown(EntityUid uid, PaintedComponent component, ref ComponentShutdown args)
|
||||
{
|
||||
if (!TryComp(uid, out SpriteComponent? sprite))
|
||||
return;
|
||||
|
||||
component.BeforeColor = sprite.Color;
|
||||
var shader = _protoMan.Index<ShaderPrototype>(component.ShaderName).Instance();
|
||||
|
||||
if (!Terminating(uid))
|
||||
{
|
||||
foreach (var spriteLayer in sprite.AllLayers)
|
||||
{
|
||||
if (spriteLayer is not Layer layer)
|
||||
continue;
|
||||
|
||||
if (layer.Shader == shader) // If shader isn't same as one in component we need to ignore it.
|
||||
{
|
||||
layer.Shader = null;
|
||||
if (layer.Color == component.Color) // If color isn't the same as one in component we don't want to change it.
|
||||
layer.Color = component.BeforeColor;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,178 +0,0 @@
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Paint;
|
||||
using Content.Shared.Sprite;
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Server.Chemistry.Containers.EntitySystems;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Content.Shared.Humanoid;
|
||||
using Robust.Shared.Utility;
|
||||
using Content.Shared.Verbs;
|
||||
using Content.Shared.SubFloor;
|
||||
using Content.Server.Nutrition.Components;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Server.Nutrition.EntitySystems;
|
||||
|
||||
namespace Content.Server.Paint;
|
||||
|
||||
/// <summary>
|
||||
/// Colors target and consumes reagent on each color success.
|
||||
/// </summary>
|
||||
public sealed class PaintSystem : SharedPaintSystem
|
||||
{
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
[Dependency] private readonly SolutionContainerSystem _solutionContainer = default!;
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!;
|
||||
[Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!;
|
||||
[Dependency] private readonly InventorySystem _inventory = default!;
|
||||
[Dependency] private readonly OpenableSystem _openable = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<PaintComponent, AfterInteractEvent>(OnInteract);
|
||||
SubscribeLocalEvent<PaintComponent, PaintDoAfterEvent>(OnPaint);
|
||||
SubscribeLocalEvent<PaintComponent, GetVerbsEvent<UtilityVerb>>(OnPaintVerb);
|
||||
}
|
||||
|
||||
private void OnInteract(EntityUid uid, PaintComponent component, AfterInteractEvent args)
|
||||
{
|
||||
if (!args.CanReach)
|
||||
return;
|
||||
|
||||
if (args.Target is not { Valid: true } target)
|
||||
return;
|
||||
|
||||
PrepPaint(uid, component, target, args.User);
|
||||
}
|
||||
|
||||
private void OnPaintVerb(EntityUid uid, PaintComponent component, GetVerbsEvent<UtilityVerb> args)
|
||||
{
|
||||
if (!args.CanInteract || !args.CanAccess)
|
||||
return;
|
||||
|
||||
var paintText = Loc.GetString("paint-verb");
|
||||
|
||||
var verb = new UtilityVerb()
|
||||
{
|
||||
Act = () =>
|
||||
{
|
||||
PrepPaint(uid, component, args.Target, args.User);
|
||||
},
|
||||
|
||||
Text = paintText,
|
||||
Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/paint.svg.192dpi.png"))
|
||||
};
|
||||
args.Verbs.Add(verb);
|
||||
}
|
||||
private void PrepPaint(EntityUid uid, PaintComponent component, EntityUid target, EntityUid user)
|
||||
{
|
||||
|
||||
var doAfterEventArgs = new DoAfterArgs(EntityManager, user, component.Delay, new PaintDoAfterEvent(), uid, target: target, used: uid)
|
||||
{
|
||||
BreakOnMove = true,
|
||||
NeedHand = true,
|
||||
BreakOnHandChange = true
|
||||
};
|
||||
|
||||
_doAfterSystem.TryStartDoAfter(doAfterEventArgs);
|
||||
}
|
||||
|
||||
private void OnPaint(Entity<PaintComponent> entity, ref PaintDoAfterEvent args)
|
||||
{
|
||||
if (args.Target == null || args.Used == null)
|
||||
return;
|
||||
|
||||
if (args.Handled || args.Cancelled)
|
||||
return;
|
||||
|
||||
if (args.Target is not { Valid: true } target)
|
||||
return;
|
||||
|
||||
if (!_openable.IsOpen(entity))
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("paint-closed", ("used", args.Used)), args.User, args.User, PopupType.Medium);
|
||||
return;
|
||||
}
|
||||
|
||||
if (HasComp<PaintedComponent>(target) || HasComp<RandomSpriteComponent>(target))
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("paint-failure-painted", ("target", args.Target)), args.User, args.User, PopupType.Medium);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!entity.Comp.Blacklist?.IsValid(target, EntityManager) != true || HasComp<HumanoidAppearanceComponent>(target) || HasComp<SubFloorHideComponent>(target))
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("paint-failure", ("target", args.Target)), args.User, args.User, PopupType.Medium);
|
||||
return;
|
||||
}
|
||||
|
||||
if (TryPaint(entity, target))
|
||||
{
|
||||
EnsureComp<PaintedComponent>(target, out PaintedComponent? paint);
|
||||
EnsureComp<AppearanceComponent>(target);
|
||||
|
||||
paint.Color = entity.Comp.Color; // set the target color to the color specified in the spray paint yml.
|
||||
_audio.PlayPvs(entity.Comp.Spray, entity);
|
||||
paint.Enabled = true;
|
||||
|
||||
if (HasComp<InventoryComponent>(target)) // Paint any clothing the target is wearing.
|
||||
{
|
||||
if (_inventory.TryGetSlots(target, out var slotDefinitions))
|
||||
{
|
||||
foreach (var slot in slotDefinitions)
|
||||
{
|
||||
if (!_inventory.TryGetSlotEntity(target, slot.Name, out var slotEnt))
|
||||
continue;
|
||||
|
||||
if (HasComp<PaintedComponent>(slotEnt.Value) || !entity.Comp.Blacklist?.IsValid(slotEnt.Value,
|
||||
EntityManager) != true
|
||||
|| HasComp<RandomSpriteComponent>(slotEnt.Value) ||
|
||||
HasComp<HumanoidAppearanceComponent>(
|
||||
slotEnt.Value))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
EnsureComp<PaintedComponent>(slotEnt.Value, out PaintedComponent? slotpaint);
|
||||
EnsureComp<AppearanceComponent>(slotEnt.Value);
|
||||
slotpaint.Color = entity.Comp.Color;
|
||||
_appearanceSystem.SetData(slotEnt.Value, PaintVisuals.Painted, true);
|
||||
Dirty(slotEnt.Value, slotpaint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_popup.PopupEntity(Loc.GetString("paint-success", ("target", args.Target)), args.User, args.User, PopupType.Medium);
|
||||
_appearanceSystem.SetData(target, PaintVisuals.Painted, true);
|
||||
Dirty(target, paint);
|
||||
args.Handled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!TryPaint(entity, target))
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("paint-empty", ("used", args.Used)), args.User, args.User, PopupType.Medium);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private bool TryPaint(Entity<PaintComponent> reagent, EntityUid target)
|
||||
{
|
||||
if (HasComp<HumanoidAppearanceComponent>(target) || HasComp<SubFloorHideComponent>(target))
|
||||
return false;
|
||||
|
||||
if (_solutionContainer.TryGetSolution(reagent.Owner, reagent.Comp.Solution, out _, out var solution))
|
||||
{
|
||||
var quantity = solution.RemoveReagent(reagent.Comp.Reagent, reagent.Comp.ConsumptionUnit);
|
||||
if (quantity > 0)// checks quantity of solution is more than 0.
|
||||
return true;
|
||||
|
||||
if (quantity < 1)
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -80,6 +80,11 @@ namespace Content.Server.Storage.EntitySystems
|
||||
_adminLogger.Add(LogType.EntitySpawn, LogImpact.Low, $"{ToPrettyString(args.User)} used {ToPrettyString(uid)} which spawned {ToPrettyString(entityToPlaceInHands.Value)}");
|
||||
}
|
||||
|
||||
if (component.Sound != null)
|
||||
{
|
||||
_audio.PlayPvs(component.Sound, uid);
|
||||
}
|
||||
|
||||
component.Uses--;
|
||||
|
||||
// Delete entity only if component was successfully used
|
||||
@@ -92,7 +97,6 @@ namespace Content.Server.Storage.EntitySystems
|
||||
if (entityToPlaceInHands != null)
|
||||
{
|
||||
_hands.PickupOrDrop(args.User, entityToPlaceInHands.Value);
|
||||
_audio.PlayPvs(component.Sound, entityToPlaceInHands.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
using Content.Shared.Chemistry.Reagent;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Robust.Shared.Audio;
|
||||
using Content.Shared.Whitelist;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared.Paint;
|
||||
|
||||
/// <summary>
|
||||
/// Entity when used on another entity will paint target entity.
|
||||
/// </summary>
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
[Access(typeof(SharedPaintSystem))]
|
||||
public sealed partial class PaintComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Noise made when paint applied.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public SoundSpecifier Spray = new SoundPathSpecifier("/Audio/Effects/spray2.ogg");
|
||||
|
||||
/// <summary>
|
||||
/// Solution on the entity that contains the paint.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public string Solution = "drink";
|
||||
|
||||
/// <summary>
|
||||
/// How long the doafter will take.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public int Delay = 2;
|
||||
|
||||
/// <summary>
|
||||
/// Reagent that will be used as paint.
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public ProtoId<ReagentPrototype> Reagent = "SpaceGlue";
|
||||
|
||||
/// <summary>
|
||||
/// Color that the painting entity will instruct the painted entity to be.
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public Color Color = Color.FromHex("#c62121");
|
||||
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
||||
public EntityWhitelist? Blacklist;
|
||||
/// <summary>
|
||||
/// Reagent consumption per use.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public FixedPoint2 ConsumptionUnit = FixedPoint2.New(5);
|
||||
|
||||
/// <summary>
|
||||
/// Duration per unit
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public TimeSpan DurationPerUnit = TimeSpan.FromSeconds(6);
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
using Content.Shared.DoAfter;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Paint;
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed partial class PaintDoAfterEvent : SimpleDoAfterEvent
|
||||
{
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Audio;
|
||||
|
||||
namespace Content.Shared.Paint;
|
||||
|
||||
/// <summary>
|
||||
/// Removes paint from an entity that was painted with spray paint.
|
||||
/// </summary>
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
[Access(typeof(PaintRemoverSystem))]
|
||||
public sealed partial class PaintRemoverComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Sound when target is cleaned.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public SoundSpecifier Sound = new SoundPathSpecifier("/Audio/Effects/Fluids/watersplash.ogg");
|
||||
|
||||
/// <summary>
|
||||
/// DoAfter wait time.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public float CleanDelay = 2f;
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
using Content.Shared.DoAfter;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Paint;
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed partial class PaintRemoverDoAfterEvent : SimpleDoAfterEvent
|
||||
{
|
||||
}
|
||||
@@ -1,94 +0,0 @@
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.Verbs;
|
||||
using Content.Shared.Sprite;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Shared.Paint;
|
||||
|
||||
/// <summary>
|
||||
/// Removes paint from an entity.
|
||||
/// </summary>
|
||||
public sealed class PaintRemoverSystem : SharedPaintSystem
|
||||
{
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<PaintRemoverComponent, AfterInteractEvent>(OnInteract);
|
||||
SubscribeLocalEvent<PaintRemoverComponent, PaintRemoverDoAfterEvent>(OnDoAfter);
|
||||
SubscribeLocalEvent<PaintRemoverComponent, GetVerbsEvent<UtilityVerb>>(OnPaintRemoveVerb);
|
||||
}
|
||||
|
||||
// When entity is painted, remove paint from that entity.
|
||||
private void OnInteract(EntityUid uid, PaintRemoverComponent component, AfterInteractEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
if (!args.CanReach || args.Target is not { Valid: true } target || !HasComp<PaintedComponent>(target))
|
||||
return;
|
||||
|
||||
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.CleanDelay, new PaintRemoverDoAfterEvent(), uid, args.Target, uid)
|
||||
{
|
||||
BreakOnMove = true,
|
||||
BreakOnDamage = true,
|
||||
MovementThreshold = 1.0f,
|
||||
});
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void OnDoAfter(EntityUid uid, PaintRemoverComponent component, DoAfterEvent args)
|
||||
{
|
||||
if (args.Cancelled || args.Handled || args.Args.Target == null)
|
||||
return;
|
||||
|
||||
if (args.Target is not { Valid: true } target)
|
||||
return;
|
||||
|
||||
if (!TryComp(target, out PaintedComponent? paint))
|
||||
return;
|
||||
|
||||
paint.Enabled = false;
|
||||
_audio.PlayPredicted(component.Sound, target, args.User);
|
||||
_popup.PopupClient(Loc.GetString("paint-removed", ("target", target)), args.User, args.User, PopupType.Medium);
|
||||
_appearanceSystem.SetData(target, PaintVisuals.Painted, false);
|
||||
RemComp<PaintedComponent>(target);
|
||||
Dirty(target, paint);
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void OnPaintRemoveVerb(EntityUid uid, PaintRemoverComponent component, GetVerbsEvent<UtilityVerb> args)
|
||||
{
|
||||
if (!args.CanInteract || !args.CanAccess)
|
||||
return;
|
||||
|
||||
var paintremovalText = Loc.GetString("paint-remove-verb");
|
||||
|
||||
var verb = new UtilityVerb()
|
||||
{
|
||||
Act = () =>
|
||||
{
|
||||
|
||||
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.CleanDelay, new PaintRemoverDoAfterEvent(), uid, args.Target, uid)
|
||||
{
|
||||
BreakOnMove = true,
|
||||
BreakOnDamage = true,
|
||||
MovementThreshold = 1.0f,
|
||||
});
|
||||
},
|
||||
|
||||
Text = paintremovalText
|
||||
};
|
||||
|
||||
args.Verbs.Add(verb);
|
||||
}
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Paint;
|
||||
|
||||
/// <summary>
|
||||
/// Component applied to target entity when painted.
|
||||
/// </summary>
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class PaintedComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Color of the paint.
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public Color Color = Color.FromHex("#2cdbd5");
|
||||
|
||||
/// <summary>
|
||||
/// Used to remove the color when component removed.
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public Color BeforeColor;
|
||||
|
||||
/// <summary>
|
||||
/// If paint is enabled.
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public bool Enabled;
|
||||
|
||||
/// <summary>
|
||||
/// Name of the shader.
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public string ShaderName = "Greyscale";
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public enum PaintVisuals : byte
|
||||
{
|
||||
Painted,
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
namespace Content.Shared.Paint;
|
||||
|
||||
/// <summary>
|
||||
/// Colors target and consumes reagent on each color success.
|
||||
/// </summary>
|
||||
public abstract class SharedPaintSystem : EntitySystem
|
||||
{
|
||||
public virtual void UpdateAppearance(EntityUid uid, PaintedComponent? component = null)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,6 @@ using Content.Shared.DoAfter;
|
||||
using Content.Shared.Doors.Components;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Paint;
|
||||
using Content.Shared.SprayPainter.Components;
|
||||
using Content.Shared.SprayPainter.Prototypes;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
@@ -130,8 +129,6 @@ public abstract class SharedSprayPainterSystem : EntitySystem
|
||||
return;
|
||||
}
|
||||
|
||||
RemComp<PaintedComponent>(ent);
|
||||
|
||||
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, painter.AirlockSprayTime, new SprayPainterDoorDoAfterEvent(sprite, style.Department), args.Used, target: ent, used: args.Used)
|
||||
{
|
||||
BreakOnMove = true,
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
paint-success = {THE($target)} has been covered in paint!
|
||||
paint-failure = Can't cover {THE($target)} in paint!
|
||||
paint-failure-painted = {THE($target)} is already covered in paint!
|
||||
paint-empty = {THE($used)} is empty!
|
||||
paint-removed = You clean off the paint!
|
||||
paint-closed = You must open {THE($used)} first!
|
||||
paint-verb = Paint
|
||||
paint-remove-verb = Remove Paint
|
||||
@@ -68,16 +68,6 @@
|
||||
category: cargoproduct-category-name-fun
|
||||
group: market
|
||||
|
||||
- type: cargoProduct
|
||||
id: FunSprayPaints
|
||||
icon:
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
state: death2_cap
|
||||
product: CrateFunSprayPaints
|
||||
cost: 2000
|
||||
category: Fun
|
||||
group: market
|
||||
|
||||
- type: cargoProduct
|
||||
id: FunParty
|
||||
icon:
|
||||
|
||||
@@ -290,21 +290,14 @@
|
||||
contents:
|
||||
- id: SnapPopBox
|
||||
- id: CrazyGlue
|
||||
amount: 2
|
||||
- id: PlasticBanana
|
||||
- id: FunnyPaint
|
||||
orGroup: Paint
|
||||
prob: 0.5
|
||||
- id: FunnyPaintYellow
|
||||
orGroup: Paint
|
||||
prob: 0.5
|
||||
- id: WhoopieCushion
|
||||
- id: ToyHammer
|
||||
- id: MrChips
|
||||
prob: 0.5
|
||||
orGroup: Dummy
|
||||
orGroup: GiftPool
|
||||
- id: MrDips
|
||||
prob: 0.5
|
||||
orGroup: Dummy
|
||||
orGroup: Giftpool
|
||||
- id: RevolverCapGun
|
||||
- id: BalloonNT
|
||||
- id: ClothingShoesClownLarge
|
||||
@@ -337,41 +330,6 @@
|
||||
amount: 15
|
||||
prob: 0.05
|
||||
|
||||
- type: entity
|
||||
id: CrateFunSprayPaints
|
||||
name: spray paint crate
|
||||
description: a crate filled with spray paint.
|
||||
parent: CratePlastic
|
||||
suffix: Spray Paint
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: SprayPaintBlue
|
||||
amount: 2
|
||||
prob: 0.33
|
||||
- id: SprayPaintRed
|
||||
amount: 2
|
||||
prob: 0.33
|
||||
- id: SprayPaintOrange
|
||||
amount: 2
|
||||
prob: 0.33
|
||||
- id: SprayPaintBlack
|
||||
amount: 2
|
||||
prob: 0.33
|
||||
- id: SprayPaintGreen
|
||||
amount: 2
|
||||
prob: 0.33
|
||||
- id: SprayPaintPurple
|
||||
amount: 2
|
||||
prob: 0.33
|
||||
- id: SprayPaintWhite
|
||||
amount: 2
|
||||
prob: 0.33
|
||||
- id: DeathPaint
|
||||
amount: 2
|
||||
- id: DeathPaintTwo
|
||||
amount: 2
|
||||
|
||||
- type: entity
|
||||
name: dartboard box set
|
||||
description: A box with everything you need for a fun game of darts.
|
||||
|
||||
@@ -145,10 +145,6 @@
|
||||
prob: 0.25
|
||||
- id: StrangePill
|
||||
prob: 0.20
|
||||
- id: DeathPaint
|
||||
prob: 0.05
|
||||
- id: DeathPaintTwo
|
||||
prob: 0.05
|
||||
- id: DrinkMopwataBottleRandom
|
||||
prob: 0.20
|
||||
- id: ModularReceiver
|
||||
|
||||
@@ -44,7 +44,6 @@
|
||||
- CrateMaterialPlastic
|
||||
- CrateMaterialWood
|
||||
- CrateMaterialPlasteel
|
||||
- CrateFunSprayPaints
|
||||
- CrateFunArtSupplies
|
||||
- CrateEngineeringCableLV
|
||||
- CrateEngineeringCableMV
|
||||
|
||||
@@ -173,12 +173,7 @@
|
||||
- MaterialCloth10
|
||||
- MaterialWoodPlank10
|
||||
- ResearchDisk
|
||||
- DeathPaint
|
||||
- Plunger
|
||||
- SprayPaintBlue
|
||||
- SprayPaintRed
|
||||
- SprayPaintGreen
|
||||
- SprayPaintOrange
|
||||
- TechnologyDisk
|
||||
- PowerCellMedium
|
||||
- PowerCellSmall
|
||||
|
||||
@@ -70,7 +70,6 @@
|
||||
tags:
|
||||
- Carp
|
||||
- DoorBumpOpener
|
||||
- NoPaint
|
||||
- type: ReplacementAccent
|
||||
accent: genericAggressive
|
||||
- type: Speech
|
||||
|
||||
@@ -93,6 +93,3 @@
|
||||
- RevenantTheme
|
||||
- type: Speech
|
||||
speechVerb: Ghost
|
||||
- type: Tag
|
||||
tags:
|
||||
- NoPaint
|
||||
|
||||
@@ -104,7 +104,6 @@
|
||||
- type: Tag
|
||||
tags:
|
||||
- CannotSuicide
|
||||
- NoPaint
|
||||
|
||||
# From the uplink injector
|
||||
- type: entity
|
||||
@@ -213,7 +212,6 @@
|
||||
tags:
|
||||
- CannotSuicide
|
||||
- FootstepSound
|
||||
- NoPaint
|
||||
- type: Inventory
|
||||
templateId: holoclown
|
||||
- type: Hands
|
||||
|
||||
@@ -1,292 +0,0 @@
|
||||
# Base Paints
|
||||
- type: entity
|
||||
parent: BaseItem
|
||||
id: PaintBase
|
||||
name: spray paint
|
||||
description: A tin of spray paint.
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Appearance
|
||||
- type: Sprite
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
state: clown_cap
|
||||
layers:
|
||||
- state: clown_cap
|
||||
map: ["enum.OpenableVisuals.Layer"]
|
||||
- type: Paint
|
||||
consumptionUnit: 10
|
||||
blacklist:
|
||||
tags:
|
||||
- NoPaint
|
||||
- type: Item
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
heldPrefix: spray
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
drink:
|
||||
maxVol: 50
|
||||
reagents:
|
||||
- ReagentId: SpaceGlue
|
||||
Quantity: 50
|
||||
- type: TrashOnSolutionEmpty
|
||||
solution: drink
|
||||
- type: Sealable
|
||||
- type: Openable
|
||||
sound:
|
||||
path: /Audio/Effects/pop_high.ogg
|
||||
closeable: true
|
||||
closeSound:
|
||||
path: /Audio/Effects/pop_high.ogg
|
||||
|
||||
# Paints
|
||||
|
||||
# funnypaint
|
||||
- type: entity
|
||||
parent: PaintBase
|
||||
id: FunnyPaint
|
||||
name: funny paint
|
||||
description: A tin of funny paint, manufactured by Honk! Co.
|
||||
components:
|
||||
- type: Paint
|
||||
color: "#fa74df"
|
||||
- type: Item
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
heldPrefix: clown
|
||||
- type: GenericVisualizer
|
||||
visuals:
|
||||
enum.OpenableVisuals.Opened:
|
||||
enum.OpenableVisuals.Layer:
|
||||
True: {state: "clown"}
|
||||
False: {state: "clown_cap"}
|
||||
|
||||
- type: entity
|
||||
parent: PaintBase
|
||||
id: FunnyPaintYellow
|
||||
name: funny paint
|
||||
description: A tin of funny paint, manufactured by Honk! Co.
|
||||
components:
|
||||
- type: Paint
|
||||
color: "#d5e028"
|
||||
- type: Item
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
heldPrefix: clown
|
||||
- type: Sprite
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
state: clown2_cap
|
||||
layers:
|
||||
- state: clown2_cap
|
||||
map: ["enum.OpenableVisuals.Layer"]
|
||||
- type: GenericVisualizer
|
||||
visuals:
|
||||
enum.OpenableVisuals.Opened:
|
||||
enum.OpenableVisuals.Layer:
|
||||
True: {state: "clown2"}
|
||||
False: {state: "clown2_cap"}
|
||||
|
||||
#death paint
|
||||
- type: entity
|
||||
parent: PaintBase
|
||||
id: DeathPaint
|
||||
components:
|
||||
- type: Paint
|
||||
color: "#ff20c8"
|
||||
- type: Item
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
heldPrefix: spray
|
||||
- type: Sprite
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
state: death_cap
|
||||
layers:
|
||||
- state: death_cap
|
||||
map: ["enum.OpenableVisuals.Layer"]
|
||||
- type: GenericVisualizer
|
||||
visuals:
|
||||
enum.OpenableVisuals.Opened:
|
||||
enum.OpenableVisuals.Layer:
|
||||
True: {state: "death"}
|
||||
False: {state: "death_cap"}
|
||||
|
||||
- type: entity
|
||||
parent: PaintBase
|
||||
id: DeathPaintTwo
|
||||
components:
|
||||
- type: Paint
|
||||
color: "#ff2020"
|
||||
- type: Item
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
heldPrefix: spray
|
||||
- type: Sprite
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
state: death2_cap
|
||||
layers:
|
||||
- state: death2_cap
|
||||
map: ["enum.OpenableVisuals.Layer"]
|
||||
- type: GenericVisualizer
|
||||
visuals:
|
||||
enum.OpenableVisuals.Opened:
|
||||
enum.OpenableVisuals.Layer:
|
||||
True: {state: "death2"}
|
||||
False: {state: "death2_cap"}
|
||||
|
||||
#Sprays
|
||||
|
||||
#Blue
|
||||
- type: entity
|
||||
parent: PaintBase
|
||||
id: SprayPaintBlue
|
||||
suffix: Blue
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
layers:
|
||||
- state: spray
|
||||
map: ["Base"]
|
||||
- state: spray_cap_colors
|
||||
map: ["enum.OpenableVisuals.Layer"]
|
||||
color: "#5890f7"
|
||||
- type: Paint
|
||||
color: "#5890f7"
|
||||
- type: GenericVisualizer
|
||||
visuals:
|
||||
enum.OpenableVisuals.Opened:
|
||||
enum.OpenableVisuals.Layer:
|
||||
True: {state: "spray_colors" , color: "#5890f7"}
|
||||
False: {state: "spray_cap_colors" , color: "#5890f7"}
|
||||
|
||||
#Red
|
||||
- type: entity
|
||||
parent: PaintBase
|
||||
id: SprayPaintRed
|
||||
suffix: Red
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
layers:
|
||||
- state: spray
|
||||
map: ["Base"]
|
||||
- state: spray_cap_colors
|
||||
map: ["enum.OpenableVisuals.Layer"]
|
||||
color: "#ff3b3b"
|
||||
- type: Paint
|
||||
color: "#ff3b3b"
|
||||
- type: GenericVisualizer
|
||||
visuals:
|
||||
enum.OpenableVisuals.Opened:
|
||||
enum.OpenableVisuals.Layer:
|
||||
True: {state: "spray_colors" , color: "#ff3b3b"}
|
||||
False: {state: "spray_cap_colors" , color: "#ff3b3b"}
|
||||
|
||||
#Green
|
||||
- type: entity
|
||||
parent: PaintBase
|
||||
id: SprayPaintGreen
|
||||
suffix: Green
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
layers:
|
||||
- state: spray
|
||||
map: ["Base"]
|
||||
- state: spray_cap_colors
|
||||
map: ["enum.OpenableVisuals.Layer"]
|
||||
color: "#73f170"
|
||||
- type: Paint
|
||||
color: "#73f170"
|
||||
- type: GenericVisualizer
|
||||
visuals:
|
||||
enum.OpenableVisuals.Opened:
|
||||
enum.OpenableVisuals.Layer:
|
||||
True: {state: "spray_colors" , color: "#73f170"}
|
||||
False: {state: "spray_cap_colors" , color: "#73f170"}
|
||||
|
||||
#Black
|
||||
- type: entity
|
||||
parent: PaintBase
|
||||
id: SprayPaintBlack
|
||||
suffix: Black
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
layers:
|
||||
- state: spray
|
||||
map: ["Base"]
|
||||
- state: spray_cap_colors
|
||||
map: ["enum.OpenableVisuals.Layer"]
|
||||
color: "#3a3a3a"
|
||||
- type: Paint
|
||||
color: "#3a3a3a"
|
||||
- type: GenericVisualizer
|
||||
visuals:
|
||||
enum.OpenableVisuals.Opened:
|
||||
enum.OpenableVisuals.Layer:
|
||||
True: {state: "spray_colors" , color: "#3a3a3a"}
|
||||
False: {state: "spray_cap_colors" , color: "#3a3a3a"}
|
||||
|
||||
#Orange
|
||||
- type: entity
|
||||
parent: PaintBase
|
||||
id: SprayPaintOrange
|
||||
suffix: Orange
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
layers:
|
||||
- state: spray
|
||||
map: ["Base"]
|
||||
- state: spray_cap_colors
|
||||
map: ["enum.OpenableVisuals.Layer"]
|
||||
color: "#f6a44b"
|
||||
- type: Paint
|
||||
color: "#f6a44b"
|
||||
- type: GenericVisualizer
|
||||
visuals:
|
||||
enum.OpenableVisuals.Opened:
|
||||
enum.OpenableVisuals.Layer:
|
||||
True: {state: "spray_colors" , color: "#f6a44b"}
|
||||
False: {state: "spray_cap_colors" , color: "#f6a44b"}
|
||||
|
||||
#Purple
|
||||
- type: entity
|
||||
parent: PaintBase
|
||||
id: SprayPaintPurple
|
||||
suffix: Purple
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
layers:
|
||||
- state: spray
|
||||
map: ["Base"]
|
||||
- state: spray_cap_colors
|
||||
map: ["enum.OpenableVisuals.Layer"]
|
||||
color: "#c063f5"
|
||||
- type: Paint
|
||||
color: "#c063f5"
|
||||
- type: GenericVisualizer
|
||||
visuals:
|
||||
enum.OpenableVisuals.Opened:
|
||||
enum.OpenableVisuals.Layer:
|
||||
True: {state: "spray_colors" , color: "#c063f5"}
|
||||
False: {state: "spray_cap_colors" , color: "#c063f5"}
|
||||
|
||||
#White
|
||||
- type: entity
|
||||
parent: PaintBase
|
||||
id: SprayPaintWhite
|
||||
suffix: White
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Objects/Fun/spraycans.rsi
|
||||
layers:
|
||||
- state: spray
|
||||
map: ["Base"]
|
||||
- state: spray_cap_colors
|
||||
map: ["enum.OpenableVisuals.Layer"]
|
||||
color: "#f2f2f2"
|
||||
- type: Paint
|
||||
color: "#f2f2f2"
|
||||
- type: GenericVisualizer
|
||||
visuals:
|
||||
enum.OpenableVisuals.Opened:
|
||||
enum.OpenableVisuals.Layer:
|
||||
True: {state: "spray_colors" , color: "#f2f2f2"}
|
||||
False: {state: "spray_cap_colors" , color: "#f2f2f2"}
|
||||
@@ -15,7 +15,6 @@
|
||||
- type: Tag
|
||||
tags:
|
||||
- Sheet
|
||||
- NoPaint
|
||||
- type: Material
|
||||
- type: Damageable
|
||||
damageContainer: Inorganic
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
tags:
|
||||
- Sheet
|
||||
- Metal
|
||||
- NoPaint
|
||||
- type: Damageable
|
||||
damageContainer: Inorganic
|
||||
damageModifierSet: Metallic
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
- type: Tag
|
||||
tags:
|
||||
- Sheet
|
||||
- NoPaint
|
||||
- type: Damageable
|
||||
damageContainer: Inorganic
|
||||
- type: Destructible
|
||||
@@ -111,7 +110,6 @@
|
||||
- type: Tag
|
||||
tags:
|
||||
- Sheet
|
||||
- NoPaint
|
||||
|
||||
- type: entity
|
||||
parent: SheetPlasma
|
||||
@@ -134,7 +132,6 @@
|
||||
tags:
|
||||
- Plastic
|
||||
- Sheet
|
||||
- NoPaint
|
||||
- type: Material
|
||||
- type: PhysicalComposition
|
||||
materialComposition:
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
- type: Tag
|
||||
tags:
|
||||
- RawMaterial
|
||||
- NoPaint
|
||||
- type: Damageable
|
||||
damageContainer: Inorganic
|
||||
- type: Destructible
|
||||
|
||||
@@ -15,9 +15,6 @@
|
||||
Blunt: 5
|
||||
- type: Stack
|
||||
count: 1
|
||||
- type: Tag
|
||||
tags:
|
||||
- NoPaint
|
||||
- type: Damageable
|
||||
damageContainer: Inorganic
|
||||
- type: Destructible
|
||||
|
||||
@@ -62,7 +62,6 @@
|
||||
solution: soap
|
||||
- type: DeleteOnSolutionEmpty
|
||||
solution: soap
|
||||
- type: PaintRemover
|
||||
- type: FlavorProfile
|
||||
flavors:
|
||||
- clean
|
||||
|
||||
@@ -78,9 +78,6 @@
|
||||
malus: 0
|
||||
- type: Reflect
|
||||
enabled: false
|
||||
- type: Tag
|
||||
tags:
|
||||
- NoPaint
|
||||
- type: IgnitionSource
|
||||
temperature: 700
|
||||
|
||||
@@ -159,7 +156,6 @@
|
||||
- type: Tag
|
||||
tags:
|
||||
- Write
|
||||
- NoPaint
|
||||
- type: DisarmMalus
|
||||
malus: 0
|
||||
|
||||
|
||||
@@ -31,9 +31,6 @@
|
||||
sound:
|
||||
path: /Audio/Ambience/Objects/fireplace.ogg
|
||||
- type: AlwaysHot
|
||||
- type: Tag
|
||||
tags:
|
||||
- NoPaint
|
||||
|
||||
- type: entity
|
||||
id: LegionnaireBonfire
|
||||
|
||||
@@ -25,9 +25,6 @@
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: [ "Destruction" ]
|
||||
- type: Tag
|
||||
tags:
|
||||
- NoPaint
|
||||
|
||||
- type: entity
|
||||
id: HoloFan
|
||||
|
||||
@@ -92,9 +92,6 @@
|
||||
- type: GuideHelp
|
||||
guides:
|
||||
- Botany
|
||||
- type: Tag
|
||||
tags:
|
||||
- NoPaint
|
||||
|
||||
- type: entity
|
||||
parent: hydroponicsTray
|
||||
|
||||
@@ -911,9 +911,6 @@
|
||||
- type: Tag
|
||||
id: NoBlockAnchoring
|
||||
|
||||
- type: Tag
|
||||
id: NoPaint
|
||||
|
||||
- type: Tag
|
||||
id: NozzleBackTank
|
||||
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
version="1.1"
|
||||
id="svg834"
|
||||
sodipodi:docname="plus.svg"
|
||||
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs838" />
|
||||
<sodipodi:namedview
|
||||
id="namedview836"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:pageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="33.666667"
|
||||
inkscape:cx="11.985149"
|
||||
inkscape:cy="7.2475248"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1017"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg834" />
|
||||
<path
|
||||
d="M 22.69307,10.252475 H 13.806931 V 1.3663366 H 10.252475 V 10.252475 H 1.3663366 v 3.554455 h 8.8861384 v 8.886139 h 3.554456 V 13.80693 h 8.886139 z"
|
||||
id="path832"
|
||||
inkscape:label="path832"
|
||||
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke-width:0.888614" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 15 KiB |
@@ -1,2 +0,0 @@
|
||||
sample:
|
||||
filter: true
|
||||
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 20 KiB |
@@ -58,6 +58,9 @@
|
||||
{
|
||||
"name": "spray"
|
||||
},
|
||||
{
|
||||
"name": "spray_cap"
|
||||
},
|
||||
{
|
||||
"name": "spray_cap_colors"
|
||||
},
|
||||
@@ -67,22 +70,6 @@
|
||||
{
|
||||
"name": "equipped-BELT",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "clown-inhand-right",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "clown-inhand-left",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "spray-inhand-right",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "spray-inhand-left",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 21 KiB |
BIN
Resources/Textures/Objects/Fun/spraycans.rsi/spray_cap.png
Normal file
|
After Width: | Height: | Size: 246 B |