From 35c95a5da3ccb7d23620eaa1aad43022be3d6673 Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Sat, 21 Dec 2024 13:49:49 -0800 Subject: [PATCH 1/3] Make the EE Logo Match the Banner (#1361) # Description Light mode logo --- Resources/Textures/Logo/logo.png | Bin 20730 -> 18981 bytes .../Textures/Logo/source/EE_logo-light.svg | 218 +++++++++++++++--- Resources/Textures/Logo/source/EE_logo.svg | 50 ++++ 3 files changed, 236 insertions(+), 32 deletions(-) create mode 100644 Resources/Textures/Logo/source/EE_logo.svg diff --git a/Resources/Textures/Logo/logo.png b/Resources/Textures/Logo/logo.png index 60aa041cced24eaaeb08e42a084579f69d6afd75..f06485e27f1f38073b1a45eab03c352b4a471d62 100644 GIT binary patch literal 18981 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 LNkvXXu0mjfCCwzV literal 20730 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

kg8u4k?Czcul8*14ZyPEhhsmG~* z`vQ3L$)UUh40#v6D3=1o#3J9O-KVFSj0B#=1k&jT z+`QwznYKc@bg0d1K%}`NA4?7q}A+(@hkGPH(%C&iM|F$`wiVo$NoyF``t`z6Zu-BiB52T(;R&%HXxBa1L z9edYzw#>=kf^N#|+_;RZrIPhgmHs1Z^#VjV$9QD*Irh&4daCW@=7YV`pT~!t?@N0r zwFpbkZXf~MoJzkhBllWp|A_qs*^ODoBqJcDKbH^I#cvSs$expwj|q9x2fs z9q<%Uv?NX0dcpXx2C^ZxNB7ldl$z+m0e5|bgD}z#8dvm2k1kS~>hWO&W=A&t<~@55 zg(l#aGrxF?(N&rkx*_3~BI9x3b2PY~$91ga0Mn7q3>FxTgblq~9SIC!Q)i6qhbV>S##Uq*W4YGSYKCK{pEDo8u9*+_3ht8Bel z4BlYcAf|WUTWEijVC^b5l@HeE$Nl)^6ZRoKi2(L6t*YFy;wMtu-(-d6aD9hKLb=z3 zA7fwHce$UuCkRs+^{8S`2-rQ&1J;~Lp=lAjxuDr5^JDvdTDSj%8*)WD0`W*7o=g40 z&tjdMGXc3gY*@U>AR0-+ViM<6xni&9r-_%N4L7I4Cxdj4j1^^2`#!apU5g_NAZz|g zCSmyz#;dY}3#Ek{JIbYs>h!AX+;}!jnk@UHg?+RodP7tdoyGiu8$@iD)S1y;wBBb} z9c!}4LmK?`k)!kM;cZ%gf8A&GR7aCUlqd+FEnTn*A>u{5}JjNXJ!0N*Xi?@ zEf-T2keGeMwqow*nK-@FO7wumR3BamQpF?8`tZPNHcvhsneOI=};49zRa zWwOwFv+Z{AaM4@t0X2X>d=sA+Hw%?+ZT3HHn3+)r!`w52cx5%Uyqo zaI4#|vBC1@n>qOkBi}_IqGhP8sdR_H?fa-rjt?dWIl~cVYM2wswOF!Oxd#i(Z(|x8 z+Om={Wj;lEe1etlhsTB1VXkZhgb;;_m9>sW-EUM|$}$7dc~rl=#lO@WpJb{ zQC5dD4j=lpAOx?cdp#t@ER|WkJ1wSO+#LC~B~a2p>UXHELqogV#CVtt z@ad@+F2&O0;!E)1B_ess`*tCeaON0W@cQY8KU!Pd{TZ+SPip&SrT;%tTM1=fAPd`H z(BV~RGmpp8gG^TUh~1TZ-X!Qd@WE4VjNU&U?hI9|gx4ui#J3V{hEn|Lk+BjXv)z}% z`9lnkI|;jQxIjo*jUJxqVR#L_x!yM6^LZnsIG7s4mCi7{?!=O^-B1S4QWvNbwVZR*meo1{sl?-4^po~>fr;V1G&=nag z7vQTV0t;es3on&wjvC0mBRwUN!#ZH5Tx}li(credob*+BD&*`4qiv_p;xQGTmejSOQC{@jnG`dKjkv^};F!JZZCuZ7GpoP{je5TC(?6{3B`i>? zIq~-`hxK&**iuhyhqEtnEs{ChM;rgj{Pz*0kjACvzJ7iJx!eyo+Tl@xMsVsv`T*v> zf+O)-9Fw_La9xo)G79|bC-0o=(h|>cbb1(?^Ez+>uo%95X2GC_dJPh42Q>#5T{JZYLP4%z?kyE9!8`CwE;K} zZZkbDpm7@5fh!@od{h6wJI?$GErx<{SB$h(iDEf`G}^C6%aWMo@T6`y)Q@J2^{X!D zC)Wo)?twG#lvL51nBQ;mK%Gvq?57Jlah!5v#-Bm#b+K&{-{*p zkJan1$}(Kyw=lA@hQha4v|*D1U9?P0=Wxr? za{`|a)YQ~i+AoL0)JX(t;wUQ4fE@e37#E!+sX6i)^R@QLYS|wVi{9!@r~@9yv@_}N zO_d7>eR~$Az5Ns~50*Up_E58Xxpwwj7QANZ1!|)kfcgz$K!0xOeDtP2Xf4d z!GZdmQ(9Pam*Sbn?ro@nwH14CO%@e}xHS%^vJ$wKdi4}IVSNj^5W_s|%3uZLVvlA) z*wNz+_Ek~Jne(f}fy%m>IrwG~P21&UU}Dc(8=G@L^^a0p+hBaIa763D)LP6*+_;-p z3yvXXxwtf^lNG6P7909u#?s2q3~fzL_nJ>ayoG+>>S_XhHoT-W>u=f3CsrpGiViq^BASX3l~-%Mn6zu|iL$qyFBbKu7R zhubY%4#It&YR7K!041W>!StwwXAkgYz_P;)0+!Q1^%iS)@Dj3kf$Zbu?NjR zn<4KsJ47*>FgYFvKpV`4WTj~X<{sTQ8s6m)5B@O*+LHx`-i%hq}i=2RoBBDAYklEP* zSS?I?`tu(H1Z4o2xr6uEgKWvo!eV|0kTHk9 zwS7mjiWMVG+&&V{=Ya%hf$Z%ND_S-8oe%`c7E|HT#>CVV_5)-Vh6*-z0mR#=S?ZkM ziU!z^h5k0gibe-E-kyNvyV*Eg-e_Hj= zbs->UwbGYMJ5SntWk(Ku#!Pj)Rp4=L zei|zfHDH}AhNnL*L@Bz@Y$bkrtNd|)R9ZKD=@|%A&~Sn8Ubu5^fvyj+!$)mwY{+y%mf>nNzMenM>YIa?8c@@bLJh>K??E37~2 zk)o~3OtlSev3h`pY^BO$rD`-MAo#bIKHVt1K$CRAT0)f+N6VJCPJHvu^JSO8zUBn0 zt!PihNG_kiiAhsqek=9~dRb2~_0}K%W_umo;6_v%OY@8I0KVnEUv)s)Ywc$YGtC_m zEM=#^A))s@;|0!l(r;-C{BKb%21P9Z7Awc-jx`r1296i$!U6k(F23tU_5SM=S+WZJ z7*`>mhkA!@-J_g-V^Mgz5f@}*c2`)XX3trLHg@W_Jc9)m-B`6;5wZhDV4E%20asTW z4>#eK==uH~`10Cj7if7T;G?qZfX|j2SmZu-_i@vN7o`FGGI|1|C547Zd?5gxk z5xBt~`4Ak1JKbqkfCRSc>J4{!^VUdgMdJ@XLMz`DET?PAy1?iG8z19W=wJ7vb+#0! zUnp|o1~s0|dr9MVwGoLQzp#aQ$m$lqRqT*kYzoM@9KcxKove^*!elI@ORXAFg5WQx zCjE?9T=ut=tV|}On%{$U?{H<63oxjd|?|E{SwvJ=%1e>LyW z?y+q~sb4ZFiNugp1sQ`u-5CMJMS%;H4=0*ccMZ=*X0`x6uRc*2E22$xAG9=_ z5N>W*{!%=m>D!FD9PeiSwIMJ=)8U?Ef8;-nc3VD{M$oI1vAo>z^!_a>Wl#IRcE|ls z%I^RB)4l3nprc&SLDNHYZNzoKQjlU+cctTfLg0KA^)NX`pFY{gR!IL#-P(XG$1I9C7#Nucj{In_${V_I9@ZL5ir;KYyc; zey?95I7eF&7p$@V|No1^gQmOV1qI=v_vL$|*S)nmuh0>_!cY$m%z$eDj-u#g(jfmm zek(b%KJ#?U+8v<6f&TNPeZnt#$pFyJdE`i#v($BP>UenF$=Bd7RDb=SM$SDNs&k3sfdV?m?l?EMPuWCBMT>W7NGW3DsE>{5eza5!E&z(}9h{nPh!}6# z?^Z;^28aK9yR`w*nL~MF?S6R9DA1>ioJh$Yz}z%=P0TDr=h1stz3)&fu+OqYeVuX< zGSmT_{X*xkuVFPxA%mwWS#nj&g7?Hhfwp9T`j~YT{{nbTLd&k8W%F52qeY^XtxB|z z-r^J7?jvLL!PXj&gNSdA9d)F1IzEE(xTJN^QL;XswJE)^Mudq#IuN^m`G6QdeUnn9 z8Qd*ytD)oqxTUnxtg6rXwnslt8h=fbs`yZ|L@%z%o~@drv%3ka8u+lQ0gabctyqfs(Y z`Sp`~+AYXDYv<%ac7v?)qG6<9yqZd6;_*fwL*h>-;x`2)S(dw+wqoOzz^B@$BuiX} z3!U*EzA1v#mBg*7D^#XC+w#C8XVyT!`H*$Ir&CM$ovN&qN*h2v*B5{uo6FcfvWq5OMWN_V$=MBJKl9-&Dd z3#pmNsAbRAXiu=j_{|ez9j4Z@Z0r^vw#_ot2e<-ip*5#pLf2&eU8jb z<3;m4&n9`X)QojaHO-dwJ_6AsaVPNYU>XeqLQ$1}rdbOYsYIV}uOBJ|U<9L=hsLkC zBTdq(M74{^+=bpnVR*c!}I`rXqZ{MNy`|p>x=}W<^OWl5smXq zxQN}u!9tXOIus9$1bC8rKS_KkckLV8G)H&J=FaR;v$$$Y!p`T8J-1;UN7cQP(XNP`uEaB*5jPcR;8`g(225jxeakwz)7vvV_FCC$* zBKALGKJ^_pT3g#ViAwpwiWa{aPy{=**Yy(kd3Vb_cm0sv2`c-8Ypr9A?MrU(<$`WF z$8J}Sx;O~j$IT!C485_Zakx)jRHwF0zhSC%ZXqO{5k5KTsGAe-I(TA9ik8(RWW&if zh}nDS|eHZi?-F_Qyc`V#CkX4A%|EEaFgV zYMG`=xYM2C7wi`cz)4VWx5)(w5i?!RRceZrCJU#U+&=g8=+!dmS5VCb9P9D)yFg|8 z&GveV&He@clSuvvxAxW+;IoWV&D9pQRfP2Nt?Ab%Bn7UJDx{w` zabS=Sdd0B0DJ-#ptjbrhJ_y_6y8f~tnNO>_dTjQ6Xtv#u`o=_PL+S%kZShRPh4{N^ zcMoI5cGn%~>(dof!)MX(tdR33d&;11K0Fk&kiw~7TuYTUlG=NqGx-afJ!kT>)ab!a z+guQ#bKT4*36oK(j(^~)fMwYAnp26{%PZRUA37zDz0F;&tRYXX30%`S%seU};gx-R zVr3{#P6)1#iPca&y=Zz%y-DJjiJbx2GNFsdo0a%+(^_vfLkG*FR}yNyA-Y;S-k;mA zju(4YOrf5Wa{n~6A8vwiV4+Jsi~kjK(p3&-Dlqi~BqqbguSNLNygPag6J8%_3iVSY z?`T@os1Tm*ye_pbADt+~{uVMdiQej<5OS%X(*Uocb@Ze1y>t{F7ecVoQlB?o%VdRw zM;x@p{r&!rAAyLyy&MnX>{B~ZS5O>M^SZuis8Q{b71m%|=O4Kn^;lNWz$Er?sKBWI zse4=4*h;X~d_$>RYILoRnzE{R1=AUgz-#4KLvD4{d!7Afb69}z#;RSYv`0Ugt^Sb% z3;c8EEPd^j4%R4wrDJWhZJC%Ged zYRN=oPz@v>hmFj|<^2c#38DyTd)fGak7(^I>Wdru8cYoB7|OVBG93(d?UXfJ(^5jYyrQuc-B7^uozT*!W)kTX{)UK~eBJEN zEBC;Tqlo)blx^D-YSVn&-^y;*Zduv!(jUGuAKaAd_h8FrK<8Ik-jh0Slame5I9)0r zKJS~RGNM44Sq}j*Hz3-N1%CljK|n3g$w(9#vwizk_PqYLzh5To>P}3F^#cH(DS+2P zM&gq5u9f^U3wEu6IAR0j{)h+q~$mu!*oG3{oK~jAN==#=-#d+M= zFX3h~U0`x|2rp(=pi=Mv?l>2{853g3Jq~ptFFQSA@(vcUKzoF;7f3~7lG=O+0W;=x zri5q27ns8?8^DJTK}KZ4pu9^JVk1E_eJTMpi^hlVu5S?rr-CR|KHn3jKbpg)${cIU zsyx=KKC0jPzWDvg^*hy<%l}eOy5D@ce9(Bvru_XY?DRgz>I(ptC0Dj;xrJ!&0XirD zgUWgxY;L5JcWVE!?>C@E562v~!Lkh>0$lsJ+&-a&|38?7VKzoB*RS26#rdCoU?=+o z<;VOCc?j+po6;^93IVx7jrL_}0rrj)Cpc#~7_dduwRy3OB-*Ez!6<^z8*yt{0MgKq zXEyGRag$_1ThgO;7(byj)##bXt$!o&Elq$m&e){ny)S4R!4n^Q`)S*dr!lWT1|;Hz hV&MpUPQm4M!fmN8K}2>DkZuS9UBFnIzA - - - diff --git a/Resources/Textures/Logo/source/EE_logo.svg b/Resources/Textures/Logo/source/EE_logo.svg new file mode 100644 index 00000000000..236919fe2f5 --- /dev/null +++ b/Resources/Textures/Logo/source/EE_logo.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 311b86e012ac7d40363b5027ab51b09c9d2285e2 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 22 Dec 2024 05:26:41 -0500 Subject: [PATCH 2/3] Loadout Modular Functions (And Loadout Pets) (#1366) # Description This PR implements a reflection based system for applying functions directly to entities spawned by loadouts. In order to provide an "Example" use of this system, I have created a "LoadoutMakeFollower" function, which can be applied to a loadout entity that happens to be an NPC with the Follower blackboard, making it follow the player who purchased that loadout. Basically. Pet mouse. The pet mouse will follow its owner. Yes I actually have tested this ingame, and it works great. The longest part about coding this was me spending almost 30 minutes straight wondering why the mouse wasn't following my character, until I remembered that I had to make a special "Pet" mouse variant that had the right HTN root task. This could be extended to other things. I happen to know that Nuclear14 wanted something like this for a Pet Dog.

Media

![image](https://github.com/user-attachments/assets/a18b026b-07a3-4ad7-8cce-4ea4dc4c3036)

# Changelog :cl: - add: Loadouts can now apply modular functions to items upon spawning in. - add: A new LoadoutMakeFollower function, which lets you buy NPC followers in loadouts. - add: added Pet Mice, Cockroach, Mothroach, and Hamster to Loadouts. All of which use the new LoadoutMakeFollower function. Co-authored-by: sleepyyapril <123355664+sleepyyapril@users.noreply.github.com> --- .../Systems/LoadoutSystem.Functions.cs | 30 ++++++++++ .../Clothing/Systems/LoadoutSystem.cs | 5 +- .../Loadouts/Prototypes/LoadoutPrototype.cs | 16 +++++ .../Locale/en-US/loadouts/generic/items.ftl | 5 ++ .../Locale/en-US/loadouts/itemgroups.ftl | 1 + .../Generic/miscItemGroups.yml | 13 ++++ .../Prototypes/Entities/Mobs/NPCs/animals.yml | 60 +++++++++++++++++++ .../Prototypes/Loadouts/Generic/items.yml | 53 ++++++++++++++++ 8 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 Content.Server/Clothing/Systems/LoadoutSystem.Functions.cs diff --git a/Content.Server/Clothing/Systems/LoadoutSystem.Functions.cs b/Content.Server/Clothing/Systems/LoadoutSystem.Functions.cs new file mode 100644 index 00000000000..99ca8b15c28 --- /dev/null +++ b/Content.Server/Clothing/Systems/LoadoutSystem.Functions.cs @@ -0,0 +1,30 @@ +using JetBrains.Annotations; +using Robust.Shared.Serialization.Manager; +using Content.Shared.Clothing.Loadouts.Prototypes; +using Content.Server.NPC.Components; +using Content.Server.NPC.Systems; +using Content.Server.NPC.HTN; +using Content.Server.NPC; +using Robust.Shared.Map; +using System.Numerics; + +namespace Content.Server.Clothing.Systems; + +[UsedImplicitly] +public sealed partial class LoadoutMakeFollower : LoadoutFunction +{ + public override void OnPlayerSpawn(EntityUid character, + EntityUid loadoutEntity, + IComponentFactory factory, + IEntityManager entityManager, + ISerializationManager serializationManager) + { + var npc = entityManager.System(); + var htn = entityManager.System(); + if (!entityManager.TryGetComponent(loadoutEntity, out var hTNComponent)) + return; + + npc.SetBlackboard(loadoutEntity, NPCBlackboard.FollowTarget, new EntityCoordinates(character, Vector2.Zero), hTNComponent); + htn.Replan(hTNComponent); + } +} diff --git a/Content.Server/Clothing/Systems/LoadoutSystem.cs b/Content.Server/Clothing/Systems/LoadoutSystem.cs index 1527db0be85..4c357c58642 100644 --- a/Content.Server/Clothing/Systems/LoadoutSystem.cs +++ b/Content.Server/Clothing/Systems/LoadoutSystem.cs @@ -13,7 +13,6 @@ using Content.Shared.Storage; using Content.Shared.Storage.EntitySystems; using Content.Shared.Traits.Assorted.Components; -using Content.Shared.Whitelist; using Robust.Shared.Configuration; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -33,6 +32,7 @@ public sealed class LoadoutSystem : EntitySystem [Dependency] private readonly IPrototypeManager _protoMan = default!; [Dependency] private readonly ISerializationManager _serialization = default!; [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IComponentFactory _componentFactory = default!; public override void Initialize() @@ -103,6 +103,9 @@ public void ApplyCharacterLoadout( comp.Owner = loadout.Item1; EntityManager.AddComponent(loadout.Item1, comp); } + + foreach (var function in loadoutProto.Functions) + function.OnPlayerSpawn(uid, loadout.Item1, _componentFactory, EntityManager, _serialization); } diff --git a/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutPrototype.cs b/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutPrototype.cs index 38a356b1e0d..ecb3c3fd6c5 100644 --- a/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutPrototype.cs +++ b/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutPrototype.cs @@ -1,5 +1,6 @@ using Content.Shared.Customization.Systems; using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.Manager; namespace Content.Shared.Clothing.Loadouts.Prototypes; @@ -45,4 +46,19 @@ public sealed partial class LoadoutPrototype : IPrototype [DataField] public string GuideEntry { get; } = ""; + + [DataField(serverOnly: true)] + public LoadoutFunction[] Functions { get; private set; } = Array.Empty(); +} + +/// This serves as a hook for loadout functions to modify one or more entities upon spawning in. +[ImplicitDataDefinitionForInheritors] +public abstract partial class LoadoutFunction +{ + public abstract void OnPlayerSpawn( + EntityUid character, + EntityUid loadoutEntity, + IComponentFactory factory, + IEntityManager entityManager, + ISerializationManager serializationManager); } diff --git a/Resources/Locale/en-US/loadouts/generic/items.ftl b/Resources/Locale/en-US/loadouts/generic/items.ftl index ac52b8be226..37ca4f91fe3 100644 --- a/Resources/Locale/en-US/loadouts/generic/items.ftl +++ b/Resources/Locale/en-US/loadouts/generic/items.ftl @@ -42,3 +42,8 @@ loadout-name-LoadoutItemLighterFlippo = flippo lighter (colorable) loadout-name-LoadoutItemDrinkShinyFlask = shiny flask (colorable) loadout-name-LoadoutItemDrinkLithiumFlask = lithium flask (colorable) loadout-name-LoadoutItemDrinkVacuumFlask = vacuum flask (colorable) + +loadout-name-LoadoutItemPetMouse = pet mouse +loadout-name-LoadoutItemPetHamster = pet hamster +loadout-name-LoadoutItemPetMothroach = pet mothroach +loadout-name-LoadoutItemPetCockroach = pet cockroach diff --git a/Resources/Locale/en-US/loadouts/itemgroups.ftl b/Resources/Locale/en-US/loadouts/itemgroups.ftl index b6221e85850..8af87679c45 100644 --- a/Resources/Locale/en-US/loadouts/itemgroups.ftl +++ b/Resources/Locale/en-US/loadouts/itemgroups.ftl @@ -17,6 +17,7 @@ character-item-group-LoadoutInstrumentsAny = Musical Instruments (Non-Musician) character-item-group-LoadoutSmokes = Smokeables character-item-group-LoadoutBoxKits = Survival Kits character-item-group-LoadoutWritables = Writing Tools +character-item-group-LoadoutPets = Pets # Job Specific Template character-item-group-LoadoutJOBBackpacks = JOB Backpacks diff --git a/Resources/Prototypes/CharacterItemGroups/Generic/miscItemGroups.yml b/Resources/Prototypes/CharacterItemGroups/Generic/miscItemGroups.yml index 3cad4423f52..cc1e82ceb69 100644 --- a/Resources/Prototypes/CharacterItemGroups/Generic/miscItemGroups.yml +++ b/Resources/Prototypes/CharacterItemGroups/Generic/miscItemGroups.yml @@ -121,3 +121,16 @@ id: LoadoutBookRandom - type: loadout id: LoadoutPen + +- type: characterItemGroup + id: LoadoutPets + maxItems: 1 + items: + - type: loadout + id: LoadoutItemPetMouse + - type: loadout + id: LoadoutItemPetHamster + - type: loadout + id: LoadoutItemPetMothroach + - type: loadout + id: LoadoutItemPetCockroach diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 6e369389a90..1ee20cdcb61 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -404,6 +404,21 @@ speaks: [Hissing] understands: [Hissing] +- type: entity + parent: MobCockroach + id: MobCockroachPet + components: + - type: HTN + rootTask: + task: FollowCompound + blackboard: + IdleRange: !type:Single + 1.5 + FollowCloseRange: !type:Single + 1.0 + FollowRange: !type:Single + 2.0 + - type: entity name: glockroach parent: MobCockroach @@ -575,6 +590,21 @@ enum.SurgeryUIKey.Key: type: SurgeryBui +- type: entity + parent: MobMothroach + id: MobMothroachPet + components: + - type: HTN + rootTask: + task: FollowCompound + blackboard: + IdleRange: !type:Single + 1.5 + FollowCloseRange: !type:Single + 1.0 + FollowRange: !type:Single + 2.0 + # Note that the mallard duck is actually a male drake mallard, with the brown duck being the female variant of the same species, however ss14 lacks sex specific textures # The white duck is more akin to a pekin or call duck. @@ -1769,6 +1799,21 @@ enum.SurgeryUIKey.Key: type: SurgeryBui +- type: entity + parent: MobMouse + id: MobMousePet + components: + - type: HTN + rootTask: + task: FollowCompound + blackboard: + IdleRange: !type:Single + 1.5 + FollowCloseRange: !type:Single + 1.0 + FollowRange: !type:Single + 2.0 + - type: entity parent: MobMouse suffix: Dead @@ -3418,6 +3463,21 @@ sprite: Mobs/Effects/onfire.rsi normalState: Mouse_burning +- type: entity + parent: MobHamster + id: MobHamsterPet + components: + - type: HTN + rootTask: + task: FollowCompound + blackboard: + IdleRange: !type:Single + 1.5 + FollowCloseRange: !type:Single + 1.0 + FollowRange: !type:Single + 2.0 + - type: entity name: pig parent: SimpleMobBase diff --git a/Resources/Prototypes/Loadouts/Generic/items.yml b/Resources/Prototypes/Loadouts/Generic/items.yml index dafe7c9ffa5..2c42955c08f 100644 --- a/Resources/Prototypes/Loadouts/Generic/items.yml +++ b/Resources/Prototypes/Loadouts/Generic/items.yml @@ -766,3 +766,56 @@ customColorTint: true items: - DrinkVacuumFlask + +# Pets +- type: loadout + id: LoadoutItemPetMouse + category: Items + cost: 2 + canBeHeirloom: true + items: + - MobMousePet + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutPets + functions: + - !type:LoadoutMakeFollower + +- type: loadout + id: LoadoutItemPetHamster + category: Items + cost: 2 + canBeHeirloom: true + items: + - MobHamsterPet + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutPets + functions: + - !type:LoadoutMakeFollower + +- type: loadout + id: LoadoutItemPetMothroach + category: Items + cost: 2 + canBeHeirloom: true + items: + - MobMothroachPet + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutPets + functions: + - !type:LoadoutMakeFollower + +- type: loadout + id: LoadoutItemPetCockroach + category: Items + cost: 2 + canBeHeirloom: true + items: + - MobCockroachPet + requirements: + - !type:CharacterItemGroupRequirement + group: LoadoutPets + functions: + - !type:LoadoutMakeFollower From 18a751d5c3d53cd4ff36728dd585ada37e9175b9 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sun, 22 Dec 2024 10:27:04 +0000 Subject: [PATCH 3/3] Automatic Changelog Update (#1366) --- Resources/Changelog/Changelog.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2f706fe2c38..186a28f65b1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -8742,3 +8742,18 @@ Entries: id: 6586 time: '2024-12-21T19:25:13.0000000+00:00' url: https://github.com/Simple-Station/Einstein-Engines/pull/1365 +- author: VMSolidus + changes: + - type: Add + message: Loadouts can now apply modular functions to items upon spawning in. + - type: Add + message: >- + A new LoadoutMakeFollower function, which lets you buy NPC followers in + loadouts. + - type: Add + message: >- + added Pet Mice, Cockroach, Mothroach, and Hamster to Loadouts. All of + which use the new LoadoutMakeFollower function. + id: 6587 + time: '2024-12-22T10:26:41.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1366