From 9c65f4b324bbda2b7b4bd8bd19efb2a10c6f4d10 Mon Sep 17 00:00:00 2001 From: Alex Evgrashin Date: Tue, 12 Apr 2022 02:21:15 +0300 Subject: [PATCH] Janitor cart (#7367) --- .../Components/ServerStorageComponent.cs | 29 +++- .../Storage/EntitySystems/ItemMapperSystem.cs | 36 +++-- .../Containers/ItemSlot/ItemSlotsComponent.cs | 7 + .../Containers/ItemSlot/ItemSlotsSystem.cs | 3 + .../Storage/Components/SharedMapLayerData.cs | 14 ++ .../Objects/Specific/Janitorial/janitor.yml | 128 +++++++++++++++++- Resources/Prototypes/tags.yml | 3 + .../Janitorial/janitorial_cart.rsi/cart.png | Bin 0 -> 2683 bytes .../janitorial_cart.rsi/cart_garbage.png | Bin 0 -> 497 bytes .../janitorial_cart.rsi/cart_mop.png | Bin 0 -> 457 bytes .../janitorial_cart.rsi/cart_replacer.png | Bin 0 -> 317 bytes .../janitorial_cart.rsi/cart_sign1.png | Bin 0 -> 156 bytes .../janitorial_cart.rsi/cart_sign2.png | Bin 0 -> 191 bytes .../janitorial_cart.rsi/cart_sign3.png | Bin 0 -> 202 bytes .../janitorial_cart.rsi/cart_sign4.png | Bin 0 -> 224 bytes .../janitorial_cart.rsi/cart_spray.png | Bin 0 -> 256 bytes .../janitorial_cart.rsi/cart_water_1.png | Bin 0 -> 682 bytes .../janitorial_cart.rsi/cart_water_2.png | Bin 0 -> 495 bytes .../janitorial_cart.rsi/cart_water_3.png | Bin 0 -> 803 bytes .../Janitorial/janitorial_cart.rsi/meta.json | 125 +++++++++++++++++ 20 files changed, 320 insertions(+), 25 deletions(-) create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_garbage.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_mop.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_replacer.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_sign1.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_sign2.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_sign3.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_sign4.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_spray.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_water_1.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_water_2.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_water_3.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/meta.json diff --git a/Content.Server/Storage/Components/ServerStorageComponent.cs b/Content.Server/Storage/Components/ServerStorageComponent.cs index 3a557b4e51..8c5014504f 100644 --- a/Content.Server/Storage/Components/ServerStorageComponent.cs +++ b/Content.Server/Storage/Components/ServerStorageComponent.cs @@ -71,6 +71,15 @@ namespace Content.Server.Storage.Components [DataField("whitelist")] private EntityWhitelist? _whitelist = null; + [DataField("blacklist")] + public EntityWhitelist? Blacklist = null; + + /// + /// If true, storage will show popup messages to the player after failed interactions. + /// Usually this is message that item doesn't fit inside container. + /// + [DataField("popup")] + public bool ShowPopup = true; private bool _storageInitialCalculated; public int StorageUsed; @@ -165,6 +174,11 @@ namespace Content.Server.Storage.Components return false; } + if (Blacklist != null && Blacklist.IsValid(entity)) + { + return false; + } + if (_entityManager.GetComponent(entity).Anchored) { return false; @@ -256,14 +270,14 @@ namespace Content.Server.Storage.Components if (!handSys.TryDrop(player, toInsert.Value, handsComp: hands)) { - Owner.PopupMessage(player, Loc.GetString("comp-storage-cant-insert")); + Popup(player, "comp-storage-cant-insert"); return false; } if (!Insert(toInsert.Value)) { handSys.PickupOrDrop(player, toInsert.Value, handsComp: hands); - Owner.PopupMessage(player, Loc.GetString("comp-storage-cant-insert")); + Popup(player, "comp-storage-cant-insert"); return false; } @@ -282,7 +296,7 @@ namespace Content.Server.Storage.Components if (!Insert(toInsert)) { - Owner.PopupMessage(player, Loc.GetString("comp-storage-cant-insert")); + Popup(player, "comp-storage-cant-insert"); return false; } return true; @@ -482,7 +496,7 @@ namespace Content.Server.Storage.Components return; } - if (!EntitySystem.Get().InRangeUnobstructed(player, Owner, popup: true)) + if (!EntitySystem.Get().InRangeUnobstructed(player, Owner, popup: ShowPopup)) { return; } @@ -638,6 +652,13 @@ namespace Content.Server.Storage.Components } } + private void Popup(EntityUid player, string message) + { + if (!ShowPopup) return; + + Owner.PopupMessage(player, Loc.GetString(message)); + } + private void PlaySoundCollection() { SoundSystem.Play(Filter.Pvs(Owner), StorageSoundCollection.GetSound(), Owner, AudioParams.Default); diff --git a/Content.Server/Storage/EntitySystems/ItemMapperSystem.cs b/Content.Server/Storage/EntitySystems/ItemMapperSystem.cs index 46d17fca1b..12344a1e25 100644 --- a/Content.Server/Storage/EntitySystems/ItemMapperSystem.cs +++ b/Content.Server/Storage/EntitySystems/ItemMapperSystem.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System.Collections.Generic; +using System.Linq; using Content.Server.Storage.Components; using Content.Shared.Storage.Components; using Content.Shared.Storage.EntitySystems; @@ -12,32 +13,27 @@ namespace Content.Server.Storage.EntitySystems [UsedImplicitly] public sealed class ItemMapperSystem : SharedItemMapperSystem { + [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + protected override bool TryGetLayers(ContainerModifiedMessage msg, ItemMapperComponent itemMapper, out IReadOnlyList showLayers) { - if (EntityManager.TryGetComponent(msg.Container.Owner, out ServerStorageComponent? component)) - { - var containedLayers = component.StoredEntities ?? new List(); - var list = new List(); - foreach (var mapLayerData in itemMapper.MapLayers.Values) - { - foreach (var entity in containedLayers) - { - if (mapLayerData.ServerWhitelist.IsValid(entity)) - { - list.Add(mapLayerData.Layer); - break; - } - } - } + var containedLayers = _containerSystem.GetAllContainers(msg.Container.Owner) + .SelectMany(cont => cont.ContainedEntities).ToArray(); - showLayers = list; - return true; + var list = new List(); + foreach (var mapLayerData in itemMapper.MapLayers.Values) + { + var count = containedLayers.Count(uid => mapLayerData.ServerWhitelist.IsValid(uid)); + if (count >= mapLayerData.MinCount && count <= mapLayerData.MaxCount) + { + list.Add(mapLayerData.Layer); + } } - showLayers = new List(); - return false; + showLayers = list; + return true; } } } diff --git a/Content.Shared/Containers/ItemSlot/ItemSlotsComponent.cs b/Content.Shared/Containers/ItemSlot/ItemSlotsComponent.cs index 0c193be5f7..ebe5971dd3 100644 --- a/Content.Shared/Containers/ItemSlot/ItemSlotsComponent.cs +++ b/Content.Shared/Containers/ItemSlot/ItemSlotsComponent.cs @@ -116,6 +116,13 @@ namespace Content.Shared.Containers.ItemSlots [ViewVariables(VVAccess.ReadWrite)] public bool Locked = false; + /// + /// Whether the item slots system will attempt to insert item from the user's hands into this slot when interacted with. + /// It doesn't block other insertion methods, like verbs. + /// + [DataField("insertOnInteract")] + public bool InsertOnInteract = true; + /// /// Whether the item slots system will attempt to eject this item to the user's hands when interacted with. /// diff --git a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs index 65c051dff4..bf461be347 100644 --- a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs +++ b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs @@ -170,6 +170,9 @@ namespace Content.Shared.Containers.ItemSlots foreach (var slot in itemSlots.Slots.Values) { + if (!slot.InsertOnInteract) + continue; + if (!CanInsert(uid, args.Used, slot, swap: slot.Swap, popup: args.User)) continue; diff --git a/Content.Shared/Storage/Components/SharedMapLayerData.cs b/Content.Shared/Storage/Components/SharedMapLayerData.cs index 048e0b02ce..604b106cb3 100644 --- a/Content.Shared/Storage/Components/SharedMapLayerData.cs +++ b/Content.Shared/Storage/Components/SharedMapLayerData.cs @@ -21,6 +21,20 @@ namespace Content.Shared.Storage.Components [DataField("whitelist", required: true, serverOnly: true)] public EntityWhitelist ServerWhitelist { get; set; } = new(); + + /// + /// Minimal amount of entities that are valid for whitelist. + /// If it's smaller than minimal amount, layer will be hidden. + /// + [DataField("minCount")] + public int MinCount = 1; + + /// + /// Max amount of entities that are valid for whitelist. + /// If it's bigger than max amount, layer will be hidden. + /// + [DataField("maxCount")] + public int MaxCount = int.MaxValue; } [Serializable, NetSerializable] diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index a31456d265..0666af8233 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -9,7 +9,7 @@ sprite: Objects/Specific/Janitorial/mop.rsi state: mop - type: Item - size: 10 + size: 15 sprite: Objects/Specific/Janitorial/mop.rsi - type: Absorbent - type: SolutionContainerManager @@ -74,3 +74,129 @@ state: caution - type: Item sprite: Objects/Specific/Janitorial/wet_floor_sign.rsi + size: 15 + - type: Tag + tags: + - WetFloorSign + +- type: entity + name: janitorial trolley + id: JanitorialTrolley + parent: BaseStructureDynamic + description: This is the alpha and omega of sanitation. + components: + - type: Sprite + netSync: false + noRot: true + sprite: Objects/Specific/Janitorial/janitorial_cart.rsi + layers: + - state: cart + - state: cart_water_1 + map: ["enum.SolutionContainerLayers.Fill"] + - type: Rotatable + - type: InteractionOutline + - type: Storage + popup: false + capacity: 80 + blacklist: # there is exclusive item slots for that + tags: + - Mop + - TrashBag + - type: ItemSlots + slots: + mop_slot: + name: Mop + whitelist: + tags: + - Mop + insertOnInteract: false # or it conflicts with bucket logic + trashbag_slot: + name: Bag + whitelist: + tags: + - TrashBag + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.3 + layer: + - SmallImpassable + mask: + - VaultImpassable + mass: 100 + - type: SolutionContainerManager + solutions: + bucket: + maxVol: 500 + reagents: + - ReagentId: Water + Quantity: 250 # half-full at roundstart to leave room for puddles + - type: DrainableSolution + solution: bucket + - type: RefillableSolution + solution: bucket + - type: Tag + tags: + - Wringer + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 200 + behaviors: + - !type:EmptyAllContainersBehaviour + - !type:DoActsBehavior + acts: ["Destruction"] + - !type:PlaySoundBehavior + sound: + path: /Audio/Effects/metalbreak.ogg + - type: ItemMapper + mapLayers: + cart_mop: + whitelist: + tags: + - Mop + cart_garbage: + whitelist: + tags: + - TrashBag + cart_replacer: + whitelist: + components: + - LightReplacer + cart_spray: + whitelist: + tags: + - Spray + cart_sign1: # this is like stack of floor signs + minCount: 1 + whitelist: + tags: + - WetFloorSign + cart_sign2: + minCount: 2 + whitelist: + tags: + - WetFloorSign + cart_sign3: + minCount: 3 + whitelist: + tags: + - WetFloorSign + cart_sign4: + minCount: 4 + whitelist: + tags: + - WetFloorSign + - type: Appearance + visuals: + - type: MappedItemVisualizer + sprite: Objects/Specific/Janitorial/janitorial_cart.rsi + - type: SolutionContainerVisualizer + maxFillLevels: 3 + fillBaseName: cart_water_ + changeColor: false diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index faa02344d3..75c37ff665 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -298,6 +298,9 @@ - type: Tag id: TrashBag +- type: Tag + id: WetFloorSign + - type: Tag id: Wall diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart.png new file mode 100644 index 0000000000000000000000000000000000000000..240bb4a061af273f3ac3d1acaebe1fad58f90c07 GIT binary patch literal 2683 zcmV->3WW8EP)n7z_p9{c(LSe%!~o zhICDppM z!m00Ek6?XpA@}zSzi1~8K@xBgrley+Q7HsPtAMFWjq2(&|J&zNBkoU2wAdQdTdD;k zN@^(9TdFrd2aw{{t*y`^4zamJtb>Nw2>LSmb)p|Y#8fyAg+Q&u_%>UCjj`@2sLNlO z0A;Hakpud>UuM6))=Z>Sm5OfJF0k)hPr*Ke18JB`LDm7PR1^`%K3D<+fR_A?QELs` z<{l&NPh-fRU&?;{vz;E<0~y&eXx{?_28dUI>^55g`}V@!CLmmv-G&6j`+&$}FOrIG zIZRb*z@L`va5n7Q*)}Be0FeV+rb^89zd`o)3@Q%3jyXjwr19vJgTTLAh-GJH_Y%n} z+6j`b0+zT>iCRgxPqw4)Tn}cj7mq$U2&Qzy3C)cS0Dz&9QNB#I#&$mLPow4ZaR3)2 z_1_msQ6V%pHehIE6hkAUyd#Q%vcr&qRp4HN>pTa}3E5?&_|hjuOX4#HWkO%Qn9c(P z4ydruz$fRirZ>a5Sg_z0z^>D>liw%jQDLDGDax!u#QkY}>fadue>#`j;h_(?C$fo> z15pG_?s}G3q0vx*NOBGl0Ir+=P-Kh{%I&rI&d+KkWs=DlK2I%ReKm=4do99ureS;7 z2^T_`l+iEifbh~PsF7|&8;`(csssSo9@GzM(bZHK{N&XElx<1hd= zy#`gLHEh*_I3Bx=h0m7|NapS?CgYn+z7P$8D$^3GOh8{BS&rZBb~C`*rVPtQ_LnrK zR*2fzby^}h*$&Y(&1Ygmp%9S+ifJPSYnHxw8GTA*AK(EV;HwRX!|~O)AyO=yPN%F) z(X%9XTSF9bh!NGCX9kz&|@)ls);xX2G_XzwITG4PSi+{Q$BrPDDq0RQ>GL9;k}c3*_Hq@t~zmz7LynK)Ke4JCNt? zvxke=jS;RqTb4vGXTzWejHyb^Gex!aY7BbP%%-!#4u^y3{!1>oSj^oY&d{xv-7I(q zh+Tv_)#*fVVZ#BOXAhAP#s7DR^^5z6rJRsh%K2=k2d6sQ@X9Nmf;yfIed4(EiVz-F z#17Xkd>NM-GgT3(AaekB3E@;{8~*t2M{KC+v>1!{5V-m#0w_Fx2eZ!YiTb0^ zg~w4geGTh#cO;j=lK2c3)h48Dbuf;-$LkQ)|I|-%>YBgF{`V1PVu**p^mO6f+Z)ka zaOt#|ETvH}!pk-u>5tDNwD$zcrg~(TL2IRpN!jYyHuOecyu3x+Z9+$WUE9KcB zL5gbGz|I0BH#j*Nu8kB(-YtaezVZ$*RjIMF^5Y!tO$Z$K#z7PHflh`6lcWHUOvaH) zD8DVFiTdDJPr+a?3FzENgJ;|SIAPdlGslv1fDrkZkJ!E+p^n}oT7NTi1Eo>rx#7i{ zcEqS^LEW0n|MAd`oN^`PDTh)3XgPfxgTK0f8SKT*N>)iW*Ty|(Gq2gW{jc8^%+jgV zHLS0%!W{Esv8G*V{{aBzfj=N>u0lzP20Bgdw+g0KfGoXne_E0K9CIuf0b=Ci^-l|B z^;11aY@?7^&#NfO{MoFqPW6Z$YsFAD)q{E4*Eb6C^>5R|IMsth{n1U?FX#YK@-Z*f zzlYj^b)6Q8Qfbz>L}QSw7i}ZMM%zo4;GlLC_=ePeKw=J%V_QR!JD}5EkftIso~lhzbm1nXZK{OrGk} zg~zd4Q41B9fUuI8(B@1B~4!j0KsSZFc;|k<5z=`-Qw4rhAs5t}x zDBu0GC|kVz*#|hbYd=Qs&R{Y=3(9*Q`<&(I6ESWdy^g`&*AQ(z0kukvW4rd_{qQ)j z`w%Z9$Oi9z8n>oCzzSUldxpUl>xUgcaxI1Am0tqLM1a}3kBL3@eJRKB;5tvr$~p`c z2qfoVz4|+JU%Cjd*NfiXUi9_#zZv0`*5hdC#N!(nWN2b)lo91HHYyg0iixt?26N zLieSMcPy42%HN z;w*>P>qSRL2fSYKEN`|NW{s^h&9MCb)`F&KhL+Lo pcDor)ZmZw#cDottJuuYq$S+Z+AGSNqNQ7rwI zBTI@gf&qZG_1hEM`+>b#IvqmjZm)O&+S&XFU{CVxReFMP=GQ!6FQD8A0JIq6u_GX* zguaGo0cx%2Yp4L|E8IaTh1&#PG!5<%iUOu5D0ge@0;VS@#%TewK>86tC&t($i|~l? zPylG-IGSM?NUpQ@K#~T%_hOF%i2#zLfJ6X_JN>Po3s7qnEda_((3sy{ueFLUYS09j zoi3%AoU_;)A?gv3yz?_?yRxTxKv5J$Q51!Qy>yGw007Y~GIW+5v|l(o|w*+I+)676i7 zJsC@#A=m_%rsL`SeUXPA5-;v*YWIF;{wIiGcO2005fzp2HM+0j|voQcA`- zM{Es)06AwdyKfA`J78-_!Z|({kp?-Z$6^HF5`p{(Y%#wWIYeNOfDnSsIkQcY*#%g# nhjBU@hpYzIs0fOpD8zgL@oL>Y9#2ry00000NkvXXu0mjfs(#jG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_mop.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_mop.png new file mode 100644 index 0000000000000000000000000000000000000000..4e08a5e388f00eb718a17450b5047d859bd70cab GIT binary patch literal 457 zcmV;)0XF`LP)(WvwJ6TyQ_Pr4B|sL7cNrp4eSyLP7U}7=};2F z&7a1Qq~zrLO+gXPJ@?*Y;2a>wba4ptzLVrG>%+JA?-2M+!hC%aorqKdri(*(zFYwS zqu~IaAG97+n=(&;=LZ-K2W`jlFESGl?Y!p)*sbigW2#+IJxe9v<=Kg!Umy1kh18Du z`V>ZskLsE!m4J`WulQLhWlhG8)mVfLOJ3#k<(hdCQVBS2XO^@YP*lt_Ye4cEblGlY z$F(ePLo*YwS=!dq!+oQ{wIx}{q-<;{TI=|}M=x}xYJfyh4LELRse;~%1OPog{y_da zfLN~U_G`gJL_|bHL_|cjkTf4~Q*RKEGapc?Hz;X7pi*zp{GkLl_XefR2UO|}N}3M< z{_YKynh!7=4PBtM4ku&BQcA_`u;khzy_ydw-5ZqHN4t4V=Kp4w+D&GxMZLk??(k-5 zcXl?&RNGp*bPCGq&3ph65fKp)5fKp)0RVmggN(*+3-m@900000NkvXXu0mjf&qc|0 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_replacer.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_replacer.png new file mode 100644 index 0000000000000000000000000000000000000000..c0b0d6c397bfca7dd03654f0578c46ca0c46e285 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU}W)haSW-L^Y)f4Uz3AC+rxte zJbXr~;s#<>qTI>3CL6y>1PJ&ixW81iXlXqeg(vX~GBBuV z`UZc0D^u9v)K*e{DXPU{(u&tVC&xFuPJO}kFSg@*frs(@=J$Rv#hbO(=*QVMeCPdP zIoDpo#ii_b^6Hm!yJJpm`Z6osXV0t$J5Q{ACDHSJdcq`?uRB()^0co7IuryBL_{vV z5cjemd|}sHx%#RO?`#RBWwys0RBmU)~w)^g`daurMAw?)>)vDS0)4u*I z+x+i^)v90D{^~YGY*v#{@~T(6I8Ad)S3P7_?n3^Lp83FEVWfdStm%-4aq Mp00i_>zopr04R)v<^TWy literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_sign1.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_sign1.png new file mode 100644 index 0000000000000000000000000000000000000000..0af6aa459d7862cf8dca0ce54ca43f9f70cb98e3 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=$(}BbAr*7p-aN?JU?9M9;PSL2 z#%Xzs8&xd54H^|%&g_|Pd*i(;P$2`uhQ77xG3!rEyHoh>D-&3R;Q-4k(V1IK_MUS; z5w+=S=>JstKq0}8Q>sI*uHW9qYq0t$J3~Y3UfJ71LZ52|tU!7^UHx3vIVCg!0Qp@u Awg3PC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_sign2.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_sign2.png new file mode 100644 index 0000000000000000000000000000000000000000..0eb81e760f20b9b748441342d1211b7708485701 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=ZJsWUAr*7p-ZbQEau8s>a8bBG zVE5J~A6|$|$$su=(U7*rX9dR$)3y(ByC?6TeBX}+sE2{!c;PK08{diE?`!Kj3u|1i z=brw%+_(E$;?9Qt*SYqrU^NU38^UCj=1WGlpIDQ6mG!4|r1!c1SraSs1dYCHeZMx* k{%l^{fqOFh7#J)znCo9vmNh>h-~rO<>FVdQ&MBb@0Ko7^8UO$Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_sign3.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_sign3.png new file mode 100644 index 0000000000000000000000000000000000000000..be6dbff9730c4cd69a4c1cbd3200963a68ab202f GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=6FprVLn`LHy}6P1kbwZ}g=S8p zj@<#v626FN`W{!1WJrl}5bIjHK;YxNl-T6j`RA7^12r))EXbO-_)3`9%cXgD)4QEd zKl7h1-6nFmq_?AEUH0j_LBWeFW4`TL{<#ih69{aGkXwAmYs&MeqW!nbD^J$0oV(HO uTVd~nS=IGFPp&DCmp%~p=Pv`pgMM3v;5QzsHEKN;AZ?zmelF{r5}E)a8BYfQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_sign4.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_sign4.png new file mode 100644 index 0000000000000000000000000000000000000000..5c749d4b0ed7792f078e7c00dcec85fdf03d1ef4 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=%ROBjLn`LHy=l#N$bg3-K)jHF zZ_?TxNsFrXzSPGGwhS6RIsq5uS19aNcReW(J#F$?L7*-M27?vv7u&3#a_MyCYpdrs z*7{!9HvNQU?V@SEA;o(8tMASU-ttyeNr|t$vU0o0>I>^;e%sr>{C_4`D^PRnb(fvf zG@PqnzB>B&)1|A;mh!*Vv*K;#sPivyVjd0#OumWUEj&d;C7dhPe067 S&NER3WP+!wpUXO@geCx9)>Vf9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_spray.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_spray.png new file mode 100644 index 0000000000000000000000000000000000000000..62af7e9836f16bc7ee78fa4b6e6eb297930371b3 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=$30yfLn`LHy=BPPh4svNck#@bwvFeFe#YiU-gQy+^sHRHaT`}ve$={jh9CE$zE<>Y xUbdsErs~JDoiz;)XFY!veW;!TWMISny$oj$r|PS-E^-I)Jzf1=);T3K0RSgVX%hed literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_water_1.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_water_1.png new file mode 100644 index 0000000000000000000000000000000000000000..371b6ccfb5b0da51670910d3abc5afcc79f879f5 GIT binary patch literal 682 zcmeAS@N?(olHy`uVBq!ia0vp^4M3d0!3HF+R#kZdDb50q$YKTtZeb8+WSBKa0w}1E z>=ES4z)+bp@bf>Ae#yX4YQVtoDuIE)Y6b&?c>bjLqizfgOa`7Vjv*Dd-rPMH z*z6$D_VDOJwtlmPy%~ZVIrrXd$yDl{p;qK0{JQaGhsP8FhlqLKr_7L?rjvhT{?vTU zq#nlCPu;`?7+4q>9T?!0_5vUMu0=2QPW;3jG`VEi1B>nr{BgkUFvI1htfm!;@yF+>+^q#N#G>35x<2qxG%NOSq za6iocwDR2X>K8Q|tbAFHN^ovaxYhRN*+*kR7N!OUmJ6(?uE4@eaol-L|DO6gvlO#M z`FHYO)VRGgH>h21&3tA;`}2aX*sG7jg4cfk{6QvZ^IHME?#h*nY!3?7sH}MYep#M% zr^U&ezGeloU(fE$NwB;wYc}ot8nz7{ElMAv7fw00#_X6@%sJ7lvwtOb7o2*g?TvKTpQ6U)tx{YakJ zzKvD>(*3&E*Z2LMF;DkS>y^6YIS+y|$`0&o*XiH*%3Wwd<%8QTck;U*ZGZSBig8x% wwzXA7R_~hTKSPd5gd-;0rxxz0nz6*>!42M@`=Xa>t=~A;e$$s~UrvyDp*OBr zoOt~C-gLt`|J1QgKq8px^ln$oMQ{V{``M5wzv7n!S|~Cb?<-K z9)DoIN~fXbQYBNFDW6r~`Gfmgxq)UetlKa{cJwTkppuo9tQ>zwf}; z7h=0YCbO+Pv%G)rnlq+9oVycVe4kMRvlvJx@SbDrn&IDnuzP8{&ar=mn@iu>FI}HF zEqY~rU;A;-{)?-3etx<3>A{T3IOmI7r?mxz{QR?h`o1g5>h|pt-}C0~KmT>J+}6{- zKAP9;X8w{jA>izn*V-j5yP={d!{|SI_>=bjUV!M izL@qejveBTn8(ZuUC+Ka##UGc67Y2Ob6Mw<&;$TP{Ovvf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_water_3.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_water_3.png new file mode 100644 index 0000000000000000000000000000000000000000..20298c57b086eccc2343b2c347909225a203499b GIT binary patch literal 803 zcmeAS@N?(olHy`uVBq!ia0vp^4M3d0!3HF+R#kZdDb50q$YKTtZeb8+WSBKa0w}1E z>=ES4z)+bp@bf>Ae#yX4YQVtoDuIE)Y6b&?c>bjLqizfgOe;NI978H@y}5g~ z@R5Un!^4T)5;Y}4E}J|Bj^4ZGxu!WnJ!#Sd520JlVbO;T0{%qUD%8GD2^Q&f^S52B zS$g?v?feZfaXgHS4h#YeEDT_(JJIyt#nQWH(wr55x+lJ{Ns_5xWAL_AK8}HNG>>(S6?Bd^jmZKSu-C-$31(us4xZzaunO!~kTo#2&Q9kUI%Qvt1A%2zZ-w(?@D<`S#KL7oO zXwg60MZX!(b*}!!a_!k6vD%;WHuBzHT%5_~vAg!wY3&W$vSgoce80~s`}@hQM{k9E zd_IeDofg0Srb=h0v(?@t9dRSzq;%D zft^2A|M7jgK44qk41=o)Th2LLWSV!nLI3%^Ew|4vPSV)Vbc{!!GG?pPsTDt-UX4#X zu$bq@Tr%v2jPD#Q2b55Q9;eK>s kgqm3s)>uh9bDxo6{}rQY|0h>$048t-Pgg&ebxsLQ02UTYzW@LL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/meta.json b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/meta.json new file mode 100644 index 0000000000..5d2fd5515d --- /dev/null +++ b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/meta.json @@ -0,0 +1,125 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", + "states": [ + { + "name": "cart", + "directions": 4 + }, + { + "name": "cart_garbage", + "directions": 4 + }, + { + "name": "cart_mop", + "directions": 4 + }, + { + "name": "cart_replacer", + "directions": 4 + }, + { + "name": "cart_sign1", + "directions": 4 + }, + { + "name": "cart_sign2", + "directions": 4 + }, + { + "name": "cart_sign3", + "directions": 4 + }, + { + "name": "cart_sign4", + "directions": 4 + }, + { + "name": "cart_spray", + "directions": 4 + }, + { + "name": "cart_water_1", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "cart_water_2", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "cart_water_3", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + } + ] +} \ No newline at end of file