From 74b61438c4ca4bae765193d5cf45b4c9d2136665 Mon Sep 17 00:00:00 2001 From: Kara Dinyes Date: Sat, 17 Jul 2021 21:21:36 -0700 Subject: [PATCH 01/83] first windoor commit --- .../Doors/Components/AirlockComponent.cs | 2 +- .../Entities/Structures/Doors/windoor.yml | 44 ++++++++++++++++++ .../Structures/Doors/windoor.rsi/left.png | Bin 0 -> 843 bytes .../Doors/windoor.rsi/left_assembly1.png | Bin 0 -> 907 bytes .../Doors/windoor.rsi/left_assembly2.png | Bin 0 -> 1031 bytes .../Doors/windoor.rsi/left_closing.png | Bin 0 -> 2458 bytes .../Doors/windoor.rsi/left_deny.png | Bin 0 -> 1281 bytes .../Doors/windoor.rsi/left_open.png | Bin 0 -> 728 bytes .../Doors/windoor.rsi/left_opening.png | Bin 0 -> 2474 bytes .../Doors/windoor.rsi/left_secure.png | Bin 0 -> 1031 bytes .../windoor.rsi/left_secure_assembly1.png | Bin 0 -> 1217 bytes .../windoor.rsi/left_secure_assembly2.png | Bin 0 -> 1485 bytes .../Doors/windoor.rsi/left_secure_closing.png | Bin 0 -> 2956 bytes .../Doors/windoor.rsi/left_secure_open.png | Bin 0 -> 1050 bytes .../Doors/windoor.rsi/left_secure_opening.png | Bin 0 -> 2998 bytes .../Doors/windoor.rsi/left_secure_spark.png | Bin 0 -> 2673 bytes .../Doors/windoor.rsi/left_spark.png | Bin 0 -> 2469 bytes .../Doors/windoor.rsi/leftsecure_deny.png | Bin 0 -> 1448 bytes .../Structures/Doors/windoor.rsi/meta.json | 1 + .../Structures/Doors/windoor.rsi/right.png | Bin 0 -> 884 bytes .../Doors/windoor.rsi/right_assembly1.png | Bin 0 -> 917 bytes .../Doors/windoor.rsi/right_assembly2.png | Bin 0 -> 1024 bytes .../Doors/windoor.rsi/right_closing.png | Bin 0 -> 2504 bytes .../Doors/windoor.rsi/right_deny.png | Bin 0 -> 1291 bytes .../Doors/windoor.rsi/right_open.png | Bin 0 -> 733 bytes .../Doors/windoor.rsi/right_opening.png | Bin 0 -> 2494 bytes .../Doors/windoor.rsi/right_secure.png | Bin 0 -> 1050 bytes .../windoor.rsi/right_secure_assembly1.png | Bin 0 -> 1234 bytes .../windoor.rsi/right_secure_assembly2.png | Bin 0 -> 1491 bytes .../windoor.rsi/right_secure_closing.png | Bin 0 -> 2997 bytes .../Doors/windoor.rsi/right_secure_deny.png | Bin 0 -> 1428 bytes .../Doors/windoor.rsi/right_secure_open.png | Bin 0 -> 1055 bytes .../windoor.rsi/right_secure_opening.png | Bin 0 -> 3019 bytes .../Doors/windoor.rsi/right_secure_spark.png | Bin 0 -> 2661 bytes .../Doors/windoor.rsi/right_spark.png | Bin 0 -> 2435 bytes 35 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 Resources/Prototypes/Entities/Structures/Doors/windoor.yml create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left_assembly1.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left_assembly2.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left_closing.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left_deny.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left_open.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left_opening.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left_secure.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left_secure_assembly1.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left_secure_assembly2.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left_secure_closing.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left_secure_open.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left_secure_opening.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left_secure_spark.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/left_spark.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/leftsecure_deny.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/meta.json create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_assembly1.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_assembly2.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_closing.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_deny.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_open.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_opening.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure_assembly1.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure_assembly2.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure_closing.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure_deny.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure_open.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure_opening.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure_spark.png create mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_spark.png diff --git a/Content.Server/Doors/Components/AirlockComponent.cs b/Content.Server/Doors/Components/AirlockComponent.cs index ae59d4a65c..ff581f5363 100644 --- a/Content.Server/Doors/Components/AirlockComponent.cs +++ b/Content.Server/Doors/Components/AirlockComponent.cs @@ -169,7 +169,7 @@ namespace Content.Server.Doors.Components { if (IsBolted()) { - Owner.PopupMessage(eventArgs.User, Loc.GetString("airlock-component-cannot-pry-is-bolted-message ")); + Owner.PopupMessage(eventArgs.User, Loc.GetString("airlock-component-cannot-pry-is-bolted-message")); return false; } if (IsPowered()) diff --git a/Resources/Prototypes/Entities/Structures/Doors/windoor.yml b/Resources/Prototypes/Entities/Structures/Doors/windoor.yml new file mode 100644 index 0000000000..c35ced8081 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Doors/windoor.yml @@ -0,0 +1,44 @@ +- type: entity + id: Windoor + parent: BaseStructure + name: windoor + description: It's a window and a sliding door. Wow! + placement: + mode: SnapgridCenter + components: + - type: InteractionOutline + - type: Sprite + netsync: false + drawdepth: Mobs + sprite: Structures/Doors/windoor.rsi + state: left + - type: Physics + fixtures: + - shape: + !type:PhysShapeAabb + bounds: "-0.5, -0.5, -0.3, 0.5" # i don't understand why these bounds work but they do + mass: 100 + mask: + - MobImpassable + layer: + - Opaque + - Impassable + - MobImpassable + - VaultImpassable + - SmallImpassable + - type: ApcPowerReceiver + - type: Damageable + resistances: glassResistances + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 200 + behaviors: + - !type:SpawnEntitiesBehavior + spawn: + ShardGlass: + min: 1 + max: 2 + - !type:DoActsBehavior + acts: [ "Destruction" ] diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left.png b/Resources/Textures/Structures/Doors/windoor.rsi/left.png new file mode 100644 index 0000000000000000000000000000000000000000..fe1f75ba132f65c83fff05545a3b62fdf91f781d GIT binary patch literal 843 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|V1v zPZ!6KiaBqiHf9S4%KTee9ojqh_x+G=wy1S#hVr~92adPCn3Yw!k zW90^ieII=jFHm?>VQ{djZXKbDxd9dWKMddzq&iSd)Bgx>Bk@XADF)NsngDwdubcF z=ggm7oV-!u=;OjwSF@&^O!*<45E-U2)obI+H8*>H$miaE=FgDt!Q@eZ53guTR*B%TcftFS-GK?GiU3K z+zAB}i#NPkU^Bsfi_X`&r*}`!y;hc3o_;-AY<-wqg=N!Gv6D{}T8i1WMXjk-ad2Tc zwV3%+`l97`&xRc??)qNE*_6-zx{Gy&K*Q5kndT$y`rRGrd+f_E{7bjL^mTIcXGgQy zU-`Tfn>iUz=vt((iat1RSywbo&VK!#ii+xqM{msd$NfXS^X{?xVk*mTzcrE+4rcl@ znI~^+T~UMl*=2_wsW;AMYU0pp5Z$4v(6RUgr||z?CWeKg4|v^DSWn0(RPjyV!h`}2 zjO~sZtTJq_<j=HFSnDXgLSS80Jmdp>%&n3Tw})q+^;4;ZII2dCoB9=mH}ZiZsA($ZDt6w(fRu}dHxTM&el76tG2 z(nHO`e;|VNM~KuO^ic0TNMdplswmPz*w&M{u{E^_&5}d0HfFo-8?s?ZVk(lIS$5~U zOg6hPd0)Qy-kX^n0-P~7JA3kMW#vnyQi)GZPmi(gpF07Wg{7A-Hugr24x7>xhyJ+} zu>EFjUXmmjyKvc3!<^A*{Dw&63=E>R(eF9#1n7DVn$0E*4UfXsmI_1BDEvA;X4Y~i zAQp=QDq#5Bd6=A3V2}# zWrN;eL%)l^IK9qhXUtNm7;?LR?gZG#0fd$TOlYWnFl zv6fb%VwzLe?^c~DrIV#22T_POjQj#m!wR9u-iX?t^#oc!6oT* zIt{w60}Y<>q9kvS%DCD^gGs1ggf;Whp8xuDAJy)$(fhWlI zn|D{E5p(3|@Tc_jQT`6=AHX}!kj>|h@7dea5I~T8p%6|a60UZlD2iFH*8vR|JqL#! zDi6sw3k6z>;Lb355Dvq9Ax|?AixkOZE}*I^O||GXXt>zoutViRi+uD1G)AX)uz>3X zV1IMr%ER&ME_`04Gih(w7Qw;xw5D zS^>WG04Ib82n7fQ2n7fQ2n7fQ2n7fQ2n7fQblnS-0(v1(3h0H1@PKXwuy{koyB;9R zhVPEd{BIWMe0^t-@TLMBZ>reAyEPoRE8y+=`oZg+=KG1SpCO*UMYqi+K5fIOq8Q7n z3T_{w;;w*XGFdxY+cOS+e1rY{?=U`okshSPvxGSYuMcon!2QL=E189*4~AjTLzLL! hMk*ep#9d{#@dtbV0@0c%nC$=n002ovPDHLkV1l20iOT>0 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_assembly2.png b/Resources/Textures/Structures/Doors/windoor.rsi/left_assembly2.png new file mode 100644 index 0000000000000000000000000000000000000000..668997d837e91118912e1c4501ead63182c425f3 GIT binary patch literal 1031 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_open.png b/Resources/Textures/Structures/Doors/windoor.rsi/left_open.png new file mode 100644 index 0000000000000000000000000000000000000000..2089729a6adc2cab09a77a554e8c61086070abf9 GIT binary patch literal 728 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 B&%^)# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_secure_assembly1.png b/Resources/Textures/Structures/Doors/windoor.rsi/left_secure_assembly1.png new file mode 100644 index 0000000000000000000000000000000000000000..7d9ec61ecc00f030d54bb594f21d85c5866bee5c GIT binary patch literal 1217 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_secure_open.png b/Resources/Textures/Structures/Doors/windoor.rsi/left_secure_open.png new file mode 100644 index 0000000000000000000000000000000000000000..b583cf7fe0e2ab0236698470caaab05a099f7d6d GIT binary patch literal 1050 zcmV+#1m*jQP)%7KP9sZK4(}3$17|WV9&S$g~qdly)*UzM+hq5i$Ioaq_$Q;w35tzISEb z{Wf>b<-(o&y>q{F?mh2mkPKbdGcK2Fd}3mvD#!Dw4nM@#+O2Lze;``K;=<6FFM(j%zi%Uz$&&#v4l}>=qS0bK# zdVd*854n-i@^Jdp89eLlL2j-`JSi(%=>!z)@lpfC@5fJGh<0&t9v?s4a)t)n?QVw= z1)_stug~X0?_e06lap@U800=G8Y^t+1o-`aS0E6`6crVrxVRW2BO?d~gKz<>cFZrG z03sHPxy*Jn8ntciT|t0MC<5ScC<5ScC<5ScC<5ScC<5ScC<5ScC<5Sc2m*`?31W0~ zR9r}`oylEr05o%9A`}XF>+9>0OeT>5a_sm6cHR7J1hhFV4&3NAH=+m4<`@-u$F z+h0+UrXY@ujlyX4c-(DAh_pNtWRgV>W2j}cq2N+;xb4`_G29YO%{PTGQX9k;S@#mF zVL1WJFuA>$XHZ}nZ78?|`wy&-qaZRWu(cDmoCTO+GRb0|!BER+L%}sPhhoT=84M4g zt-~HzP5{pqOs@$hSp+?S(Z-Cd^#C5Mc(!1A%?y)C7V`{-S_4_F0X$WTgVoyEg6TCg zOeR^(Gt9`%W(^>?uNmTuMVj|{R%?J6T%57U&5+d|zr$}VFRr8?#`2fnw%SF+o>rw~GJKJWuy1Kkp|1aqt zP*qixn9}23dcaCa@Q)|3e|B~@dkEM{12UORHS2_Y^4gl{v88>ayS;kj=X6%!7ZOvl UucH5vB>(^b07*qoM6N<$f|W+rRR910 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_secure_opening.png b/Resources/Textures/Structures/Doors/windoor.rsi/left_secure_opening.png new file mode 100644 index 0000000000000000000000000000000000000000..e162ef9d399b9b20f8cf44586ffaae6ce2ed76c0 GIT binary patch literal 2998 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_spark.png b/Resources/Textures/Structures/Doors/windoor.rsi/left_spark.png new file mode 100644 index 0000000000000000000000000000000000000000..d95187f082b998a361f8f2beece2e6a5f306d10b GIT binary patch literal 2469 zcmbuBdpOkF8pn;9%BV4Fq+)AEhjGbvon&g~H)(|9G7W80)S*!kiG!k;i*7CzBFTLu zj1;;Uq)>8+%(xE`mAgTkjNzxB*<(NFIe(t>$NuAezt39h^R9P2&-y;=SusbPY*317 zigI#tC_7uSvrIW_p|D<-Zwb7Al?gJ?_IR+IoYMQXfFr5E%uC8wULT_o#h|BAo zoKw$vyq+hOulqMCDWx?uG<+BvJDZ!ws!!hL(38Q4tYi)YtsBB6-tj3ZZa6TTwRo`$ z{4NHv4mhp8I@dDm4Wb{^+pjwJf%B`|ZhKs6@(@Ue7x_Ist}cZ~H#tjJp2b!^bGKoM zG=?(|lyo_WO5DntBbMe|#%lIcNDc8lDKk;n8lS`f%PZxd-TXQTd))fV$_Fz2h21HR z2A~Gi$9ut*N^ENOc;(iW&iRRIs%OpyyGz_tnT?F_kFka0K;coP^x?+%bS=BC@;&w` zJEj_QSr;3F3nq2)Iw}W$$u{eki0*f%&Utmk9|tN=e@0b}Mx9o|^@F4KDeM<&?Q7BsEH69mJ?b?!;lHUZfg34-Csssy#2(tF<%=tL zHFEyi>#s?~a)-l`^NNuN&w!&Yl z6u4a|v6k#I2(`HGY!P}1DfI6Jouqu##Muk-K8{4I9tvS)c^<8gEX;OFqRTfOt<%Lk zWIpT@NWS4KNAFXst8yrm(xm@HmXJT{Gge{H|vX zBs?zh-Wo3W0(a%q$hs2HATJE`J6p5YwT=Lk%0k~}7 zSDJ@;oo0!e*s-ilFgJH{)!+J}xH?1Jp7BI$j>exX{+UGVm3UnND=$zz6esgA1Kl(e zPxlchthKc@pKHXhXqifXeu3OBmBdLxA&V=eP*c3ka}R#MVBxf#34ySXt{PBzt9m~E zUGFN1)}39F&l-&FQUR=n9b8SDrDpvFn%wQBDNtDOl+fUS4sA08TKa<>OQSYxCtdVBjr;^^qByu5lJs-rZ`Pw2!N8b8RP*P^By(`hw6{HpA* zi;d~%&z&)kQJbMRl%b)?{Scyiucqc==Z%No(|$~}=RRH;n~IlyKf)7#&dv3$RbH92 zY7eD!#NEEl<=Iq#v))Tk&N!QB;;}K40=!pWM__B?t|o{(ZP8A6PZHR44W1`JY_i2( z4&*GPvLh$lTZo)cnGb?V8}Obuu*Vek#%t};|Mmz&2TtmO=b8}KnZc7S}D;o+Ly6k`DLr zhN}+)||EH?8hAR0R8>l~#o1?==IB(zeDzVehOO zSOGMlb1yWb8(YRH0*xEMkEOc~ z0@$r!wv4Kdf8Vz-8m?xiys|`fP;WbcJ~|!M876-N0Tl)Ug zeT?TsJaHCenqdO(=+rW{UCIxTV-{6sJgGiE{M4AywM0GYNLoIoJ);pLcJt8%Wd%6- zDK9ZKBWRZz1K|vOLwwvx?xol;3|>@k?70bMz}5I~xA0-fr{tZnikJlO$OCp))H}o@ zOBFm$oMQ|tMBhN#GISkCQ-}T!k_z*hEy%UJ|B-DX>7-)qpBv3HU-gRHwMLs(Ch0<( jqyhEIz{zRQhY9%__uUoxH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/leftsecure_deny.png b/Resources/Textures/Structures/Doors/windoor.rsi/leftsecure_deny.png new file mode 100644 index 0000000000000000000000000000000000000000..2c18f9a5b124d87d37df4a50ddcbad5fa97e4353 GIT binary patch literal 1448 zcmbVMSyYk<82yn1QxOVNTywIMPA(0VPT3f^Btnc!xi3ZJWSVQFj@yXZbS85$D@__H z47Ej+%#;#E=P06+TW&bvGNqFNiK&<;mKf}LUS=Ndckj9PyHDRa-{k;598BL_9{>Ot z-q-t>mPuMr^&r|QpGs)e(&iN3a0&nzb#DMv=3rz20J;%)Z;zlKD;MehXQP5q{Eoh< z$u~P_#2P2^)~(8^eDR^p|X+aRj`C@@@B5V5TM0_0Q^zaU{ z;j@6bYJ5E2fUXK8oQ_@Tf4_rHBytoFle}9b2y`QqwvKr0|2MoPqY2TWj{rcAoWX`Fj znNu3LoqveqmAPD{_1a=t-J%JXCzb3LJv=@;IYJ&N;@@*Ihbb@28_b?bQ!V2b98)9T zKXmtxe6L7KP5u3D+b2QgxHOI8Fn6pxQQ7<`nnqvC=v=~tu!h%D#uN=qCWTLPjclz; z9H=@pUb~+@%j=T;*_@^7ZyFNOnqrv~85D|3aefG~aywJT&EUE}QRWi`Sj#=^r>hj9 zQ+n?D>#D-?K^-5X4xZSNG@p_#;0$__$ApC_8f)VsKCN}0B1*>o~*~FEY zC>Rm-Bl1yr7Q)sR+}jK6-AgStwE6GS!?1IQUUj}L(yXtu7k7kU^JK+yr_bNvm|sA? zYA>V1Bb}i)f}ws!;b(PYr3^B+nfvVEnb)Sam8{hs;0^J83TnW2lduuhMxB|)&PNve1LmVKy@-qM#{(RYhj5H|NBvuuEDKjz zcb|hMo%AdwfS@b7&yeL#hLcX4Ej~V$CugW>7SvZ2UqVLEo|Z-I%lL#72%RxV{gyRt zIzxr?+O8!`XK}2u7hFV|x7q1)J!#p>vW1-P&unEvjYhMAp=#9N2s~9i1N7s!pwiz@iA6{|-ieoV=bMC@ZXHC^=LkfPRSG3i^NJ3bn3y;k zH%hX>s!I7gakF6l!qryZWLii!YjzAgB8Y)BO1|Y&{Ci~T*ARP1SRk5Fg<_x(CA04vA{bDa(TPu$Fe05fUewlTqN4)5jlHy*W35u}RMr3WXVq zoTH}PmJ2uQ)k8mciR{N<3r;|zl)DoTxoUZE?r0rT>0f!~g&Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/meta.json b/Resources/Textures/Structures/Doors/windoor.rsi/meta.json new file mode 100644 index 0000000000..5da1d96d43 --- /dev/null +++ b/Resources/Textures/Structures/Doors/windoor.rsi/meta.json @@ -0,0 +1 @@ +{"name":1,"size":{"x":32,"y":32},"states":[{"name":"left_assembly2","directions":4,"delays":[[3,3],[3,3],[3,3],[3,3]]},{"name":"left_assembly1","directions":4},{"name":"left","directions":4},{"name":"left_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"left_open","directions":4},{"name":"left_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"left_deny","directions":4,"delays":[[1,2,1],[1,2,1],[1,2,1],[1,2,1]]},{"name":"left_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]},{"name":"right_assembly2","directions":4,"delays":[[3,3],[3,3],[3,3],[3,3]]},{"name":"right_assembly1","directions":4},{"name":"right","directions":4},{"name":"right_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_open","directions":4},{"name":"right_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_deny","directions":4,"delays":[[1,2,1],[1,2,1],[1,2,1],[1,2,1]]},{"name":"right_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]},{"name":"left_secure_assembly2","directions":4,"delays":[[3,3,3],[3,3,3],[3,3,3],[3,3,3]]},{"name":"left_secure_assembly1","directions":4},{"name":"left_secure","directions":4},{"name":"left_secure_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"left_secure_open","directions":4},{"name":"left_secure_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"leftsecure_deny","directions":4,"delays":[[1,1,1],[1,1,1],[1,1,1],[1,1,1]]},{"name":"left_secure_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]},{"name":"right_secure_assembly2","directions":4,"delays":[[3,3,3],[3,3,3],[3,3,3],[3,3,3]]},{"name":"right_secure_assembly1","directions":4},{"name":"right_secure","directions":4},{"name":"right_secure_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_secure_open","directions":4},{"name":"right_secure_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_secure_deny","directions":4,"delays":[[1,1,1],[1,1,1],[1,1,1],[1,1,1]]},{"name":"right_secure_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]}],"license":"CC BY-SA-3.0","copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi"} \ No newline at end of file diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right.png b/Resources/Textures/Structures/Doors/windoor.rsi/right.png new file mode 100644 index 0000000000000000000000000000000000000000..a20fec764b1166bf47060a105e774e32d7234c21 GIT binary patch literal 884 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right_open.png b/Resources/Textures/Structures/Doors/windoor.rsi/right_open.png new file mode 100644 index 0000000000000000000000000000000000000000..fc66fc1d810f122765f2d89934d03c62a5d17413 GIT binary patch literal 733 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 SqQ2}yCWm%(MwZ!QqyGVmRmG$L literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right_secure.png b/Resources/Textures/Structures/Doors/windoor.rsi/right_secure.png new file mode 100644 index 0000000000000000000000000000000000000000..1d7d93e2837928d97de4d892468e2574a9f5a5d8 GIT binary patch literal 1050 zcmV+#1m*jQP)So`;n+bYdC~n!h8vd8uT1#2`0tx zA&>}stq6LM9s;pmg9xDqnVJQf{rCqIOd^my1eML^G*ohH5~6L_+dfC{xQ?9&fwnr**Tx@_nyypj3mP#a@l>&vC+|=H8nL$hGEo7C*bM33Ek^6I158VqkOEn zIn3L=?ths0OtU{0shO3~-0XK>PtO~YPC!}NVH)V|C%4;8x~}uKuXm)-2dw?#`Ty;g zmix))^UEh7+I5SP$r=8+s=Au8M?%CHqg*a0v@Q9w&dHEYK;-Tt8hQPSwA@ zx(<T*4aUJgh=6;Ad)QP z83?tAHV|BB4z?YjY1&kK`^DPf;rE*w;i7z>kCP1$P5?4YBv}ALEdU`jGp*_A=_BrZ zUa+>DqU`T9tsQca+hBa0Y=ABA0?06tWZ@S^s6`8bgeIH|hbtm?9_kzCpr#wJu0FlxFr2)Fq0Hpy;X@JrIQW~H%;DD}x-82Ajvjlq|(budFJJc|0EB_hbtJs0l(@OtA*QC5AI( zYQVz$JXM@@Q)}xP3Jx6Cy*AvNEd;;{M@;!ztdzI-FCqR; zCmOa8fNC%lL%;&xs1RA_#Sy3v!2GYYMweTzQFQ7fH8ozMg~b(asD?rz?ki_@%07*qoM6N<$f@uHco&W#< literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_assembly1.png b/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_assembly1.png new file mode 100644 index 0000000000000000000000000000000000000000..0dc3aae8ab805589923140439e6644debb1f8c78 GIT binary patch literal 1234 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_open.png b/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_open.png new file mode 100644 index 0000000000000000000000000000000000000000..4a18cabf760ec90aa975c280bb7b64a6b2a81fc9 GIT binary patch literal 1055 zcmV+)1mOFLP)RCt{2TTMt*Q562hd84BgIy06Qj)Q|BL5dJULGGd;vJeUk zq2(+RH_{&nEeiXmP1K@gF(p#yn#KXYhsaJH(dDyi#wwe$c4D=N~7_?wOE&;?hg1 z-7ouuO{dfH128^525&(DmX?<-wb6T5kVs64XO@+hV>J+lrfJBE3|LuN6)R<>ZN2db zeIMS#wYDr)KC3do9u8PQa`uPt+b&-eHY+$FF+J^u``E^{IcS03Rau$#`~8@kn?rfz z{5-3`(e@VkRlo(T+wq*RvEN5WM^RT-hqkshUn-UI#p7|8^Z?j}SS;qE9UB|_W85(T z_!m?F;Bcq_z~N8&9<#@j-$}rBdJr2}p)! zmoO1pTSI+)z4#;*jYj7;g$X?v3`z}xW|uJ0*`J4=o^F&F{*31FnZkr@XgdiLyX8}u z2$b#pk=$KWRt3H|z$S6KWtZDdE-5;@LoE69o+#(zgg+jX3hb3ES zn1slxKx<-haxwtTBM8xxj3K?hY-_x@xY+V{vMm54M4k)G44_YrINsP;+IsC_nk)Z( zW(K8)-FW(}2eE-(Ur9-cB2!atJ1UfP4lw6fBF*4r z&RGp98SpnSC}wc%gcJ@i{jC$DaeeyC?X3*RoUnfpg6#*I6!d#6bC2{$k7bgi32$2XbvE}iUV?x1K1hD<_Pu&P$H*FOrexoVIPM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_opening.png b/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_opening.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f4038246cc81788c77e4bee848c9a6eadbceb0 GIT binary patch literal 3019 zcmb_eX*d*m7dK-V6l2K}8Bb+@F&h`!02?Ygb(E9IVj)?QY;c&&W)uh5<>Pv0%qR$mqN5uNq zI8p1Xto5#?@eteMw5%K1+XsuITdw)V#Y(z6TY=YIL#8t`kIb%u1#UHYTwVQOrRDtb z3mCILZVgEeH=UuYzbRM52Q%9r%PH*#FVR^;;c;>6Q9Bor) zXXl#A$_44_@_qBE$@2S$`w)z2Dt%;FOUPQ0rM<|TCu4&6I6VzM*1D=p-t82xp|854 zlb;(Yt7LbJ{yEuUUCd z1sTzUqXJtKtHb4pdx!vhrtt7`e%{!ghi&WRo`^ag#&Yjia%k(@pgDY=bLa5# zH*AB|rkU0|;{8!|MOUn#ITDuE&_*NI5ClGwuC$gS%WO}QBSj8i{u&F=fVQ@n!L?I+ zPMZn(U@PL8Iwzl_NuPFZ*WM7kWAtN3Uy;+_K(dw?)FJYUU(^KQiI%9!{#$coRPlo+ z8fa3*Uwe-#avtk)fjOH?V2#PaCQ(&r`BjmMDt_kn+v=JYR%TtD^&7N2yCc5sD@olf zP>H{h^EH=3uR8%}e9%V4f97kZeZyQw8^uT`GkI46jQIKa-^Lq9MQ-nBR`ms)Lz84D zVeF}>=NGwxSVU)#{=$DA+LKC)sK{mQ?KwNAYiUez4~begqDd8t^i?TJYybq>JjEf8{m-yQ*3F(WzW#XPglm*i>Jaws;$fg*_3WL^K3bI;kU$tC*(rs-pg( zHeGB@@DfW}3(xu6-xSVRtUtws@zJR#QfGo=lZ7DRc zT9P@+qGr8OkGw0>?673w12Y}n#gUggsd#J0w|Z*ZcP;nVKA#8PYXkARk@-cru-}3! zW|jh+{`|bS48mFn8mzMURq{y!H-^=%JvH>zO5X!)f0Mv;h{?`N~e ze^`F0QIjdVo^@uWsp01^iWElb&{sxw>WPKb0rsO>yxo5}^Xe%8Yu&XM&I7~;V~6+x zqN~L2OVPm3JQm=&gfQNQ#+co^+LTTv_W%TrS7lDcn-)c02waKXnGcmp3+cevMd|ZQ z3om_pl#crYAR{6edVH=q?0HVrk2!sb~gSAJlJo)Np-DYwj z$}%Mu3|G{3t3CdXy`A#V(K&0jAO)=P z49BFjd#YuE80({2&v2uZ_Tq73Kz&OJs6WwVQ`k#agU(zgaoa9T&;ySShyiy7VP;AJBT| zl=9fwuZagI_cR$?j83n1B_$>Qy(Vwe{+DabcTUM#gIPCOi(7zQrL}n#*Pwmw=lceg z2tR$D=$57y441uqB+!x*dmI}Gd0(+iV!#S_%!w-b$$UTC_U|{@2QAqxW?Us*+zNt3 zpzo{M2r?(l4FvJ#z#vx~f$SFVAz%vgjz;$}m)epeR1;8je^y~A5!a5Q`TAmWkW|cKBDHZtYJ>*)3t54-UYcsQx9wD zB8dJEa84xsV$R+cuXa_1NbK-a^3O)OW{h zp$T(R%!RbD*tmz0w-gBC2^HYI{qBwUP*syE;3cY5_)QjjX@|Go(m1(AT~yh9KhZwh z`T(4|xO(&+zX+(t=SV=Om65-#T&Ak?t%zFzjrr_@|)Fhr9dLOP=NMEdyg zUD99#S;HP?$Teb|zZ>L(QT1cyI6b5c&(v#J((?}T8(Z61cdoLSPshAAcOw#1xW8}q z-;y-P%89i{Ak48-fns8+GUYE?igP5g0@aT9cH6OhpQ^jPFHDl#L-Us@vl?|G9v4zx<7~sH7UMnypy8ZB#kfP7JPi@3w4rq`jy^P8D%&fgOKTE*@s~JA;VO^mi9ici~3LsDy z-|JG+m*#+UN{-|6mQ(@sFNGm&uvv6rL1+RB5JOX2Q!VR`1|Q3_UmP2|t9wF$5ZVN? zfGmYw#2}BO0Pws3MHe7NEYKQ+ARJ}S#9+NB1{noT1Bt4hV$}g5W;EP00?@>G?#d?CYGv{C6wkGDEkhe*q}Ntt|im literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_spark.png b/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_spark.png new file mode 100644 index 0000000000000000000000000000000000000000..2523e4fcc81ba48040672d96c39d46072b17b147 GIT binary patch literal 2661 zcmbtWdpy(o8{aIHFo~QN8zL2PBxkz#8WD4w5OSMNj+9(m9oc4+W-g~(Iwwvpb4fVv zg$`i~X@%TPDlKx^hA?Ae_M6}9{PjD3{{DEL=k@u#pXd2}UZ3arykAd}i?gkQ983-b z0x6*FtX(BGe_M9SNOa2kE5{^eSA^Zg8z7Kk$F_j~&{sSF0?DbNtu5W7bLMmXuB#94 zPoVeY=!8*Ro82S5?UKu_|L`_c->;tbEhFV)00nXI&WHR`8>?&jhEZ;AkNrVv?pmxv zJ6+PXV^unf$r0;U3k&^!Z`ya?O}{Z%zaD-0nqKIg4p?FGbXRs6{XzF}lh1y(oiojs zX={yd7P#KGuiTmt@w0DCH;3F+(mbIVX9ZC{{C^lJ^ic+!R$WSiSbs|Ubs}5(R@&U99^RA=gt{SVLpuirF-{^`| zuby96czFN5Vpi<9g5Kj05&ySVPIY137JInd!9=(;oBoM^5^>=$X;Y59inI`a;|w$` z7ZShLj{-Hcgw|I03v)9w9m57pc5xJYidu>1H|qzBj;-+-llZ)zS-R;{Uw?6c4!=PB zD(-A8TpVXyZsda)Q{4b!he^{t;JNvV*A|;&rK6)0b#;V``~|#&{oqWoccs0G&GDMG zP&_9JFGzk`*YJ=c?Cd9fvk?n}ChpVTPEFmt88rUag{Y;b@MPn2PfAL1KO440Fc#!j z+eeVlGr~G9Y0`5)^-1_%n7LT|nXQ-a-J+9ShNx>j`Rjs-;B&)^z@+xY&A^TC1#||3 zL=1dhUVOD5P8MF`WFuC?vTjbB)C|t^F$>LveM2HLIwMO$_~9VSTdi?xwMl#$z#cUd>-Gfsl}00upJdnf1r`L z8kr4G$OoJeVJHn5Cco_*9$QkVGU{e2_$Pv}+~xDw*U+KZwah7DLtUmXMJr9n=v2BY z%A~#ZmuJQN@T91y-Cw?ceC!va1TS9uk5@mmdi+7(5@fZgvtRQs_#4XFLm_kD?5I$U z`pozOUaH21&W+8g>O=+yn#yg+ysSG8q)N^=_nMMUA9@~?LR#DKQ=WRHRD77DWf*}5 zO=oQOq5Y$$beEEVsPpbMs!HfR4=GRXQ7gzh?;r!VI&E9_&;GQ-=DUoJS1?M7BBSH- zFQa?8ZFeM7>t2V2jD{lm)oY!Vv?fc4@9&Z zMB(a+^IC6feJ7mC^fitbX{d;f?9d49+Y8J$*3U;;#!xh@uxJiPhkDQ~3^Oh` z5b!q84(`#{)YnY5!_4W0e z{f_amTi0z2x31Xt8u@6Szs{Wm_|VEluD)3=v}F7dfzn;Vkj=^Ndk!`BrmWUblHWDODl{rt-^W00q^6%hRZOWsAW z#$cD}9);C0NR0M&p}SwgYd}IS*nCf|)KjVH0H_y;$S3C|Za2h@8d(D}fJb4hE65e( zlT64y6wN$eZ@Y2Y)Vbi@`LvI=eDYzUN1N2#L48eont1@2_fKMI7Gwkh4+8wB8)GIT z&=pCk#1}B48vTeuIa%+|)Xdw?PK~_Dy{>*^9(b<9vC;RNczZ&hqeV+!Z0pUIA0iS3 z(N3!m;N0%H!R6s>?MCs|_*80jRc(?o5X*pBa@FubyI6rizM>jg>3!PpWF>Mv!v%xIUTcEWy~GTk-Q z^-9i;czA@Yg-tz2G^ijCQD4E+gf3p-GAPAdbG4vG$`v7pN3qXdl70-R@VD{p0PZ%f zDsf~&B)GoBaVQ3*EBP+$%M1fYTar{+I1_S?`|_@Nz6Fd=2CO0n+{?M(dn~hnO4+d} zAJUOr=*&RcZe0m0u@5rb+ZvZyz6*B#SX0S}L7k;#-c*Vs)XWpe zDOW4V+v@hwHZ;wiL;R2u*aPD(&0xiy!9XYM`!xw8!V2vPD9p dk!tKW606P5zP$HAkz{TJp>3S4tE>X<{09OpI3oZ6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right_spark.png b/Resources/Textures/Structures/Doors/windoor.rsi/right_spark.png new file mode 100644 index 0000000000000000000000000000000000000000..a66dcf51c8e723eea49a74fedbbe9d97a4254580 GIT binary patch literal 2435 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 CcAGu` literal 0 HcmV?d00001 From 1f7809772bf26ce24e73a20aad9accd575a9fccb Mon Sep 17 00:00:00 2001 From: Kara Dinyes Date: Sat, 17 Jul 2021 21:39:08 -0700 Subject: [PATCH 02/83] finished yaml --- .../Entities/Structures/Doors/windoor.yml | 73 +++++++++--------- .../Entities/Structures/Windoors/base.yml | 66 ++++++++++++++++ ...ftsecure_deny.png => left_secure_deny.png} | Bin .../Structures/Doors/windoor.rsi/meta.json | 2 +- 4 files changed, 104 insertions(+), 37 deletions(-) create mode 100644 Resources/Prototypes/Entities/Structures/Windoors/base.yml rename Resources/Textures/Structures/Doors/windoor.rsi/{leftsecure_deny.png => left_secure_deny.png} (100%) diff --git a/Resources/Prototypes/Entities/Structures/Doors/windoor.yml b/Resources/Prototypes/Entities/Structures/Doors/windoor.yml index c35ced8081..30daccab2e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/windoor.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/windoor.yml @@ -1,44 +1,45 @@ - type: entity - id: Windoor - parent: BaseStructure + id: WindoorLeft + parent: BaseWindoor name: windoor description: It's a window and a sliding door. Wow! - placement: - mode: SnapgridCenter + suffix: Left + components: + - type: Sprite + state: left + +- type: entity + id: WindoorRight + parent: BaseWindoor + name: windoor + description: It's a window and a sliding door. Wow! This one is flipped 180 degrees. + suffix: Right + components: + - type: Sprite + state: right + +- type: entity + id: WindoorLeftSecure + parent: BaseSecureWindoor + name: secure windoor + description: It's a sturdy window and a sliding door. Wow! + suffix: Left components: - - type: InteractionOutline - type: Sprite netsync: false drawdepth: Mobs sprite: Structures/Doors/windoor.rsi - state: left - - type: Physics - fixtures: - - shape: - !type:PhysShapeAabb - bounds: "-0.5, -0.5, -0.3, 0.5" # i don't understand why these bounds work but they do - mass: 100 - mask: - - MobImpassable - layer: - - Opaque - - Impassable - - MobImpassable - - VaultImpassable - - SmallImpassable - - type: ApcPowerReceiver - - type: Damageable - resistances: glassResistances - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 200 - behaviors: - - !type:SpawnEntitiesBehavior - spawn: - ShardGlass: - min: 1 - max: 2 - - !type:DoActsBehavior - acts: [ "Destruction" ] + state: left_secure + +- type: entity + id: WindoorRightSecure + parent: BaseSecureWindoor + name: secure windoor + description: It's a sturdy window and a sliding door. Wow! This one is flipped 180 degrees. + suffix: Right + components: + - type: Sprite + netsync: false + drawdepth: Mobs + sprite: Structures/Doors/windoor.rsi + state: right_secure diff --git a/Resources/Prototypes/Entities/Structures/Windoors/base.yml b/Resources/Prototypes/Entities/Structures/Windoors/base.yml new file mode 100644 index 0000000000..b9c2dedd6b --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Windoors/base.yml @@ -0,0 +1,66 @@ +- type: entity + id: BaseWindoor + parent: BaseStructure + abstract: true + placement: + mode: SnapgridCenter + components: + - type: InteractionOutline + - type: Physics + fixtures: + - shape: + !type:PhysShapeAabb + bounds: "-0.49,-0.49,0.49,0.49" + mass: 50 + mask: + - MobImpassable + layer: + - Opaque + - Impassable + - MobImpassable + - VaultImpassable + - SmallImpassable + - type: Sprite + netsync: false + drawdepth: Mobs + sprite: Structures/Doors/windoor.rsi + - type: ApcPowerReceiver + - type: Damageable + resistances: glassResistances + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 200 + behaviors: + - !type:SpawnEntitiesBehavior + spawn: + ShardGlass: + min: 1 + max: 2 + - !type:DoActsBehavior + acts: [ "Destruction" ] + +- type: entity + id: BaseSecureWindoor + parent: BaseWindoor + abstract: true + components: + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 400 + behaviors: + - !type:SpawnEntitiesBehavior + spawn: + ShardGlass: + min: 1 + max: 2 + - !type:SpawnEntitiesBehavior + spawn: + MetalRod: + min: 1 + max: 3 + - !type:DoActsBehavior + acts: [ "Destruction" ] diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/leftsecure_deny.png b/Resources/Textures/Structures/Doors/windoor.rsi/left_secure_deny.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/leftsecure_deny.png rename to Resources/Textures/Structures/Doors/windoor.rsi/left_secure_deny.png diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/meta.json b/Resources/Textures/Structures/Doors/windoor.rsi/meta.json index 5da1d96d43..2df8acd2c9 100644 --- a/Resources/Textures/Structures/Doors/windoor.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/windoor.rsi/meta.json @@ -1 +1 @@ -{"name":1,"size":{"x":32,"y":32},"states":[{"name":"left_assembly2","directions":4,"delays":[[3,3],[3,3],[3,3],[3,3]]},{"name":"left_assembly1","directions":4},{"name":"left","directions":4},{"name":"left_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"left_open","directions":4},{"name":"left_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"left_deny","directions":4,"delays":[[1,2,1],[1,2,1],[1,2,1],[1,2,1]]},{"name":"left_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]},{"name":"right_assembly2","directions":4,"delays":[[3,3],[3,3],[3,3],[3,3]]},{"name":"right_assembly1","directions":4},{"name":"right","directions":4},{"name":"right_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_open","directions":4},{"name":"right_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_deny","directions":4,"delays":[[1,2,1],[1,2,1],[1,2,1],[1,2,1]]},{"name":"right_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]},{"name":"left_secure_assembly2","directions":4,"delays":[[3,3,3],[3,3,3],[3,3,3],[3,3,3]]},{"name":"left_secure_assembly1","directions":4},{"name":"left_secure","directions":4},{"name":"left_secure_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"left_secure_open","directions":4},{"name":"left_secure_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"leftsecure_deny","directions":4,"delays":[[1,1,1],[1,1,1],[1,1,1],[1,1,1]]},{"name":"left_secure_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]},{"name":"right_secure_assembly2","directions":4,"delays":[[3,3,3],[3,3,3],[3,3,3],[3,3,3]]},{"name":"right_secure_assembly1","directions":4},{"name":"right_secure","directions":4},{"name":"right_secure_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_secure_open","directions":4},{"name":"right_secure_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_secure_deny","directions":4,"delays":[[1,1,1],[1,1,1],[1,1,1],[1,1,1]]},{"name":"right_secure_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]}],"license":"CC BY-SA-3.0","copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi"} \ No newline at end of file +{"name":1,"size":{"x":32,"y":32},"states":[{"name":"left_assembly2","directions":4,"delays":[[3,3],[3,3],[3,3],[3,3]]},{"name":"left_assembly1","directions":4},{"name":"left","directions":4},{"name":"left_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"left_open","directions":4},{"name":"left_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"left_deny","directions":4,"delays":[[1,2,1],[1,2,1],[1,2,1],[1,2,1]]},{"name":"left_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]},{"name":"right_assembly2","directions":4,"delays":[[3,3],[3,3],[3,3],[3,3]]},{"name":"right_assembly1","directions":4},{"name":"right","directions":4},{"name":"right_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_open","directions":4},{"name":"right_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_deny","directions":4,"delays":[[1,2,1],[1,2,1],[1,2,1],[1,2,1]]},{"name":"right_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]},{"name":"left_secure_assembly2","directions":4,"delays":[[3,3,3],[3,3,3],[3,3,3],[3,3,3]]},{"name":"left_secure_assembly1","directions":4},{"name":"left_secure","directions":4},{"name":"left_secure_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"left_secure_open","directions":4},{"name":"left_secure_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"left_secure_deny","directions":4,"delays":[[1,1,1],[1,1,1],[1,1,1],[1,1,1]]},{"name":"left_secure_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]},{"name":"right_secure_assembly2","directions":4,"delays":[[3,3,3],[3,3,3],[3,3,3],[3,3,3]]},{"name":"right_secure_assembly1","directions":4},{"name":"right_secure","directions":4},{"name":"right_secure_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_secure_open","directions":4},{"name":"right_secure_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_secure_deny","directions":4,"delays":[[1,1,1],[1,1,1],[1,1,1],[1,1,1]]},{"name":"right_secure_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]}],"license":"CC BY-SA-3.0","copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi"} From c8f79fdcafe2cf7a00f1d685b4d20e959359380e Mon Sep 17 00:00:00 2001 From: Kara Dinyes Date: Sun, 25 Jul 2021 20:21:02 -0700 Subject: [PATCH 03/83] windoors work #Dab --- .../Structures/Doors/Firelocks/firelock.yml | 2 +- .../Entities/Structures/Doors/windoor.yml | 38 +----------- .../Entities/Structures/Windoors/base.yml | 57 ++++++++++++++++-- .../glass.rsi/assembly1.png} | Bin .../glass.rsi/assembly2.png} | Bin .../Doors/Windoors/glass.rsi/bolted_unlit.png | Bin 0 -> 146 bytes .../glass.rsi/closed.png} | Bin .../Doors/Windoors/glass.rsi/closed_unlit.png | Bin 0 -> 146 bytes .../glass.rsi/closing.png} | Bin .../glass.rsi/deny_unlit.png} | Bin .../Doors/Windoors/glass.rsi/meta.json | 21 +++++++ .../glass.rsi/open.png} | Bin .../glass.rsi/opening.png} | Bin .../Doors/Windoors/glass.rsi/panel_open.png | Bin 0 -> 146 bytes .../glass.rsi/spark.png} | Bin .../Doors/Windoors/glass.rsi/welded.png | Bin 0 -> 146 bytes .../secure.rsi/assembly1.png} | Bin .../secure.rsi/assembly2.png} | Bin .../Windoors/secure.rsi/bolted_unlit.png | Bin 0 -> 146 bytes .../secure.rsi/closed.png} | Bin .../Windoors/secure.rsi/closed_unlit.png | Bin 0 -> 146 bytes .../secure.rsi/closing.png} | Bin .../secure.rsi/deny_unlit.png} | Bin .../Doors/Windoors/secure.rsi/meta.json | 21 +++++++ .../secure.rsi/open.png} | Bin .../secure.rsi/opening.png} | Bin .../Doors/Windoors/secure.rsi/panel_open.png | Bin 0 -> 146 bytes .../secure.rsi/spark.png} | Bin .../Doors/Windoors/secure.rsi/welded.png | Bin 0 -> 146 bytes .../Structures/Doors/windoor.rsi/meta.json | 1 - .../Structures/Doors/windoor.rsi/right.png | Bin 884 -> 0 bytes .../Doors/windoor.rsi/right_assembly1.png | Bin 917 -> 0 bytes .../Doors/windoor.rsi/right_assembly2.png | Bin 1024 -> 0 bytes .../Doors/windoor.rsi/right_closing.png | Bin 2504 -> 0 bytes .../Doors/windoor.rsi/right_deny.png | Bin 1291 -> 0 bytes .../Doors/windoor.rsi/right_open.png | Bin 733 -> 0 bytes .../Doors/windoor.rsi/right_opening.png | Bin 2494 -> 0 bytes .../Doors/windoor.rsi/right_secure.png | Bin 1050 -> 0 bytes .../windoor.rsi/right_secure_assembly1.png | Bin 1234 -> 0 bytes .../windoor.rsi/right_secure_assembly2.png | Bin 1491 -> 0 bytes .../windoor.rsi/right_secure_closing.png | Bin 2997 -> 0 bytes .../Doors/windoor.rsi/right_secure_deny.png | Bin 1428 -> 0 bytes .../Doors/windoor.rsi/right_secure_open.png | Bin 1055 -> 0 bytes .../windoor.rsi/right_secure_opening.png | Bin 3019 -> 0 bytes .../Doors/windoor.rsi/right_secure_spark.png | Bin 2661 -> 0 bytes .../Doors/windoor.rsi/right_spark.png | Bin 2435 -> 0 bytes 46 files changed, 96 insertions(+), 44 deletions(-) rename Resources/Textures/Structures/Doors/{windoor.rsi/left_assembly1.png => Windoors/glass.rsi/assembly1.png} (100%) rename Resources/Textures/Structures/Doors/{windoor.rsi/left_assembly2.png => Windoors/glass.rsi/assembly2.png} (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/glass.rsi/bolted_unlit.png rename Resources/Textures/Structures/Doors/{windoor.rsi/left.png => Windoors/glass.rsi/closed.png} (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/glass.rsi/closed_unlit.png rename Resources/Textures/Structures/Doors/{windoor.rsi/left_closing.png => Windoors/glass.rsi/closing.png} (100%) rename Resources/Textures/Structures/Doors/{windoor.rsi/left_deny.png => Windoors/glass.rsi/deny_unlit.png} (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json rename Resources/Textures/Structures/Doors/{windoor.rsi/left_open.png => Windoors/glass.rsi/open.png} (100%) rename Resources/Textures/Structures/Doors/{windoor.rsi/left_opening.png => Windoors/glass.rsi/opening.png} (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/glass.rsi/panel_open.png rename Resources/Textures/Structures/Doors/{windoor.rsi/left_spark.png => Windoors/glass.rsi/spark.png} (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/glass.rsi/welded.png rename Resources/Textures/Structures/Doors/{windoor.rsi/left_secure_assembly1.png => Windoors/secure.rsi/assembly1.png} (100%) rename Resources/Textures/Structures/Doors/{windoor.rsi/left_secure_assembly2.png => Windoors/secure.rsi/assembly2.png} (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/bolted_unlit.png rename Resources/Textures/Structures/Doors/{windoor.rsi/left_secure.png => Windoors/secure.rsi/closed.png} (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/closed_unlit.png rename Resources/Textures/Structures/Doors/{windoor.rsi/left_secure_closing.png => Windoors/secure.rsi/closing.png} (100%) rename Resources/Textures/Structures/Doors/{windoor.rsi/left_secure_deny.png => Windoors/secure.rsi/deny_unlit.png} (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json rename Resources/Textures/Structures/Doors/{windoor.rsi/left_secure_open.png => Windoors/secure.rsi/open.png} (100%) rename Resources/Textures/Structures/Doors/{windoor.rsi/left_secure_opening.png => Windoors/secure.rsi/opening.png} (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/panel_open.png rename Resources/Textures/Structures/Doors/{windoor.rsi/left_secure_spark.png => Windoors/secure.rsi/spark.png} (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/welded.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/meta.json delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_assembly1.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_assembly2.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_closing.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_deny.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_open.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_opening.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure_assembly1.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure_assembly2.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure_closing.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure_deny.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure_open.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure_opening.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_secure_spark.png delete mode 100644 Resources/Textures/Structures/Doors/windoor.rsi/right_spark.png diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index 40fad456b0..ec7f8eacd0 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -110,7 +110,7 @@ fixtures: - shape: !type:PhysShapeRect - bounds: "0.49,-0.49,-0.49,-0.2" # don't want this colliding with walls or they won't close + bounds: "-0.2,-0.49,-0.49,0.49" # don't want this colliding with walls or they won't close mask: - MobImpassable layer: diff --git a/Resources/Prototypes/Entities/Structures/Doors/windoor.yml b/Resources/Prototypes/Entities/Structures/Doors/windoor.yml index 30daccab2e..b12f799719 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/windoor.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/windoor.yml @@ -1,45 +1,11 @@ - type: entity - id: WindoorLeft + id: Windoor parent: BaseWindoor name: windoor description: It's a window and a sliding door. Wow! - suffix: Left - components: - - type: Sprite - state: left - type: entity - id: WindoorRight - parent: BaseWindoor - name: windoor - description: It's a window and a sliding door. Wow! This one is flipped 180 degrees. - suffix: Right - components: - - type: Sprite - state: right - -- type: entity - id: WindoorLeftSecure + id: WindoorSecure parent: BaseSecureWindoor name: secure windoor description: It's a sturdy window and a sliding door. Wow! - suffix: Left - components: - - type: Sprite - netsync: false - drawdepth: Mobs - sprite: Structures/Doors/windoor.rsi - state: left_secure - -- type: entity - id: WindoorRightSecure - parent: BaseSecureWindoor - name: secure windoor - description: It's a sturdy window and a sliding door. Wow! This one is flipped 180 degrees. - suffix: Right - components: - - type: Sprite - netsync: false - drawdepth: Mobs - sprite: Structures/Doors/windoor.rsi - state: right_secure diff --git a/Resources/Prototypes/Entities/Structures/Windoors/base.yml b/Resources/Prototypes/Entities/Structures/Windoors/base.yml index b9c2dedd6b..7a57094414 100644 --- a/Resources/Prototypes/Entities/Structures/Windoors/base.yml +++ b/Resources/Prototypes/Entities/Structures/Windoors/base.yml @@ -6,24 +6,45 @@ mode: SnapgridCenter components: - type: InteractionOutline + - type: Airlock + - type: Door + - type: Wires + BoardName: "Windoor Control" + LayoutId: Airlock + - type: UserInterface + interfaces: + - key: enum.WiresUiKey.Key + type: WiresBoundUserInterface - type: Physics fixtures: - shape: !type:PhysShapeAabb - bounds: "-0.49,-0.49,0.49,0.49" + bounds: "-0.2,-0.49,-0.49,0.49" mass: 50 - mask: - - MobImpassable layer: - - Opaque - Impassable - MobImpassable - VaultImpassable - SmallImpassable + mask: + - VaultImpassable - type: Sprite netsync: false - drawdepth: Mobs - sprite: Structures/Doors/windoor.rsi + drawdepth: FloorObjects + sprite: Structures/Doors/Windoors/glass.rsi + layers: + - state: closed + map: [ "enum.DoorVisualLayers.Base" ] + - state: closed_unlit + shader: unshaded + map: [ "enum.DoorVisualLayers.BaseUnlit" ] + - state: welded + map: [ "enum.DoorVisualLayers.BaseWelded" ] + - state: bolted_unlit + shader: unshaded + map: [ "enum.DoorVisualLayers.BaseBolted" ] + - state: panel_open + map: [ "enum.WiresVisualLayers.MaintenancePanel" ] - type: ApcPowerReceiver - type: Damageable resistances: glassResistances @@ -40,12 +61,28 @@ max: 2 - !type:DoActsBehavior acts: [ "Destruction" ] + - type: Appearance + visuals: + - type: AirlockVisualizer + open_sound: /Audio/Machines/airlock_open.ogg + close_sound: /Audio/Machines/airlock_close.ogg + deny_sound: /Audio/Machines/airlock_deny.ogg + hasMaintenancePanel: false + openCloseUnlit: false + delay: 0.7 - type: entity id: BaseSecureWindoor parent: BaseWindoor abstract: true components: + - type: Airtight + fixVacuum: true + noAirWhenFullyAirBlocked: false + airBlockedDirection: + - South + - type: Sprite + sprite: Structures/Doors/Windoors/secure.rsi - type: Destructible thresholds: - trigger: @@ -64,3 +101,11 @@ max: 3 - !type:DoActsBehavior acts: [ "Destruction" ] + +# "0.49,-0.49,-0.49,-0.2" +# to: +# (-0.2, -0.49), (-0.2, 0.49), (-0.49, 0.49), (-0.49, -0.49) +# what i want is: +# (0.49, -0.49), (0.49, -0.2), (-0.49, -0.2), (-0.49, -0.49) +# which is: +# "-0.2,-0.49,-0.49,0.49" diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_assembly1.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/assembly1.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_assembly1.png rename to Resources/Textures/Structures/Doors/Windoors/glass.rsi/assembly1.png diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_assembly2.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/assembly2.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_assembly2.png rename to Resources/Textures/Structures/Doors/Windoors/glass.rsi/assembly2.png diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/bolted_unlit.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/bolted_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..f154b0f50b0006144faf4797f45429cf6f6ac084 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpt`4vV@O5Z+k=d}K;EGR-~Ds>%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/closed.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left.png rename to Resources/Textures/Structures/Doors/Windoors/glass.rsi/closed.png diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/closed_unlit.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/closed_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..f154b0f50b0006144faf4797f45429cf6f6ac084 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpt`4vV@O5Z+k=d}K;EGR-~Ds>%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_closing.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/closing.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_closing.png rename to Resources/Textures/Structures/Doors/Windoors/glass.rsi/closing.png diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_deny.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/deny_unlit.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_deny.png rename to Resources/Textures/Structures/Doors/Windoors/glass.rsi/deny_unlit.png diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json new file mode 100644 index 0000000000..be6e25bae4 --- /dev/null +++ b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json @@ -0,0 +1,21 @@ +{ + "name":1, + "size": {"x":32,"y":32}, + "states": + [ + {"name":"assembly2","directions":4,"delays":[[0.3,0.3],[0.3,0.3],[0.3,0.3],[0.3,0.3]]}, + {"name":"assembly1","directions":4}, + {"name":"closed","directions":4}, + {"name":"closing","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, + {"name":"open","directions":4}, + {"name":"opening","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, + {"name":"deny_unlit","directions":4,"delays":[[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1]]}, + {"name":"spark","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1]]}, + {"name":"closed_unlit","directions":4}, + {"name":"panel_open","directions":4}, + {"name":"welded","directions":4}, + {"name":"bolted_unlit","directions":4} + ], + "license":"CC BY-SA-3.0", + "copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi" +} diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_open.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/open.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_open.png rename to Resources/Textures/Structures/Doors/Windoors/glass.rsi/open.png diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_opening.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/opening.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_opening.png rename to Resources/Textures/Structures/Doors/Windoors/glass.rsi/opening.png diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/panel_open.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/panel_open.png new file mode 100644 index 0000000000000000000000000000000000000000..f154b0f50b0006144faf4797f45429cf6f6ac084 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpt`4vV@O5Z+k=d}K;EGR-~Ds>%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_spark.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/spark.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_spark.png rename to Resources/Textures/Structures/Doors/Windoors/glass.rsi/spark.png diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/welded.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/welded.png new file mode 100644 index 0000000000000000000000000000000000000000..f154b0f50b0006144faf4797f45429cf6f6ac084 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpt`4vV@O5Z+k=d}K;EGR-~Ds>%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_secure_assembly1.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/assembly1.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_secure_assembly1.png rename to Resources/Textures/Structures/Doors/Windoors/secure.rsi/assembly1.png diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_secure_assembly2.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/assembly2.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_secure_assembly2.png rename to Resources/Textures/Structures/Doors/Windoors/secure.rsi/assembly2.png diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/bolted_unlit.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/bolted_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..f154b0f50b0006144faf4797f45429cf6f6ac084 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpt`4vV@O5Z+k=d}K;EGR-~Ds>%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_secure.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/closed.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_secure.png rename to Resources/Textures/Structures/Doors/Windoors/secure.rsi/closed.png diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/closed_unlit.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/closed_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..f154b0f50b0006144faf4797f45429cf6f6ac084 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpt`4vV@O5Z+k=d}K;EGR-~Ds>%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_secure_closing.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/closing.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_secure_closing.png rename to Resources/Textures/Structures/Doors/Windoors/secure.rsi/closing.png diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_secure_deny.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/deny_unlit.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_secure_deny.png rename to Resources/Textures/Structures/Doors/Windoors/secure.rsi/deny_unlit.png diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json new file mode 100644 index 0000000000..be6e25bae4 --- /dev/null +++ b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json @@ -0,0 +1,21 @@ +{ + "name":1, + "size": {"x":32,"y":32}, + "states": + [ + {"name":"assembly2","directions":4,"delays":[[0.3,0.3],[0.3,0.3],[0.3,0.3],[0.3,0.3]]}, + {"name":"assembly1","directions":4}, + {"name":"closed","directions":4}, + {"name":"closing","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, + {"name":"open","directions":4}, + {"name":"opening","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, + {"name":"deny_unlit","directions":4,"delays":[[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1]]}, + {"name":"spark","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1]]}, + {"name":"closed_unlit","directions":4}, + {"name":"panel_open","directions":4}, + {"name":"welded","directions":4}, + {"name":"bolted_unlit","directions":4} + ], + "license":"CC BY-SA-3.0", + "copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi" +} diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_secure_open.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/open.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_secure_open.png rename to Resources/Textures/Structures/Doors/Windoors/secure.rsi/open.png diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_secure_opening.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/opening.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_secure_opening.png rename to Resources/Textures/Structures/Doors/Windoors/secure.rsi/opening.png diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/panel_open.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/panel_open.png new file mode 100644 index 0000000000000000000000000000000000000000..f154b0f50b0006144faf4797f45429cf6f6ac084 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpt`4vV@O5Z+k=d}K;EGR-~Ds>%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/left_secure_spark.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/spark.png similarity index 100% rename from Resources/Textures/Structures/Doors/windoor.rsi/left_secure_spark.png rename to Resources/Textures/Structures/Doors/Windoors/secure.rsi/spark.png diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/welded.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/welded.png new file mode 100644 index 0000000000000000000000000000000000000000..f154b0f50b0006144faf4797f45429cf6f6ac084 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpt`4vV@O5Z+k=d}K;EGR-~Ds>%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/meta.json b/Resources/Textures/Structures/Doors/windoor.rsi/meta.json deleted file mode 100644 index 2df8acd2c9..0000000000 --- a/Resources/Textures/Structures/Doors/windoor.rsi/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"name":1,"size":{"x":32,"y":32},"states":[{"name":"left_assembly2","directions":4,"delays":[[3,3],[3,3],[3,3],[3,3]]},{"name":"left_assembly1","directions":4},{"name":"left","directions":4},{"name":"left_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"left_open","directions":4},{"name":"left_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"left_deny","directions":4,"delays":[[1,2,1],[1,2,1],[1,2,1],[1,2,1]]},{"name":"left_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]},{"name":"right_assembly2","directions":4,"delays":[[3,3],[3,3],[3,3],[3,3]]},{"name":"right_assembly1","directions":4},{"name":"right","directions":4},{"name":"right_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_open","directions":4},{"name":"right_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_deny","directions":4,"delays":[[1,2,1],[1,2,1],[1,2,1],[1,2,1]]},{"name":"right_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]},{"name":"left_secure_assembly2","directions":4,"delays":[[3,3,3],[3,3,3],[3,3,3],[3,3,3]]},{"name":"left_secure_assembly1","directions":4},{"name":"left_secure","directions":4},{"name":"left_secure_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"left_secure_open","directions":4},{"name":"left_secure_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"left_secure_deny","directions":4,"delays":[[1,1,1],[1,1,1],[1,1,1],[1,1,1]]},{"name":"left_secure_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]},{"name":"right_secure_assembly2","directions":4,"delays":[[3,3,3],[3,3,3],[3,3,3],[3,3,3]]},{"name":"right_secure_assembly1","directions":4},{"name":"right_secure","directions":4},{"name":"right_secure_closing","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_secure_open","directions":4},{"name":"right_secure_opening","directions":4,"delays":[[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2],[2,1,1,1,1,1,2]]},{"name":"right_secure_deny","directions":4,"delays":[[1,1,1],[1,1,1],[1,1,1],[1,1,1]]},{"name":"right_secure_spark","directions":4,"delays":[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]}],"license":"CC BY-SA-3.0","copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi"} diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right.png b/Resources/Textures/Structures/Doors/windoor.rsi/right.png deleted file mode 100644 index a20fec764b1166bf47060a105e774e32d7234c21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 884 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 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right_open.png b/Resources/Textures/Structures/Doors/windoor.rsi/right_open.png deleted file mode 100644 index fc66fc1d810f122765f2d89934d03c62a5d17413..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 733 zcmV<30wVp1P)@fcWZ(eqp|A7a0@vxm0bkn0SK@o+L&6AkA${fO4DhS#xnf48h^iVeu^L?e?_qn{Z z4SbU)pS%fq-YPKb2XI99n$OqQcWv8l-khJGWH*3APq%^>$C}&W^xVQrb_1%FYS``W zA(J_ZVKvt8e*c?V{O}IDpFbiDL$DjLvEd;*Hiqw=j<%XFU&7ALCn%-(4Jeh|e|Bd7 zw2mJ?fr*LJ{|5nUPu9}9*DSu>3@yt-tJQ*$O)!_sp;oKGaU6aFQoz3UMLjP?#rJ&} zNx-1Q02nSY0ESBpfZ-AYV7SBp7%njYhD!{9;SvL2xD-b)G3C0U=Xud9Dc|=~U=#}h z?RFdGayfb_$t`tQFp)&9UcCA%m}uNx228WttDap9&FX$mH-nr7Lkk&22VH04&=sAEu0n3+pbnj}b?+h8h{NtR2N zOK!NEsbrJORPNxes5vHrOB#yo{YLf=$=5J?OD3 z_Lo?%uDCkn*3KAhMU4XO&njMBfb)~X^YOvKOJgEy`qPPE{KeH<&U;<5twdw>vyart zP%sGjmJC%@1iBrDCPV}5wAGYzu?Wx>h3Ng?H#)62R_)ImYiYSVTpQ>u6#&u-`MA7_&dh0>!>ZrBbW!(2gOGR0YV#oe74@qpoC-Ka9gQ%nb zYWV5%gYWV;hSNJ(0wY{l*ubxrqM20dM<@48uUOJ;wdd;eiL3|tOV6`rI1PmbTGHLz z0~>s1L{(+O=o)c0*|SQz1s}+MJQG^Kh=a5*(@4BtCu@JP4c9Z7K_MLPHOWl1?OrLo(E@ApxXL5G9xzu~<1)3)+ zVc;QQ?;aKSEwMbt%#(+Q2AScPxk46It6jKPss|Cgn3ELxS&2=!bI3OdgbZhUwjN>K zar%zL&yH6hf<)m5*MhYsD#We)?i7aEU(+AKdoQbfD#}Xbn_-g@6BETxZm+LJ6dd<#N0f0@ z(2(zbYtHJlYSXTM((6V681(KX;DNBUe#9lcAj^=xXbyE^lA3c>a$H;tn-`4 z_m@Xz2o<&yJ3^m}UO7mO1!UvX5&(Q$Gkv!0^EnMc6-%Mgd_l=L!&vg^_pwbO7nfZ} zq4CV_oEOCFWkTlVQm2!U?G9Qn#F`Se+KY&yFs!F)W_Q&tP;4ULN3d+^bx#qqzNkHo zG(d=)+t>fKzh>KRaqW(}eRr4Hr1xg0kbUc~28aa5#RBg|G%AbmJFELl%FnW+fKv`7 zl)iN~oHxsTZq^a=g+{*K=Gs+pKBpur^WBKfy!jtlppmRdnM7~E-|6tU>pm`2u}Pb2 z8E^Sc)0#gWG0d;Am8(^R-z$$A=mqB|NUu94UtD2LhpIiy)6e!T3=^z^9fkvzJgOL} zp*A-c%(xWzhsj3Cbmd|J{#=TYv_!Dl*X^ESN({Jl`)?*mdz2r@V!e;b2#N(iEcc+ihZ3qD99Tt z5fGqQAkYol<#@mT+Gpi{Y`G(pEY=al9qH(VagbGkt#SK<+Kz>GbB z&Xb*+=pdCG2Rut7cNjbnpb?rctc^PN!E*Y5r*3;>xS*Qvv-MN0U@C=S8aqQZPs$Sz zgnxsBJ(~4OdjM&i_>q|VWL3Vyq8%EsMQk9-fkDMxXr8R&H>I* zZ6*6lrWBQwj5xf0(WT}v$&?QLIo)f5vgt+DJVc+J#0VmqDxMnEtn(8sMupA8*Lu4r zB7ZbLdNlB0+A-WmylLj&%Q1EF^KXpYC%BGuBHeXN?q>71PgqwB+gQ) z)Cr4gLz9hri#OKmD7N}NqUWXzU0i5rXlL5XMaSi97?B&3m>CqqNMhWQAE_#LfNYd= zw8z_rcZyfUpH#rlZla2PFedX-du*ksAK%GK)GZKXuvNuI{U=0Khu z2k=^z1&A<>+92tJ&%Nwp>{+Y<$EoCn(!;qsuubgE0i+2LBZ4My$jjNYs0)-NJLTl1f?_Hn4tN9Empr*jdTp{5l}8$GCt1R~ z;VWEc$;WEx4IF+c5@Jb@;!KA-?|7O0)BW{$r3*V(A`aDh>6HffG!gny&^(Nd)gPqB zFfoJPdNuEa)q7H-2Qks=g~x}OnE7_Ncvyr%bsN<5S*kofw?=FPeNOfA2fKb1E!)!^ zuI~90$hvjt7b80ubTC?QpGF=b9Ny|0*8*e>#8Amcs!unciG*mLaI=6~(+mKyg}SNw z9jRn{mO4rkhe8>l%cjiQ*K0X%wBVo!TEpWZCek6h^60jXE3O+B|n;a SqQ2}yCWm%(MwZ!QqyGVmRmG$L diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right_secure.png b/Resources/Textures/Structures/Doors/windoor.rsi/right_secure.png deleted file mode 100644 index 1d7d93e2837928d97de4d892468e2574a9f5a5d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1050 zcmV+#1m*jQP)So`;n+bYdC~n!h8vd8uT1#2`0tx zA&>}stq6LM9s;pmg9xDqnVJQf{rCqIOd^my1eML^G*ohH5~6L_+dfC{xQ?9&fwnr**Tx@_nyypj3mP#a@l>&vC+|=H8nL$hGEo7C*bM33Ek^6I158VqkOEn zIn3L=?ths0OtU{0shO3~-0XK>PtO~YPC!}NVH)V|C%4;8x~}uKuXm)-2dw?#`Ty;g zmix))^UEh7+I5SP$r=8+s=Au8M?%CHqg*a0v@Q9w&dHEYK;-Tt8hQPSwA@ zx(<T*4aUJgh=6;Ad)QP z83?tAHV|BB4z?YjY1&kK`^DPf;rE*w;i7z>kCP1$P5?4YBv}ALEdU`jGp*_A=_BrZ zUa+>DqU`T9tsQca+hBa0Y=ABA0?06tWZ@S^s6`8bgeIH|hbtm?9_kzCpr#wJu0FlxFr2)Fq0Hpy;X@JrIQW~H%;DD}x-82Ajvjlq|(budFJJc|0EB_hbtJs0l(@OtA*QC5AI( zYQVz$JXM@@Q)}xP3Jx6Cy*AvNEd;;{M@;!ztdzI-FCqR; zCmOa8fNC%lL%;&xs1RA_#Sy3v!2GYYMweTzQFQ7fH8ozMg~b(asD?rz?ki_@%07*qoM6N<$f@uHco&W#< diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_assembly1.png b/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_assembly1.png deleted file mode 100644 index 0dc3aae8ab805589923140439e6644debb1f8c78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1234 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 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_open.png b/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_open.png deleted file mode 100644 index 4a18cabf760ec90aa975c280bb7b64a6b2a81fc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1055 zcmV+)1mOFLP)RCt{2TTMt*Q562hd84BgIy06Qj)Q|BL5dJULGGd;vJeUk zq2(+RH_{&nEeiXmP1K@gF(p#yn#KXYhsaJH(dDyi#wwe$c4D=N~7_?wOE&;?hg1 z-7ouuO{dfH128^525&(DmX?<-wb6T5kVs64XO@+hV>J+lrfJBE3|LuN6)R<>ZN2db zeIMS#wYDr)KC3do9u8PQa`uPt+b&-eHY+$FF+J^u``E^{IcS03Rau$#`~8@kn?rfz z{5-3`(e@VkRlo(T+wq*RvEN5WM^RT-hqkshUn-UI#p7|8^Z?j}SS;qE9UB|_W85(T z_!m?F;Bcq_z~N8&9<#@j-$}rBdJr2}p)! zmoO1pTSI+)z4#;*jYj7;g$X?v3`z}xW|uJ0*`J4=o^F&F{*31FnZkr@XgdiLyX8}u z2$b#pk=$KWRt3H|z$S6KWtZDdE-5;@LoE69o+#(zgg+jX3hb3ES zn1slxKx<-haxwtTBM8xxj3K?hY-_x@xY+V{vMm54M4k)G44_YrINsP;+IsC_nk)Z( zW(K8)-FW(}2eE-(Ur9-cB2!atJ1UfP4lw6fBF*4r z&RGp98SpnSC}wc%gcJ@i{jC$DaeeyC?X3*RoUnfpg6#*I6!d#6bC2{$k7bgi32$2XbvE}iUV?x1K1hD<_Pu&P$H*FOrexoVIPM diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_opening.png b/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_opening.png deleted file mode 100644 index d4f4038246cc81788c77e4bee848c9a6eadbceb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3019 zcmb_eX*d*m7dK-V6l2K}8Bb+@F&h`!02?Ygb(E9IVj)?QY;c&&W)uh5<>Pv0%qR$mqN5uNq zI8p1Xto5#?@eteMw5%K1+XsuITdw)V#Y(z6TY=YIL#8t`kIb%u1#UHYTwVQOrRDtb z3mCILZVgEeH=UuYzbRM52Q%9r%PH*#FVR^;;c;>6Q9Bor) zXXl#A$_44_@_qBE$@2S$`w)z2Dt%;FOUPQ0rM<|TCu4&6I6VzM*1D=p-t82xp|854 zlb;(Yt7LbJ{yEuUUCd z1sTzUqXJtKtHb4pdx!vhrtt7`e%{!ghi&WRo`^ag#&Yjia%k(@pgDY=bLa5# zH*AB|rkU0|;{8!|MOUn#ITDuE&_*NI5ClGwuC$gS%WO}QBSj8i{u&F=fVQ@n!L?I+ zPMZn(U@PL8Iwzl_NuPFZ*WM7kWAtN3Uy;+_K(dw?)FJYUU(^KQiI%9!{#$coRPlo+ z8fa3*Uwe-#avtk)fjOH?V2#PaCQ(&r`BjmMDt_kn+v=JYR%TtD^&7N2yCc5sD@olf zP>H{h^EH=3uR8%}e9%V4f97kZeZyQw8^uT`GkI46jQIKa-^Lq9MQ-nBR`ms)Lz84D zVeF}>=NGwxSVU)#{=$DA+LKC)sK{mQ?KwNAYiUez4~begqDd8t^i?TJYybq>JjEf8{m-yQ*3F(WzW#XPglm*i>Jaws;$fg*_3WL^K3bI;kU$tC*(rs-pg( zHeGB@@DfW}3(xu6-xSVRtUtws@zJR#QfGo=lZ7DRc zT9P@+qGr8OkGw0>?673w12Y}n#gUggsd#J0w|Z*ZcP;nVKA#8PYXkARk@-cru-}3! zW|jh+{`|bS48mFn8mzMURq{y!H-^=%JvH>zO5X!)f0Mv;h{?`N~e ze^`F0QIjdVo^@uWsp01^iWElb&{sxw>WPKb0rsO>yxo5}^Xe%8Yu&XM&I7~;V~6+x zqN~L2OVPm3JQm=&gfQNQ#+co^+LTTv_W%TrS7lDcn-)c02waKXnGcmp3+cevMd|ZQ z3om_pl#crYAR{6edVH=q?0HVrk2!sb~gSAJlJo)Np-DYwj z$}%Mu3|G{3t3CdXy`A#V(K&0jAO)=P z49BFjd#YuE80({2&v2uZ_Tq73Kz&OJs6WwVQ`k#agU(zgaoa9T&;ySShyiy7VP;AJBT| zl=9fwuZagI_cR$?j83n1B_$>Qy(Vwe{+DabcTUM#gIPCOi(7zQrL}n#*Pwmw=lceg z2tR$D=$57y441uqB+!x*dmI}Gd0(+iV!#S_%!w-b$$UTC_U|{@2QAqxW?Us*+zNt3 zpzo{M2r?(l4FvJ#z#vx~f$SFVAz%vgjz;$}m)epeR1;8je^y~A5!a5Q`TAmWkW|cKBDHZtYJ>*)3t54-UYcsQx9wD zB8dJEa84xsV$R+cuXa_1NbK-a^3O)OW{h zp$T(R%!RbD*tmz0w-gBC2^HYI{qBwUP*syE;3cY5_)QjjX@|Go(m1(AT~yh9KhZwh z`T(4|xO(&+zX+(t=SV=Om65-#T&Ak?t%zFzjrr_@|)Fhr9dLOP=NMEdyg zUD99#S;HP?$Teb|zZ>L(QT1cyI6b5c&(v#J((?}T8(Z61cdoLSPshAAcOw#1xW8}q z-;y-P%89i{Ak48-fns8+GUYE?igP5g0@aT9cH6OhpQ^jPFHDl#L-Us@vl?|G9v4zx<7~sH7UMnypy8ZB#kfP7JPi@3w4rq`jy^P8D%&fgOKTE*@s~JA;VO^mi9ici~3LsDy z-|JG+m*#+UN{-|6mQ(@sFNGm&uvv6rL1+RB5JOX2Q!VR`1|Q3_UmP2|t9wF$5ZVN? zfGmYw#2}BO0Pws3MHe7NEYKQ+ARJ}S#9+NB1{noT1Bt4hV$}g5W;EP00?@>G?#d?CYGv{C6wkGDEkhe*q}Ntt|im diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_spark.png b/Resources/Textures/Structures/Doors/windoor.rsi/right_secure_spark.png deleted file mode 100644 index 2523e4fcc81ba48040672d96c39d46072b17b147..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2661 zcmbtWdpy(o8{aIHFo~QN8zL2PBxkz#8WD4w5OSMNj+9(m9oc4+W-g~(Iwwvpb4fVv zg$`i~X@%TPDlKx^hA?Ae_M6}9{PjD3{{DEL=k@u#pXd2}UZ3arykAd}i?gkQ983-b z0x6*FtX(BGe_M9SNOa2kE5{^eSA^Zg8z7Kk$F_j~&{sSF0?DbNtu5W7bLMmXuB#94 zPoVeY=!8*Ro82S5?UKu_|L`_c->;tbEhFV)00nXI&WHR`8>?&jhEZ;AkNrVv?pmxv zJ6+PXV^unf$r0;U3k&^!Z`ya?O}{Z%zaD-0nqKIg4p?FGbXRs6{XzF}lh1y(oiojs zX={yd7P#KGuiTmt@w0DCH;3F+(mbIVX9ZC{{C^lJ^ic+!R$WSiSbs|Ubs}5(R@&U99^RA=gt{SVLpuirF-{^`| zuby96czFN5Vpi<9g5Kj05&ySVPIY137JInd!9=(;oBoM^5^>=$X;Y59inI`a;|w$` z7ZShLj{-Hcgw|I03v)9w9m57pc5xJYidu>1H|qzBj;-+-llZ)zS-R;{Uw?6c4!=PB zD(-A8TpVXyZsda)Q{4b!he^{t;JNvV*A|;&rK6)0b#;V``~|#&{oqWoccs0G&GDMG zP&_9JFGzk`*YJ=c?Cd9fvk?n}ChpVTPEFmt88rUag{Y;b@MPn2PfAL1KO440Fc#!j z+eeVlGr~G9Y0`5)^-1_%n7LT|nXQ-a-J+9ShNx>j`Rjs-;B&)^z@+xY&A^TC1#||3 zL=1dhUVOD5P8MF`WFuC?vTjbB)C|t^F$>LveM2HLIwMO$_~9VSTdi?xwMl#$z#cUd>-Gfsl}00upJdnf1r`L z8kr4G$OoJeVJHn5Cco_*9$QkVGU{e2_$Pv}+~xDw*U+KZwah7DLtUmXMJr9n=v2BY z%A~#ZmuJQN@T91y-Cw?ceC!va1TS9uk5@mmdi+7(5@fZgvtRQs_#4XFLm_kD?5I$U z`pozOUaH21&W+8g>O=+yn#yg+ysSG8q)N^=_nMMUA9@~?LR#DKQ=WRHRD77DWf*}5 zO=oQOq5Y$$beEEVsPpbMs!HfR4=GRXQ7gzh?;r!VI&E9_&;GQ-=DUoJS1?M7BBSH- zFQa?8ZFeM7>t2V2jD{lm)oY!Vv?fc4@9&Z zMB(a+^IC6feJ7mC^fitbX{d;f?9d49+Y8J$*3U;;#!xh@uxJiPhkDQ~3^Oh` z5b!q84(`#{)YnY5!_4W0e z{f_amTi0z2x31Xt8u@6Szs{Wm_|VEluD)3=v}F7dfzn;Vkj=^Ndk!`BrmWUblHWDODl{rt-^W00q^6%hRZOWsAW z#$cD}9);C0NR0M&p}SwgYd}IS*nCf|)KjVH0H_y;$S3C|Za2h@8d(D}fJb4hE65e( zlT64y6wN$eZ@Y2Y)Vbi@`LvI=eDYzUN1N2#L48eont1@2_fKMI7Gwkh4+8wB8)GIT z&=pCk#1}B48vTeuIa%+|)Xdw?PK~_Dy{>*^9(b<9vC;RNczZ&hqeV+!Z0pUIA0iS3 z(N3!m;N0%H!R6s>?MCs|_*80jRc(?o5X*pBa@FubyI6rizM>jg>3!PpWF>Mv!v%xIUTcEWy~GTk-Q z^-9i;czA@Yg-tz2G^ijCQD4E+gf3p-GAPAdbG4vG$`v7pN3qXdl70-R@VD{p0PZ%f zDsf~&B)GoBaVQ3*EBP+$%M1fYTar{+I1_S?`|_@Nz6Fd=2CO0n+{?M(dn~hnO4+d} zAJUOr=*&RcZe0m0u@5rb+ZvZyz6*B#SX0S}L7k;#-c*Vs)XWpe zDOW4V+v@hwHZ;wiL;R2u*aPD(&0xiy!9XYM`!xw8!V2vPD9p dk!tKW606P5zP$HAkz{TJp>3S4tE>X<{09OpI3oZ6 diff --git a/Resources/Textures/Structures/Doors/windoor.rsi/right_spark.png b/Resources/Textures/Structures/Doors/windoor.rsi/right_spark.png deleted file mode 100644 index a66dcf51c8e723eea49a74fedbbe9d97a4254580..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2435 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 CcAGu` From 28f3424680e7ed7c8bd942c1b28da9d5176e9ffc Mon Sep 17 00:00:00 2001 From: Kara Dinyes Date: Sun, 25 Jul 2021 20:36:55 -0700 Subject: [PATCH 04/83] sound + locked prototypes --- Resources/Audio/Machines/windoor_open.ogg | Bin 0 -> 20361 bytes .../Entities/Structures/Doors/windoor.yml | 36 ++++++++++++++++++ .../Entities/Structures/Windoors/base.yml | 23 +++++------ 3 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 Resources/Audio/Machines/windoor_open.ogg diff --git a/Resources/Audio/Machines/windoor_open.ogg b/Resources/Audio/Machines/windoor_open.ogg new file mode 100644 index 0000000000000000000000000000000000000000..26f094b597131f260dcb58bf526185d4c47be165 GIT binary patch literal 20361 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 literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/Entities/Structures/Doors/windoor.yml b/Resources/Prototypes/Entities/Structures/Doors/windoor.yml index b12f799719..57511c229c 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/windoor.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/windoor.yml @@ -9,3 +9,39 @@ parent: BaseSecureWindoor name: secure windoor description: It's a sturdy window and a sliding door. Wow! + +# Bar windoor +- type: entity + parent: Windoor + id: WindoorBarLocked + suffix: Bar, Locked + components: + - type: AccessReader + access: [["Bar"]] + +# Chemistry windoor +- type: entity + parent: WindoorSecure + id: WindoorMedicalLocked + suffix: Medical, Locked + components: + - type: AccessReader + access: [["Medical"]] + +# HOP's office windoor +- type: entity + parent: WindoorSecure + id: WindoorCommandLocked + suffix: Command, Locked + components: + - type: AccessReader + access: [["Command"]] + +# Cargo windoor +- type: entity + parent: Windoor + id: WindoorCargoLocked + suffix: Cargo, Locked + components: + - type: AccessReader + access: [["Cargo"]] diff --git a/Resources/Prototypes/Entities/Structures/Windoors/base.yml b/Resources/Prototypes/Entities/Structures/Windoors/base.yml index 7a57094414..ccb3fe258c 100644 --- a/Resources/Prototypes/Entities/Structures/Windoors/base.yml +++ b/Resources/Prototypes/Entities/Structures/Windoors/base.yml @@ -6,15 +6,6 @@ mode: SnapgridCenter components: - type: InteractionOutline - - type: Airlock - - type: Door - - type: Wires - BoardName: "Windoor Control" - LayoutId: Airlock - - type: UserInterface - interfaces: - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface - type: Physics fixtures: - shape: @@ -61,11 +52,21 @@ max: 2 - !type:DoActsBehavior acts: [ "Destruction" ] + - type: AccessReader + - type: Airlock + - type: Door + - type: Wires + BoardName: "Windoor Control" + LayoutId: Airlock + - type: UserInterface + interfaces: + - key: enum.WiresUiKey.Key + type: WiresBoundUserInterface - type: Appearance visuals: - type: AirlockVisualizer - open_sound: /Audio/Machines/airlock_open.ogg - close_sound: /Audio/Machines/airlock_close.ogg + open_sound: /Audio/Machines/windoor_open.ogg + close_sound: /Audio/Machines/windoor_open.ogg deny_sound: /Audio/Machines/airlock_deny.ogg hasMaintenancePanel: false openCloseUnlit: false From 8aa4f998de198886796af54cc414a9d2b4257bf9 Mon Sep 17 00:00:00 2001 From: mirrorcult Date: Sat, 31 Jul 2021 04:50:32 -0700 Subject: [PATCH 05/83] Metabolism refactor (#4395) * metabolism -> respirator, add reageanteffect and reagenteffectcondition, start on metabolizercomp/system * move LiverBehavior metabolism logic to Metabolizer * minor tweaks and update all YAML * how about actually taking conditions into account * off by one * removals * reviews --- Content.Client/Entry/IgnoredComponents.cs | 3 +- .../Tests/Body/LungTest.cs | 12 +- Content.Server/Body/Behavior/LiverBehavior.cs | 89 +------ .../Body/Circulatory/BloodstreamComponent.cs | 4 +- .../Body/Metabolism/MetabolizerComponent.cs | 57 +++++ .../Body/Metabolism/MetabolizerSystem.cs | 107 ++++++++ .../Respiratory/RespiratorComponent.cs} | 7 +- .../Respiratory/RespiratorSystem.cs} | 8 +- .../Chemistry/Metabolism/DefaultDrink.cs | 35 --- .../Chemistry/Metabolism/DefaultFood.cs | 38 --- .../Metabolism/HealthChangeMetabolism.cs | 72 ------ .../ReagentThreshold.cs | 26 ++ .../Chemistry/ReagentEffects/HealthChange.cs | 56 +++++ .../Chemistry/ReagentEffects/SatiateHunger.cs | 28 +++ .../Chemistry/ReagentEffects/SatiateThirst.cs | 28 +++ .../ActionBlocker/ActionBlockerSystem.cs | 2 +- .../Metabolism}/ShiverAttemptEvent.cs | 2 +- .../Metabolism}/SweatAttemptEvent.cs | 2 +- .../Metabolizable/DefaultMetabolizable.cs | 36 --- .../Chemistry/Metabolizable/IMetabolizable.cs | 23 -- .../Chemistry/Reagent/ReagentEffect.cs | 23 ++ .../Reagent/ReagentEffectCondition.cs | 13 + .../Chemistry/Reagent/ReagentPrototype.cs | 5 - .../Prototypes/Body/Mechanisms/human.yml | 238 +++++++++++++++--- .../Entities/Mobs/NPCs/simplemob.yml | 2 +- .../Prototypes/Entities/Mobs/NPCs/xeno.yml | 2 +- .../Entities/Mobs/Species/human.yml | 2 +- .../Prototypes/Entities/Mobs/Species/vox.yml | 2 +- .../Reagents/Consumable/Drink/alcohol.yml | 11 - .../Reagents/Consumable/Drink/drinks.yml | 21 -- .../Reagents/Consumable/Drink/juice.yml | 39 --- .../Reagents/Consumable/Drink/soda.yml | 9 - .../Reagents/Consumable/Food/condiments.yml | 24 -- .../Reagents/Consumable/Food/ingredients.yml | 30 --- Resources/Prototypes/Reagents/chemicals.yml | 10 +- Resources/Prototypes/Reagents/medicine.yml | 64 +---- 36 files changed, 572 insertions(+), 558 deletions(-) create mode 100644 Content.Server/Body/Metabolism/MetabolizerComponent.cs create mode 100644 Content.Server/Body/Metabolism/MetabolizerSystem.cs rename Content.Server/{Metabolism/MetabolismComponent.cs => Body/Respiratory/RespiratorComponent.cs} (98%) rename Content.Server/{Metabolism/MetabolismSystem.cs => Body/Respiratory/RespiratorSystem.cs} (50%) delete mode 100644 Content.Server/Chemistry/Metabolism/DefaultDrink.cs delete mode 100644 Content.Server/Chemistry/Metabolism/DefaultFood.cs delete mode 100644 Content.Server/Chemistry/Metabolism/HealthChangeMetabolism.cs create mode 100644 Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs create mode 100644 Content.Server/Chemistry/ReagentEffects/HealthChange.cs create mode 100644 Content.Server/Chemistry/ReagentEffects/SatiateHunger.cs create mode 100644 Content.Server/Chemistry/ReagentEffects/SatiateThirst.cs rename Content.Shared/{Metabolism/Events => Body/Metabolism}/ShiverAttemptEvent.cs (85%) rename Content.Shared/{Metabolism/Events => Body/Metabolism}/SweatAttemptEvent.cs (85%) delete mode 100644 Content.Shared/Chemistry/Metabolizable/DefaultMetabolizable.cs delete mode 100644 Content.Shared/Chemistry/Metabolizable/IMetabolizable.cs create mode 100644 Content.Shared/Chemistry/Reagent/ReagentEffect.cs create mode 100644 Content.Shared/Chemistry/Reagent/ReagentEffectCondition.cs diff --git a/Content.Client/Entry/IgnoredComponents.cs b/Content.Client/Entry/IgnoredComponents.cs index f5d976796d..388c56ae43 100644 --- a/Content.Client/Entry/IgnoredComponents.cs +++ b/Content.Client/Entry/IgnoredComponents.cs @@ -154,7 +154,8 @@ namespace Content.Client.Entry "GasPassiveGate", "GasValve", "GasThermoMachine", - "Metabolism", + "Respirator", + "Metabolizer", "AiFactionTag", "PressureProtection", "AMEPart", diff --git a/Content.IntegrationTests/Tests/Body/LungTest.cs b/Content.IntegrationTests/Tests/Body/LungTest.cs index 580984374b..d1ac590adf 100644 --- a/Content.IntegrationTests/Tests/Body/LungTest.cs +++ b/Content.IntegrationTests/Tests/Body/LungTest.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; using Content.Server.Atmos; using Content.Server.Body.Behavior; using Content.Server.Body.Circulatory; -using Content.Server.Metabolism; +using Content.Server.Body.Respiratory; using Content.Shared.Atmos; using Content.Shared.Body.Components; using NUnit.Framework; @@ -32,7 +32,7 @@ namespace Content.IntegrationTests.Tests.Body template: HumanoidTemplate preset: HumanPreset centerSlot: torso - - type: Metabolism + - type: Respirator metabolismHeat: 5000 radiatedHeat: 400 implicitHeatRegulation: 5000 @@ -148,7 +148,7 @@ namespace Content.IntegrationTests.Tests.Body MapId mapId; IMapGrid grid = null; - MetabolismComponent metabolism = null; + RespiratorComponent respirator = null; IEntity human = null; var testMapName = "Maps/Test/Breathing/3by3-20oxy-80nit.yml"; @@ -169,8 +169,8 @@ namespace Content.IntegrationTests.Tests.Body Assert.True(human.TryGetComponent(out SharedBodyComponent body)); Assert.True(body.HasMechanismBehavior()); - Assert.True(human.TryGetComponent(out metabolism)); - Assert.False(metabolism.Suffocating); + Assert.True(human.TryGetComponent(out respirator)); + Assert.False(respirator.Suffocating); }); var increment = 10; @@ -178,7 +178,7 @@ namespace Content.IntegrationTests.Tests.Body for (var tick = 0; tick < 600; tick += increment) { await server.WaitRunTicks(increment); - Assert.False(metabolism.Suffocating, $"Entity {human.Name} is suffocating on tick {tick}"); + Assert.False(respirator.Suffocating, $"Entity {human.Name} is suffocating on tick {tick}"); } await server.WaitIdleAsync(); diff --git a/Content.Server/Body/Behavior/LiverBehavior.cs b/Content.Server/Body/Behavior/LiverBehavior.cs index 95897b320a..aa40d1b142 100644 --- a/Content.Server/Body/Behavior/LiverBehavior.cs +++ b/Content.Server/Body/Behavior/LiverBehavior.cs @@ -1,7 +1,6 @@ using System.Linq; using Content.Server.Body.Circulatory; using Content.Shared.Body.Networks; -using Content.Shared.Chemistry.Metabolizable; using Content.Shared.Chemistry.Reagent; using Robust.Shared.IoC; using Robust.Shared.Prototypes; @@ -13,52 +12,8 @@ namespace Content.Server.Body.Behavior /// public class LiverBehavior : MechanismBehavior { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - private float _accumulatedFrameTime; - /// - /// Delay time that determines how often to metabolise blood contents (in seconds). - /// - private float _updateIntervalSeconds = 1.0f; - - /// - /// Whether the liver is functional. - /// - //[ViewVariables] private bool _liverFailing = false; - - /// - /// Modifier for alcohol damage. - /// - //[DataField("alcoholLethality")] - //[ViewVariables] private float _alcoholLethality = 0.005f; - - /// - /// Modifier for alcohol damage. - /// - //[DataField("alcoholExponent")] - //[ViewVariables] private float _alcoholExponent = 1.6f; - - /// - /// Toxin volume that can be purged without damage. - /// - //[DataField("toxinTolerance")] - //[ViewVariables] private float _toxinTolerance = 3f; - - /// - /// Toxin damage modifier. - /// - //[DataField("toxinLethality")] - //[ViewVariables] private float _toxinLethality = 0.01f; - - /// - /// Loops through each reagent in _internalSolution, - /// and calls for each of them. - /// Also handles toxins and alcohol. - /// - /// - /// The time since the last update in seconds. - /// public override void Update(float frameTime) { if (Body == null) @@ -68,51 +23,13 @@ namespace Content.Server.Body.Behavior _accumulatedFrameTime += frameTime; - // Update at most once every _updateIntervalSeconds - if (_accumulatedFrameTime < _updateIntervalSeconds) + // Update at most once per second + if (_accumulatedFrameTime < 1) { return; } - _accumulatedFrameTime -= _updateIntervalSeconds; - - if (!Body.Owner.TryGetComponent(out BloodstreamComponent? bloodstream)) - { - return; - } - - if (bloodstream.Solution.CurrentVolume <= ReagentUnit.Zero) - { - return; - } - - // Run metabolism for each reagent, remove metabolized reagents - // Using ToList here lets us edit reagents while iterating - foreach (var reagent in bloodstream.Solution.ReagentList.ToList()) - { - if (!_prototypeManager.TryIndex(reagent.ReagentId, out ReagentPrototype? prototype)) - { - continue; - } - - // How much reagent is available to metabolise? - // This needs to be passed to other functions that have metabolism rate information, such that they don't "overmetabolise" a reagent. - var availableReagent = bloodstream.Solution.Solution.GetReagentQuantity(reagent.ReagentId); - - //TODO BODY Check if it's a Toxin. If volume < _toxinTolerance, just remove it. If greater, add damage = volume * _toxinLethality - //TODO BODY Check if it has BoozePower > 0. Affect drunkenness, apply damage. Proposed formula (SS13-derived): damage = sqrt(volume) * BoozePower^_alcoholExponent * _alcoholLethality / 10 - //TODO BODY Liver failure. - - //TODO Make sure reagent prototypes actually have the toxin and boozepower vars set. - - // Run metabolism code for each reagent - foreach (var metabolizable in prototype.Metabolism) - { - var reagentDelta = metabolizable.Metabolize(Body.Owner, reagent.ReagentId, _updateIntervalSeconds, availableReagent); - bloodstream.Solution.TryRemoveReagent(reagent.ReagentId, reagentDelta); - availableReagent -= reagentDelta; - } - } + _accumulatedFrameTime -= 1; } } } diff --git a/Content.Server/Body/Circulatory/BloodstreamComponent.cs b/Content.Server/Body/Circulatory/BloodstreamComponent.cs index df90cd6fc6..998e3d97bb 100644 --- a/Content.Server/Body/Circulatory/BloodstreamComponent.cs +++ b/Content.Server/Body/Circulatory/BloodstreamComponent.cs @@ -2,8 +2,8 @@ using System; using System.Linq; using Content.Server.Atmos; using Content.Server.Atmos.EntitySystems; +using Content.Server.Body.Respiratory; using Content.Server.Chemistry.Components; -using Content.Server.Metabolism; using Content.Shared.Atmos; using Content.Shared.Body.Networks; using Content.Shared.Chemistry.Reagent; @@ -72,7 +72,7 @@ namespace Content.Server.Body.Circulatory { var atmosphereSystem = EntitySystem.Get(); - if (!Owner.TryGetComponent(out MetabolismComponent? metabolism)) + if (!Owner.TryGetComponent(out RespiratorComponent? metabolism)) { atmosphereSystem.Merge(to, Air); Air.Clear(); diff --git a/Content.Server/Body/Metabolism/MetabolizerComponent.cs b/Content.Server/Body/Metabolism/MetabolizerComponent.cs new file mode 100644 index 0000000000..b74926ff57 --- /dev/null +++ b/Content.Server/Body/Metabolism/MetabolizerComponent.cs @@ -0,0 +1,57 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using Content.Shared.Chemistry.Reagent; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization.Manager.Attributes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary; + +namespace Content.Server.Body.Metabolism +{ + /// + /// Handles metabolizing various reagents with given effects. + /// + [RegisterComponent] + public class MetabolizerComponent : Component + { + public override string Name => "Metabolizer"; + + public float AccumulatedFrametime = 0.0f; + + /// + /// How often to metabolize reagents, in seconds. + /// + /// + [DataField("updateFrequency")] + public float UpdateFrequency = 1.0f; + + /// + /// Whether this metabolizer should attempt to metabolize chemicals in its parent bodies' bloodstream, + /// as opposed to a solution container on the metabolizing entity itself. + /// + [DataField("takeFromBloodstream")] + public bool TakeFromBloodstream = true; + + /// + /// A dictionary mapping reagent string IDs to a list of effects & associated metabolism rate. + /// + /// + [DataField("metabolisms", required: true, customTypeSerializer:typeof(PrototypeIdDictionarySerializer))] + public Dictionary Metabolisms = default!; + } + + [DataDefinition] + public class ReagentEffectsEntry + { + /// + /// Amount of reagent to metabolize, per metabolism cycle. + /// + [DataField("metabolismRate")] + public ReagentUnit MetabolismRate = ReagentUnit.New(1.0f); + + /// + /// A list of effects to apply when these reagents are metabolized. + /// + [DataField("effects", required: true)] + public ReagentEffect[] Effects = default!; + } +} diff --git a/Content.Server/Body/Metabolism/MetabolizerSystem.cs b/Content.Server/Body/Metabolism/MetabolizerSystem.cs new file mode 100644 index 0000000000..249ca13391 --- /dev/null +++ b/Content.Server/Body/Metabolism/MetabolizerSystem.cs @@ -0,0 +1,107 @@ +using System.Collections.Generic; +using System.Linq; +using Content.Server.Body.Circulatory; +using Content.Server.Chemistry.Components; +using Content.Shared.Body.Components; +using Content.Shared.Body.Mechanism; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Chemistry.Solution; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; + +namespace Content.Server.Body.Metabolism +{ + // TODO mirror in the future working on mechanisms move updating here to BodySystem so it can be ordered? + public class MetabolizerSystem : EntitySystem + { + public override void Update(float frameTime) + { + base.Update(frameTime); + + foreach (var metab in ComponentManager.EntityQuery(false)) + { + metab.AccumulatedFrametime += frameTime; + + // Only update as frequently as it should + if (metab.AccumulatedFrametime >= metab.UpdateFrequency) + { + metab.AccumulatedFrametime = 0.0f; + TryMetabolize(metab); + } + } + } + + private void TryMetabolize(MetabolizerComponent comp) + { + var owner = comp.Owner; + var reagentList = new List(); + SolutionContainerComponent? solution = null; + SharedBodyComponent? body = null; + + // if this field is passed we should try and take from the bloodstream over anything else + if (comp.TakeFromBloodstream && owner.TryGetComponent(out var mech)) + { + body = mech.Body; + if (body != null) + { + if (body.Owner.TryGetComponent(out var bloodstream) + && bloodstream.Solution.CurrentVolume >= ReagentUnit.Zero) + { + solution = bloodstream.Solution; + reagentList = bloodstream.Solution.ReagentList.ToList(); + } + } + } + else if (owner.TryGetComponent(out var sol)) + { + // if we have no mechanism/body but a solution container instead, + // we'll just use that to metabolize from + solution = sol; + reagentList = sol.ReagentList.ToList(); + } + if (solution == null || reagentList.Count == 0) + { + // We're all outta ideas on where to metabolize from + return; + } + + // Run metabolism for each reagent, remove metabolized reagents + foreach (var reagent in reagentList) + { + if (!comp.Metabolisms.ContainsKey(reagent.ReagentId)) + continue; + + var metabolism = comp.Metabolisms[reagent.ReagentId]; + // Run metabolism code for each reagent + foreach (var effect in metabolism.Effects) + { + var ent = body != null ? body.Owner : owner; + var conditionsMet = true; + if (effect.Conditions != null) + { + // yes this is 3 nested for loops, but all of these lists are + // basically guaranteed to be small or empty + foreach (var condition in effect.Conditions) + { + if (!condition.Condition(ent, reagent)) + { + conditionsMet = false; + break; + } + } + } + + if (!conditionsMet) + return; + + // If we're part of a body, pass that entity to Metabolize + // Otherwise, just pass our owner entity, maybe we're a plant or something + effect.Metabolize(ent, reagent); + } + + solution.TryRemoveReagent(reagent.ReagentId, metabolism.MetabolismRate); + } + } + } +} diff --git a/Content.Server/Metabolism/MetabolismComponent.cs b/Content.Server/Body/Respiratory/RespiratorComponent.cs similarity index 98% rename from Content.Server/Metabolism/MetabolismComponent.cs rename to Content.Server/Body/Respiratory/RespiratorComponent.cs index 4898692ab9..2aec76e351 100644 --- a/Content.Server/Metabolism/MetabolismComponent.cs +++ b/Content.Server/Body/Respiratory/RespiratorComponent.cs @@ -13,7 +13,6 @@ using Content.Shared.Atmos; using Content.Shared.Body.Components; using Content.Shared.Damage; using Content.Shared.Damage.Components; -using Content.Shared.Metabolism.Events; using Content.Shared.MobState; using Content.Shared.Notification.Managers; using Robust.Shared.GameObjects; @@ -21,14 +20,14 @@ using Robust.Shared.Localization; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.ViewVariables; -namespace Content.Server.Metabolism +namespace Content.Server.Body.Respiratory { [RegisterComponent] - public class MetabolismComponent : Component + public class RespiratorComponent : Component { [ComponentDependency] private readonly SharedBodyComponent? _body = default!; - public override string Name => "Metabolism"; + public override string Name => "Respirator"; private float _accumulatedFrameTime; diff --git a/Content.Server/Metabolism/MetabolismSystem.cs b/Content.Server/Body/Respiratory/RespiratorSystem.cs similarity index 50% rename from Content.Server/Metabolism/MetabolismSystem.cs rename to Content.Server/Body/Respiratory/RespiratorSystem.cs index 6616d013d5..424b1e4dce 100644 --- a/Content.Server/Metabolism/MetabolismSystem.cs +++ b/Content.Server/Body/Respiratory/RespiratorSystem.cs @@ -1,18 +1,18 @@ using JetBrains.Annotations; using Robust.Shared.GameObjects; -namespace Content.Server.Metabolism +namespace Content.Server.Body.Respiratory { [UsedImplicitly] - public class MetabolismSystem : EntitySystem + public class RespiratorSystem : EntitySystem { public override void Update(float frameTime) { base.Update(frameTime); - foreach (var metabolism in ComponentManager.EntityQuery(true)) + foreach (var respirator in ComponentManager.EntityQuery(false)) { - metabolism.Update(frameTime); + respirator.Update(frameTime); } } } diff --git a/Content.Server/Chemistry/Metabolism/DefaultDrink.cs b/Content.Server/Chemistry/Metabolism/DefaultDrink.cs deleted file mode 100644 index 255200f103..0000000000 --- a/Content.Server/Chemistry/Metabolism/DefaultDrink.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Content.Server.Nutrition.Components; -using Content.Shared.Chemistry; -using Content.Shared.Chemistry.Metabolizable; -using Content.Shared.Chemistry.Reagent; -using Robust.Shared.GameObjects; -using Robust.Shared.Serialization.Manager.Attributes; - -namespace Content.Server.Chemistry.Metabolism -{ - /// - /// Default metabolism for drink reagents. Attempts to find a ThirstComponent on the target, - /// and to update it's thirst values. Inherits metabolisation rate logic from DefaultMetabolizable. - /// - [DataDefinition] - public class DefaultDrink : DefaultMetabolizable - { - //How much thirst is satiated when 1u of the reagent is metabolized - [DataField("hydrationFactor")] - public float HydrationFactor { get; set; } = 30.0f; - - //Remove reagent at set rate, satiate thirst if a ThirstComponent can be found - public override ReagentUnit Metabolize(IEntity solutionEntity, string reagentId, float tickTime, ReagentUnit availableReagent) - { - // use DefaultMetabolism to determine how much reagent we should metabolize - var amountMetabolized = base.Metabolize(solutionEntity, reagentId, tickTime, availableReagent); - - // If metabolizing entity has a ThirstComponent, hydrate them. - if (solutionEntity.TryGetComponent(out ThirstComponent? thirst)) - thirst.UpdateThirst(amountMetabolized.Float() * HydrationFactor); - - //Return amount of reagent to be removed, remove reagent regardless of ThirstComponent presence - return amountMetabolized; - } - } -} diff --git a/Content.Server/Chemistry/Metabolism/DefaultFood.cs b/Content.Server/Chemistry/Metabolism/DefaultFood.cs deleted file mode 100644 index fafcf58dd1..0000000000 --- a/Content.Server/Chemistry/Metabolism/DefaultFood.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Content.Server.Nutrition.Components; -using Content.Shared.Chemistry; -using Content.Shared.Chemistry.Metabolizable; -using Content.Shared.Chemistry.Reagent; -using Robust.Shared.GameObjects; -using Robust.Shared.Serialization.Manager.Attributes; - -namespace Content.Server.Chemistry.Metabolism -{ - /// - /// Default metabolism for food reagents. Attempts to find a HungerComponent on the target, - /// and to update it's hunger values. Inherits metabolisation rate logic from DefaultMetabolizable. - /// - [DataDefinition] - public class DefaultFood : DefaultMetabolizable - { - - /// - /// How much hunger is satiated when 1u of the reagent is metabolized - /// - [DataField("nutritionFactor")] public float NutritionFactor { get; set; } = 30.0f; - - - //Remove reagent at set rate, satiate hunger if a HungerComponent can be found - public override ReagentUnit Metabolize(IEntity solutionEntity, string reagentId, float tickTime, ReagentUnit availableReagent) - { - // use DefaultMetabolism to determine how much reagent we should metabolize - var amountMetabolized = base.Metabolize(solutionEntity, reagentId, tickTime, availableReagent); - - // If metabolizing entity has a HungerComponent, feed them. - if (solutionEntity.TryGetComponent(out HungerComponent? hunger)) - hunger.UpdateFood(amountMetabolized.Float() * NutritionFactor); - - //Return amount of reagent to be removed. Reagent is removed regardless of HungerComponent presence - return amountMetabolized; - } - } -} diff --git a/Content.Server/Chemistry/Metabolism/HealthChangeMetabolism.cs b/Content.Server/Chemistry/Metabolism/HealthChangeMetabolism.cs deleted file mode 100644 index bbf2534505..0000000000 --- a/Content.Server/Chemistry/Metabolism/HealthChangeMetabolism.cs +++ /dev/null @@ -1,72 +0,0 @@ -using Content.Shared.Chemistry; -using Content.Shared.Chemistry.Metabolizable; -using Content.Shared.Chemistry.Reagent; -using Robust.Shared.GameObjects; -using Robust.Shared.Serialization.Manager.Attributes; -using Content.Shared.Damage; -using Content.Shared.Damage.Components; - -namespace Content.Server.Chemistry.Metabolism -{ - /// - /// Default metabolism for medicine reagents. Attempts to find a DamageableComponent on the target, - /// and to update its damage values. Inherits metabolisation rate logic from DefaultMetabolizable. - /// - [DataDefinition] - public class HealthChangeMetabolism : DefaultMetabolizable - { - - /// - /// How much damage is changed when 1u of the reagent is metabolized. - /// - [DataField("healthChange")] - public float HealthChange { get; set; } = 1.0f; - - /// - /// Class of damage changed, Brute, Burn, Toxin, Airloss. - /// - [DataField("damageClass")] - public DamageClass DamageType { get; set; } = DamageClass.Brute; - - private float _accumulatedHealth; - - /// - /// Remove reagent at set rate, changes damage if a DamageableComponent can be found. - /// - /// - /// - /// - /// Reagent available to be metabolized. - /// - public override ReagentUnit Metabolize(IEntity solutionEntity, string reagentId, float tickTime, ReagentUnit availableReagent) - { - // use DefaultMetabolism to determine how much reagent we should metabolize - var amountMetabolized = base.Metabolize(solutionEntity, reagentId, tickTime, availableReagent); - - // how much does this much reagent heal for - var healthChangeAmount = HealthChange * amountMetabolized.Float(); - - if (solutionEntity.TryGetComponent(out IDamageableComponent? health)) - { - // Heal damage by healthChangeAmmount, rounding down to nearest integer - health.ChangeDamage(DamageType, (int) healthChangeAmount, true); - - // Store decimal remainder of healthChangeAmmount in _accumulatedHealth - _accumulatedHealth += (healthChangeAmount - (int) healthChangeAmount); - - if (_accumulatedHealth >= 1) - { - health.ChangeDamage(DamageType, 1, true); - _accumulatedHealth -= 1; - } - - else if(_accumulatedHealth <= -1) - { - health.ChangeDamage(DamageType, -1, true); - _accumulatedHealth += 1; - } - } - return amountMetabolized; - } - } -} diff --git a/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs b/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs new file mode 100644 index 0000000000..cfc0177d41 --- /dev/null +++ b/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs @@ -0,0 +1,26 @@ +using Content.Shared.Body.Components; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Chemistry.Solution; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization.Manager.Attributes; + +namespace Content.Server.Chemistry.ReagentEffectConditions +{ + /// + /// Used for implementing reagent effects that require a certain amount of reagent before it should be applied. + /// For instance, overdoses. + /// + public class ReagentThreshold : ReagentEffectCondition + { + [DataField("min")] + public ReagentUnit Min = ReagentUnit.Zero; + + [DataField("max")] + public ReagentUnit Max = ReagentUnit.MaxValue; + + public override bool Condition(IEntity solutionEntity, Solution.ReagentQuantity reagent) + { + return reagent.Quantity >= Min && reagent.Quantity < Max; + } + } +} diff --git a/Content.Server/Chemistry/ReagentEffects/HealthChange.cs b/Content.Server/Chemistry/ReagentEffects/HealthChange.cs new file mode 100644 index 0000000000..47b640cdfc --- /dev/null +++ b/Content.Server/Chemistry/ReagentEffects/HealthChange.cs @@ -0,0 +1,56 @@ +using Content.Shared.Chemistry; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Chemistry.Solution; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization.Manager.Attributes; +using Content.Shared.Damage; +using Content.Shared.Damage.Components; + +namespace Content.Server.Chemistry.ReagentEffects +{ + /// + /// Default metabolism for medicine reagents. Attempts to find a DamageableComponent on the target, + /// and to update its damage values. + /// + public class HealthChange : ReagentEffect + { + /// + /// How much damage is changed when 1u of the reagent is metabolized. + /// + [DataField("healthChange")] + public float AmountToChange { get; set; } = 1.0f; + + /// + /// Class of damage changed, Brute, Burn, Toxin, Airloss. + /// + [DataField("damageClass")] + public DamageClass DamageType { get; set; } = DamageClass.Brute; + + private float _accumulatedHealth; + + /// + /// Changes damage if a DamageableComponent can be found. + /// + public override void Metabolize(IEntity solutionEntity, Solution.ReagentQuantity amount) + { + if (solutionEntity.TryGetComponent(out IDamageableComponent? health)) + { + health.ChangeDamage(DamageType, (int)AmountToChange, true); + float decHealthChange = (float) (AmountToChange - (int) AmountToChange); + _accumulatedHealth += decHealthChange; + + if (_accumulatedHealth >= 1) + { + health.ChangeDamage(DamageType, 1, true); + _accumulatedHealth -= 1; + } + + else if(_accumulatedHealth <= -1) + { + health.ChangeDamage(DamageType, -1, true); + _accumulatedHealth += 1; + } + } + } + } +} diff --git a/Content.Server/Chemistry/ReagentEffects/SatiateHunger.cs b/Content.Server/Chemistry/ReagentEffects/SatiateHunger.cs new file mode 100644 index 0000000000..983d30b565 --- /dev/null +++ b/Content.Server/Chemistry/ReagentEffects/SatiateHunger.cs @@ -0,0 +1,28 @@ +using Content.Server.Nutrition.Components; +using Content.Shared.Chemistry; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Chemistry.Solution; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization.Manager.Attributes; + +namespace Content.Server.Chemistry.ReagentEffects +{ + /// + /// Attempts to find a HungerComponent on the target, + /// and to update it's hunger values. + /// + public class SatiateHunger : ReagentEffect + { + /// + /// How much hunger is satiated when 1u of the reagent is metabolized + /// + [DataField("nutritionFactor")] public float NutritionFactor { get; set; } = 3.0f; + + //Remove reagent at set rate, satiate hunger if a HungerComponent can be found + public override void Metabolize(IEntity solutionEntity, Solution.ReagentQuantity amount) + { + if (solutionEntity.TryGetComponent(out HungerComponent? hunger)) + hunger.UpdateFood(NutritionFactor); + } + } +} diff --git a/Content.Server/Chemistry/ReagentEffects/SatiateThirst.cs b/Content.Server/Chemistry/ReagentEffects/SatiateThirst.cs new file mode 100644 index 0000000000..637c56f235 --- /dev/null +++ b/Content.Server/Chemistry/ReagentEffects/SatiateThirst.cs @@ -0,0 +1,28 @@ +using Content.Server.Nutrition.Components; +using Content.Shared.Chemistry; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Chemistry.Solution; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization.Manager.Attributes; + +namespace Content.Server.Chemistry.ReagentEffects +{ + /// + /// Default metabolism for drink reagents. Attempts to find a ThirstComponent on the target, + /// and to update it's thirst values. + /// + public class SatiateThirst : ReagentEffect + { + /// How much thirst is satiated each metabolism tick. Not currently tied to + /// rate or anything. + [DataField("hydrationFactor")] + public float HydrationFactor { get; set; } = 3.0f; + + /// Satiate thirst if a ThirstComponent can be found + public override void Metabolize(IEntity solutionEntity, Solution.ReagentQuantity amount) + { + if (solutionEntity.TryGetComponent(out ThirstComponent? thirst)) + thirst.UpdateThirst(HydrationFactor); + } + } +} diff --git a/Content.Shared/ActionBlocker/ActionBlockerSystem.cs b/Content.Shared/ActionBlocker/ActionBlockerSystem.cs index a4f3080583..253475235b 100644 --- a/Content.Shared/ActionBlocker/ActionBlockerSystem.cs +++ b/Content.Shared/ActionBlocker/ActionBlockerSystem.cs @@ -4,7 +4,7 @@ using Content.Shared.Emoting; using Content.Shared.Interaction.Events; using Content.Shared.Inventory.Events; using Content.Shared.Item; -using Content.Shared.Metabolism.Events; +using Content.Shared.Body.Metabolism; using Content.Shared.Movement; using Content.Shared.Speech; using Content.Shared.Throwing; diff --git a/Content.Shared/Metabolism/Events/ShiverAttemptEvent.cs b/Content.Shared/Body/Metabolism/ShiverAttemptEvent.cs similarity index 85% rename from Content.Shared/Metabolism/Events/ShiverAttemptEvent.cs rename to Content.Shared/Body/Metabolism/ShiverAttemptEvent.cs index da05d74ffd..d84630fa3c 100644 --- a/Content.Shared/Metabolism/Events/ShiverAttemptEvent.cs +++ b/Content.Shared/Body/Metabolism/ShiverAttemptEvent.cs @@ -1,6 +1,6 @@ using Robust.Shared.GameObjects; -namespace Content.Shared.Metabolism.Events +namespace Content.Shared.Body.Metabolism { public class ShiverAttemptEvent : CancellableEntityEventArgs { diff --git a/Content.Shared/Metabolism/Events/SweatAttemptEvent.cs b/Content.Shared/Body/Metabolism/SweatAttemptEvent.cs similarity index 85% rename from Content.Shared/Metabolism/Events/SweatAttemptEvent.cs rename to Content.Shared/Body/Metabolism/SweatAttemptEvent.cs index b920639aff..6c6180eb00 100644 --- a/Content.Shared/Metabolism/Events/SweatAttemptEvent.cs +++ b/Content.Shared/Body/Metabolism/SweatAttemptEvent.cs @@ -1,6 +1,6 @@ using Robust.Shared.GameObjects; -namespace Content.Shared.Metabolism.Events +namespace Content.Shared.Body.Metabolism { public class SweatAttemptEvent : CancellableEntityEventArgs { diff --git a/Content.Shared/Chemistry/Metabolizable/DefaultMetabolizable.cs b/Content.Shared/Chemistry/Metabolizable/DefaultMetabolizable.cs deleted file mode 100644 index 939acdd21a..0000000000 --- a/Content.Shared/Chemistry/Metabolizable/DefaultMetabolizable.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Content.Shared.Chemistry.Reagent; -using Robust.Shared.GameObjects; -using Robust.Shared.Serialization.Manager.Attributes; - -namespace Content.Shared.Chemistry.Metabolizable -{ - /// - /// Default metabolization for reagents. Returns the amount of reagents metabolized without applying effects. - /// Metabolizes reagents at a constant rate, limited by how much is available. Other classes are derived from - /// this class, so that they do not need their own metabolization quantity calculation. - /// - [DataDefinition] - public class DefaultMetabolizable : IMetabolizable - { - /// - /// Rate of metabolism in units / second - /// - [DataField("rate")] public ReagentUnit MetabolismRate { get; set; } = ReagentUnit.New(1); - - public virtual ReagentUnit Metabolize(IEntity solutionEntity, string reagentId, float tickTime, ReagentUnit availableReagent) - { - - // How much reagent should we metabolize - // The default behaviour is to metabolize at a constant rate, independent of the quantity of reagents. - var amountMetabolized = MetabolismRate * tickTime; - - // is that much reagent actually available? - if (availableReagent < amountMetabolized) - { - return availableReagent; - } - - return amountMetabolized; - } - } -} diff --git a/Content.Shared/Chemistry/Metabolizable/IMetabolizable.cs b/Content.Shared/Chemistry/Metabolizable/IMetabolizable.cs deleted file mode 100644 index f8b2a888cc..0000000000 --- a/Content.Shared/Chemistry/Metabolizable/IMetabolizable.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Content.Shared.Chemistry.Reagent; -using Robust.Shared.GameObjects; - -namespace Content.Shared.Chemistry.Metabolizable -{ - /// - /// Metabolism behavior for a reagent. - /// - public interface IMetabolizable - { - /// - /// Metabolize the attached reagent. Return the amount of reagent to be removed from the solution. - /// You shouldn't remove the reagent yourself to avoid invalidating the iterator of the metabolism - /// organ that is processing it's reagents. - /// - /// The entity containing the solution. - /// The reagent id - /// The time since the last metabolism tick in seconds. - /// Reagent available to be metabolized. - /// The amount of reagent to be removed. The metabolizing organ should handle removing the reagent. - ReagentUnit Metabolize(IEntity solutionEntity, string reagentId, float tickTime, ReagentUnit availableReagent); - } -} diff --git a/Content.Shared/Chemistry/Reagent/ReagentEffect.cs b/Content.Shared/Chemistry/Reagent/ReagentEffect.cs new file mode 100644 index 0000000000..78ca370df0 --- /dev/null +++ b/Content.Shared/Chemistry/Reagent/ReagentEffect.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using Content.Shared.Chemistry.Reagent; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization.Manager.Attributes; + +namespace Content.Shared.Chemistry.Reagent +{ + /// + /// Reagent effects describe behavior that occurs when a reagent is ingested and metabolized by some + /// organ. They only trigger when their conditions ( + /// + [ImplicitDataDefinitionForInheritors] + public abstract class ReagentEffect + { + /// + /// The list of conditions required for the effect to activate. Not required. + /// + [DataField("conditions")] + public ReagentEffectCondition[]? Conditions; + + public abstract void Metabolize(IEntity solutionEntity, Solution.Solution.ReagentQuantity amount); + } +} diff --git a/Content.Shared/Chemistry/Reagent/ReagentEffectCondition.cs b/Content.Shared/Chemistry/Reagent/ReagentEffectCondition.cs new file mode 100644 index 0000000000..54253d1c6d --- /dev/null +++ b/Content.Shared/Chemistry/Reagent/ReagentEffectCondition.cs @@ -0,0 +1,13 @@ +using Content.Shared.Body.Components; +using Content.Shared.Chemistry.Solution; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization.Manager.Attributes; + +namespace Content.Shared.Chemistry.Reagent +{ + [ImplicitDataDefinitionForInheritors] + public abstract class ReagentEffectCondition + { + public abstract bool Condition(IEntity solutionEntity, Solution.Solution.ReagentQuantity reagent); + } +} diff --git a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs index 30de264604..321dacd497 100644 --- a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs +++ b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using Content.Shared.Botany; -using Content.Shared.Chemistry.Metabolizable; using Content.Shared.Chemistry.Reaction; using Robust.Shared.GameObjects; using Robust.Shared.Map; @@ -16,9 +15,6 @@ namespace Content.Shared.Chemistry.Reagent [DataDefinition] public class ReagentPrototype : IPrototype { - [DataField("metabolism", serverOnly: true)] - private readonly List _metabolism = new() {new DefaultMetabolizable()}; - [DataField("tileReactions", serverOnly: true)] private readonly List _tileReactions = new(0); @@ -60,7 +56,6 @@ namespace Content.Shared.Chemistry.Reagent public string SpriteReplacementPath { get; } = string.Empty; //List of metabolism effects this reagent has, should really only be used server-side. - public IReadOnlyList Metabolism => _metabolism; public IReadOnlyList TileReactions => _tileReactions; public IReadOnlyList PlantMetabolism => _plantMetabolism; diff --git a/Resources/Prototypes/Body/Mechanisms/human.yml b/Resources/Prototypes/Body/Mechanisms/human.yml index aec9769c51..8de6180529 100644 --- a/Resources/Prototypes/Body/Mechanisms/human.yml +++ b/Resources/Prototypes/Body/Mechanisms/human.yml @@ -50,18 +50,30 @@ compatibility: Biological - type: entity - id: OrganHumanHeart + id: OrganHumanTongue parent: BaseHumanOrgan - name: heart - description: "I feel bad for the heartless bastard who lost this." + name: tongue + description: "A fleshy muscle mostly used for lying." components: - type: Sprite - state: heart-on + state: tongue + - type: Mechanism + size: 1 + compatibility: Biological + +- type: entity + id: OrganHumanAppendix + parent: BaseHumanOrgan + name: appendix + components: + - type: Sprite + layers: + - state: appendix + - state: appendix-inflamed + visible: false - type: Mechanism size: 1 compatibility: Biological - behaviors: - - !type:HeartBehavior {} - type: entity id: OrganHumanEars @@ -91,6 +103,92 @@ behaviors: - !type:LungBehavior {} +- type: entity + id: OrganHumanHeart + parent: BaseHumanOrgan + name: heart + description: "I feel bad for the heartless bastard who lost this." + components: + - type: Sprite + state: heart-on + - type: Mechanism + size: 1 + compatibility: Biological + behaviors: + - !type:HeartBehavior {} + # The heart 'metabolizes' medicines and poisons that aren't filtered out by other organs. + # This is done because these chemicals need to have some effect even if they aren't being filtered out of your body. + # You're technically 'immune to poison' without a heart, but.. uhh, you'll have bigger problems on your hands. + - type: Metabolizer + metabolisms: + Dylovene: + effects: + - !type:HealthChange + damageClass: Toxin + healthChange: -1 + Arithrazine: + effects: + - !type:HealthChange + damageClass: Toxin + healthChange: -1 + - !type:HealthChange + damageClass: Brute + healthChange: 0.5 + Bicaridine: + effects: + - !type:HealthChange + damageClass: Brute + healthChange: -2 + Dermaline: + effects: + - !type:HealthChange + damageClass: Burn + healthChange: -3 + Dexalin: + effects: + - !type:HealthChange + damageClass: Airloss + healthChange: -1 + DexalinPlus: + effects: + - !type:HealthChange + damageClass: Airloss + healthChange: -3 + Kelotane: + effects: + - !type:HealthChange + damageClass: Burn + healthChange: -1 + Synaptizine: + effects: + - !type:HealthChange + damageClass: Toxin + healthChange: 0.5 + HeartbreakerToxin: + effects: + - !type:HealthChange + damageClass: Airloss + healthChange: 4 + Lexorin: + effects: + - !type:HealthChange + damageClass: Airloss + healthChange: 7 + Omnizine: + effects: + - !type:HealthChange + healthChange: -2 + damageClass: Burn + - !type:HealthChange + healthChange: -2 + damageClass: Toxin + - !type:HealthChange + healthChange: -2 + damageClass: Airloss + - !type:HealthChange + healthChange: -2 + damageClass: Brute + - type: entity id: OrganHumanStomach parent: BaseHumanOrgan @@ -108,6 +206,93 @@ digestionDelay: 20 - type: SolutionContainer maxVol: 250 + # The stomach metabolizes stuff like foods and drinks. + # TODO: Have it work off of the ent's solution container, and move this + # to intestines instead. + - type: Metabolizer # Release me from this hell called 1 reagent for every drink + # TODO please make every drink their own base thing + metabolisms: + Flour: + effects: + - !type:SatiateHunger + JuiceApple: + effects: + - !type:SatiateThirst + JuiceBerry: + effects: + - !type:SatiateThirst + JuiceBanana: + effects: + - !type:SatiateThirst + JuiceCarrot: + effects: + - !type:SatiateThirst + JuiceLime: + effects: + - !type:SatiateThirst + JuiceLemon: + effects: + - !type:SatiateThirst + JuiceGrape: + effects: + - !type:SatiateThirst + JuiceOrange: + effects: + - !type:SatiateThirst + JuiceTomato: + effects: + - !type:SatiateThirst + JuiceBerryPoison: + effects: + - !type:SatiateThirst + - !type:HealthChange + damageClass: Toxin + healthChange: 1 + JuiceWatermelon: + effects: + - !type:SatiateThirst + JuicePineapple: + effects: + - !type:SatiateThirst + Nutriment: + effects: + - !type:SatiateHunger + Water: + effects: + - !type:SatiateThirst + hydrationFactor: 2 + Coffee: + effects: + - !type:SatiateThirst + Tea: + effects: + - !type:SatiateThirst + Milk: + effects: + - !type:SatiateThirst + SpoiledMilk: + effects: + - !type:SatiateThirst + hydrationFactor: -2 + MilkSoy: + effects: + - !type:SatiateThirst + hydrationFactor: 2 # soyboys stay winning + MilkOat: + effects: + - !type:SatiateThirst + hydrationFactor: 2 # oatboys stay winning + Cola: + effects: + - !type:SatiateThirst + hydrationFactor: 0.5 # sodaboys stay losing + ThirteenLoko: + effects: + - !type:SatiateThirst + hydrationFactor: 2 + - !type:HealthChange + damageClass: Toxin + healthChange: 1 - type: entity id: OrganHumanLiver @@ -120,12 +305,17 @@ - type: Mechanism size: 1 compatibility: Biological - behaviors: - - !type:LiverBehavior - alcoholLethality: 0.005 - alcoholExponent: 1.6 - toxinTolerance: 3 - toxinLethality: 0.01 + - type: Metabolizer # The liver metabolizes certain chemicals only, like alcohol. + metabolisms: # TODO add the rest of alcohol + CreamyDelight: + effects: + - !type:SatiateThirst + Lean: + effects: + - !type:SatiateThirst + LeanShine: # who added this? + effects: + - !type:SatiateThirst - type: entity id: OrganHumanKidneys @@ -141,28 +331,4 @@ size: 1 compatibility: Biological -- type: entity - id: OrganHumanTongue - parent: BaseHumanOrgan - name: tongue - description: "A fleshy muscle mostly used for lying." - components: - - type: Sprite - state: tongue - - type: Mechanism - size: 1 - compatibility: Biological -- type: entity - id: OrganHumanAppendix - parent: BaseHumanOrgan - name: appendix - components: - - type: Sprite - layers: - - state: appendix - - state: appendix-inflamed - visible: false - - type: Mechanism - size: 1 - compatibility: Biological diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml index cef117e5da..8ca13d7725 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml @@ -67,7 +67,7 @@ currentTemperature: 310.15 specificHeat: 42 tempDamageCoefficient: 0.1 - - type: Metabolism + - type: Respirator metabolismHeat: 5000 radiatedHeat: 400 implicitHeatRegulation: 5000 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index 7b5b7dfcab..cbbabdf716 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -38,7 +38,7 @@ 0: !type:NormalMobState {} 150: !type:CriticalMobState {} 200: !type:DeadMobState {} - - type: Metabolism + - type: Respirator - type: UnarmedCombat range: 1.5 arcwidth: 0 diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 915d97340a..a3b82f223e 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -167,7 +167,7 @@ preset: HumanPreset - type: Damageable damageContainer: biologicalDamageContainer - - type: Metabolism + - type: Respirator metabolismHeat: 5000 radiatedHeat: 400 implicitHeatRegulation: 5000 diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index dd9f5119c7..1f097c19a2 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -84,7 +84,7 @@ - type: Body template: HumanoidTemplate preset: VoxPreset - - type: Metabolism + - type: Respirator needsGases: Nitrogen: 0.00060763888 producesGases: diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml index b31d59a19d..bff9a06605 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml @@ -183,9 +183,6 @@ desc: A combination of cream, wine and moonshine. Why would you do this? physicalDesc: foul color: "#a6969a" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: Lean @@ -193,9 +190,6 @@ desc: Turn up for days. physicalDesc: bubbly color: "#9400D3" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: LeanShine @@ -203,8 +197,3 @@ desc: Lean mixed with moonshine. Turn up for months. physicalDesc: bubbly color: "#9d5fb8" - metabolism: - - !type:DefaultDrink - rate: 1 - - diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml index b4c5009d35..baa8792dd2 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml @@ -4,9 +4,6 @@ desc: A drink made from brewed coffee beans. Contains a moderate amount of caffeine. physicalDesc: aromatic color: "#664300" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: Tea @@ -14,9 +11,6 @@ desc: A drink made by boiling leaves of the tea tree, Camellia sinensis. physicalDesc: aromatic color: "#8a5a3a" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: Cream @@ -24,9 +18,6 @@ desc: The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh? physicalDesc: creamy color: "#DFD7AF" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: Milk @@ -34,9 +25,6 @@ desc: An opaque white liquid produced by the mammary glands of mammals. physicalDesc: opaque color: "#DFDFDF" - metabolism: - - !type:DefaultDrink - rate: 1 plantMetabolism: - !type:AdjustNutrition amount: 0.1 @@ -49,9 +37,6 @@ desc: This milk has gone rancid. physicalDesc: putrid color: "#faffba" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: MilkSoy @@ -59,9 +44,6 @@ desc: Surprisingly tasty. physicalDesc: refreshing color: "#302000" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: MilkOat @@ -69,6 +51,3 @@ desc: Surprisingly tasty. physicalDesc: refreshing color: "#302000" - metabolism: - - !type:DefaultDrink - rate: 1 diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/juice.yml b/Resources/Prototypes/Reagents/Consumable/Drink/juice.yml index 44a75bbd1d..ac4a65a2f5 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/juice.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/juice.yml @@ -4,9 +4,6 @@ desc: It's a little piece of Eden. physicalDesc: crisp color: "#FDAD01" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: JuiceBerry @@ -14,9 +11,6 @@ desc: A delicious blend of several different kinds of berries. physicalDesc: sweet color: "#660099" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: JuiceBanana @@ -24,9 +18,6 @@ desc: The raw essence of a banana. HONK. physicalDesc: crisp color: "#FFE777" - metabolism: - - !type:DefaultDrink - rate: 1 #TODO: port on_mob_life: restore eyesight #if(..()) @@ -45,9 +36,6 @@ desc: It's like a carrot, but less crunchy. physicalDesc: crisp color: "#FF8820" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: JuiceLime @@ -55,9 +43,6 @@ desc: The sweet-sour juice of limes. physicalDesc: citric color: "#99bb43" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: JuiceLemon @@ -65,9 +50,6 @@ desc: This juice is VERY sour. physicalDesc: citric color: "#fff690" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: JuiceGrape @@ -75,9 +57,6 @@ desc: Freshly squeezed juice from red grapes. Quite sweet. physicalDesc: crisp color: "#512284" - metabolism: - - !type:DefaultDrink - rate: 1 # /datum/reagent/drink/orangejuice/on_mob_life(var/mob/living/M) @@ -93,9 +72,6 @@ desc: Both delicious AND rich in Vitamin C. What more do you need? physicalDesc: citric color: "#E78108" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: JuiceTomato @@ -103,9 +79,6 @@ desc: Tomatoes made into juice. What a waste of good tomatoes, huh? physicalDesc: saucey color: "#731008" - metabolism: - - !type:DefaultDrink - rate: 1 # /datum/reagent/drink/poisonberryjuice/on_mob_life(var/mob/living/M) @@ -120,9 +93,6 @@ desc: A surprisingly tasty juice blended from various kinds of very deadly and toxic berries. physicalDesc: aromatic #maybe should be 'sickly'? color: "#6600CC" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: JuiceWatermelon @@ -130,9 +100,6 @@ desc: The delicious juice of a watermelon. physicalDesc: sweet color: "#EF3520" - metabolism: - - !type:DefaultDrink - rate: 1 - type: reagent id: JuicePineapple @@ -140,9 +107,6 @@ desc: The delicious juice of a pineapple. physicalDesc: tropical color: yellow - metabolism: - - !type:DefaultDrink - rate: 1 # - type: reagent # id: PotatoJuice @@ -150,6 +114,3 @@ # desc: Juice of the potato. Bleh. # physicalDesc: starchy # color: "#302000" -# metabolism: -# - !type:DefaultDrink -# rate: 1 diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/soda.yml b/Resources/Prototypes/Reagents/Consumable/Drink/soda.yml index eb2b34041b..b28baa70f1 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/soda.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/soda.yml @@ -4,9 +4,6 @@ desc: A sweet, carbonated soft drink. Caffeine free. physicalDesc: fizzy color: "#422912" - metabolism: - - !type:DefaultDrink - rate: 1 plantMetabolism: - !type:AdjustNutrition amount: 0.1 @@ -21,12 +18,6 @@ desc: A highly processed liquid substance barely-passing intergalatic health standarts for a soft drink. physicalDesc: fizzy color: "#deb928" - metabolism: - - !type:DefaultDrink - rate: 1 - - !type:HealthChangeMetabolism - healthChange: 2 - damageClass: Toxin plantMetabolism: - !type:AdjustNutrition amount: 0.1 diff --git a/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml b/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml index 88183dbfb6..8cdcb5903a 100644 --- a/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml +++ b/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml @@ -4,9 +4,6 @@ desc: The sweetness of a thousand sugars but none of the calories. # physicalDesc: color: aquamarine - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: BbqSauce @@ -14,9 +11,6 @@ desc: Hand wipes not included. physicalDesc: Gloopy. color: darkred - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: Cornoil @@ -24,9 +18,6 @@ desc: Corn oil, A delicious oil used in cooking. Made from corn. # physicalDesc: color: yellow - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: Frostoil @@ -34,9 +25,6 @@ desc: Leaves the tongue numb in its passage. # physicalDesc: color: skyblue - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: HorseradishSauce @@ -44,9 +32,6 @@ desc: Smelly horseradish sauce. physicalDesc: Overpowering. color: gray - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: Hotsauce @@ -54,9 +39,6 @@ desc: Burns so good. # physicalDesc: color: red - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: Ketchup @@ -64,9 +46,6 @@ desc: Made from pureed tomatoes and flavored with spices. # physicalDesc: color: red - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: Soysauce @@ -74,6 +53,3 @@ desc: A salty soy-based flavoring. # physicalDesc: color: saddlebrown - metabolism: - - !type:DefaultFood - rate: 1 diff --git a/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml b/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml index ee13427ec1..bfeed21bb5 100644 --- a/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml +++ b/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml @@ -4,9 +4,6 @@ desc: Used for baking. physicalDesc: powdery color: white - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: Oats @@ -14,18 +11,12 @@ desc: Used for a variety of tasty purposes. physicalDesc: coarse color: tan - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: Enzyme name: universal enzyme desc: Used in cooking various dishes. color: "#009900" - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: Egg @@ -33,9 +24,6 @@ desc: Used for baking. physicalDesc: mucus-like color: white - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: Sugar @@ -43,9 +31,6 @@ desc: Tasty spacey sugar! physicalDesc: color: white - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: Salt @@ -53,9 +38,6 @@ desc: Salt. From space oceans, presumably. physicalDesc: Coarse. color: white - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: Blackpepper @@ -63,33 +45,21 @@ desc: Often used to flavor food or make people sneeze. physicalDesc: Grainy. color: black - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: Vinegar name: vinegar desc: Often used to flavor food. color: tan - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: Rice name: rice desc: Hard, small white grains. color: white - metabolism: - - !type:DefaultFood - rate: 1 - type: reagent id: OilOlive name: olive oil desc: Viscous and fragrant. color: olive - metabolism: - - !type:DefaultFood - rate: 1 diff --git a/Resources/Prototypes/Reagents/chemicals.yml b/Resources/Prototypes/Reagents/chemicals.yml index 3d6d49be64..ff882e463c 100644 --- a/Resources/Prototypes/Reagents/chemicals.yml +++ b/Resources/Prototypes/Reagents/chemicals.yml @@ -89,9 +89,6 @@ desc: All the vitamins, minerals, and carbohydrates the body needs in pure form. physicalDesc: opaque color: "#664330" - metabolism: - - !type:DefaultFood - rate: 1 plantMetabolism: - !type:AdjustNutrition amount: 1 @@ -180,7 +177,7 @@ amount: 10 - !type:AdjustHealth amount: -5 - + - type: reagent id: SulfuricAcid name: sulfuric acid @@ -218,9 +215,6 @@ color: "#c0e0ff20" boilingPoint: 100.0 meltingPoint: 0.0 - metabolism: - - !type:DefaultDrink - rate: 1 tileReactions: - !type:ExtinguishTileReaction {} - !type:SpillIfPuddlePresentTileReaction {} @@ -234,7 +228,7 @@ desc: Used by chefs to cook. physicalDesc: oily color: "#b67823" - boilingPoint: 300.0 + boilingPoint: 300.0 meltingPoint: -16.0 tileReactions: - !type:FlammableTileReaction {} diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index 16dba85352..c49cc13300 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -18,10 +18,6 @@ desc: A broad-spectrum anti-toxin, which treats toxin damage in the blood stream. Overdosing will cause vomiting, dizzyness and pain. physicalDesc: translucent color: "#3a1d8a" - metabolism: - - !type:HealthChangeMetabolism - healthChange: -1 - damageClass: Toxin plantMetabolism: - !type:AdjustToxins amount: -10 @@ -34,13 +30,6 @@ desc: A slightly unstable medication used for the most extreme any serious case of radiation poisoning. Lowers radiation level at over twice the rate Hyronalin does and will heal toxin damage at the same time. Deals very minor brute damage to the patient over time, but the patient's body will typically out-regenerate it easily. physicalDesc: cloudy color: "#bd5902" - metabolism: - - !type:HealthChangeMetabolism - healthChange: -1 - damageClass: Toxin #I think you need multiple of these components for different types of damage so I'll maybe change it to work better in the future - - !type:HealthChangeMetabolism - healthChange: 0.5 - damageClass: Brute - type: reagent id: Bicaridine @@ -48,10 +37,6 @@ desc: An analgesic which is highly effective at treating brute damage. It is useful for stabilizing people who have been severely beaten, as well as treating less life-threatening injuries. In the case of bleeding (internal or external), bicaridine will slow down the bleeding heavily. If the dosage exceeds the overdose limit, it'll stop it outright. physicalDesc: opaque color: "#ffaa00" - metabolism: - - !type:HealthChangeMetabolism - healthChange: -2 - damageClass: Brute - type: reagent id: Cryoxadone @@ -90,10 +75,6 @@ desc: An advanced chemical that is more effective at treating burn damage than Kelotane. physicalDesc: translucent color: "#215263" - metabolism: - - !type:HealthChangeMetabolism - healthChange: -3 - damageClass: Burn - type: reagent id: Dexalin @@ -101,21 +82,13 @@ desc: Used for treating oxygen deprivation. In most cases where it is likely to be needed, the strength of Dexalin Plus will probably be more useful (Results in 1 unit instead of 2). physicalDesc: opaque color: "#0041a8" - metabolism: - - !type:HealthChangeMetabolism - healthChange: -1 - damageClass: Airloss #this may be asphyxiation - + - type: reagent id: DexalinPlus name: dexalin plus desc: Used in treatment of extreme cases of oxygen deprivation. Even a single unit immediately counters all oxygen loss, which is hugely useful in many circumstances. Any dose beyond this will continue to counter oxygen loss until it is metabolized, essentially removing the need to breathe. physicalDesc: cloudy color: "#4da0bd" - metabolism: - - !type:HealthChangeMetabolism - healthChange: -3 - damageClass: Airloss - type: reagent id: Ethylredoxrazine @@ -165,10 +138,6 @@ desc: Treats burn damage and prevents infection. physicalDesc: strong-smelling color: "#bf3d19" - metabolism: - - !type:HealthChangeMetabolism - healthChange: -1 - damageClass: Burn - type: reagent id: Leporazine @@ -201,7 +170,7 @@ - type: reagent id: Paroxetine name: paroxetine - desc: Prevents hallucination, but has a 10% chance of causing intense hallucinations. + desc: Prevents hallucination, but has a 10% chance of causing intense hallucinations. physicalDesc: acrid color: "#fffbad" @@ -225,11 +194,6 @@ desc: Toxic, but treats hallucinations, drowsiness & halves the duration of paralysis, stuns and knockdowns. It is metabolized very slowly. One unit is enough to treat hallucinations; two units is deadly. physicalDesc: pungent color: "#d49a2f" - metabolism: - - !type:HealthChangeMetabolism - healthChange: 0.67 - damageClass: Toxin - rate: 0.2 - type: reagent id: Tramadol @@ -289,10 +253,6 @@ plantMetabolism: - !type:AdjustToxins amount: 10 - metabolism: - - !type:HealthChangeMetabolism - healthChange: 1 - damageClass: Airloss - type: reagent id: Impedrezene @@ -307,10 +267,6 @@ desc: Temporarily stops respiration and causes tissue damage. Large doses are fatal, and will cause people to pass out very quickly. Dexalin and Dexalin Plus will both remove it, however. physicalDesc: pungent color: "#6b0007" - metabolism: - - !type:HealthChangeMetabolism - healthChange: 7 - damageClass: Airloss - type: reagent id: Lipozine @@ -356,24 +312,10 @@ desc: Pure THC oil, extracted from the leaves of the cannabis plant. Much stronger than in it's natural form and can be used to numb chronic pain in patients. physicalDesc: skunky color: "#DAA520" - + - type: reagent id: Omnizine name: Omnizine desc: A soothing milky liquid with an iridescent gleam. A well known conspiracy theory says that it's origins remain a mystery because knowing the secrets of its production would render most commercial pharmaceuticals obsolete. physicalDesc: soothing color: "#fcf7f9" - metabolism: - - !type:HealthChangeMetabolism - healthChange: -2 - damageClass: Burn - - !type:HealthChangeMetabolism - healthChange: -2 - damageClass: Toxin - - !type:HealthChangeMetabolism - healthChange: -2 - damageClass: Airloss - - !type:HealthChangeMetabolism - healthChange: -2 - damageClass: Brute - From e5956566f5faa20953522d0eeecf5c3b46c614eb Mon Sep 17 00:00:00 2001 From: plinyvic Date: Sat, 31 Jul 2021 08:06:24 -0400 Subject: [PATCH 06/83] grindable/juiceable stacks (#4391) * grindable/juiceable stacks reagent grinder now takes stacks into account added ScaleSolution that allows easy scaling of solution contents * grindable/juiceable stacks revision grinder/juicer stack fix now ECS added JuiceableScalingEvent * Update Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs Co-authored-by: mirrorcult * Update Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs Co-authored-by: mirrorcult Co-authored-by: Vera Aguilera Puerto <6766154+Zumorica@users.noreply.github.com> --- .../EntitySystems/ReagentGrinderSystem.cs | 44 +++++++++++++------ .../Kitchen/Events/JuiceableScalingEvent.cs | 23 ++++++++++ Content.Shared/Chemistry/Solution/Solution.cs | 21 +++++++++ 3 files changed, 74 insertions(+), 14 deletions(-) create mode 100644 Content.Server/Kitchen/Events/JuiceableScalingEvent.cs diff --git a/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs b/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs index 2b110578c1..e5e45b5967 100644 --- a/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Content.Server.Chemistry.Components; @@ -6,7 +6,9 @@ using Content.Server.Hands.Components; using Content.Server.Items; using Content.Server.Kitchen.Components; using Content.Server.Power.Components; +using Content.Server.Stack; using Content.Server.UserInterface; +using Content.Server.Kitchen.Events; using Content.Shared.Chemistry.Solution; using Content.Shared.Interaction; using Content.Shared.Kitchen.Components; @@ -30,7 +32,7 @@ namespace Content.Server.Kitchen.EntitySystems { [Dependency] private readonly IEntityManager _entityManager = default!; - private Queue _uiUpdateQueue = new (); + private Queue _uiUpdateQueue = new(); public override void Initialize() { @@ -40,11 +42,17 @@ namespace Content.Server.Kitchen.EntitySystems SubscribeLocalEvent((_, component, _) => EnqueueUiUpdate(component)); SubscribeLocalEvent(OnInteractHand); SubscribeLocalEvent(OnInteractUsing); + SubscribeLocalEvent(JuiceableScaling); + } + + private void JuiceableScaling(EntityUid uid, StackComponent component, JuiceableScalingEvent args) + { + args.Scalar *= component.Count; // multiply scalar by amount of items in stack } private void OnInteractUsing(EntityUid uid, ReagentGrinderComponent component, InteractUsingEvent args) { - if(args.Handled) return; + if (args.Handled) return; if (!args.User.TryGetComponent(out IHandsComponent? hands)) { @@ -58,7 +66,7 @@ namespace Content.Server.Kitchen.EntitySystems //First, check if user is trying to insert a beaker. //No promise it will be a beaker right now, but whatever. //Maybe this should whitelist "beaker" in the prototype id of heldEnt? - if(heldEnt.TryGetComponent(out SolutionContainerComponent? beaker) && beaker.Capabilities.HasFlag(SolutionContainerCaps.FitsInDispenser)) + if (heldEnt.TryGetComponent(out SolutionContainerComponent? beaker) && beaker.Capabilities.HasFlag(SolutionContainerCaps.FitsInDispenser)) { component.BeakerContainer.Insert(heldEnt); component.HeldBeaker = beaker; @@ -74,7 +82,7 @@ namespace Content.Server.Kitchen.EntitySystems } //Next, see if the user is trying to insert something they want to be ground/juiced. - if(!heldEnt.HasTag("Grindable") && !heldEnt.TryGetComponent(out JuiceableComponent? juice)) + if (!heldEnt.HasTag("Grindable") && !heldEnt.TryGetComponent(out JuiceableComponent? juice)) { //Entity did NOT pass the whitelist for grind/juice. //Wouldn't want the clown grinding up the Captain's ID card now would you? @@ -113,7 +121,7 @@ namespace Content.Server.Kitchen.EntitySystems private void EnqueueUiUpdate(ReagentGrinderComponent component) { - if(!_uiUpdateQueue.Contains(component)) _uiUpdateQueue.Enqueue(component); + if (!_uiUpdateQueue.Contains(component)) _uiUpdateQueue.Enqueue(component); } private void OnComponentInit(EntityUid uid, ReagentGrinderComponent component, ComponentInit args) @@ -138,12 +146,12 @@ namespace Content.Server.Kitchen.EntitySystems private void OnUIMessageReceived(EntityUid uid, ReagentGrinderComponent component, ServerBoundUserInterfaceMessage message) { - if(component.Busy) + if (component.Busy) { return; } - switch(message.Message) + switch (message.Message) { case SharedReagentGrinderComponent.ReagentGrinderGrindStartMessage msg: if (!component.Owner.TryGetComponent(out ApcPowerReceiverComponent? receiver) || !receiver.Powered) break; @@ -158,7 +166,7 @@ namespace Content.Server.Kitchen.EntitySystems break; case SharedReagentGrinderComponent.ReagentGrinderEjectChamberAllMessage msg: - if(component.Chamber.ContainedEntities.Count > 0) + if (component.Chamber.ContainedEntities.Count > 0) { ClickSound(component); for (var i = component.Chamber.ContainedEntities.Count - 1; i >= 0; i--) @@ -234,7 +242,7 @@ namespace Content.Server.Kitchen.EntitySystems return; var beaker = component.BeakerContainer.ContainedEntity; - if(beaker is null) + if (beaker is null) return; component.BeakerContainer.Remove(beaker); @@ -258,7 +266,7 @@ namespace Content.Server.Kitchen.EntitySystems private void DoWork(ReagentGrinderComponent component, IEntity user, SharedReagentGrinderComponent.GrinderProgram program) { //Have power, are we busy, chamber has anything to grind, a beaker for the grounds to go? - if(!component.Owner.TryGetComponent(out ApcPowerReceiverComponent? receiver) || !receiver.Powered || component.Busy || component.Chamber.ContainedEntities.Count <= 0 || component.BeakerContainer.ContainedEntity == null || component.HeldBeaker == null) + if (!component.Owner.TryGetComponent(out ApcPowerReceiverComponent? receiver) || !receiver.Powered || component.Busy || component.Chamber.ContainedEntities.Count <= 0 || component.BeakerContainer.ContainedEntity == null || component.HeldBeaker == null) { return; } @@ -278,12 +286,14 @@ namespace Content.Server.Kitchen.EntitySystems { if (!item.HasTag("Grindable")) continue; if (!item.TryGetComponent(out var solution)) continue; - if (component.HeldBeaker.CurrentVolume + solution.CurrentVolume > component.HeldBeaker.MaxVolume) continue; + var juiceEvent = new JuiceableScalingEvent(); // default of scalar is always 1.0 + RaiseLocalEvent(item.Uid, juiceEvent, false); + if (component.HeldBeaker.CurrentVolume + solution.CurrentVolume * juiceEvent.Scalar > component.HeldBeaker.MaxVolume) continue; + solution.Solution.ScaleSolution(juiceEvent.Scalar); component.HeldBeaker.TryAddSolution(solution.Solution); solution.RemoveAllSolution(); item.Delete(); } - component.Busy = false; EnqueueUiUpdate(component); bui?.SendMessage(new SharedReagentGrinderComponent.ReagentGrinderWorkCompleteMessage()); @@ -297,7 +307,13 @@ namespace Content.Server.Kitchen.EntitySystems foreach (var item in component.Chamber.ContainedEntities.ToList()) { if (!item.TryGetComponent(out var juiceMe)) continue; - if (component.HeldBeaker.CurrentVolume + juiceMe.JuiceResultSolution.TotalVolume > component.HeldBeaker.MaxVolume) continue; + var juiceEvent = new JuiceableScalingEvent(); // default of scalar is always 1.0 + if (item.HasComponent()) + { + RaiseLocalEvent(item.Uid, juiceEvent); + } + if (component.HeldBeaker.CurrentVolume + juiceMe.JuiceResultSolution.TotalVolume * juiceEvent.Scalar > component.HeldBeaker.MaxVolume) continue; + juiceMe.JuiceResultSolution.ScaleSolution(juiceEvent.Scalar); component.HeldBeaker.TryAddSolution(juiceMe.JuiceResultSolution); item.Delete(); } diff --git a/Content.Server/Kitchen/Events/JuiceableScalingEvent.cs b/Content.Server/Kitchen/Events/JuiceableScalingEvent.cs new file mode 100644 index 0000000000..f904097e0a --- /dev/null +++ b/Content.Server/Kitchen/Events/JuiceableScalingEvent.cs @@ -0,0 +1,23 @@ +using Robust.Shared.GameObjects; + +namespace Content.Server.Kitchen.Events +{ + /// + /// Used in scaling amount of solution to extract in juicing + /// + public class JuiceableScalingEvent : EntityEventArgs + { + + public JuiceableScalingEvent() + { + Scalar = 1f; + } + + public float Scalar + { + get; + set; + } + + } +} diff --git a/Content.Shared/Chemistry/Solution/Solution.cs b/Content.Shared/Chemistry/Solution/Solution.cs index ceae2a17f7..8b89f0631a 100644 --- a/Content.Shared/Chemistry/Solution/Solution.cs +++ b/Content.Shared/Chemistry/Solution/Solution.cs @@ -115,6 +115,27 @@ namespace Content.Shared.Chemistry.Solution TotalVolume += quantity; } + /// + /// Scales the amount of solution. + /// + /// The scalar to modify the solution by. + public void ScaleSolution(float scale) + { + if (scale == 1) return; + var tempContents = new List(_contents); + foreach(ReagentQuantity current in tempContents) + { + if(scale > 1) + { + AddReagent(current.ReagentId, current.Quantity * scale - current.Quantity); + } + else + { + RemoveReagent(current.ReagentId, current.Quantity - current.Quantity * scale); + } + } + } + /// /// Returns the amount of a single reagent inside the solution. /// From 58b86addeeb116159c129eff349ec64d730b3d22 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 31 Jul 2021 08:07:27 -0400 Subject: [PATCH 07/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 085c58872c..a6500d72d2 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1620,3 +1620,7 @@ Entries: pulling in your hand!, type: Tweak} id: 288 time: '2021-07-31T01:14:00.0000000+00:00' +- author: plinyvic + changes: [] + id: 289 + time: '2021-07-31T12:06:25.0000000+00:00' From c0c18b555be1f57704887b654cc3dfa75b40f1ff Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto Date: Sat, 31 Jul 2021 14:09:51 +0200 Subject: [PATCH 08/83] Fix incorrect changelog. --- Resources/Changelog/Changelog.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a6500d72d2..fb85f4f200 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1621,6 +1621,7 @@ Entries: id: 288 time: '2021-07-31T01:14:00.0000000+00:00' - author: plinyvic - changes: [] + changes: + - {message: Fixed reagent grinder not giving correct output with stacked items, type: Fix} id: 289 time: '2021-07-31T12:06:25.0000000+00:00' From 3cf08af9ddeba876b99e615514d62b6dc9c56d83 Mon Sep 17 00:00:00 2001 From: Michael Cooke Date: Sat, 31 Jul 2021 08:53:18 -0400 Subject: [PATCH 09/83] Fix opposite force when throwing objects (#4398) * Fix opposite force when throwing objects * DRY the throw impulse vector calculation --- Content.Server/Throwing/ThrowHelper.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Content.Server/Throwing/ThrowHelper.cs b/Content.Server/Throwing/ThrowHelper.cs index 7230c6b534..ae4ec3d96d 100644 --- a/Content.Server/Throwing/ThrowHelper.cs +++ b/Content.Server/Throwing/ThrowHelper.cs @@ -69,7 +69,9 @@ namespace Content.Server.Throwing EntitySystem.Get().ThrownInteraction(user, entity); } - physicsComponent.ApplyLinearImpulse(direction.Normalized * strength * physicsComponent.Mass); + var impulseVector = direction.Normalized * strength * physicsComponent.Mass; + physicsComponent.ApplyLinearImpulse(impulseVector); + // Estimate time to arrival so we can apply OnGround status and slow it much faster. var time = (direction / strength).Length; @@ -96,7 +98,7 @@ namespace Content.Server.Throwing if (!msg.Cancelled) { - body.ApplyLinearImpulse(-direction * pushbackRatio); + body.ApplyLinearImpulse(-impulseVector * pushbackRatio); } } } From eee3c940fb833cdde87d82667cf13975ebaa1da4 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 31 Jul 2021 08:54:21 -0400 Subject: [PATCH 10/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fb85f4f200..7a905c6cf4 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1622,6 +1622,13 @@ Entries: time: '2021-07-31T01:14:00.0000000+00:00' - author: plinyvic changes: - - {message: Fixed reagent grinder not giving correct output with stacked items, type: Fix} + - {message: Fixed reagent grinder not giving correct output with stacked items, + type: Fix} id: 289 time: '2021-07-31T12:06:25.0000000+00:00' +- author: michaelcooke + changes: + - {message: Throwing items in space will now push you in the opposite direction + to the thrown object, type: Fix} + id: 290 + time: '2021-07-31T12:53:18.0000000+00:00' From f2a398734337bb70e72e4c6c19972ebec4c79ec1 Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto <6766154+Zumorica@users.noreply.github.com> Date: Sun, 1 Aug 2021 04:50:36 +0200 Subject: [PATCH 11/83] Add subfloor appearance data, pipes correctly render subfloor. (#4393) --- .../Visualizers/PipeConnectorVisualizer.cs | 6 ++- .../SubFloor/SubFloorShowLayerVisualizer.cs | 40 +++++++++++++++++++ Content.Shared/SubFloor/SubFloorHideSystem.cs | 19 ++++++++- .../Structures/Piping/Atmospherics/binary.yml | 29 +++++++++++++- .../Structures/Piping/Atmospherics/pipes.yml | 1 + .../Piping/Atmospherics/trinary.yml | 12 ++++++ .../Structures/Piping/Atmospherics/unary.yml | 39 ++++++++++++++---- 7 files changed, 135 insertions(+), 11 deletions(-) create mode 100644 Content.Client/SubFloor/SubFloorShowLayerVisualizer.cs diff --git a/Content.Client/Atmos/Visualizers/PipeConnectorVisualizer.cs b/Content.Client/Atmos/Visualizers/PipeConnectorVisualizer.cs index 9f7e58d31b..36244dc23d 100644 --- a/Content.Client/Atmos/Visualizers/PipeConnectorVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/PipeConnectorVisualizer.cs @@ -1,6 +1,7 @@ using System; using Content.Shared.Atmos; using Content.Shared.Atmos.Piping; +using Content.Shared.SubFloor; using JetBrains.Annotations; using Robust.Client.GameObjects; using Robust.Client.Graphics; @@ -69,13 +70,16 @@ namespace Content.Client.Atmos.Visualizers if (!component.TryGetData(PipeVisuals.VisualState, out PipeVisualState state)) return; + if(!component.TryGetData(SubFloorVisuals.SubFloor, out bool subfloor)) + subfloor = true; + foreach (Layer layerKey in Enum.GetValues(typeof(Layer))) { var dir = (PipeDirection) layerKey; var layerVisible = state.ConnectedDirections.HasDirection(dir); var layer = sprite.LayerMapGet(layerKey); - sprite.LayerSetVisible(layer, layerVisible); + sprite.LayerSetVisible(layer, layerVisible && subfloor); sprite.LayerSetColor(layer, color); } } diff --git a/Content.Client/SubFloor/SubFloorShowLayerVisualizer.cs b/Content.Client/SubFloor/SubFloorShowLayerVisualizer.cs new file mode 100644 index 0000000000..e16e7b22e8 --- /dev/null +++ b/Content.Client/SubFloor/SubFloorShowLayerVisualizer.cs @@ -0,0 +1,40 @@ +using Content.Shared.SubFloor; +using JetBrains.Annotations; +using Robust.Client.GameObjects; + +namespace Content.Client.SubFloor +{ + [UsedImplicitly] + public class SubFloorShowLayerVisualizer : AppearanceVisualizer + { + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + if (!component.Owner.TryGetComponent(out SpriteComponent? sprite)) + return; + + if (component.TryGetData(SubFloorVisuals.SubFloor, out bool subfloor)) + { + sprite.Visible = true; + + // Due to the way this visualizer works, you might want to specify it before any other + // visualizer that hides/shows layers depending on certain conditions, such as PipeConnectorVisualizer. + foreach (var layer in sprite.AllLayers) + { + layer.Visible = subfloor; + } + + if (sprite.LayerMapTryGet(Layers.FirstLayer, out var firstLayer)) + { + sprite.LayerSetVisible(firstLayer, true); + } + } + } + + public enum Layers : byte + { + FirstLayer, + } + } +} diff --git a/Content.Shared/SubFloor/SubFloorHideSystem.cs b/Content.Shared/SubFloor/SubFloorHideSystem.cs index 6f3f5bd9f2..503a153ea4 100644 --- a/Content.Shared/SubFloor/SubFloorHideSystem.cs +++ b/Content.Shared/SubFloor/SubFloorHideSystem.cs @@ -1,9 +1,11 @@ +using System; using Content.Shared.Maps; using JetBrains.Annotations; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Maths; +using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; namespace Content.Shared.SubFloor @@ -146,10 +148,19 @@ namespace Content.Shared.SubFloor subFloor = !transformComponent.Anchored; } + // Whether to show this entity as visible, visually. + var subFloorVisible = ShowAll || subFloor; + // Show sprite if (ComponentManager.TryGetComponent(uid, out SharedSpriteComponent? spriteComponent)) { - spriteComponent.Visible = ShowAll || subFloor; + spriteComponent.Visible = subFloorVisible; + } + + // Set an appearance data value so visualizers can use this as needed. + if (ComponentManager.TryGetComponent(uid, out SharedAppearanceComponent? appearanceComponent)) + { + appearanceComponent.SetData(SubFloorVisuals.SubFloor, subFloorVisible); } // So for collision all we care about is that the component is running. @@ -169,4 +180,10 @@ namespace Content.Shared.SubFloor SubFloor = subFloor; } } + + [Serializable, NetSerializable] + public enum SubFloorVisuals : byte + { + SubFloor, + } } diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml index f7d23a40a4..d52e24f2fa 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml @@ -33,8 +33,10 @@ state: pipeStraight map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: pumpPressure + map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] - type: Appearance visuals: + - type: SubFloorShowLayerVisualizer - type: PipeConnectorVisualizer - type: PipeColorVisualizer - type: PressurePumpVisualizer @@ -57,6 +59,12 @@ state: pipeStraight map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: pumpVolume + map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] + - type: Appearance + visuals: + - type: SubFloorShowLayerVisualizer + - type: PipeConnectorVisualizer + - type: PipeColorVisualizer - type: GasVolumePump - type: entity @@ -75,6 +83,12 @@ state: pipeStraight map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: pumpPassiveGate + map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] + - type: Appearance + visuals: + - type: SubFloorShowLayerVisualizer + - type: PipeConnectorVisualizer + - type: PipeColorVisualizer - type: GasPassiveGate - type: entity @@ -94,6 +108,12 @@ state: pipeStraight map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: pumpPassiveGate + map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] + - type: Appearance + visuals: + - type: SubFloorShowLayerVisualizer + - type: PipeConnectorVisualizer + - type: PipeColorVisualizer - type: GasValve - type: NodeContainer nodes: @@ -118,6 +138,12 @@ state: pipeHalf map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: gasCanisterPort + map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] + - type: Appearance + visuals: + - type: SubFloorShowLayerVisualizer + - type: PipeConnectorVisualizer + - type: PipeColorVisualizer - type: GasPort - type: NodeContainer nodes: @@ -142,9 +168,10 @@ state: pipeStraight map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: vent_off - map: ["enum.VentVisualLayers.Vent"] + map: [ "enum.VentVisualLayers.Vent", "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] - type: Appearance visuals: + - type: SubFloorShowLayerVisualizer - type: PipeConnectorVisualizer - type: PipeColorVisualizer - type: VentPumpVisualizer diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml index df3534b3d3..ed58aecde5 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml @@ -33,6 +33,7 @@ - type: NodeContainer - type: AtmosUnsafeUnanchor - type: AtmosPipeColor + - type: SubFloorHide #Note: The PipeDirection of the PipeNode should be the south-facing version, because the entity starts at an angle of 0 (south) diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml index 916ba7302e..f8b5414d4f 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml @@ -38,6 +38,12 @@ state: pipeTJunction map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: gasFilter + map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] + - type: Appearance + visuals: + - type: SubFloorShowLayerVisualizer + - type: PipeConnectorVisualizer + - type: PipeColorVisualizer - type: GasFilter - type: entity @@ -57,6 +63,12 @@ state: pipeTJunction map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: gasFilter + map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] + - type: Appearance + visuals: + - type: SubFloorShowLayerVisualizer + - type: PipeConnectorVisualizer + - type: PipeColorVisualizer - type: GasMixer inletOne: inlet inletTwo: filter diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml index 14be2b9c3a..b85e71e3af 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml @@ -29,9 +29,10 @@ state: pipeHalf map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: vent_off - map: ["enum.VentVisualLayers.Vent"] + map: [ "enum.VentVisualLayers.Vent", "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] - type: Appearance visuals: + - type: SubFloorShowLayerVisualizer - type: PipeConnectorVisualizer - type: PipeColorVisualizer - type: VentPumpVisualizer @@ -54,8 +55,10 @@ state: pipeHalf map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: vent_off + map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] - type: Appearance visuals: + - type: SubFloorShowLayerVisualizer - type: PipeConnectorVisualizer - type: PipeColorVisualizer - type: GasPassiveVent @@ -76,9 +79,10 @@ state: pipeHalf map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: scrub_off - map: ["enum.ScrubberVisualLayers.Scrubber"] + map: [ "enum.ScrubberVisualLayers.Scrubber", "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] - type: Appearance visuals: + - type: SubFloorShowLayerVisualizer - type: PipeConnectorVisualizer - type: PipeColorVisualizer - type: ScrubberVisualizer @@ -93,18 +97,24 @@ placement: mode: SnapgridCenter components: - - type: GasOutletInjector + # TODO ATMOS: Actual sprite for this. - type: Sprite netsync: false layers: - state: pipeHalf sprite: Structures/Piping/Atmospherics/pipe.rsi - map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] + map: [ "enum.PipeColorVisualizer+Layers.Pipe", "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] + - type: Appearance + visuals: + - type: SubFloorShowLayerVisualizer + - type: PipeConnectorVisualizer + - type: PipeColorVisualizer + - type: GasOutletInjector - type: entity - parent: GasUnaryBase - id: GasThermoMachineBase + parent: BaseMachinePowered + id: BaseGasThermoMachine name: thermomachine description: Heats or cools gas in connected pipes. abstract: true @@ -117,10 +127,19 @@ - type: Appearance visuals: - type: PipeConnectorVisualizer + - type: PipeColorVisualizer - type: GasThermoMachine + - type: AtmosPipeColor + - type: AtmosDevice + - type: NodeContainer + nodes: + pipe: + !type:PipeNode + nodeGroupID: Pipe + pipeDirection: South - type: entity - parent: GasThermoMachineBase + parent: BaseGasThermoMachine id: GasThermoMachineFreezer name: freezer placement: @@ -130,9 +149,11 @@ layers: - state: freezer_off - state: pipe + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - type: Appearance visuals: - type: PipeConnectorVisualizer + - type: PipeColorVisualizer - type: ThermoMachineVisualizer enabledState: freezer_on - type: GasThermoMachine @@ -140,7 +161,7 @@ minTemperature: 73.15 - type: entity - parent: GasThermoMachineBase + parent: BaseGasThermoMachine id: GasThermoMachineHeater name: heater placement: @@ -150,9 +171,11 @@ layers: - state: heater_off - state: pipe + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - type: Appearance visuals: - type: PipeConnectorVisualizer + - type: PipeColorVisualizer - type: ThermoMachineVisualizer enabledState: heater_on - type: GasThermoMachine From d14b82a1e6d98d5fa4b62f08192bec3dec887d4f Mon Sep 17 00:00:00 2001 From: Paul Ritter Date: Sun, 1 Aug 2021 06:13:46 +0200 Subject: [PATCH 12/83] fixes morgue (almost) (#4375) * fixes morgue (almost) * yes Co-authored-by: Paul --- .../Components/MorgueEntityStorageComponent.cs | 16 ++++++++++++++++ .../Storage/Components/EntityStorageComponent.cs | 2 +- .../Entities/Structures/Storage/morgue.yml | 12 ++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Content.Server/Morgue/Components/MorgueEntityStorageComponent.cs b/Content.Server/Morgue/Components/MorgueEntityStorageComponent.cs index 0699c6e19f..7f38b3807d 100644 --- a/Content.Server/Morgue/Components/MorgueEntityStorageComponent.cs +++ b/Content.Server/Morgue/Components/MorgueEntityStorageComponent.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using Content.Server.Storage.Components; using Content.Shared.Body.Components; using Content.Shared.Directions; @@ -12,6 +13,7 @@ using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Containers; using Robust.Shared.GameObjects; +using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Maths; using Robust.Shared.Player; @@ -132,6 +134,20 @@ namespace Content.Server.Morgue.Components } } + protected override IEnumerable DetermineCollidingEntities() + { + if (_tray == null) + { + yield break; + } + + var entityLookup = IoCManager.Resolve(); + foreach (var entity in entityLookup.GetEntitiesIntersecting(_tray)) + { + yield return entity; + } + } + //Called every 10 seconds public void Update() { diff --git a/Content.Server/Storage/Components/EntityStorageComponent.cs b/Content.Server/Storage/Components/EntityStorageComponent.cs index cbe6f9affd..9fb9e995e8 100644 --- a/Content.Server/Storage/Components/EntityStorageComponent.cs +++ b/Content.Server/Storage/Components/EntityStorageComponent.cs @@ -443,7 +443,7 @@ namespace Content.Server.Storage.Components EmptyContents(); } - protected IEnumerable DetermineCollidingEntities() + protected virtual IEnumerable DetermineCollidingEntities() { var entityLookup = IoCManager.Resolve(); return entityLookup.GetEntitiesIntersecting(Owner); diff --git a/Resources/Prototypes/Entities/Structures/Storage/morgue.yml b/Resources/Prototypes/Entities/Structures/Storage/morgue.yml index 92e4e35a4e..2415993a28 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/morgue.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/morgue.yml @@ -54,6 +54,18 @@ name: morgue tray description: If you lay down to have a rest on this, you'll soon have a problem. components: + - type: Physics + bodyType: Static + fixtures: + - shape: + !type:PhysShapeAabb + bounds: "-0.5, -0.5, 0.5, 0.5" + mass: 25 + mask: + - Impassable + - MobImpassable + - VaultImpassable + - SmallImpassable - type: Sprite netsync: false sprite: Structures/Storage/morgue.rsi From 746eba632540e96a365a413679a318fcd7d33f92 Mon Sep 17 00:00:00 2001 From: SethLafuente <84478872+SethLafuente@users.noreply.github.com> Date: Sun, 1 Aug 2021 12:05:02 -0700 Subject: [PATCH 13/83] Made plasma grindable (#4334) Co-authored-by: SETh lafuente Co-authored-by: Swept --- .../Entities/Objects/Materials/Sheets/other.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml index 71c81c55d0..6a4d77d8aa 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml @@ -92,6 +92,16 @@ - plasma - plasma_2 - plasma_3 + - type: SolutionContainer + caps: 1 + contents: + reagents: + - ReagentId: Plasma + Quantity: 10 + - type: Tag + tags: + - Grindable + - Sheet - type: entity parent: SheetPlasma From 01b0006735bef848289cbfa32f92ad7bb5930cca Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 1 Aug 2021 15:06:05 -0400 Subject: [PATCH 14/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7a905c6cf4..b9fed37da4 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1632,3 +1632,8 @@ Entries: to the thrown object, type: Fix} id: 290 time: '2021-07-31T12:53:18.0000000+00:00' +- author: Seth + changes: + - {message: Made plasma Grindable, type: Tweak} + id: 291 + time: '2021-08-01T19:05:02.0000000+00:00' From ff320b4edc203fafe1d2becac1441d6a0f916345 Mon Sep 17 00:00:00 2001 From: Swept Date: Sun, 1 Aug 2021 15:13:28 -0700 Subject: [PATCH 15/83] Fixes invalid yaml line (#4408) --- Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml index d7a7ab1de6..73eb82633c 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml @@ -11,7 +11,6 @@ reagents: - ReagentId: Nutriment Quantity: 20 - trash: BowlBigTrash - type: Sprite sprite: Objects/Consumable/Food/bowl.rsi netsync: false From 5c5cd601e67a19e9548d5382244d60eae19af509 Mon Sep 17 00:00:00 2001 From: metalgearsloth Date: Mon, 2 Aug 2021 10:43:42 +1000 Subject: [PATCH 16/83] Fix potential timer exception --- Content.Server/Explosion/TriggerSystem.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Content.Server/Explosion/TriggerSystem.cs b/Content.Server/Explosion/TriggerSystem.cs index 8f1a03fef9..bc598de1e2 100644 --- a/Content.Server/Explosion/TriggerSystem.cs +++ b/Content.Server/Explosion/TriggerSystem.cs @@ -112,6 +112,7 @@ namespace Content.Server.Explosion Timer.Spawn(delay, () => { + if (triggered.Deleted) return; Trigger(triggered, user); }); } From 208f7a0c0d1603e35141cf0530521bcc0c31714f Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 2 Aug 2021 15:03:34 +1000 Subject: [PATCH 17/83] SetTile during extensions test (#4409) Mainly so it can actually account for accurate grid bounds when doing the test Co-authored-by: metalgearsloth --- .../Tests/Utility/EntitySystemExtensionsTest.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Content.IntegrationTests/Tests/Utility/EntitySystemExtensionsTest.cs b/Content.IntegrationTests/Tests/Utility/EntitySystemExtensionsTest.cs index 08f8a411f5..b33ccc3a57 100644 --- a/Content.IntegrationTests/Tests/Utility/EntitySystemExtensionsTest.cs +++ b/Content.IntegrationTests/Tests/Utility/EntitySystemExtensionsTest.cs @@ -5,6 +5,7 @@ using Content.Shared.Spawning; using NUnit.Framework; using Robust.Shared.GameObjects; using Robust.Shared.Map; +using Robust.Shared.Maths; using Robust.Shared.Physics; using Robust.Shared.Physics.Broadphase; @@ -44,7 +45,9 @@ namespace Content.IntegrationTests.Tests.Utility await server.WaitAssertion(() => { + var mapId = new MapId(1); var grid = sMapManager.GetGrid(new GridId(1)); + grid.SetTile(new Vector2i(0, 0), new Tile(1)); var entityCoordinates = new EntityCoordinates(grid.GridEntityId, 0, 0); // Nothing blocking it, only entity is the grid @@ -52,7 +55,6 @@ namespace Content.IntegrationTests.Tests.Utility Assert.True(sEntityManager.TrySpawnIfUnobstructed(null, entityCoordinates, CollisionGroup.Impassable, out var entity)); Assert.NotNull(entity); - var mapId = new MapId(1); var mapCoordinates = new MapCoordinates(0, 0, mapId); // Nothing blocking it, only entity is the grid From 54227240407c83454b880416af91b18d1843b153 Mon Sep 17 00:00:00 2001 From: metalgearsloth Date: Mon, 2 Aug 2021 16:21:05 +1000 Subject: [PATCH 18/83] Update submodule --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 8fea42ff9a..2239c30924 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 8fea42ff9ac05dfef40f9fec0dfd051ba054dbfa +Subproject commit 2239c309240a20d00c14a400fd2aa7f424b65413 From 331604cc66fd6a58f583fb375d88d1dab41e0809 Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto Date: Mon, 2 Aug 2021 13:20:31 +0200 Subject: [PATCH 19/83] GasFilter appearance, EnabledAtmosDeviceVisualizer improvements. --- .../EnabledAtmosDeviceVisualizer.cs | 17 +++------- .../Atmos/Visualizers/GasFilterVisualizer.cs | 18 ++++++++++ .../Visualizers/GasPortableVisualizer.cs | 2 +- .../Visualizers/OutletInjectorVisualizer.cs | 2 +- .../Visualizers/PassiveVentVisualizer.cs | 2 +- .../Visualizers/PressurePumpVisualizer.cs | 2 +- .../Atmos/Visualizers/ScrubberVisualizer.cs | 2 +- .../Visualizers/ThermoMachineVisualizer.cs | 2 +- .../Atmos/Visualizers/VentPumpVisualizer.cs | 2 +- .../Trinary/EntitySystems/GasFilterSystem.cs | 32 ++++++++++-------- .../Atmos/Piping/EnabledAtmosDeviceVisuals.cs | 16 ++++++--- .../Structures/Piping/Atmospherics/binary.yml | 3 +- .../Piping/Atmospherics/trinary.yml | 5 ++- .../Structures/Piping/Atmospherics/unary.yml | 4 +++ .../gasfilter.rsi/gasFilterOn.png | Bin 16173 -> 19883 bytes 15 files changed, 68 insertions(+), 41 deletions(-) create mode 100644 Content.Client/Atmos/Visualizers/GasFilterVisualizer.cs diff --git a/Content.Client/Atmos/Visualizers/EnabledAtmosDeviceVisualizer.cs b/Content.Client/Atmos/Visualizers/EnabledAtmosDeviceVisualizer.cs index b39fb9eed8..24af950e1e 100644 --- a/Content.Client/Atmos/Visualizers/EnabledAtmosDeviceVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/EnabledAtmosDeviceVisualizer.cs @@ -9,22 +9,13 @@ namespace Content.Client.Atmos.Visualizers [UsedImplicitly] public abstract class EnabledAtmosDeviceVisualizer : AppearanceVisualizer { + [DataField("disabledState")] + private string _disabledState = string.Empty; [DataField("enabledState")] private string _enabledState = string.Empty; protected abstract object LayerMap { get; } protected abstract Enum DataKey { get; } - public override void InitializeEntity(IEntity entity) - { - base.InitializeEntity(entity); - - if (!entity.TryGetComponent(out ISpriteComponent? sprite)) - return; - - sprite.LayerMapSet(LayerMap, sprite.AddLayerState(_enabledState)); - sprite.LayerSetVisible(LayerMap, false); - } - public override void OnChangeData(AppearanceComponent component) { base.OnChangeData(component); @@ -32,8 +23,8 @@ namespace Content.Client.Atmos.Visualizers if (!component.Owner.TryGetComponent(out ISpriteComponent? sprite)) return; - if(component.TryGetData(DataKey, out bool enabled)) - sprite.LayerSetVisible(LayerMap, enabled); + if(component.TryGetData(DataKey, out bool enabled) && sprite.LayerMapTryGet(LayerMap, out var layer)) + sprite.LayerSetState(layer, enabled ? _enabledState : _disabledState); } } } diff --git a/Content.Client/Atmos/Visualizers/GasFilterVisualizer.cs b/Content.Client/Atmos/Visualizers/GasFilterVisualizer.cs new file mode 100644 index 0000000000..5ad5468c42 --- /dev/null +++ b/Content.Client/Atmos/Visualizers/GasFilterVisualizer.cs @@ -0,0 +1,18 @@ +using System; +using Content.Shared.Atmos.Piping; +using JetBrains.Annotations; + +namespace Content.Client.Atmos.Visualizers +{ + [UsedImplicitly] + public class GasFilterVisualizer : EnabledAtmosDeviceVisualizer + { + protected override object LayerMap => Layers.Enabled; + protected override Enum DataKey => FilterVisuals.Enabled; + + enum Layers : byte + { + Enabled, + } + } +} diff --git a/Content.Client/Atmos/Visualizers/GasPortableVisualizer.cs b/Content.Client/Atmos/Visualizers/GasPortableVisualizer.cs index 07e62b5d59..77804494ce 100644 --- a/Content.Client/Atmos/Visualizers/GasPortableVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/GasPortableVisualizer.cs @@ -46,7 +46,7 @@ namespace Content.Client.Atmos.Visualizers } } - private enum Layers + private enum Layers : byte { ConnectedToPort, } diff --git a/Content.Client/Atmos/Visualizers/OutletInjectorVisualizer.cs b/Content.Client/Atmos/Visualizers/OutletInjectorVisualizer.cs index dc1681c226..ec23d7b503 100644 --- a/Content.Client/Atmos/Visualizers/OutletInjectorVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/OutletInjectorVisualizer.cs @@ -10,7 +10,7 @@ namespace Content.Client.Atmos.Visualizers protected override object LayerMap => Layers.Enabled; protected override Enum DataKey => OutletInjectorVisuals.Enabled; - enum Layers + enum Layers : byte { Enabled, } diff --git a/Content.Client/Atmos/Visualizers/PassiveVentVisualizer.cs b/Content.Client/Atmos/Visualizers/PassiveVentVisualizer.cs index 01991d837b..d2d08244bc 100644 --- a/Content.Client/Atmos/Visualizers/PassiveVentVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/PassiveVentVisualizer.cs @@ -10,7 +10,7 @@ namespace Content.Client.Atmos.Visualizers protected override object LayerMap => Layers.Enabled; protected override Enum DataKey => PassiveVentVisuals.Enabled; - enum Layers + enum Layers : byte { Enabled, } diff --git a/Content.Client/Atmos/Visualizers/PressurePumpVisualizer.cs b/Content.Client/Atmos/Visualizers/PressurePumpVisualizer.cs index c1441da37b..e0b5db06d3 100644 --- a/Content.Client/Atmos/Visualizers/PressurePumpVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/PressurePumpVisualizer.cs @@ -10,7 +10,7 @@ namespace Content.Client.Atmos.Visualizers protected override object LayerMap => Layers.Enabled; protected override Enum DataKey => PressurePumpVisuals.Enabled; - enum Layers + enum Layers : byte { Enabled, } diff --git a/Content.Client/Atmos/Visualizers/ScrubberVisualizer.cs b/Content.Client/Atmos/Visualizers/ScrubberVisualizer.cs index 6568fab771..e58b0bf8e7 100644 --- a/Content.Client/Atmos/Visualizers/ScrubberVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/ScrubberVisualizer.cs @@ -44,7 +44,7 @@ namespace Content.Client.Atmos.Visualizers } } - public enum ScrubberVisualLayers + public enum ScrubberVisualLayers : byte { Scrubber, } diff --git a/Content.Client/Atmos/Visualizers/ThermoMachineVisualizer.cs b/Content.Client/Atmos/Visualizers/ThermoMachineVisualizer.cs index e9d77226cc..ab7db6ae92 100644 --- a/Content.Client/Atmos/Visualizers/ThermoMachineVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/ThermoMachineVisualizer.cs @@ -10,7 +10,7 @@ namespace Content.Client.Atmos.Visualizers protected override object LayerMap => Layers.Enabled; protected override Enum DataKey => ThermoMachineVisuals.Enabled; - enum Layers + enum Layers : byte { Enabled, } diff --git a/Content.Client/Atmos/Visualizers/VentPumpVisualizer.cs b/Content.Client/Atmos/Visualizers/VentPumpVisualizer.cs index 7db4bc7d5f..cecc544b57 100644 --- a/Content.Client/Atmos/Visualizers/VentPumpVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/VentPumpVisualizer.cs @@ -40,7 +40,7 @@ namespace Content.Client.Atmos.Visualizers } } - public enum VentVisualLayers + public enum VentVisualLayers : byte { Vent, } diff --git a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs index a2db87f7bc..2d24c80fdf 100644 --- a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs +++ b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs @@ -3,7 +3,9 @@ using Content.Server.Atmos.Piping.Trinary.Components; using Content.Server.NodeContainer; using Content.Server.NodeContainer.Nodes; using Content.Shared.Atmos; +using Content.Shared.Atmos.Piping; using JetBrains.Annotations; +using Robust.Server.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Timing; @@ -24,33 +26,35 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems private void OnFilterUpdated(EntityUid uid, GasFilterComponent filter, AtmosDeviceUpdateEvent args) { - if (!filter.Enabled) - return; + var appearance = filter.Owner.GetComponentOrNull(); - if (!ComponentManager.TryGetComponent(uid, out NodeContainerComponent? nodeContainer)) + if (!filter.Enabled + || !ComponentManager.TryGetComponent(uid, out NodeContainerComponent? nodeContainer) + || !ComponentManager.TryGetComponent(uid, out AtmosDeviceComponent? device) + || !nodeContainer.TryGetNode(filter.InletName, out PipeNode? inletNode) + || !nodeContainer.TryGetNode(filter.FilterName, out PipeNode? filterNode) + || !nodeContainer.TryGetNode(filter.OutletName, out PipeNode? outletNode) + || outletNode.Air.Pressure >= Atmospherics.MaxOutputPressure) // No need to transfer if target is full. + { + appearance?.SetData(FilterVisuals.Enabled, false); return; - - if (!ComponentManager.TryGetComponent(uid, out AtmosDeviceComponent? device)) - return; - - if (!nodeContainer.TryGetNode(filter.InletName, out PipeNode? inletNode) - || !nodeContainer.TryGetNode(filter.FilterName, out PipeNode? filterNode) - || !nodeContainer.TryGetNode(filter.OutletName, out PipeNode? outletNode)) - return; - - if (outletNode.Air.Pressure >= Atmospherics.MaxOutputPressure) - return; // No need to transfer if target is full. + } // We multiply the transfer rate in L/s by the seconds passed since the last process to get the liters. var transferRatio = (float)(filter.TransferRate * (_gameTiming.CurTime - device.LastProcess).TotalSeconds) / inletNode.Air.Volume; if (transferRatio <= 0) + { + appearance?.SetData(FilterVisuals.Enabled, false); return; + } var removed = inletNode.Air.RemoveRatio(transferRatio); if (filter.FilteredGas.HasValue) { + appearance?.SetData(FilterVisuals.Enabled, true); + var filteredOut = new GasMixture() {Temperature = removed.Temperature}; filteredOut.SetMoles(filter.FilteredGas.Value, removed.GetMoles(filter.FilteredGas.Value)); diff --git a/Content.Shared/Atmos/Piping/EnabledAtmosDeviceVisuals.cs b/Content.Shared/Atmos/Piping/EnabledAtmosDeviceVisuals.cs index e95188cc0b..5f3883a25c 100644 --- a/Content.Shared/Atmos/Piping/EnabledAtmosDeviceVisuals.cs +++ b/Content.Shared/Atmos/Piping/EnabledAtmosDeviceVisuals.cs @@ -4,31 +4,37 @@ using Robust.Shared.Serialization; namespace Content.Shared.Atmos.Piping { [Serializable, NetSerializable] - public enum OutletInjectorVisuals + public enum OutletInjectorVisuals : byte { Enabled, } [Serializable, NetSerializable] - public enum PassiveVentVisuals + public enum PassiveVentVisuals : byte { Enabled, } [Serializable, NetSerializable] - public enum VentScrubberVisuals + public enum VentScrubberVisuals : byte { Enabled, } [Serializable, NetSerializable] - public enum ThermoMachineVisuals + public enum ThermoMachineVisuals : byte { Enabled, } [Serializable, NetSerializable] - public enum PressurePumpVisuals + public enum PressurePumpVisuals : byte + { + Enabled, + } + + [Serializable, NetSerializable] + public enum FilterVisuals : byte { Enabled, } diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml index d52e24f2fa..c62a227933 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml @@ -33,13 +33,14 @@ state: pipeStraight map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: pumpPressure - map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] + map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer", "enum.PressurePumpVisualizer+Layers.Enabled" ] - type: Appearance visuals: - type: SubFloorShowLayerVisualizer - type: PipeConnectorVisualizer - type: PipeColorVisualizer - type: PressurePumpVisualizer + disabledState: pumpPressure enabledState: pumpPressureOn - type: GasPressurePump diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml index f8b5414d4f..55b541dd2a 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml @@ -38,12 +38,15 @@ state: pipeTJunction map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: gasFilter - map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] + map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer", "enum.GasFilterVisualizer+Layers.Enabled" ] - type: Appearance visuals: - type: SubFloorShowLayerVisualizer - type: PipeConnectorVisualizer - type: PipeColorVisualizer + - type: GasFilterVisualizer + disabledState: gasFilter + enabledState: gasFilterOn - type: GasFilter - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml index b85e71e3af..f628e58595 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml @@ -148,6 +148,7 @@ - type: Sprite layers: - state: freezer_off + map: [ "enum.ThermoMachineVisualizer+Layers.Enabled" ] - state: pipe map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - type: Appearance @@ -155,6 +156,7 @@ - type: PipeConnectorVisualizer - type: PipeColorVisualizer - type: ThermoMachineVisualizer + disabledState: freezer_off enabledState: freezer_on - type: GasThermoMachine mode: Freezer @@ -170,6 +172,7 @@ - type: Sprite layers: - state: heater_off + map: [ "enum.ThermoMachineVisualizer+Layers.Enabled" ] - state: pipe map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - type: Appearance @@ -177,6 +180,7 @@ - type: PipeConnectorVisualizer - type: PipeColorVisualizer - type: ThermoMachineVisualizer + disabledState: heater_off enabledState: heater_on - type: GasThermoMachine mode: Heater diff --git a/Resources/Textures/Structures/Piping/Atmospherics/gasfilter.rsi/gasFilterOn.png b/Resources/Textures/Structures/Piping/Atmospherics/gasfilter.rsi/gasFilterOn.png index 891eface878691c8b320b85da128b36823b53629..06cdacf03e2675e7345ab72531ad0fd38353faec 100644 GIT binary patch literal 19883 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 R+l&AJ002ovPDHLkV1n8em?i)K literal 16173 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 Date: Mon, 2 Aug 2021 13:53:33 +0200 Subject: [PATCH 20/83] Add Enabled property to SubFloorHideComponent, make it networked. (#4404) --- .../SubFloor/SubFloorHideComponent.cs | 32 +++++++++++- Content.Shared/SubFloor/SubFloorHideSystem.cs | 49 +++++++++++++++---- 2 files changed, 71 insertions(+), 10 deletions(-) diff --git a/Content.Shared/SubFloor/SubFloorHideComponent.cs b/Content.Shared/SubFloor/SubFloorHideComponent.cs index 93587e6f8c..100903c855 100644 --- a/Content.Shared/SubFloor/SubFloorHideComponent.cs +++ b/Content.Shared/SubFloor/SubFloorHideComponent.cs @@ -1,4 +1,8 @@ +using System; using Robust.Shared.GameObjects; +using Robust.Shared.GameStates; +using Robust.Shared.Players; +using Robust.Shared.Serialization; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.ViewVariables; @@ -10,6 +14,7 @@ namespace Content.Shared.SubFloor /// (plating). /// /// + [NetworkedComponent] [RegisterComponent] public sealed class SubFloorHideComponent : Component { @@ -17,10 +22,35 @@ namespace Content.Shared.SubFloor public override string Name => "SubFloorHide"; /// - /// This entity needs to be anchored to be hid in the subfloor. + /// Whether the entity will be hid when not in subfloor. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("enabled")] + public bool Enabled { get; set; } = true; + + /// + /// This entity needs to be anchored to be hid when not in subfloor. /// [ViewVariables(VVAccess.ReadWrite)] [DataField("requireAnchored")] public bool RequireAnchored { get; set; } = true; + + public override ComponentState GetComponentState(ICommonSession player) + { + return new SubFloorHideComponentState(Enabled, RequireAnchored); + } + } + + [Serializable, NetSerializable] + public class SubFloorHideComponentState : ComponentState + { + public bool Enabled { get; } + public bool RequireAnchored { get; } + + public SubFloorHideComponentState(bool enabled, bool requireAnchored) + { + Enabled = enabled; + RequireAnchored = requireAnchored; + } } } diff --git a/Content.Shared/SubFloor/SubFloorHideSystem.cs b/Content.Shared/SubFloor/SubFloorHideSystem.cs index 503a153ea4..d729e2b31a 100644 --- a/Content.Shared/SubFloor/SubFloorHideSystem.cs +++ b/Content.Shared/SubFloor/SubFloorHideSystem.cs @@ -2,6 +2,7 @@ using System; using Content.Shared.Maps; using JetBrains.Annotations; using Robust.Shared.GameObjects; +using Robust.Shared.GameStates; using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Maths; @@ -44,6 +45,7 @@ namespace Content.Shared.SubFloor SubscribeLocalEvent(OnSubFloorStarted); SubscribeLocalEvent(OnSubFloorTerminating); SubscribeLocalEvent(HandleAnchorChanged); + SubscribeLocalEvent(HandleComponentState); } public override void Shutdown() @@ -54,6 +56,20 @@ namespace Content.Shared.SubFloor _mapManager.TileChanged -= MapManagerOnTileChanged; } + public void SetEnabled(SubFloorHideComponent subFloor, bool enabled) + { + subFloor.Enabled = enabled; + subFloor.Dirty(); + UpdateEntity(subFloor.Owner.Uid); + } + + public void SetRequireAnchoring(SubFloorHideComponent subFloor, bool requireAnchored) + { + subFloor.RequireAnchored = requireAnchored; + subFloor.Dirty(); + UpdateEntity(subFloor.Owner.Uid); + } + private void OnSubFloorStarted(EntityUid uid, SubFloorHideComponent component, ComponentStartup _) { UpdateEntity(uid); @@ -73,6 +89,16 @@ namespace Content.Shared.SubFloor UpdateEntity(uid); } + private void HandleComponentState(EntityUid uid, SubFloorHideComponent component, ComponentHandleState args) + { + if (args.Current is not SubFloorHideComponentState state) + return; + + component.Enabled = state.Enabled; + component.RequireAnchored = state.RequireAnchored; + UpdateEntity(uid); + } + private void MapManagerOnTileChanged(object? sender, TileChangedEventArgs e) { UpdateTile(_mapManager.GetGrid(e.NewTile.GridIndex), e.NewTile.GridIndices); @@ -136,16 +162,21 @@ namespace Content.Shared.SubFloor if (subFloorHideEvent.Handled) return; - // This might look weird, but basically we only need to query the SubFloorHide and Transform components - // if we are gonna hide the entity and we require it to be anchored to be hidden. Because getting components - // is "expensive", we have a slow path where we query them, and a fast path where we don't. - if (!subFloor - && ComponentManager.TryGetComponent(uid, out SubFloorHideComponent? subFloorHideComponent) && - subFloorHideComponent.RequireAnchored - && ComponentManager.TryGetComponent(uid, out ITransformComponent? transformComponent)) + // We only need to query the subfloor component to check if it's enabled or not when we're not on subfloor. + // Getting components is expensive, after all. + if (!subFloor && ComponentManager.TryGetComponent(uid, out SubFloorHideComponent? subFloorHideComponent)) { - // If we require the entity to be anchored but it's not, this will set subfloor to true, unhiding it. - subFloor = !transformComponent.Anchored; + // If the component isn't enabled, then subfloor will always be true, and the entity will be shown. + if (!subFloorHideComponent.Enabled) + { + subFloor = true; + } + // We only need to query the TransformComp if the SubfloorHide is enabled and requires anchoring. + else if (subFloorHideComponent.RequireAnchored && ComponentManager.TryGetComponent(uid, out ITransformComponent? transformComponent)) + { + // If we require the entity to be anchored but it's not, this will set subfloor to true, unhiding it. + subFloor = !transformComponent.Anchored; + } } // Whether to show this entity as visible, visually. From af2e21c3559f01c88574b2a58398e074c895c80f Mon Sep 17 00:00:00 2001 From: mirrorcult Date: Mon, 2 Aug 2021 04:57:06 -0700 Subject: [PATCH 21/83] Refactor IDoorCheck into entity events (#4366) * IDoorCheck refactored to events # Conflicts: # Content.Server/Atmos/TileAtmosphere.cs # Content.Server/Doors/Components/AirlockComponent.cs # Content.Server/Doors/Components/FirelockComponent.cs # Content.Server/Doors/Components/ServerDoorComponent.cs # Content.Server/Doors/IDoorCheck.cs * namespaces * Fix mapinit bug with refreshautoclose * ok i guess these just didnt feel like staging today --- Content.Client/Doors/AirlockVisualizer.cs | 27 --- .../AtmosphereSystem.Monstermos.cs | 1 + .../Doors/Components/AirlockComponent.cs | 216 ++++++------------ .../Components/FirelockComponent.cs | 58 ++--- .../Doors/Components/ServerDoorComponent.cs | 156 +++++++++---- Content.Server/Doors/DoorEvents.cs | 141 ++++++++++++ Content.Server/Doors/IDoorCheck.cs | 76 ------ Content.Server/Doors/Systems/AirlockSystem.cs | 109 +++++++++ .../Doors/{ => Systems}/DoorSystem.cs | 0 .../Doors/Systems/FirelockSystem.cs | 69 ++++++ Content.Shared/Doors/SharedDoorComponent.cs | 3 + .../Structures/Doors/Airlocks/base.yml | 9 +- .../Structures/Doors/Airlocks/external.yml | 9 +- .../Structures/Doors/Firelocks/firelock.yml | 9 +- 14 files changed, 545 insertions(+), 338 deletions(-) rename Content.Server/{Atmos => Doors}/Components/FirelockComponent.cs (59%) create mode 100644 Content.Server/Doors/DoorEvents.cs delete mode 100644 Content.Server/Doors/IDoorCheck.cs create mode 100644 Content.Server/Doors/Systems/AirlockSystem.cs rename Content.Server/Doors/{ => Systems}/DoorSystem.cs (100%) create mode 100644 Content.Server/Doors/Systems/FirelockSystem.cs diff --git a/Content.Client/Doors/AirlockVisualizer.cs b/Content.Client/Doors/AirlockVisualizer.cs index 8f6c0651b1..a428a5bc2e 100644 --- a/Content.Client/Doors/AirlockVisualizer.cs +++ b/Content.Client/Doors/AirlockVisualizer.cs @@ -17,15 +17,6 @@ namespace Content.Client.Doors { private const string AnimationKey = "airlock_animation"; - [DataField("open_sound", required: true)] - private string _openSound = default!; - - [DataField("close_sound", required: true)] - private string _closeSound = default!; - - [DataField("deny_sound", required: true)] - private string _denySound = default!; - [DataField("animation_time")] private float _delay = 0.8f; @@ -51,14 +42,6 @@ namespace Content.Client.Doors CloseAnimation.AnimationTracks.Add(flickMaintenancePanel); flickMaintenancePanel.LayerKey = WiresVisualizer.WiresVisualLayers.MaintenancePanel; flickMaintenancePanel.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame("panel_closing", 0f)); - - var sound = new AnimationTrackPlaySound(); - CloseAnimation.AnimationTracks.Add(sound); - - if (_closeSound != null) - { - sound.KeyFrames.Add(new AnimationTrackPlaySound.KeyFrame(_closeSound, 0)); - } } OpenAnimation = new Animation {Length = TimeSpan.FromSeconds(_delay)}; @@ -80,11 +63,6 @@ namespace Content.Client.Doors var sound = new AnimationTrackPlaySound(); OpenAnimation.AnimationTracks.Add(sound); - - if (_openSound != null) - { - sound.KeyFrames.Add(new AnimationTrackPlaySound.KeyFrame(_openSound, 0)); - } } DenyAnimation = new Animation {Length = TimeSpan.FromSeconds(0.3f)}; @@ -96,11 +74,6 @@ namespace Content.Client.Doors var sound = new AnimationTrackPlaySound(); DenyAnimation.AnimationTracks.Add(sound); - - if (_denySound != null) - { - sound.KeyFrames.Add(new AnimationTrackPlaySound.KeyFrame(_denySound, 0, () => AudioHelpers.WithVariation(0.05f))); - } } } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs index 30b4df6473..87a4f8b2e1 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs @@ -5,6 +5,7 @@ using System.Buffers; using System.Collections.Generic; using Content.Server.Atmos.Components; using Content.Server.Coordinates.Helpers; +using Content.Server.Doors.Components; using Content.Shared.Atmos; using Robust.Shared.GameObjects; using Robust.Shared.IoC; diff --git a/Content.Server/Doors/Components/AirlockComponent.cs b/Content.Server/Doors/Components/AirlockComponent.cs index 2e47a1b6d7..dda64b4cda 100644 --- a/Content.Server/Doors/Components/AirlockComponent.cs +++ b/Content.Server/Doors/Components/AirlockComponent.cs @@ -7,12 +7,14 @@ using Content.Shared.Doors; using Content.Shared.Interaction; using Content.Shared.Notification; using Content.Shared.Notification.Managers; +using Content.Shared.Sound; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.GameObjects; using Robust.Shared.Localization; using Robust.Shared.Maths; using Robust.Shared.Player; +using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.ViewVariables; using static Content.Shared.Wires.SharedWiresComponent; using static Content.Shared.Wires.SharedWiresComponent.WiresAction; @@ -23,30 +25,41 @@ namespace Content.Server.Doors.Components /// Companion component to ServerDoorComponent that handles airlock-specific behavior -- wires, requiring power to operate, bolts, and allowing automatic closing. /// [RegisterComponent] - [ComponentReference(typeof(IDoorCheck))] - public class AirlockComponent : Component, IWires, IDoorCheck + public class AirlockComponent : Component, IWires { public override string Name => "Airlock"; [ComponentDependency] - private readonly ServerDoorComponent? _doorComponent = null; + public readonly ServerDoorComponent? DoorComponent = null; [ComponentDependency] - private readonly SharedAppearanceComponent? _appearanceComponent = null; + public readonly SharedAppearanceComponent? AppearanceComponent = null; [ComponentDependency] - private readonly ApcPowerReceiverComponent? _receiverComponent = null; + public readonly ApcPowerReceiverComponent? ReceiverComponent = null; [ComponentDependency] - private readonly WiresComponent? _wiresComponent = null; + public readonly WiresComponent? WiresComponent = null; + + /// + /// Sound to play when the bolts on the airlock go up. + /// + [DataField("boltUpSound")] + public SoundSpecifier BoltUpSound = new SoundPathSpecifier("/Audio/Machines/boltsup.ogg"); + + /// + /// Sound to play when the bolts on the airlock go down. + /// + [DataField("boltDownSound")] + public SoundSpecifier BoltDownSound = new SoundPathSpecifier("/Audio/Machines/boltsdown.ogg"); /// /// Duration for which power will be disabled after pulsing either power wire. /// - private static readonly TimeSpan PowerWiresTimeout = TimeSpan.FromSeconds(5.0); + [DataField("powerWiresTimeout")] + public float PowerWiresTimeout = 5.0f; private CancellationTokenSource _powerWiresPulsedTimerCancel = new(); - private bool _powerWiresPulsed; /// @@ -83,7 +96,7 @@ namespace Content.Server.Doors.Components private bool BoltLightsVisible { get => _boltLightsWirePulsed && BoltsDown && IsPowered() - && _doorComponent != null && _doorComponent.State == SharedDoorComponent.DoorState.Closed; + && DoorComponent != null && DoorComponent.State == SharedDoorComponent.DoorState.Closed; set { _boltLightsWirePulsed = value; @@ -91,120 +104,53 @@ namespace Content.Server.Doors.Components } } - private static readonly TimeSpan AutoCloseDelayFast = TimeSpan.FromSeconds(1); + [ViewVariables(VVAccess.ReadWrite)] + [DataField("autoClose")] + public bool AutoClose = true; [ViewVariables(VVAccess.ReadWrite)] - private bool _autoClose = true; + [DataField("autoCloseDelayModifier")] + public float AutoCloseDelayModifier = 1.0f; [ViewVariables(VVAccess.ReadWrite)] - private bool _normalCloseSpeed = true; - - [ViewVariables(VVAccess.ReadWrite)] - private bool _safety = true; + public bool Safety = true; protected override void Initialize() { base.Initialize(); - if (_receiverComponent != null && _appearanceComponent != null) + if (ReceiverComponent != null && AppearanceComponent != null) { - _appearanceComponent.SetData(DoorVisuals.Powered, _receiverComponent.Powered); + AppearanceComponent.SetData(DoorVisuals.Powered, ReceiverComponent.Powered); } } - public override void HandleMessage(ComponentMessage message, IComponent? component) - { - base.HandleMessage(message, component); - switch (message) - { - case PowerChangedMessage powerChanged: - PowerDeviceOnOnPowerStateChanged(powerChanged); - break; - } - } - - void IDoorCheck.OnStateChange(SharedDoorComponent.DoorState doorState) - { - // Only show the maintenance panel if the airlock is closed - if (_wiresComponent != null) - { - _wiresComponent.IsPanelVisible = doorState != SharedDoorComponent.DoorState.Open; - } - // If the door is closed, we should look if the bolt was locked while closing - UpdateBoltLightStatus(); - } - - bool IDoorCheck.OpenCheck() => CanChangeState(); - - bool IDoorCheck.CloseCheck() => CanChangeState(); - - bool IDoorCheck.DenyCheck() => CanChangeState(); - - bool IDoorCheck.SafetyCheck() => _safety; - - bool IDoorCheck.AutoCloseCheck() => _autoClose; - - TimeSpan? IDoorCheck.GetCloseSpeed() - { - if (_normalCloseSpeed) - { - return null; - } - return AutoCloseDelayFast; - } - - bool IDoorCheck.BlockActivate(ActivateEventArgs eventArgs) - { - if (_wiresComponent != null && _wiresComponent.IsPanelOpen && - eventArgs.User.TryGetComponent(out ActorComponent? actor)) - { - _wiresComponent.OpenInterface(actor.PlayerSession); - return true; - } - return false; - } - - bool IDoorCheck.CanPryCheck(InteractUsingEventArgs eventArgs) - { - if (IsBolted()) - { - Owner.PopupMessage(eventArgs.User, Loc.GetString("airlock-component-cannot-pry-is-bolted-message ")); - return false; - } - if (IsPowered()) - { - Owner.PopupMessage(eventArgs.User, Loc.GetString("airlock-component-cannot-pry-is-powered-message")); - return false; - } - return true; - } - - private bool CanChangeState() + public bool CanChangeState() { return IsPowered() && !IsBolted(); } - private bool IsBolted() + public bool IsBolted() { return _boltsDown; } - private bool IsPowered() + public bool IsPowered() { - return _receiverComponent == null || _receiverComponent.Powered; + return ReceiverComponent == null || ReceiverComponent.Powered; } - private void UpdateBoltLightStatus() + public void UpdateBoltLightStatus() { - if (_appearanceComponent != null) + if (AppearanceComponent != null) { - _appearanceComponent.SetData(DoorVisuals.BoltLights, BoltLightsVisible); + AppearanceComponent.SetData(DoorVisuals.BoltLights, BoltLightsVisible); } } - private void UpdateWiresStatus() + public void UpdateWiresStatus() { - if (_doorComponent == null) + if (DoorComponent == null) { return; } @@ -214,9 +160,9 @@ namespace Content.Server.Doors.Components { powerLight = new StatusLightData(Color.Yellow, StatusLightState.BlinkingFast, "POWR"); } - else if (_wiresComponent != null && - _wiresComponent.IsWireCut(Wires.MainPower) && - _wiresComponent.IsWireCut(Wires.BackupPower)) + else if (WiresComponent != null && + WiresComponent.IsWireCut(Wires.MainPower) && + WiresComponent.IsWireCut(Wires.BackupPower)) { powerLight = new StatusLightData(Color.Red, StatusLightState.On, "POWR"); } @@ -226,63 +172,59 @@ namespace Content.Server.Doors.Components var boltLightsStatus = new StatusLightData(Color.Lime, _boltLightsWirePulsed ? StatusLightState.On : StatusLightState.Off, "BLTL"); + var ev = new DoorGetCloseTimeModifierEvent(); + Owner.EntityManager.EventBus.RaiseLocalEvent(Owner.Uid, ev, false); + var timingStatus = - new StatusLightData(Color.Orange, !_autoClose ? StatusLightState.Off : - !_normalCloseSpeed ? StatusLightState.BlinkingSlow : + new StatusLightData(Color.Orange, !AutoClose ? StatusLightState.Off : + !MathHelper.CloseTo(ev.CloseTimeModifier, 1.0f) ? StatusLightState.BlinkingSlow : StatusLightState.On, "TIME"); var safetyStatus = - new StatusLightData(Color.Red, _safety ? StatusLightState.On : StatusLightState.Off, "SAFE"); + new StatusLightData(Color.Red, Safety ? StatusLightState.On : StatusLightState.Off, "SAFE"); - if (_wiresComponent == null) + if (WiresComponent == null) { return; } - _wiresComponent.SetStatus(AirlockWireStatus.PowerIndicator, powerLight); - _wiresComponent.SetStatus(AirlockWireStatus.BoltIndicator, boltStatus); - _wiresComponent.SetStatus(AirlockWireStatus.BoltLightIndicator, boltLightsStatus); - _wiresComponent.SetStatus(AirlockWireStatus.AIControlIndicator, new StatusLightData(Color.Purple, StatusLightState.BlinkingSlow, "AICT")); - _wiresComponent.SetStatus(AirlockWireStatus.TimingIndicator, timingStatus); - _wiresComponent.SetStatus(AirlockWireStatus.SafetyIndicator, safetyStatus); - /* - _wires.SetStatus(6, powerLight); - _wires.SetStatus(7, powerLight); - _wires.SetStatus(8, powerLight); - _wires.SetStatus(9, powerLight); - _wires.SetStatus(10, powerLight); - _wires.SetStatus(11, powerLight);*/ + WiresComponent.SetStatus(AirlockWireStatus.PowerIndicator, powerLight); + WiresComponent.SetStatus(AirlockWireStatus.BoltIndicator, boltStatus); + WiresComponent.SetStatus(AirlockWireStatus.BoltLightIndicator, boltLightsStatus); + WiresComponent.SetStatus(AirlockWireStatus.AIControlIndicator, new StatusLightData(Color.Purple, StatusLightState.BlinkingSlow, "AICT")); + WiresComponent.SetStatus(AirlockWireStatus.TimingIndicator, timingStatus); + WiresComponent.SetStatus(AirlockWireStatus.SafetyIndicator, safetyStatus); } private void UpdatePowerCutStatus() { - if (_receiverComponent == null) + if (ReceiverComponent == null) { return; } if (PowerWiresPulsed) { - _receiverComponent.PowerDisabled = true; + ReceiverComponent.PowerDisabled = true; return; } - if (_wiresComponent == null) + if (WiresComponent == null) { return; } - _receiverComponent.PowerDisabled = - _wiresComponent.IsWireCut(Wires.MainPower) || - _wiresComponent.IsWireCut(Wires.BackupPower); + ReceiverComponent.PowerDisabled = + WiresComponent.IsWireCut(Wires.MainPower) || + WiresComponent.IsWireCut(Wires.BackupPower); } private void PowerDeviceOnOnPowerStateChanged(PowerChangedMessage e) { - if (_appearanceComponent != null) + if (AppearanceComponent != null) { - _appearanceComponent.SetData(DoorVisuals.Powered, e.Powered); + AppearanceComponent.SetData(DoorVisuals.Powered, e.Powered); } // BoltLights also got out @@ -341,19 +283,13 @@ namespace Content.Server.Doors.Components builder.CreateWire(Wires.BoltLight); builder.CreateWire(Wires.Timing); builder.CreateWire(Wires.Safety); - /* - builder.CreateWire(6); - builder.CreateWire(7); - builder.CreateWire(8); - builder.CreateWire(9); - builder.CreateWire(10); - builder.CreateWire(11);*/ + UpdateWiresStatus(); } public void WiresUpdate(WiresUpdateEventArgs args) { - if(_doorComponent == null) + if(DoorComponent == null) { return; } @@ -367,7 +303,7 @@ namespace Content.Server.Doors.Components PowerWiresPulsed = true; _powerWiresPulsedTimerCancel.Cancel(); _powerWiresPulsedTimerCancel = new CancellationTokenSource(); - Owner.SpawnTimer(PowerWiresTimeout, + Owner.SpawnTimer(TimeSpan.FromSeconds(PowerWiresTimeout), () => PowerWiresPulsed = false, _powerWiresPulsedTimerCancel.Token); break; @@ -390,11 +326,11 @@ namespace Content.Server.Doors.Components BoltLightsVisible = !_boltLightsWirePulsed; break; case Wires.Timing: - _normalCloseSpeed = !_normalCloseSpeed; - _doorComponent.RefreshAutoClose(); + AutoCloseDelayModifier = 0.5f; + DoorComponent.RefreshAutoClose(); break; case Wires.Safety: - _safety = !_safety; + Safety = !Safety; break; } } @@ -413,11 +349,11 @@ namespace Content.Server.Doors.Components BoltLightsVisible = true; break; case Wires.Timing: - _autoClose = true; - _doorComponent.RefreshAutoClose(); + AutoClose = true; + DoorComponent.RefreshAutoClose(); break; case Wires.Safety: - _safety = true; + Safety = true; break; } } @@ -433,11 +369,11 @@ namespace Content.Server.Doors.Components BoltLightsVisible = false; break; case Wires.Timing: - _autoClose = false; - _doorComponent.RefreshAutoClose(); + AutoClose = false; + DoorComponent.RefreshAutoClose(); break; case Wires.Safety: - _safety = false; + Safety = false; break; } } @@ -455,7 +391,7 @@ namespace Content.Server.Doors.Components BoltsDown = newBolts; - SoundSystem.Play(Filter.Broadcast(), newBolts ? "/Audio/Machines/boltsdown.ogg" : "/Audio/Machines/boltsup.ogg", Owner); + SoundSystem.Play(Filter.Broadcast(), newBolts ? BoltDownSound.GetSound() : BoltUpSound.GetSound(), Owner); } } } diff --git a/Content.Server/Atmos/Components/FirelockComponent.cs b/Content.Server/Doors/Components/FirelockComponent.cs similarity index 59% rename from Content.Server/Atmos/Components/FirelockComponent.cs rename to Content.Server/Doors/Components/FirelockComponent.cs index b1849cd757..ee7154bb28 100644 --- a/Content.Server/Atmos/Components/FirelockComponent.cs +++ b/Content.Server/Doors/Components/FirelockComponent.cs @@ -1,3 +1,4 @@ +using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Doors; using Content.Server.Doors.Components; @@ -6,26 +7,34 @@ using Content.Shared.Interaction; using Content.Shared.Notification.Managers; using Robust.Shared.GameObjects; using Robust.Shared.Localization; +using Robust.Shared.Serialization.Manager.Attributes; -namespace Content.Server.Atmos.Components +namespace Content.Server.Doors.Components { /// - /// Companion component to ServerDoorComponent that handles firelock-specific behavior -- primarily prying, and not being openable on open-hand click. + /// Companion component to ServerDoorComponent that handles firelock-specific behavior -- primarily prying, + /// and not being openable on open-hand click. /// [RegisterComponent] - [ComponentReference(typeof(IDoorCheck))] - public class FirelockComponent : Component, IDoorCheck + public class FirelockComponent : Component { public override string Name => "Firelock"; [ComponentDependency] - private readonly ServerDoorComponent? _doorComponent = null; + public readonly ServerDoorComponent? DoorComponent = null; + + /// + /// Pry time modifier to be used when the firelock is currently closed due to fire or pressure. + /// + /// + [DataField("lockedPryTimeModifier")] + public float LockedPryTimeModifier = 1.5f; public bool EmergencyPressureStop() { - if (_doorComponent != null && _doorComponent.State == SharedDoorComponent.DoorState.Open && _doorComponent.CanCloseGeneric()) + if (DoorComponent != null && DoorComponent.State == SharedDoorComponent.DoorState.Open && DoorComponent.CanCloseGeneric()) { - _doorComponent.Close(); + DoorComponent.Close(); if (Owner.TryGetComponent(out AirtightComponent? airtight)) { EntitySystem.Get().SetAirblocked(airtight, true); @@ -35,41 +44,6 @@ namespace Content.Server.Atmos.Components return false; } - bool IDoorCheck.OpenCheck() - { - return !IsHoldingFire() && !IsHoldingPressure(); - } - - bool IDoorCheck.DenyCheck() => false; - - float? IDoorCheck.GetPryTime() - { - if (IsHoldingFire() || IsHoldingPressure()) - { - return 1.5f; - } - return null; - } - - bool IDoorCheck.BlockActivate(ActivateEventArgs eventArgs) => true; - - void IDoorCheck.OnStartPry(InteractUsingEventArgs eventArgs) - { - if (_doorComponent == null || _doorComponent.State != SharedDoorComponent.DoorState.Closed) - { - return; - } - - if (IsHoldingPressure()) - { - Owner.PopupMessage(eventArgs.User, Loc.GetString("firelock-component-is-holding-pressure-message")); - } - else if (IsHoldingFire()) - { - Owner.PopupMessage(eventArgs.User, Loc.GetString("firelock-component-is-holding-fire-message")); - } - } - public bool IsHoldingPressure(float threshold = 20) { var atmosphereSystem = EntitySystem.Get(); diff --git a/Content.Server/Doors/Components/ServerDoorComponent.cs b/Content.Server/Doors/Components/ServerDoorComponent.cs index 8449074d65..1feb49a3b6 100644 --- a/Content.Server/Doors/Components/ServerDoorComponent.cs +++ b/Content.Server/Doors/Components/ServerDoorComponent.cs @@ -14,6 +14,7 @@ using Content.Shared.Damage; using Content.Shared.Damage.Components; using Content.Shared.Doors; using Content.Shared.Interaction; +using Content.Shared.Sound; using Content.Shared.Tool; using Robust.Shared.Audio; using Robust.Shared.Containers; @@ -37,9 +38,6 @@ namespace Content.Server.Doors.Components [ComponentReference(typeof(SharedDoorComponent))] public class ServerDoorComponent : SharedDoorComponent, IActivate, IInteractUsing, IMapInit { - [ComponentDependency] - private readonly IDoorCheck? _doorCheck = null; - [ViewVariables] [DataField("board")] private string? _boardPrototype; @@ -63,11 +61,8 @@ namespace Content.Server.Doors.Components _ => throw new ArgumentOutOfRangeException(), }; - if (_doorCheck != null) - { - _doorCheck.OnStateChange(State); - RefreshAutoClose(); - } + Owner.EntityManager.EventBus.RaiseLocalEvent(Owner.Uid, new DoorStateChangedEvent(State), false); + _autoCloseCancelTokenSource?.Cancel(); Dirty(); } @@ -105,7 +100,7 @@ namespace Content.Server.Doors.Components /// Handled in Startup(). /// [ViewVariables(VVAccess.ReadWrite)] [DataField("startOpen")] - private bool _startOpen; + private bool _startOpen = false; /// /// Whether the airlock is welded shut. Can be set by the prototype, although this will fail if the door isn't weldable. @@ -139,6 +134,41 @@ namespace Content.Server.Doors.Components [DataField("weldable")] private bool _weldable = true; + /// + /// Sound to play when the door opens. + /// + [DataField("openSound")] + public SoundSpecifier? OpenSound; + + /// + /// Sound to play when the door closes. + /// + [DataField("closeSound")] + public SoundSpecifier? CloseSound; + + /// + /// Sound to play if the door is denied. + /// + [DataField("denySound")] + public SoundSpecifier? DenySound; + + /// + /// Default time that the door should take to pry open. + /// + [DataField("pryTime")] + public float PryTime = 0.5f; + + /// + /// Minimum interval allowed between deny sounds in milliseconds. + /// + [DataField("denySoundMinimumInterval")] + public float DenySoundMinimumInterval = 250.0f; + + /// + /// Used to stop people from spamming the deny sound. + /// + private TimeSpan LastDenySoundTime = TimeSpan.Zero; + /// /// Whether the door can currently be welded. /// @@ -149,6 +179,7 @@ namespace Content.Server.Doors.Components /// private bool _beingWelded; + //[ViewVariables(VVAccess.ReadWrite)] //[DataField("canCrush")] //private bool _canCrush = true; // TODO implement door crushing @@ -187,7 +218,7 @@ namespace Content.Server.Doors.Components Logger.Warning("{0} prototype loaded with incompatible flags: 'welded' and 'startOpen' are both true.", Owner.Name); return; } - QuickOpen(); + QuickOpen(false); } CreateDoorElectronicsBoard(); @@ -195,10 +226,10 @@ namespace Content.Server.Doors.Components void IActivate.Activate(ActivateEventArgs eventArgs) { - if (_doorCheck != null && _doorCheck.BlockActivate(eventArgs)) - { + DoorClickShouldActivateEvent ev = new DoorClickShouldActivateEvent(eventArgs); + Owner.EntityManager.EventBus.RaiseLocalEvent(Owner.Uid, ev, false); + if (ev.Handled) return; - } if (State == DoorState.Open) { @@ -279,12 +310,10 @@ namespace Content.Server.Doors.Components { return false; } - if(_doorCheck != null) - { - return _doorCheck.OpenCheck(); - } - return true; + var ev = new BeforeDoorOpenedEvent(); + Owner.EntityManager.EventBus.RaiseLocalEvent(Owner.Uid, ev, false); + return !ev.Cancelled; } /// @@ -301,12 +330,19 @@ namespace Content.Server.Doors.Components _stateChangeCancelTokenSource?.Cancel(); _stateChangeCancelTokenSource = new(); + if (OpenSound != null) + { + SoundSystem.Play(Filter.Pvs(Owner), OpenSound.GetSound(), + AudioParams.Default.WithVolume(-5)); + } + Owner.SpawnTimer(OpenTimeOne, async () => { OnPartialOpen(); await Timer.Delay(OpenTimeTwo, _stateChangeCancelTokenSource.Token); State = DoorState.Open; + RefreshAutoClose(); }, _stateChangeCancelTokenSource.Token); } @@ -320,7 +356,7 @@ namespace Content.Server.Doors.Components Owner.EntityManager.EventBus.RaiseEvent(EventSource.Local, new AccessReaderChangeMessage(Owner, false)); } - private void QuickOpen() + private void QuickOpen(bool refresh) { if (Occludes && Owner.TryGetComponent(out OccluderComponent? occluder)) { @@ -328,6 +364,8 @@ namespace Content.Server.Doors.Components } OnPartialOpen(); State = DoorState.Open; + if(refresh) + RefreshAutoClose(); } #endregion @@ -366,17 +404,19 @@ namespace Content.Server.Doors.Components /// Boolean describing whether this door can close. public bool CanCloseGeneric() { - if (_doorCheck != null && !_doorCheck.CloseCheck()) - { + var ev = new BeforeDoorClosedEvent(); + Owner.EntityManager.EventBus.RaiseLocalEvent(Owner.Uid, ev, false); + if (ev.Cancelled) return false; - } return !IsSafetyColliding(); } private bool SafetyCheck() { - return (_doorCheck != null && _doorCheck.SafetyCheck()) || _inhibitCrush; + var ev = new DoorSafetyEnabledEvent(); + Owner.EntityManager.EventBus.RaiseLocalEvent(Owner.Uid, ev, false); + return ev.Safety || _inhibitCrush; } /// @@ -412,6 +452,13 @@ namespace Content.Server.Doors.Components _stateChangeCancelTokenSource?.Cancel(); _stateChangeCancelTokenSource = new(); + + if (CloseSound != null) + { + SoundSystem.Play(Filter.Pvs(Owner), CloseSound.GetSound(), + AudioParams.Default.WithVolume(-10)); + } + Owner.SpawnTimer(CloseTimeOne, async () => { // if somebody walked into the door as it was closing, and we don't crush things @@ -504,10 +551,10 @@ namespace Content.Server.Doors.Components public void Deny() { - if (_doorCheck != null && !_doorCheck.DenyCheck()) - { + var ev = new BeforeDoorDeniedEvent(); + Owner.EntityManager.EventBus.RaiseLocalEvent(Owner.Uid, ev, false); + if (ev.Cancelled) return; - } if (State == DoorState.Open || IsWeldedShut) return; @@ -515,6 +562,25 @@ namespace Content.Server.Doors.Components _stateChangeCancelTokenSource?.Cancel(); _stateChangeCancelTokenSource = new(); SetAppearance(DoorVisualState.Deny); + + if (DenySound != null) + { + if (LastDenySoundTime == TimeSpan.Zero) + { + LastDenySoundTime = _gameTiming.CurTime; + } + else + { + var difference = _gameTiming.CurTime - LastDenySoundTime; + if (difference < TimeSpan.FromMilliseconds(DenySoundMinimumInterval)) + return; + } + + LastDenySoundTime = _gameTiming.CurTime; + SoundSystem.Play(Filter.Pvs(Owner), DenySound.GetSound(), + AudioParams.Default.WithVolume(-3)); + } + Owner.SpawnTimer(DenyTime, () => { SetAppearance(DoorVisualState.Closed); @@ -522,19 +588,24 @@ namespace Content.Server.Doors.Components } /// - /// Stops the current auto-close timer if there is one. Starts a new one if this is appropriate (i.e. entity has an IDoorCheck component that allows auto-closing). + /// Starts a new auto close timer if this is appropriate + /// (i.e. event raised is not cancelled). /// public void RefreshAutoClose() { - _autoCloseCancelTokenSource?.Cancel(); - - if (State != DoorState.Open || _doorCheck == null || !_doorCheck.AutoCloseCheck()) - { + if (State != DoorState.Open) return; - } + + var autoev = new BeforeDoorAutoCloseEvent(); + Owner.EntityManager.EventBus.RaiseLocalEvent(Owner.Uid, autoev, false); + if (autoev.Cancelled) + return; + _autoCloseCancelTokenSource = new(); - var realCloseTime = _doorCheck.GetCloseSpeed() ?? AutoCloseDelay; + var ev = new DoorGetCloseTimeModifierEvent(); + Owner.EntityManager.EventBus.RaiseLocalEvent(Owner.Uid, ev, false); + var realCloseTime = AutoCloseDelay * ev.CloseTimeModifier; Owner.SpawnRepeatingTimer(realCloseTime, async () => { @@ -556,21 +627,18 @@ namespace Content.Server.Doors.Components // for prying doors if (tool.HasQuality(ToolQuality.Prying) && !IsWeldedShut) { - var successfulPry = false; + var ev = new DoorGetPryTimeModifierEvent(); + Owner.EntityManager.EventBus.RaiseLocalEvent(Owner.Uid, ev, false); - if (_doorCheck != null) - { - _doorCheck.OnStartPry(eventArgs); - successfulPry = await tool.UseTool(eventArgs.User, Owner, - _doorCheck.GetPryTime() ?? 0.5f, ToolQuality.Prying, () => _doorCheck.CanPryCheck(eventArgs)); - } - else - { - successfulPry = await tool.UseTool(eventArgs.User, Owner, 0.5f, ToolQuality.Prying); - } + var canEv = new BeforeDoorPryEvent(eventArgs); + Owner.EntityManager.EventBus.RaiseLocalEvent(Owner.Uid, canEv, false); + + var successfulPry = await tool.UseTool(eventArgs.User, Owner, + ev.PryTimeModifier * PryTime, ToolQuality.Prying, () => !canEv.Cancelled); if (successfulPry && !IsWeldedShut) { + Owner.EntityManager.EventBus.RaiseLocalEvent(Owner.Uid, new OnDoorPryEvent(eventArgs), false); if (State == DoorState.Closed) { Open(); diff --git a/Content.Server/Doors/DoorEvents.cs b/Content.Server/Doors/DoorEvents.cs new file mode 100644 index 0000000000..73a0986664 --- /dev/null +++ b/Content.Server/Doors/DoorEvents.cs @@ -0,0 +1,141 @@ +#nullable enable +using System; +using Content.Shared.Doors; +using Content.Shared.Interaction; +using Robust.Shared.GameObjects; + +namespace Content.Server.Doors +{ + /// + /// Raised when the door's State variable is changed to a new variable that it was not equal to before. + /// + public class DoorStateChangedEvent : EntityEventArgs + { + public SharedDoorComponent.DoorState State; + + public DoorStateChangedEvent(SharedDoorComponent.DoorState state) + { + State = state; + } + } + + /// + /// Raised when the door is determining whether it is able to open. + /// Cancel to stop the door from being opened. + /// + public class BeforeDoorOpenedEvent : CancellableEntityEventArgs + { + } + + /// + /// Raised when the door is successfully opened. + /// + public class OnDoorOpenedEvent : HandledEntityEventArgs + { + } + + /// + /// Raised when the door is determining whether it is able to close. + /// Cancel to stop the door from being closed. + /// + public class BeforeDoorClosedEvent : CancellableEntityEventArgs + { + } + + /// + /// Raised when the door is successfully closed. + /// + public class OnDoorClosedEvent : HandledEntityEventArgs + { + } + + /// + /// Called when the door is determining whether it is able to deny. + /// Cancel to stop the door from being able to deny. + /// + public class BeforeDoorDeniedEvent : CancellableEntityEventArgs + { + } + + /// + /// Raised when access to the door is denied. + /// + public class OnDoorDeniedEvent : HandledEntityEventArgs + { + } + + /// + /// Raised to determine whether the door's safety is on. + /// Modify Safety to set the door's safety. + /// + public class DoorSafetyEnabledEvent : HandledEntityEventArgs + { + public bool Safety = false; + } + + /// + /// Raised to determine whether the door should automatically close. + /// Cancel to stop it from automatically closing. + /// + public class BeforeDoorAutoCloseEvent : CancellableEntityEventArgs + { + } + + /// + /// Raised to determine how long the door's pry time should be modified by. + /// Multiply PryTimeModifier by the desired amount. + /// + public class DoorGetPryTimeModifierEvent : EntityEventArgs + { + public float PryTimeModifier = 1.0f; + } + + /// + /// Raised to determine how long the door's close time should be modified by. + /// Multiply CloseTimeModifier by the desired amount. + /// + public class DoorGetCloseTimeModifierEvent : EntityEventArgs + { + public float CloseTimeModifier = 1.0f; + } + + /// + /// Raised to determine whether clicking the door should open/close it. + /// + public class DoorClickShouldActivateEvent : HandledEntityEventArgs + { + public ActivateEventArgs Args; + + public DoorClickShouldActivateEvent(ActivateEventArgs args) + { + Args = args; + } + } + + /// + /// Raised when an attempt to pry open the door is made. + /// Cancel to stop the door from being pried open. + /// + public class BeforeDoorPryEvent : CancellableEntityEventArgs + { + public InteractUsingEventArgs Args; + + public BeforeDoorPryEvent(InteractUsingEventArgs args) + { + Args = args; + } + } + + /// + /// Raised when a door is successfully pried open. + /// + public class OnDoorPryEvent : EntityEventArgs + { + public InteractUsingEventArgs Args; + + public OnDoorPryEvent(InteractUsingEventArgs args) + { + Args = args; + } + } +} diff --git a/Content.Server/Doors/IDoorCheck.cs b/Content.Server/Doors/IDoorCheck.cs deleted file mode 100644 index 3c5989a5d8..0000000000 --- a/Content.Server/Doors/IDoorCheck.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using Content.Shared.Doors; -using Content.Shared.Interaction; - -namespace Content.Server.Doors -{ - public interface IDoorCheck - { - /// - /// Called when the door's State variable is changed to a new variable that it was not equal to before. - /// - void OnStateChange(SharedDoorComponent.DoorState doorState) { } - - /// - /// Called when the door is determining whether it is able to open. - /// - /// True if the door should open, false if it should not. - bool OpenCheck() => true; - - /// - /// Called when the door is determining whether it is able to close. - /// - /// True if the door should close, false if it should not. - bool CloseCheck() => true; - - /// - /// Called when the door is determining whether it is able to deny. - /// - /// True if the door should deny, false if it should not. - bool DenyCheck() => true; - - /// - /// Whether the door's safety is on. - /// - /// True if safety is on, false if it is not. - bool SafetyCheck() => false; - - /// - /// Whether the door should close automatically. - /// - /// True if the door should close automatically, false if it should not. - bool AutoCloseCheck() => false; - - /// - /// Gets an override for the amount of time to pry open the door, or null if there is no override. - /// - /// Float if there is an override, null otherwise. - float? GetPryTime() => null; - - /// - /// Gets an override for the amount of time before the door automatically closes, or null if there is no override. - /// - /// TimeSpan if there is an override, null otherwise. - TimeSpan? GetCloseSpeed() => null; - - /// - /// A check to determine whether or not a click on the door should interact with it with the intent to open/close. - /// - /// True if the door's IActivate should not run, false otherwise. - bool BlockActivate(ActivateEventArgs eventArgs) => false; - - /// - /// Called when somebody begins to pry open the door. - /// - /// The eventArgs of the InteractUsing method that called this function. - void OnStartPry(InteractUsingEventArgs eventArgs) { } - - /// - /// Check representing whether or not the door can be pried open. - /// - /// The eventArgs of the InteractUsing method that called this function. - /// True if the door can be pried open, false if it cannot. - bool CanPryCheck(InteractUsingEventArgs eventArgs) => true; - - } -} diff --git a/Content.Server/Doors/Systems/AirlockSystem.cs b/Content.Server/Doors/Systems/AirlockSystem.cs new file mode 100644 index 0000000000..73d6508272 --- /dev/null +++ b/Content.Server/Doors/Systems/AirlockSystem.cs @@ -0,0 +1,109 @@ +using Content.Server.Doors.Components; +using Content.Server.Power.Components; +using Content.Shared.Doors; +using Content.Shared.Notification.Managers; +using Robust.Server.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.Localization; + +namespace Content.Server.Doors.Systems +{ + public class AirlockSystem : EntitySystem + { + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnPowerChanged); + SubscribeLocalEvent(OnStateChanged); + SubscribeLocalEvent(OnBeforeDoorOpened); + SubscribeLocalEvent(OnBeforeDoorClosed); + SubscribeLocalEvent(OnBeforeDoorDenied); + SubscribeLocalEvent(OnDoorSafetyCheck); + SubscribeLocalEvent(OnDoorAutoCloseCheck); + SubscribeLocalEvent(OnDoorCloseTimeModifier); + SubscribeLocalEvent(OnDoorClickShouldActivate); + SubscribeLocalEvent(OnDoorPry); + } + + private void OnPowerChanged(EntityUid uid, AirlockComponent component, PowerChangedEvent args) + { + if (component.AppearanceComponent != null) + { + component.AppearanceComponent.SetData(DoorVisuals.Powered, args.Powered); + } + + // BoltLights also got out + component.UpdateBoltLightStatus(); + } + + private void OnStateChanged(EntityUid uid, AirlockComponent component, DoorStateChangedEvent args) + { + // Only show the maintenance panel if the airlock is closed + if (component.WiresComponent != null) + { + component.WiresComponent.IsPanelVisible = args.State != SharedDoorComponent.DoorState.Open; + } + // If the door is closed, we should look if the bolt was locked while closing + component.UpdateBoltLightStatus(); + } + + private void OnBeforeDoorOpened(EntityUid uid, AirlockComponent component, BeforeDoorOpenedEvent args) + { + if (!component.CanChangeState()) + args.Cancel(); + } + + private void OnBeforeDoorClosed(EntityUid uid, AirlockComponent component, BeforeDoorClosedEvent args) + { + if (!component.CanChangeState()) + args.Cancel(); + } + + private void OnBeforeDoorDenied(EntityUid uid, AirlockComponent component, BeforeDoorDeniedEvent args) + { + if (!component.CanChangeState()) + args.Cancel(); + } + + private void OnDoorSafetyCheck(EntityUid uid, AirlockComponent component, DoorSafetyEnabledEvent args) + { + args.Safety = component.Safety; + } + + private void OnDoorAutoCloseCheck(EntityUid uid, AirlockComponent component, BeforeDoorAutoCloseEvent args) + { + if (!component.AutoClose) + args.Cancel(); + } + + private void OnDoorCloseTimeModifier(EntityUid uid, AirlockComponent component, DoorGetCloseTimeModifierEvent args) + { + args.CloseTimeModifier *= component.AutoCloseDelayModifier; + } + + private void OnDoorClickShouldActivate(EntityUid uid, AirlockComponent component, DoorClickShouldActivateEvent args) + { + if (component.WiresComponent != null && component.WiresComponent.IsPanelOpen && + args.Args.User.TryGetComponent(out ActorComponent? actor)) + { + component.WiresComponent.OpenInterface(actor.PlayerSession); + args.Handled = true; + } + } + + private void OnDoorPry(EntityUid uid, AirlockComponent component, BeforeDoorPryEvent args) + { + if (component.IsBolted()) + { + component.Owner.PopupMessage(args.Args.User, Loc.GetString("airlock-component-cannot-pry-is-bolted-message")); + args.Cancel(); + } + if (component.IsPowered()) + { + component.Owner.PopupMessage(args.Args.User, Loc.GetString("airlock-component-cannot-pry-is-powered-message")); + args.Cancel(); + } + } + } +} diff --git a/Content.Server/Doors/DoorSystem.cs b/Content.Server/Doors/Systems/DoorSystem.cs similarity index 100% rename from Content.Server/Doors/DoorSystem.cs rename to Content.Server/Doors/Systems/DoorSystem.cs diff --git a/Content.Server/Doors/Systems/FirelockSystem.cs b/Content.Server/Doors/Systems/FirelockSystem.cs new file mode 100644 index 0000000000..49ab584471 --- /dev/null +++ b/Content.Server/Doors/Systems/FirelockSystem.cs @@ -0,0 +1,69 @@ +using Content.Server.Doors.Components; +using Content.Shared.Doors; +using Content.Shared.Notification.Managers; +using Robust.Shared.GameObjects; +using Robust.Shared.Localization; + +namespace Content.Server.Doors.Systems +{ + public class FirelockSystem : EntitySystem + { + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnBeforeDoorOpened); + SubscribeLocalEvent(OnBeforeDoorDenied); + SubscribeLocalEvent(OnDoorGetPryTimeModifier); + SubscribeLocalEvent(OnDoorClickShouldActivate); + SubscribeLocalEvent(OnBeforeDoorPry); + SubscribeLocalEvent(OnBeforeDoorAutoclose); + } + + private void OnBeforeDoorOpened(EntityUid uid, FirelockComponent component, BeforeDoorOpenedEvent args) + { + if (component.IsHoldingFire() || component.IsHoldingPressure()) + args.Cancel(); + } + + private void OnBeforeDoorDenied(EntityUid uid, FirelockComponent component, BeforeDoorDeniedEvent args) + { + args.Cancel(); + } + + private void OnDoorGetPryTimeModifier(EntityUid uid, FirelockComponent component, DoorGetPryTimeModifierEvent args) + { + if (component.IsHoldingFire() || component.IsHoldingPressure()) + args.PryTimeModifier *= component.LockedPryTimeModifier; + } + + private void OnDoorClickShouldActivate(EntityUid uid, FirelockComponent component, DoorClickShouldActivateEvent args) + { + // We're a firelock, you can't click to open it + args.Handled = true; + } + + private void OnBeforeDoorPry(EntityUid uid, FirelockComponent component, BeforeDoorPryEvent args) + { + if (component.DoorComponent == null || component.DoorComponent.State != SharedDoorComponent.DoorState.Closed) + { + return; + } + + if (component.IsHoldingPressure()) + { + component.Owner.PopupMessage(args.Args.User, Loc.GetString("firelock-component-is-holding-pressure-message")); + } + else if (component.IsHoldingFire()) + { + component.Owner.PopupMessage(args.Args.User, Loc.GetString("firelock-component-is-holding-fire-message")); + } + } + + private void OnBeforeDoorAutoclose(EntityUid uid, FirelockComponent component, BeforeDoorAutoCloseEvent args) + { + // Firelocks can't autoclose, they must be manually closed + args.Cancel(); + } + } +} diff --git a/Content.Shared/Doors/SharedDoorComponent.cs b/Content.Shared/Doors/SharedDoorComponent.cs index db6902c5c6..e85da53ff9 100644 --- a/Content.Shared/Doors/SharedDoorComponent.cs +++ b/Content.Shared/Doors/SharedDoorComponent.cs @@ -22,6 +22,9 @@ namespace Content.Shared.Doors [ComponentDependency] protected readonly IPhysBody? PhysicsComponent = null; + [Dependency] + protected readonly IGameTiming _gameTiming = default!; + [ViewVariables] private DoorState _state = DoorState.Closed; /// diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base.yml index 7b88ff7002..c570660647 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base.yml @@ -38,13 +38,16 @@ - SmallImpassable - type: Door board: DoorElectronics + openSound: + path: /Audio/Machines/airlock_open.ogg + closeSound: + path: /Audio/Machines/airlock_close.ogg + denySound: + path: /Audio/Machines/airlock_deny.ogg - type: Airlock - type: Appearance visuals: - type: AirlockVisualizer - open_sound: /Audio/Machines/airlock_open.ogg - close_sound: /Audio/Machines/airlock_close.ogg - deny_sound: /Audio/Machines/airlock_deny.ogg - type: WiresVisualizer - type: ApcPowerReceiver - type: Wires diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/external.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/external.yml index b33fa434c7..931987b355 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/external.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/external.yml @@ -6,12 +6,15 @@ components: - type: Door bumpOpen: false + openSound: + path: /Audio/Machines/airlock_ext_open.ogg + closeSound: + path: /Audio/Machines/airlock_ext_close.ogg + denySound: + path: /Audio/Machines/airlock_deny.ogg - type: Sprite sprite: Structures/Doors/Airlocks/Standard/external.rsi - type: Appearance visuals: - type: AirlockVisualizer - open_sound: /Audio/Machines/airlock_ext_open.ogg - close_sound: /Audio/Machines/airlock_ext_close.ogg - deny_sound: /Audio/Machines/airlock_deny.ogg - type: WiresVisualizer diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index 40fad456b0..74cc60c768 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -54,13 +54,16 @@ startOpen: true bumpOpen: false inhibitCrush: false + openSound: + path: /Audio/Machines/airlock_open.ogg + closeSound: + path: /Audio/Machines/airlock_close.ogg + denySound: + path: /Audio/Machines/airlock_deny.ogg - type: Firelock - type: Appearance visuals: - type: AirlockVisualizer - open_sound: /Audio/Machines/airlock_open.ogg - close_sound: /Audio/Machines/airlock_close.ogg - deny_sound: /Audio/Machines/airlock_deny.ogg animation_time: 0.6 - type: WiresVisualizer - type: Wires From e42acf2401574a0994e834aeee0058c70713a4e1 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 2 Aug 2021 07:58:08 -0400 Subject: [PATCH 22/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b9fed37da4..fdcf11f2a8 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1637,3 +1637,8 @@ Entries: - {message: Made plasma Grindable, type: Tweak} id: 291 time: '2021-08-01T19:05:02.0000000+00:00' +- author: mirrorcult + changes: + - {message: Door sounds no longer play twice sometimes., type: Fix} + id: 292 + time: '2021-08-02T11:57:06.0000000+00:00' From 009087863f4a418e032178d96981460d95906e41 Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto <6766154+Zumorica@users.noreply.github.com> Date: Mon, 2 Aug 2021 13:59:41 +0200 Subject: [PATCH 23/83] AtmosDevices can optionally process in space. (#4405) Refactors some misc atmos things, too. --- .../Atmos/Commands/AddAtmosCommand.cs | 2 +- .../Commands/AddUnsimulatedAtmosCommand.cs | 2 +- .../Components/GridAtmosphereComponent.cs | 4 +- ...reComponent.cs => IAtmosphereComponent.cs} | 2 +- .../Components/SpaceAtmosphereComponent.cs | 13 ++++ .../SpaceGridAtmosphereComponent.cs | 16 ---- .../UnsimulatedGridAtmosphereComponent.cs | 5 +- .../EntitySystems/AtmosphereSystem.Grid.cs | 16 +++- .../AtmosphereSystem.Processing.cs | 6 +- .../Atmos/EntitySystems/AtmosphereSystem.cs | 13 ---- .../Piping/Components/AtmosDeviceComponent.cs | 15 +++- .../Piping/EntitySystems/AtmosDeviceSystem.cs | 56 ++++++++++++-- .../Structures/Storage/Canisters/base.yml | 72 ------------------ .../Storage/Canisters/gas_canisters.yml | 74 +++++++++++++++++++ 14 files changed, 176 insertions(+), 120 deletions(-) rename Content.Server/Atmos/Components/{IGridAtmosphereComponent.cs => IAtmosphereComponent.cs} (79%) create mode 100644 Content.Server/Atmos/Components/SpaceAtmosphereComponent.cs delete mode 100644 Content.Server/Atmos/Components/SpaceGridAtmosphereComponent.cs delete mode 100644 Resources/Prototypes/Entities/Structures/Storage/Canisters/base.yml diff --git a/Content.Server/Atmos/Commands/AddAtmosCommand.cs b/Content.Server/Atmos/Commands/AddAtmosCommand.cs index 4759998b1a..69c85997f5 100644 --- a/Content.Server/Atmos/Commands/AddAtmosCommand.cs +++ b/Content.Server/Atmos/Commands/AddAtmosCommand.cs @@ -47,7 +47,7 @@ namespace Content.Server.Atmos.Commands return; } - if (grid.HasComponent()) + if (grid.HasComponent()) { shell.WriteLine("Grid already has an atmosphere."); return; diff --git a/Content.Server/Atmos/Commands/AddUnsimulatedAtmosCommand.cs b/Content.Server/Atmos/Commands/AddUnsimulatedAtmosCommand.cs index 67541a5361..5fb659cc59 100644 --- a/Content.Server/Atmos/Commands/AddUnsimulatedAtmosCommand.cs +++ b/Content.Server/Atmos/Commands/AddUnsimulatedAtmosCommand.cs @@ -47,7 +47,7 @@ namespace Content.Server.Atmos.Commands return; } - if (grid.HasComponent()) + if (grid.HasComponent()) { shell.WriteLine("Grid already has an atmosphere."); return; diff --git a/Content.Server/Atmos/Components/GridAtmosphereComponent.cs b/Content.Server/Atmos/Components/GridAtmosphereComponent.cs index 53670f8d05..fedac5c2dd 100644 --- a/Content.Server/Atmos/Components/GridAtmosphereComponent.cs +++ b/Content.Server/Atmos/Components/GridAtmosphereComponent.cs @@ -16,9 +16,9 @@ namespace Content.Server.Atmos.Components /// /// This is our SSAir equivalent. /// - [ComponentReference(typeof(IGridAtmosphereComponent))] + [ComponentReference(typeof(IAtmosphereComponent))] [RegisterComponent, Serializable] - public class GridAtmosphereComponent : Component, IGridAtmosphereComponent, ISerializationHooks + public class GridAtmosphereComponent : Component, IAtmosphereComponent, ISerializationHooks { public override string Name => "GridAtmosphere"; public virtual bool Simulated => true; diff --git a/Content.Server/Atmos/Components/IGridAtmosphereComponent.cs b/Content.Server/Atmos/Components/IAtmosphereComponent.cs similarity index 79% rename from Content.Server/Atmos/Components/IGridAtmosphereComponent.cs rename to Content.Server/Atmos/Components/IAtmosphereComponent.cs index 11b953b2fa..8e9bfb8abb 100644 --- a/Content.Server/Atmos/Components/IGridAtmosphereComponent.cs +++ b/Content.Server/Atmos/Components/IAtmosphereComponent.cs @@ -2,7 +2,7 @@ namespace Content.Server.Atmos.Components { - public interface IGridAtmosphereComponent : IComponent + public interface IAtmosphereComponent : IComponent { /// /// Whether this atmosphere is simulated or not. diff --git a/Content.Server/Atmos/Components/SpaceAtmosphereComponent.cs b/Content.Server/Atmos/Components/SpaceAtmosphereComponent.cs new file mode 100644 index 0000000000..3d42d24762 --- /dev/null +++ b/Content.Server/Atmos/Components/SpaceAtmosphereComponent.cs @@ -0,0 +1,13 @@ +using Robust.Shared.GameObjects; + +namespace Content.Server.Atmos.Components +{ + [RegisterComponent] + [ComponentReference(typeof(IAtmosphereComponent))] + public class SpaceAtmosphereComponent : Component, IAtmosphereComponent + { + public override string Name => "SpaceAtmosphere"; + + public bool Simulated => false; + } +} diff --git a/Content.Server/Atmos/Components/SpaceGridAtmosphereComponent.cs b/Content.Server/Atmos/Components/SpaceGridAtmosphereComponent.cs deleted file mode 100644 index 6fa75f774d..0000000000 --- a/Content.Server/Atmos/Components/SpaceGridAtmosphereComponent.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Content.Shared.Atmos; -using Robust.Shared.GameObjects; -using Robust.Shared.Map; -using Robust.Shared.Maths; - -namespace Content.Server.Atmos.Components -{ - [RegisterComponent] - [ComponentReference(typeof(IGridAtmosphereComponent))] - public class SpaceGridAtmosphereComponent : UnsimulatedGridAtmosphereComponent - { - public override string Name => "SpaceGridAtmosphere"; - } -} diff --git a/Content.Server/Atmos/Components/UnsimulatedGridAtmosphereComponent.cs b/Content.Server/Atmos/Components/UnsimulatedGridAtmosphereComponent.cs index 806164e6c1..a01d98c1da 100644 --- a/Content.Server/Atmos/Components/UnsimulatedGridAtmosphereComponent.cs +++ b/Content.Server/Atmos/Components/UnsimulatedGridAtmosphereComponent.cs @@ -8,10 +8,9 @@ using Robust.Shared.Maths; namespace Content.Server.Atmos.Components { [RegisterComponent] - [ComponentReference(typeof(IGridAtmosphereComponent))] - [ComponentReference(typeof(GridAtmosphereComponent))] + [ComponentReference(typeof(IAtmosphereComponent))] [Serializable] - public class UnsimulatedGridAtmosphereComponent : GridAtmosphereComponent, IGridAtmosphereComponent + public class UnsimulatedGridAtmosphereComponent : GridAtmosphereComponent { public override string Name => "UnsimulatedGridAtmosphere"; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Grid.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Grid.cs index 661b5b169f..9f09ce4e41 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Grid.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Grid.cs @@ -117,6 +117,10 @@ namespace Content.Server.Atmos.EntitySystems /// All tile mixtures in a grid. public IEnumerable GetAllTileMixtures(GridId grid, bool invalidate = false) { + // Return an array with a single space gas mixture for invalid grids. + if (!grid.IsValid()) + return new []{ GasMixture.SpaceGas }; + if (!_mapManager.TryGetGrid(grid, out var mapGrid)) return Enumerable.Empty(); @@ -678,6 +682,10 @@ namespace Content.Server.Atmos.EntitySystems /// The tile mixture, or null public GasMixture? GetTileMixture(GridId grid, Vector2i tile, bool invalidate = false) { + // Always return space gas mixtures for invalid grids (grid 0) + if (!grid.IsValid()) + return GasMixture.SpaceGas; + if (!_mapManager.TryGetGrid(grid, out var mapGrid)) return null; @@ -686,7 +694,7 @@ namespace Content.Server.Atmos.EntitySystems return GetTileMixture(gridAtmosphere, tile, invalidate); } - if (ComponentManager.TryGetComponent(mapGrid.GridEntityId, out SpaceGridAtmosphereComponent? spaceAtmosphere)) + if (ComponentManager.TryGetComponent(mapGrid.GridEntityId, out SpaceAtmosphereComponent? _)) { // Always return a new space gas mixture in this case. return GasMixture.SpaceGas; @@ -967,6 +975,10 @@ namespace Content.Server.Atmos.EntitySystems /// All adjacent tile gas mixtures to the tile in question public IEnumerable GetAdjacentTileMixtures(GridId grid, Vector2i tile, bool includeBlocked = false, bool invalidate = false) { + // For invalid grids, return an array with a single space gas mixture in it. + if (!grid.IsValid()) + return new []{ GasMixture.SpaceGas }; + if (!_mapManager.TryGetGrid(grid, out var mapGrid)) return Enumerable.Empty(); @@ -1374,7 +1386,7 @@ namespace Content.Server.Atmos.EntitySystems return false; if (ComponentManager.TryGetComponent(mapGrid.GridEntityId, out GridAtmosphereComponent? gridAtmosphere) - && gridAtmosphere.AtmosDevices.Contains(atmosDevice)) + && gridAtmosphere.AtmosDevices.Contains(atmosDevice)) { atmosDevice.JoinedGrid = null; gridAtmosphere.AtmosDevices.Remove(atmosDevice); diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs index db87ed7c10..e02f81e0ca 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs @@ -14,6 +14,7 @@ namespace Content.Server.Atmos.EntitySystems { [Dependency] private readonly IGameTiming _gameTiming = default!; + private readonly AtmosDeviceUpdateEvent _updateEvent = new(); private readonly Stopwatch _simulationStopwatch = new(); /// @@ -204,11 +205,10 @@ namespace Content.Server.Atmos.EntitySystems atmosphere.CurrentRunAtmosDevices = new Queue(atmosphere.AtmosDevices); var time = _gameTiming.CurTime; - var updateEvent = new AtmosDeviceUpdateEvent(); var number = 0; while (atmosphere.CurrentRunAtmosDevices.TryDequeue(out var device)) { - EntityManager.EventBus.RaiseLocalEvent(device.Owner.Uid, updateEvent, false); + RaiseLocalEvent(device.Owner.Uid, _updateEvent, false); device.LastProcess = time; if (number++ < LagCheckIterations) continue; @@ -241,7 +241,7 @@ namespace Content.Server.Atmos.EntitySystems { var atmosphere = _currentRunAtmosphere[_currentRunAtmosphereIndex]; - if (atmosphere.Paused || atmosphere.LifeStage >= ComponentLifeStage.Stopping) + if (atmosphere.Paused || !atmosphere.Simulated || atmosphere.LifeStage >= ComponentLifeStage.Stopping) continue; atmosphere.Timer += frameTime; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs index 910ae05a51..8588417ad2 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs @@ -29,7 +29,6 @@ namespace Content.Server.Atmos.EntitySystems #region Events // Map events. - _mapManager.MapCreated += OnMapCreated; _mapManager.TileChanged += OnTileChanged; #endregion @@ -39,7 +38,6 @@ namespace Content.Server.Atmos.EntitySystems { base.Shutdown(); - _mapManager.MapCreated -= OnMapCreated; _mapManager.TileChanged -= OnTileChanged; } @@ -57,17 +55,6 @@ namespace Content.Server.Atmos.EntitySystems InvalidateTile(eventArgs.NewTile.GridIndex, eventArgs.NewTile.GridIndices); } - private void OnMapCreated(object? sender, MapEventArgs e) - { - if (e.Map == MapId.Nullspace) - return; - - var map = _mapManager.GetMapEntity(e.Map); - - if (!map.HasComponent()) - map.AddComponent(); - } - public override void Update(float frameTime) { base.Update(frameTime); diff --git a/Content.Server/Atmos/Piping/Components/AtmosDeviceComponent.cs b/Content.Server/Atmos/Piping/Components/AtmosDeviceComponent.cs index 9b535e7e01..00c36df4e0 100644 --- a/Content.Server/Atmos/Piping/Components/AtmosDeviceComponent.cs +++ b/Content.Server/Atmos/Piping/Components/AtmosDeviceComponent.cs @@ -8,7 +8,7 @@ using Robust.Shared.ViewVariables; namespace Content.Server.Atmos.Piping.Components { /// - /// Adds itself to a to be updated by. + /// Adds itself to a to be updated by. /// [RegisterComponent] public class AtmosDeviceComponent : Component @@ -22,6 +22,19 @@ namespace Content.Server.Atmos.Piping.Components [DataField("requireAnchored")] public bool RequireAnchored { get; private set; } = true; + /// + /// Whether this device will join an entity system to process when not in a grid. + /// + [ViewVariables] + [DataField("joinSystem")] + public bool JoinSystem { get; } = false; + + /// + /// Whether we have joined an entity system to process. + /// + [ViewVariables] + public bool JoinedSystem { get; set; } = false; + [ViewVariables] public TimeSpan LastProcess { get; set; } = TimeSpan.Zero; diff --git a/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs b/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs index 166a4d07b8..12d98e8ff2 100644 --- a/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs +++ b/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs @@ -1,10 +1,10 @@ using System; +using System.Collections.Generic; using Content.Server.Atmos.EntitySystems; using Content.Server.Atmos.Piping.Components; using JetBrains.Annotations; using Robust.Shared.GameObjects; using Robust.Shared.IoC; -using Robust.Shared.Physics; using Robust.Shared.Timing; namespace Content.Server.Atmos.Piping.EntitySystems @@ -12,9 +12,14 @@ namespace Content.Server.Atmos.Piping.EntitySystems [UsedImplicitly] public class AtmosDeviceSystem : EntitySystem { - [Dependency] private IGameTiming _gameTiming = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; + private readonly AtmosDeviceUpdateEvent _updateEvent = new(); + + private float _timer = 0f; + private readonly HashSet _joinedDevices = new(); + public override void Initialize() { base.Initialize(); @@ -33,11 +38,24 @@ namespace Content.Server.Atmos.Piping.EntitySystems public void JoinAtmosphere(AtmosDeviceComponent component) { if (!CanJoinAtmosphere(component)) + { return; + } - // We try to add the device to a valid atmosphere. + // We try to add the device to a valid atmosphere, and if we can't, try to add it to the entity system. if (!_atmosphereSystem.AddAtmosDevice(component)) - return; + { + if (component.JoinSystem) + { + _joinedDevices.Add(component); + component.JoinedSystem = true; + } + else + { + return; + } + } + component.LastProcess = _gameTiming.CurTime; @@ -46,8 +64,19 @@ namespace Content.Server.Atmos.Piping.EntitySystems public void LeaveAtmosphere(AtmosDeviceComponent component) { - if (!_atmosphereSystem.RemoveAtmosDevice(component)) + // Try to remove the component from an atmosphere, and if not + if (component.JoinedGrid != null && !_atmosphereSystem.RemoveAtmosDevice(component)) + { + // The grid might have been removed but not us... This usually shouldn't happen. + component.JoinedGrid = null; return; + } + + if (component.JoinedSystem) + { + _joinedDevices.Remove(component); + component.JoinedSystem = false; + } component.LastProcess = TimeSpan.Zero; RaiseLocalEvent(component.Owner.Uid, new AtmosDeviceDisabledEvent(), false); @@ -85,5 +114,22 @@ namespace Content.Server.Atmos.Piping.EntitySystems { RejoinAtmosphere(component); } + + public override void Update(float frameTime) + { + _timer += frameTime; + + if (_timer < _atmosphereSystem.AtmosTime) + return; + + _timer -= _atmosphereSystem.AtmosTime; + + var time = _gameTiming.CurTime; + foreach (var device in _joinedDevices) + { + RaiseLocalEvent(device.Owner.Uid, _updateEvent, false); + device.LastProcess = time; + } + } } } diff --git a/Resources/Prototypes/Entities/Structures/Storage/Canisters/base.yml b/Resources/Prototypes/Entities/Structures/Storage/Canisters/base.yml deleted file mode 100644 index 2be102cc95..0000000000 --- a/Resources/Prototypes/Entities/Structures/Storage/Canisters/base.yml +++ /dev/null @@ -1,72 +0,0 @@ -- type: entity - abstract: true - id: GasCanister - name: gas canister - description: A canister that can contain any type of gas. It can be attached to connector ports using a wrench. - parent: BaseStructureDynamic - components: - - type: InteractionOutline - - type: Sprite - netsync: false - sprite: Structures/Storage/canister.rsi - state: grey - - type: Appearance - visuals: - - type: GasPortableVisualizer - stateConnected: can-connector - - type: GasCanisterVisualizer - insertedTankState: can-open - pressureStates: - - can-o0 - - can-o1 - - can-o2 - - can-o3 - - type: UserInterface - interfaces: - - key: enum.GasCanisterUiKey.Key - type: GasCanisterBoundUserInterface - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 300 - behaviors: - - !type:PlaySoundBehavior - sound: /Audio/Effects/metalbreak.ogg - - !type:SpawnEntitiesBehavior - spawn: - GasCanisterBrokenBase: - min: 1 - max: 1 - - !type:DoActsBehavior - acts: [ "Destruction" ] - - type: Damageable - resistances: metallicResistances - - type: Physics - bodyType: Dynamic - fixtures: - - shape: - !type:PhysShapeAabb - bounds: "-0.25,-0.25,0.25,0.25" - mass: 25 - mask: - - MobImpassable - layer: - - Opaque - - MobImpassable - - SmallImpassable - - VaultImpassable - - type: AtmosDevice - requireAnchored: false - - type: ContainerContainer - containers: - GasCanisterTankHolder: !type:ContainerSlot {} - - type: NodeContainer - nodes: - port: - !type:PortablePipeNode - nodeGroupID: Pipe - rotationsEnabled: false - volume: 1 - - type: GasPortable - - type: GasCanister diff --git a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml index 7144edd6f1..45a3e65145 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml @@ -1,3 +1,77 @@ +- type: entity + abstract: true + id: GasCanister + name: gas canister + description: A canister that can contain any type of gas. It can be attached to connector ports using a wrench. + parent: BaseStructureDynamic + components: + - type: InteractionOutline + - type: Sprite + netsync: false + sprite: Structures/Storage/canister.rsi + state: grey + - type: Appearance + visuals: + - type: GasPortableVisualizer + stateConnected: can-connector + - type: GasCanisterVisualizer + insertedTankState: can-open + pressureStates: + - can-o0 + - can-o1 + - can-o2 + - can-o3 + - type: UserInterface + interfaces: + - key: enum.GasCanisterUiKey.Key + type: GasCanisterBoundUserInterface + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 300 + behaviors: + - !type:PlaySoundBehavior + sound: /Audio/Effects/metalbreak.ogg + - !type:SpawnEntitiesBehavior + spawn: + GasCanisterBrokenBase: + min: 1 + max: 1 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Damageable + resistances: metallicResistances + - type: Physics + bodyType: Dynamic + fixtures: + - shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.25,0.25,0.25" + mass: 25 + mask: + - MobImpassable + layer: + - Opaque + - MobImpassable + - SmallImpassable + - VaultImpassable + - type: AtmosDevice + requireAnchored: false + joinSystem: true + - type: ContainerContainer + containers: + GasCanisterTankHolder: !type:ContainerSlot {} + - type: NodeContainer + nodes: + port: + !type:PortablePipeNode + nodeGroupID: Pipe + rotationsEnabled: false + volume: 1 + - type: GasPortable + - type: GasCanister + - type: entity parent: GasCanister id: StorageCanister From 34defef80f51fa96366fa8567ac70bbec1b57524 Mon Sep 17 00:00:00 2001 From: metalgearsloth Date: Mon, 2 Aug 2021 23:50:48 +1000 Subject: [PATCH 24/83] Fix gravity generator yeeting --- .../Entities/Structures/Machines/gravity_generator.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml b/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml index bfbeb05fb5..f06d0cdae4 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml @@ -25,6 +25,9 @@ - shape: !type:PhysShapeAabb bounds: "-1.5,-1.5,1.5,1.5" + mass: 500 + mask: + - Impassable layer: - Opaque - Impassable From 611340e454fe6946aa87cd69f87aa138ec716a71 Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto Date: Mon, 2 Aug 2021 17:03:13 +0200 Subject: [PATCH 25/83] Enables nullables for atmos internals --- .../EntitySystems/AtmosphereSystem.Hotspot.cs | 3 - .../EntitySystems/AtmosphereSystem.LINDA.cs | 2 - .../AtmosphereSystem.Monstermos.cs | 68 ++++++++++--------- Content.Server/Atmos/IGasMixtureHolder.cs | 15 ---- Content.Server/Atmos/TileAtmosphere.cs | 8 ++- 5 files changed, 42 insertions(+), 54 deletions(-) diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Hotspot.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Hotspot.cs index df78bc015d..445984d021 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Hotspot.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Hotspot.cs @@ -1,11 +1,8 @@ -#nullable disable warnings -#nullable enable annotations using Content.Server.Atmos.Components; using Content.Server.Atmos.Reactions; using Content.Server.Coordinates.Helpers; using Content.Shared.Atmos; using Content.Shared.Maps; -using Robust.Shared.Map; namespace Content.Server.Atmos.EntitySystems { diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.LINDA.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.LINDA.cs index 2629bb4d33..52f4e926f4 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.LINDA.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.LINDA.cs @@ -1,5 +1,3 @@ -#nullable disable warnings -#nullable enable annotations using Content.Server.Atmos.Components; using Content.Shared.Atmos; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs index 87a4f8b2e1..6f4ed1bd48 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs @@ -1,10 +1,6 @@ -#nullable disable warnings -#nullable enable annotations using System; -using System.Buffers; using System.Collections.Generic; using Content.Server.Atmos.Components; -using Content.Server.Coordinates.Helpers; using Content.Server.Doors.Components; using Content.Shared.Atmos; using Robust.Shared.GameObjects; @@ -12,6 +8,7 @@ using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Maths; using Robust.Shared.Random; +using Robust.Shared.Utility; namespace Content.Server.Atmos.EntitySystems { @@ -21,7 +18,7 @@ namespace Content.Server.Atmos.EntitySystems private readonly TileAtmosphereComparer _monstermosComparer = new(); - private readonly TileAtmosphere[] _equalizeTiles = new TileAtmosphere[Atmospherics.MonstermosHardTileLimit]; + private readonly TileAtmosphere?[] _equalizeTiles = new TileAtmosphere[Atmospherics.MonstermosHardTileLimit]; private readonly TileAtmosphere[] _equalizeGiverTiles = new TileAtmosphere[Atmospherics.MonstermosTileLimit]; private readonly TileAtmosphere[] _equalizeTakerTiles = new TileAtmosphere[Atmospherics.MonstermosTileLimit]; private readonly TileAtmosphere[] _equalizeQueue = new TileAtmosphere[Atmospherics.MonstermosTileLimit]; @@ -29,7 +26,7 @@ namespace Content.Server.Atmos.EntitySystems private readonly TileAtmosphere[] _depressurizeSpaceTiles = new TileAtmosphere[Atmospherics.MonstermosHardTileLimit]; private readonly TileAtmosphere[] _depressurizeProgressionOrder = new TileAtmosphere[Atmospherics.MonstermosHardTileLimit * 2]; - public void EqualizePressureInZone(IMapGrid mapGrid, GridAtmosphereComponent gridAtmosphere, TileAtmosphere tile, int cycleNum) + private void EqualizePressureInZone(IMapGrid mapGrid, GridAtmosphereComponent gridAtmosphere, TileAtmosphere tile, int cycleNum) { if (tile.Air == null || (tile.MonstermosInfo.LastCycle >= cycleNum)) return; // Already done. @@ -66,11 +63,12 @@ namespace Content.Server.Atmos.EntitySystems for (var i = 0; i < tileCount; i++) { if (i > Atmospherics.MonstermosHardTileLimit) break; - var exploring = _equalizeTiles[i]; + var exploring = _equalizeTiles[i]!; if (i < Atmospherics.MonstermosTileLimit) { - var tileMoles = exploring.Air.TotalMoles; + // Tiles in the _equalizeTiles array cannot have null air. + var tileMoles = exploring.Air!.TotalMoles; exploring.MonstermosInfo.MoleDelta = tileMoles; totalMoles += tileMoles; } @@ -107,7 +105,7 @@ namespace Content.Server.Atmos.EntitySystems if (otherTile == null) continue; - _equalizeTiles[i].MonstermosInfo.LastQueueCycle = 0; + otherTile.MonstermosInfo.LastQueueCycle = 0; } tileCount = Atmospherics.MonstermosTileLimit; @@ -119,7 +117,7 @@ namespace Content.Server.Atmos.EntitySystems for (var i = 0; i < tileCount; i++) { - var otherTile = _equalizeTiles[i]; + var otherTile = _equalizeTiles[i]!; otherTile.MonstermosInfo.LastCycle = cycleNum; otherTile.MonstermosInfo.MoleDelta -= averageMoles; if (otherTile.MonstermosInfo.MoleDelta > 0) @@ -134,7 +132,7 @@ namespace Content.Server.Atmos.EntitySystems var logN = MathF.Log2(tileCount); - // Optimization - try to spread gases using an O(nlogn) algorithm that has a chance of not working first to avoid O(n^2) + // Optimization - try to spread gases using an O(n log n) algorithm that has a chance of not working first to avoid O(n^2) if (giverTilesLength > logN && takerTilesLength > logN) { // Even if it fails, it will speed up the next part. @@ -142,7 +140,7 @@ namespace Content.Server.Atmos.EntitySystems for (var i = 0; i < tileCount; i++) { - var otherTile = _equalizeTiles[i]; + var otherTile = _equalizeTiles[i]!; otherTile.MonstermosInfo.FastDone = true; if (!(otherTile.MonstermosInfo.MoleDelta > 0)) continue; var eligibleDirections = AtmosDirection.Invalid; @@ -151,7 +149,7 @@ namespace Content.Server.Atmos.EntitySystems { var direction = (AtmosDirection) (1 << j); if (!otherTile.AdjacentBits.IsFlagSet(direction)) continue; - var tile2 = otherTile.AdjacentTiles[j]; + var tile2 = otherTile.AdjacentTiles[j]!; // skip anything that isn't part of our current processing block. if (tile2.MonstermosInfo.FastDone || tile2.MonstermosInfo.LastQueueCycle != queueCycle) @@ -172,7 +170,7 @@ namespace Content.Server.Atmos.EntitySystems AdjustEqMovement(otherTile, direction, molesToMove); otherTile.MonstermosInfo.MoleDelta -= molesToMove; - otherTile.AdjacentTiles[j].MonstermosInfo.MoleDelta += molesToMove; + otherTile.AdjacentTiles[j]!.MonstermosInfo.MoleDelta += molesToMove; } } @@ -181,7 +179,7 @@ namespace Content.Server.Atmos.EntitySystems for (var i = 0; i < tileCount; i++) { - var otherTile = _equalizeTiles[i]; + var otherTile = _equalizeTiles[i]!; if (otherTile.MonstermosInfo.MoleDelta > 0) { _equalizeGiverTiles[giverTilesLength++] = otherTile; @@ -253,7 +251,7 @@ namespace Content.Server.Atmos.EntitySystems if (otherTile.MonstermosInfo.CurrentTransferAmount != 0 && otherTile.MonstermosInfo.CurrentTransferDirection != AtmosDirection.Invalid) { AdjustEqMovement(otherTile, otherTile.MonstermosInfo.CurrentTransferDirection, otherTile.MonstermosInfo.CurrentTransferAmount); - otherTile.AdjacentTiles[otherTile.MonstermosInfo.CurrentTransferDirection.ToIndex()] + otherTile.AdjacentTiles[otherTile.MonstermosInfo.CurrentTransferDirection.ToIndex()]! .MonstermosInfo.CurrentTransferAmount += otherTile.MonstermosInfo.CurrentTransferAmount; otherTile.MonstermosInfo.CurrentTransferAmount = 0; } @@ -320,7 +318,7 @@ namespace Content.Server.Atmos.EntitySystems AdjustEqMovement(otherTile, otherTile.MonstermosInfo.CurrentTransferDirection, otherTile.MonstermosInfo.CurrentTransferAmount); - otherTile.AdjacentTiles[otherTile.MonstermosInfo.CurrentTransferDirection.ToIndex()] + otherTile.AdjacentTiles[otherTile.MonstermosInfo.CurrentTransferDirection.ToIndex()]! .MonstermosInfo.CurrentTransferAmount += otherTile.MonstermosInfo.CurrentTransferAmount; otherTile.MonstermosInfo.CurrentTransferAmount = 0; } @@ -329,19 +327,19 @@ namespace Content.Server.Atmos.EntitySystems for (var i = 0; i < tileCount; i++) { - var otherTile = _equalizeTiles[i]; + var otherTile = _equalizeTiles[i]!; FinalizeEq(gridAtmosphere, otherTile); } for (var i = 0; i < tileCount; i++) { - var otherTile = _equalizeTiles[i]; + var otherTile = _equalizeTiles[i]!; for (var j = 0; j < Atmospherics.Directions; j++) { var direction = (AtmosDirection) (1 << j); if (!otherTile.AdjacentBits.IsFlagSet(direction)) continue; - var otherTile2 = otherTile.AdjacentTiles[j]; - if (otherTile2?.Air?.Compare(tile.Air) == GasMixture.GasCompareResult.NoExchange) continue; + var otherTile2 = otherTile.AdjacentTiles[j]!; + if (otherTile2.Air?.Compare(tile.Air) == GasMixture.GasCompareResult.NoExchange) continue; AddActiveTile(gridAtmosphere, otherTile2); break; } @@ -354,7 +352,7 @@ namespace Content.Server.Atmos.EntitySystems Array.Clear(_equalizeQueue, 0, Atmospherics.MonstermosTileLimit); } - public void ExplosivelyDepressurize(IMapGrid mapGrid, GridAtmosphereComponent gridAtmosphere, TileAtmosphere tile, int cycleNum) + private void ExplosivelyDepressurize(IMapGrid mapGrid, GridAtmosphereComponent gridAtmosphere, TileAtmosphere tile, int cycleNum) { // Check if explosive depressurization is enabled and if the tile is valid. if (!MonstermosDepressurization || tile.Air == null) @@ -377,7 +375,8 @@ namespace Content.Server.Atmos.EntitySystems var otherTile = _depressurizeTiles[i]; otherTile.MonstermosInfo.LastCycle = cycleNum; otherTile.MonstermosInfo.CurrentTransferDirection = AtmosDirection.Invalid; - if (otherTile.Air.Immutable) + // Tiles in the _depressurizeTiles array cannot have null air. + if (otherTile.Air!.Immutable) { _depressurizeSpaceTiles[spaceTileCount++] = otherTile; otherTile.PressureSpecificTarget = otherTile; @@ -389,7 +388,7 @@ namespace Content.Server.Atmos.EntitySystems var direction = (AtmosDirection) (1 << j); if (!otherTile.AdjacentBits.IsFlagSet(direction)) continue; var otherTile2 = otherTile.AdjacentTiles[j]; - if (otherTile2.Air == null) continue; + if (otherTile2?.Air == null) continue; if (otherTile2.MonstermosInfo.LastQueueCycle == queueCycle) continue; ConsiderFirelocks(gridAtmosphere, otherTile, otherTile2); @@ -422,8 +421,8 @@ namespace Content.Server.Atmos.EntitySystems for (var j = 0; j < Atmospherics.Directions; j++) { var direction = (AtmosDirection) (1 << j); - // TODO ATMOS This is a terrible hack that accounts for the mess that are space TileAtmospheres. - if (!otherTile.AdjacentBits.IsFlagSet(direction) && !otherTile.Air.Immutable) continue; + // Tiles in _depressurizeProgressionOrder cannot have null air. + if (!otherTile.AdjacentBits.IsFlagSet(direction) && !otherTile.Air!.Immutable) continue; var tile2 = otherTile.AdjacentTiles[j]; if (tile2?.MonstermosInfo.LastQueueCycle != queueCycle) continue; if (tile2.MonstermosInfo.LastSlowQueueCycle == queueCycleSlow) continue; @@ -510,7 +509,7 @@ namespace Content.Server.Atmos.EntitySystems InvalidateVisuals(other.GridIndex, other.GridIndices); } - public void FinalizeEq(GridAtmosphereComponent gridAtmosphere, TileAtmosphere tile) + private void FinalizeEq(GridAtmosphereComponent gridAtmosphere, TileAtmosphere tile) { Span transferDirections = stackalloc float[Atmospherics.Directions]; var hasTransferDirs = false; @@ -534,7 +533,8 @@ namespace Content.Server.Atmos.EntitySystems if (otherTile?.Air == null) continue; if (amount > 0) { - if (tile.Air.TotalMoles < amount) + // Everything that calls this method already ensures that Air will not be null. + if (tile.Air!.TotalMoles < amount) FinalizeEqNeighbors(gridAtmosphere, tile, transferDirections); otherTile.MonstermosInfo[direction.GetOpposite()] = 0; @@ -552,15 +552,19 @@ namespace Content.Server.Atmos.EntitySystems { var direction = (AtmosDirection) (1 << i); var amount = transferDirs[i]; + // Since AdjacentBits is set, AdjacentTiles[i] wouldn't be null, and neither would its air. if(amount < 0 && tile.AdjacentBits.IsFlagSet(direction)) - FinalizeEq(gridAtmosphere, tile.AdjacentTiles[i]); // A bit of recursion if needed. + FinalizeEq(gridAtmosphere, tile.AdjacentTiles[i]!); // A bit of recursion if needed. } } private void AdjustEqMovement(TileAtmosphere tile, AtmosDirection direction, float amount) { + DebugTools.Assert(tile.AdjacentBits.HasFlag(direction)); + DebugTools.Assert(tile.AdjacentTiles[direction.ToIndex()] != null); tile.MonstermosInfo[direction] += amount; - tile.AdjacentTiles[direction.ToIndex()].MonstermosInfo[direction.GetOpposite()] -= amount; + // Every call to this method already ensures that the adjacent tile won't be null. + tile.AdjacentTiles[direction.ToIndex()]!.MonstermosInfo[direction.GetOpposite()] -= amount; } private void HandleDecompressionFloorRip(IMapGrid mapGrid, TileAtmosphere tile, float sum) @@ -574,9 +578,9 @@ namespace Content.Server.Atmos.EntitySystems PryTile(mapGrid, tile.GridIndices); } - private class TileAtmosphereComparer : IComparer + private class TileAtmosphereComparer : IComparer { - public int Compare(TileAtmosphere a, TileAtmosphere b) + public int Compare(TileAtmosphere? a, TileAtmosphere? b) { if (a == null && b == null) return 0; diff --git a/Content.Server/Atmos/IGasMixtureHolder.cs b/Content.Server/Atmos/IGasMixtureHolder.cs index c8bcb60391..e7a55e8048 100644 --- a/Content.Server/Atmos/IGasMixtureHolder.cs +++ b/Content.Server/Atmos/IGasMixtureHolder.cs @@ -6,20 +6,5 @@ namespace Content.Server.Atmos public interface IGasMixtureHolder { public GasMixture Air { get; set; } - - public virtual void AssumeAir(GasMixture giver) - { - EntitySystem.Get().Merge(Air, giver); - } - - public GasMixture RemoveAir(float amount) - { - return Air.Remove(amount); - } - - public GasMixture RemoveAirVolume(float ratio) - { - return Air.RemoveRatio(ratio); - } } } diff --git a/Content.Server/Atmos/TileAtmosphere.cs b/Content.Server/Atmos/TileAtmosphere.cs index b90ced4c02..d64a9bdd35 100644 --- a/Content.Server/Atmos/TileAtmosphere.cs +++ b/Content.Server/Atmos/TileAtmosphere.cs @@ -1,5 +1,3 @@ -#nullable disable warnings -#nullable enable annotations using Content.Shared.Atmos; using Content.Shared.Maps; using Robust.Shared.Map; @@ -71,6 +69,12 @@ namespace Content.Server.Atmos [ViewVariables] public GasMixture? Air { get; set; } + GasMixture IGasMixtureHolder.Air + { + get => Air ?? new GasMixture(Atmospherics.CellVolume){ Temperature = Temperature }; + set => Air = value; + } + [ViewVariables] public float MaxFireTemperatureSustained { get; set; } From bf43141c9632a1c60f5da1e101225112f8c3cf1d Mon Sep 17 00:00:00 2001 From: ScalyChimp <72841710+scaly-chimp@users.noreply.github.com> Date: Tue, 3 Aug 2021 11:32:08 +0800 Subject: [PATCH 26/83] Meth (#4186) * adds an overdose metabolism with sensible default settings * adds the compoenents for the run fast part of meth * not sure what I changed here but I trust my past self to not fuck up for once * adds basic meth recipe * correctly names comething * I really should've checked my spelling before making this pr Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * adds suggestion from the maintaner, who managed to get to this pr suprisingly fast * Revert "adds suggestion from the maintaner, who managed to get to this pr suprisingly fast" This reverts commit 9b0f07402e35ed5890b3af805691b690671b950c. * tweak * tweak * git's gitting on my nerves * some small tweaks * don't need these anymore * makes some stuff required * changes the meth recipe to arbitary bullshit to get the yaml thingy to leave me alone goddamnit * extremely minor change * removes overdose, because however it's gonna be done, it's definitely not my way * i should really double check every key I press * hm * sigh, I should be more thorough with looking at error messages. * beenus * gay sex is gay * this one goes out to bingo * reviews * not sure why status lifetime description wasn't being commited * Update MovespeedModifierMetabolism.cs Co-authored-by: mirrorcult * adds VV to component variables * rebalances meth, and makes the completely unrealistic recipe properly work now * meth effects should go away now or something do you think I test these changes before pushing?? * ah yes, orginization * adds proper recipe and prequisite chemicals * fixes linter hopefully * Update chemicals.yml * a * starts working on prediction * thing * predmiction?? * changes thing * does it properly * uses timespan instead of timer * uses dif timers and adds a system * updates robust and tweaks a small thing * Fixes * "Fix" prediction * starts changing the timer to timespans to avoid icky on timer end * okay fixes the check thing but now meth is broken and I don't know why * fixes predicition (partially) * Delete ContentNetIDs.cs whoops * some changes advised by sloth * certified scalycode fix right here * moves resettimer to the metabolism to make it less oop stinky * moves resettimer to the metabolism to make it less oop stinky * gamin * when the is * updates mth colour to be accurate because I forgot * abc hard ok * everything should be up to date now * makes MovespeedModifierMetabolism ECS and cleans up some other stuff * does a fixy wixy * fix thing * Revert "Merge branch 'master' of https://github.com/space-wizards/space-station-14 into meth" This reverts commit 62886561098be02f9adb6352f4e858a8269d5bd5, reversing changes made to ca34fffb5b7a40f19aec7b9e4bc37bdeab914bc1. * Revert "Revert "Merge branch 'master' of https://github.com/space-wizards/space-station-14 into meth"" This reverts commit 4f550da19656abfd0be05f818fc6b7100252d5b8. * fix hopefully * updates metabolism to works with mirror's fancy new system * updates yaml + tweaks * bruh * yaml moment * :yaml moment * Revert " :yaml moment" This reverts commit 8cb51573c64db76d989de22acdbb9c50b2c6d052. * 99th commit yay, also I need to not do this * removes something that I don't need * makes system work with this and gets rid of unnesescary check * make the update only work on active components * oops * Cleanup * alphabetise this shit * Touchup * Woops stupid alloc by me * Nerf nyoom for now Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: mirrorcult Co-authored-by: metalgearsloth --- .../ReagentEffects/MovespeedModifier.cs | 69 +++++++++++++++++ .../MovespeedModifierMetabolismComponent.cs | 54 +++++++++++++ .../MetabolismMovespeedModifierSystem.cs | 77 +++++++++++++++++++ .../Prototypes/Body/Mechanisms/human.yml | 39 ++++++---- .../Catalog/ReagentDispensers/chemical.yml | 2 + Resources/Prototypes/Reagents/chemicals.yml | 27 +++++++ .../Recipes/Reactions/chemicals.yml | 28 +++++++ 7 files changed, 283 insertions(+), 13 deletions(-) create mode 100644 Content.Server/Chemistry/ReagentEffects/MovespeedModifier.cs create mode 100644 Content.Shared/Chemistry/Components/MovespeedModifierMetabolismComponent.cs create mode 100644 Content.Shared/Chemistry/MetabolismMovespeedModifierSystem.cs diff --git a/Content.Server/Chemistry/ReagentEffects/MovespeedModifier.cs b/Content.Server/Chemistry/ReagentEffects/MovespeedModifier.cs new file mode 100644 index 0000000000..9031737443 --- /dev/null +++ b/Content.Server/Chemistry/ReagentEffects/MovespeedModifier.cs @@ -0,0 +1,69 @@ +using Content.Shared.Chemistry.Reagent; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization.Manager.Attributes; +using Content.Shared.Movement.Components; +using Content.Shared.Chemistry.Components; +using Robust.Shared.Timing; +using Robust.Shared.IoC; +using System; +using Content.Shared.Chemistry.Solution; + +namespace Content.Server.Chemistry.ReagentEffects +{ + /// + /// Default metabolism for stimulants and tranqs. Attempts to find a MovementSpeedModifier on the target, + /// adding one if not there and to change the movespeed + /// + public class MovespeedModifier : ReagentEffect + { + /// + /// How much the entities' walk speed is multiplied by. + /// + [DataField("walkSpeedModifier")] + public float WalkSpeedModifier { get; set; } = 1; + + /// + /// How much the entities' run speed is multiplied by. + /// + [DataField("sprintSpeedModifier")] + public float SprintSpeedModifier { get; set; } = 1; + + /// + /// How long the modifier applies (in seconds) when metabolized. + /// + [DataField("statusLifetime")] + public float StatusLifetime = 2f; + + /// + /// Remove reagent at set rate, changes the movespeed modifiers and adds a MovespeedModifierMetabolismComponent if not already there. + /// + public override void Metabolize(IEntity solutionEntity, Solution.ReagentQuantity amount) + { + if (!solutionEntity.TryGetComponent(out MovementSpeedModifierComponent? movement)) return; + + solutionEntity.EnsureComponent(out MovespeedModifierMetabolismComponent status); + + // Only refresh movement if we need to. + var modified = !status.WalkSpeedModifier.Equals(WalkSpeedModifier) || + !status.SprintSpeedModifier.Equals(SprintSpeedModifier); + + status.WalkSpeedModifier = WalkSpeedModifier; + status.SprintSpeedModifier = SprintSpeedModifier; + + IncreaseTimer(status, StatusLifetime * amount.Quantity.Float()); + + if (modified) + movement.RefreshMovementSpeedModifiers(); + + } + public void IncreaseTimer(MovespeedModifierMetabolismComponent status, float time) + { + var gameTiming = IoCManager.Resolve(); + + var offsetTime = Math.Max(status.ModifierTimer.TotalSeconds, gameTiming.CurTime.TotalSeconds); + + status.ModifierTimer = TimeSpan.FromSeconds(offsetTime + time); + status.Dirty(); + } + } +} diff --git a/Content.Shared/Chemistry/Components/MovespeedModifierMetabolismComponent.cs b/Content.Shared/Chemistry/Components/MovespeedModifierMetabolismComponent.cs new file mode 100644 index 0000000000..afcd0f3f42 --- /dev/null +++ b/Content.Shared/Chemistry/Components/MovespeedModifierMetabolismComponent.cs @@ -0,0 +1,54 @@ +using Content.Shared.Movement.Components; +using Robust.Shared.GameObjects; +using Robust.Shared.Players; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using System; +using Robust.Shared.GameStates; +using Robust.Shared.Timing; +using Robust.Shared.IoC; + +namespace Content.Shared.Chemistry.Components +{ + //TODO: refactor movement modifier component because this is a pretty poor solution + [RegisterComponent] + [NetworkedComponent] + public sealed class MovespeedModifierMetabolismComponent : Component, IMoveSpeedModifier + { + [ViewVariables] + public override string Name => "MovespeedModifierMetabolism"; + + [ViewVariables] + public float WalkSpeedModifier { get; set; } + + [ViewVariables] + public float SprintSpeedModifier { get; set; } + + /// + /// When the current modifier is expected to end. + /// + [ViewVariables] + public TimeSpan ModifierTimer { get; set; } = TimeSpan.Zero; + + public override ComponentState GetComponentState(ICommonSession player) + { + return new MovespeedModifierMetabolismComponentState(WalkSpeedModifier, SprintSpeedModifier, ModifierTimer); + } + + [Serializable, NetSerializable] + public class MovespeedModifierMetabolismComponentState : ComponentState + { + public float WalkSpeedModifier { get; } + public float SprintSpeedModifier { get; } + public TimeSpan ModifierTimer { get; } + + public MovespeedModifierMetabolismComponentState(float walkSpeedModifier, float sprintSpeedModifier, TimeSpan modifierTimer) + { + WalkSpeedModifier = walkSpeedModifier; + SprintSpeedModifier = sprintSpeedModifier; + ModifierTimer = modifierTimer; + } + } + } +} + diff --git a/Content.Shared/Chemistry/MetabolismMovespeedModifierSystem.cs b/Content.Shared/Chemistry/MetabolismMovespeedModifierSystem.cs new file mode 100644 index 0000000000..e67f5ae7da --- /dev/null +++ b/Content.Shared/Chemistry/MetabolismMovespeedModifierSystem.cs @@ -0,0 +1,77 @@ +using Content.Shared.Chemistry.Components; +using Robust.Shared.GameObjects; +using Robust.Shared.GameStates; +using Robust.Shared.IoC; +using Robust.Shared.Timing; +using System.Collections.Generic; +using System.Linq; +using Content.Shared.Movement.Components; +using static Content.Shared.Chemistry.Components.MovespeedModifierMetabolismComponent; + +namespace Content.Shared.Chemistry +{ + public class MetabolismMovespeedModifierSystem : EntitySystem + { + [Dependency] private readonly IGameTiming _gameTiming = default!; + + private readonly List _components = new(); + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMovespeedHandleState); + SubscribeLocalEvent(AddComponent); + } + + private void OnMovespeedHandleState(EntityUid uid, MovespeedModifierMetabolismComponent component, ComponentHandleState args) + { + if (args.Current is not MovespeedModifierMetabolismComponentState cast) + return; + + if (ComponentManager.TryGetComponent(uid, out var modifier) && + (!component.WalkSpeedModifier.Equals(cast.WalkSpeedModifier) || + !component.SprintSpeedModifier.Equals(cast.SprintSpeedModifier))) + { + modifier.RefreshMovementSpeedModifiers(); + } + + component.WalkSpeedModifier = cast.WalkSpeedModifier; + component.SprintSpeedModifier = cast.SprintSpeedModifier; + component.ModifierTimer = cast.ModifierTimer; + + } + private void AddComponent(EntityUid uid, MovespeedModifierMetabolismComponent component, ComponentStartup args) + { + _components.Add(component); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var currentTime = _gameTiming.CurTime; + + for (var i = _components.Count - 1; i >= 0; i--) + { + var component = _components[i]; + + if (component.Deleted) + { + _components.RemoveAt(i); + continue; + } + + if (component.ModifierTimer > currentTime) continue; + + _components.RemoveAt(i); + ComponentManager.RemoveComponent(component.Owner.Uid); + + if (component.Owner.TryGetComponent(out MovementSpeedModifierComponent? modifier)) + { + modifier.RefreshMovementSpeedModifiers(); + } + } + } + } +} diff --git a/Resources/Prototypes/Body/Mechanisms/human.yml b/Resources/Prototypes/Body/Mechanisms/human.yml index 8de6180529..44652e4e65 100644 --- a/Resources/Prototypes/Body/Mechanisms/human.yml +++ b/Resources/Prototypes/Body/Mechanisms/human.yml @@ -121,11 +121,6 @@ # You're technically 'immune to poison' without a heart, but.. uhh, you'll have bigger problems on your hands. - type: Metabolizer metabolisms: - Dylovene: - effects: - - !type:HealthChange - damageClass: Toxin - healthChange: -1 Arithrazine: effects: - !type:HealthChange @@ -154,26 +149,39 @@ - !type:HealthChange damageClass: Airloss healthChange: -3 - Kelotane: + Dylovene: effects: - - !type:HealthChange - damageClass: Burn - healthChange: -1 - Synaptizine: + - !type:HealthChange + damageClass: Toxin + healthChange: -1 + Ephedrine: effects: - - !type:HealthChange - damageClass: Toxin - healthChange: 0.5 + - !type:MovespeedModifier + walkSpeedModifier: 1.2 + sprintSpeedModifier: 1.2 HeartbreakerToxin: effects: - !type:HealthChange damageClass: Airloss healthChange: 4 + Kelotane: + effects: + - !type:HealthChange + damageClass: Burn + healthChange: -1 Lexorin: effects: - !type:HealthChange damageClass: Airloss healthChange: 7 + Meth: + effects: + - !type:HealthChange + healthChange: 2.5 + damageClass: Toxin + - !type:MovespeedModifier + walkSpeedModifier: 1.3 + sprintSpeedModifier: 1.3 Omnizine: effects: - !type:HealthChange @@ -188,6 +196,11 @@ - !type:HealthChange healthChange: -2 damageClass: Brute + Synaptizine: + effects: + - !type:HealthChange + damageClass: Toxin + healthChange: 0.5 - type: entity id: OrganHumanStomach diff --git a/Resources/Prototypes/Catalog/ReagentDispensers/chemical.yml b/Resources/Prototypes/Catalog/ReagentDispensers/chemical.yml index 70073d0dde..a13d46df4b 100644 --- a/Resources/Prototypes/Catalog/ReagentDispensers/chemical.yml +++ b/Resources/Prototypes/Catalog/ReagentDispensers/chemical.yml @@ -9,6 +9,7 @@ - Fluorine - Glucose - Hydrogen + - Iodine - Iron - Lithium - Mercury @@ -25,3 +26,4 @@ - SulfuricAcid - Uranium - Water + diff --git a/Resources/Prototypes/Reagents/chemicals.yml b/Resources/Prototypes/Reagents/chemicals.yml index ff882e463c..fb5be33970 100644 --- a/Resources/Prototypes/Reagents/chemicals.yml +++ b/Resources/Prototypes/Reagents/chemicals.yml @@ -222,6 +222,33 @@ - !type:AdjustWater amount: 1 +- type: reagent + id: Meth + name: meth + desc: Methamphetamine, more commonly know as meth, is a potent stimulant, with dangerous side-effects if too much is consumed. + physicalDesc: translucent + color: "#FAFAFA" + boilingPoint: 212.0 #Meth vape when? + meltingPoint: 170.0 + +- type: reagent + id: Iodine + name: iodine + desc: Commonly added to table salt as a nutrient. On its own it tastes far less pleasing. + physicalDesc: Dark Brown + color: "#BC8A00" + boilingPoint: 184.3 + meltingPoint: 113.7 + +- type: reagent + id: Ephedrine + name: ephedrine + desc: Increases stun resistance and movement speed, giving you hand cramps. Overdose deals toxin damage and inhibits breathing + physicalDesc: Bone white + color: "#D2FFFA" + boilingPoint: 255.0 + meltingPoint: 36.0 + - type: reagent id: Oil name: oil diff --git a/Resources/Prototypes/Recipes/Reactions/chemicals.yml b/Resources/Prototypes/Recipes/Reactions/chemicals.yml index e719e598fe..511edf22e3 100644 --- a/Resources/Prototypes/Recipes/Reactions/chemicals.yml +++ b/Resources/Prototypes/Recipes/Reactions/chemicals.yml @@ -226,3 +226,31 @@ amount: 1 products: Fluorosurfactant: 5 + +- type: reaction + id: Meth + reactants: + Ephedrine: + amount: 1 + Carbon: + amount: 1 + Iodine: + amount: 1 + Phosphorus: + amount: 1 + products: + Meth: 4 #I kinda remember having to heat this up, and if you heated it up too much, it went boom, I can't remember the specific values tho. + +- type: reaction + id: Ephedrine + reactants: + Oil: + amount: 1 + Hydrogen: + amount: 1 + Sugar: + amount: 1 + Diethylamine: + amount: 1 + products: + Ephedrine: 4 From 3d2f05e3e478fba59b314e13c7a1d26ebd0071f6 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 2 Aug 2021 23:33:10 -0400 Subject: [PATCH 27/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fdcf11f2a8..4d825205a7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1642,3 +1642,8 @@ Entries: - {message: Door sounds no longer play twice sometimes., type: Fix} id: 292 time: '2021-08-02T11:57:06.0000000+00:00' +- author: scaly-chimp + changes: + - {message: Added everyone's favorite stimulant meth!, type: Add} + id: 293 + time: '2021-08-03T03:32:08.0000000+00:00' From af05332b36a0b05314ac57fd32b88cec7fdcc14a Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Tue, 3 Aug 2021 18:49:25 +1000 Subject: [PATCH 28/83] Random offset for DefaultGrid every round (#4411) * Random offset for DefaultGrid every round This is useful to make coders aware of entitycoordinates and mapcoordinates being different and to help spot problems early. It also puts the onus of fixing positioning bugs back onto the original coder rather than someone else if they happen to spot it. * Fix clickable test * Fix entitysystemextensions --- .../Tests/ClickableTest.cs | 22 +++++++++++++------ .../Utility/EntitySystemExtensionsTest.cs | 4 +++- .../GameTicking/GameTicker.RoundFlow.cs | 6 +++++ Content.Shared/CCVar/CCVars.cs | 6 +++++ .../Spawning/EntitySystemExtensions.cs | 2 +- 5 files changed, 31 insertions(+), 9 deletions(-) diff --git a/Content.IntegrationTests/Tests/ClickableTest.cs b/Content.IntegrationTests/Tests/ClickableTest.cs index ed29ec9d5b..7ac1f71eef 100644 --- a/Content.IntegrationTests/Tests/ClickableTest.cs +++ b/Content.IntegrationTests/Tests/ClickableTest.cs @@ -1,11 +1,14 @@ using System; using System.Threading.Tasks; using Content.Client.Clickable; +using Content.Server.GameTicking; using NUnit.Framework; using Robust.Server.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Map; +using Robust.Shared.Maths; +using Robust.Shared.Timing; namespace Content.IntegrationTests.Tests { @@ -57,12 +60,19 @@ namespace Content.IntegrationTests.Tests [TestCase("ClickTestRotatingCornerInvisibleNoRot", 0.25f, 0.25f, DirSouthEastJustShy, 1, ExpectedResult = true)] public async Task Test(string prototype, float clickPosX, float clickPosY, double angle, float scale) { + Vector2? worldPos = null; EntityUid entity = default; + var clientEntManager = _client.ResolveDependency(); + var serverEntManager = _server.ResolveDependency(); + var mapManager = _server.ResolveDependency(); + var gameTicker = _server.ResolveDependency().GetEntitySystem(); await _server.WaitPost(() => { - var entMgr = IoCManager.Resolve(); - var ent = entMgr.SpawnEntity(prototype, new MapCoordinates(0, 0, new MapId(1))); + var gridEnt = mapManager.GetGrid(gameTicker.DefaultGridId).GridEntityId; + worldPos = serverEntManager.GetEntity(gridEnt).Transform.WorldPosition; + + var ent = serverEntManager.SpawnEntity(prototype, new EntityCoordinates(gridEnt, 0f, 0f)); ent.Transform.LocalRotation = angle; ent.GetComponent().Scale = (scale, scale); entity = ent.Uid; @@ -75,17 +85,15 @@ namespace Content.IntegrationTests.Tests await _client.WaitPost(() => { - var entMgr = IoCManager.Resolve(); - var ent = entMgr.GetEntity(entity); + var ent = clientEntManager.GetEntity(entity); var clickable = ent.GetComponent(); - hit = clickable.CheckClick((clickPosX, clickPosY), out _, out _); + hit = clickable.CheckClick((clickPosX, clickPosY) + worldPos!.Value, out _, out _); }); await _server.WaitPost(() => { - var entMgr = IoCManager.Resolve(); - entMgr.DeleteEntity(entity); + serverEntManager.DeleteEntity(entity); }); return hit; diff --git a/Content.IntegrationTests/Tests/Utility/EntitySystemExtensionsTest.cs b/Content.IntegrationTests/Tests/Utility/EntitySystemExtensionsTest.cs index b33ccc3a57..b810b42e5d 100644 --- a/Content.IntegrationTests/Tests/Utility/EntitySystemExtensionsTest.cs +++ b/Content.IntegrationTests/Tests/Utility/EntitySystemExtensionsTest.cs @@ -48,6 +48,8 @@ namespace Content.IntegrationTests.Tests.Utility var mapId = new MapId(1); var grid = sMapManager.GetGrid(new GridId(1)); grid.SetTile(new Vector2i(0, 0), new Tile(1)); + var gridEnt = sEntityManager.GetEntity(grid.GridEntityId); + var gridPos = gridEnt.Transform.WorldPosition; var entityCoordinates = new EntityCoordinates(grid.GridEntityId, 0, 0); // Nothing blocking it, only entity is the grid @@ -55,7 +57,7 @@ namespace Content.IntegrationTests.Tests.Utility Assert.True(sEntityManager.TrySpawnIfUnobstructed(null, entityCoordinates, CollisionGroup.Impassable, out var entity)); Assert.NotNull(entity); - var mapCoordinates = new MapCoordinates(0, 0, mapId); + var mapCoordinates = new MapCoordinates(gridPos.X, gridPos.Y, mapId); // Nothing blocking it, only entity is the grid Assert.NotNull(sEntityManager.SpawnIfUnobstructed(null, mapCoordinates, CollisionGroup.Impassable)); diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index e47c36c58a..a7e8223bb9 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -11,6 +11,7 @@ using Robust.Server.Player; using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Log; +using Robust.Shared.Maths; using Robust.Shared.Player; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -62,6 +63,11 @@ namespace Content.Server.GameTicking throw new InvalidOperationException($"No grid found for map {map}"); } + var maxStationOffset = _configurationManager.GetCVar(CCVars.MaxStationOffset); + var x = _robustRandom.NextFloat() * maxStationOffset * 2 - maxStationOffset; + var y = _robustRandom.NextFloat() * maxStationOffset * 2 - maxStationOffset; + _entityManager.GetEntity(grid.GridEntityId).Transform.LocalPosition = new Vector2(x, y); + DefaultGridId = grid.Index; _spawnPoint = grid.ToCoordinates(); diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 3b2091492c..c4b1cd403c 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -55,6 +55,12 @@ namespace Content.Shared.CCVar public static readonly CVarDef GameMap = CVarDef.Create("game.map", "Maps/saltern.yml", CVar.SERVERONLY); + /// + /// When the default blueprint is loaded what is the maximum amount it can be offset from 0,0. + /// + public static readonly CVarDef MaxStationOffset = + CVarDef.Create("game.maxstationoffset", 1000.0f); + /// /// When enabled, guests will be assigned permanent UIDs and will have their preferences stored. /// diff --git a/Content.Shared/Spawning/EntitySystemExtensions.cs b/Content.Shared/Spawning/EntitySystemExtensions.cs index 6ec0226358..a096d0f4d9 100644 --- a/Content.Shared/Spawning/EntitySystemExtensions.cs +++ b/Content.Shared/Spawning/EntitySystemExtensions.cs @@ -32,7 +32,7 @@ namespace Content.Shared.Spawning in Box2? box = null, SharedBroadphaseSystem? collision = null) { - var boxOrDefault = box.GetValueOrDefault(Box2.UnitCentered); + var boxOrDefault = box.GetValueOrDefault(Box2.UnitCentered).Translated(coordinates.Position); collision ??= EntitySystem.Get(); foreach (var body in collision.GetCollidingEntities(coordinates.MapId, in boxOrDefault)) From ed8dab297445568b21a822a6b66c4be1e53a634c Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 3 Aug 2021 04:50:28 -0400 Subject: [PATCH 29/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4d825205a7..c3618cb6e9 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1647,3 +1647,8 @@ Entries: - {message: Added everyone's favorite stimulant meth!, type: Add} id: 293 time: '2021-08-03T03:32:08.0000000+00:00' +- author: metalgearsloth + changes: + - {message: 'Station will spawn at a random position rather than 0,0.', type: Tweak} + id: 294 + time: '2021-08-03T08:49:25.0000000+00:00' From 2205fef06a36193a990b67e2908124f831099209 Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto Date: Tue, 3 Aug 2021 14:26:34 +0200 Subject: [PATCH 30/83] Document a few atmos classes. --- Content.Server/Atmos/Components/GasTankComponent.cs | 1 - Content.Server/Atmos/Components/GridAtmosphereComponent.cs | 3 ++- Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs | 3 +++ Content.Server/Atmos/TileAtmosphere.cs | 2 ++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Content.Server/Atmos/Components/GasTankComponent.cs b/Content.Server/Atmos/Components/GasTankComponent.cs index 2d0f7105b8..c8fdcb815e 100644 --- a/Content.Server/Atmos/Components/GasTankComponent.cs +++ b/Content.Server/Atmos/Components/GasTankComponent.cs @@ -1,4 +1,3 @@ -#nullable disable warnings using System; using Content.Server.Atmos.EntitySystems; using Content.Server.Body.Respiratory; diff --git a/Content.Server/Atmos/Components/GridAtmosphereComponent.cs b/Content.Server/Atmos/Components/GridAtmosphereComponent.cs index fedac5c2dd..76840c37c2 100644 --- a/Content.Server/Atmos/Components/GridAtmosphereComponent.cs +++ b/Content.Server/Atmos/Components/GridAtmosphereComponent.cs @@ -14,13 +14,14 @@ using Dependency = Robust.Shared.IoC.DependencyAttribute; namespace Content.Server.Atmos.Components { /// - /// This is our SSAir equivalent. + /// Internal Atmos class. Use to interact with atmos instead. /// [ComponentReference(typeof(IAtmosphereComponent))] [RegisterComponent, Serializable] public class GridAtmosphereComponent : Component, IAtmosphereComponent, ISerializationHooks { public override string Name => "GridAtmosphere"; + public virtual bool Simulated => true; [ViewVariables] diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs index 8588417ad2..90d482e39a 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs @@ -8,6 +8,9 @@ using Robust.Shared.Map; namespace Content.Server.Atmos.EntitySystems { + /// + /// This is our SSAir equivalent, if you need to interact with or query atmos in any way, go through this. + /// [UsedImplicitly] public partial class AtmosphereSystem : SharedAtmosphereSystem { diff --git a/Content.Server/Atmos/TileAtmosphere.cs b/Content.Server/Atmos/TileAtmosphere.cs index d64a9bdd35..49447e012a 100644 --- a/Content.Server/Atmos/TileAtmosphere.cs +++ b/Content.Server/Atmos/TileAtmosphere.cs @@ -1,3 +1,4 @@ +using Content.Server.Atmos.EntitySystems; using Content.Shared.Atmos; using Content.Shared.Maps; using Robust.Shared.Map; @@ -8,6 +9,7 @@ namespace Content.Server.Atmos { /// /// Internal Atmos class that stores data about the atmosphere in a grid. + /// You shouldn't use this directly, use instead. /// public class TileAtmosphere : IGasMixtureHolder { From 503677992937b350169371c01971ac3dd71c534c Mon Sep 17 00:00:00 2001 From: metalgearsloth Date: Wed, 4 Aug 2021 00:11:45 +1000 Subject: [PATCH 31/83] Update submodule We do a little bit of debugging --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 2239c30924..04d94f87fc 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 2239c309240a20d00c14a400fd2aa7f424b65413 +Subproject commit 04d94f87fc7205443aa8d9ea2b6fa178d4ba825d From c453bb07c55b95d01d8c04a5fd0f45a8e0ab7aa2 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 4 Aug 2021 01:02:43 +1000 Subject: [PATCH 32/83] Make pulling feel less crap (#4414) Something something pulling refactor someday --- Content.Client/Physics/Controllers/MoverController.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Content.Client/Physics/Controllers/MoverController.cs b/Content.Client/Physics/Controllers/MoverController.cs index de4e4eb7b3..0304888e34 100644 --- a/Content.Client/Physics/Controllers/MoverController.cs +++ b/Content.Client/Physics/Controllers/MoverController.cs @@ -21,6 +21,12 @@ namespace Content.Client.Physics.Controllers body.Predict = true; // TODO: equal prediction instead of true? + foreach (var joint in body.Joints) + { + joint.BodyA.Predict = true; + joint.BodyB.Predict = true; + } + // Server-side should just be handled on its own so we'll just do this shizznit if (player.TryGetComponent(out IMobMoverComponent? mobMover)) { From d5d1818b04616bc838cf69e7c02629fa233f99bd Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 3 Aug 2021 11:03:46 -0400 Subject: [PATCH 33/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c3618cb6e9..fef67ea5f5 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1652,3 +1652,9 @@ Entries: - {message: 'Station will spawn at a random position rather than 0,0.', type: Tweak} id: 294 time: '2021-08-03T08:49:25.0000000+00:00' +- author: metalgearsloth + changes: + - {message: Fix lerping for other physics bodies., type: Fix} + - {message: Fix joint prediction., type: Fix} + id: 295 + time: '2021-08-03T15:02:44.0000000+00:00' From 28a7d5041a98a9ab7c47b64f469f1f38f533d47e Mon Sep 17 00:00:00 2001 From: metalgearsloth Date: Wed, 4 Aug 2021 01:16:42 +1000 Subject: [PATCH 34/83] Comment joint prediction --- Content.Client/Physics/Controllers/MoverController.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Content.Client/Physics/Controllers/MoverController.cs b/Content.Client/Physics/Controllers/MoverController.cs index 0304888e34..9b53311e91 100644 --- a/Content.Client/Physics/Controllers/MoverController.cs +++ b/Content.Client/Physics/Controllers/MoverController.cs @@ -19,8 +19,13 @@ namespace Content.Client.Physics.Controllers !player.TryGetComponent(out IMoverComponent? mover) || !player.TryGetComponent(out PhysicsComponent? body)) return; - body.Predict = true; // TODO: equal prediction instead of true? + // Essentially we only want to set our mob to predicted so every other entity we just interpolate + // (i.e. only see what the server has sent us). + // The exception to this is joints. + body.Predict = true; + // We set joints to predicted given these can affect how our mob moves. + // I would only recommend disabling this if you make pulling not use joints anymore (someday maybe?) foreach (var joint in body.Joints) { joint.BodyA.Predict = true; From b7d049a52c767a767eefe7c4be1ee813b364da8c Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto Date: Wed, 4 Aug 2021 09:25:30 +0200 Subject: [PATCH 35/83] Add CVar for random grid offset, disable it by default. --- Content.Server/GameTicking/GameTicker.CVars.cs | 12 ++++++++++-- Content.Server/GameTicking/GameTicker.RoundFlow.cs | 13 ++++++++----- Content.Server/GameTicking/GameTicker.Spawning.cs | 8 ++++---- Content.Server/GameTicking/GameTicker.cs | 1 - Content.Shared/CCVar/CCVars.cs | 6 ++++++ 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/Content.Server/GameTicking/GameTicker.CVars.cs b/Content.Server/GameTicking/GameTicker.CVars.cs index f8cd9faea6..a00299df4b 100644 --- a/Content.Server/GameTicking/GameTicker.CVars.cs +++ b/Content.Server/GameTicking/GameTicker.CVars.cs @@ -21,14 +21,22 @@ namespace Content.Server.GameTicking [ViewVariables] public bool DisallowLateJoin { get; private set; } = false; + [ViewVariables] + public bool StationOffset { get; private set; } = false; + + [ViewVariables] + public float MaxStationOffset { get; private set; } = 0f; + private void InitializeCVars() { _configurationManager.OnValueChanged(CCVars.GameLobbyEnabled, value => LobbyEnabled = value, true); _configurationManager.OnValueChanged(CCVars.GameDummyTicker, value => DummyTicker = value, true); _configurationManager.OnValueChanged(CCVars.GameMap, value => ChosenMap = value, true); _configurationManager.OnValueChanged(CCVars.GameLobbyDuration, value => LobbyDuration = TimeSpan.FromSeconds(value), true); - _configurationManager.OnValueChanged(CCVars.GameDisallowLateJoins, invokeImmediately:true, - onValueChanged:value => { DisallowLateJoin = value; UpdateLateJoinStatus(); UpdateJobsAvailable(); }); + _configurationManager.OnValueChanged(CCVars.GameDisallowLateJoins, + value => { DisallowLateJoin = value; UpdateLateJoinStatus(); UpdateJobsAvailable(); }, true); + _configurationManager.OnValueChanged(CCVars.StationOffset, value => StationOffset = value, true); + _configurationManager.OnValueChanged(CCVars.MaxStationOffset, value => MaxStationOffset = value, true); } } } diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index a7e8223bb9..e65c191f1c 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -63,10 +63,13 @@ namespace Content.Server.GameTicking throw new InvalidOperationException($"No grid found for map {map}"); } - var maxStationOffset = _configurationManager.GetCVar(CCVars.MaxStationOffset); - var x = _robustRandom.NextFloat() * maxStationOffset * 2 - maxStationOffset; - var y = _robustRandom.NextFloat() * maxStationOffset * 2 - maxStationOffset; - _entityManager.GetEntity(grid.GridEntityId).Transform.LocalPosition = new Vector2(x, y); + if (StationOffset) + { + // Apply a random offset to the station grid entity. + var x = _robustRandom.NextFloat() * MaxStationOffset * 2 - MaxStationOffset; + var y = _robustRandom.NextFloat() * MaxStationOffset * 2 - MaxStationOffset; + EntityManager.GetEntity(grid.GridEntityId).Transform.LocalPosition = new Vector2(x, y); + } DefaultGridId = grid.Index; _spawnPoint = grid.ToCoordinates(); @@ -286,7 +289,7 @@ namespace Content.Server.GameTicking } // Delete all entities. - foreach (var entity in _entityManager.GetEntities().ToList()) + foreach (var entity in EntityManager.GetEntities().ToList()) { // TODO: Maybe something less naive here? // FIXME: Actually, definitely. diff --git a/Content.Server/GameTicking/GameTicker.Spawning.cs b/Content.Server/GameTicking/GameTicker.Spawning.cs index 840af56302..cab3c3c1d1 100644 --- a/Content.Server/GameTicking/GameTicker.Spawning.cs +++ b/Content.Server/GameTicking/GameTicker.Spawning.cs @@ -155,7 +155,7 @@ namespace Content.Server.GameTicking private IEntity SpawnPlayerMob(Job job, HumanoidCharacterProfile? profile, bool lateJoin = true) { var coordinates = lateJoin ? GetLateJoinSpawnPoint() : GetJobSpawnPoint(job.Prototype.ID); - var entity = _entityManager.SpawnEntity(PlayerPrototypeName, coordinates); + var entity = EntityManager.SpawnEntity(PlayerPrototypeName, coordinates); if (job.StartingGear != null) { @@ -175,7 +175,7 @@ namespace Content.Server.GameTicking private IEntity SpawnObserverMob() { var coordinates = GetObserverSpawnPoint(); - return _entityManager.SpawnEntity(ObserverPrototypeName, coordinates); + return EntityManager.SpawnEntity(ObserverPrototypeName, coordinates); } #endregion @@ -189,7 +189,7 @@ namespace Content.Server.GameTicking var equipmentStr = startingGear.GetGear(slot, profile); if (equipmentStr != string.Empty) { - var equipmentEntity = _entityManager.SpawnEntity(equipmentStr, entity.Transform.Coordinates); + var equipmentEntity = EntityManager.SpawnEntity(equipmentStr, entity.Transform.Coordinates); inventory.Equip(slot, equipmentEntity.GetComponent()); } } @@ -200,7 +200,7 @@ namespace Content.Server.GameTicking var inhand = startingGear.Inhand; foreach (var (hand, prototype) in inhand) { - var inhandEntity = _entityManager.SpawnEntity(prototype, entity.Transform.Coordinates); + var inhandEntity = EntityManager.SpawnEntity(prototype, entity.Transform.Coordinates); handsComponent.TryPickupEntity(hand, inhandEntity, checkActionBlocker: false); } } diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs index 5400e0348a..9ed3eda9da 100644 --- a/Content.Server/GameTicking/GameTicker.cs +++ b/Content.Server/GameTicking/GameTicker.cs @@ -72,7 +72,6 @@ namespace Content.Server.GameTicking UpdateRoundFlow(frameTime); } - [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IMapLoader _mapLoader = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index c4b1cd403c..450cc14727 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -55,6 +55,12 @@ namespace Content.Shared.CCVar public static readonly CVarDef GameMap = CVarDef.Create("game.map", "Maps/saltern.yml", CVar.SERVERONLY); + /// + /// Whether a random position offset will be applied to the station on roundstart. + /// + public static readonly CVarDef StationOffset = + CVarDef.Create("game.station_offset", false); + /// /// When the default blueprint is loaded what is the maximum amount it can be offset from 0,0. /// From 13ceae872bd2df4a792666d4057531a77e283086 Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto Date: Wed, 4 Aug 2021 09:48:49 +0200 Subject: [PATCH 36/83] Fixes not taking pressure damage in space. Fixes #4415 --- .../Atmos/Components/AtmosExposedComponent.cs | 17 +++++++---------- .../Atmos/Components/FlammableComponent.cs | 6 +++--- .../EntitySystems/AtmosphereSystem.Grid.cs | 2 +- .../Atmos/EntitySystems/AtmosphereSystem.cs | 2 +- Resources/Changelog/Parts/funny_gas.yml | 4 ++++ 5 files changed, 16 insertions(+), 15 deletions(-) create mode 100644 Resources/Changelog/Parts/funny_gas.yml diff --git a/Content.Server/Atmos/Components/AtmosExposedComponent.cs b/Content.Server/Atmos/Components/AtmosExposedComponent.cs index e742458f10..9be43d8067 100644 --- a/Content.Server/Atmos/Components/AtmosExposedComponent.cs +++ b/Content.Server/Atmos/Components/AtmosExposedComponent.cs @@ -23,23 +23,20 @@ namespace Content.Server.Atmos.Components [ViewVariables] [ComponentDependency] private readonly FlammableComponent? _flammableComponent = null; - public void Update(TileAtmosphere tile, float frameDelta, AtmosphereSystem atmosphereSystem) + public void Update(GasMixture air, float frameDelta, AtmosphereSystem atmosphereSystem) { if (_temperatureComponent != null) { - if (tile.Air != null) - { - var temperatureDelta = tile.Air.Temperature - _temperatureComponent.CurrentTemperature; - var tileHeatCapacity = atmosphereSystem.GetHeatCapacity(tile.Air); - var heat = temperatureDelta * (tileHeatCapacity * _temperatureComponent.HeatCapacity / (tileHeatCapacity + _temperatureComponent.HeatCapacity)); - _temperatureComponent.ReceiveHeat(heat); - } + var temperatureDelta = air.Temperature - _temperatureComponent.CurrentTemperature; + var tileHeatCapacity = atmosphereSystem.GetHeatCapacity(air); + var heat = temperatureDelta * (tileHeatCapacity * _temperatureComponent.HeatCapacity / (tileHeatCapacity + _temperatureComponent.HeatCapacity)); + _temperatureComponent.ReceiveHeat(heat); _temperatureComponent.Update(); } - _barotraumaComponent?.Update(tile.Air?.Pressure ?? 0); + _barotraumaComponent?.Update(air.Pressure); - _flammableComponent?.Update(tile); + _flammableComponent?.Update(air); } } } diff --git a/Content.Server/Atmos/Components/FlammableComponent.cs b/Content.Server/Atmos/Components/FlammableComponent.cs index 99aa2402f8..3cccaba238 100644 --- a/Content.Server/Atmos/Components/FlammableComponent.cs +++ b/Content.Server/Atmos/Components/FlammableComponent.cs @@ -63,7 +63,7 @@ namespace Content.Server.Atmos.Components UpdateAppearance(); } - public void Update(TileAtmosphere tile) + public void Update(GasMixture air) { // Slowly dry ourselves off if wet. if (FireStacks < 0) @@ -104,13 +104,13 @@ namespace Content.Server.Atmos.Components } // If we're in an oxygenless environment, put the fire out. - if (tile.Air?.GetMoles(Gas.Oxygen) < 1f) + if (air.GetMoles(Gas.Oxygen) < 1f) { Extinguish(); return; } - EntitySystem.Get().HotspotExpose(tile.GridIndex, tile.GridIndices, 700f, 50f, true); + EntitySystem.Get().HotspotExpose(Owner.Transform.Coordinates, 700f, 50f, true); var physics = Owner.GetComponent(); diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Grid.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Grid.cs index 9f09ce4e41..35e06f437d 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Grid.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Grid.cs @@ -670,7 +670,7 @@ namespace Content.Server.Atmos.EntitySystems public GasMixture? GetTileMixture(EntityCoordinates coordinates, bool invalidate = false) { return TryGetGridAndTile(coordinates, out var tuple) - ? GetTileMixture(tuple.Value.Grid, tuple.Value.Tile, invalidate) : null; + ? GetTileMixture(tuple.Value.Grid, tuple.Value.Tile, invalidate) : GasMixture.SpaceGas; } /// diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs index 90d482e39a..966a3192f5 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs @@ -71,7 +71,7 @@ namespace Content.Server.Atmos.EntitySystems foreach (var exposed in EntityManager.ComponentManager.EntityQuery()) { // TODO ATMOS: Kill this with fire. - var tile = GetTileAtmosphereOrCreateSpace(exposed.Owner.Transform.Coordinates); + var tile = GetTileMixture(exposed.Owner.Transform.Coordinates); if (tile == null) continue; exposed.Update(tile, _exposedTimer, this); } diff --git a/Resources/Changelog/Parts/funny_gas.yml b/Resources/Changelog/Parts/funny_gas.yml new file mode 100644 index 0000000000..a2e7209f07 --- /dev/null +++ b/Resources/Changelog/Parts/funny_gas.yml @@ -0,0 +1,4 @@ +author: Zumorica +changes: + - type: Fix + message: Fixes mobs not taking pressure damage on space. From 5d60af2656dab27c8a009dd42108344bace69fde Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 4 Aug 2021 03:49:53 -0400 Subject: [PATCH 37/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 5 +++++ Resources/Changelog/Parts/funny_gas.yml | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) delete mode 100644 Resources/Changelog/Parts/funny_gas.yml diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fef67ea5f5..b6509f5e2f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1658,3 +1658,8 @@ Entries: - {message: Fix joint prediction., type: Fix} id: 295 time: '2021-08-03T15:02:44.0000000+00:00' +- author: Zumorica + changes: + - {message: Fixes mobs not taking pressure damage on space., type: Fix} + id: 296 + time: '2021-08-04T07:49:53.509340+00:00' diff --git a/Resources/Changelog/Parts/funny_gas.yml b/Resources/Changelog/Parts/funny_gas.yml deleted file mode 100644 index a2e7209f07..0000000000 --- a/Resources/Changelog/Parts/funny_gas.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Zumorica -changes: - - type: Fix - message: Fixes mobs not taking pressure damage on space. From 532c9a6431df1ce7fef356b06aa3ba8a8b6fd242 Mon Sep 17 00:00:00 2001 From: Swept Date: Thu, 5 Aug 2021 03:18:05 -0700 Subject: [PATCH 38/83] Adds an alternate jumpsuit for botany (#4419) * Adds an alternate botanists jumpsuit * Updated license information --- .../Catalog/Fills/Lockers/service.yml | 4 +++ .../Entities/Clothing/Head/hats.yml | 13 ++++++++- .../Entities/Clothing/Uniforms/jumpsuits.yml | 11 ++++++++ .../Hats/truckershat.rsi/equipped-HELMET.png | Bin 0 -> 448 bytes .../Head/Hats/truckershat.rsi/icon.png | Bin 0 -> 306 bytes .../Head/Hats/truckershat.rsi/inhand-left.png | Bin 0 -> 417 bytes .../Hats/truckershat.rsi/inhand-right.png | Bin 0 -> 416 bytes .../Head/Hats/truckershat.rsi/meta.json | 26 ++++++++++++++++++ .../overalls.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 1307 bytes .../Uniforms/Jumpsuit/overalls.rsi/icon.png | Bin 0 -> 503 bytes .../Jumpsuit/overalls.rsi/inhand-left.png | Bin 0 -> 339 bytes .../Jumpsuit/overalls.rsi/inhand-right.png | Bin 0 -> 416 bytes .../Uniforms/Jumpsuit/overalls.rsi/meta.json | 26 ++++++++++++++++++ 13 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Clothing/Head/Hats/truckershat.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Hats/truckershat.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Head/Hats/truckershat.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Hats/truckershat.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hats/truckershat.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/overalls.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/overalls.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/overalls.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/overalls.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/overalls.rsi/meta.json diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/service.yml b/Resources/Prototypes/Catalog/Fills/Lockers/service.yml index d2e13f35e9..8585bae168 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/service.yml @@ -84,3 +84,7 @@ prob: 0.8 - id: TomatoSeeds prob: 1 + - id: ClothingUniformOveralls + prob: 1 + - id: ClothingHeadHatTrucker + prob: 0.1 diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index 783c4e9186..fb84c0f136 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -23,7 +23,7 @@ - type: entity parent: ClothingHeadBase id: ClothingHeadHatBeretEngineering - name: engineering beret + name: engineering beret description: A beret with the engineering insignia emblazoned on it. For engineers that are more inclined towards style than safety. components: - type: Sprite @@ -360,3 +360,14 @@ sprite: Clothing/Head/Hats/xmascrown.rsi - type: Clothing sprite: Clothing/Head/Hats/xmascrown.rsi + +- type: entity + parent: ClothingHeadBase + id: ClothingHeadHatTrucker + name: truckers hat + description: Formerly Chucks, this hat is yours now. + components: + - type: Sprite + sprite: Clothing/Head/Hats/truckershat.rsi + - type: Clothing + sprite: Clothing/Head/Hats/truckershat.rsi diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml index 77f7eb264e..f71364f361 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml @@ -571,3 +571,14 @@ sprite: Clothing/Uniforms/Jumpsuit/rainbow.rsi - type: Clothing sprite: Clothing/Uniforms/Jumpsuit/rainbow.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformOveralls + name: overalls + description: Great for working outdoors. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/overalls.rsi + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/overalls.rsi diff --git a/Resources/Textures/Clothing/Head/Hats/truckershat.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hats/truckershat.rsi/equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0362d8dd654e1dc88129baa39f92b9fe77217b GIT binary patch literal 448 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU~KnvaSW-L^Y+$8ze52cY!4P| zdL~Qo2(pW(#~*Axcy{@On`ak(mpt|08IOMBZ07Fu2Od3oq|jzzV6xHktftAvErvVU zZx#3a-)^#()Asp4k!jT&|8_Fpf2)5yxofe;?YQ#A6Tfd>Qn&iPG~eENukLPn{e5${ z!IIgl{TH2{@WOK8$;*akC$~Jhz2&389p?$WyY8O)m9zDf^9Npq2_^?;pWRzC^?mfA z*-!NwUyFrn1~SB4@$KGy?wqg3tNi$-UtRw*uK8Z2uC+t|^ylBV)PMeC;R`KKWMDG5 z(5%Ihuz)?3o8M3PRO&2qF3u{~UhoA#U)YH|^Wt~$(697yK!5aVo literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/truckershat.rsi/icon.png b/Resources/Textures/Clothing/Head/Hats/truckershat.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..95a2ca01f5f0bf824cfa1c35b8f07c80c6b578cc GIT binary patch literal 306 zcmV-20nPr2P)W?3I9l=Bk%OCvuMXa%;g#gH41vWOaEu+{0q*(au_iqM4W@hR- zpuzt;1A`qj8V*5Hcf&?btdM!_f;1*2eu0|o{L0M^837AXz!VgLXD07*qoM6N<$ Ef)=-Ung9R* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/truckershat.rsi/inhand-left.png b/Resources/Textures/Clothing/Head/Hats/truckershat.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..7e2ef801dce07b30007fd83f9dd11364fedb6e8f GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9fAzaSW-L^Y)gZAG4tV>jn8E zj4LuM|~m zWEpJPCeDZpc=@B6VRqBUr9R9OE|1<;?33?*{qY2+qrROi{}$eZIlLDheP_7GP~&U& zeb!IYdmTs4+uz$S`MhrCnPRi-1AOh)dyl?X@;+nx{=Cx0w0o9m{RgaCu8O@CTO%gU zFR`9cH~e+jnR?c$!wh@4KOBP-+kP-W-J4N)Zr{Yf-Txm%yx*|8zGchdHM-v?ZTmeZ zkLkj@;$8I$+u#11pT`t%tLge)=Bj1 z{1$NKLkw6#Mnzum4LrI3|7g zasIEy5{~DZ5B%jA-Z0j06sz2)oVzLNKDS)2{? zzt<0f*VVB`9cEa=z2O*~xK_j90s&X%9d+|~`-x%;;8;uw||?! zCT1Yxz{<@wXJl&*Z(^#L9ofOaAb(W#@7j~5PTq0_wcEcx&d$x|-o$icRoU!}b=S=b v^tBll++#dGE5FBp;Wg75LpWh7f53clW9~=KrUqwV$TN7l`njxgN@xNAq;a(e literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/truckershat.rsi/meta.json b/Resources/Textures/Clothing/Head/Hats/truckershat.rsi/meta.json new file mode 100644 index 0000000000..48deea96a8 --- /dev/null +++ b/Resources/Textures/Clothing/Head/Hats/truckershat.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from baystation12 and modified by Swept at commit https://github.com/Baystation12/Baystation12/commit/80b2ded014aa871e6bceb6913b2961a23109aa23", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/overalls.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/overalls.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..42ea220dbadf69966b381a1f6f80bb6b9698de34 GIT binary patch literal 1307 zcmV+$1?2jPP)ML*f0|lmBdVfh!K=X%>Lx!dflK0^Zyr`}dfQzPPiA3d z*-K=>cvy)S1wHs5F&g|wBok-F8J%%wGh@rEo>$iN^z?L9x_id8K4^OCb$5O5eO*;u z%zL1rp`oFnp`oGinIhsA_IIcDRkUxNpEl<@4ncSJI9&hz1b=pD�MdKLpD&$Kl55 z6Rv$O1YhqS<^1PPPI8_t2Zt;8_l^C`S$^F==E@lJ>JJ9L_M1MKn`wnL8~OnDjGA-} z+o_pW!0WJk)C@ud44(Mcf7{Q3rfb+v-T254o7Q>e_ap!XKXc_V7(D~b#zYWc7z6Bj z5F$|UANj{!`O)7mJ&Mp$?*D1&s!1-sy0WRG=?0Da$=^bny4i5Lr#wo>5Hb3}XM*ymbo!z-`kF^W4)9jpkIazgx z*YSRQZlR+9pLgQN7l48w@Juhn&hKRu)SUv@nP~#p=TxF=m>(i=?&JOB^g==Ww5AmD zH(8IFp3^LFJd1W&e%C3G&%CR${hPbyc&})8dQJsS{g`Hn1#85=;x=rfU4`FOfQ>tb z99Pn4dCEsM=o zdu*$|0A&IGFVF(WJ|J#Dyx9GQ-~3XGVDW7liVrTD-B{oz}jbl#UUMmnL zs4fA0K&bd3Ex?da7XVSKR$$F9$C&NU?|%$Mh@E9VDAy&3zR8LpH3cYm7W9TbmXjCJ zbKoyuQsQo~bD$6857=Lj2S~30L`3Onu})zAmC}ro0&<9)qA&KM2`^Cgm}Os+_F949 z^8x_X^$F;UO7IA20Z{EiuE5)3k~A!coML+3sc6D?0Z?r$N)o}H=mJPXHc%PbSMTD# zMIkVFm6`;leE<>Fsuc(m|<7Z)Z@ekZ4)(Tk3$zW4smA0<<_4wD;C%LlqrG)mG4Qsl(^pOm+3 zc#lk&iNRH@9nEdz*R0f3Zv-INZ1Mc7Sj0&7nqpl-DRG&db5lAQ5Sr7SuF_^aqi5lAv_Cb2T40Uhciez3;ud3p_kL{yh>;1D5v}nU#n9_KUiW zm~x1nrCm3Ed~<}lwTJBZ3EHg=Tl4DRmaDe|yeA+lemj**0zMfZuLcT*f;(tV{`Ax+ z%M&?OZUIDQcnpe?LnIT%!saaVk)=8L$0Avg<@g2At`fO8YG#$qquGcnf-KF6nyG>E zM7rP?QF~olhY|o(^%U>{1LJ@Jz)-*A<%=TbSIl}MGt_B~=7C3`S2iC*iyPk=8FMO%A9{k$j{(hT3i zqDSCB#eVLZ=91+5%ToLT(p%5A1+d*yK^lZpxNA1tJl@U{-2VZ(U>W_AeUk_W+wQr= zDK2^ug?>c(^bYKv#YWfAm=Lm#kK&>T-+@qajajSp;QEw6zR$;t@GBSzH<_;)oI~gH t4f1dbA@h#;8b(O?6?k}fc>Hq!d;tn~syP%t9D)D<002ovPDHLkV1g5`=Y#+N literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/overalls.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/overalls.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..ef474f95ad43040a2bccaa97c076fd9b0328d360 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e{s5m4S0K$`6vg1y!(dy_U{T!4 zBC!`J!dMdI7tG-B>_!@plT#HEQR0$XoLrPyP?DLS$G}iACpfI2sPy}n;DV1|pJ;jO zYMncCK6pc@!A0W-k95xaXr5#!>gnBKVH{+9+1N{A&Z9|3CWR;jYs#-sG*n+6(b;XR zx_O1flKyVvwHk)zqDRc01ceoREoPj}!!U2NbXorMwPrwjt2|vCLp(a)PC3ZipupqW zE&QRCkwx7hreVi_zhezwFU{MNaj86O*7Rk|-BTpuj|%>@`TLbj( hYz?S?5cQ`~xbP7BWN)=^XMnC?@O1TaS?83{1ON_ffMoyx literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/overalls.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/overalls.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..79468f3b600d602e6dd8e1b50f2af05ad1de4ab7 GIT binary patch literal 416 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=g;gODB`&GO$wiq3C7Jno3=9=> zRF7M8H5dr69+*C6wsSR4C;C*`GF_wdYZt%Fo9an$Ac~Zn`-6<|KR9gBdH1?1;E=^CJ7a&C+G^ zjNu^Hyz+E$45^s&_SRnBW&?q?hu$I=FDy%B5LR-j!TLehZWl-Do1QhQ`o`}N zsC&Ke#WLXMGd`?o=stSJ;lMv< z=kA$}vX`bc0C_IA7$SgbmiXS@Z(qOv&LwkShJZJ$T!#}^R{XcO0U6}!>gTe~DWM4f D#uBir literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/overalls.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/overalls.rsi/meta.json new file mode 100644 index 0000000000..c35ec06fb5 --- /dev/null +++ b/Resources/Textures/Clothing/Uniforms/Jumpsuit/overalls.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation and modified by Swept at commit https://github.com/tgstation/tgstation/commit/ac792e3226d48e5b3aaccff165ce100f7636a040", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} From 21fca6c1fb473ccbc46187f4bf35cd0b4caf5e22 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 5 Aug 2021 06:19:07 -0400 Subject: [PATCH 39/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b6509f5e2f..0eccdb74b9 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1663,3 +1663,8 @@ Entries: - {message: Fixes mobs not taking pressure damage on space., type: Fix} id: 296 time: '2021-08-04T07:49:53.509340+00:00' +- author: SweptWasTaken + changes: + - {message: Added an alternate jumpsuit for Botany, type: Add} + id: 297 + time: '2021-08-05T10:18:05.0000000+00:00' From 96354923abb9d03cece37943dc4dbedf17f519d9 Mon Sep 17 00:00:00 2001 From: SethLafuente <84478872+SethLafuente@users.noreply.github.com> Date: Thu, 5 Aug 2021 15:20:58 -0700 Subject: [PATCH 40/83] Added two new small areas to maintenence (#4359) Co-authored-by: SETh lafuente --- Resources/Maps/saltern.yml | 1166 ++++++++++++++++- .../Prototypes/Catalog/Fills/Lockers/misc.yml | 34 + .../Structures/Storage/Closets/closets.yml | 13 + 3 files changed, 1181 insertions(+), 32 deletions(-) diff --git a/Resources/Maps/saltern.yml b/Resources/Maps/saltern.yml index 8ca177e8e3..3e767d8f62 100644 --- a/Resources/Maps/saltern.yml +++ b/Resources/Maps/saltern.yml @@ -56,17 +56,17 @@ grids: - ind: "0,1" tiles: IQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAhAAAAIAAAABgAAAAhAAAAGAAAABgAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAACEAAAAgAAAAGAAAACEAAAAAAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAhAAAAIAAAABgAAAAhAAAAAAAAABgAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGAAAACAAAAAYAAAAIQAAAAAAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAACEAAAAYAAAAGAAAACEAAAAAAAAAIQAAACEAAAAWAAAAIQAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAGAAAACEAAAAhAAAAAAAAAA8AAAAhAAAAFgAAABYAAAAWAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAGAAAABgAAAAYAAAAIQAAAAAAAAAPAAAADwAAABYAAAAWAAAAFgAAACEAAAAeAAAAHgAAAB4AAAAeAAAAIQAAACAAAAAgAAAAIAAAACEAAAAAAAAADwAAAA8AAAAWAAAAFgAAABYAAAAWAAAAHgAAAB4AAAAeAAAAHgAAACEAAAAhAAAAIQAAACEAAAAhAAAAAAAAAA8AAAAhAAAAFgAAABYAAAAWAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIQAAABYAAAAWAAAAFgAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== - ind: "-2,0" - tiles: IQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAFgAAABYAAAAWAAAAFgAAACEAAAAOAAAAFgAAABYAAAAWAAAAFgAAACEAAAAeAAAAHgAAAB4AAAAeAAAAIQAAACEAAAAWAAAAFgAAACEAAAAhAAAADgAAAA4AAAAOAAAADgAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAACEAAAAhAAAAIQAAACEAAAAhAAAAGAAAACAAAAAhAAAAFgAAABYAAAAWAAAAIQAAACEAAAAWAAAAFgAAACEAAAAhAAAAFgAAABYAAAAhAAAAIAAAACAAAAAYAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAIQAAACAAAAAYAAAAGAAAACEAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAgAAAAGAAAABgAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAhAAAAIAAAABgAAAAYAAAAIQAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAhAAAAIQAAABgAAAAhAAAAIQAAACAAAAAgAAAAGAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAABgAAAAgAAAAGAAAABgAAAAgAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAIAAAACAAAAAgAAAAIAAAABgAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAhAAAAIQAAACAAAAAYAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACAAAAAgAAAAGAAAAA== + tiles: IQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAFgAAABYAAAAWAAAAFgAAACEAAAAOAAAAFgAAABYAAAAWAAAAFgAAACEAAAAeAAAAHgAAAB4AAAAeAAAAIQAAACEAAAAWAAAAFgAAACEAAAAhAAAADgAAAA4AAAAOAAAADgAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAACEAAAAhAAAAIQAAACEAAAAhAAAAGAAAACAAAAAhAAAAFgAAABYAAAAWAAAAIQAAACEAAAAWAAAAFgAAACEAAAAhAAAAFgAAABYAAAAhAAAAIAAAACAAAAAYAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAIQAAACAAAAAYAAAAGAAAACEAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAgAAAAGAAAABgAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAhAAAAIAAAABgAAAAYAAAAIQAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAhAAAAIQAAABgAAAAhAAAAIQAAACAAAAAgAAAAGAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAABgAAAAgAAAAGAAAABgAAAAgAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAIAAAACAAAAAgAAAAIAAAABgAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAhAAAAIQAAACAAAAAYAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACAAAAAgAAAAGAAAAA== - ind: "1,-1" tiles: GwAAABsAAAAbAAAAGwAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAABsAAAAbAAAAGwAAABsAAAAhAAAAGwAAABsAAAAbAAAAGwAAACEAAAAgAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAhAAAAIAAAABgAAAAhAAAAAAAAAAAAAAAAAAAAIQAAACEAAAAbAAAAGwAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAABsAAAAbAAAAGwAAABsAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAgAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAbAAAAGwAAABsAAAAbAAAAGAAAACAAAAAYAAAAGAAAABgAAAAYAAAAIAAAABgAAAAhAAAAAAAAAAAAAAAAAAAAGwAAABsAAAAbAAAAGwAAACEAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAABsAAAAbAAAAGwAAABsAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAgAAAAGAAAACEAAAAhAAAAIQAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAABsAAAAbAAAAGwAAABsAAAAhAAAAIAAAABgAAAAhAAAAIAAAACAAAAAgAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAIQAAACAAAAAgAAAAIAAAACAAAAAYAAAAGAAAABsAAAAbAAAAGwAAABsAAAAhAAAAGwAAABsAAAAbAAAAGwAAACEAAAAgAAAAGAAAACEAAAAhAAAAIQAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAABsAAAAbAAAAGwAAABsAAAAhAAAAIAAAABgAAAAhAAAAFgAAABYAAAAWAAAAIQAAABsAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACAAAAAYAAAAIQAAABYAAAAWAAAAFgAAABsAAAAbAAAAGwAAACEAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAGAAAACEAAAAWAAAAFgAAABYAAAAbAAAAGwAAABsAAAAhAAAAIAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAhAAAAFgAAABYAAAAWAAAAGwAAABsAAAAbAAAAIQAAACAAAAAYAAAAGAAAACAAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAAA== - ind: "0,-2" tiles: AAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAAAAAAAAAAAAAAAAAhAAAAFgAAABYAAAAWAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAAAAAAAAAAAAAAAAAIQAAABYAAAAWAAAAFgAAACEAAAAeAAAAHgAAAB4AAAAeAAAAIQAAAB4AAAAeAAAAIQAAAAAAAAAAAAAAIQAAACEAAAAWAAAAFgAAABYAAAAhAAAAHgAAAB4AAAAeAAAAHgAAACEAAAAhAAAAIQAAACEAAAAAAAAAAAAAABgAAAAhAAAAFgAAABYAAAAWAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAAAAAAAAAAAAYAAAAIQAAABYAAAAWAAAAFgAAACEAAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAIQAAACEAAAAhAAAAGAAAACEAAAAWAAAAFgAAABYAAAAhAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAACEAAAAgAAAAIAAAABgAAAAhAAAAFgAAABYAAAAWAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAIAAAABgAAAAgAAAAGAAAABYAAAAWAAAAFgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAIQAAACAAAAAYAAAAIQAAACEAAAAWAAAAFgAAABYAAAAhAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAACEAAAAgAAAAGAAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAhAAAAGAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIAAAABgAAAAbAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAYAAAAGwAAABYAAAAWAAAAFgAAABYAAAAWAAAAGAAAACAAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAgAAAAGAAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAYAAAAGAAAABgAAAAYAAAAIQAAACEAAAAhAAAAGAAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABsAAAAbAAAAGwAAABsAAAAhAAAAGwAAABsAAAAbAAAAGwAAAA== - ind: "1,-2" - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAACAAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIQAAACEAAAAhAAAAIQAAABgAAAAgAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAABsAAAAbAAAAGwAAACEAAAAYAAAAIAAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAbAAAAGwAAABsAAAAhAAAAGAAAACAAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAGwAAABsAAAAbAAAAIQAAABgAAAAgAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAABsAAAAbAAAAGwAAACEAAAAYAAAAIAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAAAAAAAAAAAAAAAAAACEAAAAhAAAAIQAAABsAAAAhAAAAGAAAACAAAAAYAAAAGAAAABgAAAAYAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAbAAAAGwAAABsAAAAbAAAAIQAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAABgAAAAhAAAAAAAAAAAAAAAAAAAAGwAAABsAAAAbAAAAGwAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAAA== + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAABgAAAAYAAAAGAAAABgAAAAYAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACEAAAAYAAAAGAAAABgAAAAYAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAACAAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAAAAAAAAAAAAAAAAAhAAAAIQAAACEAAAAhAAAAIQAAABgAAAAgAAAAIQAAABgAAAAYAAAAGAAAABgAAAAYAAAAAAAAAAAAAAAAAAAAIQAAABsAAAAbAAAAGwAAACEAAAAYAAAAIAAAACEAAAAYAAAAGAAAABgAAAAYAAAAGAAAAAAAAAAAAAAAAAAAACEAAAAbAAAAGwAAABsAAAAhAAAAGAAAACAAAAAhAAAAGAAAABgAAAAYAAAAGAAAABgAAAAAAAAAAAAAAAAAAAAgAAAAGwAAABsAAAAbAAAAIQAAABgAAAAgAAAAIQAAABgAAAAYAAAAGAAAABgAAAAYAAAAAAAAAAAAAAAAAAAAGAAAABsAAAAbAAAAGwAAACEAAAAYAAAAIAAAACEAAAAhAAAAIQAAABgAAAAhAAAAIQAAAAAAAAAAAAAAAAAAACEAAAAhAAAAIQAAABsAAAAhAAAAGAAAACAAAAAYAAAAGAAAABgAAAAYAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAbAAAAGwAAABsAAAAbAAAAIQAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAABgAAAAhAAAAAAAAAAAAAAAAAAAAGwAAABsAAAAbAAAAGwAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAAA== - ind: "-1,1" tiles: IQAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAGAAAABgAAAAYAAAAGAAAACEAAAAhAAAAIQAAABYAAAAhAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABgAAAAYAAAAGAAAABgAAAAhAAAAEQAAABEAAAARAAAAEQAAACEAAAAhAAAAFgAAACEAAAAhAAAAIQAAACEAAAAYAAAAGAAAABgAAAAYAAAAIQAAABEAAAARAAAAEQAAABEAAAAhAAAACAAAAAgAAAAIAAAACAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAARAAAAEQAAABEAAAARAAAAFgAAAAgAAAAeAAAAHgAAAB4AAAAhAAAAGAAAABgAAAAYAAAAGAAAACAAAAAhAAAAEQAAABEAAAARAAAAEQAAACEAAAAIAAAAHgAAAB4AAAAeAAAAIQAAACAAAAAgAAAAIAAAACAAAAAgAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAACAAAAB4AAAAeAAAAHgAAACEAAAAgAAAAIQAAACEAAAAPAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAABgAAAAYAAAAGAAAABgAAAAYAAAAIAAAACEAAAAPAAAADwAAAA8AAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAACAAAAAgAAAAIAAAACAAAAAhAAAADwAAAA8AAAAPAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIQAAACEAAAAhAAAAIQAAAA8AAAAPAAAADwAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAAAAAAAAAAACEAAAAPAAAADwAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIQAAACEAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAABYAAAAWAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAWAAAAFgAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAFgAAABYAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACEAAAAWAAAAFgAAAA== - ind: "-2,1" - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACAAAAAYAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAgAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIAAAABgAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAgAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIAAAABgAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAgAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIAAAABgAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAhAAAAIQAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + tiles: AAAAAAAAAAAAAAAAAAAAACEAAAAYAAAAIAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAACAAAAAYAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAGAAAACAAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAgAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAAAAAAIQAAABgAAAAgAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAIAAAABgAAAAhAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAYAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAACEAAAAgAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAAAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAhAAAAIAAAABgAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAgAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIAAAABgAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAhAAAAIQAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== - ind: "-1,2" tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAhAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== - ind: "1,1" @@ -7968,10 +7968,9 @@ entities: stash: !type:ContainerSlot {} type: ContainerContainer - uid: 823 - type: ClosetBase + type: ClosetMaintenanceFilledRandom components: - - rot: 4.371139006309477E-08 rad - pos: -11.5,-12.5 + - pos: -11.5,-12.5 parent: 853 type: Transform - IsPlaceable: False @@ -12315,6 +12314,89 @@ entities: 45,-33: 0 46,-34: 0 47,-34: 0 + 24,-27: 0 + 24,-26: 0 + 24,-25: 0 + 24,-24: 0 + 24,-23: 0 + 24,-22: 0 + 24,-21: 0 + 25,-27: 0 + 25,-26: 0 + 25,-25: 0 + 25,-24: 0 + 25,-23: 0 + 25,-22: 0 + 25,-21: 0 + 26,-27: 0 + 26,-26: 0 + 26,-25: 0 + 26,-24: 0 + 26,-23: 0 + 26,-22: 0 + 26,-21: 0 + 27,-27: 0 + 27,-26: 0 + 27,-25: 0 + 27,-24: 0 + 27,-23: 0 + 27,-22: 0 + 27,-21: 0 + 28,-27: 0 + 28,-26: 0 + 28,-25: 0 + 28,-24: 0 + 28,-23: 0 + 28,-22: 0 + 28,-21: 0 + -28,16: 0 + -28,17: 0 + -28,18: 0 + -28,19: 0 + -28,20: 0 + -28,21: 0 + -27,16: 0 + -27,17: 0 + -27,18: 0 + -27,19: 0 + -27,20: 0 + -27,21: 0 + -26,16: 0 + -26,17: 0 + -26,18: 0 + -26,19: 0 + -26,20: 0 + -26,21: 0 + -25,16: 0 + -25,17: 0 + -25,18: 0 + -25,19: 0 + -25,20: 0 + -25,21: 0 + -24,16: 0 + -24,17: 0 + -24,18: 0 + -24,19: 0 + -24,20: 0 + -24,21: 0 + -23,16: 0 + -23,17: 0 + -23,18: 0 + -23,19: 0 + -23,20: 0 + -23,21: 0 + -22,16: 0 + -22,17: 0 + -22,18: 0 + -22,19: 0 + -22,20: 0 + -22,21: 0 + -21,16: 0 + -21,17: 0 + -21,18: 0 + -21,19: 0 + -21,20: 0 + -21,21: 0 uniqueMixes: - volume: 2500 temperature: 293.15 @@ -12440,16 +12522,6 @@ entities: mask: [] layer: [] mass: 256 - - shape: !type:PolygonShape - vertices: - - -16,16 - - -16,27 - - -20,27 - - -20,16 - id: grid_chunk--2-1 - mask: [] - layer: [] - mass: 44 - shape: !type:PolygonShape vertices: - 0,32 @@ -12610,6 +12682,16 @@ entities: mask: [] layer: [] mass: 16 + - shape: !type:PolygonShape + vertices: + - -16,16 + - -16,27 + - -28,27 + - -28,16 + id: grid_chunk--2-1 + mask: [] + layer: [] + mass: 132 bodyType: Dynamic type: Physics - uid: 854 @@ -15839,8 +15921,7 @@ entities: - uid: 1248 type: WallSolid components: - - rot: 4.371139006309477E-08 rad - pos: -33.5,9.5 + - pos: -33.5,9.5 parent: 853 type: Transform - uid: 1249 @@ -19315,9 +19396,9 @@ entities: parent: 853 type: Transform - uid: 1657 - type: WallReinforced + type: RandomSpawner components: - - pos: 23.5,-24.5 + - pos: 26.5,-25.5 parent: 853 type: Transform - uid: 1658 @@ -19399,11 +19480,16 @@ entities: parent: 853 type: Transform - uid: 1671 - type: WallReinforced + type: CableApcExtension components: - - pos: 26.5,-19.5 + - anchored: True + pos: 28.5,-24.5 parent: 853 type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics - uid: 1672 type: WallReinforced components: @@ -19526,11 +19612,15 @@ entities: parent: 853 type: Transform - uid: 1692 - type: WallReinforced + type: AirlockMaint components: - - pos: -25.5,15.5 + - pos: 23.5,-24.5 parent: 853 type: Transform + - containers: + board: !type:Container + ents: [] + type: ContainerContainer - uid: 1693 type: WallReinforced components: @@ -19634,11 +19724,15 @@ entities: parent: 853 type: Transform - uid: 1709 - type: WallReinforced + type: AirlockMaint components: - - pos: -19.5,19.5 + - pos: -25.5,15.5 parent: 853 type: Transform + - containers: + board: !type:Container + ents: [] + type: ContainerContainer - uid: 1710 type: WallReinforced components: @@ -23154,12 +23248,15 @@ entities: parent: 853 type: Transform - uid: 2210 - type: WallSolid + type: AirlockMaint components: - - rot: 4.371139006309477E-08 rad - pos: 25.5,-15.5 + - pos: -23.5,18.5 parent: 853 type: Transform + - containers: + board: !type:Container + ents: [] + type: ContainerContainer - uid: 2211 type: WallSolid components: @@ -23219,8 +23316,7 @@ entities: - uid: 2219 type: WallSolid components: - - rot: 4.371139006309477E-08 rad - pos: 20.5,-17.5 + - pos: 20.5,-17.5 parent: 853 type: Transform - uid: 2220 @@ -24589,7 +24685,7 @@ entities: parent: 853 type: Transform - uid: 2414 - type: ClosetBase + type: ClosetMaintenanceFilledRandom components: - pos: -8.5,-25.5 parent: 853 @@ -49218,4 +49314,1010 @@ entities: pos: 2.5,31.5 parent: 853 type: Transform +- uid: 4961 + type: WallReinforced + components: + - pos: 28.5,-22.5 + parent: 853 + type: Transform +- uid: 4962 + type: WallReinforced + components: + - pos: 24.5,-26.5 + parent: 853 + type: Transform +- uid: 4963 + type: WallReinforced + components: + - pos: 25.5,-26.5 + parent: 853 + type: Transform +- uid: 4964 + type: WallReinforced + components: + - pos: 26.5,-26.5 + parent: 853 + type: Transform +- uid: 4965 + type: WallReinforced + components: + - pos: 28.5,-20.5 + parent: 853 + type: Transform +- uid: 4966 + type: WallReinforced + components: + - pos: 28.5,-23.5 + parent: 853 + type: Transform +- uid: 4967 + type: WallReinforced + components: + - pos: 28.5,-21.5 + parent: 853 + type: Transform +- uid: 4968 + type: WallReinforced + components: + - pos: 28.5,-24.5 + parent: 853 + type: Transform +- uid: 4969 + type: WallReinforced + components: + - pos: 28.5,-25.5 + parent: 853 + type: Transform +- uid: 4970 + type: WallReinforced + components: + - pos: 28.5,-26.5 + parent: 853 + type: Transform +- uid: 4971 + type: WallReinforced + components: + - pos: 27.5,-26.5 + parent: 853 + type: Transform +- uid: 4972 + type: WallSolid + components: + - pos: 25.5,-24.5 + parent: 853 + type: Transform +- uid: 4973 + type: WallSolid + components: + - pos: 25.5,-25.5 + parent: 853 + type: Transform +- uid: 4974 + type: AirlockMaint + components: + - pos: 25.5,-23.5 + parent: 853 + type: Transform + - containers: + board: !type:Container + ents: [] + type: ContainerContainer +- uid: 4975 + type: WallSolid + components: + - pos: 25.5,-21.5 + parent: 853 + type: Transform +- uid: 4976 + type: WallSolid + components: + - pos: 27.5,-21.5 + parent: 853 + type: Transform +- uid: 4977 + type: WallSolid + components: + - pos: 26.5,-21.5 + parent: 853 + type: Transform +- uid: 4978 + type: WallSolid + components: + - pos: 25.5,-15.5 + parent: 853 + type: Transform +- uid: 4979 + type: AcousticGuitarInstrument + components: + - pos: 27.500875,-23.377102 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 4980 + type: WallSolid + components: + - pos: 25.5,-22.5 + parent: 853 + type: Transform +- uid: 4981 + type: Table + components: + - pos: 27.5,-25.5 + parent: 853 + type: Transform +- uid: 4982 + type: Table + components: + - pos: 26.5,-25.5 + parent: 853 + type: Transform +- uid: 4983 + type: PoweredSmallLight + components: + - rot: -1.5707963267948966 rad + pos: 28,-24.5 + parent: 853 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer +- uid: 4984 + type: PoweredSmallLight + components: + - pos: 25.5,-20 + parent: 853 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer +- uid: 4985 + type: PoweredSmallLight + components: + - rot: 1.5707963267948966 rad + pos: 24,-23.5 + parent: 853 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer +- uid: 4986 + type: ComfyChair + components: + - pos: 26.5,-24.5 + parent: 853 + type: Transform +- uid: 4987 + type: CableApcExtension + components: + - anchored: True + pos: 26.5,-19.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 4988 + type: CableApcExtension + components: + - anchored: True + pos: 26.5,-20.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 4989 + type: CableApcExtension + components: + - anchored: True + pos: 25.5,-19.5 + parent: 853 + type: Transform +- uid: 4990 + type: CableApcExtension + components: + - anchored: True + pos: 23.5,-24.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 4991 + type: CableApcExtension + components: + - anchored: True + pos: 23.5,-23.5 + parent: 853 + type: Transform +- uid: 4992 + type: CableApcExtension + components: + - anchored: True + pos: 23.5,-22.5 + parent: 853 + type: Transform +- uid: 4993 + type: CableApcExtension + components: + - anchored: True + pos: 23.5,-21.5 + parent: 853 + type: Transform +- uid: 4994 + type: CableApcExtension + components: + - anchored: True + pos: 23.5,-20.5 + parent: 853 + type: Transform +- uid: 4995 + type: CableApcExtension + components: + - anchored: True + pos: 23.5,-19.5 + parent: 853 + type: Transform +- uid: 4996 + type: CableApcExtension + components: + - anchored: True + pos: 24.5,-24.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 4997 + type: CableApcExtension + components: + - anchored: True + pos: 25.5,-24.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 4998 + type: CableApcExtension + components: + - anchored: True + pos: 26.5,-24.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 4999 + type: CableApcExtension + components: + - anchored: True + pos: 27.5,-24.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5000 + type: AirlockMaint + components: + - pos: 26.5,-19.5 + parent: 853 + type: Transform + - containers: + board: !type:Container + ents: [] + type: ContainerContainer +- uid: 5001 + type: AirlockMaint + components: + - pos: -19.5,19.5 + parent: 853 + type: Transform + - containers: + board: !type:Container + ents: [] + type: ContainerContainer +- uid: 5002 + type: WallReinforced + components: + - pos: -27.5,16.5 + parent: 853 + type: Transform +- uid: 5003 + type: WallReinforced + components: + - pos: -27.5,17.5 + parent: 853 + type: Transform +- uid: 5004 + type: WallReinforced + components: + - pos: -27.5,18.5 + parent: 853 + type: Transform +- uid: 5005 + type: WallReinforced + components: + - pos: -27.5,19.5 + parent: 853 + type: Transform +- uid: 5006 + type: WallReinforced + components: + - pos: -27.5,20.5 + parent: 853 + type: Transform +- uid: 5007 + type: CrateEngineeringCableMV + components: + - pos: -20.5,16.5 + parent: 853 + type: Transform + - IsPlaceable: False + type: PlaceableSurface + - containers: + EntityStorageComponent: !type:Container + ents: [] + type: ContainerContainer +- uid: 5008 + type: WallSolid + components: + - pos: -20.5,18.5 + parent: 853 + type: Transform +- uid: 5009 + type: WallSolid + components: + - pos: -22.5,18.5 + parent: 853 + type: Transform +- uid: 5010 + type: WallSolid + components: + - pos: -21.5,18.5 + parent: 853 + type: Transform +- uid: 5011 + type: WallSolid + components: + - pos: -24.5,18.5 + parent: 853 + type: Transform +- uid: 5012 + type: WallSolid + components: + - pos: -24.5,17.5 + parent: 853 + type: Transform +- uid: 5013 + type: WallSolid + components: + - pos: -24.5,16.5 + parent: 853 + type: Transform +- uid: 5014 + type: WallReinforced + components: + - pos: -27.5,21.5 + parent: 853 + type: Transform +- uid: 5015 + type: WallReinforced + components: + - pos: -26.5,21.5 + parent: 853 + type: Transform +- uid: 5016 + type: WallReinforced + components: + - pos: -25.5,21.5 + parent: 853 + type: Transform +- uid: 5017 + type: WallReinforced + components: + - pos: -24.5,21.5 + parent: 853 + type: Transform +- uid: 5018 + type: WallReinforced + components: + - pos: -23.5,21.5 + parent: 853 + type: Transform +- uid: 5019 + type: WallReinforced + components: + - pos: -22.5,21.5 + parent: 853 + type: Transform +- uid: 5020 + type: WallReinforced + components: + - pos: -21.5,21.5 + parent: 853 + type: Transform +- uid: 5021 + type: WallReinforced + components: + - pos: -20.5,21.5 + parent: 853 + type: Transform +- uid: 5022 + type: CableApcExtension + components: + - anchored: True + pos: -27.5,14.5 + parent: 853 + type: Transform +- uid: 5023 + type: CableApcExtension + components: + - anchored: True + pos: -26.5,14.5 + parent: 853 + type: Transform +- uid: 5024 + type: CableApcExtension + components: + - anchored: True + pos: -25.5,14.5 + parent: 853 + type: Transform +- uid: 5025 + type: CableApcExtension + components: + - anchored: True + pos: -25.5,15.5 + parent: 853 + type: Transform +- uid: 5026 + type: CableApcExtension + components: + - anchored: True + pos: -19.5,19.5 + parent: 853 + type: Transform +- uid: 5027 + type: CableApcExtension + components: + - anchored: True + pos: -18.5,19.5 + parent: 853 + type: Transform +- uid: 5028 + type: CableApcExtension + components: + - anchored: True + pos: -19.5,18.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5029 + type: CableApcExtension + components: + - anchored: True + pos: -20.5,18.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5030 + type: CableApcExtension + components: + - anchored: True + pos: -21.5,18.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5031 + type: CableApcExtension + components: + - anchored: True + pos: -22.5,18.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5032 + type: CableApcExtension + components: + - anchored: True + pos: -23.5,18.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5033 + type: CableApcExtension + components: + - anchored: True + pos: -23.5,18.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5034 + type: PoweredSmallLight + components: + - pos: -21.5,18 + parent: 853 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer +- uid: 5035 + type: PoweredSmallLight + components: + - pos: -23.5,21 + parent: 853 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer +- uid: 5036 + type: PoweredSmallLight + components: + - rot: 1.5707963267948966 rad + pos: -27,17.5 + parent: 853 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer +- uid: 5037 + type: CrateEngineeringCableLV + components: + - pos: -20.5,17.5 + parent: 853 + type: Transform + - IsPlaceable: False + type: PlaceableSurface + - containers: + EntityStorageComponent: !type:Container + ents: [] + type: ContainerContainer +- uid: 5038 + type: CableHVStack + components: + - pos: -22.628485,16.665777 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5039 + type: Rack + components: + - pos: -23.5,16.5 + parent: 853 + type: Transform +- uid: 5040 + type: RandomSpawner + components: + - pos: -20.5,17.5 + parent: 853 + type: Transform +- uid: 5041 + type: Rack + components: + - pos: -22.5,16.5 + parent: 853 + type: Transform +- uid: 5042 + type: ClothingMaskGas + components: + - pos: -23.68732,16.378263 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5043 + type: CableApcExtension + components: + - anchored: True + pos: 25.5,-23.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5044 + type: CableApcExtension + components: + - anchored: True + pos: 25.5,-22.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5045 + type: CableApcExtension + components: + - anchored: True + pos: 25.5,-23.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5046 + type: CableApcExtension + components: + - anchored: True + pos: 25.5,-22.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5047 + type: CableApcExtension + components: + - anchored: True + pos: 25.5,-23.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5048 + type: CableApcExtension + components: + - anchored: True + pos: 25.5,-22.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5049 + type: CableApcExtension + components: + - anchored: True + pos: 25.5,-24.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5050 + type: CableApcExtension + components: + - anchored: True + pos: 25.5,-22.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5051 + type: CableApcExtension + components: + - anchored: True + pos: -25.5,16.5 + parent: 853 + type: Transform +- uid: 5052 + type: CableApcExtension + components: + - anchored: True + pos: -25.5,17.5 + parent: 853 + type: Transform +- uid: 5053 + type: CableApcExtension + components: + - anchored: True + pos: -25.5,18.5 + parent: 853 + type: Transform +- uid: 5054 + type: CableApcExtension + components: + - anchored: True + pos: -24.5,18.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5055 + type: CableApcExtension + components: + - anchored: True + pos: -23.5,18.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5056 + type: CableApcExtension + components: + - anchored: True + pos: -22.5,18.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5057 + type: CableApcExtension + components: + - anchored: True + pos: -21.5,18.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5058 + type: CableApcExtension + components: + - anchored: True + pos: -23.5,18.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5059 + type: CableApcExtension + components: + - anchored: True + pos: -24.5,18.5 + parent: 853 + type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics +- uid: 5060 + type: Firelock + components: + - pos: 26.5,-19.5 + parent: 853 + type: Transform +- uid: 5061 + type: Firelock + components: + - pos: 23.5,-24.5 + parent: 853 + type: Transform +- uid: 5062 + type: Firelock + components: + - pos: -25.5,15.5 + parent: 853 + type: Transform +- uid: 5063 + type: Firelock + components: + - pos: -19.5,19.5 + parent: 853 + type: Transform +- uid: 5064 + type: ClosetMaintenanceFilledRandom + components: + - pos: 26.5,-22.5 + parent: 853 + type: Transform + - IsPlaceable: False + type: PlaceableSurface + - containers: + EntityStorageComponent: !type:Container + ents: [] + type: ContainerContainer +- uid: 5065 + type: SignToolStorage + components: + - pos: 26.514614,-21.5 + parent: 853 + type: Transform +- uid: 5066 + type: Rack + components: + - pos: 27.5,-22.5 + parent: 853 + type: Transform +- uid: 5067 + type: CableMVStack + components: + - rot: 0.0004529799334704876 rad + pos: 27.736885,-22.289246 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5068 + type: Wirecutter + components: + - pos: 27.503157,-22.435783 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5069 + type: CableApcStack + components: + - pos: 27.36774,-22.300274 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5070 + type: SignEngineering + components: + - pos: -22.503485,18.5 + parent: 853 + type: Transform +- uid: 5071 + type: ClothingHandsGlovesCombat + components: + - pos: -23.447739,16.722254 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5072 + type: HarmonicaInstrument + components: + - pos: -22.46857,16.513775 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5073 + type: ClothingHeadHatOrangesoft + components: + - pos: -23.316175,16.5 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5074 + type: ClosetMaintenanceFilledRandom + components: + - pos: -26.5,19.5 + parent: 853 + type: Transform + - IsPlaceable: False + type: PlaceableSurface + - containers: + EntityStorageComponent: !type:Container + ents: [] + type: ContainerContainer +- uid: 5075 + type: ClosetEmergencyFilledRandom + components: + - pos: -26.5,18.5 + parent: 853 + type: Transform + - IsPlaceable: False + type: PlaceableSurface + - containers: + EntityStorageComponent: !type:Container + ents: [] + type: ContainerContainer +- uid: 5076 + type: ClosetFireFilled + components: + - pos: -26.5,17.5 + parent: 853 + type: Transform + - IsPlaceable: False + type: PlaceableSurface + - containers: + EntityStorageComponent: !type:Container + ents: [] + type: ContainerContainer +- uid: 5077 + type: ClothingHandsGlovesColorYellow + components: + - pos: 27.39341,-25.414946 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5078 + type: DrinkBottleBeer + components: + - pos: 26.341326,-25.258587 + parent: 853 + type: Transform + - caps: Refillable, Drainable + type: SolutionContainer + - canCollide: False + type: Physics +- uid: 5079 + type: DrinkBeerglass + components: + - pos: 26.73716,-25.331554 + parent: 853 + type: Transform + - caps: Refillable, Drainable + type: SolutionContainer + - canCollide: False + type: Physics +- uid: 5080 + type: ClosetFireFilled + components: + - pos: 24.5,-25.5 + parent: 853 + type: Transform + - IsPlaceable: False + type: PlaceableSurface + - containers: + EntityStorageComponent: !type:Container + ents: [] + type: ContainerContainer +- uid: 5081 + type: ClosetEmergencyFilledRandom + components: + - pos: 27.5,-20.5 + parent: 853 + type: Transform + - IsPlaceable: False + type: PlaceableSurface + - containers: + EntityStorageComponent: !type:Container + ents: [] + type: ContainerContainer +- uid: 5082 + type: CableHVStack + components: + - pos: -22.638397,16.589691 + parent: 853 + type: Transform + - canCollide: False + type: Physics ... diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml b/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml index 78cb14b62b..0a789fc616 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml @@ -32,3 +32,37 @@ prob: 0.6 - id: ClothingOuterSuitFire prob: 0.75 + +- type: entity + id: ClosetMaintenanceFilledRandom + suffix: Filled, Random + parent: ClosetMaintenance + components: + - type: StorageFill + contents: + - id: lantern + prob: 0.66 + - id: Wirecutter + prob: 0.44 + - id: Screwdriver + prob: 0.44 + - id: Wrench + prob: 0.44 + - id: Crowbar + prob: 0.44 + - id: Welder + prob: 0.44 + - id: Multitool + prob: 0.44 + - id: Soap + prob: 0.44 + - id: PlushieCarp + prob: 0.2 + - id: PlushieSlime + prob: 0.2 + - id: PlushieSnake + prob: 0.2 + - id: ClothingHandsGlovesColorYellow + prob: 0.33 + - id: ClothingBeltUtility + prob: 0.33 diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/closets.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/closets.yml index ad7a284db0..41c491a005 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/closets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/closets.yml @@ -103,3 +103,16 @@ visuals: - type: StorageVisualizer state: bio_jan + +# Maintenance closet +- type: entity + id: ClosetMaintenance + name: maintenance closet + parent: ClosetBase + description: It's a storage unit. + components: + - type: Appearance + visuals: + - type: StorageVisualizer + state_open: generic_open + state_closed: generic_door From 8637b01277ec13c7752888a5e442455c9125358a Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 5 Aug 2021 18:22:00 -0400 Subject: [PATCH 41/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0eccdb74b9..e900669612 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1668,3 +1668,8 @@ Entries: - {message: Added an alternate jumpsuit for Botany, type: Add} id: 297 time: '2021-08-05T10:18:05.0000000+00:00' +- author: Seth + changes: + - {message: Added two new maintenance areas, type: Add} + id: 298 + time: '2021-08-05T22:20:58.0000000+00:00' From 8ea7a3ad1f5989dec4dd81fed04ff2a7ea2fbec2 Mon Sep 17 00:00:00 2001 From: Swept Date: Fri, 6 Aug 2021 00:16:42 +0000 Subject: [PATCH 42/83] Updated meta.json to standard --- .../Doors/Windoors/glass.rsi/meta.json | 226 ++++++++++++++++-- 1 file changed, 207 insertions(+), 19 deletions(-) diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json index be6e25bae4..ea9bfdb53f 100644 --- a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json @@ -1,21 +1,209 @@ { - "name":1, - "size": {"x":32,"y":32}, - "states": - [ - {"name":"assembly2","directions":4,"delays":[[0.3,0.3],[0.3,0.3],[0.3,0.3],[0.3,0.3]]}, - {"name":"assembly1","directions":4}, - {"name":"closed","directions":4}, - {"name":"closing","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"open","directions":4}, - {"name":"opening","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"deny_unlit","directions":4,"delays":[[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1]]}, - {"name":"spark","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"closed_unlit","directions":4}, - {"name":"panel_open","directions":4}, - {"name":"welded","directions":4}, - {"name":"bolted_unlit","directions":4} - ], - "license":"CC BY-SA-3.0", - "copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi" + "name": 1, + "license": "CC BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/59b26e9715e9690903c4174cc52c49c0362f6181", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "assembly2", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3 + ], + [ + 0.3, + 0.3 + ], + [ + 0.3, + 0.3 + ], + [ + 0.3, + 0.3 + ] + ] + }, + { + "name": "assembly1", + "directions": 4 + }, + { + "name": "closed", + "directions": 4 + }, + { + "name": "closing", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "open", + "directions": 4 + }, + { + "name": "opening", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "deny_unlit", + "directions": 4, + "delays": [ + [ + 0.1, + 0.2, + 0.1 + ], + [ + 0.1, + 0.2, + 0.1 + ], + [ + 0.1, + 0.2, + 0.1 + ], + [ + 0.1, + 0.2, + 0.1 + ] + ] + }, + { + "name": "spark", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "closed_unlit", + "directions": 4 + }, + { + "name": "panel_open", + "directions": 4 + }, + { + "name": "welded", + "directions": 4 + }, + { + "name": "bolted_unlit", + "directions": 4 + } + ] } From 4c6702f17bf7db348d22dbe6a062167224620563 Mon Sep 17 00:00:00 2001 From: Swept Date: Fri, 6 Aug 2021 00:17:51 +0000 Subject: [PATCH 43/83] Update meta.json to standard --- .../Doors/Windoors/secure.rsi/meta.json | 226 ++++++++++++++++-- 1 file changed, 207 insertions(+), 19 deletions(-) diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json index be6e25bae4..3adbe09cc3 100644 --- a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json @@ -1,21 +1,209 @@ { - "name":1, - "size": {"x":32,"y":32}, - "states": - [ - {"name":"assembly2","directions":4,"delays":[[0.3,0.3],[0.3,0.3],[0.3,0.3],[0.3,0.3]]}, - {"name":"assembly1","directions":4}, - {"name":"closed","directions":4}, - {"name":"closing","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"open","directions":4}, - {"name":"opening","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"deny_unlit","directions":4,"delays":[[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1]]}, - {"name":"spark","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"closed_unlit","directions":4}, - {"name":"panel_open","directions":4}, - {"name":"welded","directions":4}, - {"name":"bolted_unlit","directions":4} - ], - "license":"CC BY-SA-3.0", - "copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi" + "name": 1, + "license": "CC BY-SA-3.0", + "copyright": "https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "assembly2", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3 + ], + [ + 0.3, + 0.3 + ], + [ + 0.3, + 0.3 + ], + [ + 0.3, + 0.3 + ] + ] + }, + { + "name": "assembly1", + "directions": 4 + }, + { + "name": "closed", + "directions": 4 + }, + { + "name": "closing", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "open", + "directions": 4 + }, + { + "name": "opening", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "deny_unlit", + "directions": 4, + "delays": [ + [ + 0.1, + 0.2, + 0.1 + ], + [ + 0.1, + 0.2, + 0.1 + ], + [ + 0.1, + 0.2, + 0.1 + ], + [ + 0.1, + 0.2, + 0.1 + ] + ] + }, + { + "name": "spark", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "closed_unlit", + "directions": 4 + }, + { + "name": "panel_open", + "directions": 4 + }, + { + "name": "welded", + "directions": 4 + }, + { + "name": "bolted_unlit", + "directions": 4 + } + ] } From fc23701fc0ac07c8e89d37e4248e834503a3f187 Mon Sep 17 00:00:00 2001 From: Kara D Date: Thu, 5 Aug 2021 17:35:14 -0700 Subject: [PATCH 44/83] a --- .../Structures/Doors/Windoors/base.yml | 112 ++++++++++++++++++ .../Structures/Doors/Windoors/windoor.yml | 47 ++++++++ 2 files changed, 159 insertions(+) create mode 100644 Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml create mode 100644 Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml new file mode 100644 index 0000000000..0f8bcc4ea4 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml @@ -0,0 +1,112 @@ +- type: entity + id: BaseWindoor + parent: BaseStructure + abstract: true + placement: + mode: SnapgridCenter + components: + - type: InteractionOutline + - type: Physics + fixtures: + - shape: + !type:PhysShapeAabb + bounds: "-0.2,-0.49,-0.49,0.49" + mass: 50 + layer: + - Impassable + - MobImpassable + - VaultImpassable + - SmallImpassable + mask: + - VaultImpassable + - type: Sprite + netsync: false + drawdepth: FloorObjects + sprite: Structures/Doors/Windoors/glass.rsi + layers: + - state: closed + map: [ "enum.DoorVisualLayers.Base" ] + - state: closed_unlit + shader: unshaded + map: [ "enum.DoorVisualLayers.BaseUnlit" ] + - state: welded + map: [ "enum.DoorVisualLayers.BaseWelded" ] + - state: bolted_unlit + shader: unshaded + map: [ "enum.DoorVisualLayers.BaseBolted" ] + - state: panel_open + map: [ "enum.WiresVisualLayers.MaintenancePanel" ] + - type: ApcPowerReceiver + - type: Damageable + resistances: glassResistances + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 200 + behaviors: + - !type:SpawnEntitiesBehavior + spawn: + ShardGlass: + min: 1 + max: 2 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: AccessReader + - type: Airlock + - type: Door + openSound: /Audio/Machines/windoor_open.ogg + closeSound: /Audio/Machines/windoor_open.ogg + denySound: /Audio/Machines/airlock_deny.ogg + - type: Wires + BoardName: "Windoor Control" + LayoutId: Airlock + - type: UserInterface + interfaces: + - key: enum.WiresUiKey.Key + type: WiresBoundUserInterface + - type: Appearance + visuals: + - type: AirlockVisualizer + hasMaintenancePanel: false + openCloseUnlit: false + delay: 0.7 + +- type: entity + id: BaseSecureWindoor + parent: BaseWindoor + abstract: true + components: + - type: Airtight + fixVacuum: true + noAirWhenFullyAirBlocked: false + airBlockedDirection: + - South + - type: Sprite + sprite: Structures/Doors/Windoors/secure.rsi + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 400 + behaviors: + - !type:SpawnEntitiesBehavior + spawn: + ShardGlass: + min: 1 + max: 2 + - !type:SpawnEntitiesBehavior + spawn: + MetalRod: + min: 1 + max: 3 + - !type:DoActsBehavior + acts: [ "Destruction" ] + +# "0.49,-0.49,-0.49,-0.2" +# to: +# (-0.2, -0.49), (-0.2, 0.49), (-0.49, 0.49), (-0.49, -0.49) +# what i want is: +# (0.49, -0.49), (0.49, -0.2), (-0.49, -0.2), (-0.49, -0.49) +# which is: +# "-0.2,-0.49,-0.49,0.49" diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml new file mode 100644 index 0000000000..57511c229c --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml @@ -0,0 +1,47 @@ +- type: entity + id: Windoor + parent: BaseWindoor + name: windoor + description: It's a window and a sliding door. Wow! + +- type: entity + id: WindoorSecure + parent: BaseSecureWindoor + name: secure windoor + description: It's a sturdy window and a sliding door. Wow! + +# Bar windoor +- type: entity + parent: Windoor + id: WindoorBarLocked + suffix: Bar, Locked + components: + - type: AccessReader + access: [["Bar"]] + +# Chemistry windoor +- type: entity + parent: WindoorSecure + id: WindoorMedicalLocked + suffix: Medical, Locked + components: + - type: AccessReader + access: [["Medical"]] + +# HOP's office windoor +- type: entity + parent: WindoorSecure + id: WindoorCommandLocked + suffix: Command, Locked + components: + - type: AccessReader + access: [["Command"]] + +# Cargo windoor +- type: entity + parent: Windoor + id: WindoorCargoLocked + suffix: Cargo, Locked + components: + - type: AccessReader + access: [["Cargo"]] From adeb1189e3390d65ff19a700c5a409edb4de6913 Mon Sep 17 00:00:00 2001 From: Kara D Date: Thu, 5 Aug 2021 17:39:51 -0700 Subject: [PATCH 45/83] Revert "Update meta.json to standard" This reverts commit 4c6702f17bf7db348d22dbe6a062167224620563. --- .../Doors/Windoors/secure.rsi/meta.json | 226 ++---------------- 1 file changed, 19 insertions(+), 207 deletions(-) diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json index 3adbe09cc3..be6e25bae4 100644 --- a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json @@ -1,209 +1,21 @@ { - "name": 1, - "license": "CC BY-SA-3.0", - "copyright": "https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "assembly2", - "directions": 4, - "delays": [ - [ - 0.3, - 0.3 - ], - [ - 0.3, - 0.3 - ], - [ - 0.3, - 0.3 - ], - [ - 0.3, - 0.3 - ] - ] - }, - { - "name": "assembly1", - "directions": 4 - }, - { - "name": "closed", - "directions": 4 - }, - { - "name": "closing", - "directions": 4, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "open", - "directions": 4 - }, - { - "name": "opening", - "directions": 4, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "deny_unlit", - "directions": 4, - "delays": [ - [ - 0.1, - 0.2, - 0.1 - ], - [ - 0.1, - 0.2, - 0.1 - ], - [ - 0.1, - 0.2, - 0.1 - ], - [ - 0.1, - 0.2, - 0.1 - ] - ] - }, - { - "name": "spark", - "directions": 4, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "closed_unlit", - "directions": 4 - }, - { - "name": "panel_open", - "directions": 4 - }, - { - "name": "welded", - "directions": 4 - }, - { - "name": "bolted_unlit", - "directions": 4 - } - ] + "name":1, + "size": {"x":32,"y":32}, + "states": + [ + {"name":"assembly2","directions":4,"delays":[[0.3,0.3],[0.3,0.3],[0.3,0.3],[0.3,0.3]]}, + {"name":"assembly1","directions":4}, + {"name":"closed","directions":4}, + {"name":"closing","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, + {"name":"open","directions":4}, + {"name":"opening","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, + {"name":"deny_unlit","directions":4,"delays":[[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1]]}, + {"name":"spark","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1]]}, + {"name":"closed_unlit","directions":4}, + {"name":"panel_open","directions":4}, + {"name":"welded","directions":4}, + {"name":"bolted_unlit","directions":4} + ], + "license":"CC BY-SA-3.0", + "copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi" } From 7bab388f55c0e2219661b7561e298e200d54d6fc Mon Sep 17 00:00:00 2001 From: Kara D Date: Thu, 5 Aug 2021 17:39:55 -0700 Subject: [PATCH 46/83] Revert "Updated meta.json to standard" This reverts commit 8ea7a3ad1f5989dec4dd81fed04ff2a7ea2fbec2. --- .../Doors/Windoors/glass.rsi/meta.json | 226 ++---------------- 1 file changed, 19 insertions(+), 207 deletions(-) diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json index ea9bfdb53f..be6e25bae4 100644 --- a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json @@ -1,209 +1,21 @@ { - "name": 1, - "license": "CC BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/59b26e9715e9690903c4174cc52c49c0362f6181", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "assembly2", - "directions": 4, - "delays": [ - [ - 0.3, - 0.3 - ], - [ - 0.3, - 0.3 - ], - [ - 0.3, - 0.3 - ], - [ - 0.3, - 0.3 - ] - ] - }, - { - "name": "assembly1", - "directions": 4 - }, - { - "name": "closed", - "directions": 4 - }, - { - "name": "closing", - "directions": 4, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "open", - "directions": 4 - }, - { - "name": "opening", - "directions": 4, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "deny_unlit", - "directions": 4, - "delays": [ - [ - 0.1, - 0.2, - 0.1 - ], - [ - 0.1, - 0.2, - 0.1 - ], - [ - 0.1, - 0.2, - 0.1 - ], - [ - 0.1, - 0.2, - 0.1 - ] - ] - }, - { - "name": "spark", - "directions": 4, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "closed_unlit", - "directions": 4 - }, - { - "name": "panel_open", - "directions": 4 - }, - { - "name": "welded", - "directions": 4 - }, - { - "name": "bolted_unlit", - "directions": 4 - } - ] + "name":1, + "size": {"x":32,"y":32}, + "states": + [ + {"name":"assembly2","directions":4,"delays":[[0.3,0.3],[0.3,0.3],[0.3,0.3],[0.3,0.3]]}, + {"name":"assembly1","directions":4}, + {"name":"closed","directions":4}, + {"name":"closing","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, + {"name":"open","directions":4}, + {"name":"opening","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, + {"name":"deny_unlit","directions":4,"delays":[[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1]]}, + {"name":"spark","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1]]}, + {"name":"closed_unlit","directions":4}, + {"name":"panel_open","directions":4}, + {"name":"welded","directions":4}, + {"name":"bolted_unlit","directions":4} + ], + "license":"CC BY-SA-3.0", + "copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi" } From a6517432359301dbeb4738b06f298376b3f53077 Mon Sep 17 00:00:00 2001 From: Kara D Date: Thu, 5 Aug 2021 17:45:49 -0700 Subject: [PATCH 47/83] fix rsi --- .../Textures/Structures/Doors/Windoors/glass.rsi/meta.json | 2 +- .../Textures/Structures/Doors/Windoors/secure.rsi/meta.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json index be6e25bae4..bcbba3b52e 100644 --- a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json @@ -16,6 +16,6 @@ {"name":"welded","directions":4}, {"name":"bolted_unlit","directions":4} ], - "license":"CC BY-SA-3.0", + "license":"CC-BY-SA-3.0", "copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi" } diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json index be6e25bae4..bcbba3b52e 100644 --- a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json @@ -16,6 +16,6 @@ {"name":"welded","directions":4}, {"name":"bolted_unlit","directions":4} ], - "license":"CC BY-SA-3.0", + "license":"CC-BY-SA-3.0", "copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi" } From e4602851876a5831ad38c1e0cda9b83e6c662237 Mon Sep 17 00:00:00 2001 From: Kara D Date: Thu, 5 Aug 2021 19:43:58 -0700 Subject: [PATCH 48/83] proper sprites + visualizes nicely --- Content.Client/Doors/AirlockVisualizer.cs | 56 ++++++--- .../Doors/Components/AirlockComponent.cs | 6 + Content.Server/Doors/Systems/AirlockSystem.cs | 4 +- .../Structures/Doors/Firelocks/firelock.yml | 2 +- .../Structures/Doors/Windoors/base.yml | 49 ++++++-- .../Structures/Doors/Windoors/windoor.yml | 1 + .../Entities/Structures/Doors/windoor.yml | 47 -------- .../Entities/Structures/Windoors/base.yml | 112 ------------------ .../Doors/Windoors/glass.rsi/bolted_unlit.png | Bin 146 -> 0 bytes .../Doors/Windoors/glass.rsi/closed_unlit.png | Bin 146 -> 0 bytes .../Doors/Windoors/glass.rsi/deny_unlit.png | Bin 1281 -> 0 bytes .../Doors/Windoors/glass.rsi/panel_open.png | Bin 146 -> 0 bytes .../Doors/Windoors/glass.rsi/spark.png | Bin 2469 -> 0 bytes .../Doors/Windoors/glass.rsi/welded.png | Bin 146 -> 0 bytes .../Doors/Windoors/secure.rsi/assembly1.png | Bin 1217 -> 0 bytes .../Doors/Windoors/secure.rsi/assembly2.png | Bin 1485 -> 0 bytes .../Windoors/secure.rsi/bolted_unlit.png | Bin 146 -> 0 bytes .../Doors/Windoors/secure.rsi/closed.png | Bin 1031 -> 0 bytes .../Windoors/secure.rsi/closed_unlit.png | Bin 146 -> 0 bytes .../Doors/Windoors/secure.rsi/closing.png | Bin 2956 -> 0 bytes .../Doors/Windoors/secure.rsi/deny_unlit.png | Bin 1448 -> 0 bytes .../Doors/Windoors/secure.rsi/meta.json | 21 ---- .../Doors/Windoors/secure.rsi/open.png | Bin 1050 -> 0 bytes .../Doors/Windoors/secure.rsi/opening.png | Bin 2998 -> 0 bytes .../Doors/Windoors/secure.rsi/panel_open.png | Bin 146 -> 0 bytes .../Doors/Windoors/secure.rsi/spark.png | Bin 2673 -> 0 bytes .../Doors/Windoors/secure.rsi/welded.png | Bin 146 -> 0 bytes .../{glass.rsi => windoor.rsi}/assembly1.png | Bin .../{glass.rsi => windoor.rsi}/assembly2.png | Bin .../Windoors/windoor.rsi/bolted_unlit.png | Bin 0 -> 141 bytes .../{glass.rsi => windoor.rsi}/closed.png | Bin .../Windoors/windoor.rsi/closed_unlit.png | Bin 0 -> 130 bytes .../{glass.rsi => windoor.rsi}/closing.png | Bin .../Windoors/windoor.rsi/closing_unlit.png | Bin 0 -> 302 bytes .../Doors/Windoors/windoor.rsi/deny_unlit.png | Bin 0 -> 176 bytes .../{glass.rsi => windoor.rsi}/meta.json | 8 +- .../{glass.rsi => windoor.rsi}/open.png | Bin .../Doors/Windoors/windoor.rsi/open_unlit.png | Bin 0 -> 132 bytes .../{glass.rsi => windoor.rsi}/opening.png | Bin .../Windoors/windoor.rsi/opening_unlit.png | Bin 0 -> 287 bytes .../Doors/Windoors/windoor.rsi/panel_open.png | Bin 0 -> 747 bytes .../Windoors/windoor.rsi/secure_underlay.png | Bin 0 -> 476 bytes .../Doors/Windoors/windoor.rsi/spark.png | Bin 0 -> 518 bytes .../Doors/Windoors/windoor.rsi/welded.png | Bin 0 -> 109 bytes 44 files changed, 91 insertions(+), 215 deletions(-) delete mode 100644 Resources/Prototypes/Entities/Structures/Doors/windoor.yml delete mode 100644 Resources/Prototypes/Entities/Structures/Windoors/base.yml delete mode 100644 Resources/Textures/Structures/Doors/Windoors/glass.rsi/bolted_unlit.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/glass.rsi/closed_unlit.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/glass.rsi/deny_unlit.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/glass.rsi/panel_open.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/glass.rsi/spark.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/glass.rsi/welded.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/assembly1.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/assembly2.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/bolted_unlit.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/closed.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/closed_unlit.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/closing.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/deny_unlit.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json delete mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/open.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/opening.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/panel_open.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/spark.png delete mode 100644 Resources/Textures/Structures/Doors/Windoors/secure.rsi/welded.png rename Resources/Textures/Structures/Doors/Windoors/{glass.rsi => windoor.rsi}/assembly1.png (100%) rename Resources/Textures/Structures/Doors/Windoors/{glass.rsi => windoor.rsi}/assembly2.png (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/windoor.rsi/bolted_unlit.png rename Resources/Textures/Structures/Doors/Windoors/{glass.rsi => windoor.rsi}/closed.png (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/windoor.rsi/closed_unlit.png rename Resources/Textures/Structures/Doors/Windoors/{glass.rsi => windoor.rsi}/closing.png (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/windoor.rsi/closing_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Windoors/windoor.rsi/deny_unlit.png rename Resources/Textures/Structures/Doors/Windoors/{glass.rsi => windoor.rsi}/meta.json (70%) rename Resources/Textures/Structures/Doors/Windoors/{glass.rsi => windoor.rsi}/open.png (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/windoor.rsi/open_unlit.png rename Resources/Textures/Structures/Doors/Windoors/{glass.rsi => windoor.rsi}/opening.png (100%) create mode 100644 Resources/Textures/Structures/Doors/Windoors/windoor.rsi/opening_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Windoors/windoor.rsi/panel_open.png create mode 100644 Resources/Textures/Structures/Doors/Windoors/windoor.rsi/secure_underlay.png create mode 100644 Resources/Textures/Structures/Doors/Windoors/windoor.rsi/spark.png create mode 100644 Resources/Textures/Structures/Doors/Windoors/windoor.rsi/welded.png diff --git a/Content.Client/Doors/AirlockVisualizer.cs b/Content.Client/Doors/AirlockVisualizer.cs index a428a5bc2e..51ff752e13 100644 --- a/Content.Client/Doors/AirlockVisualizer.cs +++ b/Content.Client/Doors/AirlockVisualizer.cs @@ -17,9 +17,26 @@ namespace Content.Client.Doors { private const string AnimationKey = "airlock_animation"; - [DataField("animation_time")] + [DataField("animationTime")] private float _delay = 0.8f; + [DataField("denyAnimationTime")] + private float _denyDelay = 0.3f; + + /// + /// Whether the maintenance panel is animated or stays static. + /// False for windoors. + /// + [DataField("animatedPanel")] + private bool _animatedPanel = true; + + /// + /// Whether the BaseUnlit layer should still be visible when the airlock + /// is opened. + /// + [DataField("openUnlitVisible")] + private bool _openUnlitVisible = false; + private Animation CloseAnimation = default!; private Animation OpenAnimation = default!; private Animation DenyAnimation = default!; @@ -38,10 +55,13 @@ namespace Content.Client.Doors flickUnlit.LayerKey = DoorVisualLayers.BaseUnlit; flickUnlit.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame("closing_unlit", 0f)); - var flickMaintenancePanel = new AnimationTrackSpriteFlick(); - CloseAnimation.AnimationTracks.Add(flickMaintenancePanel); - flickMaintenancePanel.LayerKey = WiresVisualizer.WiresVisualLayers.MaintenancePanel; - flickMaintenancePanel.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame("panel_closing", 0f)); + if (_animatedPanel) + { + var flickMaintenancePanel = new AnimationTrackSpriteFlick(); + CloseAnimation.AnimationTracks.Add(flickMaintenancePanel); + flickMaintenancePanel.LayerKey = WiresVisualizer.WiresVisualLayers.MaintenancePanel; + flickMaintenancePanel.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame("panel_closing", 0f)); + } } OpenAnimation = new Animation {Length = TimeSpan.FromSeconds(_delay)}; @@ -56,24 +76,21 @@ namespace Content.Client.Doors flickUnlit.LayerKey = DoorVisualLayers.BaseUnlit; flickUnlit.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame("opening_unlit", 0f)); - var flickMaintenancePanel = new AnimationTrackSpriteFlick(); - OpenAnimation.AnimationTracks.Add(flickMaintenancePanel); - flickMaintenancePanel.LayerKey = WiresVisualizer.WiresVisualLayers.MaintenancePanel; - flickMaintenancePanel.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame("panel_opening", 0f)); - - var sound = new AnimationTrackPlaySound(); - OpenAnimation.AnimationTracks.Add(sound); + if (_animatedPanel) + { + var flickMaintenancePanel = new AnimationTrackSpriteFlick(); + OpenAnimation.AnimationTracks.Add(flickMaintenancePanel); + flickMaintenancePanel.LayerKey = WiresVisualizer.WiresVisualLayers.MaintenancePanel; + flickMaintenancePanel.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame("panel_opening", 0f)); + } } - DenyAnimation = new Animation {Length = TimeSpan.FromSeconds(0.3f)}; + DenyAnimation = new Animation {Length = TimeSpan.FromSeconds(_denyDelay)}; { var flick = new AnimationTrackSpriteFlick(); DenyAnimation.AnimationTracks.Add(flick); flick.LayerKey = DoorVisualLayers.BaseUnlit; flick.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame("deny_unlit", 0f)); - - var sound = new AnimationTrackPlaySound(); - DenyAnimation.AnimationTracks.Add(sound); } } @@ -108,13 +125,16 @@ namespace Content.Client.Doors { case DoorVisualState.Open: sprite.LayerSetState(DoorVisualLayers.Base, "open"); - unlitVisible = false; + unlitVisible = _openUnlitVisible; + if (_openUnlitVisible) + { + sprite.LayerSetState(DoorVisualLayers.BaseUnlit, "open_unlit"); + } break; case DoorVisualState.Closed: sprite.LayerSetState(DoorVisualLayers.Base, "closed"); sprite.LayerSetState(DoorVisualLayers.BaseUnlit, "closed_unlit"); sprite.LayerSetState(DoorVisualLayers.BaseBolted, "bolted_unlit"); - sprite.LayerSetState(WiresVisualizer.WiresVisualLayers.MaintenancePanel, "panel_open"); break; case DoorVisualState.Opening: animPlayer.Play(OpenAnimation, AnimationKey); diff --git a/Content.Server/Doors/Components/AirlockComponent.cs b/Content.Server/Doors/Components/AirlockComponent.cs index dda64b4cda..83a1745daf 100644 --- a/Content.Server/Doors/Components/AirlockComponent.cs +++ b/Content.Server/Doors/Components/AirlockComponent.cs @@ -59,6 +59,12 @@ namespace Content.Server.Doors.Components [DataField("powerWiresTimeout")] public float PowerWiresTimeout = 5.0f; + /// + /// Whether the maintenance panel should be visible even if the airlock is opened. + /// + [DataField("openPanelVisible")] + public bool OpenPanelVisible = false; + private CancellationTokenSource _powerWiresPulsedTimerCancel = new(); private bool _powerWiresPulsed; diff --git a/Content.Server/Doors/Systems/AirlockSystem.cs b/Content.Server/Doors/Systems/AirlockSystem.cs index 73d6508272..8222e40b32 100644 --- a/Content.Server/Doors/Systems/AirlockSystem.cs +++ b/Content.Server/Doors/Systems/AirlockSystem.cs @@ -42,7 +42,9 @@ namespace Content.Server.Doors.Systems // Only show the maintenance panel if the airlock is closed if (component.WiresComponent != null) { - component.WiresComponent.IsPanelVisible = args.State != SharedDoorComponent.DoorState.Open; + component.WiresComponent.IsPanelVisible = + args.State != SharedDoorComponent.DoorState.Open + || component.OpenPanelVisible; } // If the door is closed, we should look if the bolt was locked while closing component.UpdateBoltLightStatus(); diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index bc416c41ec..bba134dd1b 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -64,7 +64,7 @@ - type: Appearance visuals: - type: AirlockVisualizer - animation_time: 0.6 + animationTime: 0.6 - type: WiresVisualizer - type: Wires BoardName: "Firelock Control" diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml index 0f8bcc4ea4..a17acd61c6 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml @@ -22,20 +22,20 @@ - type: Sprite netsync: false drawdepth: FloorObjects - sprite: Structures/Doors/Windoors/glass.rsi + sprite: Structures/Doors/Windoors/windoor.rsi layers: - state: closed - map: [ "enum.DoorVisualLayers.Base" ] + map: ["enum.DoorVisualLayers.Base"] - state: closed_unlit shader: unshaded - map: [ "enum.DoorVisualLayers.BaseUnlit" ] + map: ["enum.DoorVisualLayers.BaseUnlit"] - state: welded - map: [ "enum.DoorVisualLayers.BaseWelded" ] + map: ["enum.DoorVisualLayers.BaseWelded"] - state: bolted_unlit shader: unshaded - map: [ "enum.DoorVisualLayers.BaseBolted" ] + map: ["enum.DoorVisualLayers.BaseBolted"] - state: panel_open - map: [ "enum.WiresVisualLayers.MaintenancePanel" ] + map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: ApcPowerReceiver - type: Damageable resistances: glassResistances @@ -54,10 +54,14 @@ acts: [ "Destruction" ] - type: AccessReader - type: Airlock + openPanelVisible: true - type: Door - openSound: /Audio/Machines/windoor_open.ogg - closeSound: /Audio/Machines/windoor_open.ogg - denySound: /Audio/Machines/airlock_deny.ogg + openSound: + path: /Audio/Machines/windoor_open.ogg + closeSound: + path: /Audio/Machines/windoor_open.ogg + denySound: + path: /Audio/Machines/airlock_deny.ogg - type: Wires BoardName: "Windoor Control" LayoutId: Airlock @@ -68,9 +72,11 @@ - type: Appearance visuals: - type: AirlockVisualizer - hasMaintenancePanel: false - openCloseUnlit: false - delay: 0.7 + animationTime: 0.9 + denyAnimationTime: 0.4 + animatedPanel: false + openUnlitVisible: true + - type: WiresVisualizer - type: entity id: BaseSecureWindoor @@ -83,7 +89,24 @@ airBlockedDirection: - South - type: Sprite - sprite: Structures/Doors/Windoors/secure.rsi + netsync: false + drawdepth: FloorObjects + sprite: Structures/Doors/Windoors/windoor.rsi + layers: + - state: secure_underlay + - state: closed + map: [ "enum.DoorVisualLayers.Base" ] + - state: closed_unlit + shader: unshaded + map: [ "enum.DoorVisualLayers.BaseUnlit" ] + - state: welded + map: [ "enum.DoorVisualLayers.BaseWelded" ] + - state: bolted_unlit + shader: unshaded + map: [ "enum.DoorVisualLayers.BaseBolted" ] + - state: panel_open + map: [ "enum.WiresVisualLayers.MaintenancePanel" ] + visible: false - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml index 57511c229c..31debff337 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml @@ -10,6 +10,7 @@ name: secure windoor description: It's a sturdy window and a sliding door. Wow! +# TODO remove these with parameterized prototypes/whatever we end up doing # Bar windoor - type: entity parent: Windoor diff --git a/Resources/Prototypes/Entities/Structures/Doors/windoor.yml b/Resources/Prototypes/Entities/Structures/Doors/windoor.yml deleted file mode 100644 index 57511c229c..0000000000 --- a/Resources/Prototypes/Entities/Structures/Doors/windoor.yml +++ /dev/null @@ -1,47 +0,0 @@ -- type: entity - id: Windoor - parent: BaseWindoor - name: windoor - description: It's a window and a sliding door. Wow! - -- type: entity - id: WindoorSecure - parent: BaseSecureWindoor - name: secure windoor - description: It's a sturdy window and a sliding door. Wow! - -# Bar windoor -- type: entity - parent: Windoor - id: WindoorBarLocked - suffix: Bar, Locked - components: - - type: AccessReader - access: [["Bar"]] - -# Chemistry windoor -- type: entity - parent: WindoorSecure - id: WindoorMedicalLocked - suffix: Medical, Locked - components: - - type: AccessReader - access: [["Medical"]] - -# HOP's office windoor -- type: entity - parent: WindoorSecure - id: WindoorCommandLocked - suffix: Command, Locked - components: - - type: AccessReader - access: [["Command"]] - -# Cargo windoor -- type: entity - parent: Windoor - id: WindoorCargoLocked - suffix: Cargo, Locked - components: - - type: AccessReader - access: [["Cargo"]] diff --git a/Resources/Prototypes/Entities/Structures/Windoors/base.yml b/Resources/Prototypes/Entities/Structures/Windoors/base.yml deleted file mode 100644 index ccb3fe258c..0000000000 --- a/Resources/Prototypes/Entities/Structures/Windoors/base.yml +++ /dev/null @@ -1,112 +0,0 @@ -- type: entity - id: BaseWindoor - parent: BaseStructure - abstract: true - placement: - mode: SnapgridCenter - components: - - type: InteractionOutline - - type: Physics - fixtures: - - shape: - !type:PhysShapeAabb - bounds: "-0.2,-0.49,-0.49,0.49" - mass: 50 - layer: - - Impassable - - MobImpassable - - VaultImpassable - - SmallImpassable - mask: - - VaultImpassable - - type: Sprite - netsync: false - drawdepth: FloorObjects - sprite: Structures/Doors/Windoors/glass.rsi - layers: - - state: closed - map: [ "enum.DoorVisualLayers.Base" ] - - state: closed_unlit - shader: unshaded - map: [ "enum.DoorVisualLayers.BaseUnlit" ] - - state: welded - map: [ "enum.DoorVisualLayers.BaseWelded" ] - - state: bolted_unlit - shader: unshaded - map: [ "enum.DoorVisualLayers.BaseBolted" ] - - state: panel_open - map: [ "enum.WiresVisualLayers.MaintenancePanel" ] - - type: ApcPowerReceiver - - type: Damageable - resistances: glassResistances - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 200 - behaviors: - - !type:SpawnEntitiesBehavior - spawn: - ShardGlass: - min: 1 - max: 2 - - !type:DoActsBehavior - acts: [ "Destruction" ] - - type: AccessReader - - type: Airlock - - type: Door - - type: Wires - BoardName: "Windoor Control" - LayoutId: Airlock - - type: UserInterface - interfaces: - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface - - type: Appearance - visuals: - - type: AirlockVisualizer - open_sound: /Audio/Machines/windoor_open.ogg - close_sound: /Audio/Machines/windoor_open.ogg - deny_sound: /Audio/Machines/airlock_deny.ogg - hasMaintenancePanel: false - openCloseUnlit: false - delay: 0.7 - -- type: entity - id: BaseSecureWindoor - parent: BaseWindoor - abstract: true - components: - - type: Airtight - fixVacuum: true - noAirWhenFullyAirBlocked: false - airBlockedDirection: - - South - - type: Sprite - sprite: Structures/Doors/Windoors/secure.rsi - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 400 - behaviors: - - !type:SpawnEntitiesBehavior - spawn: - ShardGlass: - min: 1 - max: 2 - - !type:SpawnEntitiesBehavior - spawn: - MetalRod: - min: 1 - max: 3 - - !type:DoActsBehavior - acts: [ "Destruction" ] - -# "0.49,-0.49,-0.49,-0.2" -# to: -# (-0.2, -0.49), (-0.2, 0.49), (-0.49, 0.49), (-0.49, -0.49) -# what i want is: -# (0.49, -0.49), (0.49, -0.2), (-0.49, -0.2), (-0.49, -0.49) -# which is: -# "-0.2,-0.49,-0.49,0.49" diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/bolted_unlit.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/bolted_unlit.png deleted file mode 100644 index f154b0f50b0006144faf4797f45429cf6f6ac084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpt`4vV@O5Z+k=d}K;EGR-~Ds>%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/closed_unlit.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/closed_unlit.png deleted file mode 100644 index f154b0f50b0006144faf4797f45429cf6f6ac084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpt`4vV@O5Z+k=d}K;EGR-~Ds>%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/deny_unlit.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/deny_unlit.png deleted file mode 100644 index ec9fccfd59d724472fa49e45a0fdfaa61c2b45ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1281 zcmeAS@N?(olHy`uVBq!ia0vp^2|(Py!3HG1+{xJmq&N#aB8wRq_>O=u<5X=vX$A(C z&7LlfAr*7p&OPWY5-4+g{x1WagQahUG)}KlED_Lsp-}N=L)|!(J?Ix{?i=hXnq+ESwzO?6dmcZNhyT9#|FGw#v+TZ{F z_t`y?_x5aTb4X-JkYJEtV`yV+Ad|UqV?>VmM2|DeF2CG$?%cTo!_=-F@-P{j(`&Sl{ohF=hPo^X>NMyQ|&V@7EhXow|I}_xbfTSzV_$?BTh) z@6zRK*U~oKTyyc8euaMRJbM|w*)j+8^$&i#J(E9wx0aUHnQz~=UAz^yr{?bcG832H z*LAbc>dlVPOJB3~)$LWUq8{(M-*&jv)w`%a0_zTG~59&brzd=FQvQ(95crTr31-%jr?)ZhDE{MoZV-Gwi{-A*xz42zG? zH#w1FlzQ-e@X9Iwm%iLz`awS6yZn{q6><&aM+zh^r!qVVi`Xe0n3i-pC1Pg3R@_Y`T-W-;2TMtN*hHruKS^AShBqJ_ z&gmew`m@>L6>uICur!yjv`ahpfIw+lWH$W`oEaPAIt@rsK z-21S5;?$ov*Ik_&`v36tX8u1*f>wsi{K@|2@7&|%k67)?Z@y;_2(2xuPP2QvUPZ4v z(tGErOS_^(KKWPttH1PX|Cel#DZj&RMiq3ZJiT=5)~olsO*Ed!n^!5^-e1qdA*Zm; zzRK{=tB1XEi#_($|9R!QB7XJX-;7V@tE^eOR?_#=-@g+()|Byn&fdB|ftBN@cCEN{ z_}})h2D5d)_}4Pz#(b5x5On_L5dN2)$pJ*!ur+`&p+LnR;@_DksERCaw7rnJU%o+S zVaJ)I;)_py&%7;eFqduH*Sh%P=F@JB*Z+P? tv$=QW-re7p``M2?{+QNVf1va~za8hj+}rPOr2xw`22WQ%mvv4FO#n$+QjY)t diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/panel_open.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/panel_open.png deleted file mode 100644 index f154b0f50b0006144faf4797f45429cf6f6ac084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpt`4vV@O5Z+k=d}K;EGR-~Ds>%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/spark.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/spark.png deleted file mode 100644 index d95187f082b998a361f8f2beece2e6a5f306d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2469 zcmbuBdpOkF8pn;9%BV4Fq+)AEhjGbvon&g~H)(|9G7W80)S*!kiG!k;i*7CzBFTLu zj1;;Uq)>8+%(xE`mAgTkjNzxB*<(NFIe(t>$NuAezt39h^R9P2&-y;=SusbPY*317 zigI#tC_7uSvrIW_p|D<-Zwb7Al?gJ?_IR+IoYMQXfFr5E%uC8wULT_o#h|BAo zoKw$vyq+hOulqMCDWx?uG<+BvJDZ!ws!!hL(38Q4tYi)YtsBB6-tj3ZZa6TTwRo`$ z{4NHv4mhp8I@dDm4Wb{^+pjwJf%B`|ZhKs6@(@Ue7x_Ist}cZ~H#tjJp2b!^bGKoM zG=?(|lyo_WO5DntBbMe|#%lIcNDc8lDKk;n8lS`f%PZxd-TXQTd))fV$_Fz2h21HR z2A~Gi$9ut*N^ENOc;(iW&iRRIs%OpyyGz_tnT?F_kFka0K;coP^x?+%bS=BC@;&w` zJEj_QSr;3F3nq2)Iw}W$$u{eki0*f%&Utmk9|tN=e@0b}Mx9o|^@F4KDeM<&?Q7BsEH69mJ?b?!;lHUZfg34-Csssy#2(tF<%=tL zHFEyi>#s?~a)-l`^NNuN&w!&Yl z6u4a|v6k#I2(`HGY!P}1DfI6Jouqu##Muk-K8{4I9tvS)c^<8gEX;OFqRTfOt<%Lk zWIpT@NWS4KNAFXst8yrm(xm@HmXJT{Gge{H|vX zBs?zh-Wo3W0(a%q$hs2HATJE`J6p5YwT=Lk%0k~}7 zSDJ@;oo0!e*s-ilFgJH{)!+J}xH?1Jp7BI$j>exX{+UGVm3UnND=$zz6esgA1Kl(e zPxlchthKc@pKHXhXqifXeu3OBmBdLxA&V=eP*c3ka}R#MVBxf#34ySXt{PBzt9m~E zUGFN1)}39F&l-&FQUR=n9b8SDrDpvFn%wQBDNtDOl+fUS4sA08TKa<>OQSYxCtdVBjr;^^qByu5lJs-rZ`Pw2!N8b8RP*P^By(`hw6{HpA* zi;d~%&z&)kQJbMRl%b)?{Scyiucqc==Z%No(|$~}=RRH;n~IlyKf)7#&dv3$RbH92 zY7eD!#NEEl<=Iq#v))Tk&N!QB;;}K40=!pWM__B?t|o{(ZP8A6PZHR44W1`JY_i2( z4&*GPvLh$lTZo)cnGb?V8}Obuu*Vek#%t};|Mmz&2TtmO=b8}KnZc7S}D;o+Ly6k`DLr zhN}+)||EH?8hAR0R8>l~#o1?==IB(zeDzVehOO zSOGMlb1yWb8(YRH0*xEMkEOc~ z0@$r!wv4Kdf8Vz-8m?xiys|`fP;WbcJ~|!M876-N0Tl)Ug zeT?TsJaHCenqdO(=+rW{UCIxTV-{6sJgGiE{M4AywM0GYNLoIoJ);pLcJt8%Wd%6- zDK9ZKBWRZz1K|vOLwwvx?xol;3|>@k?70bMz}5I~xA0-fr{tZnikJlO$OCp))H}o@ zOBFm$oMQ|tMBhN#GISkCQ-}T!k_z*hEy%UJ|B-DX>7-)qpBv3HU-gRHwMLs(Ch0<( jqyhEIz{zRQhY9%__uUoxH diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/welded.png b/Resources/Textures/Structures/Doors/Windoors/glass.rsi/welded.png deleted file mode 100644 index f154b0f50b0006144faf4797f45429cf6f6ac084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpt`4vV@O5Z+k=d}K;EGR-~Ds>%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/assembly1.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/assembly1.png deleted file mode 100644 index 7d9ec61ecc00f030d54bb594f21d85c5866bee5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1217 zcmV;y1U~zTP)(MuH6V_`q^AQe3*y@b7)AQQcXwmVB1wHs3Sm)kVo)oatRYJqp| zFgxGN-8){HJ>Q=DopbJ)QAsik!!Q*^c|SBXRJpyevC8fHODEvW%}3PI(pX1oF~v_` z%Pn2LgtlzjLT$~zC|YxXtuc~M*eGHyoq(|)-{|p!7nIB8C=?2@d0E*~YKonp`g)Bf zCx6n;U6Dfw2ci0|EEQqOD7;2jVd)YHD-BvIaO3t z(7?a|X_`igt}Eu+wI{?Z8mlF8&>1}1dfY^Ohl$70Q9PfxcH5Sv-PugyK*m25+Ks$o$w?9ZXzIn3LF6eRNx2* zpaMrgK)#D2ix00MF99&#UW@>KB_%HbPUBIRD?R@72u1)ukN|XDr(2qa59G#yglwqx z#zZ_G4>vS4P&S*LHa?YNM^Y9GMWVid#q2MV2-V)0Shu5vT|C-)m}t5&k;7c%p(Lf# zQoT#HHzukoRaX^+h(?5SE<3)eXiSK{2|_KR4FngOgKY=T1Nmk& z8j7x2lY=0>eXA26(G_wdL<%p4kYvHb5NZ)^Ah^&RY&%@X8f=NC*aaqx&<3_eX1qi+ zgcE=a6Wa@U1_Tz-27(LV`s$f=5JW@;jBdh}au^vVk}TvI2(^ed5L~V~5JNo7z&!wS zgWQ2|0#I8Zy#|nE0q_Jw8#{dI0jMfbSfRE+dW{SdNfz=9gjxJ|S0=n!m)9ioSAMbnf-n>7)neWY)jrR3WlHVr}0DzL` zDL0Ii!=)h0LZowJE~ZmTa=25$cmUY*>@R?d&GzU3fDFmg&G}41#ivTYOXtsOF&V#g zAG-Vv4|e}#t^PPl#ryUpXPBwWWt13JSD=N{FTl9kGf4;A(YxH4l!>%k3Pxw+RO;K& zb4BfDOh;x&nPXzQdkn_K$Y(ZDn?2{K?@v)5N{(8rYVGK-(q}-~^P+i?fG*lqSXThT z4goD#AlQ~{u8q21Ebetb)c~j5g3D000sAb52B|lXm zGPR;r;)fVeerj!Ai}^_bkH>$4!{H4QiGUFEQGED9T&O|J9%P7w@{A%~ zWCBYv8jD-Mc|c*GxoE7qDpjO^Qf?|7-{teR!gTE=hQ!B z*_%NrlM`*Td-gkB?deI4|1@(WdF7>pH2ao7Y;J1{(!ORC9W*?75G=z;lJgncT+@}n7>-gPrQu{UwLR?q#B%fN|9Hl*996p z>dMi(ww@2UFF76RzzKN{Hs&Sh8e#^h( zY3(}EEh#I~>_}Db@6f&1*7T3d8Oxk@aZG+^n18nwffM%yh^LiMj}DJip@hiOB=l~| z(eo>d2z~6il3OX*bITvI8w6AxvcJb%9}FC=!f8ZrrE}EOQHC{1Yy?dibyzm%6&jZD zN_WH6%a{MF-*tFqr?Gl%tmX1%<%3dCU9L;wMZO&F28L9^5e!es9^`3&2U943ZI})D ze@GLX>Y1n)ef(#&w}E?{{3b2bdoxI$a0Z$u+y}zaBY?6dm47Ty3(Yop(_O$4@{T;F zU7(gOH1>PV@0e)%Gb3K|A6uyMQrTT9WZ~-A(v(9c^gH54F~dgYLeQBks4M+*C8+f7 zI`t+;t+!M!l@+}^PnZLGq_ucB%%+!P2tf@a#scXPWD`iji$F!|ai`v>FNz5?eF>|B zyQK@3Mv$jcn1H|HdU=yp_>H|_Cvkk%3DHclJ%2LS{xhemcss}E<18#Py|*$^bJIsK zOn_9JAWUkKM6aLX7JNyPVvA65|9V_aL6q~!Qz&t5)@#hU)Umq0{YmL%iu*i%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/closed.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/closed.png deleted file mode 100644 index f4e59a2af373feaf23160dd15a9b8f5a8f55e1ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmV+i1o-=jP)Qv-MLTH`gtZFVgb-nxxzX$gbUQ*x1R}JkY;4p*MQ74NH0Sx6?~Zqv#wntF_sYEc zZO+_x2i|+%ocosXxf)1_r`BHa3QKe7u>AU*j(I1o(V@8XSB@>nkxb41+$rk5lC1B$=kk$B2)6 zpa0WX;CJ(9o6f5zU}a^QKg`DWI3*GZVvN}u-AfUgpPS?N?wNd}o`B+FPx6;3p!Gck z>0ij!SXNG@hYYe7gp61aKEFSL>1`iyppN{ zovFDd@ueLe2m2~bzu!->SWGt4ZN(DHaZT2}_$V4<6{e|pE zB;qUrazPV74u>Xy91cwYIUJe*ayT>r+0(Gk(6q%Y-0i!?LL&elRlJmQ`^aUQVEuAO#F`#@welL4~Emn z(yGB!8WZ2%hDkM;oyLSfE@MJiQzIk8q!KLKn2>8uu99l7oW{f!>@p_A7-%E4U^0ve zlv-392re`S%MO_b@~uF?xc6erEGpVdJvT2?%eC9Iwzf()E}i4LVfQ{k%0>tohEj`a zlhT3$zU*)v^Io4tecg|eL`~Ds(wwCW0?SvEpu*1YA3onUMhzLOxnuE{CjPi;K9{c-WQgnLSIPCSB zWHY4x7r@J5T_d8}WCEmYlvJlP0a#vMw*8r;5rEQ%9ihkoQEJ6pZ}(7|99}j%x0{)E zKv@Q4BXfDkgfs%M&a*Y3DPt~^oXk19v1>8_$m0k#u>RyY`)Xox~j z5ZYqU86uh^EX%6t>Uzel^He9vCSiQ6qrHYC;3pb}$uNRux%2=4002ovPDHLkV1l>D B&%^)# diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/closed_unlit.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/closed_unlit.png deleted file mode 100644 index f154b0f50b0006144faf4797f45429cf6f6ac084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpt`4vV@O5Z+k=d}K;EGR-~Ds>%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/closing.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/closing.png deleted file mode 100644 index a08434c90cf5ce2f5552d39f479d203f7fd79c6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2956 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 diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/deny_unlit.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/deny_unlit.png deleted file mode 100644 index 2c18f9a5b124d87d37df4a50ddcbad5fa97e4353..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1448 zcmbVMSyYk<82yn1QxOVNTywIMPA(0VPT3f^Btnc!xi3ZJWSVQFj@yXZbS85$D@__H z47Ej+%#;#E=P06+TW&bvGNqFNiK&<;mKf}LUS=Ndckj9PyHDRa-{k;598BL_9{>Ot z-q-t>mPuMr^&r|QpGs)e(&iN3a0&nzb#DMv=3rz20J;%)Z;zlKD;MehXQP5q{Eoh< z$u~P_#2P2^)~(8^eDR^p|X+aRj`C@@@B5V5TM0_0Q^zaU{ z;j@6bYJ5E2fUXK8oQ_@Tf4_rHBytoFle}9b2y`QqwvKr0|2MoPqY2TWj{rcAoWX`Fj znNu3LoqveqmAPD{_1a=t-J%JXCzb3LJv=@;IYJ&N;@@*Ihbb@28_b?bQ!V2b98)9T zKXmtxe6L7KP5u3D+b2QgxHOI8Fn6pxQQ7<`nnqvC=v=~tu!h%D#uN=qCWTLPjclz; z9H=@pUb~+@%j=T;*_@^7ZyFNOnqrv~85D|3aefG~aywJT&EUE}QRWi`Sj#=^r>hj9 zQ+n?D>#D-?K^-5X4xZSNG@p_#;0$__$ApC_8f)VsKCN}0B1*>o~*~FEY zC>Rm-Bl1yr7Q)sR+}jK6-AgStwE6GS!?1IQUUj}L(yXtu7k7kU^JK+yr_bNvm|sA? zYA>V1Bb}i)f}ws!;b(PYr3^B+nfvVEnb)Sam8{hs;0^J83TnW2lduuhMxB|)&PNve1LmVKy@-qM#{(RYhj5H|NBvuuEDKjz zcb|hMo%AdwfS@b7&yeL#hLcX4Ej~V$CugW>7SvZ2UqVLEo|Z-I%lL#72%RxV{gyRt zIzxr?+O8!`XK}2u7hFV|x7q1)J!#p>vW1-P&unEvjYhMAp=#9N2s~9i1N7s!pwiz@iA6{|-ieoV=bMC@ZXHC^=LkfPRSG3i^NJ3bn3y;k zH%hX>s!I7gakF6l!qryZWLii!YjzAgB8Y)BO1|Y&{Ci~T*ARP1SRk5Fg<_x(CA04vA{bDa(TPu$Fe05fUewlTqN4)5jlHy*W35u}RMr3WXVq zoTH}PmJ2uQ)k8mciR{N<3r;|zl)DoTxoUZE?r0rT>0f!~g&Q diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json deleted file mode 100644 index bcbba3b52e..0000000000 --- a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/meta.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name":1, - "size": {"x":32,"y":32}, - "states": - [ - {"name":"assembly2","directions":4,"delays":[[0.3,0.3],[0.3,0.3],[0.3,0.3],[0.3,0.3]]}, - {"name":"assembly1","directions":4}, - {"name":"closed","directions":4}, - {"name":"closing","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"open","directions":4}, - {"name":"opening","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"deny_unlit","directions":4,"delays":[[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1]]}, - {"name":"spark","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"closed_unlit","directions":4}, - {"name":"panel_open","directions":4}, - {"name":"welded","directions":4}, - {"name":"bolted_unlit","directions":4} - ], - "license":"CC-BY-SA-3.0", - "copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi" -} diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/open.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/open.png deleted file mode 100644 index b583cf7fe0e2ab0236698470caaab05a099f7d6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1050 zcmV+#1m*jQP)%7KP9sZK4(}3$17|WV9&S$g~qdly)*UzM+hq5i$Ioaq_$Q;w35tzISEb z{Wf>b<-(o&y>q{F?mh2mkPKbdGcK2Fd}3mvD#!Dw4nM@#+O2Lze;``K;=<6FFM(j%zi%Uz$&&#v4l}>=qS0bK# zdVd*854n-i@^Jdp89eLlL2j-`JSi(%=>!z)@lpfC@5fJGh<0&t9v?s4a)t)n?QVw= z1)_stug~X0?_e06lap@U800=G8Y^t+1o-`aS0E6`6crVrxVRW2BO?d~gKz<>cFZrG z03sHPxy*Jn8ntciT|t0MC<5ScC<5ScC<5ScC<5ScC<5ScC<5ScC<5Sc2m*`?31W0~ zR9r}`oylEr05o%9A`}XF>+9>0OeT>5a_sm6cHR7J1hhFV4&3NAH=+m4<`@-u$F z+h0+UrXY@ujlyX4c-(DAh_pNtWRgV>W2j}cq2N+;xb4`_G29YO%{PTGQX9k;S@#mF zVL1WJFuA>$XHZ}nZ78?|`wy&-qaZRWu(cDmoCTO+GRb0|!BER+L%}sPhhoT=84M4g zt-~HzP5{pqOs@$hSp+?S(Z-Cd^#C5Mc(!1A%?y)C7V`{-S_4_F0X$WTgVoyEg6TCg zOeR^(Gt9`%W(^>?uNmTuMVj|{R%?J6T%57U&5+d|zr$}VFRr8?#`2fnw%SF+o>rw~GJKJWuy1Kkp|1aqt zP*qixn9}23dcaCa@Q)|3e|B~@dkEM{12UORHS2_Y^4gl{v88>ayS;kj=X6%!7ZOvl UucH5vB>(^b07*qoM6N<$f|W+rRR910 diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/opening.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/opening.png deleted file mode 100644 index e162ef9d399b9b20f8cf44586ffaae6ce2ed76c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2998 zcmb_edpr|-7vGF6n(+x~JZvfQP|2lem?=VuNhO!8Bv~FN=9byUa_NyA+r4OhVZJsJ`eIFJ zy=ye9+c_XLmHx&!R0j!=wgyVMV5t~oWu&5v%r=|+69`#wH+lr9!|r6L-P)i1(ul#X+Pf5sK6uhOP9fFn95kk8AnNI-B+;tM_j9j!*;ft zY`S%u@QAmS#Zn+@bE3n!zXcNuKFzmUHMG;T8W}sKS^h5u-G@vUp8eT-b5 zMKnsRY!Y=}t-nc(Ul~;j!zGJK9VnkWSAJ85a~OrrjSN?uH^mzlqH!lRRgHE0eOw)) zYhoi;aU>y0tEs;L%8cOp7yOda1_n7YbH5vZ^^}n5` zRg-ORiYH7gpVeZ8lZ5O4Y^c03mSb?u<7VSYR=BD79(T2or`^q6_?q1=lrl+qRq$uW z+f;T%Pok9cgAzcjt}X^CC#RSc_rJRD%cbfpDNfAozCTP5{VNtP_lAj8R$0qZrv4~I z|5uBblc-t7tFsTT6`@Z~O-U6V{e9svE88pkq&Csr+M^d@VyN(RIOS7Y1fi^(M|jt` zmb<7u=mOl4z9$S_(j66C9dxH*_M9E^)H1FdI%rI~4E_c7_3GT|H>exR<2sZg-$9OJTeKC4+7$$D% zEF<&B`AUfa!|fw0(f5l}wtenoVVM$&Qv!9xz@KYf%^ITEd&cOr z`02q=tMbx;Bd6~Rf(zHpf9(7`-uFU&pqirR!Aq=t&2n@X9YNo^5y3_rA`@P-TJ4G) zdTSzn=OkG0#+K1K$Qpy>(T4`yBboRb$#kUd92yot9K$f;`HoyhbEnB<4kVjx2t<)` zMc^3shSI+xwHrz~<|SG);b`y1tt&m@%@PIA*G~(Wf}gG#qwtF55JKSbrRXPp)YsF) zsZSAK`scS;=aNtt=}*Y6^l8*$-3xGva7kRD|VJy~B0LUcml-6VML8eGEj}$NvKrK-`W(DuUpO zNi^8Db_`g0q68#mm=26Jo1tQ$z8ECzzu?Dx)ayNxxpLtj^9-vl<4}KZIbR2+^gzpn z6cSIx2w4jrWxq9zx&fJFISG2LWaJcg#djXywR_SfkK(jZflL%fnkFTEV%&YyA}Dv? z{Bovjk+91Z!4G%SB*jYr7us~xN8>cJal8Vl&2luL$8``(ZBesGiM5OSs-R#Cl+s^R z25Tm?^ZXQId3?TqUG(yD*EV=0T}G2q<|rw3Ryp zSUeThV(W|KX8^|$Lvc`hNkVcD#IZN=r+{c4KDSMfpI`XKk#j*WtFE{D=O%8Ycs;aj za4ef=Ziq++pD1KsPd$&O_&c{Zt)lhFmQw)Ak* z_Tthj6}S>k8UumoyLchR;L@1Sxoc+}-$wZ^jKtK#kQr&D-=58C)0{K66Bb79-#q;B zQN+PdDN`YtDylOBgJR5wDI=9+TaTNj>(Lz_2s9wEWn_-Zxt_DNh3>IO|Hl1v;`sZ!+vE zu`B>`@dH3E;YTI_Uf0jks2yms&jOx_a<#l%9* zVxel+S_G7f)?i{Kh`B1vvCaU>!p|Df9)M7DYrAP$ptlBj)}MgmH3DrTT_dFE0bE%_ zQCv<|hbzMs$u3qXNr;>Qef;fjyze2xhL*;m6fzNc3}UiPl8i@6$~m2Aq)2=fL&We^ zCg8z-e&rztbpLvfbk;1YT(pt-GO8+iPF{kU9XS%d!Pumu3q-P$gMlRHxu%8-akwsn zB4FF0As!DW#=C+AOxMoU?|l0A;`^~AM>iIM70OJ|6GSVlA7*9RZu zfAKE1h-M~u4<7^&f^# z?8}L@te1covXcxAs%v)~va)nkMUIGpPe>KyEDGK6eTBjU^01)lu(3S>RV$*1G!JeI z`pa_=)5eGflTS1`EZ}-T&^P9Q8T-nG_Q%0cDXZeF)#kJfXvA2ychQ5Bk9?{@!aJ@S zSUs8^gVTb0Nr1e;N2#{B#pS|3cDj-WVzV|UyYESV+;J!6GTPgi@-;SP6To*;OpvfM dyH>afqU6Y(E^q|-N%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/spark.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/spark.png deleted file mode 100644 index 1642b04c4125a0ab3b36c87a9c6fb86faff761e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2673 zcmbtWc{tQ-8=fIVG?u0m8Cwyjk0K+>&sYj&OUQDD$eJvL#xgS|oubl_q#}E=WG6~TFy$_rmtfeH5 zNI)PEDO(#WXF)C4jlH6R{D>TMQc%PrZ9JkNko{e|0nOCjuKl{%1DiT9I9}HhTVq;m+cZ5--;$=T)kGyVbJ9^-n)&udd=5HmG=@6all+F8H z-uhpxBx5QJRvsoQ%a5c?*uQwAfD8#6wkQ;7s#nizd{X2QZ@zuN4el4n&SW~zNn3H^{jf`q-Ma}Mr1;V z7NfF3u`r8byf;!ySSwD>J#^`DGWgAM2t$_^UOm4o8zQutTo`e^qb96bh1XxNFrU{- z>>FRFk;h<1b99aO#_=$)R15adHlJf`oHXd@kYkwcrj@DI^Xt*pY9f(1vLxES#`vYu zyWI%gdb`RF?+xhFjra?AbH%JJCb20R?90;Q_v5!VK9u?g2A+SazR_}n|EKYhk^ zL<#lBuzKrx+EzDR0i)r=853@1?|ZypeL3hJc$2O{Hfwa9L=Sc}Ok7w`63t^1^FHi* zjmLt0Z(S>jcn(iz?j*vmD2mp$?{O)EjU_A88cIfP>0G|GSz`@kPT;L8@avPzlRePjXIw_tdo+ZTeAUX7AZ0{787rQ8)oofxEt#ust50(n3u3W(Uw zq>Oz)J2O~0>tN=4uzN;jvjC;SLPbieh%%KNnmAqy6CpCl;S z4D}R}ZvEb<%X^e|H*1BSVc5;1#r7Pp!z*4ybURaiNbwGYqb^R)p~}Qgmz!Pjp}sy{ zpf>hiUS-uf1f{+d*6!n&(D)fd;XB$mX6Af#m)d z?^xS0&hoY&su#4i7O)3{W2ka=-!EA!)GLtAldINys`I<@$U%3S4th?p_Y8&&zHys# zGsW0}whS)zc_*qxDqeNj*-I+ag5p@onw_k0Cpy+Mf{n%OiNG z8@cdr8Sue)wG!bAf%TKm{b0rP=d``|-okR_k_zP01Iy7tB3)NdA|4`_TJAES8>R)< zLW(oeS1Sp=E*ETqwjmOB`eA$jZRHtV2gHFtJYJAyS(1Il6>ac+8U#=UUTEQUa{x_vbh_Z|tHNvo{T|wKR~MnU7sJ_t>}x@=Y); zhP02o?UOi#>~%OR@?Zs@Z+Cno(dUP&VjNCR*zIK+vSz38XnEVa?H5v(N-wD1G_^F~ z7BM)wH-9H~++WmJn`bH3^9m$2b#@VY{w0^qlDc(8OK+(mpvoDna5eBhlam<+_R6cu;?${ch1M2 zyAgv#YNs>vqvQf74Dv~2O*uW```M0%lJEw{o3OAdyYG z%>P1V+-Q~M1~GlrE^Ld_-+VcLISHjZV&1GEjJAS;VJVdFfgM<2GTP_~z?m=e0MM6w zSSz=~*3*-TYseuoIUj8Y(E1W{?z^FiNl4*E*6e|3U~0Oqi813j&sxy9rSmKesju&1 zocS)XNNjrtXL-inMVef|ZkN~ffllLtk~b$gznDz%a|GUaG&{5X+HEd2?%<~-`syke z`R6>%sM=%t#MhBSRxj9}>^P)uPNAT;_9YAn0GF~%rt&-&Miz+I4D!P}^bw9XHD)ci zu_4*jE9;4BkHSYJ&^12NXxbKK?2I48(@gKG2Qax9k(copbEAb3oANV&X7N4jfZQD% zwZo@+2g{AF+SI}Dr)-;_-~q(9R$8;G_ts~`X&xM@6gJ(lB`J12Gp+e8|8Sl1u2+t? z0SvLzn*jW*&HEUjU7;wY3_f&oDAiHA3DU=^LgRicXdTm=@nf!FvkUAJH`{ZIq}u4S zSp41qFqE`eHc4r$FRyW5`w##qKkX+x`kc%PNIK0Uu^VPnNEJR=cpBJZ0-5If0W+hX z;;)b@`xZL60OXwDwyo4Zv)V|%dT4cHO|)^=03ve5HU98`q&o*aQ~fncYKaB;`2;ui zN(J!rEL_)2HXQe{8$<_df|`q)gi}D;dE8G?qD4bN%51eN!YQ*|d@=zQT1HlK8ozst z0e$Q%QVbm65GcvNN!Z{t8PIarJ@^yQXO6M< diff --git a/Resources/Textures/Structures/Doors/Windoors/secure.rsi/welded.png b/Resources/Textures/Structures/Doors/Windoors/secure.rsi/welded.png deleted file mode 100644 index f154b0f50b0006144faf4797f45429cf6f6ac084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpt`4vV@O5Z+k=d}K;EGR-~Ds>%oTu4Wbhz{ X*TI2-k-OMW79{NH>gTe~DWM4ftD_#8 diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/assembly1.png b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/assembly1.png similarity index 100% rename from Resources/Textures/Structures/Doors/Windoors/glass.rsi/assembly1.png rename to Resources/Textures/Structures/Doors/Windoors/windoor.rsi/assembly1.png diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/assembly2.png b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/assembly2.png similarity index 100% rename from Resources/Textures/Structures/Doors/Windoors/glass.rsi/assembly2.png rename to Resources/Textures/Structures/Doors/Windoors/windoor.rsi/assembly2.png diff --git a/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/bolted_unlit.png b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/bolted_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca98a410d0ed011a59a8773cbf8fdf40ee2c7fa GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|+&x_!Ln`LH zy|s~-L4kwCA^ApqNZ0|^HAh=^v(9@pJ6$(nR?mu_74NKpY8eeaKJ3~@5ia!4;Wkrpv>c2tw~67~S8@*wVm$zO_ds_Y?B rD5QY?U)$s=`xuY-`CsY~G7ZJjQ~U)l7WAxq2NLvj^>bP0l+XkK<0dRg literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json similarity index 70% rename from Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json rename to Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json index bcbba3b52e..71193ffebe 100644 --- a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json @@ -6,15 +6,19 @@ {"name":"assembly2","directions":4,"delays":[[0.3,0.3],[0.3,0.3],[0.3,0.3],[0.3,0.3]]}, {"name":"assembly1","directions":4}, {"name":"closed","directions":4}, + {"name":"closed_unlit","directions":4}, {"name":"closing","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, + {"name":"closing_unlit","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, {"name":"open","directions":4}, + {"name":"open_unlit","directions":4}, {"name":"opening","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, + {"name":"opening_unlit","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, {"name":"deny_unlit","directions":4,"delays":[[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1]]}, {"name":"spark","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"closed_unlit","directions":4}, {"name":"panel_open","directions":4}, + {"name":"bolted_unlit","directions":4}, {"name":"welded","directions":4}, - {"name":"bolted_unlit","directions":4} + {"name":"secure_underlay","directions":4} ], "license":"CC-BY-SA-3.0", "copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi" diff --git a/Resources/Textures/Structures/Doors/Windoors/glass.rsi/open.png b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/open.png similarity index 100% rename from Resources/Textures/Structures/Doors/Windoors/glass.rsi/open.png rename to Resources/Textures/Structures/Doors/Windoors/windoor.rsi/open.png diff --git a/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/open_unlit.png b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/open_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..ddcc55de0ab5a3ab35c489988816830f093ee8d9 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|>^xl@Ln`LH zy=f@OV8Frb5EJ71_w-^e32x^9Tt?3(aWF`fetK2{(#;TN=*h^i|Ai!o4Fs(1S(DjI WGC4U9EX*tb33$5txvXRIV>Fp&ex-hI_9 z)rD~x9xPs!u;K;>j4!k7_dm;06Brjn`#q`WhVUKi?=>+pd`dB3Xt0swVNmdAV`exp z`5;tr!~KAigxSt43_3#c3=AHV9T_16R2rFD&?XDiwdCXihR{0)fD&hIHl^EJT3_*d P4N~Rl>gTe~DWM4fC@V)_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/panel_open.png b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/panel_open.png new file mode 100644 index 0000000000000000000000000000000000000000..21bbb4dedfaa6109b7ed1510cd8a24326ef01358 GIT binary patch literal 747 zcmVnsP4tV*6?7=~dOhG9|wuf?;zCyxhDRT*=m(a14MQvZ~tCf!VvJ4R6w(Zb}UF;1rcDrU3uzceVN<|+(zJ14|`}*Z*{IH|hXvnwVIF2%> zAJ_qmIGlHGBtL*9E0o@)|N+ z>S@|N-rPLAhdhCdG3p&UuvC8stuP-7A=ep{YAM^0;gaWcIvrdL?ju8_tRPe4NhjPx zgv;x2h1qB{QK?iwecTu7^_#f7v?P0-hoMTQ!1nfw90k7~PGj5lXoWdW=B5;&%mdaF zJZxN$raVBo3CigZ>@PB1tnal!F zSOKg6Rsbu26~GE$1+W5G0jz+GDPx$mPtfGRCt{2nlX;TFc3w*5hOHpTN(w?puNLVp*;epq+bp|!4Xz8h=|nNq#;4X zTY*@K01|j6i~nn^Xd=ZPe}6|F8~igI(9-V1Q?b@McUU@iSUPL1lYTbZ37AYiT@-at zmV0QlZS4f4n>BVtfnKkNJkL*UH;%C@3h%9Y0+PYd+YBGM_MSSydw?%4?G^^8H2Oja zA%qY@2qA2u zyMO_zM|TYET|&%&thH`5dPllhBN+^_T74tSGIJ~D8?nm<+jNE~>R?wCh@uX*>FlnU zZ$xifl;s}XI6fKVVzKzCi%B7p00*@C$@I@G_me3;#^blTm=vlCxHsmL#(IF%Whg2@ z>OfWQ@ST-S9T zP#5!!NCM7_AJ=C2r4>LA06l>J0YNL^(mFRlWq_(KCebfd1)LW@US0uB^?+YA!ueVa Sdh8ki0000)4{GLKmwPTFXn3^WA+ zHoUWuf41Ll`KK4let+&aG-}?^v-0O`FL4Fgdd2sx&lRGG;ruBp zmDCJ3r5q0y18yd;#`DSlY$AUyXyZCvAX=p0@=-FmXS&OUlFv8!u0Rc*$eqPp%$E;*aeSvoF$_{M*~?U*0YMm-=#!qTTU^>T(@y zSsJll=KuJ9=CHLw_}gWFr<`kCc4@OgkD-YY!b~8`#JGN*jP9F7hb%9p@QKcwANap+ zmu~UH?aTK_Kl`LN`E$(-Qzz%?#us1Tu3kO=h?nt4XHWjHT?KdN@9)ul*S=e|PARW- z{@ap2x_7?t-FSQM{@pF}uiaA){<$SA@xku@bAuGySNJhMIRA>t%2Wo$VjySDZ>HVr VP6;vl9oh(z@^tlcS?83{1OSL6&Hn%Z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/welded.png b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/welded.png new file mode 100644 index 0000000000000000000000000000000000000000..2975c479be7566a6c59a7aca4e20778aa850feb7 GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|)ID7sLn`LH rJ;=xlwOr9UK@K`#+rw1POb(`njxgN@xNA?@buF literal 0 HcmV?d00001 From 3f13323675479fe14342696fe26cb93db18915b4 Mon Sep 17 00:00:00 2001 From: Swept Date: Thu, 5 Aug 2021 20:28:54 -0700 Subject: [PATCH 49/83] Removes broken new-line markers from a few desc. --- .../Prototypes/Entities/Structures/Doors/Airlocks/external.yml | 2 +- .../Structures/Power/Generation/Singularity/containment.yml | 2 +- .../Structures/Power/Generation/Singularity/singularity.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/external.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/external.yml index 931987b355..6435ab2a95 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/external.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/external.yml @@ -2,7 +2,7 @@ parent: Airlock id: AirlockExternal suffix: External - description: "It opens, it closes, it might crush you, and there might be only space behind it.\nHas to be manually activated." + description: It opens, it closes, it might crush you, and there might be only space behind it. Has to be manually activated. components: - type: Door bumpOpen: false diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/containment.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/containment.yml index d0654ead03..38ccc87a25 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/containment.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/containment.yml @@ -1,7 +1,7 @@ - type: entity id: ContainmentFieldGenerator name: containment field generator - description: A machine that generates a containment field when powered by an emitter.\nKeeps the Singularity docile. + description: A machine that generates a containment field when powered by an emitter. Keeps the Singularity docile. placement: mode: SnapgridCenter components: diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml index 3f6629d99f..bcc1dd509f 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml @@ -1,7 +1,7 @@ - type: entity id: Singularity name: gravitational singularity - description: A mesmerizing swirl of darkness that sucks in everything.\nIf it's moving towards you, run. + description: A mesmerizing swirl of darkness that sucks in everything. If it's moving towards you, run. components: - type: Clickable - type: Physics From 4573f56079e7640af64e5a3763f657f691b7d511 Mon Sep 17 00:00:00 2001 From: Swept Date: Fri, 6 Aug 2021 04:01:08 +0000 Subject: [PATCH 50/83] Fixes a localization error with solution container descriptions --- .../components/shared-solution-container-component.ftl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Locale/en-US/chemistry/solution/components/shared-solution-container-component.ftl b/Resources/Locale/en-US/chemistry/solution/components/shared-solution-container-component.ftl index 0c836a6b11..4581dcc762 100644 --- a/Resources/Locale/en-US/chemistry/solution/components/shared-solution-container-component.ftl +++ b/Resources/Locale/en-US/chemistry/solution/components/shared-solution-container-component.ftl @@ -1,4 +1,4 @@ shared-solution-container-component-on-examine-empty-container = Contains no chemicals. -shared-solution-container-component-on-examine-main-text = It contains a [color={$color}]{$desc}[/color] {wordedAmount} +shared-solution-container-component-on-examine-main-text = It contains a [color={$color}]{$desc}[/color] {$wordedAmount} shared-solution-container-component-on-examine-worded-amount-one-reagent = chemical. -shared-solution-container-component-on-examine-worded-amount-multiple-reagents = mixture of chemicals. \ No newline at end of file +shared-solution-container-component-on-examine-worded-amount-multiple-reagents = mixture of chemicals. From 5af4c06231d626021789d121a9b948509ab4050b Mon Sep 17 00:00:00 2001 From: Kara D Date: Thu, 5 Aug 2021 21:10:06 -0700 Subject: [PATCH 51/83] construction --- .../Completions/SetLayerVisibility.cs | 29 +++ .../Structures/Doors/Windoors/assembly.yml | 80 ++++++ .../Structures/Doors/Windoors/base.yml | 16 +- .../Recipes/Construction/Graphs/windoor.yml | 228 ++++++++++++++++++ .../Recipes/Construction/structures.yml | 42 +++- .../{assembly2.png => assembly.png} | Bin .../Doors/Windoors/windoor.rsi/assembly1.png | Bin 907 -> 0 bytes .../Doors/Windoors/windoor.rsi/meta.json | 3 +- 8 files changed, 388 insertions(+), 10 deletions(-) create mode 100644 Content.Server/Construction/Completions/SetLayerVisibility.cs create mode 100644 Resources/Prototypes/Entities/Structures/Doors/Windoors/assembly.yml create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/windoor.yml rename Resources/Textures/Structures/Doors/Windoors/windoor.rsi/{assembly2.png => assembly.png} (100%) delete mode 100644 Resources/Textures/Structures/Doors/Windoors/windoor.rsi/assembly1.png diff --git a/Content.Server/Construction/Completions/SetLayerVisibility.cs b/Content.Server/Construction/Completions/SetLayerVisibility.cs new file mode 100644 index 0000000000..3e5c32e794 --- /dev/null +++ b/Content.Server/Construction/Completions/SetLayerVisibility.cs @@ -0,0 +1,29 @@ +using System.Threading.Tasks; +using Content.Shared.Construction; +using Robust.Server.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization.Manager.Attributes; +using Robust.Shared.Utility; + +namespace Content.Server.Construction.Completions +{ + [DataDefinition] + public class SetLayerVisibility : IGraphAction + { + [DataField("layer")] public int Layer { get; private set; } = 0; + + [DataField("value")] public bool Value { get; private set; } = true; + + public async Task PerformAction(IEntity entity, IEntity? user) + { + if (entity.Deleted) return; + + if (!entity.TryGetComponent(out SpriteComponent? sprite)) return; + + // That layer doesn't exist, we do nothing. + if (sprite.LayerCount <= Layer) return; + + sprite.LayerSetVisible(Layer, Value); + } + } +} diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/assembly.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/assembly.yml new file mode 100644 index 0000000000..84c4bf1a55 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/assembly.yml @@ -0,0 +1,80 @@ +- type: entity + id: WindoorAssembly + name: windoor assembly + description: It opens, it closes, and you can see through it! + parent: BaseStructure + components: + - type: InteractionOutline + - type: Sprite + netsync: false + drawdepth: FloorObjects + sprite: Structures/Doors/Windoors/windoor.rsi + layers: + - state: assembly + - state: panel_open + visible: false + - type: Physics + fixtures: + - shape: + !type:PhysShapeAabb + bounds: "-0.2,-0.49,-0.49,0.49" + mass: 30 + mask: + - Impassable + - VaultImpassable + - type: Anchorable + - type: Pullable + - type: Rotatable + - type: Damageable + resistances: metallicResistances + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 300 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - !type:SpawnEntitiesBehavior + spawn: + MetalRod: + min: 1 + max: 3 + - type: Construction + graph: windoor + node: assembly + placement: + mode: SnapgridCenter + +- type: entity + id: WindoorAssemblySecure + name: secure windoor assembly + description: It opens, it closes, and you can see through it! This one looks tough. + parent: WindoorAssembly + components: + - type: Sprite + netsync: false + drawdepth: Mobs + sprite: Structures/Doors/Windoors/windoor.rsi + layers: + - state: secure_underlay + - state: assembly + - state: panel_open + visible: false + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 600 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - !type:SpawnEntitiesBehavior + spawn: + MetalRod: + min: 2 + max: 4 + - type: Construction + graph: windoor + node: assemblySecure + diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml index a17acd61c6..d4b0e030fd 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml @@ -50,12 +50,16 @@ ShardGlass: min: 1 max: 2 + MetalRod: + min: 1 + max: 3 - !type:DoActsBehavior acts: [ "Destruction" ] - type: AccessReader - type: Airlock openPanelVisible: true - type: Door + weldable: false openSound: path: /Audio/Machines/windoor_open.ogg closeSound: @@ -77,6 +81,9 @@ animatedPanel: false openUnlitVisible: true - type: WiresVisualizer + - type: Construction + graph: windoor + node: windoor - type: entity id: BaseSecureWindoor @@ -118,13 +125,14 @@ ShardGlass: min: 1 max: 2 - - !type:SpawnEntitiesBehavior - spawn: MetalRod: - min: 1 - max: 3 + min: 2 + max: 4 - !type:DoActsBehavior acts: [ "Destruction" ] + - type: Construction + graph: windoor + node: windoorSecure # "0.49,-0.49,-0.49,-0.2" # to: diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/windoor.yml b/Resources/Prototypes/Recipes/Construction/Graphs/windoor.yml new file mode 100644 index 0000000000..4ebd8243fe --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/windoor.yml @@ -0,0 +1,228 @@ +- type: constructionGraph + id: windoor + start: start + graph: + - node: start + edges: + - to: assembly + completed: + - !type:SetAnchor + value: false + steps: + - material: Steel + amount: 4 + doAfter: 2 + - to: assemblySecure + completed: + - !type:SetAnchor + value: false + steps: + - material: Plasteel + amount: 4 + doAfter: 2 + + - node: assembly + entity: WindoorAssembly + actions: + - !type:SnapToGrid {} + - !type:SetAnchor {} + edges: + - to: glass + conditions: + - !type:EntityAnchored {} + steps: + - material: Glass + amount: 5 + doAfter: 1 + - to: start + conditions: + - !type:EntityAnchored + anchored: false + completed: + - !type:SpawnPrototype + prototype: SheetSteel1 + amount: 4 + - !type:DeleteEntity {} + steps: + - tool: Welding + doAfter: 2 + + - node: assemblySecure + entity: WindoorAssemblySecure + actions: + - !type:SnapToGrid { } + - !type:SetAnchor { } + edges: + - to: glassSecure + conditions: + - !type:EntityAnchored { } + steps: + - material: ReinforcedGlass + amount: 5 + doAfter: 1 + - to: start + conditions: + - !type:EntityAnchored + anchored: false + completed: + - !type:SpawnPrototype + prototype: SheetPlasteel1 + amount: 4 + - !type:DeleteEntity { } + steps: + - tool: Welding + doAfter: 10 + + - node: glass + entity: WindoorAssembly + edges: + - to: wired + conditions: + - !type:EntityAnchored { } + completed: + - !type:SetLayerVisibility + layer: 1 + value: true + steps: + - material: Cable + amount: 5 + doAfter: 1 + - to: assembly + conditions: + - !type:EntityAnchored + anchored: false + completed: + - !type:SpawnPrototype + prototype: SheetGlass1 + amount: 5 + - !type:DeleteEntity { } + steps: + - tool: Screwing + doAfter: 2 + + - node: glassSecure + entity: WindoorAssemblySecure + edges: + - to: wiredSecure + conditions: + - !type:EntityAnchored { } + completed: + - !type:SetLayerVisibility + layer: 2 + value: true + steps: + - material: Cable + amount: 5 + doAfter: 1 + - to: assemblySecure + conditions: + - !type:EntityAnchored + anchored: false + completed: + - !type:SpawnPrototype + prototype: SheetRGlass1 + amount: 5 + - !type:DeleteEntity { } + steps: + - tool: Screwing + doAfter: 4 + + - node: wired + entity: WindoorAssembly + edges: + - to: electronics + conditions: + - !type:EntityAnchored {} + steps: + - tag: DoorElectronics + store: board + name: "door electronics circuit board" + icon: + sprite: "Objects/Misc/module.rsi" + state: "door_electronics" + doAfter: 1 + - to: glass + completed: + - !type:SpawnPrototype + prototype: CableApcStack1 + amount: 5 + steps: + - tool: Cutting + doAfter: 1 + + - node: wiredSecure + entity: WindoorAssemblySecure + edges: + - to: electronicsSecure + conditions: + - !type:EntityAnchored {} + steps: + - tag: DoorElectronics + store: board + name: "door electronics circuit board" + icon: + sprite: "Objects/Misc/module.rsi" + state: "door_electronics" + doAfter: 1 + - to: glassSecure + completed: + - !type:SpawnPrototype + prototype: CableApcStack1 + amount: 5 + steps: + - tool: Cutting + doAfter: 3 + + - node: electronics + entity: WindoorAssembly + edges: + - to: windoor + conditions: + - !type:EntityAnchored {} + steps: + - tool: Screwing + doAfter: 2 + + - node: electronicsSecure + entity: WindoorAssemblySecure + edges: + - to: windoorSecure + conditions: + - !type:EntityAnchored { } + steps: + - tool: Screwing + doAfter: 4 + + - node: windoor + entity: Windoor + edges: + - to: wired + conditions: + - !type:EntityAnchored {} + - !type:AirlockBolted + value: false + - !type:WirePanel {} + - !type:ContainerNotEmpty # TODO ShadowCommander: Remove when map gets updated + container: board + completed: + - !type:EmptyAllContainers {} + steps: + - tool: Prying + doAfter: 1 + + - node: windoorSecure + entity: WindoorSecure + edges: + - to: wired + conditions: + - !type:EntityAnchored {} + - !type:AirlockBolted + value: false + - !type:WirePanel {} + - !type:ContainerNotEmpty # TODO ShadowCommander: Remove when map gets updated + container: board + completed: + - !type:EmptyAllContainers {} + steps: + - tool: Prying + doAfter: 4 diff --git a/Resources/Prototypes/Recipes/Construction/structures.yml b/Resources/Prototypes/Recipes/Construction/structures.yml index 2e52a35875..bf0ea9068e 100644 --- a/Resources/Prototypes/Recipes/Construction/structures.yml +++ b/Resources/Prototypes/Recipes/Construction/structures.yml @@ -125,7 +125,7 @@ canRotate: false - type: construction - name: Firelock + name: firelock id: Firelock graph: Firelock startNode: start @@ -142,7 +142,7 @@ - !type:TileNotBlocked {} - type: construction - name: Catwalk + name: catwalk id: Catwalk graph: Catwalk startNode: start @@ -164,7 +164,7 @@ canBuildInImpassable: false - type: construction - name: Wooden Barricade + name: wooden barricade id: Barricade graph: barricade startNode: start @@ -181,7 +181,7 @@ - !type:TileNotBlocked {} - type: construction - name: Airlock + name: airlock id: airlock graph: airlock startNode: start @@ -196,3 +196,37 @@ canBuildInImpassable: false conditions: - !type:TileNotBlocked {} + +- type: construction + name: windoor + id: windoor + graph: windoor + startNode: start + targetNode: windoor + category: Structures + description: It opens, it closes, and you can see through it! + icon: + sprite: Structures/Doors/Windoors/windoor.rsi + state: assembly + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked {} + +- type: construction + name: secure windoor + id: secureWindoor + graph: windoor + startNode: start + targetNode: windoorSecure + category: Structures + description: It opens, it closes, and you can see through it! This one looks tough. + icon: + sprite: Structures/Doors/Windoors/windoor.rsi + state: assembly + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked {} diff --git a/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/assembly2.png b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/assembly.png similarity index 100% rename from Resources/Textures/Structures/Doors/Windoors/windoor.rsi/assembly2.png rename to Resources/Textures/Structures/Doors/Windoors/windoor.rsi/assembly.png diff --git a/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/assembly1.png b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/assembly1.png deleted file mode 100644 index 4f17d55de44ff2cbb9811c5248ad0701059b7160..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmV;619bd}P)(fRu}dHxTM&el76tG2 z(nHO`e;|VNM~KuO^ic0TNMdplswmPz*w&M{u{E^_&5}d0HfFo-8?s?ZVk(lIS$5~U zOg6hPd0)Qy-kX^n0-P~7JA3kMW#vnyQi)GZPmi(gpF07Wg{7A-Hugr24x7>xhyJ+} zu>EFjUXmmjyKvc3!<^A*{Dw&63=E>R(eF9#1n7DVn$0E*4UfXsmI_1BDEvA;X4Y~i zAQp=QDq#5Bd6=A3V2}# zWrN;eL%)l^IK9qhXUtNm7;?LR?gZG#0fd$TOlYWnFl zv6fb%VwzLe?^c~DrIV#22T_POjQj#m!wR9u-iX?t^#oc!6oT* zIt{w60}Y<>q9kvS%DCD^gGs1ggf;Whp8xuDAJy)$(fhWlI zn|D{E5p(3|@Tc_jQT`6=AHX}!kj>|h@7dea5I~T8p%6|a60UZlD2iFH*8vR|JqL#! zDi6sw3k6z>;Lb355Dvq9Ax|?AixkOZE}*I^O||GXXt>zoutViRi+uD1G)AX)uz>3X zV1IMr%ER&ME_`04Gih(w7Qw;xw5D zS^>WG04Ib82n7fQ2n7fQ2n7fQ2n7fQ2n7fQblnS-0(v1(3h0H1@PKXwuy{koyB;9R zhVPEd{BIWMe0^t-@TLMBZ>reAyEPoRE8y+=`oZg+=KG1SpCO*UMYqi+K5fIOq8Q7n z3T_{w;;w*XGFdxY+cOS+e1rY{?=U`okshSPvxGSYuMcon!2QL=E189*4~AjTLzLL! hMk*ep#9d{#@dtbV0@0c%nC$=n002ovPDHLkV1l20iOT>0 diff --git a/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json index 71193ffebe..494b341f91 100644 --- a/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json @@ -3,8 +3,7 @@ "size": {"x":32,"y":32}, "states": [ - {"name":"assembly2","directions":4,"delays":[[0.3,0.3],[0.3,0.3],[0.3,0.3],[0.3,0.3]]}, - {"name":"assembly1","directions":4}, + {"name":"assembly","directions":4,"delays":[[0.3,0.3],[0.3,0.3],[0.3,0.3],[0.3,0.3]]}, {"name":"closed","directions":4}, {"name":"closed_unlit","directions":4}, {"name":"closing","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, From 9354abb0246af17598e108f996eb39c266a5c0b7 Mon Sep 17 00:00:00 2001 From: Kara D Date: Thu, 5 Aug 2021 22:01:02 -0700 Subject: [PATCH 52/83] reviews + test --- Content.Server/Doors/Systems/AirlockSystem.cs | 4 +- .../Structures/Doors/Windoors/assembly.yml | 14 +- .../Structures/Doors/Windoors/base.yml | 20 +-- .../Recipes/Construction/Graphs/windoor.yml | 155 +++++++++--------- .../Recipes/Construction/structures.yml | 4 +- .../Doors/Windoors/windoor.rsi/meta.json | 8 +- 6 files changed, 95 insertions(+), 110 deletions(-) diff --git a/Content.Server/Doors/Systems/AirlockSystem.cs b/Content.Server/Doors/Systems/AirlockSystem.cs index 8222e40b32..4645319b53 100644 --- a/Content.Server/Doors/Systems/AirlockSystem.cs +++ b/Content.Server/Doors/Systems/AirlockSystem.cs @@ -43,8 +43,8 @@ namespace Content.Server.Doors.Systems if (component.WiresComponent != null) { component.WiresComponent.IsPanelVisible = - args.State != SharedDoorComponent.DoorState.Open - || component.OpenPanelVisible; + component.OpenPanelVisible + || args.State != SharedDoorComponent.DoorState.Open; } // If the door is closed, we should look if the bolt was locked while closing component.UpdateBoltLightStatus(); diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/assembly.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/assembly.yml index 84c4bf1a55..638562b719 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/assembly.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/assembly.yml @@ -10,9 +10,9 @@ drawdepth: FloorObjects sprite: Structures/Doors/Windoors/windoor.rsi layers: - - state: assembly - - state: panel_open - visible: false + - state: assembly + - state: panel_open + visible: true - type: Physics fixtures: - shape: @@ -37,7 +37,7 @@ acts: ["Destruction"] - !type:SpawnEntitiesBehavior spawn: - MetalRod: + SheetSteel1: min: 1 max: 3 - type: Construction @@ -71,9 +71,9 @@ acts: ["Destruction"] - !type:SpawnEntitiesBehavior spawn: - MetalRod: - min: 2 - max: 4 + SheetPlasteel1: + min: 1 + max: 2 - type: Construction graph: windoor node: assemblySecure diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml index d4b0e030fd..cc078a321b 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base.yml @@ -50,9 +50,9 @@ ShardGlass: min: 1 max: 2 - MetalRod: - min: 1 - max: 3 + SheetSteel1: + min: 2 + max: 4 - !type:DoActsBehavior acts: [ "Destruction" ] - type: AccessReader @@ -125,19 +125,11 @@ ShardGlass: min: 1 max: 2 - MetalRod: - min: 2 - max: 4 + SheetPlasteel1: + min: 1 + max: 2 - !type:DoActsBehavior acts: [ "Destruction" ] - type: Construction graph: windoor node: windoorSecure - -# "0.49,-0.49,-0.49,-0.2" -# to: -# (-0.2, -0.49), (-0.2, 0.49), (-0.49, 0.49), (-0.49, -0.49) -# what i want is: -# (0.49, -0.49), (0.49, -0.2), (-0.49, -0.2), (-0.49, -0.49) -# which is: -# "-0.2,-0.49,-0.49,0.49" diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/windoor.yml b/Resources/Prototypes/Recipes/Construction/Graphs/windoor.yml index 4ebd8243fe..f947fdd414 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/windoor.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/windoor.yml @@ -47,6 +47,79 @@ - tool: Welding doAfter: 2 + - node: glass + entity: WindoorAssembly + edges: + - to: wired + conditions: + - !type:EntityAnchored { } + steps: + - material: Cable + amount: 5 + doAfter: 1 + - to: assembly + conditions: + - !type:EntityAnchored + anchored: false + completed: + - !type:SpawnPrototype + prototype: SheetGlass1 + amount: 5 + - !type:DeleteEntity { } + steps: + - tool: Screwing + doAfter: 2 + + - node: wired + entity: WindoorAssembly + edges: + - to: electronics + conditions: + - !type:EntityAnchored {} + steps: + - tag: DoorElectronics + store: board + name: "door electronics circuit board" + icon: + sprite: "Objects/Misc/module.rsi" + state: "door_electronics" + doAfter: 1 + - to: glass + completed: + - !type:SpawnPrototype + prototype: CableApcStack1 + amount: 5 + steps: + - tool: Cutting + doAfter: 1 + + - node: electronics + entity: WindoorAssembly + edges: + - to: windoor + conditions: + - !type:EntityAnchored {} + steps: + - tool: Screwing + doAfter: 2 + + - node: windoor + entity: Windoor + edges: + - to: wired + conditions: + - !type:EntityAnchored {} + - !type:AirlockBolted + value: false + - !type:WirePanel {} + - !type:ContainerNotEmpty # TODO ShadowCommander: Remove when map gets updated + container: board + completed: + - !type:EmptyAllContainers {} + steps: + - tool: Prying + doAfter: 1 + - node: assemblySecure entity: WindoorAssemblySecure actions: @@ -73,43 +146,12 @@ - tool: Welding doAfter: 10 - - node: glass - entity: WindoorAssembly - edges: - - to: wired - conditions: - - !type:EntityAnchored { } - completed: - - !type:SetLayerVisibility - layer: 1 - value: true - steps: - - material: Cable - amount: 5 - doAfter: 1 - - to: assembly - conditions: - - !type:EntityAnchored - anchored: false - completed: - - !type:SpawnPrototype - prototype: SheetGlass1 - amount: 5 - - !type:DeleteEntity { } - steps: - - tool: Screwing - doAfter: 2 - - node: glassSecure entity: WindoorAssemblySecure edges: - to: wiredSecure conditions: - !type:EntityAnchored { } - completed: - - !type:SetLayerVisibility - layer: 2 - value: true steps: - material: Cable amount: 5 @@ -127,35 +169,13 @@ - tool: Screwing doAfter: 4 - - node: wired - entity: WindoorAssembly - edges: - - to: electronics - conditions: - - !type:EntityAnchored {} - steps: - - tag: DoorElectronics - store: board - name: "door electronics circuit board" - icon: - sprite: "Objects/Misc/module.rsi" - state: "door_electronics" - doAfter: 1 - - to: glass - completed: - - !type:SpawnPrototype - prototype: CableApcStack1 - amount: 5 - steps: - - tool: Cutting - doAfter: 1 - node: wiredSecure entity: WindoorAssemblySecure edges: - to: electronicsSecure conditions: - - !type:EntityAnchored {} + - !type:EntityAnchored { } steps: - tag: DoorElectronics store: board @@ -173,16 +193,6 @@ - tool: Cutting doAfter: 3 - - node: electronics - entity: WindoorAssembly - edges: - - to: windoor - conditions: - - !type:EntityAnchored {} - steps: - - tool: Screwing - doAfter: 2 - - node: electronicsSecure entity: WindoorAssemblySecure edges: @@ -193,23 +203,6 @@ - tool: Screwing doAfter: 4 - - node: windoor - entity: Windoor - edges: - - to: wired - conditions: - - !type:EntityAnchored {} - - !type:AirlockBolted - value: false - - !type:WirePanel {} - - !type:ContainerNotEmpty # TODO ShadowCommander: Remove when map gets updated - container: board - completed: - - !type:EmptyAllContainers {} - steps: - - tool: Prying - doAfter: 1 - - node: windoorSecure entity: WindoorSecure edges: diff --git a/Resources/Prototypes/Recipes/Construction/structures.yml b/Resources/Prototypes/Recipes/Construction/structures.yml index bf0ea9068e..a9424d1aea 100644 --- a/Resources/Prototypes/Recipes/Construction/structures.yml +++ b/Resources/Prototypes/Recipes/Construction/structures.yml @@ -207,7 +207,7 @@ description: It opens, it closes, and you can see through it! icon: sprite: Structures/Doors/Windoors/windoor.rsi - state: assembly + state: closed objectType: Structure placementMode: SnapgridCenter canBuildInImpassable: false @@ -224,7 +224,7 @@ description: It opens, it closes, and you can see through it! This one looks tough. icon: sprite: Structures/Doors/Windoors/windoor.rsi - state: assembly + state: closed objectType: Structure placementMode: SnapgridCenter canBuildInImpassable: false diff --git a/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json index 494b341f91..e727dfe59e 100644 --- a/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json @@ -1,5 +1,7 @@ { - "name":1, + "version":1, + "license":"CC-BY-SA-3.0", + "copyright":"Taken from tgstation at https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi", "size": {"x":32,"y":32}, "states": [ @@ -18,7 +20,5 @@ {"name":"bolted_unlit","directions":4}, {"name":"welded","directions":4}, {"name":"secure_underlay","directions":4} - ], - "license":"CC-BY-SA-3.0", - "copyright":"https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi" + ] } From cf2a1ecd5d76a690c4ab8e094fbfcddaca3f80c8 Mon Sep 17 00:00:00 2001 From: Kara D Date: Thu, 5 Aug 2021 22:01:24 -0700 Subject: [PATCH 53/83] remove SetLayerVisibility, doesnt work for some reason --- .../Completions/SetLayerVisibility.cs | 29 ------------------- 1 file changed, 29 deletions(-) delete mode 100644 Content.Server/Construction/Completions/SetLayerVisibility.cs diff --git a/Content.Server/Construction/Completions/SetLayerVisibility.cs b/Content.Server/Construction/Completions/SetLayerVisibility.cs deleted file mode 100644 index 3e5c32e794..0000000000 --- a/Content.Server/Construction/Completions/SetLayerVisibility.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Threading.Tasks; -using Content.Shared.Construction; -using Robust.Server.GameObjects; -using Robust.Shared.GameObjects; -using Robust.Shared.Serialization.Manager.Attributes; -using Robust.Shared.Utility; - -namespace Content.Server.Construction.Completions -{ - [DataDefinition] - public class SetLayerVisibility : IGraphAction - { - [DataField("layer")] public int Layer { get; private set; } = 0; - - [DataField("value")] public bool Value { get; private set; } = true; - - public async Task PerformAction(IEntity entity, IEntity? user) - { - if (entity.Deleted) return; - - if (!entity.TryGetComponent(out SpriteComponent? sprite)) return; - - // That layer doesn't exist, we do nothing. - if (sprite.LayerCount <= Layer) return; - - sprite.LayerSetVisible(Layer, Value); - } - } -} From 991d4390f29f571b712fe23aea4e0d6205b2b915 Mon Sep 17 00:00:00 2001 From: Kara D Date: Thu, 5 Aug 2021 22:06:55 -0700 Subject: [PATCH 54/83] swept moment --- .../Doors/Windoors/windoor.rsi/meta.json | 180 ++++++++++++++++-- 1 file changed, 162 insertions(+), 18 deletions(-) diff --git a/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json index e727dfe59e..9a8f157fc8 100644 --- a/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Windoors/windoor.rsi/meta.json @@ -2,23 +2,167 @@ "version":1, "license":"CC-BY-SA-3.0", "copyright":"Taken from tgstation at https://github.com/tgstation/tgstation/blob/3681006d7102045e334e8eddb23a8685fcdb258a/icons/obj/doors/windoor.dmi", - "size": {"x":32,"y":32}, - "states": - [ - {"name":"assembly","directions":4,"delays":[[0.3,0.3],[0.3,0.3],[0.3,0.3],[0.3,0.3]]}, - {"name":"closed","directions":4}, - {"name":"closed_unlit","directions":4}, - {"name":"closing","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"closing_unlit","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"open","directions":4}, - {"name":"open_unlit","directions":4}, - {"name":"opening","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"opening_unlit","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"deny_unlit","directions":4,"delays":[[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1],[0.1,0.2,0.1]]}, - {"name":"spark","directions":4,"delays":[[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1,0.1]]}, - {"name":"panel_open","directions":4}, - {"name":"bolted_unlit","directions":4}, - {"name":"welded","directions":4}, - {"name":"secure_underlay","directions":4} + "size": { + "x":32, + "y":32 + }, + "states":[ + { + "name":"assembly", + "directions":4, + "delays":[ + [ + 0.3,0.3 + ], + [ + 0.3,0.3 + ], + [ + 0.3,0.3 + ], + [ + 0.3,0.3 + ] + ] + }, + { + "name":"closed", + "directions":4 + }, + { + "name":"closed_unlit", + "directions":4 + }, + { + "name":"closing", + "directions":4, + "delays":[ + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ] + ] + }, + { + "name":"closing_unlit", + "directions":4, + "delays":[ + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1] + ] + }, + { + "name":"open", + "directions":4 + }, + { + "name":"open_unlit", + "directions":4 + }, + { + "name":"opening", + "directions":4, + "delays":[ + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ] + ] + }, + { + "name":"opening_unlit", + "directions":4, + "delays":[ + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1,0.1 + ] + ] + }, + { + "name":"deny_unlit", + "directions":4, + "delays":[ + [ + 0.1,0.2,0.1 + ], + [ + 0.1,0.2,0.1 + ], + [ + 0.1,0.2,0.1 + ], + [ + 0.1,0.2,0.1 + ] + ] + }, + { + "name":"spark", + "directions":4, + "delays":[ + [ + 0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1 + ], + [ + 0.1,0.1,0.1,0.1,0.1,0.1 + ] + ] + }, + { + "name":"panel_open", + "directions":4 + }, + { + "name":"bolted_unlit", + "directions":4 + }, + { + "name":"welded", + "directions":4 + }, + { + "name":"secure_underlay", + "directions":4 + } ] } From fcc7d029b91039b7376107be0c39b25dcb19aa3c Mon Sep 17 00:00:00 2001 From: Kara D Date: Thu, 5 Aug 2021 22:08:16 -0700 Subject: [PATCH 55/83] leftover --- .../Entities/Structures/Doors/Windoors/assembly.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/assembly.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/assembly.yml index 638562b719..be3701c135 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/assembly.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/assembly.yml @@ -11,8 +11,6 @@ sprite: Structures/Doors/Windoors/windoor.rsi layers: - state: assembly - - state: panel_open - visible: true - type: Physics fixtures: - shape: @@ -59,8 +57,6 @@ layers: - state: secure_underlay - state: assembly - - state: panel_open - visible: false - type: Destructible thresholds: - trigger: From db65ed55367d95ef40baeab3647f3ccfcd9d6190 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 6 Aug 2021 02:10:41 -0400 Subject: [PATCH 56/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e900669612..ce7ee4cb7c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1673,3 +1673,9 @@ Entries: - {message: Added two new maintenance areas, type: Add} id: 298 time: '2021-08-05T22:20:58.0000000+00:00' +- author: mirrorcult + changes: + - {message: Windoors and secure windoors have been added and are constructible., + type: Add} + id: 299 + time: '2021-08-06T06:09:39.0000000+00:00' From 09f5ec5cb87f8c5c2e3af7fb5c5abdea300273d7 Mon Sep 17 00:00:00 2001 From: mirrorcult Date: Fri, 6 Aug 2021 00:02:36 -0700 Subject: [PATCH 57/83] Fix can't return to body bug (#4424) --- .../Administration/Commands/AGhost.cs | 4 +++- .../GameTicking/GameTicker.Spawning.cs | 4 +++- .../GameTicking/Presets/GamePreset.cs | 3 ++- .../Mind/Components/MindComponent.cs | 5 +++-- Content.Shared/Ghost/SharedGhostComponent.cs | 3 ++- Content.Shared/Ghost/SharedGhostSystem.cs | 22 +++---------------- 6 files changed, 16 insertions(+), 25 deletions(-) diff --git a/Content.Server/Administration/Commands/AGhost.cs b/Content.Server/Administration/Commands/AGhost.cs index aff615a193..db64864eb4 100644 --- a/Content.Server/Administration/Commands/AGhost.cs +++ b/Content.Server/Administration/Commands/AGhost.cs @@ -2,6 +2,7 @@ using Content.Server.Ghost.Components; using Content.Server.Players; using Content.Shared.Administration; +using Content.Shared.Ghost; using Robust.Server.Player; using Robust.Shared.Console; using Robust.Shared.GameObjects; @@ -55,7 +56,8 @@ namespace Content.Server.Administration.Commands mind.TransferTo(ghost); } - ghost.GetComponent().CanReturnToBody = canReturn; + var comp = ghost.GetComponent(); + EntitySystem.Get().SetCanReturnToBody(comp, canReturn); } } } diff --git a/Content.Server/GameTicking/GameTicker.Spawning.cs b/Content.Server/GameTicking/GameTicker.Spawning.cs index cab3c3c1d1..4d24d6249a 100644 --- a/Content.Server/GameTicking/GameTicker.Spawning.cs +++ b/Content.Server/GameTicking/GameTicker.Spawning.cs @@ -13,6 +13,7 @@ using Content.Server.Roles; using Content.Server.Spawners.Components; using Content.Server.Speech.Components; using Content.Shared.GameTicking; +using Content.Shared.Ghost; using Content.Shared.Inventory; using Content.Shared.Preferences; using Content.Shared.Roles; @@ -144,7 +145,8 @@ namespace Content.Server.GameTicking var mob = SpawnObserverMob(); mob.Name = name; - mob.GetComponent().CanReturnToBody = false; + var ghost = mob.GetComponent(); + EntitySystem.Get().SetCanReturnToBody(ghost, false); data.Mind.TransferTo(mob); _playersInLobby[player] = LobbyPlayerStatus.Observer; diff --git a/Content.Server/GameTicking/Presets/GamePreset.cs b/Content.Server/GameTicking/Presets/GamePreset.cs index e76d442ba5..922ce47c02 100644 --- a/Content.Server/GameTicking/Presets/GamePreset.cs +++ b/Content.Server/GameTicking/Presets/GamePreset.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using Content.Server.Ghost.Components; using Content.Shared.Damage; using Content.Shared.Damage.Components; +using Content.Shared.Ghost; using Content.Shared.MobState; using Content.Shared.Preferences; using Robust.Server.Player; @@ -75,7 +76,7 @@ namespace Content.Server.GameTicking.Presets ghost.Name = mind.CharacterName ?? string.Empty; var ghostComponent = ghost.GetComponent(); - ghostComponent.CanReturnToBody = canReturn; + EntitySystem.Get().SetCanReturnToBody(ghostComponent, canReturn); if (canReturn) mind.Visit(ghost); diff --git a/Content.Server/Mind/Components/MindComponent.cs b/Content.Server/Mind/Components/MindComponent.cs index b724e8a10c..987e04db63 100644 --- a/Content.Server/Mind/Components/MindComponent.cs +++ b/Content.Server/Mind/Components/MindComponent.cs @@ -1,6 +1,7 @@ using Content.Server.GameTicking; using Content.Server.Ghost.Components; using Content.Shared.Examine; +using Content.Shared.Ghost; using Content.Shared.MobState; using Robust.Shared.GameObjects; using Robust.Shared.IoC; @@ -86,7 +87,7 @@ namespace Content.Server.Mind.Components { if (visiting.TryGetComponent(out GhostComponent? ghost)) { - ghost.CanReturnToBody = false; + EntitySystem.Get().SetCanReturnToBody(ghost, false); } Mind!.TransferTo(visiting); @@ -108,7 +109,7 @@ namespace Content.Server.Mind.Components var ghost = Owner.EntityManager.SpawnEntity("MobObserver", spawnPosition); var ghostComponent = ghost.GetComponent(); - ghostComponent.CanReturnToBody = false; + EntitySystem.Get().SetCanReturnToBody(ghostComponent, false); if (Mind != null) { diff --git a/Content.Shared/Ghost/SharedGhostComponent.cs b/Content.Shared/Ghost/SharedGhostComponent.cs index 77806356ac..e335225911 100644 --- a/Content.Shared/Ghost/SharedGhostComponent.cs +++ b/Content.Shared/Ghost/SharedGhostComponent.cs @@ -16,8 +16,9 @@ namespace Content.Shared.Ghost public override string Name => "Ghost"; /// - /// Changed by + /// Changed by /// + // TODO MIRROR change this to use friend classes when thats merged [DataField("canReturnToBody")] [ViewVariables(VVAccess.ReadWrite)] public bool CanReturnToBody { get; set; } diff --git a/Content.Shared/Ghost/SharedGhostSystem.cs b/Content.Shared/Ghost/SharedGhostSystem.cs index 0099d34f37..7b54432150 100644 --- a/Content.Shared/Ghost/SharedGhostSystem.cs +++ b/Content.Shared/Ghost/SharedGhostSystem.cs @@ -10,36 +10,20 @@ namespace Content.Shared.Ghost public override void Initialize() { base.Initialize(); - - SubscribeLocalEvent(OnGhostChangeCanReturnToBody); } - private void OnGhostChangeCanReturnToBody(EntityUid uid, SharedGhostComponent component, GhostChangeCanReturnToBodyEvent args) + public void SetCanReturnToBody(SharedGhostComponent component, bool canReturn) { - if (component.CanReturnToBody == args.CanReturnToBody) + if (component.CanReturnToBody == canReturn) { return; } - component.CanReturnToBody = args.CanReturnToBody; + component.CanReturnToBody = canReturn; component.Dirty(); } } - /// - /// Raised to change the value of - /// - [Serializable, NetSerializable] - public class GhostChangeCanReturnToBodyEvent : EntityEventArgs - { - public GhostChangeCanReturnToBodyEvent(bool canReturnToBody) - { - CanReturnToBody = canReturnToBody; - } - - public bool CanReturnToBody { get; } - } - [Serializable, NetSerializable] public class GhostWarpsRequestEvent : EntityEventArgs { From da11cbd8e6bef3373ec1f570df7d7b9155a3890f Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 6 Aug 2021 03:03:38 -0400 Subject: [PATCH 58/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ce7ee4cb7c..5d07790b91 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1679,3 +1679,8 @@ Entries: type: Add} id: 299 time: '2021-08-06T06:09:39.0000000+00:00' +- author: mirrorcult + changes: + - {message: Ghosts can now properly return to their body if applicable., type: Fix} + id: 300 + time: '2021-08-06T07:02:36.0000000+00:00' From b7bc0dc0b0aad93a894b9935b481c6dc9dc7823b Mon Sep 17 00:00:00 2001 From: metalgearsloth Date: Fri, 6 Aug 2021 23:51:23 +1000 Subject: [PATCH 59/83] Update submodule --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 04d94f87fc..d58e380dd9 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 04d94f87fc7205443aa8d9ea2b6fa178d4ba825d +Subproject commit d58e380dd9dfbcc32316f0064193fdd9d61ef7a5 From 13760f401418a0dd9019c3030d77017fd2c5eccf Mon Sep 17 00:00:00 2001 From: metalgearsloth Date: Fri, 6 Aug 2021 23:59:33 +1000 Subject: [PATCH 60/83] Fix gas tile overlays on shuttles --- Content.Client/Atmos/Overlays/GasTileOverlay.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Content.Client/Atmos/Overlays/GasTileOverlay.cs b/Content.Client/Atmos/Overlays/GasTileOverlay.cs index 06b5c3bc4f..5c883d015d 100644 --- a/Content.Client/Atmos/Overlays/GasTileOverlay.cs +++ b/Content.Client/Atmos/Overlays/GasTileOverlay.cs @@ -40,9 +40,7 @@ namespace Content.Client.Atmos.Overlays if (!_gasTileOverlaySystem.HasData(mapGrid.Index)) continue; - var gridBounds = new Box2(mapGrid.WorldToLocal(worldBounds.BottomLeft), mapGrid.WorldToLocal(worldBounds.TopRight)); - - foreach (var tile in mapGrid.GetTilesIntersecting(gridBounds)) + foreach (var tile in mapGrid.GetTilesIntersecting(worldBounds)) { foreach (var (texture, color) in _gasTileOverlaySystem.GetOverlays(mapGrid.Index, tile.GridIndices)) { From eeac2f369da0df68f61ddf019251924518ec4c20 Mon Sep 17 00:00:00 2001 From: metalgearsloth Date: Sat, 7 Aug 2021 00:19:10 +1000 Subject: [PATCH 61/83] Offset station on roundstart again --- Content.Shared/CCVar/CCVars.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 450cc14727..7491e4c63b 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -59,10 +59,11 @@ namespace Content.Shared.CCVar /// Whether a random position offset will be applied to the station on roundstart. /// public static readonly CVarDef StationOffset = - CVarDef.Create("game.station_offset", false); + CVarDef.Create("game.station_offset", true); /// /// When the default blueprint is loaded what is the maximum amount it can be offset from 0,0. + /// Does nothing without as true. /// public static readonly CVarDef MaxStationOffset = CVarDef.Create("game.maxstationoffset", 1000.0f); From 9882f4682563196b2b6f65838a02d5c9e922c9f8 Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto Date: Fri, 6 Aug 2021 17:52:42 +0200 Subject: [PATCH 62/83] Fix PlaceableSurface incorrect coordinate usage. It set world position to entity coordinate positions... --- Content.Server/Placeable/PlaceableSurfaceComponent.cs | 4 ++-- Resources/Changelog/Parts/tables.yml | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 Resources/Changelog/Parts/tables.yml diff --git a/Content.Server/Placeable/PlaceableSurfaceComponent.cs b/Content.Server/Placeable/PlaceableSurfaceComponent.cs index e1ab83f897..1d83c21e0c 100644 --- a/Content.Server/Placeable/PlaceableSurfaceComponent.cs +++ b/Content.Server/Placeable/PlaceableSurfaceComponent.cs @@ -95,9 +95,9 @@ namespace Content.Server.Placeable } handComponent.Drop(eventArgs.Using); if (_placeCentered) - eventArgs.Using.Transform.WorldPosition = eventArgs.Target.Transform.WorldPosition + _positionOffset; + eventArgs.Using.Transform.LocalPosition = eventArgs.Target.Transform.LocalPosition + _positionOffset; else - eventArgs.Using.Transform.WorldPosition = eventArgs.ClickLocation.Position; + eventArgs.Using.Transform.Coordinates = eventArgs.ClickLocation; return true; } } diff --git a/Resources/Changelog/Parts/tables.yml b/Resources/Changelog/Parts/tables.yml new file mode 100644 index 0000000000..94d6d67a09 --- /dev/null +++ b/Resources/Changelog/Parts/tables.yml @@ -0,0 +1,4 @@ +author: Zumorica +changes: + - type: Fix + message: Fixes a bug where items would disappear when placed in tables, in certain situations. From 9927584d86afbe2e30dae3801bd8c18940e7a716 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 6 Aug 2021 11:53:49 -0400 Subject: [PATCH 63/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 6 ++++++ Resources/Changelog/Parts/tables.yml | 4 ---- 2 files changed, 6 insertions(+), 4 deletions(-) delete mode 100644 Resources/Changelog/Parts/tables.yml diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 5d07790b91..b96167df56 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1684,3 +1684,9 @@ Entries: - {message: Ghosts can now properly return to their body if applicable., type: Fix} id: 300 time: '2021-08-06T07:02:36.0000000+00:00' +- author: Zumorica + changes: + - {message: 'Fixes a bug where items would disappear when placed in tables, in certain + situations.', type: Fix} + id: 301 + time: '2021-08-06T15:53:48.856573+00:00' diff --git a/Resources/Changelog/Parts/tables.yml b/Resources/Changelog/Parts/tables.yml deleted file mode 100644 index 94d6d67a09..0000000000 --- a/Resources/Changelog/Parts/tables.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Zumorica -changes: - - type: Fix - message: Fixes a bug where items would disappear when placed in tables, in certain situations. From 0501ae4b89842edcb090738485ae399a3f8c26ca Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto Date: Fri, 6 Aug 2021 18:11:39 +0200 Subject: [PATCH 64/83] Fix pickup animation incorrect coordinate usage. Animation finalPosition was world position, while initialPosition was local position. --- Content.Client/Animations/ReusableAnimations.cs | 2 +- Content.Client/Storage/ClientStorageComponent.cs | 2 +- Content.Server/Hands/Components/HandsComponent.cs | 6 +++--- Content.Shared/Hands/Components/SharedHandsComponent.cs | 4 ++-- Resources/Changelog/Parts/pickup.yml | 4 ++++ 5 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 Resources/Changelog/Parts/pickup.yml diff --git a/Content.Client/Animations/ReusableAnimations.cs b/Content.Client/Animations/ReusableAnimations.cs index 2cb7c67c43..eef860ce54 100644 --- a/Content.Client/Animations/ReusableAnimations.cs +++ b/Content.Client/Animations/ReusableAnimations.cs @@ -11,7 +11,7 @@ namespace Content.Client.Animations { public static class ReusableAnimations { - public static void AnimateEntityPickup(IEntity entity, EntityCoordinates initialPosition, Vector2 finalPosition) + public static void AnimateEntityPickup(IEntity entity, MapCoordinates initialPosition, Vector2 finalPosition) { var animatableClone = entity.EntityManager.SpawnEntity("clientsideclone", initialPosition); animatableClone.Name = entity.Name; diff --git a/Content.Client/Storage/ClientStorageComponent.cs b/Content.Client/Storage/ClientStorageComponent.cs index c194b6d296..17039981ca 100644 --- a/Content.Client/Storage/ClientStorageComponent.cs +++ b/Content.Client/Storage/ClientStorageComponent.cs @@ -116,7 +116,7 @@ namespace Content.Client.Storage for (var i = 0; msg.StoredEntities.Count > i; i++) { var entityId = msg.StoredEntities[i]; - var initialPosition = msg.EntityPositions[i]; + var initialPosition = msg.EntityPositions[i].ToMap(Owner.EntityManager); if (Owner.EntityManager.TryGetEntity(entityId, out var entity)) { diff --git a/Content.Server/Hands/Components/HandsComponent.cs b/Content.Server/Hands/Components/HandsComponent.cs index f8b84c9992..8f2579eaf6 100644 --- a/Content.Server/Hands/Components/HandsComponent.cs +++ b/Content.Server/Hands/Components/HandsComponent.cs @@ -86,15 +86,15 @@ namespace Content.Server.Hands.Components protected override void HandlePickupAnimation(IEntity entity) { - var pickupDirection = Owner.Transform.WorldPosition; + var pickupDirection = Owner.Transform.MapPosition.Position; var outermostEntity = entity; while (outermostEntity.TryGetContainer(out var container)) //TODO: Use WorldPosition instead of this loop outermostEntity = container.Owner; - var initialPosition = outermostEntity.Transform.Coordinates; + var initialPosition = outermostEntity.Transform.MapPosition; - if (pickupDirection == initialPosition.ToMapPos(Owner.EntityManager)) + if (pickupDirection == initialPosition.Position) return; Owner.EntityManager.EntityNetManager!.SendSystemNetworkMessage( diff --git a/Content.Shared/Hands/Components/SharedHandsComponent.cs b/Content.Shared/Hands/Components/SharedHandsComponent.cs index 9e1978b06f..3625502e0f 100644 --- a/Content.Shared/Hands/Components/SharedHandsComponent.cs +++ b/Content.Shared/Hands/Components/SharedHandsComponent.cs @@ -923,10 +923,10 @@ namespace Content.Shared.Hands.Components public class PickupAnimationMessage : EntityEventArgs { public EntityUid EntityUid { get; } - public EntityCoordinates InitialPosition { get; } + public MapCoordinates InitialPosition { get; } public Vector2 PickupDirection { get; } - public PickupAnimationMessage(EntityUid entityUid, Vector2 pickupDirection, EntityCoordinates initialPosition) + public PickupAnimationMessage(EntityUid entityUid, Vector2 pickupDirection, MapCoordinates initialPosition) { EntityUid = entityUid; PickupDirection = pickupDirection; diff --git a/Resources/Changelog/Parts/pickup.yml b/Resources/Changelog/Parts/pickup.yml new file mode 100644 index 0000000000..ea08f40154 --- /dev/null +++ b/Resources/Changelog/Parts/pickup.yml @@ -0,0 +1,4 @@ +author: Your_Name_Here +changes: + - type: Fix # One of the following: Add, Remove, Tweak, Fix + message: Fixes pickup animation not showing under certain conditions. From 91efe64a45660ad681d1a7597901d5ed6168ab5b Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 6 Aug 2021 12:13:07 -0400 Subject: [PATCH 65/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 5 +++++ Resources/Changelog/Parts/pickup.yml | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) delete mode 100644 Resources/Changelog/Parts/pickup.yml diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b96167df56..2424cee6db 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1690,3 +1690,8 @@ Entries: situations.', type: Fix} id: 301 time: '2021-08-06T15:53:48.856573+00:00' +- author: Your_Name_Here + changes: + - {message: Fixes pickup animation not showing under certain conditions., type: Fix} + id: 302 + time: '2021-08-06T16:13:07.405459+00:00' diff --git a/Resources/Changelog/Parts/pickup.yml b/Resources/Changelog/Parts/pickup.yml deleted file mode 100644 index ea08f40154..0000000000 --- a/Resources/Changelog/Parts/pickup.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Your_Name_Here -changes: - - type: Fix # One of the following: Add, Remove, Tweak, Fix - message: Fixes pickup animation not showing under certain conditions. From 6bd6b9789a70fd087102763768fb6772aae021dc Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto Date: Fri, 6 Aug 2021 18:27:37 +0200 Subject: [PATCH 66/83] Pointing coordinate fixes. --- .../Pointing/EntitySystems/PointingSystem.cs | 15 +++++++++++---- Resources/Changelog/Changelog.yml | 2 +- Resources/Changelog/Parts/pointing_self.yml | 4 ++++ Resources/Changelog/Parts/pointing_space.yml | 4 ++++ 4 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 Resources/Changelog/Parts/pointing_self.yml create mode 100644 Resources/Changelog/Parts/pointing_space.yml diff --git a/Content.Server/Pointing/EntitySystems/PointingSystem.cs b/Content.Server/Pointing/EntitySystems/PointingSystem.cs index e855c9270c..007e931658 100644 --- a/Content.Server/Pointing/EntitySystems/PointingSystem.cs +++ b/Content.Server/Pointing/EntitySystems/PointingSystem.cs @@ -89,6 +89,7 @@ namespace Content.Server.Pointing.EntitySystems public bool TryPoint(ICommonSession? session, EntityCoordinates coords, EntityUid uid) { + var mapCoords = coords.ToMap(EntityManager); var player = (session as IPlayerSession)?.ContentData()?.Mind?.CurrentEntity; if (player == null) { @@ -115,14 +116,14 @@ namespace Content.Server.Pointing.EntitySystems if (_actionBlockerSystem.CanChangeDirection(player)) { - var diff = coords.ToMapPos(EntityManager) - player.Transform.MapPosition.Position; + var diff = mapCoords.Position - player.Transform.MapPosition.Position; if (diff.LengthSquared > 0.01f) { player.Transform.LocalRotation = new Angle(diff); } } - var arrow = EntityManager.SpawnEntity("pointingarrow", coords); + var arrow = EntityManager.SpawnEntity("pointingarrow", mapCoords); var layer = (int) VisibilityFlags.Normal; if (player.TryGetComponent(out VisibilityComponent? playerVisibility)) @@ -160,8 +161,14 @@ namespace Content.Server.Pointing.EntitySystems } else { - var tileRef = _mapManager.GetGrid(coords.GetGridId(EntityManager)).GetTileRef(coords); - var tileDef = _tileDefinitionManager[tileRef.Tile.TypeId]; + TileRef? tileRef = null; + + if (_mapManager.TryFindGridAt(mapCoords, out var grid)) + { + tileRef = grid.GetTileRef(grid.WorldToTile(mapCoords.Position)); + } + + var tileDef = _tileDefinitionManager[tileRef?.Tile.TypeId ?? 0]; selfMessage = Loc.GetString("pointing-system-point-at-tile", ("tileName", tileDef.DisplayName)); diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2424cee6db..f50985cb2a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1690,7 +1690,7 @@ Entries: situations.', type: Fix} id: 301 time: '2021-08-06T15:53:48.856573+00:00' -- author: Your_Name_Here +- author: Zumorica changes: - {message: Fixes pickup animation not showing under certain conditions., type: Fix} id: 302 diff --git a/Resources/Changelog/Parts/pointing_self.yml b/Resources/Changelog/Parts/pointing_self.yml new file mode 100644 index 0000000000..3d6d5d1b30 --- /dev/null +++ b/Resources/Changelog/Parts/pointing_self.yml @@ -0,0 +1,4 @@ +author: Zumorica +changes: + - type: Fix # One of the following: Add, Remove, Tweak, Fix + message: Fix pointing at an item in your inventory resulting in the pointing arrow playing a weird animation. diff --git a/Resources/Changelog/Parts/pointing_space.yml b/Resources/Changelog/Parts/pointing_space.yml new file mode 100644 index 0000000000..17bd93c9af --- /dev/null +++ b/Resources/Changelog/Parts/pointing_space.yml @@ -0,0 +1,4 @@ +author: Zumorica +changes: + - type: Fix # One of the following: Add, Remove, Tweak, Fix + message: Fix bug where you couldn't point at space. From 5c719a33765c926c22632f59f5871af88ff64350 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 6 Aug 2021 12:28:44 -0400 Subject: [PATCH 67/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 11 +++++++++++ Resources/Changelog/Parts/pointing_self.yml | 4 ---- Resources/Changelog/Parts/pointing_space.yml | 4 ---- 3 files changed, 11 insertions(+), 8 deletions(-) delete mode 100644 Resources/Changelog/Parts/pointing_self.yml delete mode 100644 Resources/Changelog/Parts/pointing_space.yml diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f50985cb2a..f64e8b9ff0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1695,3 +1695,14 @@ Entries: - {message: Fixes pickup animation not showing under certain conditions., type: Fix} id: 302 time: '2021-08-06T16:13:07.405459+00:00' +- author: Zumorica + changes: + - {message: Fix pointing at an item in your inventory resulting in the pointing + arrow playing a weird animation., type: Fix} + id: 303 + time: '2021-08-06T16:28:43.947928+00:00' +- author: Zumorica + changes: + - {message: Fix bug where you couldn't point at space., type: Fix} + id: 304 + time: '2021-08-06T16:28:43.948705+00:00' diff --git a/Resources/Changelog/Parts/pointing_self.yml b/Resources/Changelog/Parts/pointing_self.yml deleted file mode 100644 index 3d6d5d1b30..0000000000 --- a/Resources/Changelog/Parts/pointing_self.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Zumorica -changes: - - type: Fix # One of the following: Add, Remove, Tweak, Fix - message: Fix pointing at an item in your inventory resulting in the pointing arrow playing a weird animation. diff --git a/Resources/Changelog/Parts/pointing_space.yml b/Resources/Changelog/Parts/pointing_space.yml deleted file mode 100644 index 17bd93c9af..0000000000 --- a/Resources/Changelog/Parts/pointing_space.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Zumorica -changes: - - type: Fix # One of the following: Add, Remove, Tweak, Fix - message: Fix bug where you couldn't point at space. From 41ddf3d7ebfc24f283e5aa3c92f10a26b4faaff1 Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto Date: Fri, 6 Aug 2021 19:20:27 +0200 Subject: [PATCH 68/83] Further pickup animation improvements. --- Content.Client/Animations/ReusableAnimations.cs | 4 ++-- Content.Client/Hands/Systems/HandsSystem.cs | 2 +- Content.Client/Storage/ClientStorageComponent.cs | 4 ++-- Content.Server/Hands/Components/HandsComponent.cs | 12 ++++-------- .../Hands/Components/SharedHandsComponent.cs | 8 ++++---- .../Prototypes/Entities/Markers/clientsideclone.yml | 1 - 6 files changed, 13 insertions(+), 18 deletions(-) diff --git a/Content.Client/Animations/ReusableAnimations.cs b/Content.Client/Animations/ReusableAnimations.cs index eef860ce54..f6314348e9 100644 --- a/Content.Client/Animations/ReusableAnimations.cs +++ b/Content.Client/Animations/ReusableAnimations.cs @@ -11,7 +11,7 @@ namespace Content.Client.Animations { public static class ReusableAnimations { - public static void AnimateEntityPickup(IEntity entity, MapCoordinates initialPosition, Vector2 finalPosition) + public static void AnimateEntityPickup(IEntity entity, EntityCoordinates initialPosition, Vector2 finalPosition) { var animatableClone = entity.EntityManager.SpawnEntity("clientsideclone", initialPosition); animatableClone.Name = entity.Name; @@ -37,7 +37,7 @@ namespace Content.Client.Animations new AnimationTrackComponentProperty { ComponentType = typeof(ITransformComponent), - Property = nameof(ITransformComponent.WorldPosition), + Property = nameof(ITransformComponent.LocalPosition), InterpolationMode = AnimationInterpolationMode.Linear, KeyFrames = { diff --git a/Content.Client/Hands/Systems/HandsSystem.cs b/Content.Client/Hands/Systems/HandsSystem.cs index 5f2e40f2e5..255581effa 100644 --- a/Content.Client/Hands/Systems/HandsSystem.cs +++ b/Content.Client/Hands/Systems/HandsSystem.cs @@ -62,7 +62,7 @@ namespace Content.Client.Hands if (!_gameTiming.IsFirstTimePredicted) return; - ReusableAnimations.AnimateEntityPickup(entity, msg.InitialPosition, msg.PickupDirection); + ReusableAnimations.AnimateEntityPickup(entity, msg.InitialPosition, msg.FinalPosition); } public HandsGuiState GetGuiState() diff --git a/Content.Client/Storage/ClientStorageComponent.cs b/Content.Client/Storage/ClientStorageComponent.cs index 17039981ca..5f158365a6 100644 --- a/Content.Client/Storage/ClientStorageComponent.cs +++ b/Content.Client/Storage/ClientStorageComponent.cs @@ -116,11 +116,11 @@ namespace Content.Client.Storage for (var i = 0; msg.StoredEntities.Count > i; i++) { var entityId = msg.StoredEntities[i]; - var initialPosition = msg.EntityPositions[i].ToMap(Owner.EntityManager); + var initialPosition = msg.EntityPositions[i]; if (Owner.EntityManager.TryGetEntity(entityId, out var entity)) { - ReusableAnimations.AnimateEntityPickup(entity, initialPosition, Owner.Transform.WorldPosition); + ReusableAnimations.AnimateEntityPickup(entity, initialPosition, Owner.Transform.LocalPosition); } } } diff --git a/Content.Server/Hands/Components/HandsComponent.cs b/Content.Server/Hands/Components/HandsComponent.cs index 8f2579eaf6..7e6282c4c5 100644 --- a/Content.Server/Hands/Components/HandsComponent.cs +++ b/Content.Server/Hands/Components/HandsComponent.cs @@ -86,19 +86,15 @@ namespace Content.Server.Hands.Components protected override void HandlePickupAnimation(IEntity entity) { - var pickupDirection = Owner.Transform.MapPosition.Position; + var initialPosition = EntityCoordinates.FromMap(Owner.Transform.Coordinates.GetParent(Owner.EntityManager), entity.Transform.MapPosition); - var outermostEntity = entity; - while (outermostEntity.TryGetContainer(out var container)) //TODO: Use WorldPosition instead of this loop - outermostEntity = container.Owner; + var finalPosition = Owner.Transform.Coordinates.Position; - var initialPosition = outermostEntity.Transform.MapPosition; - - if (pickupDirection == initialPosition.Position) + if (finalPosition.EqualsApprox(initialPosition.Position)) return; Owner.EntityManager.EntityNetManager!.SendSystemNetworkMessage( - new PickupAnimationMessage(entity.Uid, pickupDirection, initialPosition)); + new PickupAnimationMessage(entity.Uid, finalPosition, initialPosition)); } #region Pull/Disarm diff --git a/Content.Shared/Hands/Components/SharedHandsComponent.cs b/Content.Shared/Hands/Components/SharedHandsComponent.cs index 3625502e0f..e98459a464 100644 --- a/Content.Shared/Hands/Components/SharedHandsComponent.cs +++ b/Content.Shared/Hands/Components/SharedHandsComponent.cs @@ -923,13 +923,13 @@ namespace Content.Shared.Hands.Components public class PickupAnimationMessage : EntityEventArgs { public EntityUid EntityUid { get; } - public MapCoordinates InitialPosition { get; } - public Vector2 PickupDirection { get; } + public EntityCoordinates InitialPosition { get; } + public Vector2 FinalPosition { get; } - public PickupAnimationMessage(EntityUid entityUid, Vector2 pickupDirection, MapCoordinates initialPosition) + public PickupAnimationMessage(EntityUid entityUid, Vector2 finalPosition, EntityCoordinates initialPosition) { EntityUid = entityUid; - PickupDirection = pickupDirection; + FinalPosition = finalPosition; InitialPosition = initialPosition; } } diff --git a/Resources/Prototypes/Entities/Markers/clientsideclone.yml b/Resources/Prototypes/Entities/Markers/clientsideclone.yml index a3c662c28a..e935d5685f 100644 --- a/Resources/Prototypes/Entities/Markers/clientsideclone.yml +++ b/Resources/Prototypes/Entities/Markers/clientsideclone.yml @@ -4,5 +4,4 @@ abstract: true components: - type: Sprite - - type: Physics - type: AnimationPlayer From 96c49a151cef9723c31034f02d2e4e77d48acde6 Mon Sep 17 00:00:00 2001 From: SethLafuente <84478872+SethLafuente@users.noreply.github.com> Date: Fri, 6 Aug 2021 15:46:51 -0700 Subject: [PATCH 69/83] Adds Science Windoors (#4433) Co-authored-by: SETh lafuente --- .../Entities/Structures/Doors/Windoors/windoor.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml index 31debff337..972dfadf25 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml @@ -29,6 +29,15 @@ - type: AccessReader access: [["Medical"]] +# Science windoor +- type: entity + parent: WindoorSecure + id: WindoorScienceLocked + suffix: Science, Locked + components: + - type: AccessReader + access: [["Research"]] + # HOP's office windoor - type: entity parent: WindoorSecure From 9c18331d96e8f12a3d81e84d259cfa8f4b2adc19 Mon Sep 17 00:00:00 2001 From: SethLafuente <84478872+SethLafuente@users.noreply.github.com> Date: Fri, 6 Aug 2021 16:11:18 -0700 Subject: [PATCH 70/83] Gave CMO a Hardsuit (#4434) Co-authored-by: SETh lafuente --- Resources/Prototypes/Catalog/Fills/Lockers/heads.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml index 415db3246d..660e6ff506 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml @@ -131,6 +131,10 @@ prob: 1 - id: ClothingMaskSterile prob: 1 + - id: ClothingHeadHelmetHardsuitMedical + prob: 1 + - id: ClothingOuterHardsuitMedical + prob: 1 - type: entity id: LockerResearchDirectorFilled From c8f4bf50b17d02e5e92ccd1c3f2d84550c643ae9 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 6 Aug 2021 19:12:20 -0400 Subject: [PATCH 71/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f64e8b9ff0..2877d4bf80 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1706,3 +1706,8 @@ Entries: - {message: Fix bug where you couldn't point at space., type: Fix} id: 304 time: '2021-08-06T16:28:43.948705+00:00' +- author: Seth + changes: + - {message: Added a hardsuit into CMO's Locker, type: Add} + id: 305 + time: '2021-08-06T23:11:18.0000000+00:00' From a1a338a12bcad16534c4b6ef6215a475c5f13809 Mon Sep 17 00:00:00 2001 From: Jaskanbe <86671825+Jaskanbe@users.noreply.github.com> Date: Fri, 6 Aug 2021 20:47:11 -0500 Subject: [PATCH 72/83] Fixed station engineer table spawn (#4436) --- Resources/Maps/saltern.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Maps/saltern.yml b/Resources/Maps/saltern.yml index 3e767d8f62..6f974e5d9d 100644 --- a/Resources/Maps/saltern.yml +++ b/Resources/Maps/saltern.yml @@ -13994,7 +13994,7 @@ entities: type: SpawnPointStationEngineer components: - rot: 4.371139006309477E-08 rad - pos: 33.5,-2.5 + pos: 33.5,-1.5 parent: 853 type: Transform - uid: 1024 From 1c081792e52d2d51126e93e986ed7dcff549d610 Mon Sep 17 00:00:00 2001 From: Swept Date: Fri, 6 Aug 2021 19:47:42 -0700 Subject: [PATCH 73/83] Maps in windoors (#4432) --- Resources/Maps/saltern.yml | 165 ++++++++++++++++++++----------------- 1 file changed, 88 insertions(+), 77 deletions(-) diff --git a/Resources/Maps/saltern.yml b/Resources/Maps/saltern.yml index 6f974e5d9d..0d3d979526 100644 --- a/Resources/Maps/saltern.yml +++ b/Resources/Maps/saltern.yml @@ -54,7 +54,7 @@ grids: - ind: "1,0" tiles: GwAAABsAAAAbAAAAIQAAACAAAAAYAAAAGAAAABgAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABsAAAAbAAAAGwAAACEAAAAgAAAAIAAAABgAAAAYAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAABgAAAAhAAAAIQAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAGAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAIAAAACAAAAAgAAAAIQAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGAAAACAAAAAYAAAAIAAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAYAAAAGAAAABgAAAAYAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAGAAAABgAAAAYAAAAIQAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABgAAAAYAAAAGAAAACEAAAAWAAAAFgAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAgAAAAIAAAACAAAAAhAAAAFgAAABYAAAAYAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIQAAAA== - ind: "0,1" - tiles: IQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAhAAAAIAAAABgAAAAhAAAAGAAAABgAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAACEAAAAgAAAAGAAAACEAAAAAAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAhAAAAIAAAABgAAAAhAAAAAAAAABgAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGAAAACAAAAAYAAAAIQAAAAAAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAACEAAAAYAAAAGAAAACEAAAAAAAAAIQAAACEAAAAWAAAAIQAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAGAAAACEAAAAhAAAAAAAAAA8AAAAhAAAAFgAAABYAAAAWAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAGAAAABgAAAAYAAAAIQAAAAAAAAAPAAAADwAAABYAAAAWAAAAFgAAACEAAAAeAAAAHgAAAB4AAAAeAAAAIQAAACAAAAAgAAAAIAAAACEAAAAAAAAADwAAAA8AAAAWAAAAFgAAABYAAAAWAAAAHgAAAB4AAAAeAAAAHgAAACEAAAAhAAAAIQAAACEAAAAhAAAAAAAAAA8AAAAhAAAAFgAAABYAAAAWAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIQAAABYAAAAWAAAAFgAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + tiles: IQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAhAAAAIAAAABgAAAAhAAAAGAAAABgAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAACEAAAAgAAAAGAAAACEAAAAAAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAhAAAAIAAAABgAAAAhAAAAAAAAABgAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGAAAACAAAAAYAAAAIQAAAAAAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAACEAAAAYAAAAGAAAACEAAAAAAAAAIQAAACEAAAAWAAAAIQAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAGAAAACEAAAAhAAAAAAAAAA8AAAAhAAAAFgAAABYAAAAWAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAGAAAABgAAAAYAAAAIQAAAAAAAAAPAAAADwAAABYAAAAWAAAAFgAAACEAAAAeAAAAHgAAAB4AAAAeAAAAIQAAACAAAAAgAAAAIAAAACEAAAAAAAAADwAAAA8AAAAWAAAAFgAAABYAAAAWAAAAHgAAAB4AAAAeAAAAHgAAACEAAAAhAAAAIQAAACEAAAAhAAAAAAAAAA8AAAAhAAAAFgAAABYAAAAWAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAFAAAABQAAAAhAAAAAAAAAAAAAAAhAAAAIQAAABYAAAAWAAAAFgAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== - ind: "-2,0" tiles: IQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAFgAAABYAAAAWAAAAFgAAACEAAAAOAAAAFgAAABYAAAAWAAAAFgAAACEAAAAeAAAAHgAAAB4AAAAeAAAAIQAAACEAAAAWAAAAFgAAACEAAAAhAAAADgAAAA4AAAAOAAAADgAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAACEAAAAhAAAAIQAAACEAAAAhAAAAGAAAACAAAAAhAAAAFgAAABYAAAAWAAAAIQAAACEAAAAWAAAAFgAAACEAAAAhAAAAFgAAABYAAAAhAAAAIAAAACAAAAAYAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAIQAAACAAAAAYAAAAGAAAACEAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAgAAAAGAAAABgAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAhAAAAIAAAABgAAAAYAAAAIQAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAhAAAAIQAAABgAAAAhAAAAIQAAACAAAAAgAAAAGAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAABgAAAAgAAAAGAAAABgAAAAgAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAIAAAACAAAAAgAAAAIAAAABgAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAhAAAAIQAAACAAAAAYAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACAAAAAgAAAAGAAAAA== - ind: "1,-1" @@ -879,15 +879,11 @@ entities: parent: 853 type: Transform - uid: 105 - type: AirlockBarGlassLocked + type: WindoorBarLocked components: - pos: -7.5,-3.5 parent: 853 type: Transform - - containers: - board: !type:Container - ents: [] - type: ContainerContainer - uid: 106 type: WeldingFuelTankFull components: @@ -12419,8 +12415,6 @@ entities: - -16,0 - -16,-16 id: grid_chunk--1--1 - mask: [] - layer: [] mass: 256 - shape: !type:PolygonShape vertices: @@ -12429,8 +12423,6 @@ entities: - -16,16 - -16,0 id: grid_chunk--1-0 - mask: [] - layer: [] mass: 256 - shape: !type:PolygonShape vertices: @@ -12439,8 +12431,6 @@ entities: - 0,0 - 0,-16 id: grid_chunk-0--1 - mask: [] - layer: [] mass: 256 - shape: !type:PolygonShape vertices: @@ -12449,8 +12439,6 @@ entities: - 0,16 - 0,0 id: grid_chunk-0-0 - mask: [] - layer: [] mass: 256 - shape: !type:PolygonShape vertices: @@ -12459,8 +12447,6 @@ entities: - 16,16 - 16,0 id: grid_chunk-1-0 - mask: [] - layer: [] mass: 256 - shape: !type:PolygonShape vertices: @@ -12479,8 +12465,6 @@ entities: - -32,16 - -32,0 id: grid_chunk--2-0 - mask: [] - layer: [] mass: 256 - shape: !type:PolygonShape vertices: @@ -12489,8 +12473,6 @@ entities: - 16,0 - 16,-16 id: grid_chunk-1--1 - mask: [] - layer: [] mass: 256 - shape: !type:PolygonShape vertices: @@ -12499,8 +12481,6 @@ entities: - 0,-16 - 0,-32 id: grid_chunk-0--2 - mask: [] - layer: [] mass: 256 - shape: !type:PolygonShape vertices: @@ -12509,8 +12489,6 @@ entities: - 16,-16 - 16,-27 id: grid_chunk-1--2 - mask: [] - layer: [] mass: 143 - shape: !type:PolygonShape vertices: @@ -12519,8 +12497,6 @@ entities: - -16,32 - -16,16 id: grid_chunk--1-1 - mask: [] - layer: [] mass: 256 - shape: !type:PolygonShape vertices: @@ -12529,8 +12505,6 @@ entities: - -3,34 - -3,32 id: grid_chunk--1-2 - mask: [] - layer: [] mass: 6 - shape: !type:PolygonShape vertices: @@ -12539,8 +12513,6 @@ entities: - 16,17 - 16,16 id: grid_chunk-1-1 - mask: [] - layer: [] mass: 2 - shape: !type:PolygonShape vertices: @@ -12549,8 +12521,6 @@ entities: - 0,34 - 0,32 id: grid_chunk-0-2 - mask: [] - layer: [] mass: 20 - shape: !type:PolygonShape vertices: @@ -12559,8 +12529,6 @@ entities: - 32,16 - 32,0 id: grid_chunk-2-0 - mask: [] - layer: [] mass: 256 - shape: !type:PolygonShape vertices: @@ -12569,8 +12537,6 @@ entities: - 48,15 - 48,0 id: grid_chunk-3-0 - mask: [] - layer: [] mass: 60 - shape: !type:PolygonShape vertices: @@ -12579,8 +12545,6 @@ entities: - 32,0 - 32,-16 id: grid_chunk-2--1 - mask: [] - layer: [] mass: 256 - shape: !type:PolygonShape vertices: @@ -12589,8 +12553,6 @@ entities: - -16,-16 - -16,-31 id: grid_chunk--1--2 - mask: [] - layer: [] mass: 240 - shape: !type:PolygonShape vertices: @@ -12599,8 +12561,6 @@ entities: - -26,-16 - -26,-28 id: grid_chunk--2--2 - mask: [] - layer: [] mass: 120 - shape: !type:PolygonShape vertices: @@ -12609,8 +12569,6 @@ entities: - -32,0 - -32,-16 id: grid_chunk--2--1 - mask: [] - layer: [] mass: 256 - shape: !type:PolygonShape vertices: @@ -12619,8 +12577,6 @@ entities: - -42,16 - -42,0 id: grid_chunk--3-0 - mask: [] - layer: [] mass: 160 - shape: !type:PolygonShape vertices: @@ -12629,8 +12585,6 @@ entities: - -40,0 - -40,-13 id: grid_chunk--3--1 - mask: [] - layer: [] mass: 104 - shape: !type:PolygonShape vertices: @@ -12639,8 +12593,6 @@ entities: - 48,0 - 48,-16 id: grid_chunk-3--1 - mask: [] - layer: [] mass: 128 - shape: !type:PolygonShape vertices: @@ -12649,8 +12601,6 @@ entities: - 40,-16 - 40,-32 id: grid_chunk-2--2 - mask: [] - layer: [] mass: 128 - shape: !type:PolygonShape vertices: @@ -12659,8 +12609,6 @@ entities: - 48,-16 - 48,-32 id: grid_chunk-3--2 - mask: [] - layer: [] mass: 176 - shape: !type:PolygonShape vertices: @@ -12669,8 +12617,6 @@ entities: - 48,-32 - 48,-34 id: grid_chunk-3--3 - mask: [] - layer: [] mass: 22 - shape: !type:PolygonShape vertices: @@ -12679,8 +12625,6 @@ entities: - 40,-32 - 40,-34 id: grid_chunk-2--3 - mask: [] - layer: [] mass: 16 - shape: !type:PolygonShape vertices: @@ -12689,8 +12633,6 @@ entities: - -28,27 - -28,16 id: grid_chunk--2-1 - mask: [] - layer: [] mass: 132 bodyType: Dynamic type: Physics @@ -13659,6 +13601,10 @@ entities: type: Transform - canCollide: False type: Physics + - containers: + storagebase: !type:Container + ents: [] + type: ContainerContainer - uid: 985 type: VendingMachineCoffee components: @@ -14057,10 +14003,10 @@ entities: - airBlocked: False type: Airtight - uid: 1032 - type: TableReinforced + type: Windoor components: - - rot: 4.371139006309477E-08 rad - pos: 0.5,-14.5 + - rot: -1.5707963267948966 rad + pos: 6.5,20.5 parent: 853 type: Transform - uid: 1033 @@ -20737,10 +20683,10 @@ entities: parent: 853 type: Transform - uid: 1855 - type: WallReinforced + type: EmergencyLight components: - - rot: 4.371139006309477E-08 rad - pos: 10.5,26.5 + - rot: -1.5707963267948966 rad + pos: 9.693537,24.5 parent: 853 type: Transform - uid: 1856 @@ -40400,16 +40346,12 @@ entities: - startingCharge: 30000 type: Battery - uid: 3909 - type: EmergencyLight + type: WindoorMedicalLocked components: - - rot: 4.71238902409608 rad - pos: 9.704595,26.5 + - rot: 3.141592653589793 rad + pos: 15.5,-3.5 parent: 853 type: Transform - - powerLoad: 1 - type: ApcPowerReceiver - - startingCharge: 30000 - type: Battery - uid: 3910 type: EmergencyLight components: @@ -41415,13 +41357,12 @@ entities: - airBlocked: False type: Airtight - uid: 4019 - type: FirelockGlass + type: WindoorMedicalLocked components: - - pos: 0.5,-14.5 + - rot: -1.5707963267948966 rad + pos: 0.5,-15.5 parent: 853 type: Transform - - airBlocked: False - type: Airtight - uid: 4020 type: ShellShotgunBeanbag components: @@ -50320,4 +50261,74 @@ entities: type: Transform - canCollide: False type: Physics +- uid: 5083 + type: WallSolid + components: + - rot: -1.5707963267948966 rad + pos: 0.5,-14.5 + parent: 853 + type: Transform +- uid: 5084 + type: WindoorCommandLocked + components: + - rot: 1.5707963267948966 rad + pos: 6.5,20.5 + parent: 853 + type: Transform +- uid: 5085 + type: WallReinforced + components: + - rot: -1.5707963267948966 rad + pos: 11.5,27.5 + parent: 853 + type: Transform +- uid: 5086 + type: WallReinforced + components: + - rot: -1.5707963267948966 rad + pos: 12.5,27.5 + parent: 853 + type: Transform +- uid: 5087 + type: WallReinforced + components: + - rot: -1.5707963267948966 rad + pos: 13.5,27.5 + parent: 853 + type: Transform +- uid: 5088 + type: WallReinforced + components: + - rot: -1.5707963267948966 rad + pos: 13.5,26.5 + parent: 853 + type: Transform +- uid: 5089 + type: AirlockCommandLocked + components: + - rot: -1.5707963267948966 rad + pos: 10.5,26.5 + parent: 853 + type: Transform + - containers: + board: !type:Container + ents: [] + type: ContainerContainer +- uid: 5090 + type: ToiletEmpty + components: + - rot: -1.5707963267948966 rad + pos: 12.5,26.5 + parent: 853 + type: Transform + - containers: + stash: !type:ContainerSlot {} + type: ContainerContainer +- uid: 5091 + type: SoapNT + components: + - rot: -1.5668895244598389 rad + pos: 11.687332,26.585844 + parent: 853 + type: Transform ... From 83be320a7416d909ac8ac7d39089dc6b40d3d546 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 6 Aug 2021 22:48:45 -0400 Subject: [PATCH 74/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2877d4bf80..85a5e55a98 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1711,3 +1711,8 @@ Entries: - {message: Added a hardsuit into CMO's Locker, type: Add} id: 305 time: '2021-08-06T23:11:18.0000000+00:00' +- author: SweptWasTaken + changes: + - {message: Maps in windoors, type: Add} + id: 306 + time: '2021-08-07T02:47:43.0000000+00:00' From 298a77c7af25e4c08d167d303dcfb52c9d24b6e8 Mon Sep 17 00:00:00 2001 From: scrato Date: Sat, 7 Aug 2021 23:18:42 +0200 Subject: [PATCH 75/83] Losing a head doesn't mean you lose your eyes #3956 #4061 (#4225) Co-authored-by: Michael Will --- .../HumanoidAppearanceComponent.cs | 24 ++-- .../HumanoidVisualLayersExtension.cs | 115 ++++++++++++------ 2 files changed, 86 insertions(+), 53 deletions(-) diff --git a/Content.Client/CharacterAppearance/HumanoidAppearanceComponent.cs b/Content.Client/CharacterAppearance/HumanoidAppearanceComponent.cs index d4c0c3ce4e..0d55e206d9 100644 --- a/Content.Client/CharacterAppearance/HumanoidAppearanceComponent.cs +++ b/Content.Client/CharacterAppearance/HumanoidAppearanceComponent.cs @@ -1,4 +1,4 @@ -using Content.Client.Cuffs.Components; +using Content.Client.Cuffs.Components; using Content.Shared.Body.Components; using Content.Shared.Body.Part; using Content.Shared.CharacterAppearance; @@ -120,15 +120,10 @@ namespace Content.Client.CharacterAppearance return; } - var layer = args.Part.ToHumanoidLayer(); - - if (layer == null) - { - return; - } - + var layers = args.Part.ToHumanoidLayers(); // TODO BODY Layer color, sprite and state - sprite.LayerSetVisible(layer, true); + foreach (var layer in layers) + sprite.LayerSetVisible(layer, true); } public void BodyPartRemoved(BodyPartRemovedEventArgs args) @@ -143,15 +138,10 @@ namespace Content.Client.CharacterAppearance return; } - var layer = args.Part.ToHumanoidLayer(); - - if (layer == null) - { - return; - } - + var layers = args.Part.ToHumanoidLayers(); // TODO BODY Layer color, sprite and state - sprite.LayerSetVisible(layer, false); + foreach (var layer in layers) + sprite.LayerSetVisible(layer, false); } } } diff --git a/Content.Shared/CharacterAppearance/HumanoidVisualLayersExtension.cs b/Content.Shared/CharacterAppearance/HumanoidVisualLayersExtension.cs index bec83f47df..7416420837 100644 --- a/Content.Shared/CharacterAppearance/HumanoidVisualLayersExtension.cs +++ b/Content.Shared/CharacterAppearance/HumanoidVisualLayersExtension.cs @@ -1,47 +1,90 @@ -using System; +using System; +using System.Collections.Generic; using Content.Shared.Body.Part; namespace Content.Shared.CharacterAppearance { public static class HumanoidVisualLayersExtension { - public static HumanoidVisualLayers? ToHumanoidLayer(this SharedBodyPartComponent part) + public static IEnumerable ToHumanoidLayers(this SharedBodyPartComponent part) { - return part.PartType switch + switch (part.PartType) { - BodyPartType.Other => null, - BodyPartType.Torso => HumanoidVisualLayers.Chest, - BodyPartType.Head => HumanoidVisualLayers.Head, - BodyPartType.Arm => part.Symmetry switch - { - BodyPartSymmetry.None => null, - BodyPartSymmetry.Left => HumanoidVisualLayers.LArm, - BodyPartSymmetry.Right => HumanoidVisualLayers.RArm, - _ => throw new ArgumentOutOfRangeException() - }, - BodyPartType.Hand => part.Symmetry switch - { - BodyPartSymmetry.None => null, - BodyPartSymmetry.Left => HumanoidVisualLayers.LHand, - BodyPartSymmetry.Right => HumanoidVisualLayers.RHand, - _ => throw new ArgumentOutOfRangeException() - }, - BodyPartType.Leg => part.Symmetry switch - { - BodyPartSymmetry.None => null, - BodyPartSymmetry.Left => HumanoidVisualLayers.LLeg, - BodyPartSymmetry.Right => HumanoidVisualLayers.RLeg, - _ => throw new ArgumentOutOfRangeException() - }, - BodyPartType.Foot => part.Symmetry switch - { - BodyPartSymmetry.None => null, - BodyPartSymmetry.Left => HumanoidVisualLayers.LFoot, - BodyPartSymmetry.Right => HumanoidVisualLayers.RFoot, - _ => throw new ArgumentOutOfRangeException() - }, - _ => throw new ArgumentOutOfRangeException() - }; + case BodyPartType.Other: + yield break; + case BodyPartType.Torso: + yield return HumanoidVisualLayers.Chest; + break; + case BodyPartType.Head: + yield return HumanoidVisualLayers.Head; + yield return HumanoidVisualLayers.Eyes; + yield return HumanoidVisualLayers.FacialHair; + yield return HumanoidVisualLayers.Hair; + yield return HumanoidVisualLayers.StencilMask; + break; + case BodyPartType.Arm: + switch (part.Symmetry) + { + case BodyPartSymmetry.None: + yield break; + case BodyPartSymmetry.Left: + yield return HumanoidVisualLayers.LArm; + break; + case BodyPartSymmetry.Right: + yield return HumanoidVisualLayers.RArm; + break; + default: + yield break; + } + yield break; + case BodyPartType.Hand: + switch (part.Symmetry) + { + case BodyPartSymmetry.None: + yield break; + case BodyPartSymmetry.Left: + yield return HumanoidVisualLayers.LHand; + break; + case BodyPartSymmetry.Right: + yield return HumanoidVisualLayers.RHand; + break; + default: + yield break; + } + yield break; + case BodyPartType.Leg: + switch (part.Symmetry) + { + case BodyPartSymmetry.None: + yield break; + case BodyPartSymmetry.Left: + yield return HumanoidVisualLayers.LLeg; + break; + case BodyPartSymmetry.Right: + yield return HumanoidVisualLayers.RLeg; + break; + default: + yield break; + } + yield break; + case BodyPartType.Foot: + switch (part.Symmetry) + { + case BodyPartSymmetry.None: + yield break; + case BodyPartSymmetry.Left: + yield return HumanoidVisualLayers.LFoot; + break; + case BodyPartSymmetry.Right: + yield return HumanoidVisualLayers.RFoot; + break; + default: + yield break; + } + yield break; + default: + yield break; + } } } } From 53ada863b5367ff2d1748e54f07ff707c3e36e83 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 7 Aug 2021 17:19:45 -0400 Subject: [PATCH 76/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 85a5e55a98..15cb603219 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1716,3 +1716,9 @@ Entries: - {message: Maps in windoors, type: Add} id: 306 time: '2021-08-07T02:47:43.0000000+00:00' +- author: scrato + changes: + - {message: 'When the head is detached from the body, the hair, eyes and ears will + not remain at the body.', type: Add} + id: 307 + time: '2021-08-07T21:18:43.0000000+00:00' From 8505d307a7165e5a483bce8c97f48fd9ed304a72 Mon Sep 17 00:00:00 2001 From: TimrodDX Date: Sat, 7 Aug 2021 17:29:47 -0400 Subject: [PATCH 77/83] Adds windoors for security and the brig. (#4441) --- .../Entities/Structures/Doors/Windoors/windoor.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml index 972dfadf25..57fa6f18a9 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml @@ -55,3 +55,12 @@ components: - type: AccessReader access: [["Cargo"]] + +# Security windoor +- type: entity + parent: WindoorSecure + id: WindoorSecurityLocked + suffix: Security, Locked + components: + - type: AccessReader + access: [["Security"]] From 4f549d359b63298a30b4690fa6cd25ad1fb6e57e Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 7 Aug 2021 17:30:49 -0400 Subject: [PATCH 78/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 15cb603219..e7cb9d0e85 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1722,3 +1722,8 @@ Entries: not remain at the body.', type: Add} id: 307 time: '2021-08-07T21:18:43.0000000+00:00' +- author: TimrodDX + changes: + - {message: Security windoors for planned mapping rework., type: Add} + id: 308 + time: '2021-08-07T21:29:47.0000000+00:00' From 19e3c7f339016909a5e907c731046d1376b4b1a1 Mon Sep 17 00:00:00 2001 From: TimrodDX Date: Sat, 7 Aug 2021 20:32:18 -0400 Subject: [PATCH 79/83] Remaps Chemistry and Security, and some Mapping Fixes (#4442) --- Resources/Maps/saltern.yml | 1553 ++++++++++++++++++++++-------------- 1 file changed, 956 insertions(+), 597 deletions(-) diff --git a/Resources/Maps/saltern.yml b/Resources/Maps/saltern.yml index 0d3d979526..74a436b43f 100644 --- a/Resources/Maps/saltern.yml +++ b/Resources/Maps/saltern.yml @@ -46,19 +46,19 @@ grids: - ind: "-1,-1" tiles: GAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAIQAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAYAAAAGAAAACEAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAhAAAAIQAAABgAAAAhAAAAIQAAACEAAAAgAAAAGAAAABgAAAAhAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGAAAABgAAAAYAAAAGAAAABgAAAAhAAAAIAAAABgAAAAYAAAAIQAAABsAAAAbAAAAGwAAACEAAAAhAAAAIQAAABgAAAAYAAAAGAAAABgAAAAYAAAAIQAAACAAAAAYAAAAGAAAACEAAAAhAAAAGwAAACEAAAAhAAAAIAAAACAAAAAYAAAAGAAAABgAAAAYAAAAGAAAACEAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAGAAAABgAAAAYAAAAGAAAABgAAAAhAAAAIAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAIQAAABgAAAAhAAAAIQAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAGAAAABgAAAAYAAAAGAAAABgAAAAeAAAAHgAAAB4AAAAeAAAAGAAAAA8AAAAPAAAADwAAAA8AAAAPAAAAIQAAABgAAAAYAAAAIAAAABgAAAAgAAAAHgAAAB4AAAAeAAAAHgAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAACEAAAAYAAAAGAAAACAAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAADwAAAA8AAAAPAAAADwAAAA8AAAAhAAAAIQAAACEAAAAgAAAAFgAAAAoAAAAKAAAACgAAAAoAAAAKAAAAIQAAAA8AAAAPAAAADwAAAA8AAAAPAAAAHgAAAB4AAAAeAAAAIQAAACEAAAAKAAAACgAAAAoAAAAKAAAACgAAACEAAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAACEAAAAhAAAAIQAAABYAAAAhAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAGwAAABsAAAAbAAAAGwAAABsAAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAIQAAABsAAAAbAAAAGwAAABsAAAAWAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAA== - ind: "-1,0" - tiles: FgAAABsAAAAbAAAAGwAAABsAAAAWAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAACEAAAAbAAAAGwAAABsAAAAbAAAAFgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAABYAAAAhAAAAFgAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAACAAAAAhAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAIQAAABYAAAAgAAAAIQAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAACEAAAAWAAAAIAAAACEAAAAWAAAAFgAAABYAAAAhAAAAFgAAACEAAAAhAAAAFgAAABYAAAAhAAAAIQAAABYAAAAhAAAAIQAAACAAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAgAAAAGAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAAA== + tiles: FgAAABsAAAAbAAAAGwAAABsAAAAWAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAACEAAAAbAAAAGwAAABsAAAAbAAAAFgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAABYAAAAWAAAAIAAAABYAAAAWAAAAIAAAACAAAAAgAAAAFgAAABYAAAAgAAAAFgAAACAAAAAWAAAAFgAAACAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAgAAAAIAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAgAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIAAAACAAAAAgAAAAFgAAACAAAAAWAAAAIAAAABYAAAAgAAAAIAAAABYAAAAWAAAAIAAAACAAAAAgAAAAIAAAACAAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAgAAAAGAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAAA== - ind: "0,-1" tiles: GwAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABsAAAAbAAAAGwAAABsAAAAhAAAAGwAAABsAAAAbAAAAGwAAABsAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAABsAAAAbAAAAGwAAABsAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAGwAAABsAAAAbAAAAGwAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAACEAAAAWAAAAFgAAABYAAAAhAAAAIQAAACEAAAAbAAAAIQAAACEAAAAhAAAAGwAAABsAAAAbAAAAIQAAACAAAAAhAAAAFgAAABYAAAAWAAAAIQAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAgAAAAIQAAABYAAAAWAAAAFgAAACEAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAIAAAACEAAAAWAAAAFgAAABYAAAAhAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAACAAAAAhAAAAFgAAABYAAAAWAAAAIQAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAgAAAAGAAAABYAAAAWAAAAFgAAACEAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGAAAACEAAAAWAAAAFgAAABYAAAAhAAAAIQAAABsAAAAhAAAAIQAAABsAAAAbAAAAIQAAACEAAAAbAAAAGwAAACEAAAAhAAAAFgAAABYAAAAWAAAAIQAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAhAAAAGwAAABsAAAAeAAAAIQAAABYAAAAWAAAAFgAAACEAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAIQAAABsAAAAbAAAAHgAAACEAAAAWAAAAFgAAABYAAAAhAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAACEAAAAbAAAAGwAAAB4AAAAWAAAAFgAAABYAAAAWAAAAFgAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAeAAAAFgAAABYAAAAWAAAAFgAAABYAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAHgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAAA== - ind: "0,0" - tiles: HgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAAB4AAAAhAAAAFgAAABYAAAAWAAAAIQAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAhAAAAIQAAABYAAAAWAAAAFgAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAWAAAAFgAAABYAAAAhAAAAIQAAABYAAAAhAAAAFgAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAhAAAAFgAAACEAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAhAAAAIQAAACEAAAAYAAAAIQAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAIQAAACAAAAAgAAAAIAAAACAAAAAgAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAIQAAABYAAAAWAAAAFgAAABgAAAAgAAAAGAAAABgAAAAYAAAAIAAAACAAAAAgAAAAGAAAABgAAAAYAAAAIQAAACEAAAAWAAAAFgAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIAAAABgAAAAhAAAAGAAAAA== + tiles: HgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAAB4AAAAhAAAAFgAAABYAAAAWAAAAIQAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAhAAAAIQAAABYAAAAWAAAAFgAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIAAAACEAAAAWAAAAFgAAABYAAAAhAAAAIQAAABYAAAAhAAAAFgAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAhAAAAFgAAACEAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAhAAAAIQAAACEAAAAYAAAAIQAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAIQAAACAAAAAgAAAAIAAAACAAAAAgAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAIQAAABYAAAAWAAAAFgAAABgAAAAgAAAAGAAAABgAAAAYAAAAIAAAACAAAAAgAAAAGAAAABgAAAAYAAAAIQAAACEAAAAWAAAAFgAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIAAAABgAAAAhAAAAGAAAAA== - ind: "1,0" - tiles: GwAAABsAAAAbAAAAIQAAACAAAAAYAAAAGAAAABgAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABsAAAAbAAAAGwAAACEAAAAgAAAAIAAAABgAAAAYAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAABgAAAAhAAAAIQAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAGAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAIAAAACAAAAAgAAAAIQAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGAAAACAAAAAYAAAAIAAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAYAAAAGAAAABgAAAAYAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAGAAAABgAAAAYAAAAIQAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABgAAAAYAAAAGAAAACEAAAAWAAAAFgAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAgAAAAIAAAACAAAAAhAAAAFgAAABYAAAAYAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIQAAAA== + tiles: GwAAABsAAAAbAAAAGwAAACAAAAAYAAAAGAAAABgAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABsAAAAbAAAAGwAAABsAAAAgAAAAIAAAABgAAAAYAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAABgAAAAhAAAAIQAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAGAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAIAAAACAAAAAgAAAAIQAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGAAAACAAAAAYAAAAIAAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAYAAAAGAAAABgAAAAYAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAGAAAABgAAAAYAAAAIQAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABgAAAAYAAAAGAAAACEAAAAWAAAAFgAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAgAAAAIAAAACAAAAAhAAAAFgAAABYAAAAYAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIQAAAA== - ind: "0,1" tiles: IQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAhAAAAIAAAABgAAAAhAAAAGAAAABgAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAACEAAAAgAAAAGAAAACEAAAAAAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAhAAAAIAAAABgAAAAhAAAAAAAAABgAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGAAAACAAAAAYAAAAIQAAAAAAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAFgAAACEAAAAYAAAAGAAAACEAAAAAAAAAIQAAACEAAAAWAAAAIQAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAGAAAACEAAAAhAAAAAAAAAA8AAAAhAAAAFgAAABYAAAAWAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAGAAAABgAAAAYAAAAIQAAAAAAAAAPAAAADwAAABYAAAAWAAAAFgAAACEAAAAeAAAAHgAAAB4AAAAeAAAAIQAAACAAAAAgAAAAIAAAACEAAAAAAAAADwAAAA8AAAAWAAAAFgAAABYAAAAWAAAAHgAAAB4AAAAeAAAAHgAAACEAAAAhAAAAIQAAACEAAAAhAAAAAAAAAA8AAAAhAAAAFgAAABYAAAAWAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAFAAAABQAAAAhAAAAAAAAAAAAAAAhAAAAIQAAABYAAAAWAAAAFgAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== - ind: "-2,0" tiles: IQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAFgAAABYAAAAWAAAAFgAAACEAAAAOAAAAFgAAABYAAAAWAAAAFgAAACEAAAAeAAAAHgAAAB4AAAAeAAAAIQAAACEAAAAWAAAAFgAAACEAAAAhAAAADgAAAA4AAAAOAAAADgAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAIQAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAACEAAAAhAAAAIQAAACEAAAAhAAAAGAAAACAAAAAhAAAAFgAAABYAAAAWAAAAIQAAACEAAAAWAAAAFgAAACEAAAAhAAAAFgAAABYAAAAhAAAAIAAAACAAAAAYAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAWAAAAIQAAACAAAAAYAAAAGAAAACEAAAAWAAAAFgAAABYAAAAWAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAgAAAAGAAAABgAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAWAAAAFgAAABYAAAAhAAAAIAAAABgAAAAYAAAAIQAAABYAAAAWAAAAFgAAABYAAAAhAAAAFgAAABYAAAAhAAAAIQAAABgAAAAhAAAAIQAAACAAAAAgAAAAGAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAABgAAAAgAAAAGAAAABgAAAAgAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAIAAAACAAAAAgAAAAIAAAABgAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAhAAAAIQAAACAAAAAYAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACAAAAAgAAAAGAAAAA== - ind: "1,-1" - tiles: GwAAABsAAAAbAAAAGwAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAABsAAAAbAAAAGwAAABsAAAAhAAAAGwAAABsAAAAbAAAAGwAAACEAAAAgAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAhAAAAIAAAABgAAAAhAAAAAAAAAAAAAAAAAAAAIQAAACEAAAAbAAAAGwAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAABsAAAAbAAAAGwAAABsAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAgAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAbAAAAGwAAABsAAAAbAAAAGAAAACAAAAAYAAAAGAAAABgAAAAYAAAAIAAAABgAAAAhAAAAAAAAAAAAAAAAAAAAGwAAABsAAAAbAAAAGwAAACEAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAABsAAAAbAAAAGwAAABsAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAgAAAAGAAAACEAAAAhAAAAIQAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAABsAAAAbAAAAGwAAABsAAAAhAAAAIAAAABgAAAAhAAAAIAAAACAAAAAgAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAIQAAACAAAAAgAAAAIAAAACAAAAAYAAAAGAAAABsAAAAbAAAAGwAAABsAAAAhAAAAGwAAABsAAAAbAAAAGwAAACEAAAAgAAAAGAAAACEAAAAhAAAAIQAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAABsAAAAbAAAAGwAAABsAAAAhAAAAIAAAABgAAAAhAAAAFgAAABYAAAAWAAAAIQAAABsAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACAAAAAYAAAAIQAAABYAAAAWAAAAFgAAABsAAAAbAAAAGwAAACEAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAGAAAACEAAAAWAAAAFgAAABYAAAAbAAAAGwAAABsAAAAhAAAAIAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAhAAAAFgAAABYAAAAWAAAAGwAAABsAAAAbAAAAIQAAACAAAAAYAAAAGAAAACAAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAAA== + tiles: GwAAABsAAAAbAAAAGwAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAABsAAAAbAAAAGwAAABsAAAAhAAAAGwAAABsAAAAbAAAAGwAAACEAAAAgAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAhAAAAIAAAABgAAAAhAAAAAAAAAAAAAAAAAAAAIQAAACEAAAAbAAAAGwAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAABsAAAAbAAAAGwAAABsAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAgAAAAGAAAACEAAAAAAAAAAAAAAAAAAAAbAAAAGwAAABsAAAAbAAAAGAAAACAAAAAYAAAAGAAAABgAAAAYAAAAIAAAABgAAAAhAAAAAAAAAAAAAAAAAAAAGwAAABsAAAAbAAAAGwAAACEAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAYAAAAIQAAAAAAAAAAAAAAAAAAABsAAAAbAAAAGwAAABsAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAgAAAAGAAAACEAAAAhAAAAIQAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAABsAAAAbAAAAGwAAABsAAAAhAAAAIAAAABgAAAAhAAAAIAAAACAAAAAgAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAIQAAACAAAAAgAAAAIAAAACAAAAAYAAAAGAAAABsAAAAbAAAAGwAAABsAAAAhAAAAGwAAABsAAAAbAAAAGwAAACEAAAAgAAAAGAAAACEAAAAhAAAAIQAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAABsAAAAbAAAAGwAAABsAAAAhAAAAIAAAABgAAAAhAAAAFgAAABYAAAAWAAAAIQAAABsAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACAAAAAYAAAAIQAAABYAAAAWAAAAFgAAABsAAAAbAAAAGwAAABsAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAGAAAACEAAAAWAAAAFgAAABYAAAAbAAAAGwAAABsAAAAbAAAAIAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAhAAAAFgAAABYAAAAWAAAAGwAAABsAAAAbAAAAGwAAACAAAAAYAAAAGAAAACAAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAFgAAAA== - ind: "0,-2" tiles: AAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAAAAAAAAAAAAAAAAAhAAAAFgAAABYAAAAWAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAAAAAAAAAAAAAAAAAIQAAABYAAAAWAAAAFgAAACEAAAAeAAAAHgAAAB4AAAAeAAAAIQAAAB4AAAAeAAAAIQAAAAAAAAAAAAAAIQAAACEAAAAWAAAAFgAAABYAAAAhAAAAHgAAAB4AAAAeAAAAHgAAACEAAAAhAAAAIQAAACEAAAAAAAAAAAAAABgAAAAhAAAAFgAAABYAAAAWAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAAAAAAAAAAAAYAAAAIQAAABYAAAAWAAAAFgAAACEAAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAIQAAACEAAAAhAAAAGAAAACEAAAAWAAAAFgAAABYAAAAhAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAACEAAAAgAAAAIAAAABgAAAAhAAAAFgAAABYAAAAWAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAhAAAAIAAAABgAAAAgAAAAGAAAABYAAAAWAAAAFgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAIQAAACAAAAAYAAAAIQAAACEAAAAWAAAAFgAAABYAAAAhAAAAIQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAACEAAAAgAAAAGAAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAhAAAAGAAAACEAAAAhAAAAIQAAACEAAAAhAAAAIAAAABgAAAAbAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAYAAAAGwAAABYAAAAWAAAAFgAAABYAAAAWAAAAGAAAACAAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAgAAAAGAAAACEAAAAWAAAAFgAAABYAAAAWAAAAFgAAACEAAAAYAAAAGAAAABgAAAAYAAAAIQAAACEAAAAhAAAAGAAAACEAAAAhAAAAFgAAABYAAAAWAAAAFgAAABYAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAbAAAAGwAAABsAAAAbAAAAIQAAABYAAAAWAAAAFgAAABYAAAAWAAAAIQAAABsAAAAbAAAAGwAAABsAAAAhAAAAGwAAABsAAAAbAAAAGwAAAA== - ind: "1,-2" @@ -279,8 +279,7 @@ entities: - uid: 23 type: SuspicionPistolMagazineSpawner components: - - rot: 4.371139006309477E-08 rad - pos: -9.5,6.5 + - pos: -13.5,7.5 parent: 853 type: Transform - uid: 24 @@ -326,10 +325,9 @@ entities: parent: 853 type: Transform - uid: 30 - type: SuspicionSMGSpawner + type: RandomSpawner components: - - rot: 4.371139006309477E-08 rad - pos: -7.5,8.5 + - pos: 26.5,-5.5 parent: 853 type: Transform - uid: 31 @@ -346,13 +344,11 @@ entities: parent: 853 type: Transform - uid: 33 - type: LargeBeaker + type: WallReinforced components: - - pos: 17.923235,1.6235776 + - pos: 20.5,-0.5 parent: 853 type: Transform - - canCollide: False - type: Physics - uid: 34 type: SuspicionGrenadesSpawner components: @@ -377,8 +373,7 @@ entities: - uid: 37 type: SuspicionGrenadesSpawner components: - - rot: 4.371139006309477E-08 rad - pos: 18.5,1.5 + - pos: 21.5,0.5 parent: 853 type: Transform - uid: 38 @@ -1226,9 +1221,9 @@ entities: parent: 853 type: Transform - uid: 148 - type: TableReinforcedGlass + type: ReinforcedWindow components: - - pos: 14.5,-2.5 + - pos: -1.5,12.5 parent: 853 type: Transform - uid: 149 @@ -1298,9 +1293,9 @@ entities: parent: 853 type: Transform - uid: 157 - type: TableReinforcedGlass + type: LowWall components: - - pos: 14.5,-1.5 + - pos: -1.5,13.5 parent: 853 type: Transform - uid: 158 @@ -1313,19 +1308,20 @@ entities: stash: !type:ContainerSlot {} type: ContainerContainer - uid: 159 + type: chem_master + components: + - pos: 16.5,1.5 + parent: 853 + type: Transform + - containers: + ChemMaster-reagentContainerContainer: !type:ContainerSlot {} + type: ContainerContainer +- uid: 160 type: WallReinforced components: - - pos: 13.5,1.5 + - pos: 20.5,-1.5 parent: 853 type: Transform -- uid: 160 - type: LargeBeaker - components: - - pos: 17.454485,1.6235776 - parent: 853 - type: Transform - - canCollide: False - type: Physics - uid: 161 type: CableApcExtension components: @@ -1954,26 +1950,22 @@ entities: - canCollide: False type: Physics - uid: 215 - type: DisposalTrunk + type: CableApcExtension components: - anchored: True - pos: 14.5,1.5 + pos: -6.5,4.5 parent: 853 type: Transform - - containers: - DisposalEntry: !type:Container - ents: [] - type: ContainerContainer + - visible: False + type: Sprite + - canCollide: False + type: Physics - uid: 216 - type: DisposalUnit + type: LowWall components: - - pos: 14.5,1.5 + - pos: -10.5,6.5 parent: 853 type: Transform - - containers: - DisposalUnit: !type:Container - ents: [] - type: ContainerContainer - uid: 217 type: DisposalPipe components: @@ -2953,39 +2945,34 @@ entities: ents: [] type: ContainerContainer - uid: 300 + type: Poweredlight + components: + - pos: -4.226936,15.0964775 + parent: 853 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer +- uid: 301 type: DisposalPipe components: - anchored: True - pos: 14.5,0.5 + rot: -1.5707963267948966 rad + pos: 13.5,-0.5 parent: 853 type: Transform - containers: DisposalTransit: !type:Container ents: [] type: ContainerContainer -- uid: 301 - type: DisposalJunctionFlipped - components: - - anchored: True - pos: 12.5,-0.5 - parent: 853 - type: Transform - - containers: - DisposalJunction: !type:Container - ents: [] - type: ContainerContainer - uid: 302 - type: DisposalBend + type: WallReinforced components: - - anchored: True - rot: -1.5707963267948966 rad - pos: 14.5,-0.5 + - pos: -1.5,11.5 parent: 853 type: Transform - - containers: - DisposalBend: !type:Container - ents: [] - type: ContainerContainer - uid: 303 type: Window components: @@ -4470,10 +4457,9 @@ entities: parent: 853 type: Transform - uid: 444 - type: RandomSpawner + type: SuspicionSMGSpawner components: - - rot: 4.371139006309477E-08 rad - pos: 20.5,0.5 + - pos: -10.5,7.5 parent: 853 type: Transform - uid: 445 @@ -4842,10 +4828,9 @@ entities: parent: 853 type: Transform - uid: 497 - type: RandomSpawner + type: SpawnPointSecurityOfficer components: - - rot: 4.371139006309477E-08 rad - pos: -3.5,7.5 + - pos: -2.5,8.5 parent: 853 type: Transform - uid: 498 @@ -4863,10 +4848,9 @@ entities: parent: 853 type: Transform - uid: 500 - type: RandomSpawner + type: SpawnPointSecurityOfficer components: - - rot: 4.371139006309477E-08 rad - pos: -7.5,23.5 + - pos: -13.5,14.5 parent: 853 type: Transform - uid: 501 @@ -5280,31 +5264,23 @@ entities: parent: 853 type: Transform - uid: 554 - type: AirlockSecurityGlassLocked + type: BoxBeaker components: - - name: Cell 2 - type: MetaData - - rot: 4.371139006309477E-08 rad - pos: 0.5,9.5 + - pos: 19.51463,0.6960156 parent: 853 type: Transform + - canCollide: False + type: Physics - containers: - board: !type:Container + storagebase: !type:Container ents: [] type: ContainerContainer - uid: 555 - type: AirlockSecurityGlassLocked + type: EmergencyLight components: - - name: Cell 1 - type: MetaData - - rot: 4.371139006309477E-08 rad - pos: -2.5,9.5 + - pos: 0.49181414,14.9871025 parent: 853 type: Transform - - containers: - board: !type:Container - ents: [] - type: ContainerContainer - uid: 556 type: Catwalk components: @@ -5529,33 +5505,32 @@ entities: ents: [] type: ContainerContainer - uid: 576 - type: ChairOfficeDark + type: Firelock components: - - rot: 1.5707963705062866 rad - pos: -8.5,8.5 + - pos: 15.5,-3.5 parent: 853 type: Transform - uid: 577 - type: ChairOfficeDark + type: FirelockGlass components: - - rot: 4.371139006309477E-08 rad - pos: -9.5,7.5 + - pos: -6.5,3.5 parent: 853 type: Transform - uid: 578 - type: TableReinforced + type: TableMetal components: - - rot: 4.371139006309477E-08 rad - pos: -8.5,6.5 + - pos: -0.5,13.5 parent: 853 type: Transform - uid: 579 - type: TableReinforced + type: chem_dispenser components: - - rot: 4.371139006309477E-08 rad - pos: -9.5,6.5 + - pos: 17.5,1.5 parent: 853 type: Transform + - containers: + ReagentDispenser-reagentContainerContainer: !type:ContainerSlot {} + type: ContainerContainer - uid: 580 type: SuspicionHitscanSpawner components: @@ -5854,18 +5829,13 @@ entities: ents: [] type: ContainerContainer - uid: 607 - type: AirlockSecurityGlassLocked + type: SheetPlasma1 components: - - name: Brig - type: MetaData - - rot: 4.371139006309477E-08 rad - pos: -6.5,6.5 + - pos: 19.54588,-0.4289844 parent: 853 type: Transform - - containers: - board: !type:Container - ents: [] - type: ContainerContainer + - canCollide: False + type: Physics - uid: 608 type: CableApcExtension components: @@ -6108,18 +6078,11 @@ entities: ents: [] type: ContainerContainer - uid: 629 - type: AirlockSecurityGlassLocked + type: WallReinforced components: - - name: Reception Desk - type: MetaData - - rot: 4.371139006309477E-08 rad - pos: -9.5,9.5 + - pos: 20.5,1.5 parent: 853 type: Transform - - containers: - board: !type:Container - ents: [] - type: ContainerContainer - uid: 630 type: AirlockSecurityGlassLocked components: @@ -6381,44 +6344,24 @@ entities: ents: [] type: ContainerContainer - uid: 651 - type: AirlockSecurityGlassLocked + type: Chair components: - - name: Brig - type: MetaData - - rot: 4.371139006309477E-08 rad - pos: -6.5,9.5 + - pos: -0.5,14.5 parent: 853 type: Transform - - containers: - board: !type:Container - ents: [] - type: ContainerContainer - uid: 652 - type: AirlockSecurityGlassLocked + type: ReinforcedWindow components: - - name: Brig - type: MetaData - - rot: 4.371139006309477E-08 rad - pos: -5.5,9.5 + - pos: 13.5,-2.5 parent: 853 type: Transform - - containers: - board: !type:Container - ents: [] - type: ContainerContainer - uid: 653 - type: AirlockSecurityGlassLocked + type: SignInterrogation components: - - name: Brig - type: MetaData - - rot: 4.371139006309477E-08 rad - pos: -5.5,6.5 + - rot: 3.141592653589793 rad + pos: -0.42353058,11.3777275 parent: 853 type: Transform - - containers: - board: !type:Container - ents: [] - type: ContainerContainer - uid: 654 type: AirlockExternalLocked components: @@ -7084,16 +7027,14 @@ entities: parent: 853 type: Transform - uid: 742 - type: PottedPlantRandomPlastic + type: FoodDonutChocolate components: - - rot: 4.371139006309477E-08 rad - pos: -12.5,7.5 + - rot: 0.0065181441605091095 rad + pos: -3.494867,8.58493 parent: 853 type: Transform - - containers: - potted_plant_hide: !type:ContainerSlot {} - stash: !type:ContainerSlot {} - type: ContainerContainer + - sleepTime: 1150.1904 + type: Physics - uid: 743 type: ReinforcedWindow components: @@ -7122,17 +7063,12 @@ entities: stash: !type:ContainerSlot {} type: ContainerContainer - uid: 746 - type: DisposalPipe + type: Windoor components: - - anchored: True - rot: -1.5707963267948966 rad - pos: 13.5,-0.5 + - rot: -1.5707963267948966 rad + pos: -3.5,7.5 parent: 853 type: Transform - - containers: - DisposalTransit: !type:Container - ents: [] - type: ContainerContainer - uid: 747 type: LowWall components: @@ -7353,15 +7289,15 @@ entities: stash: !type:ContainerSlot {} type: ContainerContainer - uid: 770 - type: ClosetEmergencyFilledRandom + type: ClothingBeltSecurityFilled components: - - pos: 0.5,14.5 + - pos: -6.54198,13.584116 parent: 853 type: Transform - - IsPlaceable: False - type: PlaceableSurface + - canCollide: False + type: Physics - containers: - EntityStorageComponent: !type:Container + storagebase: !type:Container ents: [] type: ContainerContainer - uid: 771 @@ -7728,18 +7664,12 @@ entities: ents: [] type: ContainerContainer - uid: 802 - type: LockerMedicineFilled + type: ChairOfficeDark components: - - rot: 4.371139006309477E-08 rad - pos: 18.5,-2.5 + - rot: 3.141592653589793 rad + pos: -0.5,12.5 parent: 853 type: Transform - - IsPlaceable: False - type: PlaceableSurface - - containers: - EntityStorageComponent: !type:Container - ents: [] - type: ContainerContainer - uid: 803 type: LockerMedicalFilled components: @@ -12393,6 +12323,12 @@ entities: -21,19: 0 -21,20: 0 -21,21: 0 + 11,26: 1 + 11,27: 1 + 12,26: 1 + 12,27: 1 + 13,26: 1 + 13,27: 1 uniqueMixes: - volume: 2500 temperature: 293.15 @@ -12405,6 +12341,17 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.15 + moles: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 type: GridAtmosphere - linearDamping: 0.05 fixtures: @@ -12455,8 +12402,6 @@ entities: - 0,32 - 0,16 id: grid_chunk-0-1 - mask: [] - layer: [] mass: 256 - shape: !type:PolygonShape vertices: @@ -13016,10 +12961,9 @@ entities: parent: 853 type: Transform - uid: 900 - type: SpawnPointSecurityOfficer + type: RandomSpawner components: - - rot: 4.371139006309477E-08 rad - pos: -11.5,8.5 + - pos: -4.5,7.5 parent: 853 type: Transform - uid: 901 @@ -13528,12 +13472,14 @@ entities: - canCollide: False type: Physics - uid: 975 - type: Table + type: FoodDonutChocolate components: - - rot: 1.5707963705062866 rad - pos: 6.5,20.5 + - rot: 0.0065185800194740295 rad + pos: -3.5051332,8.41546 parent: 853 type: Transform + - sleepTime: 1148.4512 + type: Physics - uid: 976 type: WarpPoint components: @@ -13882,14 +13828,14 @@ entities: ents: [] type: ContainerContainer - uid: 1016 - type: FirelockGlass + type: Paper components: - - rot: 4.371139006309477E-08 rad - pos: -9.5,6.5 + - rot: 0.00652383454144001 rad + pos: -3.5051389,7.5080695 parent: 853 type: Transform - - airBlocked: False - type: Airtight + - sleepTime: 1126.2756 + type: Physics - uid: 1017 type: Firelock components: @@ -14039,12 +13985,17 @@ entities: light_bulb: !type:ContainerSlot {} type: ContainerContainer - uid: 1036 - type: SpawnPointSecurityOfficer + type: Poweredlight components: - - rot: 4.371139006309477E-08 rad - pos: -13.5,15.5 + - rot: 1.5707963267948966 rad + pos: -10.9225445,7.479561 parent: 853 type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer - uid: 1037 type: SpawnPointSecurityOfficer components: @@ -14160,17 +14111,20 @@ entities: parent: 853 type: Transform - uid: 1052 - type: TableReinforced + type: Poweredlight components: - - rot: 4.371139006309477E-08 rad - pos: -7.5,7.5 + - pos: -11.519875,12.105981 parent: 853 type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer - uid: 1053 - type: TableReinforced + type: ReinforcedWindow components: - - rot: 4.371139006309477E-08 rad - pos: -7.5,8.5 + - pos: -1.5,9.5 parent: 853 type: Transform - uid: 1054 @@ -14590,15 +14544,11 @@ entities: parent: 853 type: Transform - uid: 1103 - type: chem_dispenser + type: ReinforcedWindow components: - - rot: -1.5707963267948966 rad - pos: 16.5,1.5 + - pos: -0.5,9.5 parent: 853 type: Transform - - containers: - ReagentDispenser-reagentContainerContainer: !type:ContainerSlot {} - type: ContainerContainer - uid: 1104 type: DisposalTrunk components: @@ -15078,18 +15028,16 @@ entities: parent: 853 type: Transform - uid: 1161 - type: LockerChemistry + type: DrinkHotCoffee components: - - rot: 4.371139006309477E-08 rad - pos: 18.5,-1.5 + - rot: -0.03783857449889183 rad + pos: -3.4980159,7.997542 parent: 853 type: Transform - - IsPlaceable: False - type: PlaceableSurface - - containers: - EntityStorageComponent: !type:Container - ents: [] - type: ContainerContainer + - caps: Refillable, Drainable + type: SolutionContainer + - sleepTime: 1114.4688 + type: Physics - uid: 1162 type: LockerElectricalSupplies components: @@ -15112,12 +15060,14 @@ entities: parent: 853 type: Transform - uid: 1164 - type: Table + type: BedsheetOrange components: - - rot: 4.371139006309477E-08 rad - pos: -12.5,8.5 + - anchored: True + pos: -12.5,7.5 parent: 853 type: Transform + - canCollide: False + type: Physics - uid: 1165 type: Chair components: @@ -15150,23 +15100,31 @@ entities: ents: [] type: ContainerContainer - uid: 1168 - type: WallReinforced + type: Poweredlight components: - - rot: 3.141592653589793 rad - pos: 13.5,-2.5 + - pos: -8.48515,5.8506384 parent: 853 type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer - uid: 1169 - type: LowWall + type: KitchenReagentGrinder components: - - pos: 13.5,0.5 + - pos: 19.5,1.5 parent: 853 type: Transform + - containers: + ReagentGrinder-reagentContainerContainer: !type:ContainerSlot {} + ReagentGrinder-entityContainerContainer: !type:Container + ents: [] + type: ContainerContainer - uid: 1170 - type: TableReinforcedGlass + type: FirelockGlass components: - - rot: 4.371139006309477E-08 rad - pos: 18.5,1.5 + - pos: -6.5,5.5 parent: 853 type: Transform - uid: 1171 @@ -15176,30 +15134,39 @@ entities: parent: 853 type: Transform - uid: 1172 - type: TableReinforcedGlass + type: WallReinforced components: - - rot: 4.371139006309477E-08 rad - pos: 18.5,0.5 + - pos: 20.5,0.5 parent: 853 type: Transform - uid: 1173 type: LowWall components: - - pos: 13.5,-0.5 + - pos: -1.5,12.5 parent: 853 type: Transform - uid: 1174 - type: WallReinforced + type: Poweredlight components: - - pos: 19.5,1.5 + - pos: -3.5686207,5.8193884 parent: 853 type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer - uid: 1175 - type: WallReinforced + type: CableApcExtension components: - - pos: 19.5,0.5 + - anchored: True + pos: -6.5,5.5 parent: 853 type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics - uid: 1176 type: SheetPlasteel components: @@ -15466,21 +15433,21 @@ entities: parent: 853 type: Transform - uid: 1208 - type: ChairOfficeDark + type: AirlockSecurityGlassLocked components: - - rot: 4.71238902409608 rad - pos: -11.5,8.5 + - pos: -5.5,6.5 parent: 853 type: Transform + - containers: + board: !type:Container + ents: [] + type: ContainerContainer - uid: 1209 - type: Chair + type: TableReinforced components: - - rot: 1.5707963705062866 rad - pos: -13.5,8.5 + - pos: 6.5,20.5 parent: 853 type: Transform - - bodyType: Dynamic - type: Physics - uid: 1210 type: PowerCellSmallStandard components: @@ -15972,19 +15939,16 @@ entities: parent: 853 type: Transform - uid: 1258 - type: Poweredlight + type: CableApcExtension components: - - rot: 4.71238902409608 rad - pos: -11,8.5 + - anchored: True + pos: -5.5,4.5 parent: 853 type: Transform - - color: '#FFFFFFFF' - type: PointLight - - powerLoad: 0 - type: ApcPowerReceiver - - containers: - light_bulb: !type:ContainerSlot {} - type: ContainerContainer + - visible: False + type: Sprite + - canCollide: False + type: Physics - uid: 1259 type: Poweredlight components: @@ -16009,19 +15973,11 @@ entities: light_bulb: !type:ContainerSlot {} type: ContainerContainer - uid: 1261 - type: Poweredlight + type: ReinforcedWindow components: - - rot: 4.371139006309477E-08 rad - pos: -1.5,6 + - pos: -10.5,14.5 parent: 853 type: Transform - - color: '#FFFFFFFF' - type: PointLight - - powerLoad: 0 - type: ApcPowerReceiver - - containers: - light_bulb: !type:ContainerSlot {} - type: ContainerContainer - uid: 1262 type: WallSolid components: @@ -16108,16 +16064,11 @@ entities: parent: 853 type: Transform - uid: 1271 - type: Poweredlight + type: LowWall components: - - pos: -1.4910796,14.8427725 + - pos: -1.5,14.5 parent: 853 type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - containers: - light_bulb: !type:ContainerSlot {} - type: ContainerContainer - uid: 1272 type: Poweredlight components: @@ -16144,61 +16095,29 @@ entities: light_bulb: !type:ContainerSlot {} type: ContainerContainer - uid: 1274 - type: PoweredSmallLight + type: ReinforcedWindow components: - - rot: 1.5707963705062866 rad - pos: -1,8.5 + - pos: -1.5,13.5 parent: 853 type: Transform - - color: '#FFFFFFFF' - type: PointLight - - powerLoad: 0 - type: ApcPowerReceiver - - containers: - light_bulb: !type:ContainerSlot {} - type: ContainerContainer - uid: 1275 - type: PoweredSmallLight + type: ReinforcedWindow components: - - rot: 1.5707963705062866 rad - pos: -4,8.5 + - pos: -1.5,14.5 parent: 853 type: Transform - - color: '#FFFFFFFF' - type: PointLight - - powerLoad: 0 - type: ApcPowerReceiver - - containers: - light_bulb: !type:ContainerSlot {} - type: ContainerContainer - uid: 1276 - type: Poweredlight + type: WallReinforced components: - - rot: 4.71238902409608 rad - pos: -5,7.5 + - pos: -0.5,11.5 parent: 853 type: Transform - - color: '#FFFFFFFF' - type: PointLight - - powerLoad: 0 - type: ApcPowerReceiver - - containers: - light_bulb: !type:ContainerSlot {} - type: ContainerContainer - uid: 1277 - type: Poweredlight + type: WallReinforced components: - - rot: 1.5707963705062866 rad - pos: -10,7.5 + - pos: 20.5,-2.5 parent: 853 type: Transform - - color: '#FFFFFFFF' - type: PointLight - - powerLoad: 0 - type: ApcPowerReceiver - - containers: - light_bulb: !type:ContainerSlot {} - type: ContainerContainer - uid: 1278 type: Poweredlight components: @@ -16750,17 +16669,11 @@ entities: parent: 853 type: Transform - uid: 1327 - type: Poweredlight + type: WallReinforced components: - - rot: -1.5707963267948966 rad - pos: 18.89989,-0.46983594 + - pos: 20.5,-1.5 parent: 853 type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - containers: - light_bulb: !type:ContainerSlot {} - type: ContainerContainer - uid: 1328 type: WallSolid components: @@ -16867,15 +16780,21 @@ entities: parent: 853 type: Transform - uid: 1339 - type: WallReinforced + type: BoxSyringe components: - - pos: 19.5,-0.5 + - pos: 14.499004,1.2741406 parent: 853 type: Transform + - canCollide: False + type: Physics + - containers: + storagebase: !type:Container + ents: [] + type: ContainerContainer - uid: 1340 - type: WallReinforced + type: FirelockGlass components: - - pos: 19.5,-1.5 + - pos: -6.5,4.5 parent: 853 type: Transform - uid: 1341 @@ -17468,13 +17387,11 @@ entities: parent: 853 type: Transform - uid: 1398 - type: FirelockGlass + type: ChairOfficeLight components: - - pos: 6.5,20.5 + - pos: 15.5,-2.5 parent: 853 type: Transform - - airBlocked: False - type: Airtight - uid: 1399 type: WallReinforced components: @@ -17660,73 +17577,88 @@ entities: parent: 853 type: Transform - uid: 1426 - type: Window + type: Poweredlight components: - - rot: 4.371139006309477E-08 rad - pos: -7.5,18.5 + - pos: -1.2113109,11.1277275 parent: 853 type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer - uid: 1427 - type: Window + type: AirlockSecurityGlassLocked components: - - rot: 4.371139006309477E-08 rad - pos: -10.5,14.5 + - pos: 0.5,11.5 parent: 853 type: Transform + - containers: + board: !type:Container + ents: [] + type: ContainerContainer - uid: 1428 - type: ReinforcedWindow + type: PoweredSmallLight components: - - rot: 4.371139006309477E-08 rad - pos: -7.5,9.5 + - pos: -0.50818586,15.0808525 parent: 853 type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer - uid: 1429 - type: ReinforcedWindow + type: PoweredSmallLight components: - - rot: 4.371139006309477E-08 rad - pos: -8.5,9.5 + - rot: -1.5707963267948966 rad + pos: 1.1636891,13.8464775 parent: 853 type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer - uid: 1430 - type: ReinforcedWindow + type: WallReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -3.5,9.5 + - pos: -11.5,7.5 parent: 853 type: Transform - uid: 1431 - type: ReinforcedWindow + type: WallReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -0.5,9.5 + - pos: -11.5,9.5 parent: 853 type: Transform - uid: 1432 - type: ReinforcedWindow + type: LowWall components: - - rot: 4.371139006309477E-08 rad - pos: 0.5,6.5 + - pos: -13.5,9.5 parent: 853 type: Transform - uid: 1433 - type: ReinforcedWindow + type: AirlockSecurityGlassLocked components: - - rot: 4.371139006309477E-08 rad - pos: -0.5,6.5 + - pos: -12.5,9.5 parent: 853 type: Transform + - containers: + board: !type:Container + ents: [] + type: ContainerContainer - uid: 1434 - type: ReinforcedWindow + type: TableReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -2.5,6.5 + - pos: -11.5,8.5 parent: 853 type: Transform - uid: 1435 - type: ReinforcedWindow + type: WindoorSecurityLocked components: - - rot: 4.371139006309477E-08 rad - pos: -3.5,6.5 + - rot: 1.5707963267948966 rad + pos: -11.5,8.5 parent: 853 type: Transform - uid: 1436 @@ -18224,9 +18156,10 @@ entities: parent: 853 type: Transform - uid: 1505 - type: WallReinforced + type: WindoorSecurityLocked components: - - pos: 19.5,-2.5 + - rot: -1.5707963267948966 rad + pos: -9.5,8.5 parent: 853 type: Transform - uid: 1506 @@ -21528,31 +21461,36 @@ entities: parent: 853 type: Transform - uid: 1975 - type: WallReinforced + type: WardrobePrison components: - - rot: 4.371139006309477E-08 rad - pos: -10.5,6.5 + - rot: -1.5707963267948966 rad + pos: -13.5,8.5 parent: 853 type: Transform + - IsPlaceable: False + type: PlaceableSurface + - containers: + EntityStorageComponent: !type:Container + ents: [] + type: ContainerContainer - uid: 1976 - type: WallReinforced + type: Bed components: - - rot: 4.371139006309477E-08 rad - pos: -10.5,7.5 + - rot: -1.5707963267948966 rad + pos: -12.5,7.5 parent: 853 type: Transform - uid: 1977 - type: WallReinforced + type: EmergencyLight components: - - rot: 4.371139006309477E-08 rad - pos: -10.5,8.5 + - rot: 1.5707963267948966 rad + pos: -13.770238,7.833312 parent: 853 type: Transform - uid: 1978 type: WallReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -10.5,9.5 + - pos: -9.5,7.5 parent: 853 type: Transform - uid: 1979 @@ -21751,94 +21689,94 @@ entities: - uid: 2006 type: WallReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -4.5,6.5 + - pos: -9.5,6.5 parent: 853 type: Transform - uid: 2007 type: WallReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -1.5,6.5 + - pos: -8.5,6.5 parent: 853 type: Transform - uid: 2008 type: WallReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -7.5,6.5 + - pos: -9.5,9.5 parent: 853 type: Transform - uid: 2009 - type: WallSolid + type: WallReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -4.5,7.5 + - pos: -7.5,6.5 parent: 853 type: Transform - uid: 2010 - type: WallSolid + type: WallReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -4.5,8.5 + - pos: -6.5,6.5 parent: 853 type: Transform - uid: 2011 - type: WallSolid + type: WallReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -4.5,9.5 + - pos: -6.5,7.5 parent: 853 type: Transform - uid: 2012 - type: WallSolid + type: WallReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -1.5,9.5 + - pos: -6.5,8.5 parent: 853 type: Transform - uid: 2013 - type: WallSolid + type: WallReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -1.5,7.5 + - pos: -6.5,9.5 parent: 853 type: Transform - uid: 2014 - type: WallSolid + type: AirlockSecurityGlassLocked components: - - rot: 4.371139006309477E-08 rad - pos: -1.5,8.5 + - pos: -8.5,9.5 parent: 853 type: Transform + - containers: + board: !type:Container + ents: [] + type: ContainerContainer - uid: 2015 type: LowWall components: - - rot: 4.371139006309477E-08 rad - pos: -0.5,9.5 + - pos: -7.5,9.5 parent: 853 type: Transform - uid: 2016 - type: LowWall + type: WardrobePrison components: - - rot: 4.371139006309477E-08 rad - pos: -3.5,9.5 + - pos: -7.5,8.5 parent: 853 type: Transform + - IsPlaceable: False + type: PlaceableSurface + - containers: + EntityStorageComponent: !type:Container + ents: [] + type: ContainerContainer - uid: 2017 - type: LowWall + type: Bed components: - - rot: 4.371139006309477E-08 rad - pos: -7.5,9.5 + - pos: -8.5,7.5 parent: 853 type: Transform - uid: 2018 - type: LowWall + type: BedsheetOrange components: - - rot: 4.371139006309477E-08 rad - pos: -8.5,9.5 + - anchored: True + pos: -8.5,7.5 parent: 853 type: Transform + - canCollide: False + type: Physics - uid: 2019 type: WallSolid components: @@ -22511,31 +22449,28 @@ entities: parent: 853 type: Transform - uid: 2115 - type: LowWall + type: ReinforcedWindow components: - - rot: 4.371139006309477E-08 rad - pos: -2.5,6.5 + - pos: -13.5,9.5 parent: 853 type: Transform - uid: 2116 - type: LowWall + type: ReinforcedWindow components: - - rot: 4.371139006309477E-08 rad - pos: -3.5,6.5 + - pos: -7.5,9.5 parent: 853 type: Transform - uid: 2117 - type: LowWall + type: TableReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -0.5,6.5 + - pos: -9.5,8.5 parent: 853 type: Transform - uid: 2118 - type: LowWall + type: Windoor components: - - rot: 4.371139006309477E-08 rad - pos: 0.5,6.5 + - rot: -1.5707963267948966 rad + pos: -11.5,8.5 parent: 853 type: Transform - uid: 2119 @@ -22655,17 +22590,24 @@ entities: parent: 853 type: Transform - uid: 2136 - type: ReinforcedWindow + type: Windoor components: - - pos: 13.5,0.5 + - rot: 1.5707963267948966 rad + pos: -9.5,8.5 parent: 853 type: Transform - uid: 2137 - type: ReinforcedWindow + type: CableApcExtension components: - - pos: 13.5,-0.5 + - anchored: True + rot: 1.5707963267948966 rad + pos: -12.5,9.5 parent: 853 type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics - uid: 2138 type: ReinforcedWindow components: @@ -22673,11 +22615,17 @@ entities: parent: 853 type: Transform - uid: 2139 - type: TableReinforcedGlass + type: CableApcExtension components: - - pos: 17.5,1.5 + - anchored: True + rot: 1.5707963267948966 rad + pos: -8.5,9.5 parent: 853 type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics - uid: 2140 type: WallSolid components: @@ -22714,11 +22662,17 @@ entities: parent: 853 type: Transform - uid: 2145 - type: TableReinforcedGlass + type: CableApcExtension components: - - pos: 14.5,-1.5 + - anchored: True + rot: 1.5707963267948966 rad + pos: -8.5,8.5 parent: 853 type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics - uid: 2146 type: CrateMaterialPlastic components: @@ -24604,6 +24558,10 @@ entities: pos: -1.5,6.5 parent: 853 type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics - uid: 2411 type: ShotgunGladstone components: @@ -24656,6 +24614,10 @@ entities: pos: -2.5,6.5 parent: 853 type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics - uid: 2417 type: WallSolid components: @@ -24677,6 +24639,10 @@ entities: pos: -4.5,6.5 parent: 853 type: Transform + - visible: False + type: Sprite + - canCollide: False + type: Physics - uid: 2420 type: WallSolid components: @@ -26117,8 +26083,8 @@ entities: type: CableApcExtension components: - anchored: True - rot: 4.371139006309477E-08 rad - pos: -12.5,9.5 + rot: 1.5707963267948966 rad + pos: -9.5,8.5 parent: 853 type: Transform - visible: False @@ -26129,8 +26095,8 @@ entities: type: CableApcExtension components: - anchored: True - rot: 4.371139006309477E-08 rad - pos: -12.5,7.5 + rot: 1.5707963267948966 rad + pos: -12.5,8.5 parent: 853 type: Transform - visible: False @@ -26141,8 +26107,8 @@ entities: type: CableApcExtension components: - anchored: True - rot: 4.371139006309477E-08 rad - pos: -12.5,8.5 + rot: 1.5707963267948966 rad + pos: -11.5,8.5 parent: 853 type: Transform - visible: False @@ -26150,17 +26116,17 @@ entities: - canCollide: False type: Physics - uid: 2583 - type: CableApcExtension + type: PoweredSmallLight components: - - anchored: True - rot: 4.371139006309477E-08 rad - pos: -11.5,7.5 + - rot: 1.5707963267948966 rad + pos: -14.082738,8.770812 parent: 853 type: Transform - - visible: False - type: Sprite - - canCollide: False - type: Physics + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer - uid: 2584 type: CableApcExtension components: @@ -40853,23 +40819,24 @@ entities: - canCollide: False type: Physics - uid: 3965 - type: FirelockGlass + type: PoweredSmallLight components: - - rot: 4.371139006309477E-08 rad - pos: -7.5,7.5 + - rot: -1.5707963267948966 rad + pos: -6.942113,8.770812 parent: 853 type: Transform - - airBlocked: False - type: Airtight + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer - uid: 3966 - type: FirelockGlass + type: EmergencyLight components: - - rot: 4.371139006309477E-08 rad - pos: -4.5,5.5 + - rot: -1.5707963267948966 rad + pos: -7.223363,7.817687 parent: 853 type: Transform - - airBlocked: False - type: Airtight - uid: 3967 type: CableApcExtension components: @@ -41331,23 +41298,18 @@ entities: - airBlocked: False type: Airtight - uid: 4016 - type: FirelockGlass + type: ChairOfficeDark components: - - rot: 4.371139006309477E-08 rad - pos: -4.5,4.5 + - rot: -1.5707963267948966 rad + pos: -2.5,8.5 parent: 853 type: Transform - - airBlocked: False - type: Airtight - uid: 4017 - type: FirelockGlass + type: ChairOfficeDark components: - - rot: 4.371139006309477E-08 rad - pos: -4.5,3.5 + - pos: -1.5,7.5 parent: 853 type: Transform - - airBlocked: False - type: Airtight - uid: 4018 type: Firelock components: @@ -41501,13 +41463,11 @@ entities: - airBlocked: False type: Airtight - uid: 4036 - type: FirelockGlass + type: Firelock components: - - pos: 15.5,8.5 + - pos: -1.5,6.5 parent: 853 type: Transform - - airBlocked: False - type: Airtight - uid: 4037 type: FirelockGlass components: @@ -41517,21 +41477,19 @@ entities: - airBlocked: False type: Airtight - uid: 4038 - type: FirelockGlass + type: VendingMachineCoffee + components: + - name: Hot drinks machine + type: MetaData + - pos: -11.5,11.5 + parent: 853 + type: Transform +- uid: 4039 + type: Table components: - pos: -10.5,11.5 parent: 853 type: Transform - - airBlocked: False - type: Airtight -- uid: 4039 - type: FirelockGlass - components: - - pos: -10.5,10.5 - parent: 853 - type: Transform - - airBlocked: False - type: Airtight - uid: 4040 type: FirelockGlass components: @@ -41549,13 +41507,17 @@ entities: - airBlocked: False type: Airtight - uid: 4042 - type: FirelockGlass + type: FoodBoxDonut components: - - pos: 0.5,-15.5 + - pos: -10.490147,11.612438 parent: 853 type: Transform - - airBlocked: False - type: Airtight + - canCollide: False + type: Physics + - containers: + storagebase: !type:Container + ents: [] + type: ContainerContainer - uid: 4043 type: FirelockGlass components: @@ -41696,23 +41658,25 @@ entities: parent: 853 type: Transform - uid: 4061 - type: FirelockGlass + type: CableApcExtension components: - - rot: 4.371139006309477E-08 rad - pos: -8.5,6.5 + - anchored: True + pos: -6.5,3.5 parent: 853 type: Transform - - airBlocked: False - type: Airtight + - visible: False + type: Sprite + - canCollide: False + type: Physics - uid: 4062 - type: FirelockGlass + type: PottedPlantRandom components: - - rot: 4.371139006309477E-08 rad - pos: -7.5,8.5 + - pos: 0.5,7.5 parent: 853 type: Transform - - airBlocked: False - type: Airtight + - containers: + stash: !type:ContainerSlot {} + type: ContainerContainer - uid: 4063 type: CableApcExtension components: @@ -42314,65 +42278,41 @@ entities: parent: 853 type: Transform - uid: 4139 - type: Bed + type: ReinforcedWindow components: - - rot: 4.371139006309477E-08 rad - pos: -2.5,7.5 + - pos: -7.5,18.5 parent: 853 type: Transform - uid: 4140 - type: Bed + type: ReinforcedWindow components: - - rot: 4.371139006309477E-08 rad - pos: 0.5,7.5 + - pos: -10.5,6.5 parent: 853 type: Transform - uid: 4141 - type: BedsheetOrange + type: WallReinforced components: - - anchored: True - rot: 4.371139006309477E-08 rad - pos: -2.5,7.5 + - pos: -3.5,9.5 parent: 853 type: Transform - - canCollide: False - type: Physics - uid: 4142 - type: BedsheetOrange + type: WallReinforced components: - - anchored: True - rot: 4.371139006309477E-08 rad - pos: 0.5,7.5 + - pos: -3.5,6.5 parent: 853 type: Transform - - canCollide: False - type: Physics - uid: 4143 - type: ClosetBase + type: TableReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -3.5,8.5 + - pos: -3.5,8.5 parent: 853 type: Transform - - IsPlaceable: False - type: PlaceableSurface - - containers: - EntityStorageComponent: !type:Container - ents: [] - type: ContainerContainer - uid: 4144 - type: ClosetBase + type: TableReinforced components: - - rot: 4.371139006309477E-08 rad - pos: -0.5,8.5 + - pos: -3.5,7.5 parent: 853 type: Transform - - IsPlaceable: False - type: PlaceableSurface - - containers: - EntityStorageComponent: !type:Container - ents: [] - type: ContainerContainer - uid: 4145 type: Poweredlight components: @@ -42581,14 +42521,12 @@ entities: morgue_tray: !type:ContainerSlot {} type: ContainerContainer - uid: 4166 - type: chem_master + type: WindoorSecurityLocked components: - - pos: 15.5,1.5 + - rot: 1.5707963267948966 rad + pos: -3.5,8.5 parent: 853 type: Transform - - containers: - ChemMaster-reagentContainerContainer: !type:ContainerSlot {} - type: ContainerContainer - uid: 4167 type: Table components: @@ -43230,15 +43168,12 @@ entities: parent: 853 type: Transform - uid: 4249 - type: ClothingBeltSecurityFilled + type: WindoorSecurityLocked components: - - pos: -6.5,13.5 + - rot: 1.5707963267948966 rad + pos: -3.5,7.5 parent: 853 type: Transform - - containers: - storagebase: !type:Container - ents: [] - type: ContainerContainer - uid: 4250 type: Shelf components: @@ -48831,66 +48766,42 @@ entities: parent: 853 type: Transform - uid: 4904 - type: TableReinforcedGlass + type: Windoor components: - - pos: 14.5,-0.5 + - rot: -1.5707963267948966 rad + pos: -3.5,8.5 parent: 853 type: Transform - uid: 4905 - type: BoxSyringe + type: TableReinforced components: - - pos: 14.469343,-0.36327124 + - pos: -2.5,6.5 parent: 853 type: Transform - - canCollide: False - type: Physics - - containers: - storagebase: !type:Container - ents: [] - type: ContainerContainer - uid: 4906 - type: BoxSyringe + type: TableReinforced components: - - pos: 14.469343,-0.73827124 + - pos: -1.5,6.5 parent: 853 type: Transform - - canCollide: False - type: Physics - - containers: - storagebase: !type:Container - ents: [] - type: ContainerContainer - uid: 4907 - type: SheetPlasma1 + type: LowWall components: - - pos: 14.484968,-1.2538962 + - pos: -0.5,6.5 parent: 853 type: Transform - - canCollide: False - type: Physics - uid: 4908 - type: BoxBeaker + type: LowWall components: - - pos: 18.53261,0.71732765 + - pos: 0.5,6.5 parent: 853 type: Transform - - canCollide: False - type: Physics - - containers: - storagebase: !type:Container - ents: [] - type: ContainerContainer - uid: 4909 - type: KitchenReagentGrinder + type: ReinforcedWindow components: - - pos: 18.5,1.5 + - pos: -0.5,6.5 parent: 853 type: Transform - - containers: - ReagentGrinder-reagentContainerContainer: !type:ContainerSlot {} - ReagentGrinder-entityContainerContainer: !type:Container - ents: [] - type: ContainerContainer - uid: 4910 type: TableReinforced components: @@ -48910,10 +48821,9 @@ entities: light_bulb: !type:ContainerSlot {} type: ContainerContainer - uid: 4912 - type: ChairOfficeDark + type: ReinforcedWindow components: - - rot: 3.141592653589793 rad - pos: 17.5,0.5 + - pos: 0.5,6.5 parent: 853 type: Transform - uid: 4913 @@ -48923,9 +48833,10 @@ entities: parent: 853 type: Transform - uid: 4914 - type: ChairOfficeDark + type: WindoorSecurityLocked components: - - pos: 15.5,-2.5 + - rot: 3.141592653589793 rad + pos: -2.5,6.5 parent: 853 type: Transform - uid: 4915 @@ -48935,43 +48846,40 @@ entities: parent: 853 type: Transform - uid: 4916 - type: Firelock + type: WindoorSecurityLocked components: - - pos: 15.5,-3.5 + - rot: 3.141592653589793 rad + pos: -1.5,6.5 parent: 853 type: Transform - uid: 4917 - type: SheetPlasma1 + type: Windoor components: - - pos: 14.531843,-1.5507712 + - pos: -2.5,6.5 parent: 853 type: Transform - - canCollide: False - type: Physics - uid: 4918 - type: SheetPlasma1 + type: Windoor components: - - pos: 14.578718,-1.8476462 + - pos: -1.5,6.5 parent: 853 type: Transform - - canCollide: False - type: Physics - uid: 4919 - type: Dropper + type: AirlockSecurityLocked components: - - pos: 14.531843,-2.2695212 + - pos: 0.5,9.5 parent: 853 type: Transform - - canCollide: False - type: Physics + - containers: + board: !type:Container + ents: [] + type: ContainerContainer - uid: 4920 - type: Dropper + type: LowWall components: - - pos: 14.531843,-2.5351462 + - pos: -0.5,9.5 parent: 853 type: Transform - - canCollide: False - type: Physics - uid: 4921 type: ExtinguisherCabinetFilled components: @@ -50264,8 +50172,7 @@ entities: - uid: 5083 type: WallSolid components: - - rot: -1.5707963267948966 rad - pos: 0.5,-14.5 + - pos: 0.5,-14.5 parent: 853 type: Transform - uid: 5084 @@ -50278,36 +50185,31 @@ entities: - uid: 5085 type: WallReinforced components: - - rot: -1.5707963267948966 rad - pos: 11.5,27.5 + - pos: 11.5,27.5 parent: 853 type: Transform - uid: 5086 type: WallReinforced components: - - rot: -1.5707963267948966 rad - pos: 12.5,27.5 + - pos: 12.5,27.5 parent: 853 type: Transform - uid: 5087 type: WallReinforced components: - - rot: -1.5707963267948966 rad - pos: 13.5,27.5 + - pos: 13.5,27.5 parent: 853 type: Transform - uid: 5088 type: WallReinforced components: - - rot: -1.5707963267948966 rad - pos: 13.5,26.5 + - pos: 13.5,26.5 parent: 853 type: Transform - uid: 5089 type: AirlockCommandLocked components: - - rot: -1.5707963267948966 rad - pos: 10.5,26.5 + - pos: 10.5,26.5 parent: 853 type: Transform - containers: @@ -50331,4 +50233,461 @@ entities: pos: 11.687332,26.585844 parent: 853 type: Transform +- uid: 5092 + type: LowWall + components: + - pos: -1.5,9.5 + parent: 853 + type: Transform +- uid: 5093 + type: WallReinforced + components: + - pos: -2.5,9.5 + parent: 853 + type: Transform +- uid: 5094 + type: AirlockSecurityGlassLocked + components: + - pos: -5.5,9.5 + parent: 853 + type: Transform + - containers: + board: !type:Container + ents: [] + type: ContainerContainer +- uid: 5095 + type: AirlockSecurityGlassLocked + components: + - pos: -4.5,9.5 + parent: 853 + type: Transform + - containers: + board: !type:Container + ents: [] + type: ContainerContainer +- uid: 5096 + type: AirlockSecurityGlassLocked + components: + - pos: -4.5,6.5 + parent: 853 + type: Transform + - containers: + board: !type:Container + ents: [] + type: ContainerContainer +- uid: 5097 + type: LowWall + components: + - pos: 13.5,1.5 + parent: 853 + type: Transform +- uid: 5098 + type: LowWall + components: + - pos: 13.5,-2.5 + parent: 853 + type: Transform +- uid: 5099 + type: ReinforcedWindow + components: + - pos: 13.5,1.5 + parent: 853 + type: Transform +- uid: 5100 + type: LargeBeaker + components: + - pos: 18.88963,1.6178906 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5101 + type: SheetPlasma1 + components: + - pos: 19.561504,-0.1164844 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5102 + type: SheetPlasma1 + components: + - pos: 19.54588,0.1647656 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5103 + type: TableReinforcedGlass + components: + - rot: -1.5707963267948966 rad + pos: 18.5,1.5 + parent: 853 + type: Transform +- uid: 5104 + type: TableReinforcedGlass + components: + - rot: -1.5707963267948966 rad + pos: 19.5,1.5 + parent: 853 + type: Transform +- uid: 5105 + type: TableReinforcedGlass + components: + - rot: -1.5707963267948966 rad + pos: 19.5,0.5 + parent: 853 + type: Transform +- uid: 5106 + type: TableReinforcedGlass + components: + - rot: -1.5707963267948966 rad + pos: 19.5,-0.5 + parent: 853 + type: Transform +- uid: 5107 + type: TableReinforcedGlass + components: + - rot: -1.5707963267948966 rad + pos: 15.5,1.5 + parent: 853 + type: Transform +- uid: 5108 + type: LargeBeaker + components: + - pos: 18.405254,1.6178906 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5109 + type: LowWall + components: + - pos: 13.5,0.5 + parent: 853 + type: Transform +- uid: 5110 + type: ReinforcedWindow + components: + - pos: 13.5,0.5 + parent: 853 + type: Transform +- uid: 5111 + type: TableReinforced + components: + - pos: 13.5,-0.5 + parent: 853 + type: Transform +- uid: 5112 + type: WindoorMedicalLocked + components: + - rot: 1.5707963267948966 rad + pos: 13.5,-0.5 + parent: 853 + type: Transform +- uid: 5113 + type: Windoor + components: + - rot: -1.5707963267948966 rad + pos: 13.5,-0.5 + parent: 853 + type: Transform +- uid: 5114 + type: TableReinforcedGlass + components: + - rot: -1.5707963267948966 rad + pos: 14.5,1.5 + parent: 853 + type: Transform +- uid: 5115 + type: TableReinforcedGlass + components: + - rot: -1.5707963267948966 rad + pos: 14.5,0.5 + parent: 853 + type: Transform +- uid: 5116 + type: Windoor + components: + - pos: 15.5,8.5 + parent: 853 + type: Transform +- uid: 5117 + type: Dropper + components: + - pos: 14.514629,0.4460156 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5118 + type: Dropper + components: + - pos: 14.514629,0.6335156 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5119 + type: Dropper + components: + - pos: 14.530254,0.8210156 + parent: 853 + type: Transform + - canCollide: False + type: Physics +- uid: 5120 + type: BoxSyringe + components: + - pos: 14.499004,1.6491406 + parent: 853 + type: Transform + - canCollide: False + type: Physics + - containers: + storagebase: !type:Container + ents: [] + type: ContainerContainer +- uid: 5121 + type: ChairOfficeLight + components: + - rot: 3.141592653589793 rad + pos: 17.5,0.5 + parent: 853 + type: Transform +- uid: 5122 + type: LockerChemistryFilled + components: + - rot: -1.5707963267948966 rad + pos: 19.5,-2.5 + parent: 853 + type: Transform + - IsPlaceable: False + type: PlaceableSurface + - containers: + EntityStorageComponent: !type:Container + ents: [] + type: ContainerContainer +- uid: 5123 + type: LockerMedicineFilled + components: + - rot: -1.5707963267948966 rad + pos: 18.5,-2.5 + parent: 853 + type: Transform + - IsPlaceable: False + type: PlaceableSurface + - containers: + EntityStorageComponent: !type:Container + ents: [] + type: ContainerContainer +- uid: 5124 + type: ChairOfficeLight + components: + - rot: -1.5707963267948966 rad + pos: 14.5,-0.5 + parent: 853 + type: Transform +- uid: 5125 + type: Windoor + components: + - pos: 15.5,-3.5 + parent: 853 + type: Transform +- uid: 5126 + type: DisposalTrunk + components: + - anchored: True + rot: 3.141592653589793 rad + pos: 14.5,-2.5 + parent: 853 + type: Transform + - containers: + DisposalEntry: !type:Container + ents: [] + type: ContainerContainer +- uid: 5127 + type: DisposalUnit + components: + - rot: 3.141592653589793 rad + pos: 14.5,-2.5 + parent: 853 + type: Transform + - containers: + DisposalUnit: !type:Container + ents: [] + type: ContainerContainer +- uid: 5128 + type: DisposalPipe + components: + - anchored: True + rot: 3.141592653589793 rad + pos: 14.5,-1.5 + parent: 853 + type: Transform + - containers: + DisposalTransit: !type:Container + ents: [] + type: ContainerContainer +- uid: 5129 + type: DisposalBend + components: + - anchored: True + pos: 14.5,-0.5 + parent: 853 + type: Transform + - containers: + DisposalBend: !type:Container + ents: [] + type: ContainerContainer +- uid: 5130 + type: DisposalJunction + components: + - anchored: True + rot: 3.141592653589793 rad + pos: 12.5,-0.5 + parent: 853 + type: Transform + - containers: + DisposalJunction: !type:Container + ents: [] + type: ContainerContainer +- uid: 5131 + type: Poweredlight + components: + - pos: 18.51463,1.8678906 + parent: 853 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer +- uid: 5132 + type: Poweredlight + components: + - rot: -1.5707963267948966 rad + pos: 19.936504,-0.3821094 + parent: 853 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer +- uid: 5133 + type: Firelock + components: + - pos: 13.5,-0.5 + parent: 853 + type: Transform +- uid: 5134 + type: Windoor + components: + - rot: 1.5707963267948966 rad + pos: 0.5,-15.5 + parent: 853 + type: Transform +- uid: 5135 + type: Firelock + components: + - pos: 0.5,-15.5 + parent: 853 + type: Transform +- uid: 5136 + type: Poweredlight + components: + - pos: -2.5304983,9.057686 + parent: 853 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer +- uid: 5137 + type: Poweredlight + components: + - pos: 12.5166855,27.017359 + parent: 853 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - containers: + light_bulb: !type:ContainerSlot {} + type: ContainerContainer +- uid: 5138 + type: Firelock + components: + - pos: 15.5,8.5 + parent: 853 + type: Transform +- uid: 5139 + type: SignDirectionalSupply + components: + - rot: 3.141592653589793 rad + pos: 11.424202,6.304905 + parent: 853 + type: Transform +- uid: 5140 + type: Firelock + components: + - pos: -10.5,9.5 + parent: 853 + type: Transform +- uid: 5141 + type: WindoorCargoLocked + components: + - rot: 3.141592653589793 rad + pos: 15.5,8.5 + parent: 853 + type: Transform +- uid: 5142 + type: Firelock + components: + - pos: -2.5,6.5 + parent: 853 + type: Transform +- uid: 5143 + type: Medkit + components: + - pos: 15.0694065,1.5443661 + parent: 853 + type: Transform + - canCollide: False + type: Physics + - containers: + storagebase: !type:Container + ents: [] + type: ContainerContainer +- uid: 5144 + type: MedkitToxin + components: + - pos: 15.6162815,1.5443661 + parent: 853 + type: Transform + - canCollide: False + type: Physics + - containers: + storagebase: !type:Container + ents: [] + type: ContainerContainer +- uid: 5145 + type: Firelock + components: + - pos: 6.5,20.5 + parent: 853 + type: Transform +- uid: 5146 + type: Firelock + components: + - pos: -3.5,8.5 + parent: 853 + type: Transform +- uid: 5147 + type: Firelock + components: + - pos: -3.5,7.5 + parent: 853 + type: Transform ... From 233649a204d75b07b217f3ac14756d7c95263e5e Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 7 Aug 2021 20:33:20 -0400 Subject: [PATCH 80/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e7cb9d0e85..31db664bac 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1727,3 +1727,8 @@ Entries: - {message: Security windoors for planned mapping rework., type: Add} id: 308 time: '2021-08-07T21:29:47.0000000+00:00' +- author: TimrodDX + changes: + - {message: Partially re-mapped Security and Chemistry., type: Add} + id: 309 + time: '2021-08-08T00:32:18.0000000+00:00' From 04bbaa820f3378c251966e9f7f8465cef44a4493 Mon Sep 17 00:00:00 2001 From: SethLafuente <84478872+SethLafuente@users.noreply.github.com> Date: Sun, 8 Aug 2021 13:21:18 -0700 Subject: [PATCH 81/83] Made the cloning pod and medical scanner constructible (#4439) * Made the cloning machine pod constructable * Added everything like I did but with the Medical Scanner Co-authored-by: SETh lafuente --- .../Catalog/Research/technologies.yml | 2 ++ .../Circuitboards/Machine/production.yml | 29 +++++++++++++++++++ .../Structures/Machines/cloning_machine.yml | 19 ++++++++++++ .../Entities/Structures/Machines/lathe.yml | 2 ++ .../Structures/Machines/medical_scanner.yml | 19 ++++++++++++ .../Prototypes/Recipes/Lathes/electronics.yml | 18 ++++++++++++ 6 files changed, 89 insertions(+) diff --git a/Resources/Prototypes/Catalog/Research/technologies.yml b/Resources/Prototypes/Catalog/Research/technologies.yml index 1c39d4178d..45e9e60a8b 100644 --- a/Resources/Prototypes/Catalog/Research/technologies.yml +++ b/Resources/Prototypes/Catalog/Research/technologies.yml @@ -241,6 +241,8 @@ - FirelockElectronics - DoorElectronics - APCElectronics + - CloningPodMachineCircuitboard + - MedicalScannerMachineCircuitboard # Bluespace Theory Technology Tree diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml index 26c589371b..1871429c56 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml @@ -28,3 +28,32 @@ Amount: 2 DefaultPrototype: Beaker ExamineName: Glass Beaker + +- type: entity + id: CloningPodMachineCircuitboard + parent: BaseMachineCircuitboard + name: Cloning Pod (Machine Board) + components: + - type: MachineBoard + prototype: CloningPod + requirements: + ScanningModule: 2 + Manipulator: 2 + materialRequirements: + Glass: 1 + Cable: 1 + +- type: entity + id: MedicalScannerMachineCircuitboard + parent: BaseMachineCircuitboard + name: Medical Scanner (Machine Board) + components: + - type: MachineBoard + prototype: MedicalScanner + requirements: + ScanningModule: 1 + Manipulator: 1 + Laser: 1 + materialRequirements: + Glass: 1 + Cable: 1 diff --git a/Resources/Prototypes/Entities/Structures/Machines/cloning_machine.yml b/Resources/Prototypes/Entities/Structures/Machines/cloning_machine.yml index 95154b771d..82d21f7b82 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/cloning_machine.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/cloning_machine.yml @@ -23,6 +23,25 @@ - Opaque mask: - MobMask + - type: Construction + graph: machine + node: machine + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:ChangeConstructionNodeBehavior + node: machineFrame + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Machine + board: CloningPodMachineCircuitboard + - type: MaterialStorage + - type: Wires + BoardName: "CloningPod" + LayoutId: CloningPod - type: Appearance visuals: - type: CloningPodVisualizer diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index c43572e7f4..a98e8d0138 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -166,6 +166,8 @@ - FirelockElectronics - DoorElectronics - APCElectronics + - CloningPodMachineCircuitboard + - MedicalScannerMachineCircuitboard - Bucket - MopItem - SprayBottle diff --git a/Resources/Prototypes/Entities/Structures/Machines/medical_scanner.yml b/Resources/Prototypes/Entities/Structures/Machines/medical_scanner.yml index f83802bdba..facc87125d 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/medical_scanner.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/medical_scanner.yml @@ -14,6 +14,25 @@ map: ["enum.MedicalScannerVisualLayers.Machine"] - state: idle_unlit map: ["enum.MedicalScannerVisualLayers.Terminal"] + - type: Construction + graph: machine + node: machine + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:ChangeConstructionNodeBehavior + node: machineFrame + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Machine + board: MedicalScannerMachineCircuitboard + - type: MaterialStorage + - type: Wires + BoardName: "MedicalScanner" + LayoutId: MedicalScanner - type: Appearance visuals: - type: MedicalScannerVisualizer diff --git a/Resources/Prototypes/Recipes/Lathes/electronics.yml b/Resources/Prototypes/Recipes/Lathes/electronics.yml index 69b7503055..2462d1a6dd 100644 --- a/Resources/Prototypes/Recipes/Lathes/electronics.yml +++ b/Resources/Prototypes/Recipes/Lathes/electronics.yml @@ -24,3 +24,21 @@ materials: Steel: 50 Glass: 50 + +- type: latheRecipe + id: CloningPodMachineCircuitboard + icon: Objects/Misc/module.rsi/id_mod.png + result: CloningPodMachineCircuitboard + completetime: 1000 + materials: + Steel: 100 + Glass: 100 + +- type: latheRecipe + id: MedicalScannerMachineCircuitboard + icon: Objects/Misc/module.rsi/id_mod.png + result: MedicalScannerMachineCircuitboard + completetime: 1000 + materials: + Steel: 100 + Glass: 100 From c688dd59fc718c9f43a678859fec27dedcd2645a Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 8 Aug 2021 16:22:21 -0400 Subject: [PATCH 82/83] Automatic changelog update --- Resources/Changelog/Changelog.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 31db664bac..38639aee97 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1732,3 +1732,10 @@ Entries: - {message: Partially re-mapped Security and Chemistry., type: Add} id: 309 time: '2021-08-08T00:32:18.0000000+00:00' +- author: Seth + changes: + - {message: Added cloning pod and medical scanner circuit boards into the protolathe, + type: Add} + - {message: Made the cloning pod and medical scanner constructible, type: Add} + id: 310 + time: '2021-08-08T20:21:19.0000000+00:00' From 9f64592a405fb40db68d1d04f8dafe84773bce55 Mon Sep 17 00:00:00 2001 From: Swept Date: Sun, 8 Aug 2021 21:43:12 +0000 Subject: [PATCH 83/83] Fix fixed-point format specifier in PowerCellComponent --- Content.Server/PowerCell/Components/PowerCellComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/PowerCell/Components/PowerCellComponent.cs b/Content.Server/PowerCell/Components/PowerCellComponent.cs index 5b0378bea7..34c76aa4d4 100644 --- a/Content.Server/PowerCell/Components/PowerCellComponent.cs +++ b/Content.Server/PowerCell/Components/PowerCellComponent.cs @@ -93,7 +93,7 @@ namespace Content.Server.PowerCell.Components { if (inDetailsRange) { - message.AddMarkup(Loc.GetString("power-cell-component-examine-details", ("currentCharge", $"{CurrentCharge / MaxCharge * 100}:F0"))); + message.AddMarkup(Loc.GetString("power-cell-component-examine-details", ("currentCharge", $"{CurrentCharge / MaxCharge * 100:F0}"))); } }