From 3de0e8a993932b0a44f0ba4641515bd49b73029e Mon Sep 17 00:00:00 2001 From: CWX Date: Sat, 14 May 2022 20:06:24 +0100 Subject: [PATCH] initial commit --- .gitignore | 30 ++++ .../bepInEx/plugins/HideoutArchitect.dll | Bin 0 -> 21504 bytes .../user/mods/Faupi-HideoutArchitect/LICENSE | 32 ++++ .../mods/Faupi-HideoutArchitect/config.jsonc | 9 + .../mods/Faupi-HideoutArchitect/package.json | 8 + .../res/icon_neededforhideout_small.png | Bin 0 -> 553 bytes .../res/translations.json | 47 +++++ .../src/hideoutarchitect.js | 68 +++++++ .../Project/HideoutArchitect.csproj | 135 ++++++++++++++ Faupi-HideoutMod/Project/HideoutArchitect.sln | 25 +++ Faupi-HideoutMod/Project/LICENSE | 32 ++++ .../Project/Properties/AssemblyInfo.cs | 38 ++++ .../_Build/Faupi-HideoutArchitect/module.dll | Bin 0 -> 21504 bytes .../Faupi-HideoutArchitect/package.json | 8 + .../res/icon_neededforhideout_small.png | Bin 0 -> 553 bytes .../res/translations.json | 47 +++++ .../src/hideoutarchitect.js | 68 +++++++ .../Project/icon_neededforhideout_small.pdn | Bin 0 -> 6176 bytes Faupi-HideoutMod/Project/package.json | 8 + .../res/icon_neededforhideout_small.png | Bin 0 -> 553 bytes .../Project/res/translations.json | 47 +++++ .../src/client/HideoutItemViewPanel.cs | 97 ++++++++++ Faupi-HideoutMod/Project/src/client/Main.cs | 135 ++++++++++++++ .../Project/src/client/ModConfiguration.cs | 128 ++++++++++++++ .../Project/src/client/ModInformation.cs | 41 +++++ .../Project/src/client/Patches.cs | 121 +++++++++++++ .../Project/src/client/Resources.cs | 81 +++++++++ Faupi-HideoutMod/Project/src/client/Utils.cs | 113 ++++++++++++ .../Project/src/server/hideoutarchitect.js | 68 +++++++ Faupi-HideoutMod/README.md | 4 + Faupi-MunitionsExpert/MunitionsExpert/LICENSE | 32 ++++ .../MunitionsExpert/MunitionsExpert.csproj | 113 ++++++++++++ .../MunitionsExpert/MunitionsExpert.sln | 25 +++ .../Properties/AssemblyInfo.cs | 38 ++++ .../bepInEx/plugins/Faupi-MunitionsExpert.dll | Bin 0 -> 14336 bytes .../mods/Faupi-MunitionsExpert 1.4.1/LICENSE | 32 ++++ .../Faupi-MunitionsExpert 1.4.1/module.dll | Bin 0 -> 14336 bytes .../Faupi-MunitionsExpert 1.4.1/package.json | 9 + .../res/armorDamage.png | Bin 0 -> 701 bytes .../res/ricochet.png | Bin 0 -> 732 bytes .../res/translations.json | 137 +++++++++++++++ .../src/ammostats.js | 91 ++++++++++ .../src/config.json | 3 + .../MunitionsExpert/res/armorDamage.png | Bin 0 -> 701 bytes .../MunitionsExpert/res/ricochet.png | Bin 0 -> 732 bytes .../MunitionsExpert/res/translations.json | 137 +++++++++++++++ .../MunitionsExpert/src/client/Attributes.cs | 33 ++++ .../src/client/CachedAttributesPatch.cs | 27 +++ .../src/client/ModInformation.cs | 38 ++++ .../src/client/MunitionsExpert.cs | 166 ++++++++++++++++++ .../src/client/StaticIconsPatch.cs | 35 ++++ .../MunitionsExpert/src/server/ammostats.js | 64 +++++++ Faupi-MunitionsExpert/README.md | 4 + .../bepInEx/plugins/KcY-SeeItemValue.dll | Bin 0 -> 7168 bytes .../user/mods/KcY-SeeItemValue 1.2.1/LICENSE | 34 ++++ .../mods/KcY-SeeItemValue 1.2.1/modloader.js | 2 + .../mods/KcY-SeeItemValue 1.2.1/package.json | 10 ++ .../KcY-SeeItemValue 1.2.1/src/config.json | 4 + .../mods/KcY-SeeItemValue 1.2.1/src/mod.js | 123 +++++++++++++ KcY-SeeItemValue/README.md | 7 + KcY-SeeItemValue/itemValue/Patches.cs | 71 ++++++++ KcY-SeeItemValue/itemValue/Program.cs | 17 ++ KcY-SeeItemValue/itemValue/_built/LICENSE | 34 ++++ .../itemValue/_built/modloader.js | 2 + KcY-SeeItemValue/itemValue/_built/module.dll | Bin 0 -> 8192 bytes .../itemValue/_built/package.json | 10 ++ .../itemValue/_built/src/config.json | 4 + KcY-SeeItemValue/itemValue/_built/src/mod.js | 123 +++++++++++++ KcY-SeeItemValue/itemValue/itemGetter.cs | 7 + KcY-SeeItemValue/itemValue/itemValue.sln | 25 +++ KcY-SeeItemValue/itemValue/itemValueMod.cs | 78 ++++++++ .../itemValue/itemValueMod.csproj | 42 +++++ README.md | 7 + 73 files changed, 2974 insertions(+) create mode 100644 .gitignore create mode 100644 Faupi-HideoutMod/HideoutArchitect/bepInEx/plugins/HideoutArchitect.dll create mode 100644 Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/LICENSE create mode 100644 Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/config.jsonc create mode 100644 Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/package.json create mode 100644 Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/res/icon_neededforhideout_small.png create mode 100644 Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/res/translations.json create mode 100644 Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/src/hideoutarchitect.js create mode 100644 Faupi-HideoutMod/Project/HideoutArchitect.csproj create mode 100644 Faupi-HideoutMod/Project/HideoutArchitect.sln create mode 100644 Faupi-HideoutMod/Project/LICENSE create mode 100644 Faupi-HideoutMod/Project/Properties/AssemblyInfo.cs create mode 100644 Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/module.dll create mode 100644 Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/package.json create mode 100644 Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/res/icon_neededforhideout_small.png create mode 100644 Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/res/translations.json create mode 100644 Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/src/hideoutarchitect.js create mode 100644 Faupi-HideoutMod/Project/icon_neededforhideout_small.pdn create mode 100644 Faupi-HideoutMod/Project/package.json create mode 100644 Faupi-HideoutMod/Project/res/icon_neededforhideout_small.png create mode 100644 Faupi-HideoutMod/Project/res/translations.json create mode 100644 Faupi-HideoutMod/Project/src/client/HideoutItemViewPanel.cs create mode 100644 Faupi-HideoutMod/Project/src/client/Main.cs create mode 100644 Faupi-HideoutMod/Project/src/client/ModConfiguration.cs create mode 100644 Faupi-HideoutMod/Project/src/client/ModInformation.cs create mode 100644 Faupi-HideoutMod/Project/src/client/Patches.cs create mode 100644 Faupi-HideoutMod/Project/src/client/Resources.cs create mode 100644 Faupi-HideoutMod/Project/src/client/Utils.cs create mode 100644 Faupi-HideoutMod/Project/src/server/hideoutarchitect.js create mode 100644 Faupi-HideoutMod/README.md create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/LICENSE create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/MunitionsExpert.csproj create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/MunitionsExpert.sln create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/Properties/AssemblyInfo.cs create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/bepInEx/plugins/Faupi-MunitionsExpert.dll create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/LICENSE create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/module.dll create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/package.json create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/res/armorDamage.png create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/res/ricochet.png create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/res/translations.json create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/src/ammostats.js create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/src/config.json create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/res/armorDamage.png create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/res/ricochet.png create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/res/translations.json create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/client/Attributes.cs create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/client/CachedAttributesPatch.cs create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/client/ModInformation.cs create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/client/MunitionsExpert.cs create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/client/StaticIconsPatch.cs create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/ammostats.js create mode 100644 Faupi-MunitionsExpert/README.md create mode 100644 KcY-SeeItemValue/KcY-SeeItemValue 1.2.1/bepInEx/plugins/KcY-SeeItemValue.dll create mode 100644 KcY-SeeItemValue/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/LICENSE create mode 100644 KcY-SeeItemValue/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/modloader.js create mode 100644 KcY-SeeItemValue/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/package.json create mode 100644 KcY-SeeItemValue/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/src/config.json create mode 100644 KcY-SeeItemValue/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/src/mod.js create mode 100644 KcY-SeeItemValue/README.md create mode 100644 KcY-SeeItemValue/itemValue/Patches.cs create mode 100644 KcY-SeeItemValue/itemValue/Program.cs create mode 100644 KcY-SeeItemValue/itemValue/_built/LICENSE create mode 100644 KcY-SeeItemValue/itemValue/_built/modloader.js create mode 100644 KcY-SeeItemValue/itemValue/_built/module.dll create mode 100644 KcY-SeeItemValue/itemValue/_built/package.json create mode 100644 KcY-SeeItemValue/itemValue/_built/src/config.json create mode 100644 KcY-SeeItemValue/itemValue/_built/src/mod.js create mode 100644 KcY-SeeItemValue/itemValue/itemGetter.cs create mode 100644 KcY-SeeItemValue/itemValue/itemValue.sln create mode 100644 KcY-SeeItemValue/itemValue/itemValueMod.cs create mode 100644 KcY-SeeItemValue/itemValue/itemValueMod.csproj create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0daaec2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +## ALT-Mods +*.exe +*.zip +bin/ +obj/ +*.editorconfig + +## visual studio +.vs +.idea +slnx.sqlite +slnx-journal.sqlite + +## nodejs +node_modules +node.exe +package-lock.json + +## windows +desktop.ini + +## ALT-Mods +Faupi-HideoutMod/Project/bin +Faupi-HideoutMod/Project/obj + +Faupi-MunitionsExpert/MunitionsExpert/bin +Faupi-MunitionsExpert/MunitionsExpert/obj + +KcY-SeeItemValue/itemValue/bin +KcY-SeeItemValue/itemValue/obj \ No newline at end of file diff --git a/Faupi-HideoutMod/HideoutArchitect/bepInEx/plugins/HideoutArchitect.dll b/Faupi-HideoutMod/HideoutArchitect/bepInEx/plugins/HideoutArchitect.dll new file mode 100644 index 0000000000000000000000000000000000000000..0f710a2ab87a434a1399838fea810010523d6810 GIT binary patch literal 21504 zcmeHvdwd*Mb^n<=v$GGaR@z-zl5Is^#jmv<8%c4DZ5(4+l5Hh^OR{6)L|JRc(#Fz` zJhQSaD{`bJp}4$aLV%Eh^8lJaLkKODlxGM8LVxfJ(9pVo+muJ3ztDy@@M|bI{hoVg zwJR$D`seTS`K`To?m73|bI(1md*{xqcD?aV(uv5x_mx+OK8-7Xw#f2#7c*#%Ec@#S z{bleQ4WHI_exsppIO`_H9DB$~k0u7wxtyI(9I+D4crKC6CA#+XCPwXyl`1a}t?*dy z?Iy~+NzhYY{o0d-(O#s>6J?^6XeTgc0gG!w)@L-na9t?58Jr`#PvIG-(@l5G&14H> z_*1Da33cJp!xRx*n<2W6mGT;&)?-BLU!(00LMMoJln|!!*2z5J?_G-mZF26IU+E`7 zbW_T4ok1X_Y%{3v#CPLc^4T&s=@R5?R9OZ=KDw@*=!mjPwhqaa3s*h4L2l&G2J?v1NRa5s}0!8hJ2 zXdkXn3HU3#Fs8xH5L4_2RmlW8hs@@ff^8nQ#%_=tebex9LnL8Plk{W-E|AVIl9zL{ z;_s(#gFon^ZW8Sf&0UVxaA4`%_F`Tus~re4_Q1-TWC+c66vYE8YaLvHT#IHiit+gA@t(h0EXriGdaBk#mbhNRi_uDa?u1g(`^FP${B7+LL*Jd7QoY(vVrdLR+IK) zegN4%td6Q=3Ir{cVv1>!R{*HKs5NQTP-2TmquOHH#YHg5Qa{v16cZO0`2huLY{Y1Y znplBspS5Vj-2M>$6&`=P&Es&nNWueQi%*f%?c16f0|KM7d1?zLb6DLg((STQ&|)FW!C_Am9oQ62))pkajI`9 zS=y)vHme2tDAk#}#Vz|}h{0#(kp^8wMKY0~T$zQF!&~L8;IK%X+SGb7+ zP#yT`1WH0n)P>PZ1j;m`!=U8r(8ESphTsmcmg#OlJqhbIu`f53`HMUR!S65}>t8w+ z#3?hSV^v=iFsquiNN!@P#(FVTjv>_eg5u~aZKo#@oR9#~p-)SSoN#`NIY~fNPs3*s zNmt9E8fj^(kK*vQGK?D|F`Zzs%_+VpyOnFO+h$OgIjd3iJH3o}0}#nA%%iHD{7Gn& zeJ^fAjpl0Spro5F(79XDddi>d#HBo#gp^HT`oa4&D9%UDJ3!`*hp;xBy9(XnX4F(e zM1AV&Vv=UE8*Gx>P{jSgs*8F&6b&^Whw_uqxEU{tmNg%wg>1i4V5?XK6^C%t9}T

#Yxf{JOixsOD4!=^LXU~fW&kGcYN1G@bZKRG2$=?+_y7EQ#4Nlj$ zL0Y71(c(Y72XkujIrmG<66aCA%4{9-{6;7(I9C`2WwO5uLPtVmM9D$s9IH-Zc~Blz zMt}A?M6!7FNxKQAf88@ISM4~1)A~9ODni4!O zNNb@ zkh$8v9{pCfl&x|uf=d#~tjWHCSs~_b2thZdR?kQ_vh#*~Y=2+gqa*ryD_ z3^^{4yRp#Q78=W(FG89n?orgk0sm>N?rOz{J7C2}7B}4?w5^=s7JC>~cw0?5IX^-_ z5lm)*Np3;G0aF<#4>F?Ljr?QHVHbT^}qeGCP*CPq!TDJqg9fI^tZ zD6VqJ;W)Sx{bI6TGRN&^vyZUKoEEkXuo4><2kh)I0L|sXIl%zpHq>&NkZF6ahwTDX^QkVouo$^N>XX@N4kt&)%C7N3Nc|K}Q`Kh7 zQP#()is!qITo}gWjUR6x3K90tg%wS>c?`4C#VTRi`y_LMvXYaiwEW~kMT{<1BVR4GPjSol8`&-b(Ouun z?xo`52(IvE#Ct8ciWu2bAjUcg1&O9>o#U zwoCC2*PMZMOC$pw`|vVc1~O~r>GmIid0CT>Y6{yQl~OtHtbk`ghv;M9 z2CC+ACHvIv0C*cLH=xCW;@PN_BPL{qJ9-vNTDH=(fq7{xd!mXIEtwiEa6#nnqG+-sg|7xDF*F#qG452dRZoU7i#vqP?W{A zb8MXj(^g>jokSaudM`94rg!RGm{Hd^YO_C7~4qHu@(bBLRf@qp{EV_BK+q*e$@JayB^;qs6$T8 zY}_i64=UO8=_CejJW4`0e8~?oQWsNm1I*hP|T)#RXS}0W8BZdb4|b8HrbD$FW+WikE9Tf0^w!q zy#f2<3I@>&&HljKW)F#_Zrvz zzPvX8Tz@aEPpNx`<=gvvy3n=*@SP#FZ5^?XFfl&xU+v(s2g-uL)33EFIkCfC39C8h zETjOUZhTwtWjyALBtuf?(1Sb!_2G&kWh_+S%5;2X`C(~%J`rLZYyHjsi3*d-0$jdb zmY*=YE8=t>9ZdQM^IVxpf9L1&)3O{7aJ@;EU9wyw@lTo8fx{ok@?MF#(|ivwUH+Rf zmA{R?phf5d`hRGgB0rB6@?XO*Xd(JltiC)%pDE}1zl3fQ)pUdZ6O|^d)m-c!Tf|eb z2yGRofHAd~Le=z;_Pk-zkjc`XjlL8z>0Q8^v^@M$XbG(;TNz(MSD}Q`%APku^mR-# zM6X9#O}$aZXtAeaCe@a4ug$)fLiO~Le_yzswnqocO-cb{(!ChHn)*$q9}Lw4{|h-{ z*x!wDcZ9ki&wm&!!@rkv`6nnZr$=Lr!D{+vDd89>S5Zs+uF6Kb82NCpo-QjJEU%|< zn8#WgdA72if)TEd%km0Yo-E%NUPVhQ?y6ixUk%<>nWAq5W5Huo30s8dN3j<)lOFJ$ zD@)NpAO@}eJG56#SHxJ(FJX=*Et6V0iCx`l$eAh=L|-dmE%e+KxUI3sF**&*@zMO(mD>U}cjofahj< zi?10@fvZSz?6Puj>TFtT`i$s1{JhL zLgziG6Tb33{nxPHfzU;i)#bux(%XVp!#`e$nW!()zoSRV9}M}T^vQ4pxc&}_xu%TkpY?IMLe?8XS0k=|uGfQGwYkRE zKy{TZzG}L@a-DA-J*#z~{uk5@K9$kk64MXNLG2JQ{}#%i{62C00mx(0HD(RU`^$$> zHt0MG^Ve|tJqoF2GzaA?G=Wj-V^<4R@+h}}C)#~G5>Pk2i9Qo$54u-Ev-E#;h92_T z67f60CBS9^cohclZq2flUP4>7T>z@cHP?5_(f@V}%9{pY__9r%7Ls z(AmJtfx98`*Ch1r!2b!{>+{pEy|xd8?*n9DJtTT};GN+Q`vSDqgFdK#6wvJoqK7IT z1N1cy`h3M_eL;FrLTdC7y{w?XpG9hsON|xG^G$)zM=B8s%M~Q$ETb(FdN+Mae92cv zU&iWAbQd1nJnaipE0##eg0>I)%IQxfq(&&GhrG6w`5m;)V57v8f%x})5o%tepc{NY z@>SA=gwEEsR=nVg(d}N_Bfb}~9>}E&{a%U$v^cHj%>$sD!vU>|Ui6@cLofIi(M1WV z(HD`QmqIE)TNH#niH7)nuY}%BCqgfxAKyO^snM$`HV?vm>KvD9S}md5=(F@Ic*zwd zZ8fysYrBp9%U45xE+NIUmOfoVSxaB`DASr|*3!R~v@NFp^xED-0dq0&aXZm%^h0b! zm(ZYu)QpzWh=iWgz8BMwJ=V7}<#U?pYXh`VLQGkS>~yV!o}v@scNv$FRnnHA6JA?7 z95EZ{bP453dbbD7#_G%@-J_tu`^9p74gINv)cn@aLlRPwt)a&xbQ}8-p6z^5LSLqB zdZXD$KUMwcN<64(q}#FIEZC@-?v#+CY^G03=qxBV!az@!P`1$jDxqwlm*yxt%of_+ zUgXIt(vTZ?uk#9ANk=AQ%qN4z@_X0{X{1V~RP+VR1K~<|Op7dc$<`lAZs%paL1)el zvi@`M*XU;vF2617r_rj>K2a?HHOh5cqSNh?kHX&unFXx} zrA|*kTElByNY6AHwaZa>bRp-ik&@&zGWN50`oh^KiqeNQi0cg~L)3<{k~YY)LzX?V z+$YOJvP{b|i*gZ8rkQ?Hmb0=vBg>~zYV@)!7i*0bODK)9fzG0AqXT@YG4TfD1?>qj9sLE$(dcirtoCi6 z5Kl{OJS}>IL2+I@uU869yFFMdm`|Nx$`z;|k2j0Q#7?6f^*@eZEq*3u!n;LQ`)a69 z{7idC^m=hfYcYQK9Ld z62H*yp~L29(fW_RZQ3Dih5n=n>fa80Lp-kiz3=Z(PQ`wJvMcm2=*7016{A>5&SPG` z5e*pYjo5)5&<&kO59{Z(uLhUu4f>0f%k}59uNbRQzB{rUtvBicZC3nOh-bGUbTu%o zD1Qb$Y}KRMH}qO@Sn@wCEqj>CD+cro?TI;hoA@nO&J2AohK!_t9abBm{~dUX-XXpl zewRKXd!47>_|EBV`ezNuMsE*23OQdN{gA#v`!4d>dAcn64YYn!d0AJ={)dQkr&y!Q!hxo^4tgmy+hY|QG{$8Ivt=&K;% z8U5qYN9ioa%^JVJh{ugt=zPNHg9h#}9@i4#x1szxIJ_)<>}8EJyC$NsN*p+`Em&sk zQ^cnN=Zt$W7nbc`%4^{doAi$uBh(-NoUumR5Zk4(KRk(gN07DmOy~}yO>%gQz5rM`soUo=v94*E-!aZ2NH?NYiK<#IZMvWeb_@=AIbJQ5D3GG4pmH$au|Dh~(!L7?>d7CWnlVw6@4qNn((wF^P^uIuTMq=)hKbAiz2S4;6)Sq zJ^Ca1Vxz(Mpz)W+Hw_(m*@w&>=cmu~+dz*=*r)DB`Hu0WZAefC3R57A%HQ+WPZrDe1!?L(pm9z3i6 zSpTJN%<$@f+lIN%Ijj_XI#BpLYxH7my7beA^@n?we*R-VD4V_(ld>*Gzw@8XhyKUfZ{bQMQ-s-dMk$iScj!T=iTltQ$v61Xx`pAgYKZY0JGM4ML zvBVn&+Fqrj#Ewrmo39$+b|%E-HF+_~IFsxi9~t3+Zfc{R?%epO<#=T%7PU3f2`C(hu`qB=h_u%~&rZ8wxkISC5$2mBh&0D==jN&Qw zZI(To$DD*52-HO)1%g&BR4}~z0f3M2Zk1)m>}QX1kSV zXq#h?dKfkhJJ7Z)nh!ddree8(`tt0!b7lH(NQatWrT7)csJ@iu|l-T*q#H1vl+`C&-Wk^ z9LQP|b9m^tJCn`tIeHWtKA6pA>|)!d&20k%QgPHf#-2cI1y@x$%HSf740Md0>B!^R z#F24OZ6D8;K)bE+yptZ;Z@KokGibRx)48E>cyN)v%Q`YXG{hcS#DV>Rtec&O>u_Cb z^vK9$Up8M#y1@8FE{e0|^yaOxzG2569~v$;&avZ_Xf*8{D>kXn--dUztqHrd0l90d z#TlSTTNq$ghxgiU{%H2( zt92M1OXntw4PMG&Nih16>aIkV{^CEsi zxjQn4(wKD4A~Y~M*U)h+o7!(3_1318oB{ZkrjXQbE6b} z9gdTpl<_VJRf6!QnDQ*jEeLD*ppNot3*?trBRk&Q4Q&~zh*(Jt0A zsk|s9rtMBPQ;1)+!RpB!wN+aI--G-c>Y4;e}uzog|9w|&@XZnaWLi;$k7lz!M&H)9bAplBKjKVXg&T+@Vc44P=0))JR zshSk2V`PN9jvZL>kz@w*sSJ?Zk%y4Vmle69$XZD6$+Kn3bc^bT&s@t+Afm-jQ)kkT@C3<;{by!4`-RP8_0a1lBa~dl{5;#jGyV z&z>=CFlFnU2YL}q^S!TN_@X~j_ioF|VC!WamAe#-pb+o`Pcx-WcD{$VJEOd@&vc(0 zv}7tkvLC{dpUZP@Dq=Y=@Pdxr%^W2xRRpX#G>eHS9mVjtV7B=J2v5Q;*|m@6Q_K%r zMRg~Dy%54OEAI+a{L1F-R$gA^28;D3?cnLK5Tp{X)^v#gB*H1EEHdWW%?sQ@haueW1PA?}7ca+xj%Z`c*GU`uE3aM}Spr-{^# ze0~gZXOE8+?6xzTI}ZEI(@07pi@GMP)KEDXV^_jq+MFL4IN|{^2zI4& zSP&hO`%pOX5CgIWS8prj?K0>ZWV<}v7cG5u{}}v^cnG;8MjhHOR9PUofpchrS8oRq z&TkKJAj~Zm#8gG7lma`9T)x<(2rohQ**onCaOTEdZ209C+kutms_AiTb{rMX?zK7W znQ)unAw1*kkm^!sPPMOs9>^;@mXc<3W8;vInR%YL!#b&8+?I4Z4jP~iZ!e5Jw#up9 zyo#h5Oz{mEN_pXYQ@9&)3)b$+riXG^>#~D$s6w{K4Wb3_!K6=M)3%^lExp)zT-sjP z21!dTxF6>G3z-dy!C$ylR_gfTHyk>ahI9Ibep zhGoxlbdMUlvr902c7c(_8;}KNlN^UF-eh4bpUtyhV6QwrlIJzmtM&JEtCTM{^(E6o zZ+V|xiejUe!ZHVNYDYNJz@S&bFnb)_aI>T0MhHzD0Z#v7ZIYmmz~lXA-<@w_UiwZHo$ObsVfsn*-mBFu0uR@|oWYB$La z!b#V?7H_0=JM`x(Vkv_$Fu@emAin*B#U&aeMIoa35Ym+X(tAWDmX;d4YqDL(PU9S@@Tc z-=lJrVaiI_#`z)M@7nI5%|+j=?484JL4IGK0nm?98d8to*C%73A0leoF^_Kt<}*k< zRv!EZQ6_LspO+G(L2qI1%W>+z4k!6*@vacwLRrkx=jbT<41w>>7=__MyneP5wKSy8 z%CQojq>3_u9uC?^F~VxnbbO&Z8&D~~gyfZgv}s5&j8=*!AjL`Wbb)dCtr-1!%;N^M zb%J^vv&*2KL!G5(8?g-Y`8MFiPVTV_ys(nZNm%6k>N4Ya30%|YIe|V(BDT^|;CN(~ z2+x`KFz>y|5VPSq7c|3mJPFE6b(=yD z^tpli^hsVUC6AB>Hy)eq$+ka&F)Zl;MQu)8GD<<3(wTw#WxtC%m9stAPCQq-^|ePU zct>GQrK7N&JSs~v3J$Cxjzu1UEpY{MNogin7_nF2H_6{Retn)$-@c(B$=)5Pjy z2OWg?DzJ;8s|Htrl*2^XRgQoqhb#wJ4ijtuvOawqDm>4b!MvOIB> zbd;+U3_1!*Rum_Tf?}By2PF4)fK>*V0K{(FKw4C(Pz5Y=r9+*dnlEJz5-2y%LSp94 zPR6Qar(h{Lc@+8#O376V%QFdzJdaf~U(r1tAKJqSl0%!d$Nbo+JWEc+r75|zK7dwE zk~R`GJ16(d%DL0B0lYq;f|QM>T(AccdkOcFb~T%wXl0u~1IswY6kMebJb7Va?qe7W zZ`edxwu0jg@DG-kC+S8!cunI~!c*{sHFOIdhI1W;^i6neFa?Zuup50iNZAfbCS{dk z0x0FnG;FPcmvFDup0BOO%Z3Tm+u(QFRX5_{a1uW$+Xx9-A;AVI$5H&axCII62GCsz zx;2u%8B5GGUfR&~DWv&nd~d+wS+GPu=GZB9$T~TRSyJcxg?R#&;*@1!X;yx(7G9nY zhrR=RK{CGbXyo5X2ly`$EZdEK69^{OT?Up>nm+)D@wBGYZtjA1jxJu3VWA+0BFjOG z`e79njyUG^Jc4drQ+x8APY-r}W>zH520CvgJwck0(6oRLMRXBYBU}hGp=*&yB#;nV zZ03>6>P#R}QI}_Zei6Gt_!1PGxj#^;Y4uz&LR#zw|DxFJ1}%2nhmLi%A@uSPhF=JQ zr^g~Tdo})7`i z?m)jKl|o>&U0OX4iVMkxdaBoq5ZdwklSo9iL?V7&EQ*e6(Mc}D2HskTm*-3j%?THY}U_Ki_Kb4bOdjFa$j6U zq%Jyp9HxQ#z!7X%84+Pd%Kg4rtr{^BtChxs=YZocBR>3euO7ca(qgrE-x;nGot=~f zbrpVpZ00Mhx`4ocxRC%$zm%+=eCRRr73F7lbN4_Hn);l;{GI?d4wsN541n^9U;-X> zMP7oNCBXMW&s)ie#Sv@??~X`FAB`F#;E`Z=qI=ZbD`!xgyMsMJ+m zo!_rVXMQ0BrX8DI6p26;c!^g74l9%+cWy1Hfl zGG+Oh_d|>*er1l%a3O#Ua5zS1KO{^Um$MHWW^DEmNMEO9n|VJQ5_YKLF;%xXT(9VR zK-QCx%6&hy5S#gs5aoU|5S=+6>*9Hzk&}H6feEobCxLGvaX{DSL#;xvt}E*`e@Mt4 z7&;^^|Kr%qbN+;(h4Eoqhr{Ir?oY&KejJ^BIy%XQh*Mls20ar(=84U+8~QjC)v+pO zS4uN~i_IL6arc!Nrz~hJggGF>k$~h}A6UHhpUwnYAKCMhPki`eKM#ET z4Fk7EpABs^a7#sohC(-EyYStIZ$G|=@U6nP7FwIRTbKdej8=w_c0A8RQy`$S(ClIl z&sGDzmGRIWVnY%{fLkv~l#&6a4HN#zte@lJ#|)kaelOc78srJ5!L1)N;?zkf5uJog z!_``@BDi>p_^F5r{#Y7q0+|v1R~4&8Vr7S^jBfD*5kLe57{e8IX$RC|@;k#z%B4f|=P0U|JcQZIR=mb_kl`TVr;tY`2}8J4NOvYZI;pIzO9*s_~MjckiB;w&4UJ!+-b)$3K|_KZ8rOBycF*~FI~P9)k}+uN`jYqX-h?MT~( z)>f;fJ##eOvUad-eM`FSNT$VVYu(WLx^?ZXN3ARI%O*^!E!BpfW?^%L-!}QITnm11 zMY}YrOYQFNn|nss>^=Uu8o%RuU8)_5id4-tdT-nClk6()m6&TuNa{9?nlF_cCuQCf z)24;5h|ui!HQbJ?CoXf7P04e(rq@2iWram%&xL}Q9x@i6FhGYAuv}@O5q`lVG45I! zwpj+RSvaFOd`?UZX9tIsArd$twfy+TyVOP z>>LD`7`E_txbkko#)!_`kobdLR*MwKh3mmNG2x?ymr+uQq?H;|cHjf1+> zwvPV2J*i90TrJTpm!f^`%1cjc)O2Z^=NYedhA(|$M<}@P)E%xMkJA(OQRxfb8GK^( z!q8lu7?y|lxas6i?AL4WY9=xur`@mrt-UWT&bo?-$A@Pefhw)Cw zVfk3~@B)R5WsY1Tz#jziFT&*SvuEa$tG6SOBNpJ9ZU?^Cq2)J7;Dyg`blhCg0i59s zpzOxUUoSTKe4aCa>uz}($h4m`{_P^aXQ)O{HO9Yz3w*G$NIgryE4pyiz?E-2x8Y`j z&jsdgAkel#_Uc0`-*&iY=UZCu7E|*0xN(>l8^~0=9bCw1y`*Wyt(p3_7Ppzu0eu{| zM4G(a8pX|~g)#W7i@=RvE}GzCGkyW7Y{y zfN^En3!j~MS5uqQW*1sq+{W_l-Wd27bvOSYfMvb(l$4+&?5gH?9RM$N_Q%H?{At5& zHGf;>mvE}I2=r`0zO8g{<>QQ^g!9K-IARK#;6o1nY{5II8tjADCnOi1^%&;MGZ})` zaN`Nd_=HlO_2IV-_}30u+94DFsER$Y*k5@OYr3Fe)~NdImvZm%c(YAe?t&jNq%{0L zk^cbR8rN_f#m5a9NXdsIMNP1e?ZruA3-o?1G^YIJ_wi?G*Gikr=Xg*{1`Z Zz=s*5@{E$t_I_VKPd)$t^8bJa{u`+A0&)NV literal 0 HcmV?d00001 diff --git a/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/LICENSE b/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/LICENSE new file mode 100644 index 0000000..94e9435 --- /dev/null +++ b/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/LICENSE @@ -0,0 +1,32 @@ +University of Illinois/NCSA Open Source License Copyright (c) 2021 Faupi. All rights reserved. + +Developed by: + +Faupi + +https://github.com/Faupi-SPTarkov/HideoutArchitect + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +with the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +* Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimers. + +* Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimers in the documentation +and/or other materials provided with the distribution. + +* Neither the names of Faupi, nor the names of its contributors may be used +to endorse or promote products derived from this Software without specific prior +written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE. diff --git a/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/config.jsonc b/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/config.jsonc new file mode 100644 index 0000000..5014617 --- /dev/null +++ b/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/config.jsonc @@ -0,0 +1,9 @@ +{ + "NeededForHideoutDefinition": "NextLevel"/* + NeededForHideoutDefinition - Defines the logic used to determine which items are marked. See mod page for details. + Options: + NextLevel: Generally marks items required for the facility's next upgrade + NextLevelReady: Marks items required for the facility's next upgrade only when its other facility pre-requisites are fulfilled. (e.g. Items for Lavatory 2 won't be marked until Water Collector 1 is finished.)*/, + "TooltipHeaderColor": "#56C427"/* + TooltipHeaderColor - Color of the tooltip 'Needed for hideout' header.*/ +} \ No newline at end of file diff --git a/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/package.json b/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/package.json new file mode 100644 index 0000000..29c3f66 --- /dev/null +++ b/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/package.json @@ -0,0 +1,8 @@ +{ + "name": "Faupi-HideoutArchitect", + "author": "Faupi", + "version": "1.4.1", + "license": "NCSA Open Source", + "main": "./src/hideoutarchitect.js", + "akiVersion": "2.3.1" +} \ No newline at end of file diff --git a/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/res/icon_neededforhideout_small.png b/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/res/icon_neededforhideout_small.png new file mode 100644 index 0000000000000000000000000000000000000000..2c08c2c646a1055ee094c93e359c5945bfe6ca05 GIT binary patch literal 553 zcmV+^0@nSBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0lrB@K~yMHb&tJE zBS9F(-`TiHmc-p?(2E~Ya#tlWVj2q(JUG7!L9wv$AJFbjID0KU(bmpJu#KhKXoNda zL=jPo^E(7LXmri$ZpLiJcS4F=P9OL&GtWHFe82~CBi)rv&SdXY%o<*au+V^#cgYop z=r0PT$p7M{P-LjS#rKU0>WRkGZ6iG3v-6Mes;ZH}NpXwHJC3kseF5hRBPc!}S}!_IP{6aO;aHxup<8co}w z0WuO>{c(DrU6~179U+%Un$(4>Q(d#o^+n~y_7p4SW^0ote{$D!0hdYS z9-&Bqj3ioF_D*B@#{yJGB;t}CVBNUc>d)f?J@q<=q4jd1fRrR$?q;mrY1Q1DQE6tA z9|WME6)h}m;`BFSD{u*amva|SDf8CK1GPlTxcR8&bR15REMhBg3EA`KEy?fHgWXyF~_N}7NA3^7Y7n*iPb;{m8fE5%>K00000NkvXXu0mjfG1BpS literal 0 HcmV?d00001 diff --git a/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/res/translations.json b/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/res/translations.json new file mode 100644 index 0000000..0c42800 --- /dev/null +++ b/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/res/translations.json @@ -0,0 +1,47 @@ +{ + "en": { + "NEEDED FOR HIDEOUT": "Needed for hideout" + }, + "cz": { + "NEEDED FOR HIDEOUT": "Potřebné pro úkryt" + }, + "pl": { + "NEEDED FOR HIDEOUT": "Potrzebne do kryjówki" + }, + "po": { + "NEEDED FOR HIDEOUT": "Necessário para esconderijo" + }, + "ch": { + "NEEDED FOR HIDEOUT": "藏身之处所需" + }, + "ru": { + "NEEDED FOR HIDEOUT": "Необходим для укрытия" + }, + "es": { + "NEEDED FOR HIDEOUT": "Se necesita para el escondite" + }, + "es-mx": { + "NEEDED FOR HIDEOUT": "Se necesita para el escondite" + }, + "ge": { + "NEEDED FOR HIDEOUT": "Benötigt für Versteck" + }, + "sk": { + "NEEDED FOR HIDEOUT": "Potrebné pre úkryt" + }, + "tu": { + "NEEDED FOR HIDEOUT": "saklanmak için gerekli" + }, + "it": { + "NEEDED FOR HIDEOUT": "Necessario per il nascondiglio" + }, + "jp": { + "NEEDED FOR HIDEOUT": "アジトに必要なもの" + }, + "fr": { + "NEEDED FOR HIDEOUT": "Nécessaire pour la cachette" + }, + "hu": { + "NEEDED FOR HIDEOUT": "Rejtekhelyhez szükséges" + } +} \ No newline at end of file diff --git a/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/src/hideoutarchitect.js b/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/src/hideoutarchitect.js new file mode 100644 index 0000000..c95bd72 --- /dev/null +++ b/Faupi-HideoutMod/HideoutArchitect/user/mods/Faupi-HideoutArchitect/src/hideoutarchitect.js @@ -0,0 +1,68 @@ +/* hideoutarchitect.js + * license: NCSA + * copyright: Faupi + * authors: + * - Faupi + */ + +"use strict"; +const path = require('path'); + +class HideoutArchitect { + constructor() { + this.mod = require("../package.json"); + this.translations = require("../res/translations.json"); + Logger.info(`Loading: ${this.mod.name} ${this.mod.version}`); + + ModLoader.onLoad[this.mod.name] = this.init.bind(this); + } + + init(){ + this.hookRoutes(); + this.loadLocalization(); + } + + loadLocalization(){ + var globalLocale = DatabaseServer.tables.locales.global; + + for(let language in this.translations){ + if(!language in globalLocale) continue; + + let attrKvPair = this.translations[language]; + for(let attrKey in attrKvPair){ + let attrValue = attrKvPair[attrKey]; + + globalLocale[language].interface[attrKey] = attrValue; + } + } + } + + log(data){ + // console.log(data); + } + + hookRoutes(){ + HttpRouter.onStaticRoute["/HideoutArchitect/GetInfo"] = { + AttachmentOffset: this.getModInfo.bind(this) + }; + } + + getModInfo(url, info, sessionID, output){ + var output = { + status: 1, + data: null + }; + + // Don't mind this pointless try catch + try{ + output.data = {...this.mod, ...{path: path.resolve(ModLoader.getModPath(this.mod.name))}}; + output.status = 0; + }catch(ex){ + throw ex; + } + + return JsonUtil.serialize(output); + } +} + +module.exports = new HideoutArchitect(); \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/HideoutArchitect.csproj b/Faupi-HideoutMod/Project/HideoutArchitect.csproj new file mode 100644 index 0000000..8ec6e95 --- /dev/null +++ b/Faupi-HideoutMod/Project/HideoutArchitect.csproj @@ -0,0 +1,135 @@ + + + + + Debug + AnyCPU + {21B1900E-2DFA-4C18-A1BD-E10907620FE3} + Library + Properties + HideoutArchitect + HideoutArchitect + v4.7.2 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + False + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Aki.Common.dll + + + False + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Aki.Reflection.dll + + + False + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Assembly-CSharp.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\BepInEx\core\BepInEx.dll + + + False + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Comfort.dll + + + False + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Newtonsoft.Json.dll + + + False + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Sirenix.Serialization.dll + + + + + False + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Unity.TextMeshPro.dll + + + False + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\UnityEngine.dll + + + False + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\UnityEngine.CoreModule.dll + + + False + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\UnityEngine.UI.dll + + + False + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\UnityEngine.UnityWebRequestModule.dll + + + False + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll + + + False + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll + + + + + set BuildDir=$(ProjectDir)_Build\Faupi-HideoutArchitect + +powershell -Command "Remove-Item '%25BuildDir%25\*' -Recurse -Force" + +copy "$(TargetPath)" "%25BuildDir%25\module.dll" +xcopy "$(ProjectDir)src\server" "%25BuildDir%25\src" /K /D /H /Y /I +xcopy "$(ProjectDir)res" "%25BuildDir%25\res" /K /D /H /Y /I +copy "$(ProjectDir)package.json" "%25BuildDir%25\package.json" + + + x64 + + + + + + \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/HideoutArchitect.sln b/Faupi-HideoutMod/Project/HideoutArchitect.sln new file mode 100644 index 0000000..056db27 --- /dev/null +++ b/Faupi-HideoutMod/Project/HideoutArchitect.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32014.148 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HideoutArchitect", "HideoutArchitect.csproj", "{21B1900E-2DFA-4C18-A1BD-E10907620FE3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {21B1900E-2DFA-4C18-A1BD-E10907620FE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21B1900E-2DFA-4C18-A1BD-E10907620FE3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21B1900E-2DFA-4C18-A1BD-E10907620FE3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21B1900E-2DFA-4C18-A1BD-E10907620FE3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {DFEE36A3-C9ED-45DF-9015-A34EC8AB8641} + EndGlobalSection +EndGlobal diff --git a/Faupi-HideoutMod/Project/LICENSE b/Faupi-HideoutMod/Project/LICENSE new file mode 100644 index 0000000..94e9435 --- /dev/null +++ b/Faupi-HideoutMod/Project/LICENSE @@ -0,0 +1,32 @@ +University of Illinois/NCSA Open Source License Copyright (c) 2021 Faupi. All rights reserved. + +Developed by: + +Faupi + +https://github.com/Faupi-SPTarkov/HideoutArchitect + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +with the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +* Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimers. + +* Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimers in the documentation +and/or other materials provided with the distribution. + +* Neither the names of Faupi, nor the names of its contributors may be used +to endorse or promote products derived from this Software without specific prior +written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE. diff --git a/Faupi-HideoutMod/Project/Properties/AssemblyInfo.cs b/Faupi-HideoutMod/Project/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..8e8031e --- /dev/null +++ b/Faupi-HideoutMod/Project/Properties/AssemblyInfo.cs @@ -0,0 +1,38 @@ +using System.Resources; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Hideout Architect")] +[assembly: AssemblyDescription("Similar to the Found in raid mark - Adds a Needed for hideout mark to items")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SPT-AKI - HideoutArchitect")] +[assembly: AssemblyCopyright("Faupi © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("21b1900e-2dfa-4c18-a1bd-e10907620fe3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.1.0.0")] +[assembly: AssemblyFileVersion("1.1.0.0")] +[assembly: NeutralResourcesLanguage("en-US")] diff --git a/Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/module.dll b/Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/module.dll new file mode 100644 index 0000000000000000000000000000000000000000..0f710a2ab87a434a1399838fea810010523d6810 GIT binary patch literal 21504 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 Zz=s*5@{E$t_I_VKPd)$t^8bJa{u`+A0&)NV literal 0 HcmV?d00001 diff --git a/Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/package.json b/Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/package.json new file mode 100644 index 0000000..5cf480a --- /dev/null +++ b/Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/package.json @@ -0,0 +1,8 @@ +{ + "name": "Faupi-HideoutArchitect", + "author": "Faupi", + "version": "1.2.1", + "license": "NCSA Open Source", + "main": "./src/hideoutarchitect.js", + "akiVersion": "2.1.1" +} \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/res/icon_neededforhideout_small.png b/Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/res/icon_neededforhideout_small.png new file mode 100644 index 0000000000000000000000000000000000000000..2c08c2c646a1055ee094c93e359c5945bfe6ca05 GIT binary patch literal 553 zcmV+^0@nSBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0lrB@K~yMHb&tJE zBS9F(-`TiHmc-p?(2E~Ya#tlWVj2q(JUG7!L9wv$AJFbjID0KU(bmpJu#KhKXoNda zL=jPo^E(7LXmri$ZpLiJcS4F=P9OL&GtWHFe82~CBi)rv&SdXY%o<*au+V^#cgYop z=r0PT$p7M{P-LjS#rKU0>WRkGZ6iG3v-6Mes;ZH}NpXwHJC3kseF5hRBPc!}S}!_IP{6aO;aHxup<8co}w z0WuO>{c(DrU6~179U+%Un$(4>Q(d#o^+n~y_7p4SW^0ote{$D!0hdYS z9-&Bqj3ioF_D*B@#{yJGB;t}CVBNUc>d)f?J@q<=q4jd1fRrR$?q;mrY1Q1DQE6tA z9|WME6)h}m;`BFSD{u*amva|SDf8CK1GPlTxcR8&bR15REMhBg3EA`KEy?fHgWXyF~_N}7NA3^7Y7n*iPb;{m8fE5%>K00000NkvXXu0mjfG1BpS literal 0 HcmV?d00001 diff --git a/Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/res/translations.json b/Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/res/translations.json new file mode 100644 index 0000000..0c42800 --- /dev/null +++ b/Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/res/translations.json @@ -0,0 +1,47 @@ +{ + "en": { + "NEEDED FOR HIDEOUT": "Needed for hideout" + }, + "cz": { + "NEEDED FOR HIDEOUT": "Potřebné pro úkryt" + }, + "pl": { + "NEEDED FOR HIDEOUT": "Potrzebne do kryjówki" + }, + "po": { + "NEEDED FOR HIDEOUT": "Necessário para esconderijo" + }, + "ch": { + "NEEDED FOR HIDEOUT": "藏身之处所需" + }, + "ru": { + "NEEDED FOR HIDEOUT": "Необходим для укрытия" + }, + "es": { + "NEEDED FOR HIDEOUT": "Se necesita para el escondite" + }, + "es-mx": { + "NEEDED FOR HIDEOUT": "Se necesita para el escondite" + }, + "ge": { + "NEEDED FOR HIDEOUT": "Benötigt für Versteck" + }, + "sk": { + "NEEDED FOR HIDEOUT": "Potrebné pre úkryt" + }, + "tu": { + "NEEDED FOR HIDEOUT": "saklanmak için gerekli" + }, + "it": { + "NEEDED FOR HIDEOUT": "Necessario per il nascondiglio" + }, + "jp": { + "NEEDED FOR HIDEOUT": "アジトに必要なもの" + }, + "fr": { + "NEEDED FOR HIDEOUT": "Nécessaire pour la cachette" + }, + "hu": { + "NEEDED FOR HIDEOUT": "Rejtekhelyhez szükséges" + } +} \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/src/hideoutarchitect.js b/Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/src/hideoutarchitect.js new file mode 100644 index 0000000..c95bd72 --- /dev/null +++ b/Faupi-HideoutMod/Project/_Build/Faupi-HideoutArchitect/src/hideoutarchitect.js @@ -0,0 +1,68 @@ +/* hideoutarchitect.js + * license: NCSA + * copyright: Faupi + * authors: + * - Faupi + */ + +"use strict"; +const path = require('path'); + +class HideoutArchitect { + constructor() { + this.mod = require("../package.json"); + this.translations = require("../res/translations.json"); + Logger.info(`Loading: ${this.mod.name} ${this.mod.version}`); + + ModLoader.onLoad[this.mod.name] = this.init.bind(this); + } + + init(){ + this.hookRoutes(); + this.loadLocalization(); + } + + loadLocalization(){ + var globalLocale = DatabaseServer.tables.locales.global; + + for(let language in this.translations){ + if(!language in globalLocale) continue; + + let attrKvPair = this.translations[language]; + for(let attrKey in attrKvPair){ + let attrValue = attrKvPair[attrKey]; + + globalLocale[language].interface[attrKey] = attrValue; + } + } + } + + log(data){ + // console.log(data); + } + + hookRoutes(){ + HttpRouter.onStaticRoute["/HideoutArchitect/GetInfo"] = { + AttachmentOffset: this.getModInfo.bind(this) + }; + } + + getModInfo(url, info, sessionID, output){ + var output = { + status: 1, + data: null + }; + + // Don't mind this pointless try catch + try{ + output.data = {...this.mod, ...{path: path.resolve(ModLoader.getModPath(this.mod.name))}}; + output.status = 0; + }catch(ex){ + throw ex; + } + + return JsonUtil.serialize(output); + } +} + +module.exports = new HideoutArchitect(); \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/icon_neededforhideout_small.pdn b/Faupi-HideoutMod/Project/icon_neededforhideout_small.pdn new file mode 100644 index 0000000000000000000000000000000000000000..3d02f3b66f6996b4979cc04eed9b276b9ddeba94 GIT binary patch literal 6176 zcmeHJd3aM*7SHP*wnoY#Yhzek0?pE9>Cm)&FKN?|CQZ5~t+h>FUY0gn-^8OKqH zm6QhgYNgGCf=gRgVK1n#!ACw68aZkNe{zv8Y^{b0)SxXZ<*QJV%EHBZs3>*oD+Cy@ z2{i-*Qlq{CDp%qK_G&zcq6$g_h7tveTLMi=_<|DnD8(w}_Hv^X#Y$8PBUp2Zq#84O zxDu;JB{1ATkG6Rv1<4Divl#jSUiAAt|tW3iv{cp5&EiDyprGelHaW3ryZhu`SzJSgJxz zrD#!>-9{)a)!`scX?egNs|p#ogp^-Sh*BwZf_Ms4G#eEvVNkgIK5lQy8SUE9?#m%$TGABa7taK?7Hy zQ5Wb;ex+Q&Ypf8K8&N^29@SK6FbAqB!wOtVbGQ_Bp^}QQoTtO}qDCbqS11$}a-*$L z=_#tzsYs*A*kE%iOKeh)qC|(<4TWe!kxE#maN8tdEQHC0dV#DNwSIbSNZJJQT+Lnrfrf>91@y7G(O1%}qR8WpTD% z9V`f`Z6rGmt3pjS>QMA>y zRI3em@oJtZv&k3W%XvkpN$n4!A+^F~NA*S}sxx?;AXF&jDuKm=7B~yb8_WE9mt4+a z^Kx@|i*Wmrz{Dg6rEpMQ4@Fp# z#@Luhb2VvZ5i7|;U3cI zFvo_2p8A$i{MMMYnS~m!E0-3;m0$W@jy%k_Y^n)v0^Y2fk=ev zACDQdN%ERVkQx?BlBQ-DNN$}220JxIK{>+2^q6sAtYans_#e&lST3Ms!dhS^LqFi2 z2JQst^oBIi>!{P18a!lDoyOsYf0*Clv@q*RiGTxkXYdk8Z%PU@JqB)KA%n5vX$B)1 zej;7ia3=oTFCyUy-vJW;GCma+QG6rOoEU&qMUW&WP)uD+gdElkpUIY4!>>)61XPL~ zsA4-TGEOF61U7omj5q=bhwW?j5;6|h`e^_e2Uiw)&2GKl?5gCe6nekLkrmR~P#J8S z$PkDtjBOI6P}EBn^a7d1i+T}egEIu}1z?Xk0cVZtPSA0{Z^i*rCjg2dAPcA@F@REd zK7q@Yjst@4xDE)96rjsPF}Bi6&yJ2mEL=El)0|X|SHnCivCzZTKj9RSM1f7* zLL^eS$;}6o31H`#P*obj2NxJ@qN<^xMI z+`GURPjOI~32(HK9>3d??D3j#hp(AQheG4A5D46%6MiXY6$FW!8=HKZ9dx>3EXEU_ z!~-!&rsvo~Cd?r?x+eC3uJ<2arYnr@n00lG6bJ<`1k#A+nh=g4pI{+P$af~3VFLkk zo&-zax^L0AZ=@UehW^1E1A)Y&Ati9c0pcb|DV%|9q#?7x!=z{t(5MI!K|Y8@g=~$Y zLfYPhDg#OcQW&B#A?g?uBZ9mg3k7){g@OdX2?_&B1d{z`sLog@*a4zYuoc_{rG!wh zE!+&XCk84JviN5*A6U}NPlQzbcie@+J>=teYEDF#i)(lR-xV z%CT!<`Xlg20abW?{dYb5hn0dYe8wABj+Kus;|EjZTC6D}UdygbK4WKZO?ZD^Ye>cl z#y9a&v(%%2|Bw$a5QpBhLu8M{IXH2cJ3jhx>!-Ssz{Pu=O5YbL!OAx~gS0 zgTu$37>Tqr^fH?EJpJ?+zol%yjtmcaBgnbBq%)uDR*Uj@S9`wixP5e;w_)WOYMX(_ z;%&`rys~rsmCccpCr@@g`qKlD) z#i()9Gb5KSIN$Amv@9>ZucKh{`D=;W>vo$DuGw~~E`K-GYDj-Db^gh&t6k4O z@V!SKKjL8zx5@79k6iI{-?=z2G%y-Jc%o~lv1%0Au_g8Wr2M^;KJUtVW%*-Wt^NCV z+|})Q&2^j+D6uGRJ+P)t{Bq4u>gRiS`GFOzml#d$Z99h-Y@8bm_CB6JnrSkfzO+Yt zl>OS?p6=oZ^EXF&du5Z)DdXB1ta))wHa~H^X5-0os(aV0T^Bcc|N4ZH#Py&E8j`yN0yinKg>GFn6R{ z>T3Je(r4YNUpmF_ZTvF?@pd1mCaJjL?=sQiqmFusY_ivRFC52O0| z`v=sDSx^4))mxrlzq|Q?hjQLNHg#1E*UVMlW*msapS6e=e;b#kS=h25P-gvV)#g5o z9347-^6HAnw|Sr4v%kHPwR6+yd2_z|pi)r&^}0Rb(CLnIwMBT#qUzAQi^!)|rzF1Y z-8ZXt@N55*!9|be6iPpty~_D@>zgDpq&+hg|Fp!g?V;(rii!$*KJ0vB*ZKKrA8jh_ zX}SF3=>?7bS${>TO>-7?*Y-|dFz7#;x25C7Q-4}9Jh(Plap-Rg)KV##^2QD%mYCTtcdEb34+a<@-uI}@eWUX%- z>HTce)BTT(JbH23k&oL;TCE3gs`Jq3F-gAYh1SqKR@VbN)~xNHw(N9f`sWL$)*HI# zUVP-9l*4#ucGK*PA$EP&a#h-`+7Fj@nhRPkyc7O#&;HA2kHp8FUvXw}OGC%tWo7QJ UPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0lrB@K~yMHb&tJE zBS9F(-`TiHmc-p?(2E~Ya#tlWVj2q(JUG7!L9wv$AJFbjID0KU(bmpJu#KhKXoNda zL=jPo^E(7LXmri$ZpLiJcS4F=P9OL&GtWHFe82~CBi)rv&SdXY%o<*au+V^#cgYop z=r0PT$p7M{P-LjS#rKU0>WRkGZ6iG3v-6Mes;ZH}NpXwHJC3kseF5hRBPc!}S}!_IP{6aO;aHxup<8co}w z0WuO>{c(DrU6~179U+%Un$(4>Q(d#o^+n~y_7p4SW^0ote{$D!0hdYS z9-&Bqj3ioF_D*B@#{yJGB;t}CVBNUc>d)f?J@q<=q4jd1fRrR$?q;mrY1Q1DQE6tA z9|WME6)h}m;`BFSD{u*amva|SDf8CK1GPlTxcR8&bR15REMhBg3EA`KEy?fHgWXyF~_N}7NA3^7Y7n*iPb;{m8fE5%>K00000NkvXXu0mjfG1BpS literal 0 HcmV?d00001 diff --git a/Faupi-HideoutMod/Project/res/translations.json b/Faupi-HideoutMod/Project/res/translations.json new file mode 100644 index 0000000..0c42800 --- /dev/null +++ b/Faupi-HideoutMod/Project/res/translations.json @@ -0,0 +1,47 @@ +{ + "en": { + "NEEDED FOR HIDEOUT": "Needed for hideout" + }, + "cz": { + "NEEDED FOR HIDEOUT": "Potřebné pro úkryt" + }, + "pl": { + "NEEDED FOR HIDEOUT": "Potrzebne do kryjówki" + }, + "po": { + "NEEDED FOR HIDEOUT": "Necessário para esconderijo" + }, + "ch": { + "NEEDED FOR HIDEOUT": "藏身之处所需" + }, + "ru": { + "NEEDED FOR HIDEOUT": "Необходим для укрытия" + }, + "es": { + "NEEDED FOR HIDEOUT": "Se necesita para el escondite" + }, + "es-mx": { + "NEEDED FOR HIDEOUT": "Se necesita para el escondite" + }, + "ge": { + "NEEDED FOR HIDEOUT": "Benötigt für Versteck" + }, + "sk": { + "NEEDED FOR HIDEOUT": "Potrebné pre úkryt" + }, + "tu": { + "NEEDED FOR HIDEOUT": "saklanmak için gerekli" + }, + "it": { + "NEEDED FOR HIDEOUT": "Necessario per il nascondiglio" + }, + "jp": { + "NEEDED FOR HIDEOUT": "アジトに必要なもの" + }, + "fr": { + "NEEDED FOR HIDEOUT": "Nécessaire pour la cachette" + }, + "hu": { + "NEEDED FOR HIDEOUT": "Rejtekhelyhez szükséges" + } +} \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/src/client/HideoutItemViewPanel.cs b/Faupi-HideoutMod/Project/src/client/HideoutItemViewPanel.cs new file mode 100644 index 0000000..1e4007c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/client/HideoutItemViewPanel.cs @@ -0,0 +1,97 @@ +using EFT.Hideout; +using EFT.InventoryLogic; +using EFT.UI; +using EFT.UI.DragAndDrop; +using JetBrains.Annotations; +using System; +using System.Collections.Generic; +using System.Linq; +using TMPro; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace HideoutArchitect +{ + public class HideoutItemViewPanel : UIElement + { + public Image iconImage; //_questIconImage + public TextMeshProUGUI tooltipLabel; //_questItemLabel + public SimpleTooltip tooltip; //simpleTooltip_0 + public string tooltipString; //string_3 + public ItemView itemView; + + public bool initialized; + + public void Init() + { + if (initialized) return; + + HoverTrigger orAddComponent = base.gameObject.GetOrAddComponent(); + orAddComponent.OnHoverStart += this.ShowTooltip; + orAddComponent.OnHoverEnd += this.HideTooltip; + initialized = true; + } + + private void Awake() + { + Init(); + } + + public void Show(Item item, ItemView itemView, [CanBeNull] SimpleTooltip tooltip) + { + Init(); + + this.itemView = itemView; + + if (this.tooltipLabel != null) + this.tooltipLabel.gameObject.SetActive(true); + this.tooltip = tooltip; + + UpdateTooltip(); + + if (HideoutArchitect.IsNeededForHideoutUpgrades(item)) + base.ShowGameObject(); + } + + public void UpdateTooltip() + { + List parts = new List() { $"{"NEEDED FOR HIDEOUT".Localized().ToSentenceCase()}:" }; + + List areasToUpgrade = HideoutArchitect.GetApplicableUpgrades(this.itemView.Item); + if (areasToUpgrade == null || areasToUpgrade.Count < 1) return; + + areasToUpgrade.ForEach(a => + { + try + { + parts.Add($"{a.Template.Name.ToSentenceCase() /*Already localized*/}: {"LVL".Localized().ToSentenceCase()} {a.CurrentLevel + 1}"); + } + catch (Exception ex) + { + Debug.LogError(ex); + } + }); + + tooltipString = String.Join("\n", parts.Select(a => a.Trim())); + } + + private void ShowTooltip(PointerEventData arg) + { + if (!(this.tooltip == null) && !string.IsNullOrEmpty(this.tooltipString)) + { + this.tooltip.Show(this.tooltipString, null, 0f, null, true); + return; + } + } + + private void HideTooltip(PointerEventData arg) + { + if (!(this.tooltip == null) && !string.IsNullOrEmpty(this.tooltipString)) + { + this.tooltip.Close(); + return; + } + } + } +} diff --git a/Faupi-HideoutMod/Project/src/client/Main.cs b/Faupi-HideoutMod/Project/src/client/Main.cs new file mode 100644 index 0000000..2513e42 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/client/Main.cs @@ -0,0 +1,135 @@ +using Comfort.Common; +using EFT.Hideout; +using EFT.InventoryLogic; +using HideoutArchitect.Patches; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using BepInEx; +using UnityEngine; +using Hideout = GClass1588; +using Requirement = GClass1612; + +namespace HideoutArchitect +{ + [BepInPlugin("com.FAUPI.HideoutArchitect", "FAUPI-HideoutArchitect", "2.0.0")] + public class HideoutArchitect : BaseUnityPlugin + { + private void Awake() + { + _ = ModConfig; // Load the mod config + _ = Resources.LoadTexture("neededforhideout", Path.Combine(ModInfo.path, "res/icon_neededforhideout_small.png")); + Patcher.PatchAll(); + } + + private static ModConfiguration _modConfig; + public static ModConfiguration ModConfig + { + private set + { + _modConfig = value; + } + get + { + if (_modConfig == null) + _modConfig = ModConfiguration.Load(ModInfo); + return _modConfig; + } + } + + private static ModInformation _modInfo; + public static ModInformation ModInfo + { + private set + { + _modInfo = value; + } + get + { + if (_modInfo == null) + _modInfo = ModInformation.Load(); + return _modInfo; + } + } + + private static Transform _gameObjectStorage; + public static Transform GameObjectStorage + { + get + { + if (_gameObjectStorage == null) + { + GameObject storage = new GameObject("HideoutArchitect Storage"); + UnityEngine.Object.DontDestroyOnLoad(storage); + storage.SetActive(false); + _gameObjectStorage = storage.transform; + } + + return _gameObjectStorage; + } + } + + public static List GetApplicableUpgrades(Item item) + { + List areas = Singleton.Instance.AreaDatas.Where(area => + { + bool areaActive = area.Status != EAreaStatus.NotSet && area.Template.Enabled == true; + + List targetedRequirements; + switch (ModConfig.NeededForHideoutDefinition) + { + case ENeededDefinition.NextLevel: + case ENeededDefinition.NextLevelReady: + targetedRequirements = area.NextStage.Requirements.Value as List; + break; + default: + throw new NotImplementedException(Enum.GetName(typeof(ENeededDefinition), ModConfig.NeededForHideoutDefinition)); + } + + bool areaHasRequirements = targetedRequirements != null && targetedRequirements.Count > 0; + + bool itemFitsRequirements = targetedRequirements.Any(genericRequirement => + { + ItemRequirement itemRequirement = genericRequirement as ItemRequirement; + if (itemRequirement == null) return false; + return itemRequirement.TemplateId == item.TemplateId; + }); + + bool fitsSpecialFilter = false; + switch (ModConfig.NeededForHideoutDefinition) + { + case ENeededDefinition.NextLevel: + fitsSpecialFilter = true; // None, we're only getting the item req + break; + + case ENeededDefinition.NextLevelReady: + fitsSpecialFilter = targetedRequirements.All(genericRequirement => // Check if area requirement is fulfilled + { + if (genericRequirement is AreaRequirement) + { + return genericRequirement.Fulfilled; // If area requirements are fulfilled + } + else + { + return true; + } + } + ); + break; + default: + throw new NotImplementedException(Enum.GetName(typeof(ENeededDefinition), ModConfig.NeededForHideoutDefinition)); + } + return areaActive && areaHasRequirements && itemFitsRequirements && fitsSpecialFilter; + }).ToList(); + + return areas; + } + + public static bool IsNeededForHideoutUpgrades(Item item) + { + List data = GetApplicableUpgrades(item); + return data != null && data.Count > 0; + } + } +} diff --git a/Faupi-HideoutMod/Project/src/client/ModConfiguration.cs b/Faupi-HideoutMod/Project/src/client/ModConfiguration.cs new file mode 100644 index 0000000..cb49b80 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/client/ModConfiguration.cs @@ -0,0 +1,128 @@ +using Aki.Common.Utils; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using UnityEngine; + +namespace HideoutArchitect +{ + public enum ENeededDefinition + { + NextLevel, + NextLevelReady + } + public class ModConfiguration + { + private string _tooltipHeaderColor = "#56C427"; + + [JsonConverter(typeof(Utils.StringEnumCommentConverter), "\n\tNeededForHideoutDefinition - Defines the logic used to determine which items are marked. See mod page for details. \n\tOptions: \n\t\tNextLevel: Generally marks items required for the facility's next upgrade\n\t\tNextLevelReady: Marks items required for the facility's next upgrade only when its other facility pre-requisites are fulfilled. (e.g. Items for Lavatory 2 won't be marked until Water Collector 1 is finished.)")] + public ENeededDefinition NeededForHideoutDefinition = ENeededDefinition.NextLevel; + + [JsonConverter(typeof(Utils.JsonCommentConverter), "\n\tTooltipHeaderColor - Color of the tooltip 'Needed for hideout' header.")] + public string TooltipHeaderColor + { + get => _tooltipHeaderColor; + set + { + if (value.IsValidHexColor()) + _tooltipHeaderColor = value; + } + } + + public ModConfiguration() + { + } + + public static ModConfiguration Load(ModInformation ModInfo) + { + string path = VFS.Combine(ModInfo.path, "config.jsonc"); + Debug.LogError($"Loading config from '{path}'"); + + ModConfiguration ModConfig; + + string configJson = null; + try + { + if (!VFS.Exists(path)) + throw new Exception($"No config on path {path} exists!"); + + configJson = VFS.ReadTextFile(path); + ModConfig = JsonConvert.DeserializeObject(configJson); + } + catch (Exception configReadingException) + { + string loadErrorMsg = $"[{ModInfo.name}] Could not load config!"; + Debug.LogError(loadErrorMsg); + Debug.LogError(configReadingException); + + // Recreate/fill config file + JObject defaultConfig = JObject.Parse(JsonConvert.SerializeObject(new ModConfiguration())); + if (configJson != null) + { + void LogBadJsonFormatting(Exception exception = null) + { + string mergeLoadedConfigMsg = $"[{ModInfo.name}] There was a {(exception != null ? "fatal " : string.Empty)}problem with loading config as JSON, there's likely a bad typo."; + Debug.LogError(mergeLoadedConfigMsg); + Debug.LogError(exception); + Debug.LogError("Restoring config defaults completely."); + } + + if (configJson.IsValidJson()) + { + try + { + Debug.LogError($"[{ModInfo.name}] Merging existing config data with defaults."); + // If the file loaded at least partially, overwrite the defaults with it + JObject loadedConfigPart = JObject.Parse(configJson); + defaultConfig.Merge(loadedConfigPart, new JsonMergeSettings + { + // union array values together to avoid duplicates + MergeArrayHandling = MergeArrayHandling.Union + }); + } + catch (Exception mergeLoadedConfigException) + { + LogBadJsonFormatting(mergeLoadedConfigException); + } + } + else + { + LogBadJsonFormatting(); + } + } + + string fixedConfigJson = defaultConfig.ToString(); + try + { + Debug.LogError($"[{ModInfo.name}] Parsing default config to JSON\nJson: {fixedConfigJson}"); + ModConfig = JsonConvert.DeserializeObject(fixedConfigJson); + } + catch (Exception configReconstructionException) + { + string fillErrorMsg = $"[{ModInfo.name}] Could not restore config values!"; + Debug.LogError(fillErrorMsg); + Debug.LogError("Yell at Faupi with the logs."); + + throw configReconstructionException; // Throw because at this point we can't really continue + } + + string completeConfigJson = JsonConvert.SerializeObject(ModConfig, Formatting.Indented); + if (completeConfigJson != configJson) // There's a difference between the config file and actual config + { + try + { + Debug.LogError($"[{ModInfo.name}] Writing fixed config..."); + VFS.WriteTextFile(path, completeConfigJson.ToString(), false); + } + catch + { + Debug.LogError($"[{ModInfo.name}] There was a problem with writing the config."); + throw; + } + } + } + + return ModConfig; + } + } +} diff --git a/Faupi-HideoutMod/Project/src/client/ModInformation.cs b/Faupi-HideoutMod/Project/src/client/ModInformation.cs new file mode 100644 index 0000000..9042070 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/client/ModInformation.cs @@ -0,0 +1,41 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using UnityEngine.Assertions; + +namespace HideoutArchitect +{ + public class ModInformation + { + public string name; + public string author; + public string version; + public string license; + public string main; + public string path; + + public static ModInformation Load() + { + ModInformation ModInfo; + + JObject response = JObject.Parse(Aki.Common.Http.RequestHandler.GetJson($"/HideoutArchitect/GetInfo")); + try + { + Assert.IsTrue(response.Value("status") == 0); + ModInfo = response["data"].ToObject(); + } + catch (Exception getModInfoException) + { + string errMsg = $"[{typeof(HideoutArchitect)}] Package.json couldn't be found! Make sure you've installed the mod on the server as well!"; + Debug.LogError(errMsg); + throw getModInfoException; + } + + return ModInfo; + } + } +} diff --git a/Faupi-HideoutMod/Project/src/client/Patches.cs b/Faupi-HideoutMod/Project/src/client/Patches.cs new file mode 100644 index 0000000..2396714 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/client/Patches.cs @@ -0,0 +1,121 @@ +using EFT.InventoryLogic; +using EFT.UI; +using EFT.UI.DragAndDrop; +using System.Collections.Generic; +using System.Reflection; +using UnityEngine; +using Aki.Reflection.Patching; + +namespace HideoutArchitect.Patches +{ + class Patcher + { + public static void PatchAll() + { + new PatchManager().RunPatches(); + } + } + + public class PatchManager + { + public PatchManager() + { + this._patches = new List + { + new ItemViewPatches.GridItemViewUpdateInfoPatch(), + new ItemViewPatches.ItemViewInitPatch(), + new ItemViewPatches.NewGridItemViewPatch() + }; + } + + public void RunPatches() + { + foreach (ModulePatch patch in this._patches) + { + patch.Enable(); + } + } + + private readonly List _patches; + } + + public static class ItemViewPatches + { + public static Dictionary hideoutPanels = new Dictionary(); + + public static void SetHideoutItemViewPanel(this ItemView __instance) + { + if (!hideoutPanels.TryGetValue(__instance, out HideoutItemViewPanel hideoutItemViewPanel)) + return; + + ItemUiContext itemUiContext = typeof(ItemView).GetField("ItemUiContext", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(__instance) as ItemUiContext; + + if (hideoutItemViewPanel != null) + { + hideoutItemViewPanel.Show(__instance.Item, __instance, itemUiContext?.Tooltip); + return; + } + } + + public class NewGridItemViewPatch : ModulePatch + { + protected override MethodBase GetTargetMethod() + { + return typeof(GridItemView).GetMethod("NewGridItemView", BindingFlags.Instance | BindingFlags.NonPublic); + } + + [PatchPostfix] + private static void PatchPostfix(ref GridItemView __instance, Item item) + { + if (hideoutPanels.ContainsKey(__instance)) return; + try + { + QuestItemViewPanel questIconPanel = typeof(ItemView).GetField("_questsItemViewPanel", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(__instance) as QuestItemViewPanel; + HideoutItemViewPanel hideoutIconPanel = GameObject.Instantiate(Resources.GetEditOffsetWindowTemplate(questIconPanel), questIconPanel.transform.parent); + hideoutIconPanel.transform.SetAsFirstSibling(); + hideoutPanels[__instance] = hideoutIconPanel; + + hideoutIconPanel.gameObject.SetActive(true); + } + catch { + // Item doesn't have a "quest item" icon panel, so it's probably static + } + } + } + + public class ItemViewInitPatch : ModulePatch + { + protected override MethodBase GetTargetMethod() + { + return typeof(ItemView).GetMethod("Init", BindingFlags.Instance | BindingFlags.NonPublic); + } + + [PatchPostfix] + private static void PatchPostfix(ref ItemView __instance) + { + __instance.SetHideoutItemViewPanel(); + } + } + + public class GridItemViewUpdateInfoPatch : ModulePatch + { + protected override MethodBase GetTargetMethod() + { + return typeof(GridItemView).GetMethod("UpdateInfo", BindingFlags.Instance | BindingFlags.Public); + } + + [PatchPostfix] + private static void PatchPostfix(ref GridItemView __instance) + { + if (!__instance.IsSearched) + return; + + if (!hideoutPanels.TryGetValue(__instance, out HideoutItemViewPanel hideoutItemViewPanel)) + return; + hideoutItemViewPanel.iconImage.gameObject.SetActive(HideoutArchitect.IsNeededForHideoutUpgrades(__instance.Item)); + + __instance.SetHideoutItemViewPanel(); + } + } + } +} diff --git a/Faupi-HideoutMod/Project/src/client/Resources.cs b/Faupi-HideoutMod/Project/src/client/Resources.cs new file mode 100644 index 0000000..25ab9a6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/client/Resources.cs @@ -0,0 +1,81 @@ +using EFT.UI; +using EFT.UI.DragAndDrop; +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Threading.Tasks; +using TMPro; +using UnityEngine; +using UnityEngine.Networking; +using UnityEngine.UI; + +namespace HideoutArchitect +{ + public static class Resources + { + public static Dictionary iconCache = new Dictionary(); + static HideoutItemViewPanel hideoutItemViewTemplate; + + public static HideoutItemViewPanel GetEditOffsetWindowTemplate(QuestItemViewPanel original = null) + { + if (hideoutItemViewTemplate != null) + return hideoutItemViewTemplate; + + if (original == null) + throw new ArgumentNullException("original", "Can't be null if template isn't created yet!"); + + QuestItemViewPanel clone = GameObject.Instantiate(original); + GameObject newObject = clone.gameObject; + clone.transform.parent = HideoutArchitect.GameObjectStorage; + newObject.name = "HideoutItem"; + + HideoutItemViewPanel result = newObject.AddComponent(); + + //Copy fields over + result.CopyFieldsFromQuestView(clone); + + //Set custom sprite + if(result.iconImage != null) + { + result.iconImage.sprite = iconCache["neededforhideout"] ?? UnityEngine.Resources.Load("characteristics/icons/icon_info_faction"); + } + + GameObject.DestroyImmediate(clone); + + hideoutItemViewTemplate = result; + return hideoutItemViewTemplate; + } + + public static void CopyFieldsFromQuestView(this HideoutItemViewPanel hideoutItem, QuestItemViewPanel questItem) + { + hideoutItem.iconImage = typeof(QuestItemViewPanel).GetField("_questIconImage", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(questItem) as Image; + hideoutItem.tooltipLabel = typeof(QuestItemViewPanel).GetField("_questItemLabel", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(questItem) as TextMeshProUGUI; + hideoutItem.tooltip = typeof(QuestItemViewPanel).GetField("simpleTooltip_0", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(questItem) as SimpleTooltip; + hideoutItem.tooltipString = typeof(QuestItemViewPanel).GetField("string_4", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(questItem) as string; + } + + + public static async Task LoadTexture(string id, string path) + { + using (UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(path)) + { + uwr.SendWebRequest(); + + while (!uwr.isDone) + await Task.Delay(100); + + if (uwr.responseCode != 200) + { + //Logger.Error($"[{HideoutArchitect.ModInfo.name}] Request error {uwr.responseCode}: {uwr.error}"); + } + else + { + // Get downloaded asset bundle + //Logger.Info($"[{HideoutArchitect.ModInfo.name}] Retrieved texture! {id.ToString()} from {path}"); + Texture2D cachedTexture = DownloadHandlerTexture.GetContent(uwr); + iconCache.Add(id, Sprite.Create(cachedTexture, new Rect(0, 0, cachedTexture.width, cachedTexture.height), new Vector2(0, 0))); + } + } + } + } +} diff --git a/Faupi-HideoutMod/Project/src/client/Utils.cs b/Faupi-HideoutMod/Project/src/client/Utils.cs new file mode 100644 index 0000000..278d3f1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/client/Utils.cs @@ -0,0 +1,113 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Linq; +using System; +using System.Text.RegularExpressions; +using UnityEngine; + +namespace HideoutArchitect +{ + public static class Utils + { + public static string ToSentenceCase(this string text) + { + string result = text; + try + { + // start by converting entire string to lower case + var lowerCase = text.ToLower(); + // matches the first sentence of a string, as well as subsequent sentences + var r = new Regex(@"(^[a-z])|\.\s+(.)", RegexOptions.ExplicitCapture); + // MatchEvaluator delegate defines replacement of setence starts to uppercase + result = r.Replace(lowerCase, s => s.Value.ToUpper()); + } + catch (Exception ex) + { + Debug.LogError($"Error converting string case for '{text}': {ex}"); + } + + return result; + } + + public static bool IsValidHexColor(this string inputColor) + { + //Taken from https://stackoverflow.com/a/13035186 + if (Regex.Match(inputColor, "^#(?:[0-9a-fA-F]{3}){1,2}$").Success) + return true; + + var result = System.Drawing.Color.FromName(inputColor); + return result.IsKnownColor; + } + + public static bool IsValidJson(this string strInput) + { + if (string.IsNullOrWhiteSpace(strInput)) { return false; } + strInput = strInput.Trim(); + if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object + (strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array + { + try + { + var obj = JToken.Parse(strInput); + return true; + } + catch (JsonReaderException jex) + { + //Exception in parsing json + Debug.LogError(jex.Message); + return false; + } + catch (Exception ex) //some other exception + { + Debug.LogError(ex.ToString()); + return false; + } + } + else + { + return false; + } + } + + public class StringEnumCommentConverter : StringEnumConverter + { + //modification of https://stackoverflow.com/a/65001212 + private readonly string _comment; + public StringEnumCommentConverter(string comment) + { + _comment = comment; + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + base.WriteJson(writer, value, serializer); + writer.WriteComment(_comment); // append comment + } + } + + public class JsonCommentConverter : JsonConverter + { + //modification of https://stackoverflow.com/a/65001212 + private readonly string _comment; + public JsonCommentConverter(string comment) + { + _comment = comment; + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, + JsonSerializer serializer) + { + throw new NotImplementedException(); + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + writer.WriteValue(value); + writer.WriteComment(_comment); // append comment + } + + public override bool CanConvert(Type objectType) => true; + public override bool CanRead => false; + } + } +} diff --git a/Faupi-HideoutMod/Project/src/server/hideoutarchitect.js b/Faupi-HideoutMod/Project/src/server/hideoutarchitect.js new file mode 100644 index 0000000..c95bd72 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/hideoutarchitect.js @@ -0,0 +1,68 @@ +/* hideoutarchitect.js + * license: NCSA + * copyright: Faupi + * authors: + * - Faupi + */ + +"use strict"; +const path = require('path'); + +class HideoutArchitect { + constructor() { + this.mod = require("../package.json"); + this.translations = require("../res/translations.json"); + Logger.info(`Loading: ${this.mod.name} ${this.mod.version}`); + + ModLoader.onLoad[this.mod.name] = this.init.bind(this); + } + + init(){ + this.hookRoutes(); + this.loadLocalization(); + } + + loadLocalization(){ + var globalLocale = DatabaseServer.tables.locales.global; + + for(let language in this.translations){ + if(!language in globalLocale) continue; + + let attrKvPair = this.translations[language]; + for(let attrKey in attrKvPair){ + let attrValue = attrKvPair[attrKey]; + + globalLocale[language].interface[attrKey] = attrValue; + } + } + } + + log(data){ + // console.log(data); + } + + hookRoutes(){ + HttpRouter.onStaticRoute["/HideoutArchitect/GetInfo"] = { + AttachmentOffset: this.getModInfo.bind(this) + }; + } + + getModInfo(url, info, sessionID, output){ + var output = { + status: 1, + data: null + }; + + // Don't mind this pointless try catch + try{ + output.data = {...this.mod, ...{path: path.resolve(ModLoader.getModPath(this.mod.name))}}; + output.status = 0; + }catch(ex){ + throw ex; + } + + return JsonUtil.serialize(output); + } +} + +module.exports = new HideoutArchitect(); \ No newline at end of file diff --git a/Faupi-HideoutMod/README.md b/Faupi-HideoutMod/README.md new file mode 100644 index 0000000..61bf7c0 --- /dev/null +++ b/Faupi-HideoutMod/README.md @@ -0,0 +1,4 @@ +# HideoutArchitect +## Faupi-HideoutArchitect for EFT - SPT-AKI +### CURRENT AKI VERSION: 2.2.1 +### GAMEVERSION: 0.12.12.15.16584 diff --git a/Faupi-MunitionsExpert/MunitionsExpert/LICENSE b/Faupi-MunitionsExpert/MunitionsExpert/LICENSE new file mode 100644 index 0000000..1dd0454 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/LICENSE @@ -0,0 +1,32 @@ +University of Illinois/NCSA Open Source License Copyright (c) 2021 Faupi. All rights reserved. + +Developed by: + +Faupi + +https://github.com/Faupi-SPTarkov/MunitionsExpert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +with the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +* Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimers. + +* Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimers in the documentation +and/or other materials provided with the distribution. + +* Neither the names of Faupi, nor the names of its contributors may be used +to endorse or promote products derived from this Software without specific prior +written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE. diff --git a/Faupi-MunitionsExpert/MunitionsExpert/MunitionsExpert.csproj b/Faupi-MunitionsExpert/MunitionsExpert/MunitionsExpert.csproj new file mode 100644 index 0000000..fffda2b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/MunitionsExpert.csproj @@ -0,0 +1,113 @@ + + + + + Debug + AnyCPU + {C5889536-4EE7-40BC-A8FD-7F1A80C3F3E5} + Library + Properties + MunitionsExpert + Faupi-MunitionsExpert + v4.7.2 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE;/noentry + prompt + 4 + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\BepInEx\core\0Harmony.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Aki.Common.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Aki.Reflection.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Assembly-CSharp.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\BepInEx\core\BepInEx.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Comfort.dll + + + + False + ..\References\EFT-Managed\Newtonsoft.Json.dll + + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\UnityEngine.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\UnityEngine.CoreModule.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\UnityEngine.UnityWebRequestModule.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll + + + + + + + + set BuildDir=$(ProjectDir)_Build\Faupi-MunitionsExpert + +powershell -Command "Remove-Item '%25BuildDir%25\*' -Recurse -Force" + +copy "$(TargetPath)" "%25BuildDir%25\module.dll" +xcopy "$(ProjectDir)src\server" "%25BuildDir%25\src" /K /D /H /Y /I +xcopy "$(ProjectDir)res" "%25BuildDir%25\res" /K /D /H /Y /I +copy "$(ProjectDir)package.json" "%25BuildDir%25\package.json" + + \ No newline at end of file diff --git a/Faupi-MunitionsExpert/MunitionsExpert/MunitionsExpert.sln b/Faupi-MunitionsExpert/MunitionsExpert/MunitionsExpert.sln new file mode 100644 index 0000000..12be45c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/MunitionsExpert.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32014.148 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MunitionsExpert", "MunitionsExpert.csproj", "{C5889536-4EE7-40BC-A8FD-7F1A80C3F3E5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C5889536-4EE7-40BC-A8FD-7F1A80C3F3E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C5889536-4EE7-40BC-A8FD-7F1A80C3F3E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C5889536-4EE7-40BC-A8FD-7F1A80C3F3E5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C5889536-4EE7-40BC-A8FD-7F1A80C3F3E5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C4FBDDAB-36FB-44F2-8D1D-4E7AF0E20BF1} + EndGlobalSection +EndGlobal diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Properties/AssemblyInfo.cs b/Faupi-MunitionsExpert/MunitionsExpert/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..fa4904b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/Properties/AssemblyInfo.cs @@ -0,0 +1,38 @@ +using System.Resources; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("MunitionsExpert - Ammo stats in inspect view")] +[assembly: AssemblyDescription("Adds ammo stats to inspect view as well as improving the format a little")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SPT-AKI - MunitionsExpert")] +[assembly: AssemblyCopyright("Faupi © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c5889536-4ee7-40bc-a8fd-7f1a80c3f3e5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.2.1.0")] +[assembly: AssemblyFileVersion("1.2.1.0")] +[assembly: NeutralResourcesLanguage("en-US")] diff --git a/Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/bepInEx/plugins/Faupi-MunitionsExpert.dll b/Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/bepInEx/plugins/Faupi-MunitionsExpert.dll new file mode 100644 index 0000000000000000000000000000000000000000..711a299b9deba33cd5ff17b75ad23aac6eaffd24 GIT binary patch literal 14336 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 I|GNnMFBi~-&j0`b literal 0 HcmV?d00001 diff --git a/Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/LICENSE b/Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/LICENSE new file mode 100644 index 0000000..1dd0454 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/LICENSE @@ -0,0 +1,32 @@ +University of Illinois/NCSA Open Source License Copyright (c) 2021 Faupi. All rights reserved. + +Developed by: + +Faupi + +https://github.com/Faupi-SPTarkov/MunitionsExpert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +with the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +* Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimers. + +* Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimers in the documentation +and/or other materials provided with the distribution. + +* Neither the names of Faupi, nor the names of its contributors may be used +to endorse or promote products derived from this Software without specific prior +written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE. diff --git a/Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/module.dll b/Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/module.dll new file mode 100644 index 0000000000000000000000000000000000000000..c69526dc3f3c42a1c3b4f4562324c16f47ffd242 GIT binary patch literal 14336 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 O0000 60 ? colour = "red" : //SuperPen + pen > 50 ? colour = "yellow" : //HighPen + pen > 40 ? colour = "violet" : //MedHighPen + pen > 30 ? colour = "blue" : //MedPen + pen > 20 ? colour = "green" : //LowMedPen + colour = "grey" //LowPen + item._props.BackgroundColor = colour + } + } + } + } +} + +module.exports = new AmmoStats(); \ No newline at end of file diff --git a/Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/src/config.json b/Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/src/config.json new file mode 100644 index 0000000..b735cd6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/_Build/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/src/config.json @@ -0,0 +1,3 @@ +{ + "BulletBackgroundColours": true +} \ No newline at end of file diff --git a/Faupi-MunitionsExpert/MunitionsExpert/res/armorDamage.png b/Faupi-MunitionsExpert/MunitionsExpert/res/armorDamage.png new file mode 100644 index 0000000000000000000000000000000000000000..70d5e40050dba64b28cfe022f12f64f20f67ab61 GIT binary patch literal 701 zcmV;u0z&Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T1P(e{@UAPcY!Jrh^{sD32#+BU&E(Fn17gb87;KGHV3sGEZr7qf1 zY_L)h1Q!-FR?;dpwbeF_Nhg^kQw#uxw9RoehiF`G3S_V#V*Fgrg@n+74A0pFVn+&SWNO-54jwz33E)TrM|vr}x%?#%RUD z(RL`pc35%t`jyN5OZmJJ5s~kUbt@&ea=Yu=UC(vD>b-G0!Ah9|bi{}Cs_zho{TBC=gDf<|357Qsv*R$49Sj+iHCAJE~yZTxG* j0MP*>3C)aeFw6P_)~nJ5EkW<900000NkvXXu0mjfCOPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!2kdb!2!6DYwZ940&z)1K~y+Tt&?3y zQ*ju^&+P1bZql-dC|h<>(x?j~C>&3_f#%s#SfDBtO8|Va}Fcen0v11zd3juu^cEtz5wY#GB94ccEhrFpSeDhP76wv zDjA7{zq-!ae4c^ZU6#h?=J7Y9PcFDS`Y?7Gu%dh=jC!!E!ep|U_aCU+Sy@@5HyEn5 zTHPV!t9}FmTRAWk3UZtV5DEj+)Vinv0GpGd(zzMG2dF1uKeg7%bWOFRe z&Mju#-Mz1o-wpDnQdwN(6%YV^@SVA?^F2q7*3_C_jlA%uekZd#fo>U!B$=c^0U=Lpz6{?Tno%f}S(EitxIiqA+qdKTz>u@4#crJ#ADi@C?tPA2NEF3? znlP$C`QW{WuKEV6b^7zv#~ydbedOjrSd`1NCNN{A`6EvinkXQRO0AL4&P=~+Z?k)l zn*&^@psrN^3sEo_%3=s{P-H~0l}(@u90t{3JK(+915Sa?bM2kC5Dx<0ufN_M9%pVh z7kL%11)fy?KnGaGPr!SV1X)QYj5Lzk<8Bd30eD(B0Ge_K`IB5bg761_I=S8<$tpMi O0000 __result) + { + if (!__result.Any((ItemAttributes a) => (Attributes.ENewItemAttributeId)a.Id == Attributes.ENewItemAttributeId.Damage)) + { + //MunitionsExpert.FormatExistingAttributes(ref __result, __instance); + MunitionsExpert.AddNewAttributes(ref __result, __instance); + } + } + } +} \ No newline at end of file diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/client/ModInformation.cs b/Faupi-MunitionsExpert/MunitionsExpert/src/client/ModInformation.cs new file mode 100644 index 0000000..c390b67 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/client/ModInformation.cs @@ -0,0 +1,38 @@ +using Aki.Common.Http; +using Newtonsoft.Json.Linq; +using System; +using UnityEngine; +using UnityEngine.Assertions; + +namespace MunitionsExpert +{ + public class ModInformation + { + public string name; + public string author; + public string version; + public string license; + public string main; + public string path; + + public static ModInformation Load() + { + ModInformation ModInfo; + + JObject response = JObject.Parse(RequestHandler.GetJson($"/MunitionsExpert/GetInfo")); + try + { + Assert.IsTrue(response.Value("status") == 0); + ModInfo = response["data"].ToObject(); + } + catch (Exception getModInfoException) + { + string errMsg = $"[{typeof(MunitionsExpert)}] Package.json couldn't be found! Make sure you've installed the mod on the server as well!"; + Debug.LogError(errMsg); + throw getModInfoException; + } + + return ModInfo; + } + } +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/client/MunitionsExpert.cs b/Faupi-MunitionsExpert/MunitionsExpert/src/client/MunitionsExpert.cs new file mode 100644 index 0000000..71407d3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/client/MunitionsExpert.cs @@ -0,0 +1,166 @@ +using System; +using System.IO; +using System.Collections.Generic; +using UnityEngine; +using EFT.InventoryLogic; +using UnityEngine.Networking; +using System.Threading.Tasks; +using BepInEx; +using Comfort.Common; + +using ItemAttribute = GClass2090; +using ItemAttributeCharacteristic = BulletClass; // left in as commented code uses this class +using static MunitionsExpert.Attributes; +using ServerSettings = GClass1103; + + +namespace MunitionsExpert +{ + [BepInPlugin("com.FAUPI.MunitionsExpert", "FAUPI-MunitionsExpert", "1.4.0")] + public class MunitionsExpert : BaseUnityPlugin + { + private void Awake() + { + new CachedAttributesPatch().Enable(); + new StaticIconsPatch().Enable(); + CacheIcons(); + } + + private static ModInformation _modInfo; + public static ModInformation ModInfo + { + private set + { + _modInfo = value; + } + get + { + if (_modInfo == null) + _modInfo = ModInformation.Load(); + return _modInfo; + } + } + + public static Dictionary iconCache = new Dictionary(); + public static List penAttributes = new List(); // For refreshing armor class rating + public static string modName = ModInfo.name; + + public static void CacheIcons() + { + iconCache.Add(ENewItemAttributeId.Damage, Resources.Load("characteristics/icons/icon_info_damage")); + iconCache.Add(ENewItemAttributeId.FragmentationChance, Resources.Load("characteristics/icons/icon_info_shrapnelcount")); + iconCache.Add(EItemAttributeId.LightBleedingDelta, Resources.Load("characteristics/icons/icon_info_bloodloss")); + iconCache.Add(EItemAttributeId.HeavyBleedingDelta, Resources.Load("characteristics/icon_info_hydration")); + iconCache.Add(ENewItemAttributeId.Penetration, Resources.Load("characteristics/icon_info_penetration")); + _ = LoadTexture(ENewItemAttributeId.ArmorDamage, Path.Combine(ModInfo.path, "res/armorDamage.png")); + _ = LoadTexture(ENewItemAttributeId.RicochetChance, Path.Combine(ModInfo.path, "res/ricochet.png")); + } + + public static async Task LoadTexture(Enum id, string path) + { + using (UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(path)) + { + uwr.SendWebRequest(); + + while (!uwr.isDone) + await Task.Delay(5); + + if (uwr.responseCode != 200) + { + //Log.Error($"[{modName}] Request error {uwr.responseCode}: {uwr.error}"); + } + else + { + // Get downloaded asset bundle + //Log.Info($"[{modName}] Retrieved texture! {id.ToString()} from {path}"); + Texture2D cachedTexture = DownloadHandlerTexture.GetContent(uwr); + iconCache.Add(id, Sprite.Create(cachedTexture, new Rect(0, 0, cachedTexture.width, cachedTexture.height), new Vector2(0, 0))); + } + } + } + + public static void AddNewAttributes(ref List attributes, AmmoTemplate template) + { + int projCount = template.ProjectileCount; + int totalDamage = template.Damage * template.ProjectileCount; + + string damageStr = totalDamage.ToString(); // Total damage + if (template.ProjectileCount > 1) + { + damageStr += $" ({template.Damage} x {template.ProjectileCount})"; // Add the "damage calculation" after total damage (damage per pellet * pellet count) + } + + ItemAttribute at_damage = new ItemAttribute(ENewItemAttributeId.Damage) + { + Name = ENewItemAttributeId.Damage.GetName(), + Base = () => totalDamage, + StringValue = () => damageStr, + DisplayType = () => EItemAttributeDisplayType.Compact + }; + attributes.Add(at_damage); + + if (template.ArmorDamage > 0) + { + ItemAttribute at_armordmg = new ItemAttribute(ENewItemAttributeId.ArmorDamage) + { + Name = ENewItemAttributeId.ArmorDamage.GetName(), + Base = () => template.ArmorDamage, + StringValue = () => $"{(template.ArmorDamage).ToString()}%", + DisplayType = () => EItemAttributeDisplayType.Compact + }; + attributes.Add(at_armordmg); + } + + if (template.PenetrationPower > 0) + { + string getStringValue() + { + int ratedClass = 0; + + if (!Singleton.Instantiated) { return $"CLASS_DATA_MISSING {template.PenetrationPower.ToString()}"; } + ServerSettings.GClass1148.GClass1149[] classes = Singleton.Instance.Armor.ArmorClass; + for (int i = 0; i < classes.Length; i++) + { + if (classes[i].Resistance > template.PenetrationPower) continue; + ratedClass = Math.Max(ratedClass, i); + } + + return $"{(ratedClass > 0 ? $"{"ME_class".Localized()} {ratedClass}" : "ME_noarmor".Localized())} ({template.PenetrationPower.ToString()})"; + } + + ItemAttribute at_pen = new ItemAttribute(ENewItemAttributeId.Penetration) + { + Name = ENewItemAttributeId.Penetration.GetName(), + Base = () => template.PenetrationPower, + StringValue = getStringValue, + DisplayType = () => EItemAttributeDisplayType.Compact + }; + attributes.Add(at_pen); + } + + if (template.FragmentationChance > 0) + { + ItemAttribute at_frag = new ItemAttribute(ENewItemAttributeId.FragmentationChance) + { + Name = ENewItemAttributeId.FragmentationChance.GetName(), + Base = () => template.FragmentationChance, + StringValue = () => $"{(template.FragmentationChance * 100).ToString()}%", + DisplayType = () => EItemAttributeDisplayType.Compact + }; + attributes.Add(at_frag); + } + + if (template.RicochetChance > 0) + { + ItemAttribute at_ricochet = new ItemAttribute(ENewItemAttributeId.RicochetChance) + { + Name = ENewItemAttributeId.RicochetChance.GetName(), + Base = () => template.RicochetChance, + StringValue = () => $"{(template.RicochetChance * 100).ToString()}%", + DisplayType = () => EItemAttributeDisplayType.Compact + }; + attributes.Add(at_ricochet); + } + } + } +} \ No newline at end of file diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/client/StaticIconsPatch.cs b/Faupi-MunitionsExpert/MunitionsExpert/src/client/StaticIconsPatch.cs new file mode 100644 index 0000000..3ab4d5e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/client/StaticIconsPatch.cs @@ -0,0 +1,35 @@ +using System; +using System.Reflection; +using Aki.Reflection.Patching; +using EFT.UI; +using UnityEngine; + +namespace MunitionsExpert +{ + internal class StaticIconsPatch : ModulePatch + { + protected override MethodBase GetTargetMethod() + { + return typeof(StaticIcons).GetMethod("GetAttributeIcon", BindingFlags.Instance | BindingFlags.Public); + } + + [PatchPrefix] + private static bool PatchPrefix(ref Sprite __result, Enum id) + { + if (id == null || !MunitionsExpert.iconCache.ContainsKey(id)) + { + return true; + } + + Sprite sprite = MunitionsExpert.iconCache[id]; + + if (sprite != null) + { + __result = sprite; + return false; + } + + return true; + } + } +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/ammostats.js b/Faupi-MunitionsExpert/MunitionsExpert/src/server/ammostats.js new file mode 100644 index 0000000..f575caf --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/ammostats.js @@ -0,0 +1,64 @@ +/* ammostats.js + * license: NCSA + * copyright: Faupi + * authors: + * - Faupi + */ + +"use strict"; +const path = require('path'); + +class AmmoStats { + constructor() { + this.mod = require("../package.json"); + this.translations = require("../res/translations.json"); + Logger.info(`Loading: ${this.mod.name} ${this.mod.version}`); + + ModLoader.onLoad[this.mod.name] = this.init.bind(this); + } + + init(){ + this.hookRoutes(); + this.updateLocalization(); + } + + updateLocalization(){ + var globalLocale = DatabaseServer.tables.locales.global; + + for(let language in this.translations){ + if(!language in globalLocale) continue; + + let attrKvPair = this.translations[language]; + for(let attrKey in attrKvPair){ + let attrValue = attrKvPair[attrKey]; + + globalLocale[language].interface[attrKey] = attrValue; + } + } + } + + hookRoutes(){ + HttpRouter.onStaticRoute["/MunitionsExpert/GetInfo"] = { + MunitionsExpert: this.getModInfo.bind(this) + }; + } + + getModInfo(url, info, sessionID, output){ + var output = { + status: 1, + data: null + }; + + // Don't mind this pointless try catch + try{ + output.data = {...this.mod, ...{path: path.resolve(ModLoader.getModPath(this.mod.name))}}; + output.status = 0; + }catch(ex){ + throw ex; + } + + return JsonUtil.serialize(output); + } +} + +module.exports = new AmmoStats(); \ No newline at end of file diff --git a/Faupi-MunitionsExpert/README.md b/Faupi-MunitionsExpert/README.md new file mode 100644 index 0000000..4c8a3f1 --- /dev/null +++ b/Faupi-MunitionsExpert/README.md @@ -0,0 +1,4 @@ +# Faupi-MunitionsExpert +## Faupi-MunitionsExpert for EFT - SPT-AKI +### CURRENT AKI VERSION: 2.3.0 +### GAMEVERSION: 0.12.12.15.17107 diff --git a/KcY-SeeItemValue/KcY-SeeItemValue 1.2.1/bepInEx/plugins/KcY-SeeItemValue.dll b/KcY-SeeItemValue/KcY-SeeItemValue 1.2.1/bepInEx/plugins/KcY-SeeItemValue.dll new file mode 100644 index 0000000000000000000000000000000000000000..9cf09716878be2b2add80662627b420422a22b59 GIT binary patch literal 7168 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 UrxSXqC29W-jOzD8_$?#w8{=5wzyJUM literal 0 HcmV?d00001 diff --git a/KcY-SeeItemValue/itemValue/_built/package.json b/KcY-SeeItemValue/itemValue/_built/package.json new file mode 100644 index 0000000..92c6454 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/_built/package.json @@ -0,0 +1,10 @@ +{ + "name": "SeeItemValue", + "author": "KcY", + "version": "1.1.0", + "license": "NCSA Open Source", + "main": "modloader.js", + "akiVersion": "2.2.1", + "UpdatedBy": "CWX" +} + diff --git a/KcY-SeeItemValue/itemValue/_built/src/config.json b/KcY-SeeItemValue/itemValue/_built/src/config.json new file mode 100644 index 0000000..7f116ec --- /dev/null +++ b/KcY-SeeItemValue/itemValue/_built/src/config.json @@ -0,0 +1,4 @@ +{ + "TraderPrice": false, + "TraderMultiplier": 0.54 +} \ No newline at end of file diff --git a/KcY-SeeItemValue/itemValue/_built/src/mod.js b/KcY-SeeItemValue/itemValue/_built/src/mod.js new file mode 100644 index 0000000..635551a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/_built/src/mod.js @@ -0,0 +1,123 @@ +"use strict"; + +const cfg = require("./config.json"); +const database = DatabaseServer.tables; +const livePrice = database.templates.prices; +const handbookTable = database.templates.handbook; +const therapist = DatabaseServer.tables.traders["54cb57776803fa99248b456e"].base +const ragman = DatabaseServer.tables.traders["5ac3b934156ae10c4430e83c"].base +const jaeger = DatabaseServer.tables.traders["5c0647fdd443bc2504c2d371"].base +const mechanic = DatabaseServer.tables.traders["5a7c2eca46aef81a7ca2145d"].base +const prapor = DatabaseServer.tables.traders["54cb50c76803fa8b248b4571"].base +const peacekeeper = DatabaseServer.tables.traders["5935c25fb3acc3127c3d8cd9"].base +const skier = DatabaseServer.tables.traders["58330581ace78e27b8b10cee"].base +const fence = DatabaseServer.tables.traders["579dc571d53a0658a154fbec"].base +const tradersArr = [therapist, ragman, jaeger, mechanic, prapor, peacekeeper, skier, fence]; + +class Mod +{ + name = "KcY-SeeItemValue"; + version = "1.1.0"; + static price = ""; + + constructor() + { + Logger.info(`Loading: ${this.name} : ${this.version}`); + ModLoader.onLoad[this.name] = this.init.bind(this); + } + + init() + { + this.onLoadMod(); + } + + onLoadMod() + { + HttpRouter.onDynamicRoute["/cwx/itemvaluemod/"] = { + ItemValueMod: this.onRequestConfig.bind(this) + }; + } + + onRequestConfig(url, info, sessionID) + { + const splittedUrl = url.split("/"); + const id = splittedUrl[splittedUrl.length - 1].toLowerCase(); + + return HttpResponse.noBody(this.getIdPrice(id)); + } + + getIdPrice(id) + { + let sPrice = 1; + let sMutli = 1; + let parentId = ""; + + // if TraderPrice in cfg is False get price from flea AVG + if(cfg.TraderPrice === false) + { + const result = livePrice[id]; + if(typeof result != `undefined`) + { + return result; + } + // will still default to Handbook if no price is found for flea AVG + } + // if TraderPrice in cfg is True get price from handbook + // as traders have a modifier, avg is 0.54, closest we can get without checking against each trader + // thanks to TEOA for this info + for(let i in handbookTable.Items) + { + if(handbookTable.Items[i].Id === id) + { + parentId = handbookTable.Items[i].ParentId; + sMutli = this.getBestTraderMulti(parentId); + sPrice = handbookTable.Items[i].Price; + let result = parseInt(sPrice*sMutli); + + return result; + } + } + return sPrice; + } + + getBestTraderMulti(parentId) + { + let traderSellCat = ""; + let traderMulti = 0.54; + let traderName = ""; // could be used later to be passed back to module to show trader and price + let altTraderSellCat = ""; + + for(let i in handbookTable.Categories) + { + if(handbookTable.Categories[i].Id === parentId) + { + traderSellCat = handbookTable.Categories[i].Id; + altTraderSellCat = handbookTable.Categories[i].ParentId; + break; + } + } + + for(let iter = 0; iter < 8; iter++) + { + if(tradersArr[iter].sell_category.includes(traderSellCat)) + { + traderMulti = (100 - tradersArr[iter].loyaltyLevels[0].buy_price_coef) / 100; + traderName = tradersArr[iter].nickname; + return traderMulti; + } + } + + for(let iter = 0; iter < 8; iter++) + { + if(tradersArr[iter].sell_category.includes(altTraderSellCat)) + { + traderMulti = (100 - tradersArr[iter].loyaltyLevels[0].buy_price_coef) / 100; + traderName = tradersArr[iter].nickname; + return traderMulti; + } + } + return cfg.TraderMultiplier; + } +} + +module.exports.Mod = Mod; \ No newline at end of file diff --git a/KcY-SeeItemValue/itemValue/itemGetter.cs b/KcY-SeeItemValue/itemValue/itemGetter.cs new file mode 100644 index 0000000..0f1ae7d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/itemGetter.cs @@ -0,0 +1,7 @@ +//namespace itemValueMod +//{ +// public struct itemGetter +// { +// public double sPrice { get; set; } +// } +//} diff --git a/KcY-SeeItemValue/itemValue/itemValue.sln b/KcY-SeeItemValue/itemValue/itemValue.sln new file mode 100644 index 0000000..06caaa5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/itemValue.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32014.148 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "itemValueMod", "itemValueMod.csproj", "{F237CF5E-96D2-41B7-94C4-6990890886C3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F237CF5E-96D2-41B7-94C4-6990890886C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F237CF5E-96D2-41B7-94C4-6990890886C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F237CF5E-96D2-41B7-94C4-6990890886C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F237CF5E-96D2-41B7-94C4-6990890886C3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E5B08F5A-DDB9-426E-B149-18108C64B406} + EndGlobalSection +EndGlobal diff --git a/KcY-SeeItemValue/itemValue/itemValueMod.cs b/KcY-SeeItemValue/itemValue/itemValueMod.cs new file mode 100644 index 0000000..da53e83 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/itemValueMod.cs @@ -0,0 +1,78 @@ +/* Original Author: KyC + * CWX - updated to work for 2.3.0 AKI + * Client version: 0.12.12.15.17107 + * - removed the need for KyC's ModLoader + * - Commented out the code for stackCount total worth + * - Commented out the code for weapon parts total worth + * - Commented out the code for container total worth + * - Commented out the code for magazine total worth + */ + +using Aki.Common.Http; +using Aki.Common.Utils; +using EFT.InventoryLogic; +using System; +using System.Collections.Generic; +using ItemAttribute = GClass2090; + +namespace itemValueMod +{ + public class ItemValue + { + public static void AddItemValue(ref T __instance, string id, ItemTemplate template) where T : Item + { + // Remove item if it has no value + // if (Math.Round(__instance.Value()) == 0) return; + + // Make a copy of the existing attributes list, this is needed for inherited types of Item that use a global attributes list (ammo) + var atts = new List(); + atts.AddRange(__instance.Attributes); + __instance.Attributes = atts; + ItemAttribute attr = new ItemAttribute(EItemAttributeId.MoneySum) + { + StringValue = new Func(__instance.ValueStr), // ₽ + Name = "RUB ₽", //new Func(ValueExtension.ValueTrName).ToString(), + DisplayType = new Func(() => EItemAttributeDisplayType.Compact) + }; + __instance.Attributes.Add(attr); + } + } + + public static class ValueExtension + { + public static double Value(this Item item) + { + var template = item.Template; + string itemId = template._id; + double _price; + var json = RequestHandler.GetJson($"/cwx/seeitemvalue/{itemId}"); // CWX - sends ID to server + _price = Json.Deserialize(json); + + var medKit = item.GetItemComponent(); + if (medKit != null) + { + _price *= medKit.HpResource / medKit.MaxHpResource; + } + + var repair = item.GetItemComponent(); + if (repair != null) + { + _price *= repair.Durability / repair.MaxDurability; + } + + var dogtag = item.GetItemComponent(); + if (dogtag != null) + { + _price *= dogtag.Level; + } + + //_price *= item.StackObjectsCount; + + return _price; + } + public static string ValueStr(this Item item) + { + return Math.Round(item.Value()).ToString(); + } + } +} \ No newline at end of file diff --git a/KcY-SeeItemValue/itemValue/itemValueMod.csproj b/KcY-SeeItemValue/itemValue/itemValueMod.csproj new file mode 100644 index 0000000..2776470 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/itemValueMod.csproj @@ -0,0 +1,42 @@ + + + + net472 + 1.2.0 + KcY-SeeItemValue + + + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\BepInEx\core\0Harmony.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Aki.Common.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Aki.Reflection.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Assembly-CSharp.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\BepInEx\core\BepInEx.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Comfort.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\ItemComponent.Types.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\Newtonsoft.Json.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\UnityEngine.dll + + + ..\..\..\..\..\..\..\AKI PROJECT\AKI 2.3.0 17107 Bepin\EscapeFromTarkov_Data\Managed\UnityEngine.CoreModule.dll + + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..a2fa233 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# All in One Mods I Maintain +## currently for EFT - SPT-AKI. - 2.3.1 + +### Mods +- Faupi-HideoutArchitect +- Faupi-MunitionsExpert +- KcY-SeeItemValue \ No newline at end of file