From 626c8c51a181568f9dfeda4987a5e7cc0c6a45aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= <6766154+Zumorica@users.noreply.github.com> Date: Thu, 9 Jul 2020 17:00:37 +0200 Subject: [PATCH] Adds slippery items (#1321) * Start work on Slippery Component * Slips work * Add banana peel * Add required slip speed * Add slip sound * Adds soap * Make soapnt, soapsyndie and soapdeluxe inherit soap * Adds homemade soap and omega soap * Fix slipping not taking into account the entity being in a container --- .../Components/Movement/SlipperyComponent.cs | 115 ++++++++++++++++++ .../EntitySystems/SlipperySystem.cs | 26 ++++ Resources/Audio/Effects/slip.ogg | Bin 0 -> 4306 bytes .../Entities/Items/Consumables/food.yml | 18 +++ .../Entities/Items/Consumables/trash.yml | 13 ++ Resources/Prototypes/Entities/janitor.yml | 89 ++++++++++++++ .../Consumable/Food/banana.rsi/icon.png | Bin 0 -> 488 bytes .../Consumable/Food/banana.rsi/meta.json | 28 +++++ .../Consumable/Food/banana.rsi/peel.png | Bin 0 -> 445 bytes Resources/Textures/Objects/Fun/banana.png | Bin 575 -> 0 bytes Resources/Textures/Objects/Fun/bananapeel.png | Bin 527 -> 0 bytes .../Specific/Janitorial/soap.rsi/meta.json | 65 ++++++++++ .../Specific/Janitorial/soap.rsi/soap.png | Bin 0 -> 688 bytes .../Janitorial/soap.rsi/soapdeluxe.png | Bin 0 -> 573 bytes .../Specific/Janitorial/soap.rsi/soapgibs.png | Bin 0 -> 773 bytes .../Specific/Janitorial/soap.rsi/soapnt.png | Bin 0 -> 630 bytes .../Janitorial/soap.rsi/soapomega.png | Bin 0 -> 598 bytes .../Janitorial/soap.rsi/soapsyndie.png | Bin 0 -> 470 bytes 18 files changed, 354 insertions(+) create mode 100644 Content.Server/GameObjects/Components/Movement/SlipperyComponent.cs create mode 100644 Content.Server/GameObjects/EntitySystems/SlipperySystem.cs create mode 100644 Resources/Audio/Effects/slip.ogg create mode 100644 Resources/Textures/Objects/Consumable/Food/banana.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Food/banana.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Food/banana.rsi/peel.png delete mode 100644 Resources/Textures/Objects/Fun/banana.png delete mode 100644 Resources/Textures/Objects/Fun/bananapeel.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/soap.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soapdeluxe.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soapgibs.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soapnt.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soapomega.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soapsyndie.png diff --git a/Content.Server/GameObjects/Components/Movement/SlipperyComponent.cs b/Content.Server/GameObjects/Components/Movement/SlipperyComponent.cs new file mode 100644 index 0000000000..62f7aa3255 --- /dev/null +++ b/Content.Server/GameObjects/Components/Movement/SlipperyComponent.cs @@ -0,0 +1,115 @@ +using System.Collections.Generic; +using System.Timers; +using Content.Server.GameObjects.Components.Mobs; +using Content.Server.Throw; +using Content.Shared.Audio; +using Content.Shared.Physics; +using Robust.Server.GameObjects.EntitySystems; +using Robust.Shared.Containers; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Log; +using Robust.Shared.Map; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using Timer = Robust.Shared.Timers.Timer; + +namespace Content.Server.GameObjects.Components.Movement +{ + [RegisterComponent] + public class SlipperyComponent : Component, ICollideBehavior + { + [Dependency] private IEntityManager _entityManager = default!; + + public override string Name => "Slippery"; + + private List _slipped = new List(); + + /// + /// How many seconds the mob will be paralyzed for. + /// + [ViewVariables(VVAccess.ReadWrite)] + public float ParalyzeTime { get; set; } = 3f; + + /// + /// Percentage of shape intersection for a slip to occur. + /// + [ViewVariables(VVAccess.ReadWrite)] + public float IntersectPercentage { get; set; } = 0.3f; + + /// + /// Entities will only be slipped if their speed exceeds this limit. + /// + [ViewVariables(VVAccess.ReadWrite)] + public float RequiredSlipSpeed { get; set; } = 0f; + + /// + /// Path to the sound to be played when a mob slips. + /// + [ViewVariables] + public string SlipSound { get; set; } = "/Audio/Effects/slip.ogg"; + + public override void Initialize() + { + base.Initialize(); + var collidable = Owner.GetComponent(); + + collidable.Hard = false; + var shape = collidable.PhysicsShapes[0]; + shape.CollisionLayer |= (int) CollisionGroup.MobImpassable; + shape.CollisionMask = (int)CollisionGroup.None; + } + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + serializer.DataField(this, x => ParalyzeTime, "paralyzeTime", 3f); + serializer.DataField(this, x => IntersectPercentage, "intersectPercentage", 0.3f); + serializer.DataField(this, x => RequiredSlipSpeed, "requiredSlipSpeed", 0f); + serializer.DataField(this, x => SlipSound, "slipSound", "/Audio/Effects/slip.ogg"); + } + + public void CollideWith(IEntity collidedWith) + { + if (ContainerHelpers.IsInContainer(Owner) + || _slipped.Contains(collidedWith.Uid) + || !collidedWith.TryGetComponent(out StunnableComponent stun) + || !collidedWith.TryGetComponent(out ICollidableComponent otherBody) + || !collidedWith.TryGetComponent(out PhysicsComponent otherPhysics) + || !Owner.TryGetComponent(out ICollidableComponent body)) + return; + + if (otherPhysics.LinearVelocity.Length < RequiredSlipSpeed || stun.KnockedDown) + return; + + var percentage = otherBody.WorldAABB.IntersectPercentage(body.WorldAABB); + + if (percentage < IntersectPercentage) + return; + + stun.Paralyze(5f); + _slipped.Add(collidedWith.Uid); + + if(!string.IsNullOrEmpty(SlipSound)) + EntitySystem.Get().PlayFromEntity(SlipSound, Owner, AudioHelpers.WithVariation(0.2f)); + } + + public void Update(float frameTime) + { + foreach (var uid in _slipped.ToArray()) + { + if(!uid.IsValid() || !_entityManager.EntityExists(uid)) continue; + + var entity = _entityManager.GetEntity(uid); + var collidable = Owner.GetComponent(); + var otherCollidable = entity.GetComponent(); + + if (!collidable.WorldAABB.Intersects(otherCollidable.WorldAABB)) + _slipped.Remove(uid); + } + } + } +} diff --git a/Content.Server/GameObjects/EntitySystems/SlipperySystem.cs b/Content.Server/GameObjects/EntitySystems/SlipperySystem.cs new file mode 100644 index 0000000000..064e34ad92 --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/SlipperySystem.cs @@ -0,0 +1,26 @@ +using Content.Server.GameObjects.Components.Movement; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Systems; + +namespace Content.Server.GameObjects.EntitySystems +{ + public class SlipperySystem : EntitySystem + { + public override void Initialize() + { + base.Initialize(); + + EntityQuery = new TypeEntityQuery(typeof(SlipperyComponent)); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + foreach (var entity in RelevantEntities) + { + entity.GetComponent().Update(frameTime); + } + } + } +} diff --git a/Resources/Audio/Effects/slip.ogg b/Resources/Audio/Effects/slip.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2ac7e157e6a2bf82e2553a9069c117e77330b6a7 GIT binary patch literal 4306 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 literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/Entities/Items/Consumables/food.yml b/Resources/Prototypes/Entities/Items/Consumables/food.yml index af3c8ade0f..df87e17021 100644 --- a/Resources/Prototypes/Entities/Items/Consumables/food.yml +++ b/Resources/Prototypes/Entities/Items/Consumables/food.yml @@ -3027,3 +3027,21 @@ sprite: Objects/Consumable/Food/milkape.rsi - type: Icon sprite: Objects/Consumable/Food/milkape.rsi + +- type: entity + name: banana + parent: FoodBase + id: FoodBanana + description: Rich in potassium. + components: + - type: Food + trash: TrashBananaPeel + - type: Solution + contents: + reagents: + - ReagentId: chem.Nutriment + Quantity: 6 + - type: Sprite + sprite: Objects/Consumable/Food/banana.rsi + - type: Icon + sprite: Objects/Consumable/Food/banana.rsi diff --git a/Resources/Prototypes/Entities/Items/Consumables/trash.yml b/Resources/Prototypes/Entities/Items/Consumables/trash.yml index 31a6c07fda..462cbb9a6c 100644 --- a/Resources/Prototypes/Entities/Items/Consumables/trash.yml +++ b/Resources/Prototypes/Entities/Items/Consumables/trash.yml @@ -200,3 +200,16 @@ sprite: Objects/Consumable/Trash/waffles.rsi - type: Icon sprite: Objects/Consumable/Trash/waffles.rsi + +- type: entity + name: banana peel + parent: TrashBase + id: TrashBananaPeel + components: + - type: Sprite + sprite: Objects/Consumable/Food/banana.rsi + state: peel + - type: Icon + sprite: Objects/Consumable/Food/banana.rsi + state: peel + - type: Slippery diff --git a/Resources/Prototypes/Entities/janitor.yml b/Resources/Prototypes/Entities/janitor.yml index 5f5fbf172d..152a1a35e9 100644 --- a/Resources/Prototypes/Entities/janitor.yml +++ b/Resources/Prototypes/Entities/janitor.yml @@ -104,3 +104,92 @@ - type: Item sprite: Objects/Specific/Janitorial/wet_floor_sign.rsi +- type: entity + name: soap + id: Soap + parent: BaseItem + description: A cheap bar of soap. Doesn't smell. + components: + - type: Sprite + sprite: Objects/Specific/Janitorial/soap.rsi + state: soap + + - type: Icon + sprite: Objects/Specific/Janitorial/soap.rsi + state: soap + + - type: Item + sprite: Objects/Specific/Janitorial/soap.rsi + + - type: Slippery + paralyzeTime: 2.5 + + +- type: entity + name: soap + id: SoapNT + parent: Soap + description: A Nanotrasen brand bar of soap. Smells of phoron. + components: + - type: Sprite + state: soapnt + + - type: Icon + state: soapnt + +- type: entity + name: soap + id: SoapDeluxe + parent: Soap + description: A deluxe Waffle Co. brand bar of soap. Smells of condoms. + components: + - type: Sprite + state: soapdeluxe + + - type: Icon + state: soapdeluxe + +- type: entity + name: soap + id: SoapSyndie + parent: Soap + description: An untrustworthy bar of soap. Smells of fear. + components: + - type: Sprite + state: soapsyndie + + - type: Icon + state: soapsyndie + + - type: Slippery + paralyzeTime: 5 + +- type: entity + name: soap + id: SoapHomemade + parent: Soap + description: A homemade bar of soap. Smells of... well.... + components: + - type: Sprite + state: soapgibs + + - type: Icon + state: soapgibs + + - type: Slippery + paralyzeTime: 2 + +- type: entity + name: omega soap + id: SoapOmega + parent: Soap + description: The most advanced soap known to mankind. Smells of bluespace. + components: + - type: Sprite + state: soapomega + + - type: Icon + state: soapomega + + - type: Slippery + paralyzeTime: 7 diff --git a/Resources/Textures/Objects/Consumable/Food/banana.rsi/icon.png b/Resources/Textures/Objects/Consumable/Food/banana.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fc117d86231d99aa1c046be56875aa44e63ad04e GIT binary patch literal 488 zcmVP)F|9LGQVc6Z!q-9Kb1N{N|>5rSfeNW|j~6jac?o7>fJ>lET4=-^4uouiY&)@?yZ zi*&^ff`Q?Nn~5T=w7Ts0c4l9f?#|exhvsvA@Auw^FZ{mXyK1>cK~S}Q8{X(uvz3nbmY(J+P@L_`sIzH{vA=@A=&nmrTiKL{f%5| zZe{VkB)}369_~BZf)g(-E<9F;zvfZun2Sv<)Ga{Slq)vT*ky)pzr(hhsa9=@TZe2G zI=Od$!|{5bm_RP~k(9AVr5q-nFwylWrYRY`RU{bPKye)r)F^yg=f{rj>T_^WL{G-9 zshfk_#NuJBdWd9PB7|gbH^S;l6ECN>PE~5Ih9)O^Rf8@tO`T+-3}{%j9>$-}de*2u eK0ZGGAHMu;fwz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/banana.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/banana.rsi/meta.json new file mode 100644 index 0000000000..2374895ce2 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Food/banana.rsi/meta.json @@ -0,0 +1,28 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA 3.0", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "peel", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Food/banana.rsi/peel.png b/Resources/Textures/Objects/Consumable/Food/banana.rsi/peel.png new file mode 100644 index 0000000000000000000000000000000000000000..46bd5c09796a77b690585a2b2707c6d0c29c45fb GIT binary patch literal 445 zcmV;u0Yd(XP)*iC~qq+L5xk}*7PYTJX4agh4F&hOsu*YkkEU@#b-E1}MiJhcPepF^@1pL{wI z$LW{vj#s9qoAZ{ibc4y=f&WHo-(2wa9e91&eE0PQ&i-VHMSJcfwi9!5o^_#I7B2(- zf3i!<_1YiN7Rcpp2-diXMf(IG{X4>9WC2TFAf(yY7`z*8Z@VNO|Dq+KEztU5R{h+) zCRlTWv(h8BAHv}@{-O#B3TjEEq5#C4u%t78aeE52dX=sKz~1IpIXQJv7En~z&4Sgy zN+gNL_mQ2=b-cElvhqrVAAIUM*6O}DG(OfO9q&`TuBt>Si|XJ$F1H^=fJ9=8Uq?1R zPa6lx9h3!##kbx)?ZdQ!!$U!7Z8^j)vMDXjk~zC(b@dffGsy>iFmC~XiLrVSRY++` nhTK&nBct<=9yb^a1_Qt?P@#JN+Sv5l00000NkvXXu0mjf0P4}g literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Fun/banana.png b/Resources/Textures/Objects/Fun/banana.png deleted file mode 100644 index df4c416e9586304e7b634d751f028ccf42651734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 575 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkQ1EkrPlzj!_Hg&`@%A`(rnR#x^~qz8Q>W5TpH8o@W9jZT{P;4ivWoZP zCxuCqwSRs~tZ!iY_Dy}u7S$6+YgevR`Sz9R<44U!i_NyJOfq#>m5HXuxF>}wX1sf?^#~I zX7KZ;(4RkCfB$Oz{cCXH0^8PY{6&Sz%a*Wj-o&$hgTVfMTn7)ZtXjcSQ6k@1uhG$= z)zDx(pMLuj zuV1jD!#T_|(lyjK);UeK@{oCO|{#S9GG z!XV7ZFl&wkQ1C{8Plzj!_Hg&`@%A`(ruFpc^s}egySoh^-p>5^GVaYA_DPeqFPuz1 zbtvKb<%Q24C%%2pxpKMb-hCQpjwZf+o^t9?>WKphixvsJemIbXjho;eeK z>JU&i`Sjt0i>DI4ePjOlOK06$pPf7PPMr>U_Dt}?#iaXJV{cta{PUaP&tI+md$^Ar z@tZeOe(56R?b~g(ZI@`M*W0sG^x9Ru>(>l^{uKK2SLW|ug9{hfwr=C!yW4fa9QlRw zx&A7*a7OIYEMznOTB!RYH>5f`-*J03iEa%g44?DodS>HYBxCq#~{ za`1>~aSZW^ahlZV=q0t9OES{3lGRl;l}$9%bPd-PS5uR%TS`m5e&OA4LP|<<_KaCG zqa&gsZ{J9|nxFpu!HXw7m$@AtJbLx4&%aJ2fQ><1gG)$S@cCn)I~Y7&{an^LB{Ts5 Ddc_Z~ diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/meta.json b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/meta.json new file mode 100644 index 0000000000..73934a51bf --- /dev/null +++ b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/meta.json @@ -0,0 +1,65 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA 3.0", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at a407fc1f5c25cbce8b653c553f53be294d15b071 and https://github.com/tgstation/tgstation at 259acc8c81054d89f7b6bcd9ff702fdf587a19ed. soapomega.png modified by Zumorica", + "states": [ + { + "name": "soap", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "soapdeluxe", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "soapgibs", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "soapnt", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "soapomega", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "soapsyndie", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soap.png new file mode 100644 index 0000000000000000000000000000000000000000..3f82c55990a2097c7f104f1dc177680173a9cbf4 GIT binary patch literal 688 zcmV;h0#E&kP)uilkf9WW*2I6H(vTpA{Nk?G z5(*g)5*;04B}%#pibDzkp_bR_J?_Ul*DUv0?%nt2=ktB<-T^LLxNz~nSX$&vmQw@( z1W_>A=d(FmTYXl{XLAUmfU}KbZZB>&ZM^gDGp6@bW*bw9oFcSw zzE+iY9kwprb)+crs8GXwyZjU=dgddiViR3{}^Vh{W;n zpp1&Ti?8p$;Cj?ULCHbYHB{7H6qKB;ASEY=0#+Wc003gXC{$fzpQ5U3>?>I2B~vuJ zEi_68P$U_je(oUT4Wij?L6Kw>lpIsPnJqDuRJ9_>*t^^Z0QR)j2RK)8x|$)h2%U%% zco&b;WyDj@B|u3S)mT|mwE>Ucv^M&zpkl07@xq@GB|_n(mb@?P)(Ql)lV{0xgCOD}NGS-qg^H7li|E*; zaO1gl@CL~Vp>RVRxQZDfgi;6j!k6Uhfq$S&o+;%0-uHRlC*S)9DpaUYVa>R7QLyiI zmj8?BiT_^9b@d|R?&D`9-=kbC3Il}g5QV{?YFO%olmzs>&QcN&UcOjS>qz@HNf&Hh zyP}P?+`UYQDk7&wl269R3`a-Yys-m-VHnvNQ&<4h-8SdJICEt4x?nOs24Egdv$OMP zN*u?0`8J{D?jdZ4cW>WhPLv!_EjJ7!BUDj$+w=|(0O)!i1K-b{qcF(j=<-!$4ivk; z(`;Z03t>CdoF-pKA9Cc|TN?n(e*DZmOA*Dqc{Jto_@v~*_iht~ z0bS1{Nf(@+&9G`Fr)M*gbV1ki0JM3lpdCXgMiy!8-lDOakI8SZlFJ5kdGcZwQJMld zF6up41z|f3d_PC7gZlkt?UhrYE}1xvOU2}9nZnAPkmu$5V#jJ7VLPaMq_iIUUT68> z;Ul6jU^vn*oWFstd#wN|0zeA+t@@wVaMnz56|engRG~tJ3TwwNtIrqFysn7}00000 LNkvXXu0mjfo`eo? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soapgibs.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soapgibs.png new file mode 100644 index 0000000000000000000000000000000000000000..5640e0e83668aa16f816384a33446bf6de3f4390 GIT binary patch literal 773 zcmV+g1N!`lP)NNmOs$22OFqkSFZ`bG^L<_p`t<43=aF&T_i}S8 zX#TH2Ye)H>v7X)+_|2!!T%Vtd=e0rskE(WDAIc_CvzL%N0yd|DrWN?>`*#lx@HZw_ zR)r9|hz>PY@XFyK=~$HKFJ1!h%;N#TRm=k5)^pUg5QY*apNtcnSpvX3-ba!o3?(eS zH!bh5^g;w&N8Q$aUE>qQv)cz2z#+8i|ZR5@t$;NZ?EfVMn`WnNequL zDfdErcdH(Hl)tr3#7R5zOgj3?+=?U|XD3ZFzxqA1$tLh&~en ztnBTKMl=94$w{hIVQxM`aAt|R7Q$7`;u}1}P{NFrPtYVM3zrv6%6^QUFSv?X+Hb=SUAv4&oQ*PdA)#{*+-L{$U9r`>MgEfmbv)|rIr_xam?d=jPY53wj-^!V<(am zy;N!UMls8f8X(^zhHzl*DDOzeqT)rh<>jhSW;CMV7@wuCg@lcJyBXx2Em8a7Kmgz1 z8CQie^3E1|qlsgDmW9g;F%@kbUQ(92LY~YHS)>07(+XE*5l?>&|F;KpjIegcjRBNoUvmqB762d z1y~{gEFs;hfjjHi`sPpT*-EB+6+imVs863heIA|P@&->C1s`j*00000NkvXXu0mjf D^a5QX literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soapnt.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soapnt.png new file mode 100644 index 0000000000000000000000000000000000000000..1f02e35820e33a2f1ecdb7fdac0645d0c7fdfd79 GIT binary patch literal 630 zcmV-+0*U>JP)&6o$Wq;!c7%vzg6ILTFZjh{Pu_1HOUaCW|1VHV~u~6tie)pp;T*lMp0}ZVG*a z!k8zBh(cDH(2fw?s0?LxZtSAm%ZyGF0s%MkZ)UjnocaI%oO|v-h!7z{EEy{gZI%kv z*>e${U7Q4Ry?BWD^_y2Xjw{y(_7L6Be9tFf79?arK&eoj3F40*zCMM3>2yjY5((Vf zGfgSPE5fHnkas&hnwG`p=1Tyg(I^1fT!tUte*&PWamJ$w*<6Mz>zbX!7K*yYZU3HF zEQ;f}4D2D}(FE6Zxx4GLXPW4S#%1H1ti(bEyd@XpiW(wbO1KsPkfW{TwQw$Ii1X#+)#`=gF%*tOl2@4HxU^e0QUrja zuA!)LSwY><7V_Jzn?N4fg0qX0m8N9@|3*giOC-i(QJJKuaR&B~TD=0mZU3I}XyS_z z#9|UUowgjsre(<~@SOpnUf}mHTlTKo>G=-Ucr@{?DQcWV!Z07*qoM6N<$f>lu~TL1t6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soapomega.png b/Resources/Textures/Objects/Specific/Janitorial/soap.rsi/soapomega.png new file mode 100644 index 0000000000000000000000000000000000000000..06bb48131b90c16c0a619ea3240cd6d8b25ddcb9 GIT binary patch literal 598 zcmV-c0;&CpP)rIWR@sfHZNIOvO9l+zY%sXtSs5GMP5LOKq^@5yXRVNDM$&x<-#!AD8UI=*VeXh{#o5-8jR(-1&B3(qVwbPHULT> z5vpkx=24Al6w;6tVYR+~BX3r2&>zxm>V#)8wmB3K^?l@d=f0Ds^KDbc^G4z~y8nUa zjd-pnOrx;yuI&tW?w`v*dGuM$0UpN_8nS}tjX3)9iGzmB;u&gn_&trd|N5Oyr^Pf1 zd4KqBBY?6j?96~|rp}eM<^niq$N(bZY@L_ytegw!pg61j3IIxQvN8@N3^T?KBt!$} zG@m~Kh}viCytK1elwy5CN&!OkW@Wr2H`EwoIfhwUwbmhbw+|$<1b}3gaCiHF_W48M zJ>QYgmbTh@CN=>sYPLBfRBz~>>J0j6^VoreZ5HYM(HMZ)5+J+!-+lt{l+;89vhof3 zL%OFrmgN>kaqkouYD}+}{(l@#0B9Y3q|<33%QDj_M3!Z758&4%T=h+^e3s>6nC-&; zr3X<@*FlG?>yqOChmOzNg)?9aKnei}S|yOcO^;;7kVT8rax2KKHmGke`x_64u|8#jP7m9IPRWRNaVS-*4w?pU+XoFO{3P^s)EN@Z+sL9 zbT%Oa0Wyv|D*U}#JzM|)eorU7PbSvAh;t=G7tvEg#rH*lO_t$vJ_i6yJ?~#aOpa}f zpWO}-=kORqDy4E_-~d^k2!W~ZpjNK;(QiV4Ya-L@Aw3kY$gqrKX^~g3^cKa6S4-8#HDyk>f9WnQ4P9t4I%C9qc z9%USN`Y-ue*t)k0AQ8azN|~ww44z|(x%E6#Gv-tL@;@Vo!{K;2e