From 70ba3935b1f28c11ea895f24aec0808fcb32c585 Mon Sep 17 00:00:00 2001 From: Pao Date: Sat, 4 Feb 2023 03:00:56 +0100 Subject: [PATCH 01/22] stuff --- python_helpers/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_helpers/main.py b/python_helpers/main.py index 5360261..1ea0261 100644 --- a/python_helpers/main.py +++ b/python_helpers/main.py @@ -93,7 +93,7 @@ def generate_item(item_name, weight, item_type, display_category, display_name, -#generate_clothing_item() +generate_clothing_item() recipe_name = "Test Recipe" From 29d1d144743260b8a6cd208b4513370654b689dc Mon Sep 17 00:00:00 2001 From: Pao Date: Sat, 4 Feb 2023 04:43:12 +0100 Subject: [PATCH 02/22] Added psd with concepts for modular prosthetics --- changelog.txt | 3 +++ models_stuff/Modular_prost.psd | Bin 1303804 -> 1391402 bytes 2 files changed, 3 insertions(+) diff --git a/changelog.txt b/changelog.txt index 2c4d610..e613ae7 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +0.9.15 +- Hotfix to sound not stopping when performing an amputation on another player + 0.9.14 - Optimizations - New icon for the mod diff --git a/models_stuff/Modular_prost.psd b/models_stuff/Modular_prost.psd index d0d97c33075b6b909a61e980990db343a1d0f56e..10abaffbd12b0402e35209dacdc10cb8d08847ac 100644 GIT binary patch delta 106946 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

G3&L4za@FTi05etsJJ+9dgqnnMy^WwUWgqZUct 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%0AFRX~(c^HlsX7XBfq0sS>>y{WeSadyCOR z))r(rJIm;6S=%;S$p$hSo$ZXKgx5A-FLXN zQ|2jrS35g1rL1)qr%Z|XdUsK>M_BeU%cikxRTp>`{))RG0)cL^%+*!ZHiXgBj3zKz z#;CBXQ)Xa%wOy6Je}RI@B5M_qZB9OdtU9Odr?MpGEA$WbvLV04+aiQQG%o{S!0G^V>MJDp|UGAdzo zy}N3))E){A>7hK2X4(5aRLqNesC!hv+FC}*J<*#)+YjuiO8j?E70Xzb&F`t|*uv;E zqX?r8y_A=Gd#Mu7Fq**HrHl$#dy!E>Z`C`y^;TX+_Eu5-m1R@eZh3E2Zy{@IS(|vf zD%<0B%ZGb&*_Kg%)(C@;SlfU6Ymx4#TfW9QTXXlEf?!?IE;A!GrT zbr`7LNB1*&d7$$0DWlD-J;SoNL8{(vgU~L*^GKHcjnT)0a4&^+HOq>*#5LBo8LYhY z9jr<`#^@icoyBPVU=_hJmiZaE?o$2+-KFgQ!02s8U)-hME<3qI4Qp*fl$S1y?jNH3 zy}+_5j8?F=h-Ft8wH~Vc-9A)#d5qD&SUa0#xkFWaCs`I^lrc delta 62182 zcmeIyziU-z90%Zga&C-9y{V0Z2r&+Js#kA9a%~mr4%v#%ysNf&>BWXKStDp=N6^?kPVj|EHbdb?1TZp~>3nY4OU2@9J4OygE3O z^~SM7FZ1pBa;a3xQtlVYmP*;~RP*2C@uP1#vdM5|WZT_iz4@CgD)^k}=@ z-4YI;><`-}_r;&i^c0r{^vBBdNHIQaA8_r$ z`C|N~Juc5o72~Toaq&#MhELO-sZbri9p)N0RvtbKteg>sXZK~@@p4+*7grAM50&Y` zY8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e& zNJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8 zAqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dY zgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo z5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjT zNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFACz$M^S8Z6zF&O& NWb=#8|8uS9?*V;He+vKr From fed1f55d44339ac15cf0f375c83fa8352b47481c Mon Sep 17 00:00:00 2001 From: Pao Date: Sun, 5 Feb 2023 03:46:23 +0100 Subject: [PATCH 03/22] Some stuff for the python generator --- python_helpers/main.py | 19 ++++++++++++------- python_helpers/modules_prost.xlsx | Bin 0 -> 27540 bytes 2 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 python_helpers/modules_prost.xlsx diff --git a/python_helpers/main.py b/python_helpers/main.py index 1ea0261..6fa7014 100644 --- a/python_helpers/main.py +++ b/python_helpers/main.py @@ -1,19 +1,23 @@ import lxml.etree as gfg -def generate_clothing_item(): +def generate_clothing_item(model, texture_choices, guid = None): root = gfg.Element("clothingItem") m_MaleModel = gfg.Element("m_MaleModel") - m_MaleModel.text = "TEST TEXT FROM SOMETHING" + m_MaleModel.text = f"{model}_Male" root.append(m_MaleModel) m_FemaleModel = gfg.Element("m_FemaleModel") - m_FemaleModel.text = "TEST TEXT FROM SOMETHING FEMALE" + m_FemaleModel.text = f"{model}_Female" root.append(m_FemaleModel) m_GUID = gfg.Element("m_GUID") - m_GUID.text = "get guid" + if guid: + m_GUID.text = guid + else: + m_GUID.text = "get guid from func" + root.append(m_GUID) m_Static = gfg.Element("m_Static") @@ -23,10 +27,10 @@ def generate_clothing_item(): m_AllowRandomTint.text = "false" # TODO Defined by the amount of textures that we're gonna pass - for x in range(2): + for tex in texture_choices: textureChoices = gfg.Element("textureChoices") - textureChoices.text = "Texture path" + textureChoices.text = tex tree = gfg.ElementTree(root) @@ -93,8 +97,9 @@ def generate_item(item_name, weight, item_type, display_category, display_name, -generate_clothing_item() +#generate_clothing_item() +# TODO we should get this stuff from a csv\xlsx and generate the correct values from that recipe_name = "Test Recipe" recipe_items = ["Ass", "Penis", "Shit=3"] diff --git a/python_helpers/modules_prost.xlsx b/python_helpers/modules_prost.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..deff80fa41e545c80ef47be3a94fc0e8795dc0fb GIT binary patch literal 27540 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 z zIb%4WV%&tsa-WU!hjLjAzn91d8AU=|*4{VWFL`M;-iscEu`Xqn5~u2Qy)!}Y1}s>W zn-$BL;pFZn8k=tosQ&jhwGbyIE-$xJe<7)jwk}{mtGRf zHvg3$w1oW7{`4cNZg^$wbclHjcEsyW~VdPGhs(x8ddkoRq&B(y6swOBL zUMm=!cKA9MEH3$|9j=^&@3{v4a(M7s7Ir_VLoRIzfSb3Th|b699BABy`Iwx> z)+$+C6qNk}qTpEE{qWDRp9wfEGgqF=0U{<$h&XRVh-3_@@D7;Lp($TvReVf9wd<<+ zuu@%GbMSl{BAgXXV1qD2i)r@Mq>Rms?|s^to2#k#+3(VBdD@@mc!Q~^O1Ln=Z3YAf@pJ8J`nq3-Q9vi zbw+sT^n0x1UyP>TBYPLvH?EHUor@U%>Gy5?HSrPj&%_5V%poh3I-*ZOQd6f{6a4ls z@d_;L6%$tZ1=niA6{EHLybD}*qb_zw6E$ue&&v+E!ZZ}jYcvQpC8j!KgB-u=DQ2l( z`LKvTcNC^!GE2bV&tmXZg3sBUts18>*)SNXwN+WcSCKnofl(i&$&_UyKT02~@K8u9 zdE_iSE?*&pZDdmcO#A9=zqttc!5T-8=*$0tjj&~s?Q`Dd)Kl6cNv!*uyOmu^f5hHB=)mK zvd~?ZVH_H3^J}4H)bLTjjXs0hft*~}O&N)@lQnf2du;FDzp$#$&;YkKQ(KV{!S1|9 zcx~YAmv7JkouOhzRba9zv0r_?#@MVsynsQC4C$B^$K}&u_B8c+VVip6Eo6xNNm1YH zd!nS3(f8}X0ArKYM^c7ZbPlsnLJ!N?Us7)ti35CJJx$)kuDgzl`RECdPcNbyMr;}; z4q6tK$9xqxz}}1nF08y0Z}RPvVRdxY$OEvQW$-IZ0inBQMU>jB@s~#lfl$>y2hX5t z!nwGZKxen#a78?pB+zu+y_a{oZ4#9+y$QR39}F(Ih_)zdU^iv8wp`2}&SJ8jCufm+ zd(ftw5>`ds@T&0rM#q09D5k<7bpqcjf&b1&On>7>N!m7(4yEIJ_@A$f(+fkb9tykH zzdR`&Fa2JNU9V21R@yq@vh38i+K+gR*wf6jKIh?ZA_Mc~_LRWm%Fnz%X`J5;5g=wn zq)}`0XnX9ZABNkY!pf|Ucya&{`!=SE?nEBBpNGZXu=CTE5B7LzAwNvj-i!eybN zhTK`z>n3Y}NdvRzV8!tVIfR0)98Ir(4cf%kFNm`4C}68ZjFJP_j-y95LqJ)kvyDzA z4}+wDfJZniZa@5cY`b3U%E;66AmBUYrJLZ+9gM*)6L_!qLy(|PWGe4LhYq*12A5P1 zZkeGR;)okc=%!c{dC)xwV+2uQ82hB(KWNUBXX*b%ZBHQimOmmDF{KSB`O0MCL*et5C^qLQ3{>b zkRzWHW0JT=P?vKGqX*ek6ain$U?WYwx-^GwDoBiwS`s&Lo7!>ym76O@!%$j}WLi+;=2Xuampu!w^W(~-Q zVp<~;Z;+wF9ERY|y!g-^Ihhmj3S!3#B5%cXe@Gm#>sn5E1>LAm`3 zpE91VE`6f(WISCE_;3VP{2xR6Il`?r0*qMZfyq_P8{=R$W}M=1VQK~+0my|D2X7eS zBdI({D~vyQ5k|(R>>(_Ef(O6%fDX+KU10<3X-3?OmD=CBweH6=hYQQF7Y86q{HeLA$!yyL>mndl$1LTO7@4t7J|p4AlV& z1c%yamC9DIeP#(tZ`VMWN2mpr?$5ZeZGLytzZ%P396f=?0V->O0|}}aL=EQ-WJ|fYtO{0be&V-W}>cLAwP-|FXRt1Ju&(bY=dv@@JID=Pzs4*?bWRpdJt%?H&sP6KP+4=W4c8P&R z#@Mk)ebF+sJ4944)*lZG{B7pDcqY*q>7m1aFSL+m+vxl+ki+s1awfiAElSW+(ktAs zCpg_9EfnSrRTR@jUK-C|3ATlm5hr6ec^pd>$|T^<%!C9jVfX5GPj?S_D49TN*ob`MH1G z6-$e!`5JgdM^{lf^FipUbWvvz21@#Bxs-nTsKxT?AkK&{yuXNs^@=@7G)LKcyWlgU zPvR2hjzWNi-(dE4>ZJS(3kbD*B2!-)6A&7ev{n48gkv3Po1xEr6kyN*J{auemKFXqliAy?zsB zMA!h9$K7V4wK!&#hOJErp%c}I+AHCwFY_m+7^AXdR9I!tF?u39Z(vc)LbSljJmQHo zoHF>H(52{OuQ;2JIr~A;hoW1%&|9_Dk%+w1$;hXBzMP6&Je8NyOw67YL2K2_$|7rx zY>_&9c)p&vpyf#jUq~UFzbtkE?{>n)s$IS*J@oqT$XN+f{=od^9EgASwXFXQIdgv@ zN326|zZ3h&bhf~PLn0%v6ofjpP9%H4{HFou@}v~iK)Yi?Vw!*{;Q6`b#-3xhA+2pp zo-|Pq8}xntFA2ydHKn_ z*U4*hB|$jyKbt&D@3$$1MK5riuO;70ss});8yL!J84(qU8T-Q%D> z6{$QHfpj~-7V$z)g?THwO~vH{N7@GTGl|)#JAsBW`ugROOfoViR-eRgf!X7sQZM0l zpMNNAG$RBnI?grT-`^w=O{AlA-l4fdIt+HW6vMrCKS<@c08@}tNowASb8q0!BX~8<)wFgCX@|3M+~9a*z@}LdEaV z#r(*u48ZVoj2F_$M%Q5hN9o+B8)9OP%^a>M^-I$^q++)`y8ysulb5_RWITs>-B>s4 z>t>2eV58pM21}?5wM*qgQBMPBi-;(>k7sxiybXao&XKb6Fic9lPj9`Bkf+*czU54DG8&UI=t(FihP`QileF{7YnJhhN-k)q{IGT~a;v$qYK?uxOk#A`%r?-9x$22?ySr|;(T zqIQaeMmUR(am|a&toy52nHwMD^fH`ttP(CF{jfujPoK$XB-$iQTo z*FDkGeNCqP7)|%e`G+}dVbh0h$n@r}X zeY^=5`{{`L>RwA|{`>SqcIsta>30Hh{QW`rClN8!w=xto(>J&Iiy)+;`Jwv$NAGK2 zvMa0ARod~j6P2#65yTD%m|ci4sa8D@&o`b|clXE7<8o7(U)yU>+qwyPtRJ!Ir--2uuXmc zIex*bQ2LkA*QC!FX`OcVr3ti`ZQb6vsEhDr#yO|67m+KaGaL3OPy8A3O9*-I8{p|P zxUA?ij@`jmu~kg@)C&40?zN{_nSPfi7dBK2(mDFP-pJ6rw`9~;!oy7~;I5%VHaPVc z48)`P4v8%d#aZ&=N|EDilmFXQgW3I&DTn41>7ETWm1((p5Q~gSp&J8Ux9Iz&Uj|^d zt=yDOlgPwYJ%3F`3S-}!6L<229rJ{1XI_wEQFF3;0X-uuF+O#`(E% z#=IBE{E+;t7KTO+7<6?A7L5Ayz!EHvY}t_b1Me zVzT4Y>9UEf18bJEJOZp_4Hn?(?7st%thIrGx7@l#UlvI!@utDg_~c24*sW8yJ+MQo z+`C~>;P3BMx4C!A`r2V@M$K=1_D)D_i(g>u zHbgOXf8C+66+P$t*djiOabx7`L~b}pW>ER%5tdl~ehD;2{*WDC24XU>Pp`%fsESYi zmfgX)!dBybcnSB8KYc5_O@7mPq>h=H*!xb`f>ls)koyPQ0((#KQ`}o&9!056?1RKY z8>|gq?=YRi(LxO<`rYGaNp;^9>7G|y+f!~MDqZp?y!i!_E9&;j?g!v=cc^?5c*mZe zDdlJzh$uVG#!OD>P|q@?+{UkRDAoM?5vZSNp1P$kzzz1uhPGfBEaq<*+@_jG;>`eo zM0`K8WqTGWV)1~#*o?i2moU|Mc6}o1OnUlB*|?5gsiyD(IN&JsLuTPdydhC5N)pU5@5Qh{$l~u9jE>y zky@+xeNuiEfPJ*18@vyC)C&ZAc9vcC(9biNslMSi5QyMD$Mz|jR4Aro*8T;`vKoAs z?vEvuSUADz{P!67L2~v{nnV-+EXOaCAPO#6AJHc>(B?=oCGjz5v|&^;dAkZ*?R$aanifmfWz1QsV~UM(=F)X9_5VY;mzg7Z%J013`o0k zBij&964YD7q`v_)zfXN9OKceE{vd--uGUd}1KKm-9h44JKnuvLGL)jZF$wC3m?yB! zgpOw5pXg6i@%xgVB^u&$LAYQy0NIH3@M9=4>vdJIo_j^qYs+s!yfiU?!mY&J-=e1% zYHgnUiJ3jZ0+6Nlrl=A)Fj}sO1 zGxoxZ*sJV@n0eKmSH=sqD75V9RdYJFaYm9#!_BL?@Xl@5CB7DLkWqTgY4sr1lCw)2(SPH66jgb{dDjeWwld!SftvJZ{cs9V(xSNtOC;C#A-op#(LiT z$kya~eqM9}j79sKXWRJeo03u(hcEsF;18oJ3`po%Ab5#(ca$6{pTEh%`QUrOR0}RS zNNv~maitJ^9|sqP0dmK$Oy4~r#%Pu;^plrxEjrPb@%*efWOK&j249+uXizR<&fw~f z{sMk2OBKx`+0Q?S#o5oM&6vvZcVai0WxBeQUn02v$i+W6|4eDo1z*$T+g)b|`1G;k z{j(sA?v}&|6F6UhruSBHM{XBqp&Lq;weuksP3-K-%L^ly;?P#-Wc{;r6Dps1Cg6%j zOcOfBxyS<-KIddcRO0k4EF>)!b0FrM0I)rRLfi=d_Tj|()9wW6;~OdXx7YYK3yphMzrlrHX?6Sw+z^~=Hph7a1z`kr=R9;*8>D7&l~ z)zK~Rp7KS)>cs9uv+gJCYr7jg4|DC0u}==Imrfe- zO2V(=4VJ%8*{jZLP6wSh@MJvi8zkY)KC4$x>PF)qZTvjuTu3=&&Y{9ive=G;&-v5R zz}L6hf`WE#lO$h&v zYwS&!qO&On>k7Ol^lrt#8He=KVU|zz;o~wDAF``J$rG7Tiq@$PCb9CN*DvRy!RyU2 z{uK$I_Wx?{%;TZ%-af8WDkPPqY!!tfA^S2FqJ>Ekvdk?-mciI}B_-=*FWVGKvP?pj z2`!fFvQ5^(U@~KDV=!iWCf%=lYU=m=p6CDDAC{Nb^>(gvjx*($vJ=YevQO)JZm%Vra(ts^f;h8juLbI1IoTP~tcV8|+6353R* ze9)$t&7{=V&CoPVGqS#PJ%TX4|BV^8sUG&=?%_p{5*XuH#945N$F)8<0obdX%q|c= z+6G(RI(09MAqvFgE#6RD>Qh|Eri82~*803Rj;!8m#ba9a5t1<3YhT$hj&{`UBsKRC z;oDHwTQ*O4m$#yw#wr)={=T=i`D27D3IX&@LQ;N$Vd= ztq^Tm!VTA!^Ad8GsN=u@LqZ;9?a;TIwJoWz3CZ)?mncSRCucl6$Q_-7zDew9irfMXZ2+}Fv#Poqz* zWVPBATr(?VL7)$N{9UDMs@^>_$kUvlWPR%z>J4YQiJt zA7Em=N<`P6`@G4ZmGcZYyn9YdY1B`Mu=lgs74UZS?kg*7kh0*+wXiJb8M6Gcw`}Cp zQ$ns7^p5SVYx(UoL2f^}v@x(Dyh`ll(?FssDbd4DaRheR%o9;QFe7b%R&V!Z|Hju4 z^fGAlVI5FDaHipQVP1)_Z0&s*_Ei+B9$*;@LluA$hSzqZwTPdV#WGx%6`>sOS_TMR z8T=p4QIrT(J|SuS9#tL{lpcuu9y?H#o_Zp5l3;#D1uH$+SGM^$=(d364n*St!t)e| z*8DB+N@d5u?En}6P>x<*lEnv&bRq-7${kdBzGj`8uSnrB33|_lzqlfLE7ArBo@^x& zu1l&F^#vKXHo>M*z{S2ilB0t*QWYe;EQ3^9O1}>9a|pbn;1jibCicY90-t>|f#Q>u z!=qD`w~>IsV4|f{ll68Q>@Y9CU$O8UU5b{twegD&v97K1OP(q_o)n~TnB&4{y&7El z;HPrXx75N+mC*}z;6h+vj?ZhKm9*H$O)>3XMCI%290T{)ISNk^Zse`ZvRxrs*~SU1yEQ zD?1k#f~rD`UYSWFrFc~OEx&quYD^Ml+nZgltSObDBs3naKMc5}p|J?!tUD)u6kxUl z%ny{pTz!8=6q-!YDfd|^d8M@?HCq99)R$XBgL;f8Yp#;J5I4txLFuGw0S!noG)pnM zx9Ki-k8=llbsR||3_ufMNL60qwJCSJ(V$_X&5c=uC`2!ye-zM_IigKM^um(FVpgRn zo|%(JNygbw36K^F_%u^^2QPov9Ia9tBF41 z_*|Ygp2quDjqgU9=L+dBE$iasQRizli?Dq~)Z@u<9wu+Zec=KCP_a>fxg71)9(0in zkdz#t69qG%b>%uZ=__x}PZS>1&`t!=ik8pYDfb?iyaNjEetbwgIp)MQcu=JFlUdRG zT6M}NiV|yd(`y%x5@`#r6!lDe3Z67+pGdVy&-ZbinnacYCu!gIA$!$~4mOBmc}{h_ zTu|}FAj#rnNLgnc8L|^#uCi_w6+G7tHF1+1S)pD2boaD z=@`G9pqdL&sI*(V+R&;f;&MMEbfm%aIV5{HeZs?9AfGxXGa0+C`YeFlG}I7W)$#mc zg|nCg=>R0PeK93=5nR4<2<5gWO=*{7)Q5>#r ztH`(^1Z7w_kE-mkzI}=Ax(0|9@XNBvYHGjDG4PP6>Ywq!v3~JId05T5XN=f4Xl2tr zw;I94-Ocl($3m#Yg@oCa;wBFz7c6QY;3g%H2Amo=JX&NjY>H5=fm*Lug@7~~;T1y^ z?Unq&%I-nc>;USK2BH1)**4vvaub*Ppc^UP*Q7&+D3;bF->j&L9-Hzj$(+Q3w_;-O z{bm+lqqCgl+?8&_L)z`h;lbU~A$`Qxn9pdyW;zFD6z7GU^83qvI4!7qSY|6e+brZApx);t6sIUs0QU-);J+VtO(=rjk6nYjuLM{`y42zI<>CGnv@yB$;+)Vd~w zyk8wMXAKC|qG}ewRCfUi79(0}=Dx&JE;h&F zgi&ZOC-kRk%g!gWllMc_q0vrpoFPyswrsR|$h&MJ_?{{dnOsFbD=O9{N_V6#B1Xtc zv!gtRIJ_h1zU!e{>t-MoZ4$B_78;`AH;*$3D7jbQMmzwUuEv!WFRqsQrrH4x+HLBo zHp8RheDPPXJsQ05+?w}PWR@75mZViW5SP{@;QMBE3U?+}a;6v-?MI0{8kkO=A26bF zHtI}Mm(n2ip}KWvWvNx7mn_X45JYkFPK>P?rfROA`aDM5)7l`4BOoNGGf?veT3e){ zdcDF5V=`7VFb58OixSYK=Y^bKd6VGv*N9rbz z;M#Wv(l7Rd`5~4-IF2!Pxb?9hYf_-5-5|Ws2lN8@HT7(DFw|jIHtP%VUNL(p!mm1Y zjxeSz*qF0i8+s0{j$J3t7xm*RZ0Mt4Vf*9N6z2xpqgwMv$nKS>M6x^9H!wQb(8dTw zTxq@@G8zC%1n~jZ6M|Dmk)#*Y08nRbX3rB^^{QXL7q-5KZ0;k}d3`}>HQg(77(t&# z7TUq5a)9K$qtxVBnnP!(0pv-s%KXu+%15CWN=ExUa>-?=280+MzpB@cA1GP@7c|t7 zzar;QD|3JlD#=u9Y6Ld3E27R7G!{lHNBD2nzYa|359Gt0Pg^Zm&uL>PlHXN^>Md2& zdWjKly&iWooe6)?kCD{G$Z#>7VK9=D7^#@Xo#T58hjeCFRCiYR>SZ2p)e5dxgf-sQ z+X`wsv^Yfa=gl#1<$o4)z6EgxUj4zx_p~|?pz(2f#sY-;Lewvr?}LSBqa+zK42wwaxtyIBM1>|#;CbFkGVhesdAoddOfqNY5!TzUhfMh za+395%V`;eB>MLHtSe=_ft(#2qel7oghBWk9*sC>*wZ^tGYzK5g=ut#Ex2f`8jWUi z$r4ga+)5>n`SPs4XHx%cJWBf}!-rv=I;6bI>NpQHT>=-#?aHy zpS9H(R=bv;FibVPXv<^6xI#N*`1bBmlZ2~V7VFX{9Eqni72C*PgaP=BU@0*!^=-G# z95OMQxILWwVG8`&`SaO*uKN_#8{Quh9wH;`xgv~pc@GD8$FuSD zVag_~YvJD>5uVKwii2KZs{@PutV48C3at}%aJ>*rWj}Prs3q$1ShkhA)AF_YaN32- z&f=y}kMb71H#y7kpOprNd^L0sQzUALsrv8)KbSZTi&pBkJ1xQ)nX;VU9=*M%n$1yY zN#6~fUW@;3JNbKAUoKmlls=;aZ!vDPcp0X1H{I+udQQ&H&EwYhs||*S>%U%ejILu; zmoe0Uj4K`kiq2&4gr?Ny9^9?bn)QNrQRnR;JPIuVHZbKk81!`C;m+nvPcAK45`iN7S6nb;W)NEU6%g9OEHRc*=7spNPNa5$Si zp>#)n-6ah+)lXevY%?-O*<0uVB7(Mb7r~?_CZ}BC)JqYSp2`k6s#U&kpTt-r^{kca z7f5?4wIKof&v6S4%tviH=Gn1b@pPublr?AnI^Th0v_%!j_F|DG8SHjoY?ZthQ-yu< zX}h?f-tNQt!Qd=5Rveb z-#6hDAI%jO`zTwNqrb9ncf;M3ibry&J$wJ*U@vJxJ5_Umtv(KYNX&egTl zv2*|6@z?XHeEE8?`e$>~j*r%5a@<=IS~ct9-6ggkNlL}m_98puBv1;}&@agw6_k3L(qknk`{8ag` z_2=N&i!V*}3wFsgBt0XyI$K7~LeG4I?ELa%^3uUZEZ9!5w^r}My7UW&!cE(gZ+=o0 zZmIIMK{(e4b6I5wk?-(^-}kJq5$9P$45sOd@$ztq&p-4O+xxh;ZIfg#H>g!($##F+ z0?G_o;%KN^a?%uF?bjILBR0?V0hiqw;bfM+Zs);=?2L4w z@IDg-?(~eUh~LAfqi=jKDOyR+>qO7|)0VTr-m(BjX20j&>%#rwzvjMCLi2~*uV_6q zFp)dFe2loM--~Gg9)ln3;!&(Ncqbtp}T4Bj=diA z$K1UDY5^Y^zmZ~$yC`GrVqTvA825j!&^J>5_hppPRg91D&JR(W<+-+vA;vV4hBG_- zcE`{7S@6G$tQ;%%Qc!GgG)a?MU*QKHmzkB{L89f306rGZJsvPQ)pb=#Dkd&KOrITq zneXG@7ad!ZDV=>+QehS`m8~`I@?2(da&JMluJXyq+|2&jqg*M+F9^2Yd@5X+qySa7 z@GTd|dRx1B(ZHuyZC~lQ9TZ#N)=PSFVTrEHeb0AIZ;tP%FoJB zscrB6@~cRDHOyJb;UA%_{t~PNR@Ve3;iLp>AN&{`W`F*1XjnZ3m_WND{|k`mFu>YE zR^2@l_~_^ckVS>h8qZqh&x}`--iZIdh@)Adtm0ZG^z`u!=-;o#8(%ga2w4fNQcEVm zi=pTJK5c#y>;7@#v5M-Lgf@n{lZCJ$v14rmtGtRy*rM)qBiX zHny*fXy$h0pN$AB;MW6`p8+Z6tN`Y53M=K;6NH~BLl$goznv$rhX48q_;a|0)lcDn zKM=A;vu?hb@gks~$MeT}$+8t^g|Y5tnXvtT{RbFxZ_5h%b$iG}v9a;l{@l4gTK3Nv a{k@QHW%%`ef1D6wvtzskmyq4}pZ*8MupEd0 literal 0 HcmV?d00001 From abeb6008597e653409969b890a8629deb99e1c92 Mon Sep 17 00:00:00 2001 From: Pao Date: Sun, 5 Feb 2023 20:11:56 +0100 Subject: [PATCH 04/22] moved psd --- {models_stuff => python_helpers}/Modular_prost.psd | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename {models_stuff => python_helpers}/Modular_prost.psd (100%) diff --git a/models_stuff/Modular_prost.psd b/python_helpers/Modular_prost.psd similarity index 100% rename from models_stuff/Modular_prost.psd rename to python_helpers/Modular_prost.psd From cb2fe5e36d195eec608fc61bb0925ffcb6ca2d3c Mon Sep 17 00:00:00 2001 From: Pao Date: Sun, 5 Feb 2023 22:35:09 +0100 Subject: [PATCH 05/22] more xlsx stuff --- python_helpers/main.py | 12 +++++++++++- python_helpers/modules_prost.xlsx | Bin 27540 -> 27652 bytes 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/python_helpers/main.py b/python_helpers/main.py index 6fa7014..2da21dc 100644 --- a/python_helpers/main.py +++ b/python_helpers/main.py @@ -1,4 +1,5 @@ -import lxml.etree as gfg +import lxml.etree as gfg +import pandas as pd def generate_clothing_item(model, texture_choices, guid = None): @@ -95,6 +96,15 @@ def generate_item(item_name, weight, item_type, display_category, display_name, file.write(root_element) file.close() +########################################################################################### + +forearm_data = pd.read_excel('modules_prost.xlsx', sheet_name = "Forearm") + +data = pd.DataFrame(excel_data, columns) + + + + #generate_clothing_item() diff --git a/python_helpers/modules_prost.xlsx b/python_helpers/modules_prost.xlsx index deff80fa41e545c80ef47be3a94fc0e8795dc0fb..ae55b868f1f3113b23107043852639aa6bc8255f 100644 GIT binary patch delta 5228 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 delta 5126 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 E7rM4rs{jB1 From ff7915abbd004055bbc62b963423eed2b9672e0f Mon Sep 17 00:00:00 2001 From: Pao Date: Mon, 6 Feb 2023 19:40:36 +0100 Subject: [PATCH 06/22] Tests with amputating legs --- media/AnimSets/player/idle/Bob_NoLegsIdle.xml | 65 +++++++++++ .../player/movement/Bob_NoLegsMovement.xml | 109 ++++++++++++++++++ .../clothingItems/Amputation_Left_Foot.xml | 12 ++ media/fileGuidTable.xml | 5 + media/lua/client/TOC_Animations.lua | 24 ++++ media/lua/client/TOC_Client.lua | 20 ++++ media/lua/client/TOC_OverridenFunctions.lua | 34 +++--- media/lua/client/TOC_Update.lua | 17 +++ media/lua/server/TOC_MP_server.lua | 8 ++ media/lua/shared/NPCs/ExtraBodyLocations.lua | 3 +- media/scripts/TOC_items.txt | 16 +++ python_helpers/modules_prost.xlsx | Bin 27652 -> 27661 bytes 12 files changed, 299 insertions(+), 14 deletions(-) create mode 100644 media/AnimSets/player/idle/Bob_NoLegsIdle.xml create mode 100644 media/AnimSets/player/movement/Bob_NoLegsMovement.xml create mode 100644 media/clothing/clothingItems/Amputation_Left_Foot.xml create mode 100644 media/lua/client/TOC_Animations.lua diff --git a/media/AnimSets/player/idle/Bob_NoLegsIdle.xml b/media/AnimSets/player/idle/Bob_NoLegsIdle.xml new file mode 100644 index 0000000..dcb318e --- /dev/null +++ b/media/AnimSets/player/idle/Bob_NoLegsIdle.xml @@ -0,0 +1,65 @@ + + + Bob_NoLegsIdle + Zombie_Idle_FloorOnFront + Y + 0.48 + 0.20 + + IsCrawling + BOOL + true + + IdleSpeed + IdleSpeed + + Zombie_Idle_FloorOnFront + 0.00 + 0.00 + 0.80 + + + Zombie_Idle_FloorOnFront + 0.00 + 1.00 + 0.80 + + + Zombie_Idle_FloorOnFront + 0.00 + 0.04 + 0.80 + + + 1 + 2 + 3 + + + aim_default + Zombie_Idle_FloorOnFront + 0.5 + 1.5 + + + defaultWalk + 0.3 + 0.3 + + isTurningAround + BOOL + false + + + + defaultRun + Zombie_Idle_FloorOnFront + 0.1 + 0.1 + + isTurningAround + BOOL + false + + + \ No newline at end of file diff --git a/media/AnimSets/player/movement/Bob_NoLegsMovement.xml b/media/AnimSets/player/movement/Bob_NoLegsMovement.xml new file mode 100644 index 0000000..3989830 --- /dev/null +++ b/media/AnimSets/player/movement/Bob_NoLegsMovement.xml @@ -0,0 +1,109 @@ + + + defaultWalk + Zombie_Crawl + Translation_Data + Y + 1.04 + 0.20 + + IsCrawling + BOOL + true + + + WalkInjury + WalkSpeed + + Zombie_Crawl + 0.50 + 1.00 + 0.80 + + + Zombie_Crawl + -0.50 + 1.00 + 0.80 + + + Zombie_Crawl + 1.00 + 1.00 + 0.80 + + + Zombie_Crawl + -1.00 + 1.00 + 0.80 + + + Zombie_Crawl + 0.00 + 1.00 + 0.80 + + + Zombie_Crawl + 0.00 + 0.00 + 0.80 + + + 2 + 4 + 6 + + + 5 + 2 + 6 + + + 6 + 1 + 5 + + + 6 + 3 + 1 + + + Bob_NoLegsIdle + 0.3 + 1 + + + Bob_NoLegsIdle + Zombie_Crawl + 0.3 + 0.3 + + DeltaY + GTR + -0.5 + + + isMoving + BOOL + false + + + + Bob_NoLegsIdle + 0.1 + + + + Footstep + 0.15 + walk + + + Footstep + 0.6 + walk + + \ No newline at end of file diff --git a/media/clothing/clothingItems/Amputation_Left_Foot.xml b/media/clothing/clothingItems/Amputation_Left_Foot.xml new file mode 100644 index 0000000..a91081e --- /dev/null +++ b/media/clothing/clothingItems/Amputation_Left_Foot.xml @@ -0,0 +1,12 @@ + + + Amputation_Left_Hand_Male + Amputation_Left_Hand_Female + 45c0b872-bdf1-466f-b810-c7783171bda1 + false + false + false + 8 + none + + \ No newline at end of file diff --git a/media/fileGuidTable.xml b/media/fileGuidTable.xml index 107fff3..b91d9b6 100644 --- a/media/fileGuidTable.xml +++ b/media/fileGuidTable.xml @@ -76,4 +76,9 @@ media/clothing/clothingItems/Prost_Left_LowerArm_MetalHand.xml 0405a4c0-f71b-45a8-9edc-489fc81dca39 + + + media/clothing/clothingItems/Amputation_Left_Foot.xml + 45c0b872-bdf1-466f-b810-c7783171bda1 + \ No newline at end of file diff --git a/media/lua/client/TOC_Animations.lua b/media/lua/client/TOC_Animations.lua new file mode 100644 index 0000000..4d2d787 --- /dev/null +++ b/media/lua/client/TOC_Animations.lua @@ -0,0 +1,24 @@ +-- Thanks to Glytcher and Matías N. Salas for helping out with this + + + + + +function SetMissingFootAnimation(check) + + + local player = getPlayer() + + if check then + player:setVariable("IsCrawling", "true") + else + player:setVariable("IsCrawling", "false") + end + + -- if isClient() then + -- sendClientCommand("TOC", "SetCrawlAnimation", {}) + -- end + +end + + diff --git a/media/lua/client/TOC_Client.lua b/media/lua/client/TOC_Client.lua index 7a862ec..2e90144 100644 --- a/media/lua/client/TOC_Client.lua +++ b/media/lua/client/TOC_Client.lua @@ -208,6 +208,26 @@ end +-- ANIMATIONS +----------------------- +Commands["SetCrawlAnimation"] = function(args) + + local source = getPlayer() + local player = getPlayerByOnlineID(args.id) + + if source ~= player then + if args.hasInjury then + player:setVariable('SetCrawlAnimation', 'true'); + else + player:setVariable('SetCrawlAnimation', 'false'); + end + end + +end + + + + -- Base stuff local function OnTocServerCommand(module, command, args) diff --git a/media/lua/client/TOC_OverridenFunctions.lua b/media/lua/client/TOC_OverridenFunctions.lua index 34b92be..c2e63a7 100644 --- a/media/lua/client/TOC_OverridenFunctions.lua +++ b/media/lua/client/TOC_OverridenFunctions.lua @@ -76,14 +76,18 @@ function ISInventoryPane:onMouseDoubleClick(x, y) local item_to_check = self.items[self.mouseOverOption] local player_inventory = getPlayerInventory(self.player).inventory - if instanceof(item_to_check, "InventoryItem") then - og_ISInventoryPaneOnMouseDoubleClick(self, x, y) - elseif CheckIfItemIsAmputatedLimb(item_to_check.items[1]) or CheckIfItemIsInstalledProsthesis(item_to_check.items[1]) then - --print("TOC: Can't double click this item") - else - og_ISInventoryPaneOnMouseDoubleClick(self, x, y) +----------------------------------------------------------------------------------- + -- TODO THIS IS DISABLED ONLY FOR TEST!!!!! REMEMBER TO RESTORE IT +----------------------------------------------------------------------------------- - end + -- if instanceof(item_to_check, "InventoryItem") then + -- og_ISInventoryPaneOnMouseDoubleClick(self, x, y) + -- elseif CheckIfItemIsAmputatedLimb(item_to_check.items[1]) or CheckIfItemIsInstalledProsthesis(item_to_check.items[1]) then + -- --print("TOC: Can't double click this item") + -- else + + -- end + og_ISInventoryPaneOnMouseDoubleClick(self, x, y) @@ -96,13 +100,17 @@ function ISInventoryPane.getActualItems(items) local ret = og_ISInventoryPaneGetActualItems(items) -- This is gonna be slower than just overriding the function but hey it's more compatible +----------------------------------------------------------------------------------- + -- TODO THIS IS DISABLED ONLY FOR TEST!!!!! REMEMBER TO RESTORE IT +----------------------------------------------------------------------------------- - for i = 1, #ret do - local item_full_type = ret[i]:getFullType() - if string.find(item_full_type, "Amputation_") or string.find(item_full_type, "Prost_") then - table.remove(ret, i) - end - end + + -- for i = 1, #ret do + -- local item_full_type = ret[i]:getFullType() + -- if string.find(item_full_type, "Amputation_") or string.find(item_full_type, "Prost_") then + -- table.remove(ret, i) + -- end + -- end return ret end diff --git a/media/lua/client/TOC_Update.lua b/media/lua/client/TOC_Update.lua index 2b9cce7..3b6cce5 100644 --- a/media/lua/client/TOC_Update.lua +++ b/media/lua/client/TOC_Update.lua @@ -176,12 +176,29 @@ end -- MAIN UPDATE FUNCTIONS +local testOnAnimEvent = IsoGameCharacter.OnAnimEvent + +function IsoGameCharacter.OnAnimEvent(animLayer, animEvent) + print("ENTERING ON ANIM EVENT!!!") +end + + + local function TocUpdateOnTick() local player = getPlayer() if player == nil then return end + + + + + + + + + local toc_data = player:getModData().TOC if toc_data ~= nil then CheckIfPlayerIsInfected(player, toc_data) diff --git a/media/lua/server/TOC_MP_server.lua b/media/lua/server/TOC_MP_server.lua index a0587df..d699978 100644 --- a/media/lua/server/TOC_MP_server.lua +++ b/media/lua/server/TOC_MP_server.lua @@ -24,6 +24,14 @@ TOC_Commands["AskDamageOtherPlayer"] = function(_, arg) end +-------- ANIMATIONS +TOC_Commands["SetCrawlAnimation"] = function(player, args) + + local player_id = player:getOnlineID() + + sendServerCommand(player, "TOC", "SetCrawlAnimation", {}) + +end diff --git a/media/lua/shared/NPCs/ExtraBodyLocations.lua b/media/lua/shared/NPCs/ExtraBodyLocations.lua index 828e213..caee784 100644 --- a/media/lua/shared/NPCs/ExtraBodyLocations.lua +++ b/media/lua/shared/NPCs/ExtraBodyLocations.lua @@ -18,7 +18,7 @@ local function addBodyLocationBefore(newLocation, movetoLocation) - list:remove(list:size()-1) + list:remove(newItem) local i = group:indexOf(movetoLocation) list:add(i, newItem) end @@ -70,6 +70,7 @@ local group = BodyLocations.getGroup("Human") addBodyLocationBefore("TOC_ArmRight", "Shoes") addBodyLocationBefore("TOC_ArmLeft", "Shoes") +addBodyLocationBefore("TOC_LegLeft", "Shoes") addBodyLocationBefore("TOC_ArmRightProsthesis", "Shoes") addBodyLocationBefore("TOC_ArmLeftProsthesis", "Shoes") diff --git a/media/scripts/TOC_items.txt b/media/scripts/TOC_items.txt index f06ba7b..5c13ecd 100644 --- a/media/scripts/TOC_items.txt +++ b/media/scripts/TOC_items.txt @@ -440,4 +440,20 @@ item ProthesisMag3 ReplaceOnUse = ProthesisMag3, Tooltip = Tooltip_ProthesisMag2, } + +item Amputation_Left_Foot + { + Weight = 1, + Type = Clothing, + DisplayCategory = Test, + DisplayName = amp test foot, + ClothingItem = Amputation_Left_Foot, + BodyLocation = TOC_LegLeft, + BloodLocation = Hands, + Icon = woodenHook, + Tooltip = test, + CanHaveHoles = false, + } + + } \ No newline at end of file diff --git a/python_helpers/modules_prost.xlsx b/python_helpers/modules_prost.xlsx index ae55b868f1f3113b23107043852639aa6bc8255f..27265b1f0f9ec555ce4c988ac6528f85783ebeec 100644 GIT binary patch delta 8882 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

&XA=L$%jKgqn`;GYIq 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 VjvNDga(IGe`|!_{B&$D|{{c15DhU7p delta 9073 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 Date: Mon, 6 Feb 2023 20:32:30 +0100 Subject: [PATCH 07/22] Cleaning body locations --- .../lua/client/{TOC_main.lua => TOC_Init.lua} | 0 media/lua/client/TOC_Update.lua | 15 ---- media/lua/shared/NPCs/ExtraBodyLocations.lua | 83 +++---------------- 3 files changed, 12 insertions(+), 86 deletions(-) rename media/lua/client/{TOC_main.lua => TOC_Init.lua} (100%) diff --git a/media/lua/client/TOC_main.lua b/media/lua/client/TOC_Init.lua similarity index 100% rename from media/lua/client/TOC_main.lua rename to media/lua/client/TOC_Init.lua diff --git a/media/lua/client/TOC_Update.lua b/media/lua/client/TOC_Update.lua index 3b6cce5..6af44b7 100644 --- a/media/lua/client/TOC_Update.lua +++ b/media/lua/client/TOC_Update.lua @@ -176,13 +176,6 @@ end -- MAIN UPDATE FUNCTIONS -local testOnAnimEvent = IsoGameCharacter.OnAnimEvent - -function IsoGameCharacter.OnAnimEvent(animLayer, animEvent) - print("ENTERING ON ANIM EVENT!!!") -end - - local function TocUpdateOnTick() @@ -191,14 +184,6 @@ local function TocUpdateOnTick() return end - - - - - - - - local toc_data = player:getModData().TOC if toc_data ~= nil then CheckIfPlayerIsInfected(player, toc_data) diff --git a/media/lua/shared/NPCs/ExtraBodyLocations.lua b/media/lua/shared/NPCs/ExtraBodyLocations.lua index caee784..2bf4b3f 100644 --- a/media/lua/shared/NPCs/ExtraBodyLocations.lua +++ b/media/lua/shared/NPCs/ExtraBodyLocations.lua @@ -1,82 +1,23 @@ -local function addBodyLocationBefore(newLocation, movetoLocation) - - -- TODO this is still broken! +local function addBodyLocationBefore(new_location, move_to_location) local group = BodyLocations.getGroup("Human") - - - local list = getClassFieldVal(group, getClassField(group, 1)) - - - - group:getOrCreateLocation(newLocation) - - - local newItem = list:get(list:size()-1) - print("TOC: Created new body location" .. newItem:getId()) - - - - - list:remove(newItem) - local i = group:indexOf(movetoLocation) - list:add(i, newItem) + group:getOrCreateLocation(new_location) + local new_item = list:get(list:size()-1) + print("TOC: Created new body location" .. new_item:getId()) + list:remove(new_item) + local i = group:indexOf(move_to_location) + list:add(i, new_item) end - - -local function TocSetSleeves(check) - - -- FIXME This can't work, we need to fix masks before changing the order. There is nothing I can do for now with only this - - - - - - - -- -- Check if we already set stuff before - -- -- Readd them - -- print("TOC: Running TocSetSleeves") - - -- if group:getLocation("RightArm") or group:getLocation("LeftArm") then - -- BodyLocations:Reset() -- maybe it's too much - -- end - - -- if check then - -- print("TOC: Rolling up sleeves") - -- group:getOrCreateLocation("ArmRight_Prot") - -- group:getOrCreateLocation("ArmLeft_Prot") - -- group:getOrCreateLocation("ArmRight") - -- group:getOrCreateLocation("ArmLeft") - -- else - -- print("TOC: Won't roll up sleeve") - -- addBodyLocationBefore("ArmRight_Prot", "TorsoExtra") - -- addBodyLocationBefore("ArmLeft_Prot", "TorsoExtra") - -- addBodyLocationBefore("ArmRight", "Jacket") - -- addBodyLocationBefore("ArmLeft", "Jacket") - - -- end - - -end - --- FIXME this still breaks - -local group = BodyLocations.getGroup("Human") - - - - addBodyLocationBefore("TOC_ArmRight", "Shoes") addBodyLocationBefore("TOC_ArmLeft", "Shoes") + +addBodyLocationBefore("TOC_LegRight", "Shoes") addBodyLocationBefore("TOC_LegLeft", "Shoes") + addBodyLocationBefore("TOC_ArmRightProsthesis", "Shoes") addBodyLocationBefore("TOC_ArmLeftProsthesis", "Shoes") - - --- group:getOrCreateLocation("TOC_ArmRight") --- group:getOrCreateLocation("ArmLeft") --- group:getOrCreateLocation("ArmRight_Prot") --- group:getOrCreateLocation("ArmLeft_Prot") \ No newline at end of file +addBodyLocationBefore("TOC_LegRightProsthesis", "Shoes") +addBodyLocationBefore("TOC_LegLeftProsthesis", "Shoes") \ No newline at end of file From be5148210ec9daa7abe9ba6fa82fcc426b43b565 Mon Sep 17 00:00:00 2001 From: Pao Date: Mon, 6 Feb 2023 23:13:42 +0100 Subject: [PATCH 08/22] Initial work for legs amputations --- .vscode/settings.json | 3 +- .../clothingItems/Amputation_Left_Foot.xml | 29 ++++++++-- .../clothingItems/Amputation_Right_Foot.xml | 35 ++++++++++++ media/fileGuidTable.xml | 6 +++ .../lua/client/ActionsMethods/TOC_CutLimb.lua | 10 ++-- media/lua/client/Interface/TOC_UI.lua | 12 +++++ media/lua/client/TOC_CommonFunctions.lua | 10 ++++ media/lua/client/TOC_Compatibility.lua | 20 ++++--- media/lua/client/TOC_Debug.lua | 45 ++++++++-------- media/lua/client/TOC_HelperFunctions.lua | 3 ++ media/lua/client/TOC_Init.lua | 51 +++++++++++++++++- media/lua/client/TOC_OverridenFunctions.lua | 4 +- media/lua/shared/NPCs/ExtraBodyLocations.lua | 11 ++-- .../Amputation/Amputation_GenericModel.fbx | Bin 0 -> 116252 bytes media/scripts/TOC_items.txt | 44 ++++++++++++--- media/ui/TOC/Left_Foot/Base.png | Bin 0 -> 4411 bytes media/ui/TOC/Left_Foot/Bite.png | Bin 0 -> 671 bytes media/ui/TOC/Left_Foot/Bleed.png | Bin 0 -> 981 bytes media/ui/TOC/Left_Foot/Cut.png | Bin 0 -> 282 bytes media/ui/TOC/Left_Foot/Hook.png | Bin 0 -> 683 bytes media/ui/TOC/Left_Foot/MetalHand.png | Bin 0 -> 724 bytes media/ui/TOC/Left_Foot/Operate.png | Bin 0 -> 680 bytes media/ui/TOC/Right_Foot/Base.png | Bin 0 -> 1859 bytes media/ui/TOC/Right_Foot/Bite.png | Bin 0 -> 671 bytes media/ui/TOC/Right_Foot/Bleed.png | Bin 0 -> 1216 bytes media/ui/TOC/Right_Foot/Cut.png | Bin 0 -> 381 bytes media/ui/TOC/Right_Foot/Hook.png | Bin 0 -> 683 bytes media/ui/TOC/Right_Foot/MetalHand.png | Bin 0 -> 724 bytes media/ui/TOC/Right_Foot/Operate.png | Bin 0 -> 843 bytes 29 files changed, 232 insertions(+), 51 deletions(-) create mode 100644 media/clothing/clothingItems/Amputation_Right_Foot.xml create mode 100644 media/models_X/Amputation/Amputation_GenericModel.fbx create mode 100644 media/ui/TOC/Left_Foot/Base.png create mode 100644 media/ui/TOC/Left_Foot/Bite.png create mode 100644 media/ui/TOC/Left_Foot/Bleed.png create mode 100644 media/ui/TOC/Left_Foot/Cut.png create mode 100644 media/ui/TOC/Left_Foot/Hook.png create mode 100644 media/ui/TOC/Left_Foot/MetalHand.png create mode 100644 media/ui/TOC/Left_Foot/Operate.png create mode 100644 media/ui/TOC/Right_Foot/Base.png create mode 100644 media/ui/TOC/Right_Foot/Bite.png create mode 100644 media/ui/TOC/Right_Foot/Bleed.png create mode 100644 media/ui/TOC/Right_Foot/Cut.png create mode 100644 media/ui/TOC/Right_Foot/Hook.png create mode 100644 media/ui/TOC/Right_Foot/MetalHand.png create mode 100644 media/ui/TOC/Right_Foot/Operate.png diff --git a/.vscode/settings.json b/.vscode/settings.json index d59bef0..206a0e1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -53,6 +53,7 @@ "FHSwapHandsAction", "getClassFieldVal", "SandboxVars", - "getClassField" + "getClassField", + "ISWearClothing" ] } \ No newline at end of file diff --git a/media/clothing/clothingItems/Amputation_Left_Foot.xml b/media/clothing/clothingItems/Amputation_Left_Foot.xml index a91081e..e17173a 100644 --- a/media/clothing/clothingItems/Amputation_Left_Foot.xml +++ b/media/clothing/clothingItems/Amputation_Left_Foot.xml @@ -1,12 +1,35 @@ - Amputation_Left_Hand_Male - Amputation_Left_Hand_Female + Amputation\Amputation_GenericModel + Amputation\Amputation_GenericModel 45c0b872-bdf1-466f-b810-c7783171bda1 false false false 8 none - + + Amputations\Forearm\skin01_b + Amputations\Forearm\skin02_b + Amputations\Forearm\skin03_b + Amputations\Forearm\skin04_b + Amputations\Forearm\skin05_b + + Amputations\Forearm\skin01_hairy_b + Amputations\Forearm\skin02_hairy_b + Amputations\Forearm\skin03_hairy_b + Amputations\Forearm\skin04_hairy_b + Amputations\Forearm\skin05_hairy_b + + Body\MaleBody01 + Body\MaleBody02 + Body\MaleBody03 + Body\MaleBody04 + Body\MaleBody05 + + Body\MaleBody01a + Body\MaleBody02a + Body\MaleBody03a + Body\MaleBody04 + Body\MaleBody05a \ No newline at end of file diff --git a/media/clothing/clothingItems/Amputation_Right_Foot.xml b/media/clothing/clothingItems/Amputation_Right_Foot.xml new file mode 100644 index 0000000..20f2145 --- /dev/null +++ b/media/clothing/clothingItems/Amputation_Right_Foot.xml @@ -0,0 +1,35 @@ + + + Amputation\Amputation_GenericModel + Amputation\Amputation_GenericModel + d6576bb2-f5f1-4cb6-a17e-aab131214e4b + false + false + false + 10 + none + + Amputations\Forearm\skin01_b + Amputations\Forearm\skin02_b + Amputations\Forearm\skin03_b + Amputations\Forearm\skin04_b + Amputations\Forearm\skin05_b + + Amputations\Forearm\skin01_hairy_b + Amputations\Forearm\skin02_hairy_b + Amputations\Forearm\skin03_hairy_b + Amputations\Forearm\skin04_hairy_b + Amputations\Forearm\skin05_hairy_b + + Body\MaleBody01 + Body\MaleBody02 + Body\MaleBody03 + Body\MaleBody04 + Body\MaleBody05 + + Body\MaleBody01a + Body\MaleBody02a + Body\MaleBody03a + Body\MaleBody04 + Body\MaleBody05a + \ No newline at end of file diff --git a/media/fileGuidTable.xml b/media/fileGuidTable.xml index 0f1cd6d..22cccb7 100644 --- a/media/fileGuidTable.xml +++ b/media/fileGuidTable.xml @@ -90,4 +90,10 @@ media/clothing/clothingItems/Amputation_Left_Foot.xml 45c0b872-bdf1-466f-b810-c7783171bda1 + + + media/clothing/clothingItems/Amputation_Left_Foot.xml + d6576bb2-f5f1-4cb6-a17e-aab131214e4b + + \ No newline at end of file diff --git a/media/lua/client/ActionsMethods/TOC_CutLimb.lua b/media/lua/client/ActionsMethods/TOC_CutLimb.lua index b90ed93..ebf67ec 100644 --- a/media/lua/client/ActionsMethods/TOC_CutLimb.lua +++ b/media/lua/client/ActionsMethods/TOC_CutLimb.lua @@ -104,7 +104,7 @@ local function FindTourniquetInWornItems(patient, side) for i = 1, worn_items:size() - 1 do -- Maybe wornItems:size()-1 local item = worn_items:get(i):getItem() local item_full_type = item:getFullType() - if string.find(item_full_type, "Test_Tourniquet_" .. side) then + if string.find(item_full_type, "Surgery_" .. side .. "_Tourniquet") then return item end end @@ -151,7 +151,7 @@ function TocCutLimb(part_name, surgeon_factor, bandage_table, painkiller_table) local base_damage_value = 100 if tourniquet_item ~= nil then - base_damage_value = 50 + base_damage_value = 50 -- TODO Decrease mostly blood and damage, add pain, not everything else if part_name == "Left_UpperArm" or part_name == "Right_UpperArm" then player:removeWornItem(tourniquet_item) @@ -240,7 +240,11 @@ function TocCutLimb(part_name, surgeon_factor, bandage_table, painkiller_table) TocDeleteOtherAmputatedLimbs(side) --Equip new model for amputation - local amputation_clothing_item = player:getInventory():AddItem(TocFindAmputatedClothingFromPartName(part_name)) + local amputation_clothing_item_name = TocFindAmputatedClothingFromPartName(part_name) + print(amputation_clothing_item_name) + + + local amputation_clothing_item = player:getInventory():AddItem(amputation_clothing_item_name) TocSetCorrectTextureForAmputation(amputation_clothing_item, player, false) player:setWornItem(amputation_clothing_item:getBodyLocation(), amputation_clothing_item) diff --git a/media/lua/client/Interface/TOC_UI.lua b/media/lua/client/Interface/TOC_UI.lua index c18070a..426dc18 100644 --- a/media/lua/client/Interface/TOC_UI.lua +++ b/media/lua/client/Interface/TOC_UI.lua @@ -154,6 +154,9 @@ local function SetupTocMainUI(surgeon, patient, limbs_data) main_ui["b31"]:setPath(GetImageName("Right_Hand", limbs_data)) main_ui["b32"]:setPath(GetImageName("Left_Hand", limbs_data)) + main_ui["b41"]:setPath(GetImageName("Right_Foot", limbs_data)) + main_ui["b42"]:setPath(GetImageName("Left_Foot", limbs_data)) + end @@ -435,6 +438,15 @@ local function CreateTocMainUI() main_ui:addImageButton("b32", "", OnClickTocMainUI) main_ui["b32"]:addArg("part_name", "Left_Hand") + + main_ui:nextLine() + + main_ui:addImageButton("b41", "", OnClickTocMainUI) + main_ui["b41"]:addArg("part_name", "Right_Foot") + + main_ui:addImageButton("b42", "", OnClickTocMainUI) + main_ui["b42"]:addArg("part_name", "Left_Foot") + main_ui:saveLayout() diff --git a/media/lua/client/TOC_CommonFunctions.lua b/media/lua/client/TOC_CommonFunctions.lua index 21356ec..cd3fe32 100644 --- a/media/lua/client/TOC_CommonFunctions.lua +++ b/media/lua/client/TOC_CommonFunctions.lua @@ -74,6 +74,11 @@ function TocGetBodyPartFromPartName(part_name) if part_name == "Left_Hand" then return BodyPartType.Hand_L end if part_name == "Left_LowerArm" then return BodyPartType.ForeArm_L end if part_name == "Left_UpperArm" then return BodyPartType.UpperArm_L end + + -- New Legs stuff + if part_name == "Right_Foot" then return BodyPartType.Foot_R end + if part_name == "Left_Foot" then return BodyPartType.Foot_L end + end -- Custom mapping to make more sense when cutting a limb @@ -85,6 +90,11 @@ function TocGetAdiacentBodyPartFromPartName(part_name) if part_name == "Left_Hand" then return BodyPartType.ForeArm_L end if part_name == "Left_LowerArm" then return BodyPartType.UpperArm_L end if part_name == "Left_UpperArm" then return BodyPartType.Torso_Upper end + + if part_name == "Right_Foot" then return BodyPartType.LowerLeg_R end + if part_name == "Left_Foot" then return BodyPartType.LowerLeg_L end + + end function TocFindCorrectClothingProsthesis(item_name, part_name) diff --git a/media/lua/client/TOC_Compatibility.lua b/media/lua/client/TOC_Compatibility.lua index ad22d43..2cb754a 100644 --- a/media/lua/client/TOC_Compatibility.lua +++ b/media/lua/client/TOC_Compatibility.lua @@ -6,16 +6,22 @@ local function TocReapplyAmputationClothingItem(mod_data) for _, limb in ipairs(TOC_limbs) do local part_name = side .. "_" .. limb - if mod_data.TOC.Limbs[part_name].is_cut and mod_data.TOC.Limbs[part_name].is_amputation_shown then - local amputated_clothing_name = "TOC.Amputation_" .. part_name - if player_inv:FindAndReturn(amputated_clothing_name) == nil then - local amputation_clothing_item = player:getInventory():AddItem(TocFindAmputatedClothingFromPartName(part_name)) - TocSetCorrectTextureForAmputation(amputation_clothing_item, player, mod_data.TOC.Limbs[part_name].is_cicatrized) - player:setWornItem(amputation_clothing_item:getBodyLocation(), amputation_clothing_item) - + -- Check this before since we could have changed some stuff about part names before fixing them. Could break things + local part_data = mod_data.TOC.Limbs[part_name] + if part_data then + if part_data.is_cut and part_data.is_amputation_shown then + local amputated_clothing_name = "TOC.Amputation_" .. part_name + if player_inv:FindAndReturn(amputated_clothing_name) == nil then + local amputation_clothing_item = player:getInventory():AddItem(TocFindAmputatedClothingFromPartName(part_name)) + TocSetCorrectTextureForAmputation(amputation_clothing_item, player, part_data.is_cicatrized) + player:setWornItem(amputation_clothing_item:getBodyLocation(), amputation_clothing_item) + + end end end + + TocResetClothingItemBodyLocation(player, side, limb) end end diff --git a/media/lua/client/TOC_Debug.lua b/media/lua/client/TOC_Debug.lua index c44c920..49f3c23 100644 --- a/media/lua/client/TOC_Debug.lua +++ b/media/lua/client/TOC_Debug.lua @@ -45,31 +45,34 @@ function TocResetEverything() TheOnlyCure.InitTheOnlyCure(_, player) -- Destroy the amputation or prosthesis item - for _, v in ipairs(GetBodyParts()) do - -- TODO This is incredibly shitty, but we can't use worn items since we need to consider the case that the item wasn't applied - local amputation_item_name = TocFindAmputationOrProsthesisName(v, player, "Amputation") - local prosthesis_item_name = TocFindAmputationOrProsthesisName(v, player, "Prosthesis") - if amputation_item_name ~= nil then - local amputation_item = player_inventory:FindAndReturn(amputation_item_name) - if amputation_item ~= nil then - print("Resetting " .. amputation_item:getName()) - player:removeWornItem(amputation_item) - player:getInventory():Remove(amputation_item) + for _, side in pairs(TOC_sides) do + for _, limb in pairs(TOC_limbs) do + + local part_name = side .. "_" .. limb + local amputation_item_name = TocFindAmputationOrProsthesisName(part_name, player, "Amputation") + local prosthesis_item_name = TocFindAmputationOrProsthesisName(part_name, player, "Prosthesis") + if amputation_item_name ~= nil then + local amputation_item = player_inventory:FindAndReturn(amputation_item_name) + if amputation_item ~= nil then + print("Resetting " .. amputation_item:getName()) + player:removeWornItem(amputation_item) + player:getInventory():Remove(amputation_item) + end + amputation_item = nil -- reset it end - amputation_item = nil -- reset it - end - if prosthesis_item_name ~= nil then - local prosthesis_item = player_inventory:FindAndReturn(prosthesis_item_name) - if prosthesis_item ~= nil then - print("Resetting " .. prosthesis_item:getName()) - player:removeWornItem(prosthesis_item) - player:getInventory():Remove(prosthesis_item) + if prosthesis_item_name ~= nil then + local prosthesis_item = player_inventory:FindAndReturn(prosthesis_item_name) + if prosthesis_item ~= nil then + print("Resetting " .. prosthesis_item:getName()) + player:removeWornItem(prosthesis_item) + player:getInventory():Remove(prosthesis_item) + end + prosthesis_item = nil -- reset it end - prosthesis_item = nil -- reset it + + end - - end end diff --git a/media/lua/client/TOC_HelperFunctions.lua b/media/lua/client/TOC_HelperFunctions.lua index d369004..375403a 100644 --- a/media/lua/client/TOC_HelperFunctions.lua +++ b/media/lua/client/TOC_HelperFunctions.lua @@ -25,6 +25,9 @@ local function PartNameToBodyLocationAmputation(name) if name == "Left_Hand" then return "TOC_ArmLeft" end if name == "Left_LowerArm" then return "TOC_ArmLeft" end if name == "Left_UpperArm" then return "TOC_ArmLeft" end + + if name == "Left_Foot" then return "TOC_LegLeft" end + if name == "Right_Foot" then return "TOC_LegRight" end end function TocFindItemInProstBodyLocation(part_name, patient) diff --git a/media/lua/client/TOC_Init.lua b/media/lua/client/TOC_Init.lua index 147b180..c371df6 100644 --- a/media/lua/client/TOC_Init.lua +++ b/media/lua/client/TOC_Init.lua @@ -8,7 +8,7 @@ if not TheOnlyCure then end TOC_sides = { "Left", "Right" } -TOC_limbs = { "Hand", "LowerArm", "UpperArm" } +TOC_limbs = { "Hand", "LowerArm", "UpperArm", "Foot"} local function TocCutLimbForTrait(player, limbs_data, part_name) local amputation_clothing_item = player:getInventory():AddItem("TOC.Amputation_" .. part_name) @@ -27,6 +27,33 @@ local function TocCutLimbForTrait(player, limbs_data, part_name) limbs_data[v].is_cicatrized = true end end + +local function InitSpecificPart(mod_data, part_name) + + if mod_data.TOC.Limbs[part_name] == nil then + mod_data.TOC.Limbs[part_name] = {} + end + + + mod_data.TOC.Limbs[part_name].is_cut = false + mod_data.TOC.Limbs[part_name].is_infected = false + mod_data.TOC.Limbs[part_name].is_operated = false + mod_data.TOC.Limbs[part_name].is_cicatrized = false + mod_data.TOC.Limbs[part_name].is_cauterized = false + mod_data.TOC.Limbs[part_name].is_amputation_shown = false + + mod_data.TOC.Limbs[part_name].cicatrization_time = 0 + + + mod_data.TOC.Limbs[part_name].is_prosthesis_equipped = false + mod_data.TOC.Limbs[part_name].equipped_prosthesis = {} + + + +end + + + local function TocUpdateBaseData(mod_data) -- TODO The prosthetic knife needs to be a weapon first and foremost, so other than a @@ -37,12 +64,25 @@ local function TocUpdateBaseData(mod_data) local accepted_prosthesis_hand = { "WoodenHook", "MetalHook", "MetalHand", "ProstheticKnife" } local accepted_prosthesis_lowerarm = { "WoodenHook", "MetalHook", "MetalHand", "ProstheticKnife" } local accepted_prosthesis_upperarm = {} -- For future stuff + local accepted_prosthesis_foot = {} for _, side in ipairs(TOC_sides) do for _, limb in ipairs(TOC_limbs) do local part_name = side .. "_" .. limb + + -- Check if part was initialized + if mod_data.TOC.Limbs[part_name] == nil then + InitSpecificPart(mod_data, part_name) + end + + + + + + + if limb == "Hand" then mod_data.TOC.Limbs[part_name].cicatrization_base_time = 1700 mod_data.TOC.Limbs[part_name].depends_on = {} @@ -69,6 +109,11 @@ local function TocUpdateBaseData(mod_data) mod_data.TOC.Limbs[part_name].cicatrization_base_time = 2000 mod_data.TOC.Limbs[part_name].depends_on = { side .. "_Hand", side .. "_LowerArm", } mod_data.TOC.Prosthesis.Accepted_Prosthesis[part_name] = accepted_prosthesis_upperarm + elseif limb == "Foot" then + mod_data.TOC.Limbs[part_name].cicatrization_base_time = 1700 + mod_data.TOC.Limbs[part_name].depends_on = {} + mod_data.TOC.Prosthesis.Accepted_Prosthesis[part_name] = accepted_prosthesis_foot + end end @@ -102,6 +147,10 @@ local function TocSetInitData(mod_data, player) Left_Hand = {}, Left_LowerArm = {}, Left_UpperArm = {}, + + Left_Foot = {}, + Right_Foot = {}, + is_other_bodypart_infected = false }, Prosthesis = { diff --git a/media/lua/client/TOC_OverridenFunctions.lua b/media/lua/client/TOC_OverridenFunctions.lua index c5ebd61..13f7f3c 100644 --- a/media/lua/client/TOC_OverridenFunctions.lua +++ b/media/lua/client/TOC_OverridenFunctions.lua @@ -3,9 +3,8 @@ require "TimedActions/ISEquipWeaponAction" require "TimedActions/ISUnequipAction" require "ISUI/ISInventoryPaneContextMenu" + local og_ISBaseTimedActionAdjustMaxTime = ISBaseTimedAction.adjustMaxTime - - function ISBaseTimedAction:adjustMaxTime(maxTime) local original_max_time = og_ISBaseTimedActionAdjustMaxTime(self, maxTime) @@ -128,7 +127,6 @@ end local og_ISEquipWeaponActionPerform = ISEquipWeaponAction.perform function ISEquipWeaponAction:perform() - -- TODO this is only for weapons, not items. Won't work for everything I think --TODO Block it before even performing -- TODO in the inventory menu there is something broken, even though this works diff --git a/media/lua/shared/NPCs/ExtraBodyLocations.lua b/media/lua/shared/NPCs/ExtraBodyLocations.lua index dc0acaa..b77bb41 100644 --- a/media/lua/shared/NPCs/ExtraBodyLocations.lua +++ b/media/lua/shared/NPCs/ExtraBodyLocations.lua @@ -13,11 +13,14 @@ end addBodyLocationBefore("TOC_ArmRight", "Shoes") addBodyLocationBefore("TOC_ArmLeft", "Shoes") -addBodyLocationBefore("TOC_LegRight", "Shoes") -addBodyLocationBefore("TOC_LegLeft", "Shoes") + addBodyLocationBefore("TOC_ArmRightProsthesis", "Shoes") addBodyLocationBefore("TOC_ArmLeftProsthesis", "Shoes") -addBodyLocationBefore("TOC_LegRightProsthesis", "Shoes") -addBodyLocationBefore("TOC_LegLeftProsthesis", "Shoes") +addBodyLocationBefore("TOC_LegRight", "FannyPackFront") +addBodyLocationBefore("TOC_LegLeft", "FannyPackFront") + + +addBodyLocationBefore("TOC_LegRightProsthesis", "FannyPackFront") +addBodyLocationBefore("TOC_LegLeftProsthesis", "FannyPackFront") diff --git a/media/models_X/Amputation/Amputation_GenericModel.fbx b/media/models_X/Amputation/Amputation_GenericModel.fbx new file mode 100644 index 0000000000000000000000000000000000000000..9c315efec8ba19ee058d97a358c703ee090ed8b4 GIT binary patch literal 116252 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 literal 0 HcmV?d00001 diff --git a/media/scripts/TOC_items.txt b/media/scripts/TOC_items.txt index b9ecf7e..8cda691 100644 --- a/media/scripts/TOC_items.txt +++ b/media/scripts/TOC_items.txt @@ -481,18 +481,46 @@ item Surgery_Right_Tourniquet item Amputation_Left_Foot { - Weight = 1, + Type = Clothing, - DisplayCategory = Test, - DisplayName = amp test foot, + DisplayName = Amputated Left Foot, + ClothingItem = Amputation_Left_Foot, BodyLocation = TOC_LegLeft, - BloodLocation = Hands, - Icon = woodenHook, - Tooltip = test, - CanHaveHoles = false, - } + Weight = 0, + CombatSpeedModifier = 0.9, + BloodLocation = Hands;LowerArms, + + Insulation = 1.0, + WindResistance = 1.0, + WaterResistance = 1.0, + Icon = genericAmputation, + CanHaveHoles = false, + + + } +item Amputation_Right_Foot + { + + Type = Clothing, + DisplayName = Amputated Right Foot, + + ClothingItem = Amputation_Right_Foot, + BodyLocation = TOC_LegRight, + + Weight = 0, + CombatSpeedModifier = 0.9, + BloodLocation = Hands;LowerArms, + + Insulation = 1.0, + WindResistance = 1.0, + WaterResistance = 1.0, + Icon = genericAmputation, + CanHaveHoles = false, + + + } } diff --git a/media/ui/TOC/Left_Foot/Base.png b/media/ui/TOC/Left_Foot/Base.png new file mode 100644 index 0000000000000000000000000000000000000000..b89e95b5b31487964d13a39858a7f8859402a954 GIT binary patch literal 4411 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 Duvo@t literal 0 HcmV?d00001 diff --git a/media/ui/TOC/Left_Foot/Cut.png b/media/ui/TOC/Left_Foot/Cut.png new file mode 100644 index 0000000000000000000000000000000000000000..9240f932f032a4dce9542b3f4e279d47387ad3ee GIT binary patch literal 282 zcmV+#0pst6wgP@yglcf-JPeZOhk0nyh}uKs-!gwu5^DQrF8mEDdqCI zk?tcb(S9c)iDJ5>rNgI7TKIoS??}Ab;jY8{&b;>Eisb8J@GacwR#on0J%_ZF+q1hD zt+fs*188@P2#W~36ri`DZP88?5#1q@yA1%s!zFi{9h8FQIOF&^03sw&gd~cPL=loG gLJ~ztqF6%m39#cbL=$V6%m4rY07*qoM6N<$f|uTO(*OVf literal 0 HcmV?d00001 diff --git a/media/ui/TOC/Left_Foot/Hook.png b/media/ui/TOC/Left_Foot/Hook.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d0df45863054a406fca7ad6b43e300d2e9c086 GIT binary patch literal 683 zcmV;c0#yBpP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGWL;wH+L;-%H5tsk~0zgSbK~z{r?Uu`K z+CUVB#}^!PCl_^-Cy2W0o(=EQ7w98(4G~)etg^_myGrRMQWg<+yR^RK|D8#cKnw#O zl1lX_jb`S67a3#w?kMKP2N^aMHIA1QOa!%z? zB7ZR5xWm6d%(aX?gBXRm82s?)GqwqB#k~r;`ySWeiQJ}fiSZR@=gs5xZ4Q?1Mx$|x z$%oLSiSRY__yfTHH>U3x-*8_3N`f0Wn3FGAZH`^Pf^u?la&mHVa{fnzcmTtb`_NqM R3ylB(002ovPDHLkV1iU0Ieq{D literal 0 HcmV?d00001 diff --git a/media/ui/TOC/Left_Foot/MetalHand.png b/media/ui/TOC/Left_Foot/MetalHand.png new file mode 100644 index 0000000000000000000000000000000000000000..3094308f8ff1f0ed0e3c2760e0cef6659b795eff GIT binary patch literal 724 zcmV;_0xSKAP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGWL;wH+L;-%H5tsk~0%=J^K~z{r?UuW4 z!axv37tBL|cr;N`<=gTz`J6O}22s*cZ%JijKA#6PdB>HRcDtSFJ!PJ=@W!(h`jCjjUy)hlcszdQ&>5LUmP(};4y}Y? z7-exYb4`LY0rVjl!QpVI?DzY-N~JRIbUItUok}hu!6l))-A>hNHC`RLWi#cmaRjR~ zz4HA?c|Qexn%^UST!0A6-AMbDcz`3y{=ZPItDg(b90hkP%D?q zfxMJrJs=7xhp2kJuBbL4HXz~4?RI-W&C<1Kxm-^5g9&nTQh=inh2i_Yc2Go$c&smx zbTrSJJV8R$VzE%YUQY`nxAgT^tEHU<5E37_M)y82)ALW51t(6T&cr#S7c)|dbbFqs z*Gabou5G0MvD@wH^gD49&Or>)iuwbRYFXP5@sr8qRbL>SI0=D45NJV&0bGQeg3U=2 zPMm}|)Lx>2uXqMWTd%~KNVo*99j>}XSI3da8Vc38x|f^~!q^8p+=$UYp`7Hkh1}OgI+_A(Zkd zj%_wKN23uA$aX9LlEGjQ_51xbFEwdBvY?=#prD{2hEhLXYck)+7r>VQ0000*7-nm{#aO`0~Hq2BameIo*WbjbmD}ADqlnP(N@a?ZT0?3rEr}97($v2+5y0o1`@<=QYXz O0000B=OwK$|xJ#g7+S}cOmD`VY7w?W4 zb@HQu!4N-ilA1IPM^W%2P!lb4N-brQ5FK@t($UlezZy!Lw717`qmAX{&b)o^?fbpo z|NFny({rc9$0o&UG@5uvjy)gDsbHkUM1wb#*;N3h;bKmatkH~qNgY~8{)^W&nxTEH zt57L)P9rFR)04E|Ve|n`1Za&Wb7DXwsd7evJWMIe+u&>MU%?Pd+u)h$PRuE0Gi7W} zrNk6e=DMiLa>`1>6DL5K0Rj+kj6y;I&d19{zy^nS39wc_qc9YLDCIUdOBDzeI;TU~ zg2X@;J&sTqhCvpq-rzB(lNReM5RTzEikVS^5iwW@lbJA>pzs3&aT4t%^6jsMg@K(7 zE>jedKvBQnulF1Ef>eqctX3MFv z|3V!(en0^5t4PdmxKW=DrOae`TJX!M_g!G@q{7%>5H%x$;Rt4S;W%M55x6xCGY}Xy z0Cfs9>kU2(Y64Kh15l7NG^vn}1k)7Z6(o)X2D2Pl%Ag`&3PTY$64`=Jkbq#IoiU_^ z(@8jZSs{6faoBAzuvyQtG{Ja1l+}oN5j+DoARdd!gk(?|83=8{J*3f!V-~Y{@V;H3 zD%8jh-lzZP{XB^UrA7K4n@24;H6@4~RtCWehAX0gc{jZBu}~-r2$E8>+Xho=SQ#1) ze`X)s0|T`FG6srXhm@uY4 zH?8_P(}rO&e=J=&|E&{l&6@gSlZsDvuIV^`Jo>`L;DnUeocLYbY3xwnKJ8+6B9G;F ztXOs@<(J^x+BZibo5x;jTd^$tnYe{L{a?;RdY31;hMY2R>uUE5FPf@bOT{*619z?a z^<#HN-_R(1V@|%^xUPL=Vs8>!RnnIH*&ETfxAk9d*e$M_xL|1A2j^mrw&--lC)|}} zK__?kr~2(14r*(@@SXn}8HP5-xLT|CxVOwmYEGE)-Ri1KHv(Hr=2>^|?KyknTx09F zo&C3tCGS3(cjdQp?orpO3|sQ{m1pkx_)gsSsfUVdTf5gEf9fBTo zK3Nj%n7ShNqq?OdS0%$uF7tROaP{ovO9$LjUg+%nd0Wfq#*(?;G|cJQG-6}s<S6~*VZ0~&#ygJ wy-&LyiNF11zwTbsnYwjX-yg$_)7~Dkx$EYPsI6kM`kQl1&b7C^`p*2n0f7yklmGw# literal 0 HcmV?d00001 diff --git a/media/ui/TOC/Right_Foot/Bite.png b/media/ui/TOC/Right_Foot/Bite.png new file mode 100644 index 0000000000000000000000000000000000000000..3ec68374063789b106dd796df7c532006b073ea8 GIT binary patch literal 671 zcmeAS@N?(olHy`uVBq!ia0vp^nn0|({$>?aEV9+Uwx3 zb?eqOYu0Sqv}wnV9Y(^!8#Zj%y?giX-@mtQ+Xl3=_SLr(Af;LolO*l0D7*&)5S5w!vF1**y`B^JguoGr%hSI6`6U-(LTfa|Nr|D z6E!mDCvLm@b=h;KGY@NfYEqcL@;f>$h-rBAbCqhRWJE~GW?uCz3iWp+o^4Wole3-w z{SwxnpRb)+GJUSn^mlqO*PGT{^JLU+pLCF2^^O?l%3uXeo*0$ct#=h9jTnEp>O{Zf zJsdyjM8le#1234*h-}vLEOioHs1W>4!sq-}y_3quB5p_K?TSuN5S#Z`HS*wty33O% z_|N>df0KH_jJKa}pP#hz059L;fP^?cmD%rkC)JwCxh+XFsVR6I_;#hI-QurveE4T4 zHuQhzy;N*;R#@y|U~oll(Amk4P70`9NS@*QNn>TQOnc_1H6~}&Uh<|MJ1GACN&K&O zr|wm@`&liuTkV-Q*|Xt9vESxdDX!~{r|7qC^Gx6p(2ve+T@uIaGUdaqC*Hg2WHq>Q zCr`c79CZKuo8SL))=v2SheIyh|i-ho|Vf*G(<4 q{Zse$|HZ}2_MQBHF?`b2eaw3dcZUBL-^vJ#CPP`S^bdY3^N$bQ10aTm;nhyY2jtTIp*EDlok5XQa_(gGAw0ZIYc z_Zd|FGcZ6HKoTejlm&~(-$Q7D*roaaWD$t{kU z0BHn@LtO<{paQfDj8q;nsPAX6zt1550OUcC^MLAs=Gy!FM^d zZ;F_nag6x$`}gnnAGh{TyT__|OUU@oj~~B3eEN3!(uau)U&WQ4^ol=g8wzyE&&SU` z&RzAktm~O&*h7A!-`{`y`SJ75m#?4ZuYDw8^?*xv?aGzkj-Pv5)AzQb`(6E{*BN!| zmao_}bMCh8Nv~px@3Uw;VAb4R+4BGYe|a_0$-szAEeY}qX5eK_(QxB?b*)VJ>zf~6 zs@Xq1`}6OK_P4*kd}hm)Gi!3v#MG2RmOX#+?5X&MO@cv@ z5mSO=0)kGRJ9x4+JTaIGSY&<@iDXTT zJQmX zP*E4dMAlh0hYQ#lw&tyr%?)FK#IZ0z{ptFz)07?EX2sr u%GlJ(z);)3z{VZN@o-U3d z7N?UFB=Q;r55_cW2{$d9)R|#Cvp}+wF(ROX(clUO_QmvAUQh^kMk%5u1u7Q!Rfmw)=p_Q?zm4Ugofq|8Q!IV%f7ZeS- b`6-!cmAExL<(TvXsDZ)L)z4*}Q$iB}7Q<<@ literal 0 HcmV?d00001 diff --git a/media/ui/TOC/Right_Foot/Hook.png b/media/ui/TOC/Right_Foot/Hook.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d0df45863054a406fca7ad6b43e300d2e9c086 GIT binary patch literal 683 zcmV;c0#yBpP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGWL;wH+L;-%H5tsk~0zgSbK~z{r?Uu`K z+CUVB#}^!PCl_^-Cy2W0o(=EQ7w98(4G~)etg^_myGrRMQWg<+yR^RK|D8#cKnw#O zl1lX_jb`S67a3#w?kMKP2N^aMHIA1QOa!%z? zB7ZR5xWm6d%(aX?gBXRm82s?)GqwqB#k~r;`ySWeiQJ}fiSZR@=gs5xZ4Q?1Mx$|x z$%oLSiSRY__yfTHH>U3x-*8_3N`f0Wn3FGAZH`^Pf^u?la&mHVa{fnzcmTtb`_NqM R3ylB(002ovPDHLkV1iU0Ieq{D literal 0 HcmV?d00001 diff --git a/media/ui/TOC/Right_Foot/MetalHand.png b/media/ui/TOC/Right_Foot/MetalHand.png new file mode 100644 index 0000000000000000000000000000000000000000..3094308f8ff1f0ed0e3c2760e0cef6659b795eff GIT binary patch literal 724 zcmV;_0xSKAP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGWL;wH+L;-%H5tsk~0%=J^K~z{r?UuW4 z!axv37tBL|cr;N`<=gTz`J6O}22s*cZ%JijKA#6PdB>HRcDtSFJ!PJ=@W!(h`jCjjUy)hlcszdQ&>5LUmP(};4y}Y? z7-exYb4`LY0rVjl!QpVI?DzY-N~JRIbUItUok}hu!6l))-A>hNHC`RLWi#cmaRjR~ zz4HA?c|Qexn%^UST!0A6-AMbDcz`3y{=ZPItDg(b90hkP%D?q zfxMJrJs=7xhp2kJuBbL4HXz~4?RI-W&C<1Kxm-^5g9&nTQh=inh2i_Yc2Go$c&smx zbTrSJJV8R$VzE%YUQY`nxAgT^tEHU<5E37_M)y82)ALW51t(6T&cr#S7c)|dbbFqs z*Gabou5G0MvD@wH^gD49&Or>)iuwbRYFXP5@sr8qRbL>SI0=D45NJV&0bGQeg3U=2 zPMm}|)Lx>2uXqMWTd%~KNVo*99j>}XSI3da8Vc38x|f^~!q^8p+=$UYp`7Hkh1}OgI+_A(Zkd zj%_wKN23uA$aX9LlEGjQ_51xbFEwdBvY?=#prD{2hEhLXYck)+7r>VQ0000_=f}^T^_|B9Q!i_{URAXJ{r$(US8uToU9L%)sQ#{A8gH`sfb0#)XWggQr*S`aW_ISEDhFF|VPLMcuKteRYd8whNmTy8sm6k7? z&(e<$t4$mOGf#QU@d`FB=Jr0MwRX+foSe6BX3qGydP`A3Nl{s0X>wv}^6|BoPTf6x z`Sk7M*ZZ3%ch7DYU;g$VW256i#f6CvYyL1bIUTb2D<>!^Dl054uCJt}c1}g{WS_TU zzEe_Ak=LpzTYA>a*`uQT&LchCBRC`|EHE_qdP3Uq+3h!4O}1_+E%|zbGu^zF*_l(h zY*CS#vhiUJ307e0t7LSYGULj=N}xYfOI#yLQW8s2t&)pUffR$0fswJUfsw9(S%{IL um9eRnp^>(Mft7&)*KyWb6b-rgDVb@NxHVMI+ItYFfx*+&&t;ucLK6UOeoA2g literal 0 HcmV?d00001 From 1117268b3f67c6e5e8c307ef65004499b96a9791 Mon Sep 17 00:00:00 2001 From: Pao Date: Mon, 6 Feb 2023 23:42:49 +0100 Subject: [PATCH 09/22] test --- media/scripts/TOC_items.txt | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/media/scripts/TOC_items.txt b/media/scripts/TOC_items.txt index 8cda691..50e0cbe 100644 --- a/media/scripts/TOC_items.txt +++ b/media/scripts/TOC_items.txt @@ -481,17 +481,13 @@ item Surgery_Right_Tourniquet item Amputation_Left_Foot { - Type = Clothing, DisplayName = Amputated Left Foot, - ClothingItem = Amputation_Left_Foot, BodyLocation = TOC_LegLeft, - Weight = 0, CombatSpeedModifier = 0.9, - BloodLocation = Hands;LowerArms, - + BloodLocation = Feet, Insulation = 1.0, WindResistance = 1.0, WaterResistance = 1.0, @@ -500,19 +496,16 @@ item Amputation_Left_Foot } + item Amputation_Right_Foot { - Type = Clothing, DisplayName = Amputated Right Foot, - ClothingItem = Amputation_Right_Foot, BodyLocation = TOC_LegRight, - Weight = 0, CombatSpeedModifier = 0.9, - BloodLocation = Hands;LowerArms, - + BloodLocation = Feet, Insulation = 1.0, WindResistance = 1.0, WaterResistance = 1.0, From 2f797990a92fb954968a83a46dceb356d908c1af Mon Sep 17 00:00:00 2001 From: Pao Date: Mon, 6 Feb 2023 23:51:31 +0100 Subject: [PATCH 10/22] Working Feet amputation --- .../clothingItems/Amputation_Left_Foot.xml | 2 +- .../clothingItems/Amputation_Right_Foot.xml | 2 +- media/fileGuidTable.xml | 6 +- .../lua/client/ActionsMethods/TOC_CutLimb.lua | 5 +- media/lua/client/TOC_Debug.lua | 5 ++ media/scripts/TOC_items.txt | 64 +++++++++--------- media/ui/TOC/Left_Foot/Base.png | Bin 4411 -> 1859 bytes media/ui/TOC/Left_Foot/Bleed.png | Bin 981 -> 1216 bytes media/ui/TOC/Left_Foot/Cut.png | Bin 282 -> 381 bytes media/ui/TOC/Left_Foot/Operate.png | Bin 680 -> 843 bytes media/ui/TOC/Right_Foot/Base.png | Bin 1859 -> 4411 bytes media/ui/TOC/Right_Foot/Bleed.png | Bin 1216 -> 981 bytes media/ui/TOC/Right_Foot/Cut.png | Bin 381 -> 282 bytes media/ui/TOC/Right_Foot/Operate.png | Bin 843 -> 680 bytes 14 files changed, 47 insertions(+), 37 deletions(-) diff --git a/media/clothing/clothingItems/Amputation_Left_Foot.xml b/media/clothing/clothingItems/Amputation_Left_Foot.xml index e17173a..a1d237b 100644 --- a/media/clothing/clothingItems/Amputation_Left_Foot.xml +++ b/media/clothing/clothingItems/Amputation_Left_Foot.xml @@ -2,7 +2,7 @@ Amputation\Amputation_GenericModel Amputation\Amputation_GenericModel - 45c0b872-bdf1-466f-b810-c7783171bda1 + 506c0fc0-b50c-4667-bafa-ae22e3c2c0dc false false false diff --git a/media/clothing/clothingItems/Amputation_Right_Foot.xml b/media/clothing/clothingItems/Amputation_Right_Foot.xml index 20f2145..af3f9dc 100644 --- a/media/clothing/clothingItems/Amputation_Right_Foot.xml +++ b/media/clothing/clothingItems/Amputation_Right_Foot.xml @@ -2,7 +2,7 @@ Amputation\Amputation_GenericModel Amputation\Amputation_GenericModel - d6576bb2-f5f1-4cb6-a17e-aab131214e4b + 2600c2ab-bfeb-49c3-b0b5-e21c6d83d5c2 false false false diff --git a/media/fileGuidTable.xml b/media/fileGuidTable.xml index 22cccb7..a829229 100644 --- a/media/fileGuidTable.xml +++ b/media/fileGuidTable.xml @@ -88,12 +88,12 @@ media/clothing/clothingItems/Amputation_Left_Foot.xml - 45c0b872-bdf1-466f-b810-c7783171bda1 + 506c0fc0-b50c-4667-bafa-ae22e3c2c0dc - media/clothing/clothingItems/Amputation_Left_Foot.xml - d6576bb2-f5f1-4cb6-a17e-aab131214e4b + media/clothing/clothingItems/Amputation_Right_Foot.xml + 2600c2ab-bfeb-49c3-b0b5-e21c6d83d5c2 \ No newline at end of file diff --git a/media/lua/client/ActionsMethods/TOC_CutLimb.lua b/media/lua/client/ActionsMethods/TOC_CutLimb.lua index ebf67ec..8eb95b4 100644 --- a/media/lua/client/ActionsMethods/TOC_CutLimb.lua +++ b/media/lua/client/ActionsMethods/TOC_CutLimb.lua @@ -243,7 +243,6 @@ function TocCutLimb(part_name, surgeon_factor, bandage_table, painkiller_table) local amputation_clothing_item_name = TocFindAmputatedClothingFromPartName(part_name) print(amputation_clothing_item_name) - local amputation_clothing_item = player:getInventory():AddItem(amputation_clothing_item_name) TocSetCorrectTextureForAmputation(amputation_clothing_item, player, false) player:setWornItem(amputation_clothing_item:getBodyLocation(), amputation_clothing_item) @@ -251,6 +250,10 @@ function TocCutLimb(part_name, surgeon_factor, bandage_table, painkiller_table) -- Set blood on the amputated limb TocSetBloodOnAmputation(getPlayer(), adiacent_body_part) + + if part_name == "Left_Foot" or part_name == "Right_Foot" then + SetMissingFootAnimation(true) + end end end diff --git a/media/lua/client/TOC_Debug.lua b/media/lua/client/TOC_Debug.lua index 49f3c23..3979a77 100644 --- a/media/lua/client/TOC_Debug.lua +++ b/media/lua/client/TOC_Debug.lua @@ -74,6 +74,11 @@ function TocResetEverything() end end + + + -- Reset special flag for legs amputations + SetMissingFootAnimation(false) + end diff --git a/media/scripts/TOC_items.txt b/media/scripts/TOC_items.txt index 50e0cbe..cbc76e9 100644 --- a/media/scripts/TOC_items.txt +++ b/media/scripts/TOC_items.txt @@ -480,40 +480,42 @@ item Surgery_Right_Tourniquet } item Amputation_Left_Foot - { - Type = Clothing, - DisplayName = Amputated Left Foot, - ClothingItem = Amputation_Left_Foot, - BodyLocation = TOC_LegLeft, - Weight = 0, - CombatSpeedModifier = 0.9, - BloodLocation = Feet, - Insulation = 1.0, - WindResistance = 1.0, - WaterResistance = 1.0, - Icon = genericAmputation, - CanHaveHoles = false, + { + Type = Clothing, + DisplayName = Amputated Left Foot, + + ClothingItem = Amputation_Left_Foot, + BodyLocation = TOC_LegLeft, + + Weight = 0, + CombatSpeedModifier = 0.9, + BloodLocation = Hands;LowerArms, + + Insulation = 1.0, + WindResistance = 1.0, + WaterResistance = 1.0, + Icon = genericAmputation, + CanHaveHoles = false, + } - - } - item Amputation_Right_Foot - { - Type = Clothing, - DisplayName = Amputated Right Foot, - ClothingItem = Amputation_Right_Foot, - BodyLocation = TOC_LegRight, - Weight = 0, - CombatSpeedModifier = 0.9, - BloodLocation = Feet, - Insulation = 1.0, - WindResistance = 1.0, - WaterResistance = 1.0, - Icon = genericAmputation, - CanHaveHoles = false, + { + Type = Clothing, + DisplayName = Amputated Right Foot, - - } + ClothingItem = Amputation_Right_Foot, + BodyLocation = TOC_LegRight, + + Weight = 0, + CombatSpeedModifier = 0.9, + BloodLocation = Hands;LowerArms, + + Insulation = 1.0, + WindResistance = 1.0, + WaterResistance = 1.0, + Icon = genericAmputation, + CanHaveHoles = false, + } } diff --git a/media/ui/TOC/Left_Foot/Base.png b/media/ui/TOC/Left_Foot/Base.png index b89e95b5b31487964d13a39858a7f8859402a954..373ca1760639c20ae380b155a96ce9029f98ed56 100644 GIT binary patch delta 795 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 VS+N#$i68$63{ls03z4>u{{?N^blU&` diff --git a/media/ui/TOC/Left_Foot/Bleed.png b/media/ui/TOC/Left_Foot/Bleed.png index 2961263a3365d2be7d4be16ca72a8e776cf535c3..639d9b7eecf27f134f7fdb28585a2f4e7ff8d5b8 100644 GIT binary patch literal 1216 zcmeAS@N?(olHy`uVBq!ia0vp^nn0|PP`S^bdY3^N$bQ10aTm;nhyY2jtTIp*EDlok5XQa_(gGAw0ZIYc z_Zd|FGcZ6HKoTejlm&~(-$Q7D*roaaWD$t{kU z0BHn@LtO<{paQfDj8q;nsPAX6zt1550OUcC^MLAs=Gy!FM^d zZ;F_nag6x$`}gnnAGh{TyT__|OUU@oj~~B3eEN3!(uau)U&WQ4^ol=g8wzyE&&SU` z&RzAktm~O&*h7A!-`{`y`SJ75m#?4ZuYDw8^?*xv?aGzkj-Pv5)AzQb`(6E{*BN!| zmao_}bMCh8Nv~px@3Uw;VAb4R+4BGYe|a_0$-szAEeY}qX5eK_(QxB?b*)VJ>zf~6 zs@Xq1`}6OK_P4*kd}hm)Gi!3v#MG2RmOX#+?5X&MO@cv@ z5mSO=0)kGRJ9x4+JTaIGSY&<@iDXTT zJQmX zP*E4dMAlh0hYQ#lw&tyr%?)FK#IZ0z{ptFz)07?EX2sr u%GlJ(z);)3z{3DpOX8Gi-<003h=(^CKd010qNS#tmY0#5({0#5<=kvNb500W0fL_t(o zh3%M2XcIvg$A7cQW}DU&?Mp?}R$6=@h$twcpdz9OQly^6n_fKY!HXcC1dm=7K@SD1 zh#(>=B2u9~P<)sAwpv@YHBGn4?s%BlCdM|qn?!4&e^@rNJAX6#+yD2?BP*no{O>X* z8z6|LANdxT}G+{hL-@Nj&PN;qq;)-hS+P_1N`h$gYCR z*U20QYk_^hiQ4O3eZqASj*DxV7llR34dXyAJj=p10DjZ0NWfG><8i^<5bpN z?WC!$fn>Ua*t(UNEscnZ7(~mn>IUtl8Q8A@0b)Q6;D6TKdhiLTNy2FA!nK6CtQl*= zYNCr9so1)n$lQj12Du8Dop(*3(q)b=Tkek`*S>S#9)0*UZd4}_Muf`U+kSIYN{NU@ z$_^<|`6%HI zttdzX$bSGofy6j%BrpJc1nPkX4Icxx{5*Nq0USUGGipjHabABQzG5Mn>MAnTRro1r zxIMR=oHi2W+y`Jp!_6k^vNv;hWhv7c7jTnjF1}cLhBrX!)uBDRfC}A5NsxmY&_acE zNOv4X<>ZLI@4ZAypS{V`OG2rkTTp{B(tPaHIe%al@Tn9?7q|;_0-H6!TOh3;J_}d? zjOub4=tH^clFeJ84+rJ40VIJp6mT&pqy)NwBR~(Z29ch+d9|Z28^1UQTQ0{aA?}6pOe4q)~rpsQ=eg@71k5M_g6KEtm@(m511fBz@fm^!& zl7AsVIrI_eMLBo?wb6(HHp=beKszuDR05ZPMY^r6>(0BaX_i;rwVZN@o-U3d z7N?UFB=Q;r55_cW2{$d9)R|#Cvp}+wF(ROX(clUO_QmvAUQh^kMk%5u1u7Q!Rfmw)=p_Q?zm4Ugofq|8Q!IV%f7ZeS- b`6-!cmAExL<(TvXsDZ)L)z4*}Q$iB}7Q<<@ delta 266 zcmV+l0rmd<0-6Gl8Gi-<003h=(^CKd010qNS#tmY0#5({0#5<=kvNb5007KML_t(o zh3%L<4#OY}M(xT6WbiQ=I3N<88j&hh9Ot8y%5Tb$z>|M43b)qi*Llnqun>|cmXH+B zN6frE=bYW0r>aaubk@8}L~^R6H4CnEeekUS{V!EWI!>3DH z__=f}^T^_|B9Q!i_{URAXJ{r$(US8uToU9L%)sQ#{A8gH`sfb0#)XWggQr*S`aW_ISEDhFF|VPLMcuKteRYd8whNmTy8sm6k7? z&(e<$t4$mOGf#QU@d`FB=Jr0MwRX+foSe6BX3qGydP`A3Nl{s0X>wv}^6|BoPTf6x z`Sk7M*ZZ3%ch7DYU;g$VW256i#f6CvYyL1bIUTb2D<>!^Dl054uCJt}c1}g{WS_TU zzEe_Ak=LpzTYA>a*`uQT&LchCBRC`|EHE_qdP3Uq+3h!4O}1_+E%|zbGu^zF*_l(h zY*CS#vhiUJ307e0t7LSYGULj=N}xYfOI#yLQW8s2t&)pUffR$0fswJUfsw9(S%{IL um9eRnp^>(Mft7&)*KyWb6b-rgDVb@NxHVMI+ItYFfx*+&&t;ucLK6UOeoA2g delta 667 zcmV;M0%ZNm2B-y)8Gi-<003h=(^CKd010qNS#tmY0#5({0#5<=kvNb500LS`L_t(o zh3%J1YZFlvfWMnN(?^;>HEB(nHl3t-5NlefR6#e2uEa$a`33$9!JTgX3xaN&MUXBP z1nE++g(4=9n2IHq`cAbiNybGiG%?YcVI-!^2g5LM=gh}B_kY}bN9elF|BkEQ0!DBo z?P4G#6|*l0A=;jExt!(B%Vx7}!Fo0EKxDG7l18gwy4-&vlga#bOg^7C9oH#$H;iPv z6DN~)(RWEB9o~0IBb-dhGV!C!m0MY{v?ZGDa7&B%`hz>VyYvpv>k9j!N$Q?a=-AWk z#EPU`ymjyT_kYOLljiUcwUox!g&04yAk-TmUA7Bbk!%9*-R12^z_ro0)sT0yMBv6% z_E<$tCs4vu2=5p|k+uk1k<@`Aa39!^d;3?$3R|gfg@@xxeAcJNHI(@nY9fN138F-% zk!Sn}_ee|Fg0$5G#sRPalz^weGO$!HR?_uiB_vx4K)!#JsU&L zhH!b^ZNbXKiBRnMF=6&^@r_9Q76VWLKac|Efg}(Gre(l?j;4;wH;xjWL0w2Pw4CNy zb&JDOUUXIAeD<~g(DXvrZ`yHG(}6=^8>j-$fzv=3m}^vb=YV8m=R>^t@$Lrd6G;n9igSf--SKLuswUDi8n?z!GqYR>pn6r=6RZqm!#^b3j?s z3teR_Ngl_b@R78e)-+fIF8sRh0(XJ+eiHyBG+`pA&^u diff --git a/media/ui/TOC/Right_Foot/Base.png b/media/ui/TOC/Right_Foot/Base.png index 373ca1760639c20ae380b155a96ce9029f98ed56..b89e95b5b31487964d13a39858a7f8859402a954 100644 GIT binary patch delta 3409 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 VS+N#$i68$63{ls03z4>u{{?N^blU&` delta 795 zcmdn3beL~~q#_#w14FXSO>_%)lU~3c`$@K`I{@7+BtI&gD*JVl_6gGP0a} zomY+31jsU+%*3YwW$E)7Ga66s;geBGO-o9)G&V@nHL@@=)J-xsG10Y1wy@AmF)>O? zG`2J{FgG)se1=$sJp3xenHa(!Mx4TP{4!8~yyu@;pHn_Rg@J+bx2KC^NJQ(~8F%xV z4R~7LX7aOX_4~5qKfC)TBkic=t5nw^I5Yaa+}v zgt7hH`0c~2T?I4kn^`9GKH|8rPEauFdT3Q*@WtHI52kKfah$PxXMN7&gSzbcOF2Te zbnXdVA1Jk!-~HtLju#&*HpJCi?%I3*-p5Bvx5#h*_W6q1t_%LJzB~#QecxfY-v2k1doN!c3w2k#c=6%Jbz)27>W<8+y}z1grOivth33~k7yO%6h6Ta iZ=~B~Qso(cGOxM(DUfwTff_LVGkCiCxvX3DpOX8Gi-<003h=(^CKd010qNS#tmY0#5({0#5<=kvNb500W0fL_t(o zh3%M2XcIvg$A7cQW}DU&?Mp?}R$6=@h$twcpdz9OQly^6n_fKY!HXcC1dm=7K@SD1 zh#(>=B2u9~P<)sAwpv@YHBGn4?s%BlCdM|qn?!4&e^@rNJAX6#+yD2?BP*no{O>X* z8z6|LANdxT}G+{hL-@Nj&PN;qq;)-hS+P_1N`h$gYCR z*U20QYk_^hiQ4O3eZqASj*DxV7llR34dXyAJj=p10DjZ0NWfG><8i^<5bpN z?WC!$fn>Ua*t(UNEscnZ7(~mn>IUtl8Q8A@0b)Q6;D6TKdhiLTNy2FA!nK6CtQl*= zYNCr9so1)n$lQj12Du8Dop(*3(q)b=Tkek`*S>S#9)0*UZd4}_Muf`U+kSIYN{NU@ z$_^<|`6%HI zttdzX$bSGofy6j%BrpJc1nPkX4Icxx{5*Nq0USUGGipjHabABQzG5Mn>MAnTRro1r zxIMR=oHi2W+y`Jp!_6k^vNv;hWhv7c7jTnjF1}cLhBrX!)uBDRfC}A5NsxmY&_acE zNOv4X<>ZLI@4ZAypS{V`OG2rkTTp{B(tPaHIe%al@Tn9?7q|;_0-H6!TOh3;J_}d? zjOub4=tH^clFeJ84+rJ40VIJp6mT&pqy)NwBR~(Z29ch+d9|Z28^1UQTQ0{aA?}6pOe4q)~rpsQ=eg@71k5M_g6KEtm@(m511fBz@fm^!& zl7AsVIrI_eMLBo?wb6(HHp=beKszuDR05ZPMY^r6>(0BaX_i;rwPP`S^bdY3^N$bQ10aTm;nhyY2jtTIp*EDlok5XQa_(gGAw0ZIYc z_Zd|FGcZ6HKoTejlm&~(-$Q7D*roaaWD$t{kU z0BHn@LtO<{paQfDj8q;nsPAX6zt1550OUcC^MLAs=Gy!FM^d zZ;F_nag6x$`}gnnAGh{TyT__|OUU@oj~~B3eEN3!(uau)U&WQ4^ol=g8wzyE&&SU` z&RzAktm~O&*h7A!-`{`y`SJ75m#?4ZuYDw8^?*xv?aGzkj-Pv5)AzQb`(6E{*BN!| zmao_}bMCh8Nv~px@3Uw;VAb4R+4BGYe|a_0$-szAEeY}qX5eK_(QxB?b*)VJ>zf~6 zs@Xq1`}6OK_P4*kd}hm)Gi!3v#MG2RmOX#+?5X&MO@cv@ z5mSO=0)kGRJ9x4+JTaIGSY&<@iDXTT zJQmX zP*E4dMAlh0hYQ#lw&tyr%?)FK#IZ0z{ptFz)07?EX2sr u%GlJ(z);)3z{|M43b)qi*Llnqun>|cmXH+B zN6frE=bYW0r>aaubk@8}L~^R6H4CnEeekUS{V!EWI!>3DH z_VZN@o-U3d z7N?UFB=Q;r55_cW2{$d9)R|#Cvp}+wF(ROX(clUO_QmvAUQh^kMk%5u1u7Q!Rfmw)=p_Q?zm4Ugofq|8Q!IV%f7ZeS- b`6-!cmAExL<(TvXsDZ)L)z4*}Q$iB}7Q<<@ diff --git a/media/ui/TOC/Right_Foot/Operate.png b/media/ui/TOC/Right_Foot/Operate.png index e6209adfc106bcc7f2b686f82fd288110e555873..6f3eead342649debcd0be2ce8b0cd9da181df1d9 100644 GIT binary patch delta 667 zcmV;M0%ZNm2B-y)8Gi-<003h=(^CKd010qNS#tmY0#5({0#5<=kvNb500LS`L_t(o zh3%J1YZFlvfWMnN(?^;>HEB(nHl3t-5NlefR6#e2uEa$a`33$9!JTgX3xaN&MUXBP z1nE++g(4=9n2IHq`cAbiNybGiG%?YcVI-!^2g5LM=gh}B_kY}bN9elF|BkEQ0!DBo z?P4G#6|*l0A=;jExt!(B%Vx7}!Fo0EKxDG7l18gwy4-&vlga#bOg^7C9oH#$H;iPv z6DN~)(RWEB9o~0IBb-dhGV!C!m0MY{v?ZGDa7&B%`hz>VyYvpv>k9j!N$Q?a=-AWk z#EPU`ymjyT_kYOLljiUcwUox!g&04yAk-TmUA7Bbk!%9*-R12^z_ro0)sT0yMBv6% z_E<$tCs4vu2=5p|k+uk1k<@`Aa39!^d;3?$3R|gfg@@xxeAcJNHI(@nY9fN138F-% zk!Sn}_ee|Fg0$5G#sRPalz^weGO$!HR?_uiB_vx4K)!#JsU&L zhH!b^ZNbXKiBRnMF=6&^@r_9Q76VWLKac|Efg}(Gre(l?j;4;wH;xjWL0w2Pw4CNy zb&JDOUUXIAeD<~g(DXvrZ`yHG(}6=^8>j-$fzv=3m}^vb=YV8m=R>^t@$Lrd6G;n9igSf--SKLuswUDi8n?z!GqYR>pn6r=6RZqm!#^b3j?s z3teR_Ngl_b@R78e)-+fIF8sRh0(XJ+eiHyBG+`pA&^u literal 843 zcmeAS@N?(olHy`uVBq!ia0vp^nn0|_=f}^T^_|B9Q!i_{URAXJ{r$(US8uToU9L%)sQ#{A8gH`sfb0#)XWggQr*S`aW_ISEDhFF|VPLMcuKteRYd8whNmTy8sm6k7? z&(e<$t4$mOGf#QU@d`FB=Jr0MwRX+foSe6BX3qGydP`A3Nl{s0X>wv}^6|BoPTf6x z`Sk7M*ZZ3%ch7DYU;g$VW256i#f6CvYyL1bIUTb2D<>!^Dl054uCJt}c1}g{WS_TU zzEe_Ak=LpzTYA>a*`uQT&LchCBRC`|EHE_qdP3Uq+3h!4O}1_+E%|zbGu^zF*_l(h zY*CS#vhiUJ307e0t7LSYGULj=N}xYfOI#yLQW8s2t&)pUffR$0fswJUfsw9(S%{IL um9eRnp^>(Mft7&)*KyWb6b-rgDVb@NxHVMI+ItYFfx*+&&t;ucLK6UOeoA2g From e4dc172094ebb99c356a4c63f1307ef9812ede8c Mon Sep 17 00:00:00 2001 From: Pao Date: Tue, 7 Feb 2023 00:12:52 +0100 Subject: [PATCH 11/22] More stuff for legs --- media/AnimSets/player/aim/aim_default.xml | 37 +++++++++++++++++++ .../player/turning/Bob_NoLegsTurning.xml | 14 +++++++ media/lua/client/TOC_HelperFunctions.lua | 14 +++++++ media/lua/client/TOC_Init.lua | 1 + 4 files changed, 66 insertions(+) create mode 100644 media/AnimSets/player/aim/aim_default.xml create mode 100644 media/AnimSets/player/turning/Bob_NoLegsTurning.xml diff --git a/media/AnimSets/player/aim/aim_default.xml b/media/AnimSets/player/aim/aim_default.xml new file mode 100644 index 0000000..a89da19 --- /dev/null +++ b/media/AnimSets/player/aim/aim_default.xml @@ -0,0 +1,37 @@ + + + aim_default + Zombie_Idle_FloorOnFront + 4 + Y + false + IdleSpeed + 0.30 + 70.0 + + IsCrawling + BOOL + true + + + Idle + Zombie_Idle_FloorOnFront + 0.3 + 0.3 + 1.2 + + + sneakIdle + Zombie_Idle_FloorOnFront + 0.3 + 0.3 + 1.2 + + + sneakIdleLow + Zombie_Idle_FloorOnFront + 0.3 + 0.3 + 1.2 + + \ No newline at end of file diff --git a/media/AnimSets/player/turning/Bob_NoLegsTurning.xml b/media/AnimSets/player/turning/Bob_NoLegsTurning.xml new file mode 100644 index 0000000..0569b55 --- /dev/null +++ b/media/AnimSets/player/turning/Bob_NoLegsTurning.xml @@ -0,0 +1,14 @@ + + + turn_idle_180L_craw; + Zombie_Crawl + + + + + + IsCrawling + BOOL + true + + \ No newline at end of file diff --git a/media/lua/client/TOC_HelperFunctions.lua b/media/lua/client/TOC_HelperFunctions.lua index 375403a..2bb23c0 100644 --- a/media/lua/client/TOC_HelperFunctions.lua +++ b/media/lua/client/TOC_HelperFunctions.lua @@ -88,4 +88,18 @@ function TocPopulateCanBeHeldTable(can_be_held, limbs_data) end end +end + + + + + +----------------------------------------- +function TocCheckLegsAmputations(mod_data) + + if mod_data.TOC.Limbs["Left_Foot"].is_cut or mod_data.TOC.Limbs["Right_Foot"].is_cut then + SetMissingFootAnimation(true) + end + + end \ No newline at end of file diff --git a/media/lua/client/TOC_Init.lua b/media/lua/client/TOC_Init.lua index c371df6..6616442 100644 --- a/media/lua/client/TOC_Init.lua +++ b/media/lua/client/TOC_Init.lua @@ -257,6 +257,7 @@ function TheOnlyCure.InitTheOnlyCure(_, player) else TocCheckCompatibilityWithOlderVersions(mod_data) TocUpdateBaseData(mod_data) -- Since it's gonna be common to update stuff + TocCheckLegsAmputations(mod_data) end end From d0a269a00641519ac930408d5b12cf6b7543284d Mon Sep 17 00:00:00 2001 From: Pao Date: Thu, 9 Feb 2023 21:32:59 +0100 Subject: [PATCH 12/22] fix to audio, gonna rewrite a lot of mp\client stuff --- .../player/turning/Bob_NoLegsTurning.xml | 14 ---- media/lua/client/TOC_ClientCommands.lua | 75 +++++++++++++------ media/lua/client/TOC_Compatibility.lua | 7 +- media/lua/client/TOC_Init.lua | 7 +- media/lua/client/TimedActions/ISCutLimb.lua | 6 ++ media/lua/server/TOC_MP_server.lua | 22 +++++- media/lua/shared/NPCs/ExtraBodyLocations.lua | 18 ++--- 7 files changed, 91 insertions(+), 58 deletions(-) delete mode 100644 media/AnimSets/player/turning/Bob_NoLegsTurning.xml diff --git a/media/AnimSets/player/turning/Bob_NoLegsTurning.xml b/media/AnimSets/player/turning/Bob_NoLegsTurning.xml deleted file mode 100644 index 0569b55..0000000 --- a/media/AnimSets/player/turning/Bob_NoLegsTurning.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - turn_idle_180L_craw; - Zombie_Crawl - - - - - - IsCrawling - BOOL - true - - \ No newline at end of file diff --git a/media/lua/client/TOC_ClientCommands.lua b/media/lua/client/TOC_ClientCommands.lua index 42b5c41..c7d30fa 100644 --- a/media/lua/client/TOC_ClientCommands.lua +++ b/media/lua/client/TOC_ClientCommands.lua @@ -1,21 +1,11 @@ --- Synchronization and MP related stuff +------------------------------------------ +-------- THE ONLY CURE BUT BETTER -------- +------------------------------------------ +------------ CLIENT COMMANDS ------------- + local Commands = {} -Commands["ResponseCanAct"] = function(arg) - - - print("TOC: ResponseCanAct") - local ui = GetConfirmUIMP() - ui.responseReceive = true - ui.responseAction = arg["toSend"][2] - ui.responsePartName = arg["toSend"][1] - ui.responseCan = arg["toSend"][3] - ui.responseUserName = getPlayerByOnlineID(arg["From"]):getUsername() - ui.responseActionIsBitten = getPlayerByOnlineID(arg["From"]):getBodyDamage():getBodyPart(TocGetBodyPartFromPartName(ui - .responsePartName)):bitten() -end - function SendCutLimb(player, part_name, surgeon_factor, bandage_table, painkiller_table) local arg = {} @@ -25,7 +15,7 @@ function SendCutLimb(player, part_name, surgeon_factor, bandage_table, painkille -- TODO Hotfix for sound, fix this later - arg["toSend"] = {part_name, surgeon_factor, bandage_table, painkiller_table, getPlayer():getOnlineID()} + arg["toSend"] = {part_name, surgeon_factor, bandage_table, painkiller_table} @@ -103,13 +93,30 @@ function AskCanUnequipProsthesis(player, part_name) end +-------------------------------------------------------------------------- + +Commands["ResponseCanAct"] = function(arg) + + + print("TOC: ResponseCanAct") + local ui = GetConfirmUIMP() + ui.responseReceive = true + ui.responseAction = arg["toSend"][2] + ui.responsePartName = arg["toSend"][1] + ui.responseCan = arg["toSend"][3] + ui.responseUserName = getPlayerByOnlineID(arg["From"]):getUsername() + ui.responseActionIsBitten = getPlayerByOnlineID(arg["From"]):getBodyDamage():getBodyPart(TocGetBodyPartFromPartName(ui + .responsePartName)):bitten() +end + + -- Patient (receive) Commands["CutLimb"] = function(arg) local arg = arg["toSend"] - local surgeon_id = arg[5] + --local surgeon_id = arg[5] -- Disable the sound coming from the surgeon - getPlayerByOnlineID(surgeon_id):getEmitter():stopSoundByName("Amputation_Sound") + --getPlayerByOnlineID(surgeon_id):getEmitter():stopSoundByName("Amputation_Sound") @@ -121,7 +128,6 @@ Commands["OperateLimb"] = function(arg) TocOperateLimb(arg[1], arg[2], arg[3]) end - Commands["EquipProsthesis"] = function(arg) -- part_name = arg[1] @@ -208,8 +214,6 @@ Commands["AcceptResetEverything"] = function(arg) end - - -- Cut Limb stuff Commands["AcceptDamageOtherPlayer"] = function(arg) @@ -219,8 +223,6 @@ Commands["AcceptDamageOtherPlayer"] = function(arg) TocDamagePlayerDuringAmputation(patient, part_name) end - - -- ANIMATIONS ----------------------- Commands["SetCrawlAnimation"] = function(args) @@ -241,6 +243,31 @@ end +------------------------------- +--- GENERIC COMMANDS --------- + +Commands["StopAmputationSound"] = function(args) + + local player = getPlayerByOnlineID(args.surgeon_id) + print("TOC: Running StopAmputationSound for " .. player:getUsername()) + + player:getEmitter():stopSoundByName("Amputation_Sound") + +end + + + + + + + + + + + + + + -- Base stuff local function OnTocServerCommand(module, command, args) @@ -263,7 +290,7 @@ Events.OnServerCommand.Add(OnTocServerCommand) ----------------------------------- TEST ----------------------------- +---------------------------------- Global Mod Data ----------------------------- function TOC_OnReceiveGlobalModData(key, modData) diff --git a/media/lua/client/TOC_Compatibility.lua b/media/lua/client/TOC_Compatibility.lua index 2cb754a..ab064ca 100644 --- a/media/lua/client/TOC_Compatibility.lua +++ b/media/lua/client/TOC_Compatibility.lua @@ -1,3 +1,8 @@ + + + + + local function TocReapplyAmputationClothingItem(mod_data) local player = getPlayer() local player_inv = player:getInventory() @@ -40,7 +45,7 @@ function TocCheckCompatibilityWithOlderVersions(mod_data) print("TOC: Something was wrongly initiliazed before. Resetting parameters") TocResetEverything() else - print("TOC: Found compatible data, correcting models in case of errors") + print("TOC: Found compatible data, correcting models in case of errors and adding limbs") TocReapplyAmputationClothingItem(mod_data) end diff --git a/media/lua/client/TOC_Init.lua b/media/lua/client/TOC_Init.lua index 6616442..9ca5989 100644 --- a/media/lua/client/TOC_Init.lua +++ b/media/lua/client/TOC_Init.lua @@ -78,11 +78,6 @@ local function TocUpdateBaseData(mod_data) end - - - - - if limb == "Hand" then mod_data.TOC.Limbs[part_name].cicatrization_base_time = 1700 mod_data.TOC.Limbs[part_name].depends_on = {} @@ -256,7 +251,7 @@ function TheOnlyCure.InitTheOnlyCure(_, player) TocSetInitData(mod_data, player) else TocCheckCompatibilityWithOlderVersions(mod_data) - TocUpdateBaseData(mod_data) -- Since it's gonna be common to update stuff + TocUpdateBaseData(mod_data) -- Since it's gonna be common to update stuff TocCheckLegsAmputations(mod_data) end diff --git a/media/lua/client/TimedActions/ISCutLimb.lua b/media/lua/client/TimedActions/ISCutLimb.lua index 16f1064..8ad4203 100644 --- a/media/lua/client/TimedActions/ISCutLimb.lua +++ b/media/lua/client/TimedActions/ISCutLimb.lua @@ -23,7 +23,12 @@ end function ISCutLimb:stop() + print("Stopping ISCutLimb") self.surgeon:getEmitter():stopSoundByName("Amputation_Sound") + sendClientCommand(self.surgeon, "TOC", "AskStopAmputationSound", {surgeon_id = self.surgeon:getOnlineID()}) + + -- TODO test this with more than 2 players + -- TODO this gets bugged when player dies while amputating end @@ -115,6 +120,7 @@ function ISCutLimb:perform() if self.patient ~= self.surgeon and isClient() then SendCutLimb(self.patient, self.part_name, surgeon_factor, bandage_table, painkiller_table) + sendClientCommand(self.surgeon, "TOC", "AskStopAmputationSound", {surgeon_id = self.surgeon:getOnlineID()}) else TocCutLimb(self.part_name, surgeon_factor, bandage_table, painkiller_table) end diff --git a/media/lua/server/TOC_MP_server.lua b/media/lua/server/TOC_MP_server.lua index d699978..d2d3269 100644 --- a/media/lua/server/TOC_MP_server.lua +++ b/media/lua/server/TOC_MP_server.lua @@ -47,6 +47,18 @@ TOC_Commands["AskToResetEverything"] = function(_, arg) end +TOC_Commands.AskStopAmputationSound = function(_, args) + + print("TOC: We're in AskStopAmputationSound") + sendServerCommand("TOC", "StopAmputationSound", {surgeon_id = args.surgeon_id}) + + +end + +TOC_Commands.ChangePlayerState = function(playerObj, args) + ModData.get("TOC_PLAYER_DATA")[playerObj:getUsername()] = args + ModData.transmit("TOC_PLAYER_DATA") +end ------ Global Mod Data ----------- @@ -57,8 +69,14 @@ end Events.OnInitGlobalModData.Add(TOC_OnInitGlobalModData) + +------------------------------------------------------ + + + TOC_Commands.OnClientCommand = function(module, command, playerObj, args) + print("TOC: Running ClientCommand " .. command) if module == 'TOC' and TOC_Commands[command] then TOC_Commands[command](playerObj, args) end @@ -68,7 +86,3 @@ end Events.OnClientCommand.Add(TOC_Commands.OnClientCommand) -TOC_Commands.ChangePlayerState = function(playerObj, args) - ModData.get("TOC_PLAYER_DATA")[playerObj:getUsername()] = args - ModData.transmit("TOC_PLAYER_DATA") -end \ No newline at end of file diff --git a/media/lua/shared/NPCs/ExtraBodyLocations.lua b/media/lua/shared/NPCs/ExtraBodyLocations.lua index b77bb41..78beefb 100644 --- a/media/lua/shared/NPCs/ExtraBodyLocations.lua +++ b/media/lua/shared/NPCs/ExtraBodyLocations.lua @@ -1,4 +1,4 @@ -local function addBodyLocationBefore(new_location, move_to_location) +local function AddBodyLocationBefore(new_location, move_to_location) local group = BodyLocations.getGroup("Human") local list = getClassFieldVal(group, getClassField(group, 1)) group:getOrCreateLocation(new_location) @@ -10,17 +10,17 @@ local function addBodyLocationBefore(new_location, move_to_location) end -addBodyLocationBefore("TOC_ArmRight", "Shoes") -addBodyLocationBefore("TOC_ArmLeft", "Shoes") +AddBodyLocationBefore("TOC_ArmRight", "Shoes") +AddBodyLocationBefore("TOC_ArmLeft", "Shoes") -addBodyLocationBefore("TOC_ArmRightProsthesis", "Shoes") -addBodyLocationBefore("TOC_ArmLeftProsthesis", "Shoes") +AddBodyLocationBefore("TOC_ArmRightProsthesis", "Shoes") +AddBodyLocationBefore("TOC_ArmLeftProsthesis", "Shoes") -addBodyLocationBefore("TOC_LegRight", "FannyPackFront") -addBodyLocationBefore("TOC_LegLeft", "FannyPackFront") +AddBodyLocationBefore("TOC_LegRight", "FannyPackFront") +AddBodyLocationBefore("TOC_LegLeft", "FannyPackFront") -addBodyLocationBefore("TOC_LegRightProsthesis", "FannyPackFront") -addBodyLocationBefore("TOC_LegLeftProsthesis", "FannyPackFront") +AddBodyLocationBefore("TOC_LegRightProsthesis", "FannyPackFront") +AddBodyLocationBefore("TOC_LegLeftProsthesis", "FannyPackFront") From 21af15ed0e5d4123a8402969e20ea2d4de871ba3 Mon Sep 17 00:00:00 2001 From: Pao Date: Thu, 9 Feb 2023 21:53:51 +0100 Subject: [PATCH 13/22] Cleaned commands --- media/lua/client/TOC_ClientCommands.lua | 406 +++++++++++------------- media/lua/server/TOC_MP_server.lua | 10 +- 2 files changed, 189 insertions(+), 227 deletions(-) diff --git a/media/lua/client/TOC_ClientCommands.lua b/media/lua/client/TOC_ClientCommands.lua index c7d30fa..9d2a70d 100644 --- a/media/lua/client/TOC_ClientCommands.lua +++ b/media/lua/client/TOC_ClientCommands.lua @@ -3,8 +3,192 @@ ------------------------------------------ ------------ CLIENT COMMANDS ------------- +local ServerCommands = {} -local Commands = {} +ServerCommands["ResponseCanAct"] = function(arg) + + + print("TOC: ResponseCanAct") + local ui = GetConfirmUIMP() + ui.responseReceive = true + ui.responseAction = arg["toSend"][2] + ui.responsePartName = arg["toSend"][1] + ui.responseCan = arg["toSend"][3] + ui.responseUserName = getPlayerByOnlineID(arg["From"]):getUsername() + ui.responseActionIsBitten = getPlayerByOnlineID(arg["From"]):getBodyDamage():getBodyPart(TocGetBodyPartFromPartName(ui + .responsePartName)):bitten() +end + + + +ServerCommands["CanCutLimb"] = function(arg) + local part_name = arg["toSend"] + + arg["To"] = arg["From"] + arg["From"] = getPlayer():getOnlineID() + arg["command"] = "ResponseCanAct" + arg["toSend"] = { part_name, "Cut", CheckIfCanBeCut(part_name) } + sendClientCommand("TOC", "SendServer", arg) +end + +ServerCommands["CutLimb"] = function(arg) + local arg = arg["toSend"] + --local surgeon_id = arg[5] + + -- Disable the sound coming from the surgeon + --getPlayerByOnlineID(surgeon_id):getEmitter():stopSoundByName("Amputation_Sound") + + + + TocCutLimb(arg[1], arg[2], arg[3], arg[4]) +end + + + +ServerCommands["CanOperateLimb"] = function(arg) + local part_name = arg["toSend"] + + arg["To"] = arg["From"] + arg["From"] = getPlayer():getOnlineID() + arg["command"] = "ResponseCanAct" + arg["toSend"] = { part_name, "Operate", CheckIfCanBeOperated(part_name) } + sendClientCommand("TOC", "SendServer", arg) +end +ServerCommands["OperateLimb"] = function(arg) + local arg = arg["toSend"] + TocOperateLimb(arg[1], arg[2], arg[3]) +end + + +ServerCommands["CanEquipProsthesis"] = function(arg) + local part_name = arg["toSend"] + --local item = arg["toSend"][2] -- TODO Add item prosth here + + arg["To"] = arg["From"] + arg["From"] = getPlayer():getOnlineID() + arg["command"] = "ResponseCanAct" + arg["toSend"] = {part_name, "Equip", CheckIfProsthesisCanBeEquipped(part_name) } + sendClientCommand("TOC", "SendServer", arg) + +end +ServerCommands["EquipProsthesis"] = function(arg) + + -- part_name = arg[1] + -- prosthesis = arg[2] + + local arg = arg["toSend"] + + TocEquipProsthesis(arg[1], arg[2]) + +end + + +ServerCommands["CanUnequipProsthesis"] = function(arg) + local part_name = arg["toSend"] + arg["To"] = arg["From"] + arg["From"] = getPlayer():getOnlineID() + arg["command"] = "ResponseCanAct" + arg["toSend"] = { part_name, "Unequip", CheckIfProsthesisCanBeUnequipped(part_name)} + sendClientCommand("TOC", "SendServer", arg) +end +ServerCommands["UnequipProsthesis"] = function(arg) + + -- part_name = arg[1] + + local arg = arg["toSend"] + + TheOnlyCure.TocUnequipProsthesis(arg[1], arg[2]) + +end + + + +ServerCommands["CanResetEverything"] = function(arg) + local part_name = "RightHand" --useless + + arg["To"] = arg["From"] + arg["From"] = getPlayer():getOnlineID() + arg["command"] = "ResponseCanAct" + arg["toSend"] = { part_name, "Cut", true } + sendClientCommand("TOC", "SendServer", arg) +end +ServerCommands["ResetEverything"] = function(_) + TocResetEverything() +end + + +-- Used when amputating the limb of another player +ServerCommands["AcceptDamageOtherPlayer"] = function(arg) + + local patient_id = arg[1] + local patient = getPlayerByOnlineID(arg[1]) + local part_name = arg[2] + TocDamagePlayerDuringAmputation(patient, part_name) +end + +-- Used to propagate animation changes after amputating a foot +ServerCommands["SetCrawlAnimation"] = function(args) + + local source = getPlayer() + local player = getPlayerByOnlineID(args.id) + + if source ~= player then + if args.hasInjury then + player:setVariable('SetCrawlAnimation', 'true'); + else + player:setVariable('SetCrawlAnimation', 'false'); + end + end + +end + +-- Used to propagate the stop of the sound of amputation +ServerCommands["StopAmputationSound"] = function(args) + + local player = getPlayerByOnlineID(args.surgeon_id) + player:getEmitter():stopSoundByName("Amputation_Sound") + +end + + + +local function OnTocServerCommand(module, command, args) + if module == 'TOC' then + print("TOC: On Toc Server Command " .. command) + if ServerCommands[command] then + print("Found command, executing it now") + args = args or {} + ServerCommands[command](args) + + end + end +end + +Events.OnServerCommand.Add(OnTocServerCommand) + + +---------------------------------- Global Mod Data ----------------------------- + + +function TOC_OnReceiveGlobalModData(key, modData) + if modData then + ModData.remove(key) + ModData.add(key, modData) + end +end + + +Events.OnReceiveGlobalModData.Add(TOC_OnReceiveGlobalModData) + +function TOC_OnConnected() + ModData.request("TOC_PLAYER_DATA") +end + + +Events.OnConnected.Add(TOC_OnConnected) + + +-------------------------------------------------------- function SendCutLimb(player, part_name, surgeon_factor, bandage_table, painkiller_table) @@ -80,7 +264,6 @@ function AskCanEquipProsthesis(player, part_name) sendClientCommand("TOC", "SendServer", arg) end - function AskCanUnequipProsthesis(player, part_name) GetConfirmUIMP().responseReceive = false local arg = {} @@ -91,222 +274,3 @@ function AskCanUnequipProsthesis(player, part_name) sendClientCommand("TOC", "SendServer", arg) end - - --------------------------------------------------------------------------- - -Commands["ResponseCanAct"] = function(arg) - - - print("TOC: ResponseCanAct") - local ui = GetConfirmUIMP() - ui.responseReceive = true - ui.responseAction = arg["toSend"][2] - ui.responsePartName = arg["toSend"][1] - ui.responseCan = arg["toSend"][3] - ui.responseUserName = getPlayerByOnlineID(arg["From"]):getUsername() - ui.responseActionIsBitten = getPlayerByOnlineID(arg["From"]):getBodyDamage():getBodyPart(TocGetBodyPartFromPartName(ui - .responsePartName)):bitten() -end - - --- Patient (receive) -Commands["CutLimb"] = function(arg) - local arg = arg["toSend"] - --local surgeon_id = arg[5] - - -- Disable the sound coming from the surgeon - --getPlayerByOnlineID(surgeon_id):getEmitter():stopSoundByName("Amputation_Sound") - - - - TocCutLimb(arg[1], arg[2], arg[3], arg[4]) -end - -Commands["OperateLimb"] = function(arg) - local arg = arg["toSend"] - TocOperateLimb(arg[1], arg[2], arg[3]) -end - -Commands["EquipProsthesis"] = function(arg) - - -- part_name = arg[1] - -- prosthesis = arg[2] - - local arg = arg["toSend"] - - TocEquipProsthesis(arg[1], arg[2]) - -end - -Commands["UnequipProsthesis"] = function(arg) - - -- part_name = arg[1] - - local arg = arg["toSend"] - - TheOnlyCure.TocUnequipProsthesis(arg[1], arg[2]) - -end - -Commands["CanCutLimb"] = function(arg) - local part_name = arg["toSend"] - - arg["To"] = arg["From"] - arg["From"] = getPlayer():getOnlineID() - arg["command"] = "ResponseCanAct" - arg["toSend"] = { part_name, "Cut", CheckIfCanBeCut(part_name) } - sendClientCommand("TOC", "SendServer", arg) -end - -Commands["CanOperateLimb"] = function(arg) - local part_name = arg["toSend"] - - arg["To"] = arg["From"] - arg["From"] = getPlayer():getOnlineID() - arg["command"] = "ResponseCanAct" - arg["toSend"] = { part_name, "Operate", CheckIfCanBeOperated(part_name) } - sendClientCommand("TOC", "SendServer", arg) -end - -Commands["CanEquipProsthesis"] = function(arg) - local part_name = arg["toSend"] - --local item = arg["toSend"][2] -- TODO Add item prosth here - - arg["To"] = arg["From"] - arg["From"] = getPlayer():getOnlineID() - arg["command"] = "ResponseCanAct" - arg["toSend"] = {part_name, "Equip", CheckIfProsthesisCanBeEquipped(part_name) } - sendClientCommand("TOC", "SendServer", arg) - -end - -Commands["CanUnequipProsthesis"] = function(arg) - local part_name = arg["toSend"] - arg["To"] = arg["From"] - arg["From"] = getPlayer():getOnlineID() - arg["command"] = "ResponseCanAct" - arg["toSend"] = { part_name, "Unequip", CheckIfProsthesisCanBeUnequipped(part_name)} - sendClientCommand("TOC", "SendServer", arg) - -end - -Commands["CanResetEverything"] = function(arg) - local part_name = "RightHand" --useless - - arg["To"] = arg["From"] - arg["From"] = getPlayer():getOnlineID() - arg["command"] = "ResponseCanAct" - arg["toSend"] = { part_name, "Cut", true } - sendClientCommand("TOC", "SendServer", arg) -end - -Commands["ResetEverything"] = function(arg) - local arg = arg["toSend"] - TocResetEverything() -end - --- Cheating stuff -Commands["AcceptResetEverything"] = function(arg) - - local clicked_player = getPlayerByOnlineID(arg[1]) -- TODO delete this - TocResetEverything() -end - - --- Cut Limb stuff -Commands["AcceptDamageOtherPlayer"] = function(arg) - - local patient_id = arg[1] - local patient = getPlayerByOnlineID(arg[1]) - local part_name = arg[2] - TocDamagePlayerDuringAmputation(patient, part_name) -end - --- ANIMATIONS ------------------------ -Commands["SetCrawlAnimation"] = function(args) - - local source = getPlayer() - local player = getPlayerByOnlineID(args.id) - - if source ~= player then - if args.hasInjury then - player:setVariable('SetCrawlAnimation', 'true'); - else - player:setVariable('SetCrawlAnimation', 'false'); - end - end - -end - - - - -------------------------------- ---- GENERIC COMMANDS --------- - -Commands["StopAmputationSound"] = function(args) - - local player = getPlayerByOnlineID(args.surgeon_id) - print("TOC: Running StopAmputationSound for " .. player:getUsername()) - - player:getEmitter():stopSoundByName("Amputation_Sound") - -end - - - - - - - - - - - - - - - --- Base stuff -local function OnTocServerCommand(module, command, args) - if module == 'TOC' then - print("TOC: On Toc Server Command " .. command) - if Commands[command] then - print("Found command, executing it now") - args = args or {} - Commands[command](args) - - end - end -end - -Events.OnServerCommand.Add(OnTocServerCommand) - - - - - - - ----------------------------------- Global Mod Data ----------------------------- - - -function TOC_OnReceiveGlobalModData(key, modData) - if modData then - ModData.remove(key) - ModData.add(key, modData) - end -end - - -Events.OnReceiveGlobalModData.Add(TOC_OnReceiveGlobalModData) - -function TOC_OnConnected() - ModData.request("TOC_PLAYER_DATA") -end - - -Events.OnConnected.Add(TOC_OnConnected) - diff --git a/media/lua/server/TOC_MP_server.lua b/media/lua/server/TOC_MP_server.lua index d2d3269..8d5568e 100644 --- a/media/lua/server/TOC_MP_server.lua +++ b/media/lua/server/TOC_MP_server.lua @@ -5,9 +5,11 @@ local TOC_Commands = {} -TOC_Commands["SendServer"] = function(player, arg) +-- TODO rework this +TOC_Commands.SendServer = function(player, arg) local otherPlayer = getPlayerByOnlineID(arg["To"]) sendServerCommand(otherPlayer, "TOC", arg["command"], arg) + end @@ -39,11 +41,7 @@ end -- CHEATING STUFF TOC_Commands["AskToResetEverything"] = function(_, arg) local clicked_player = getPlayerByOnlineID(arg[1]) - local clicked_player_id = arg[1] - - - sendServerCommand(clicked_player, "TOC", "AcceptResetEverything", { clicked_player_id }) - + sendServerCommand(clicked_player, "TOC", "ResetEverything", {}) end From 65ca3d285ed968495c5963151fde5460744e568c Mon Sep 17 00:00:00 2001 From: Pao Date: Thu, 9 Feb 2023 22:13:51 +0100 Subject: [PATCH 14/22] working no foot animations in mp --- media/lua/client/TOC_Animations.lua | 20 +++++++------------- media/lua/client/TOC_ClientCommands.lua | 10 ++-------- media/lua/server/TOC_MP_server.lua | 6 ++---- 3 files changed, 11 insertions(+), 25 deletions(-) diff --git a/media/lua/client/TOC_Animations.lua b/media/lua/client/TOC_Animations.lua index 4d2d787..766d32a 100644 --- a/media/lua/client/TOC_Animations.lua +++ b/media/lua/client/TOC_Animations.lua @@ -1,23 +1,17 @@ -- Thanks to Glytcher and Matías N. Salas for helping out with this - - - - function SetMissingFootAnimation(check) local player = getPlayer() - - if check then - player:setVariable("IsCrawling", "true") - else - player:setVariable("IsCrawling", "false") - end + player:setVariable("IsCrawling", tostring(check)) - -- if isClient() then - -- sendClientCommand("TOC", "SetCrawlAnimation", {}) - -- end + if not isServer() and not isClient() then + print("SP, so it's fine") + else + + sendClientCommand(player, "TOC", "NotifyNewCrawlAnimation", {id = player:getOnlineID(), check = check}) + end end diff --git a/media/lua/client/TOC_ClientCommands.lua b/media/lua/client/TOC_ClientCommands.lua index 9d2a70d..cab9740 100644 --- a/media/lua/client/TOC_ClientCommands.lua +++ b/media/lua/client/TOC_ClientCommands.lua @@ -129,16 +129,10 @@ end -- Used to propagate animation changes after amputating a foot ServerCommands["SetCrawlAnimation"] = function(args) - local source = getPlayer() local player = getPlayerByOnlineID(args.id) + local check = args.check - if source ~= player then - if args.hasInjury then - player:setVariable('SetCrawlAnimation', 'true'); - else - player:setVariable('SetCrawlAnimation', 'false'); - end - end + player:setVariable('IsCrawling', tostring(check)) end diff --git a/media/lua/server/TOC_MP_server.lua b/media/lua/server/TOC_MP_server.lua index 8d5568e..0287916 100644 --- a/media/lua/server/TOC_MP_server.lua +++ b/media/lua/server/TOC_MP_server.lua @@ -27,11 +27,9 @@ end -------- ANIMATIONS -TOC_Commands["SetCrawlAnimation"] = function(player, args) +TOC_Commands["NotifyNewCrawlAnimation"] = function(player, args) - local player_id = player:getOnlineID() - - sendServerCommand(player, "TOC", "SetCrawlAnimation", {}) + sendServerCommand("TOC", "SetCrawlAnimation", {id = args.id, check = args.check}) end From dad01605d06b4e2949f1a1960ad052be9e31fbe2 Mon Sep 17 00:00:00 2001 From: Pao Date: Fri, 10 Feb 2023 01:30:33 +0100 Subject: [PATCH 15/22] Cleaning MP handlers --- media/AnimSets/player/aim/aim_default.xml | 8 +- media/AnimSets/player/idle/Bob_NoLegsIdle.xml | 65 ----------- media/AnimSets/player/idle/NoLegs_Idle.xml | 24 ++++ .../AnimSets/player/idle/NoLegs_IdleSneak.xml | 21 ++++ .../player/movement/Bob_NoLegsMovement.xml | 109 ------------------ .../AnimSets/player/movement/NoLegs_Walk.xml | 24 ++++ .../player/movement/NoLegs_WalkSneak.xml | 34 ++++++ media/AnimSets/player/turning/NoLegs_Turn.xml | 61 ++++++++++ .../player/turning/NoLegs_TurnIdle.xml | 45 ++++++++ .../player/turning/NoLegs_TurnIdle180.xml | 28 +++++ .../player/turning/NoLegs_TurnIdle180L.xml | 15 +++ .../player/turning/NoLegs_TurnIdle180R.xml | 18 +++ media/lua/client/TOC_ClientCommands.lua | 56 ++++----- media/lua/client/TOC_Update.lua | 1 + media/lua/server/TOC_MP_server.lua | 52 ++++----- 15 files changed, 320 insertions(+), 241 deletions(-) delete mode 100644 media/AnimSets/player/idle/Bob_NoLegsIdle.xml create mode 100644 media/AnimSets/player/idle/NoLegs_Idle.xml create mode 100644 media/AnimSets/player/idle/NoLegs_IdleSneak.xml delete mode 100644 media/AnimSets/player/movement/Bob_NoLegsMovement.xml create mode 100644 media/AnimSets/player/movement/NoLegs_Walk.xml create mode 100644 media/AnimSets/player/movement/NoLegs_WalkSneak.xml create mode 100644 media/AnimSets/player/turning/NoLegs_Turn.xml create mode 100644 media/AnimSets/player/turning/NoLegs_TurnIdle.xml create mode 100644 media/AnimSets/player/turning/NoLegs_TurnIdle180.xml create mode 100644 media/AnimSets/player/turning/NoLegs_TurnIdle180L.xml create mode 100644 media/AnimSets/player/turning/NoLegs_TurnIdle180R.xml diff --git a/media/AnimSets/player/aim/aim_default.xml b/media/AnimSets/player/aim/aim_default.xml index a89da19..5806066 100644 --- a/media/AnimSets/player/aim/aim_default.xml +++ b/media/AnimSets/player/aim/aim_default.xml @@ -1,7 +1,7 @@  aim_default - Zombie_Idle_FloorOnFront + Bob_Sit_FishingIdle 4 Y false @@ -15,21 +15,21 @@ Idle - Zombie_Idle_FloorOnFront + Bob_Sit_FishingIdle 0.3 0.3 1.2 sneakIdle - Zombie_Idle_FloorOnFront + Bob_Sit_FishingIdle 0.3 0.3 1.2 sneakIdleLow - Zombie_Idle_FloorOnFront + Bob_Sit_FishingIdle 0.3 0.3 1.2 diff --git a/media/AnimSets/player/idle/Bob_NoLegsIdle.xml b/media/AnimSets/player/idle/Bob_NoLegsIdle.xml deleted file mode 100644 index dcb318e..0000000 --- a/media/AnimSets/player/idle/Bob_NoLegsIdle.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - Bob_NoLegsIdle - Zombie_Idle_FloorOnFront - Y - 0.48 - 0.20 - - IsCrawling - BOOL - true - - IdleSpeed - IdleSpeed - - Zombie_Idle_FloorOnFront - 0.00 - 0.00 - 0.80 - - - Zombie_Idle_FloorOnFront - 0.00 - 1.00 - 0.80 - - - Zombie_Idle_FloorOnFront - 0.00 - 0.04 - 0.80 - - - 1 - 2 - 3 - - - aim_default - Zombie_Idle_FloorOnFront - 0.5 - 1.5 - - - defaultWalk - 0.3 - 0.3 - - isTurningAround - BOOL - false - - - - defaultRun - Zombie_Idle_FloorOnFront - 0.1 - 0.1 - - isTurningAround - BOOL - false - - - \ No newline at end of file diff --git a/media/AnimSets/player/idle/NoLegs_Idle.xml b/media/AnimSets/player/idle/NoLegs_Idle.xml new file mode 100644 index 0000000..af32f14 --- /dev/null +++ b/media/AnimSets/player/idle/NoLegs_Idle.xml @@ -0,0 +1,24 @@ + + + NoLegs_Idle + Bob_Sit_FishingIdle + Translation_Data + Y + true + 0.8 + 0.20 + + IsCrawling + BOOL + true + + + NoLegs_IdleSneak + 0.1 + + + NoLegs_Idle + 0.35 + 0.35 + + diff --git a/media/AnimSets/player/idle/NoLegs_IdleSneak.xml b/media/AnimSets/player/idle/NoLegs_IdleSneak.xml new file mode 100644 index 0000000..9816218 --- /dev/null +++ b/media/AnimSets/player/idle/NoLegs_IdleSneak.xml @@ -0,0 +1,21 @@ + + + NoLegs_IdleSneak + Bob_ScrambleFloorIdle + true + Y + false + true + 0.8 + 0.20 + + IsCrawling + BOOL + true + + + sneaking + BOOL + true + + \ No newline at end of file diff --git a/media/AnimSets/player/movement/Bob_NoLegsMovement.xml b/media/AnimSets/player/movement/Bob_NoLegsMovement.xml deleted file mode 100644 index 3989830..0000000 --- a/media/AnimSets/player/movement/Bob_NoLegsMovement.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - defaultWalk - Zombie_Crawl - Translation_Data - Y - 1.04 - 0.20 - - IsCrawling - BOOL - true - - - WalkInjury - WalkSpeed - - Zombie_Crawl - 0.50 - 1.00 - 0.80 - - - Zombie_Crawl - -0.50 - 1.00 - 0.80 - - - Zombie_Crawl - 1.00 - 1.00 - 0.80 - - - Zombie_Crawl - -1.00 - 1.00 - 0.80 - - - Zombie_Crawl - 0.00 - 1.00 - 0.80 - - - Zombie_Crawl - 0.00 - 0.00 - 0.80 - - - 2 - 4 - 6 - - - 5 - 2 - 6 - - - 6 - 1 - 5 - - - 6 - 3 - 1 - - - Bob_NoLegsIdle - 0.3 - 1 - - - Bob_NoLegsIdle - Zombie_Crawl - 0.3 - 0.3 - - DeltaY - GTR - -0.5 - - - isMoving - BOOL - false - - - - Bob_NoLegsIdle - 0.1 - - - - Footstep - 0.15 - walk - - - Footstep - 0.6 - walk - - \ No newline at end of file diff --git a/media/AnimSets/player/movement/NoLegs_Walk.xml b/media/AnimSets/player/movement/NoLegs_Walk.xml new file mode 100644 index 0000000..d976510 --- /dev/null +++ b/media/AnimSets/player/movement/NoLegs_Walk.xml @@ -0,0 +1,24 @@ + + + NoLegs_Walk + Bob_Crawl + Y + true + 1.5 + 0.20 + + IsCrawling + BOOL + true + + + Footstep + 0.15 + walk + + + Footstep + 0.6 + walk + + diff --git a/media/AnimSets/player/movement/NoLegs_WalkSneak.xml b/media/AnimSets/player/movement/NoLegs_WalkSneak.xml new file mode 100644 index 0000000..f87d216 --- /dev/null +++ b/media/AnimSets/player/movement/NoLegs_WalkSneak.xml @@ -0,0 +1,34 @@ + + + NoLegs_WalkSneak + Zombie_CrawlUnder + Translation_Data + true + 1.5 + 0.20 + + IsCrawling + BOOL + true + + + sneaking + BOOL + true + + + inTrees + BOOL + false + + + Footstep + 0.15 + sneak_walk + + + Footstep + 0.6 + sneak_walk + + diff --git a/media/AnimSets/player/turning/NoLegs_Turn.xml b/media/AnimSets/player/turning/NoLegs_Turn.xml new file mode 100644 index 0000000..85c6024 --- /dev/null +++ b/media/AnimSets/player/turning/NoLegs_Turn.xml @@ -0,0 +1,61 @@ + + + NoLegs_Turn + Bip01 + Y + true + 0.80 + 0.10 + 0.20 + + IsCrawling + BOOL + true + + + + + isTurning + BOOL + true + + + Bip01_Pelvis + false + + + Bip01_Spine + false + + + Bip01_BackPack + + + Bip01_DressFront + + + Bip01_DressBack + + + Bip01_L_Thigh + + + Bip01_R_Thigh + + + Bip01 + false + + + Translation_Data + false + + + Bip01_Prop1 + 0.00 + + + Bip01_Prop2 + 0.00 + + \ No newline at end of file diff --git a/media/AnimSets/player/turning/NoLegs_TurnIdle.xml b/media/AnimSets/player/turning/NoLegs_TurnIdle.xml new file mode 100644 index 0000000..ebbe1ce --- /dev/null +++ b/media/AnimSets/player/turning/NoLegs_TurnIdle.xml @@ -0,0 +1,45 @@ + + + NoLegs_TurnIdle + false + true + 0.10 + + + IsCrawling + BOOL + true + + + + isMoving + BOOL + false + + + + + Aim + BOOL + false + + + Idle + 0.1 + + + + 0.25 + + + 0.20 + + + + + + + + + + \ No newline at end of file diff --git a/media/AnimSets/player/turning/NoLegs_TurnIdle180.xml b/media/AnimSets/player/turning/NoLegs_TurnIdle180.xml new file mode 100644 index 0000000..6515cb2 --- /dev/null +++ b/media/AnimSets/player/turning/NoLegs_TurnIdle180.xml @@ -0,0 +1,28 @@ + + + NoLegs_TurnIdle180 + + + + IsCrawling + BOOL + true + + + + isTurningAround + BOOL + true + + + + 0.00 + + + + + + + + + \ No newline at end of file diff --git a/media/AnimSets/player/turning/NoLegs_TurnIdle180L.xml b/media/AnimSets/player/turning/NoLegs_TurnIdle180L.xml new file mode 100644 index 0000000..6370623 --- /dev/null +++ b/media/AnimSets/player/turning/NoLegs_TurnIdle180L.xml @@ -0,0 +1,15 @@ + + + NoLegs_turnIdle180L + Bob_Crawl + + IsCrawling + BOOL + true + + + twist + LESS + 0 + + \ No newline at end of file diff --git a/media/AnimSets/player/turning/NoLegs_TurnIdle180R.xml b/media/AnimSets/player/turning/NoLegs_TurnIdle180R.xml new file mode 100644 index 0000000..d219ba7 --- /dev/null +++ b/media/AnimSets/player/turning/NoLegs_TurnIdle180R.xml @@ -0,0 +1,18 @@ + + + NoLegs_TurnIdle180R + Bob_EmoteWaveBye + + + + + IsCrawling + BOOL + true + + + twist + GTR + 0 + + \ No newline at end of file diff --git a/media/lua/client/TOC_ClientCommands.lua b/media/lua/client/TOC_ClientCommands.lua index cab9740..4332b63 100644 --- a/media/lua/client/TOC_ClientCommands.lua +++ b/media/lua/client/TOC_ClientCommands.lua @@ -5,7 +5,7 @@ local ServerCommands = {} -ServerCommands["ResponseCanAct"] = function(arg) +ServerCommands.ResponseCanAct = function(arg) print("TOC: ResponseCanAct") @@ -21,7 +21,7 @@ end -ServerCommands["CanCutLimb"] = function(arg) +ServerCommands.CanCutLimb = function(arg) local part_name = arg["toSend"] arg["To"] = arg["From"] @@ -31,21 +31,14 @@ ServerCommands["CanCutLimb"] = function(arg) sendClientCommand("TOC", "SendServer", arg) end -ServerCommands["CutLimb"] = function(arg) - local arg = arg["toSend"] - --local surgeon_id = arg[5] - - -- Disable the sound coming from the surgeon - --getPlayerByOnlineID(surgeon_id):getEmitter():stopSoundByName("Amputation_Sound") - - - - TocCutLimb(arg[1], arg[2], arg[3], arg[4]) +ServerCommands.CutLimb = function(arg) + local data = arg["toSend"] + TocCutLimb(data[1], data[2], data[3], data[4]) end -ServerCommands["CanOperateLimb"] = function(arg) +ServerCommands.CanOperateLimb = function(arg) local part_name = arg["toSend"] arg["To"] = arg["From"] @@ -54,13 +47,14 @@ ServerCommands["CanOperateLimb"] = function(arg) arg["toSend"] = { part_name, "Operate", CheckIfCanBeOperated(part_name) } sendClientCommand("TOC", "SendServer", arg) end -ServerCommands["OperateLimb"] = function(arg) - local arg = arg["toSend"] - TocOperateLimb(arg[1], arg[2], arg[3]) +ServerCommands.OperateLimb = function(arg) + + local data = arg["toSend"] + TocOperateLimb(data[1], data[2], data[3]) end -ServerCommands["CanEquipProsthesis"] = function(arg) +ServerCommands.CanEquipProsthesis = function(arg) local part_name = arg["toSend"] --local item = arg["toSend"][2] -- TODO Add item prosth here @@ -71,19 +65,18 @@ ServerCommands["CanEquipProsthesis"] = function(arg) sendClientCommand("TOC", "SendServer", arg) end -ServerCommands["EquipProsthesis"] = function(arg) +ServerCommands.EquipProsthesis = function(arg) -- part_name = arg[1] -- prosthesis = arg[2] - local arg = arg["toSend"] - - TocEquipProsthesis(arg[1], arg[2]) + local data = arg["toSend"] + TocEquipProsthesis(data[1], data[2]) end -ServerCommands["CanUnequipProsthesis"] = function(arg) +ServerCommands.CanUnequipProsthesis = function(arg) local part_name = arg["toSend"] arg["To"] = arg["From"] arg["From"] = getPlayer():getOnlineID() @@ -91,19 +84,18 @@ ServerCommands["CanUnequipProsthesis"] = function(arg) arg["toSend"] = { part_name, "Unequip", CheckIfProsthesisCanBeUnequipped(part_name)} sendClientCommand("TOC", "SendServer", arg) end -ServerCommands["UnequipProsthesis"] = function(arg) +ServerCommands.UnequipProsthesis = function(arg) -- part_name = arg[1] - local arg = arg["toSend"] - - TheOnlyCure.TocUnequipProsthesis(arg[1], arg[2]) + local data = arg["toSend"] + TheOnlyCure.TocUnequipProsthesis(data[1], data[2]) end -ServerCommands["CanResetEverything"] = function(arg) +ServerCommands.CanResetEverything = function(arg) local part_name = "RightHand" --useless arg["To"] = arg["From"] @@ -112,22 +104,20 @@ ServerCommands["CanResetEverything"] = function(arg) arg["toSend"] = { part_name, "Cut", true } sendClientCommand("TOC", "SendServer", arg) end -ServerCommands["ResetEverything"] = function(_) +ServerCommands.ResetEverything = function(_) TocResetEverything() end -- Used when amputating the limb of another player -ServerCommands["AcceptDamageOtherPlayer"] = function(arg) - - local patient_id = arg[1] +ServerCommands.AcceptDamageOtherPlayer = function(arg) local patient = getPlayerByOnlineID(arg[1]) local part_name = arg[2] TocDamagePlayerDuringAmputation(patient, part_name) end -- Used to propagate animation changes after amputating a foot -ServerCommands["SetCrawlAnimation"] = function(args) +ServerCommands.SetCrawlAnimation = function(args) local player = getPlayerByOnlineID(args.id) local check = args.check @@ -137,7 +127,7 @@ ServerCommands["SetCrawlAnimation"] = function(args) end -- Used to propagate the stop of the sound of amputation -ServerCommands["StopAmputationSound"] = function(args) +ServerCommands.StopAmputationSound = function(args) local player = getPlayerByOnlineID(args.surgeon_id) player:getEmitter():stopSoundByName("Amputation_Sound") diff --git a/media/lua/client/TOC_Update.lua b/media/lua/client/TOC_Update.lua index 6ae662f..8931761 100644 --- a/media/lua/client/TOC_Update.lua +++ b/media/lua/client/TOC_Update.lua @@ -249,6 +249,7 @@ local function TocUpdateEveryOneMinute() -- Sends only Limbs since the other stuff is mostly static if toc_data ~= nil then -- FIXME Send little packets instead of the whole thing? + -- TODO we shouldn't run this if we're in SP I guess? sendClientCommand(player, 'TOC', 'ChangePlayerState', { toc_data.Limbs } ) end diff --git a/media/lua/server/TOC_MP_server.lua b/media/lua/server/TOC_MP_server.lua index 0287916..fc2ddc4 100644 --- a/media/lua/server/TOC_MP_server.lua +++ b/media/lua/server/TOC_MP_server.lua @@ -1,21 +1,18 @@ ---- A rly big thx to Fenris_Wolf and Chuck to help me with that. Love you guy ----Server side -local TOC_Commands = {} +local ClientCommands = {} --- TODO rework this -TOC_Commands.SendServer = function(player, arg) +-- Main handler of base functions for TOC, not changed till now 'cause it works +ClientCommands.SendServer = function(player, arg) local otherPlayer = getPlayerByOnlineID(arg["To"]) sendServerCommand(otherPlayer, "TOC", arg["command"], arg) end - --- Cut Limb stuff -TOC_Commands["AskDamageOtherPlayer"] = function(_, arg) +-- Cutting Limbs +ClientCommands.AskDamageOtherPlayer = function(_, arg) local patient = getPlayerByOnlineID(arg[1]) local patient_id = arg[1] @@ -25,9 +22,16 @@ TOC_Commands["AskDamageOtherPlayer"] = function(_, arg) end +ClientCommands.AskStopAmputationSound = function(_, args) --------- ANIMATIONS -TOC_Commands["NotifyNewCrawlAnimation"] = function(player, args) + print("TOC: We're in AskStopAmputationSound") + sendServerCommand("TOC", "StopAmputationSound", {surgeon_id = args.surgeon_id}) + + +end + +-- Animations +ClientCommands.NotifyNewCrawlAnimation = function(player, args) sendServerCommand("TOC", "SetCrawlAnimation", {id = args.id, check = args.check}) @@ -36,22 +40,15 @@ end --- CHEATING STUFF -TOC_Commands["AskToResetEverything"] = function(_, arg) +-- Cheats +ClientCommands.AskToResetEverything = function(_, arg) local clicked_player = getPlayerByOnlineID(arg[1]) sendServerCommand(clicked_player, "TOC", "ResetEverything", {}) end -TOC_Commands.AskStopAmputationSound = function(_, args) - - print("TOC: We're in AskStopAmputationSound") - sendServerCommand("TOC", "StopAmputationSound", {surgeon_id = args.surgeon_id}) - - -end - -TOC_Commands.ChangePlayerState = function(playerObj, args) +-- Global Mod Data data handler +ClientCommands.ChangePlayerState = function(playerObj, args) ModData.get("TOC_PLAYER_DATA")[playerObj:getUsername()] = args ModData.transmit("TOC_PLAYER_DATA") end @@ -68,17 +65,12 @@ Events.OnInitGlobalModData.Add(TOC_OnInitGlobalModData) ------------------------------------------------------ - - -TOC_Commands.OnClientCommand = function(module, command, playerObj, args) - - print("TOC: Running ClientCommand " .. command) - if module == 'TOC' and TOC_Commands[command] then - TOC_Commands[command](playerObj, args) +local function OnClientCommand(module, command, playerObj, args) + if module == 'TOC' and ClientCommands[command] then + ClientCommands[command](playerObj, args) end end - -Events.OnClientCommand.Add(TOC_Commands.OnClientCommand) +Events.OnClientCommand.Add(OnClientCommand) From 031af29b519f288b11ae440a4a5dd27f6b04ec9e Mon Sep 17 00:00:00 2001 From: Pao Date: Fri, 10 Feb 2023 04:10:06 +0100 Subject: [PATCH 16/22] I'm a dum dum and my brain no work --- .../ActionsMethods/TOC_ProsthesisMethods.lua | 4 + media/lua/client/TOC_Compatibility.lua | 5 +- media/lua/client/TOC_Debug.lua | 10 ++ media/lua/client/TOC_ProsthesisHandler.lua | 92 +++++++++++++++++++ media/scripts/TOC_recipes.txt | 1 + 5 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 media/lua/client/TOC_ProsthesisHandler.lua diff --git a/media/lua/client/ActionsMethods/TOC_ProsthesisMethods.lua b/media/lua/client/ActionsMethods/TOC_ProsthesisMethods.lua index 56c4d81..96fbae8 100644 --- a/media/lua/client/ActionsMethods/TOC_ProsthesisMethods.lua +++ b/media/lua/client/ActionsMethods/TOC_ProsthesisMethods.lua @@ -8,6 +8,10 @@ ---@param part_name string ---@param prosthesis_base_name string function TocEquipProsthesis(part_name, prosthesis_base_name) + + -- TODO probably will have to move this from the TOC menu to classic equip to have dynamic durability + + local player = getPlayer() local toc_data = player:getModData().TOC diff --git a/media/lua/client/TOC_Compatibility.lua b/media/lua/client/TOC_Compatibility.lua index ab064ca..58a04d6 100644 --- a/media/lua/client/TOC_Compatibility.lua +++ b/media/lua/client/TOC_Compatibility.lua @@ -45,8 +45,9 @@ function TocCheckCompatibilityWithOlderVersions(mod_data) print("TOC: Something was wrongly initiliazed before. Resetting parameters") TocResetEverything() else - print("TOC: Found compatible data, correcting models in case of errors and adding limbs") - TocReapplyAmputationClothingItem(mod_data) + print("TOC: Bypassing reapplying of amputations, assuming that everything is correct") + --print("TOC: Found compatible data, correcting models in case of errors and adding limbs") + --TocReapplyAmputationClothingItem(mod_data) end end diff --git a/media/lua/client/TOC_Debug.lua b/media/lua/client/TOC_Debug.lua index 3979a77..376f25b 100644 --- a/media/lua/client/TOC_Debug.lua +++ b/media/lua/client/TOC_Debug.lua @@ -137,4 +137,14 @@ function TocTestBodyLocations() print(list:get(i -1):getId()) end +end + +function TocTestItem() + local player = getPlayer() + local player_inventory = player:getInventory() + local item_name = "TOC.Amputation_" .. "Right" .. "_" .. "Hand" + local found_item = player_inventory:FindAndReturn(item_name) + + print(found_item:getID()) + end \ No newline at end of file diff --git a/media/lua/client/TOC_ProsthesisHandler.lua b/media/lua/client/TOC_ProsthesisHandler.lua new file mode 100644 index 0000000..f64b4b3 --- /dev/null +++ b/media/lua/client/TOC_ProsthesisHandler.lua @@ -0,0 +1,92 @@ +local BaseStats = { + LeatherBase = { + durability = 25, + speed = 15 + }, + WoodenBase = { + durability = 10, + speed = 5, + }, + MetalBase = { + durability = 75, + speed = 7, + } + + + + +} + + +local TopStats = { + +} + + + + + + + +function GenerateEquippedProsthesis(prosthesis_item) + -- TODO Durability should be decided from the clothing item xml. Same thing for disassembling stuff + + local durability = 0 + local speed = 0 + + local prosthesis_name = prosthesis_item:getFullType() + + for base_name, base_values in pairs(BaseStats) do + -- Check the name of the prosthesis item, set the correct values + if string.find(prosthesis_name, base_name) then + durability = base_values.durability + speed = base_values.speed + end + end + + + + for top_name, top_values in pairs(TopStats) do + -- Check the name of the prosthesis item, set the correct values + if string.find(prosthesis_name, top_name) then + durability = durability + top_values.durability + speed = speed + top_values.speed + end + end + + -- TODO This won't work since if we unequip it we would lose this stuff. We need to bind it to the item + local prosthesis_table = { + prost_id = prosthesis_item:getID(), + prost_name = prosthesis_name, + durability = durability, + speed = speed + } + + + return prosthesis_table +end + +local ProsthesisRecipe = {} + + +function ProsthesisRecipe.OnCreate.Hook(items, result, player, selectedItem) + + -- Set mod data for item with durability and all that crap + + + -- when we equip a prosthesis, we're gonna pass these parameters to the newly generated clothing item + + -- when we unequip it, we regen the normal item with the parameters from the clothing item + + +end + + + + +function DoWeReallyNeedThis() + + -- We need a durability check... so in modData + + -- +end \ No newline at end of file diff --git a/media/scripts/TOC_recipes.txt b/media/scripts/TOC_recipes.txt index 25a94d7..9f3cc3f 100644 --- a/media/scripts/TOC_recipes.txt +++ b/media/scripts/TOC_recipes.txt @@ -82,6 +82,7 @@ recipe Make wooden hook Category: Surgeon, Tooltip: Recipe_Tooltip_Wooden_hook, NeedToBeLearn: true, + OnCreate: ProsthesisRecipe.OnCreate.Hook, } recipe Make metal hook From a610763131489504fe79bcf8e52d0c39995ea3d6 Mon Sep 17 00:00:00 2001 From: Pao Date: Fri, 10 Feb 2023 13:47:08 +0100 Subject: [PATCH 17/22] more setup stuff for modular prosthetics --- .../ActionsMethods/TOC_ProsthesisMethods.lua | 53 ++++++++++++++++--- media/lua/client/TOC_ClientCommands.lua | 11 ++-- media/lua/client/TOC_Debug.lua | 4 +- media/lua/client/TOC_ProsthesisHandler.lua | 43 ++++++++------- .../TimedActions/ISInstallProsthesis.lua | 11 ++-- media/scripts/TOC_recipes.txt | 2 +- 6 files changed, 84 insertions(+), 40 deletions(-) diff --git a/media/lua/client/ActionsMethods/TOC_ProsthesisMethods.lua b/media/lua/client/ActionsMethods/TOC_ProsthesisMethods.lua index 96fbae8..da3ee96 100644 --- a/media/lua/client/ActionsMethods/TOC_ProsthesisMethods.lua +++ b/media/lua/client/ActionsMethods/TOC_ProsthesisMethods.lua @@ -6,19 +6,47 @@ ---Equip a prosthesis transforming a normal item into a clothing item ---@param part_name string +---@param prosthesis_item any the prosthesis item ---@param prosthesis_base_name string -function TocEquipProsthesis(part_name, prosthesis_base_name) +function TocEquipProsthesis(part_name, prosthesis_item, prosthesis_base_name) -- TODO probably will have to move this from the TOC menu to classic equip to have dynamic durability - + -- TODO We need to pass the original item so we can get its data! local player = getPlayer() local toc_data = player:getModData().TOC + + + local item_mod_data = prosthesis_item:getModData() + + if item_mod_data.TOC == nil then + GenerateEquippedProsthesis(prosthesis_item, "Test") -- TODO Change it with the limb + item_mod_data = prosthesis_item:getModData() -- Updates it + end + + + --print("TOC: Test durability normal item " .. item_mod_data.TOC.durability) + + local prosthesis_name = TocFindCorrectClothingProsthesis(prosthesis_base_name, part_name) local added_prosthesis = player:getInventory():AddItem(prosthesis_name) + + -- Add parameters to added_prosthesis + local added_prosthesis_mod_data = added_prosthesis:getModData() + + added_prosthesis_mod_data.TOC = { + durability = item_mod_data.TOC.durability, + speed = item_mod_data.TOC.speed, + } + + + --print("TOC: Test durability new item " .. added_prosthesis_mod_data.TOC.durability) + + + if part_name ~= nil then if added_prosthesis ~= nil then @@ -44,6 +72,8 @@ end function TocUnequipProsthesis(patient, part_name, equipped_prosthesis) + -- TODO Pass the parameters generated from EquipProsthesis to the re-generated normal item + local toc_data = patient:getModData().TOC toc_data.Limbs[part_name].is_prosthesis_equipped = false @@ -54,14 +84,21 @@ function TocUnequipProsthesis(patient, part_name, equipped_prosthesis) for _, prost_v in ipairs(GetProsthesisList()) do local prosthesis_name = string.match(equipped_prosthesis_full_type, prost_v) if prosthesis_name then - patient:getInventory():AddItem("TOC." .. prosthesis_name) + + -- Get mod data from equipped prosthesis so we can get its parameters + local equipped_prosthesis_mod_data = equipped_prosthesis:getModData() + + + local base_prosthesis_item = patient:getInventory():AddItem("TOC." .. prosthesis_name) + local base_prosthesis_item_mod_data = base_prosthesis_item.getModData() + base_prosthesis_item_mod_data.TOC = { + durability = equipped_prosthesis_mod_data.TOC.durability, + speed = equipped_prosthesis_mod_data.TOC.speed + } + patient:setWornItem(equipped_prosthesis:getBodyLocation(), nil) patient:getInventory():Remove(equipped_prosthesis) toc_data.Limbs[part_name].equipped_prosthesis = nil end - end - - -end - +end \ No newline at end of file diff --git a/media/lua/client/TOC_ClientCommands.lua b/media/lua/client/TOC_ClientCommands.lua index 4332b63..7e06f68 100644 --- a/media/lua/client/TOC_ClientCommands.lua +++ b/media/lua/client/TOC_ClientCommands.lua @@ -68,10 +68,11 @@ end ServerCommands.EquipProsthesis = function(arg) -- part_name = arg[1] - -- prosthesis = arg[2] - + -- prosthesis_item = arg[2] + -- prosthesis_name = arg[3] + local data = arg["toSend"] - TocEquipProsthesis(data[1], data[2]) + TocEquipProsthesis(data[1], data[2], data[3]) end @@ -199,12 +200,12 @@ function SendOperateLimb(player, part_name, surgeon_factor, use_oven) sendClientCommand("TOC", "SendServer", arg) end -function SendEquipProsthesis(player, part_name, prosthesis_base_name) +function SendEquipProsthesis(player, part_name, item, prosthesis_base_name) local arg = {} arg["From"] = getPlayer():getOnlineID() arg["To"] = player:getOnlineID() arg["command"] = "EquipProsthesis" - arg["toSend"] = { part_name, prosthesis_base_name} + arg["toSend"] = { part_name, item, prosthesis_base_name} sendClientCommand("TOC", "SendServer", arg) end diff --git a/media/lua/client/TOC_Debug.lua b/media/lua/client/TOC_Debug.lua index 376f25b..cebf84d 100644 --- a/media/lua/client/TOC_Debug.lua +++ b/media/lua/client/TOC_Debug.lua @@ -146,5 +146,7 @@ function TocTestItem() local found_item = player_inventory:FindAndReturn(item_name) print(found_item:getID()) - + print("_______________") + found_item:setID(12334) + print(found_item:getID()) end \ No newline at end of file diff --git a/media/lua/client/TOC_ProsthesisHandler.lua b/media/lua/client/TOC_ProsthesisHandler.lua index f64b4b3..5489ba2 100644 --- a/media/lua/client/TOC_ProsthesisHandler.lua +++ b/media/lua/client/TOC_ProsthesisHandler.lua @@ -28,9 +28,11 @@ local TopStats = { -function GenerateEquippedProsthesis(prosthesis_item) +function GenerateEquippedProsthesis(prosthesis_item, limb) -- TODO Durability should be decided from the clothing item xml. Same thing for disassembling stuff + -- TODO some stuff should be defined by the limb, like -10 if forearm in speed + local durability = 0 local speed = 0 @@ -54,39 +56,36 @@ function GenerateEquippedProsthesis(prosthesis_item) end end - -- TODO This won't work since if we unequip it we would lose this stuff. We need to bind it to the item - local prosthesis_table = { - prost_id = prosthesis_item:getID(), - prost_name = prosthesis_name, + local item_mod_data = prosthesis_item:getModData() + + -------------------- + -- TEST STUFF + durability = 12 + speed = 51 + + ------------------- + + + item_mod_data.TOC = { durability = durability, - speed = speed + speed = speed, } - - - return prosthesis_table end -local ProsthesisRecipe = {} +--local ProsthesisRecipe = {} -function ProsthesisRecipe.OnCreate.Hook(items, result, player, selectedItem) +-- function ProsthesisRecipe.OnCreate.Hook(items, result, player, selectedItem) - -- Set mod data for item with durability and all that crap +-- -- Set mod data for item with durability and all that crap - -- when we equip a prosthesis, we're gonna pass these parameters to the newly generated clothing item +-- -- when we equip a prosthesis, we're gonna pass these parameters to the newly generated clothing item - -- when we unequip it, we regen the normal item with the parameters from the clothing item +-- -- when we unequip it, we regen the normal item with the parameters from the clothing item -end +-- end - -function DoWeReallyNeedThis() - - -- We need a durability check... so in modData - - -- -end \ No newline at end of file diff --git a/media/lua/client/TimedActions/ISInstallProsthesis.lua b/media/lua/client/TimedActions/ISInstallProsthesis.lua index 30ecbdb..11a30b2 100644 --- a/media/lua/client/TimedActions/ISInstallProsthesis.lua +++ b/media/lua/client/TimedActions/ISInstallProsthesis.lua @@ -3,6 +3,9 @@ require "TimedActions/ISBaseTimedAction" ISInstallProsthesis = ISBaseTimedAction:derive("ISInstallProsthesis"); function ISInstallProsthesis:isValid() + + -- TODO add here conditions if the action can be performed or not, so if thing is in inventory + -- TODO 'not sure about multiplayer, maybe an overriding check? return true end @@ -49,17 +52,19 @@ function ISInstallProsthesis:perform() return end - self.surgeon:getInventory():Remove(prosthesis_base_name) -- Removes the base item and substitute it with the part one if self.patient ~= self.surgeon and isClient() then - SendEquipProsthesis(self.patient, self.part_name, prosthesis_base_name) + SendEquipProsthesis(self.patient, self.part_name, self.item, prosthesis_base_name) else - TocEquipProsthesis(self.part_name, prosthesis_base_name) + TocEquipProsthesis(self.part_name, self.item, prosthesis_base_name) end + + self.surgeon:getInventory():Remove(prosthesis_base_name) -- Removes the base item after we transferred everything + -- needed to remove from queue / start next. ISBaseTimedAction.perform(self) end diff --git a/media/scripts/TOC_recipes.txt b/media/scripts/TOC_recipes.txt index 9f3cc3f..8790bff 100644 --- a/media/scripts/TOC_recipes.txt +++ b/media/scripts/TOC_recipes.txt @@ -82,7 +82,7 @@ recipe Make wooden hook Category: Surgeon, Tooltip: Recipe_Tooltip_Wooden_hook, NeedToBeLearn: true, - OnCreate: ProsthesisRecipe.OnCreate.Hook, + } recipe Make metal hook From e84b6b65f1f234ecf2aa4fc4b8e1f243a5e98294 Mon Sep 17 00:00:00 2001 From: Pao Date: Sat, 11 Feb 2023 00:15:41 +0100 Subject: [PATCH 18/22] Added malus after amputation in traits --- media/lua/client/TOC_Init.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/media/lua/client/TOC_Init.lua b/media/lua/client/TOC_Init.lua index 9ca5989..c28c70d 100644 --- a/media/lua/client/TOC_Init.lua +++ b/media/lua/client/TOC_Init.lua @@ -261,14 +261,20 @@ local function TocDeclareTraits() local amp1 = TraitFactory.addTrait("Amputee_Hand", getText("UI_trait_Amputee_Hand"), -8, getText("UI_trait_Amputee_Hand_desc"), false, false) amp1:addXPBoost(Perks.Left_Hand, 4) + amp1:addXPBoost(Perks.Fitness, -1) + amp1:addXPBoost(Perks.Strength, -1) local amp2 = TraitFactory.addTrait("Amputee_LowerArm", getText("UI_trait_Amputee_LowerArm"), -10, getText("UI_trait_Amputee_LowerArm_desc"), false, false) amp2:addXPBoost(Perks.Left_Hand, 4) + amp2:addXPBoost(Perks.Fitness, -1) + amp2:addXPBoost(Perks.Strength, -1) local amp3 = TraitFactory.addTrait("Amputee_UpperArm", getText("UI_trait_Amputee_UpperArm"), -20, getText("UI_trait_Amputee_UpperArm_desc"), false, false) amp3:addXPBoost(Perks.Left_Hand, 4) + amp3:addXPBoost(Perks.Fitness, -1) + amp3:addXPBoost(Perks.Strength, -1) TraitFactory.addTrait("Insensitive", getText("UI_trait_Insensitive"), 6, getText("UI_trait_Insensitivedesc"), false, false) From 49fa5b3f62352b12d3f2a6e709abf5049f304425 Mon Sep 17 00:00:00 2001 From: Pao Date: Sat, 11 Feb 2023 03:34:20 +0100 Subject: [PATCH 19/22] forgot to reneable stuff and more things in preparation for modular prost --- media/lua/client/TOC_OverridenFunctions.lua | 32 +++++------- media/lua/client/TOC_ProsthesisHandler.lua | 6 +-- python_helpers/main.py | 52 ++++++++++++++++---- python_helpers/modules_prost.xlsx | Bin 27661 -> 31029 bytes 4 files changed, 56 insertions(+), 34 deletions(-) diff --git a/media/lua/client/TOC_OverridenFunctions.lua b/media/lua/client/TOC_OverridenFunctions.lua index 13f7f3c..3ff974f 100644 --- a/media/lua/client/TOC_OverridenFunctions.lua +++ b/media/lua/client/TOC_OverridenFunctions.lua @@ -72,17 +72,14 @@ function ISInventoryPane:onMouseDoubleClick(x, y) local item_to_check = self.items[self.mouseOverOption] local player_inventory = getPlayerInventory(self.player).inventory ------------------------------------------------------------------------------------ - -- TODO THIS IS DISABLED ONLY FOR TEST!!!!! REMEMBER TO RESTORE IT ------------------------------------------------------------------------------------ - -- if instanceof(item_to_check, "InventoryItem") then - -- og_ISInventoryPaneOnMouseDoubleClick(self, x, y) - -- elseif CheckIfItemIsAmputatedLimb(item_to_check.items[1]) or CheckIfItemIsInstalledProsthesis(item_to_check.items[1]) then - -- --print("TOC: Can't double click this item") - -- else - -- end + if instanceof(item_to_check, "InventoryItem") then + og_ISInventoryPaneOnMouseDoubleClick(self, x, y) + elseif CheckIfItemIsAmputatedLimb(item_to_check.items[1]) or CheckIfItemIsInstalledProsthesis(item_to_check.items[1]) then + --print("TOC: Can't double click this item") + + end og_ISInventoryPaneOnMouseDoubleClick(self, x, y) @@ -96,17 +93,12 @@ function ISInventoryPane.getActualItems(items) local ret = og_ISInventoryPaneGetActualItems(items) -- This is gonna be slower than just overriding the function but hey it's more compatible ------------------------------------------------------------------------------------ - -- TODO THIS IS DISABLED ONLY FOR TEST!!!!! REMEMBER TO RESTORE IT ------------------------------------------------------------------------------------ - - - -- for i = 1, #ret do - -- local item_full_type = ret[i]:getFullType() - -- if string.find(item_full_type, "Amputation_") or string.find(item_full_type, "Prost_") then - -- table.remove(ret, i) - -- end - -- end + for i = 1, #ret do + local item_full_type = ret[i]:getFullType() + if string.find(item_full_type, "Amputation_") or string.find(item_full_type, "Prost_") then + table.remove(ret, i) + end + end return ret end diff --git a/media/lua/client/TOC_ProsthesisHandler.lua b/media/lua/client/TOC_ProsthesisHandler.lua index 5489ba2..d5dc025 100644 --- a/media/lua/client/TOC_ProsthesisHandler.lua +++ b/media/lua/client/TOC_ProsthesisHandler.lua @@ -32,6 +32,8 @@ function GenerateEquippedProsthesis(prosthesis_item, limb) -- TODO Durability should be decided from the clothing item xml. Same thing for disassembling stuff -- TODO some stuff should be defined by the limb, like -10 if forearm in speed +-- -- when we equip a prosthesis, we're gonna pass these parameters to the newly generated clothing item +-- -- when we unequip it, we regen the normal item with the parameters from the clothing item local durability = 0 local speed = 0 @@ -80,10 +82,6 @@ end -- -- Set mod data for item with durability and all that crap --- -- when we equip a prosthesis, we're gonna pass these parameters to the newly generated clothing item - --- -- when we unequip it, we regen the normal item with the parameters from the clothing item - -- end diff --git a/python_helpers/main.py b/python_helpers/main.py index 2da21dc..566c62c 100644 --- a/python_helpers/main.py +++ b/python_helpers/main.py @@ -1,8 +1,10 @@ import lxml.etree as gfg import pandas as pd +import numpy as np +import openpyxl -def generate_clothing_item(model, texture_choices, guid = None): +def generate_clothing_item(name, part, model, texture_choices, guid = None): root = gfg.Element("clothingItem") m_MaleModel = gfg.Element("m_MaleModel") @@ -23,21 +25,24 @@ def generate_clothing_item(model, texture_choices, guid = None): m_Static = gfg.Element("m_Static") m_Static.text = "false" + root.append(m_Static) m_AllowRandomTint = gfg.Element("m_AllowRandomTint") m_AllowRandomTint.text = "false" + root.append(m_AllowRandomTint) # TODO Defined by the amount of textures that we're gonna pass for tex in texture_choices: - textureChoices = gfg.Element("textureChoices") textureChoices.text = tex + root.append(textureChoices) tree = gfg.ElementTree(root) - with open("Test_Name.xml", "wb") as file: - tree.write(file, encoding='utf-8', xml_declaration=True, pretty_print=True ) + path = r'output_clothing/Prost_' + part + "_" + name + ".xml" + with open(path, "wb") as file: + tree.write(file, encoding='utf-8', xml_declaration=True, pretty_print=True ) def generate_recipe(recipe_name, recipe_items, result_name, time, skill_required, tooltip): # TODO Simple txt, so strings should be fine. @@ -65,8 +70,6 @@ def generate_recipe(recipe_name, recipe_items, result_name, time, skill_required file.write(root_element) file.close() - - def generate_item(item_name, weight, item_type, display_category, display_name, icon, tooltip, can_have_holes, clothing_item=None, body_location = None, blood_location = None): # TODO This is a txt, so we're gonna use simple strings I guess print("Generating item") @@ -97,10 +100,39 @@ def generate_item(item_name, weight, item_type, display_category, display_name, file.close() ########################################################################################### +def read_table(file_name: str, table_name: str) -> pd.DataFrame: + wb = openpyxl.load_workbook(file_name, read_only= False, data_only = True) # openpyxl does not have table info if read_only is True; data_only means any functions will pull the last saved value instead of the formula + for sheetname in wb.sheetnames: # pulls as strings + sheet = wb[sheetname] # get the sheet object instead of string + if table_name in sheet.tables: # tables are stored within sheets, not within the workbook, although table names are unique in a workbook + tbl = sheet.tables[table_name] # get table object instead of string + tbl_range = tbl.ref #something like 'C4:F9' + break # we've got our table, bail from for-loop + data = sheet[tbl_range] # returns a tuple that contains rows, where each row is a tuple containing cells + content = [[cell.value for cell in row] for row in data] # loop through those row/cell tuples + header = content[0] # first row is column headers + rest = content[1:] # every row that isn't the first is data + df = pd.DataFrame(rest, columns = header) + wb.close() + return df + +########################################################################################### + +excel_path = r'python_helpers/modules_prost.xlsx' +df_base = read_table(excel_path, "BaseTable") +df_top = read_table(excel_path, "TopTable") + +for base_row in df_base.iterrows(): + for top_row in df_top.iterrows(): + base_name = base_row[1][0] + top_name = top_row[1][0] + + current_name = base_name + "_" + top_name + generate_clothing_item(current_name, "LowerArm", "test", {"test1", "test2"}, "123") + + -forearm_data = pd.read_excel('modules_prost.xlsx', sheet_name = "Forearm") -data = pd.DataFrame(excel_data, columns) @@ -118,7 +150,7 @@ time = 10 skill_required = ["Carpentry", "4"] tooltip = "tooltip_test" -generate_recipe(recipe_name, recipe_items, result_name, time, skill_required, tooltip) +#generate_recipe(recipe_name, recipe_items, result_name, time, skill_required, tooltip) item_name = "Ass Ass Ass" @@ -129,4 +161,4 @@ display_name = "Ass cock" clothing_item = "ClothingItemSomethingProst" body_location = "TOC_ArmRightProsthesis" -generate_item(item_name, weight, item_type, display_category, display_name, "test_icon", "test_tooltip", "false", clothing_item, body_location, "Hands") \ No newline at end of file +#generate_item(item_name, weight, item_type, display_category, display_name, "test_icon", "test_tooltip", "false", clothing_item, body_location, "Hands") \ No newline at end of file diff --git a/python_helpers/modules_prost.xlsx b/python_helpers/modules_prost.xlsx index 27265b1f0f9ec555ce4c988ac6528f85783ebeec..f0e7b33fc602f0bfdb7279c824ceaf9c11f1500c 100644 GIT binary patch delta 7028 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 delta 4412 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 Date: Sat, 11 Feb 2023 14:27:07 +0100 Subject: [PATCH 20/22] automatically generating item via script --- python_helpers/main.py | 45 +++++++++++++++++++++++++----- python_helpers/modules_prost.xlsx | Bin 31029 -> 31333 bytes 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/python_helpers/main.py b/python_helpers/main.py index 566c62c..7b4f0d4 100644 --- a/python_helpers/main.py +++ b/python_helpers/main.py @@ -4,7 +4,7 @@ import numpy as np import openpyxl -def generate_clothing_item(name, part, model, texture_choices, guid = None): +def generate_clothing_item(name, model, texture_choices, guid = None): root = gfg.Element("clothingItem") m_MaleModel = gfg.Element("m_MaleModel") @@ -39,7 +39,7 @@ def generate_clothing_item(name, part, model, texture_choices, guid = None): tree = gfg.ElementTree(root) - path = r'output_clothing/Prost_' + part + "_" + name + ".xml" + path = r'python_helpers/outputs/output_clothing/' + name + ".xml" with open(path, "wb") as file: tree.write(file, encoding='utf-8', xml_declaration=True, pretty_print=True ) @@ -89,16 +89,18 @@ def generate_item(item_name, weight, item_type, display_category, display_name, root_element += f"\t\tIcon = {icon},\n" root_element += f"\t\tTooltip = {tooltip},\n" - root_element += f"\t\tCanHaveHoles = {can_have_holes},\n" + root_element += f"\t\tCanHaveHoles = {can_have_holes.lower()},\n" - root_element += "\t}" + root_element += "\t}\n" + path = r'python_helpers/outputs/output_item/script.txt' - with open("Test_Item.txt", "wt") as file: + with open(path, "at") as file: file.write(root_element) file.close() + ########################################################################################### def read_table(file_name: str, table_name: str) -> pd.DataFrame: wb = openpyxl.load_workbook(file_name, read_only= False, data_only = True) # openpyxl does not have table info if read_only is True; data_only means any functions will pull the last saved value instead of the formula @@ -122,16 +124,45 @@ excel_path = r'python_helpers/modules_prost.xlsx' df_base = read_table(excel_path, "BaseTable") df_top = read_table(excel_path, "TopTable") + +# CLOTHING GENERATION PASS + +limbs = ["Hand", "LowerArm"] +sides = ["Left", "Right"] + for base_row in df_base.iterrows(): for top_row in df_top.iterrows(): base_name = base_row[1][0] top_name = top_row[1][0] - current_name = base_name + "_" + top_name - generate_clothing_item(current_name, "LowerArm", "test", {"test1", "test2"}, "123") + for limb in limbs: + for side in sides: + current_name = "Prost_" + side + "_" + limb + "_" + base_name + "_" + top_name + generate_clothing_item(current_name, "test", {"test1", "test2"}, "123") +prost_bodylocations = ["TOC_ArmRightProsthesis", "TOC_ArmLeftProsthesis"] + + + +# ITEM GENERATION PASS - ASSEMBLED +for base_row in df_base.iterrows(): + for top_row in df_top.iterrows(): + base_id = base_row[1]["Base"] + top_id = top_row[1]["Top"] + + item_id = base_id + "_" + top_id + item_type = "Clothing" + weight = "{0:.2f}".format(float(base_row[1]["Weight"]) + float(top_row[1]["Weight"])) + display_category = "Prosthesis" + display_name = "Prosthesis - " + base_row[1]["Display Name"] + " - " + top_row[1]["Display Name"] + + for limb in limbs: + for side in sides: + clothing_item_name = "Prost_" + side + "_" + limb + "_" + base_id + "_" + top_id + bl = prost_bodylocations[0] if side == "Right" else prost_bodylocations[1] + generate_item(item_id, weight, item_type, display_category, display_name, "TempIcon", "TempTooltip", "false", clothing_item_name, bl, "TestBloodLocation") diff --git a/python_helpers/modules_prost.xlsx b/python_helpers/modules_prost.xlsx index f0e7b33fc602f0bfdb7279c824ceaf9c11f1500c..2fe1c773296b84c53e1a8d11f0bc3be42b2cd0a2 100644 GIT binary patch delta 4432 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 delta 4100 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 From 3ea76e88346a374deed9bce51168276bc568dcb6 Mon Sep 17 00:00:00 2001 From: Pao Date: Sat, 11 Feb 2023 14:55:38 +0100 Subject: [PATCH 21/22] generating normal item for assembly --- python_helpers/main.py | 20 +++++++++++++++----- python_helpers/modules_prost.xlsx | Bin 31333 -> 31582 bytes 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/python_helpers/main.py b/python_helpers/main.py index 7b4f0d4..74333e1 100644 --- a/python_helpers/main.py +++ b/python_helpers/main.py @@ -72,7 +72,6 @@ def generate_recipe(recipe_name, recipe_items, result_name, time, skill_required def generate_item(item_name, weight, item_type, display_category, display_name, icon, tooltip, can_have_holes, clothing_item=None, body_location = None, blood_location = None): # TODO This is a txt, so we're gonna use simple strings I guess - print("Generating item") root_element = f"item {item_name}\n" root_element += "\t{\n" @@ -129,6 +128,9 @@ df_top = read_table(excel_path, "TopTable") limbs = ["Hand", "LowerArm"] sides = ["Left", "Right"] +prost_bodylocations = ["TOC_ArmRightProsthesis", "TOC_ArmLeftProsthesis"] + + for base_row in df_base.iterrows(): for top_row in df_top.iterrows(): @@ -142,7 +144,6 @@ for base_row in df_base.iterrows(): -prost_bodylocations = ["TOC_ArmRightProsthesis", "TOC_ArmLeftProsthesis"] @@ -156,7 +157,7 @@ for base_row in df_base.iterrows(): item_type = "Clothing" weight = "{0:.2f}".format(float(base_row[1]["Weight"]) + float(top_row[1]["Weight"])) display_category = "Prosthesis" - display_name = "Prosthesis - " + base_row[1]["Display Name"] + " - " + top_row[1]["Display Name"] + display_name = "Prosthesis - " + base_row[1]["Display Name"] + " and " + top_row[1]["Display Name"] for limb in limbs: for side in sides: @@ -165,9 +166,18 @@ for base_row in df_base.iterrows(): generate_item(item_id, weight, item_type, display_category, display_name, "TempIcon", "TempTooltip", "false", clothing_item_name, bl, "TestBloodLocation") +# ITEM GENERATION PASS - Single item to assemble stuff +def generate_normal_items(df, type): + for row in df.iterrows(): + item_id = "ProsthPart_" + row[1][type] + item_type = "Normal" + weight = "{0:.2f}".format(float(row[1]["Weight"])) + display_category = "Prosthesis" + display_name = row[1]["Display Name"] + generate_item(item_id, weight, item_type, display_category, display_name, "TempIcon", "TempTooltip", "false") - - +generate_normal_items(df_base, "Base") +generate_normal_items(df_top, "Top") #generate_clothing_item() diff --git a/python_helpers/modules_prost.xlsx b/python_helpers/modules_prost.xlsx index 2fe1c773296b84c53e1a8d11f0bc3be42b2cd0a2..94d004ecd459a74a55ef1d55f61983d1e4f482fd 100644 GIT binary patch delta 4821 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 Ua&o_001u!MK!NY+`Pb%7 delta 4552 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 Date: Sat, 11 Feb 2023 22:00:53 +0100 Subject: [PATCH 22/22] replacing ipairs with pairs --- media/lua/client/ActionsMethods/TOC_CutLimb.lua | 6 +++--- media/lua/client/ActionsMethods/TOC_OperateLimb.lua | 5 +---- media/lua/client/Interface/TOC_ContextMenus.lua | 3 ++- media/lua/client/TOC_Checks.lua | 9 ++++++--- media/lua/client/TOC_HelperFunctions.lua | 2 +- media/lua/client/TOC_Init.lua | 8 ++++---- media/lua/client/TOC_OverridenFunctions.lua | 2 +- media/lua/client/TOC_Update.lua | 4 ++-- python_helpers/main.py | 11 ++--------- 9 files changed, 22 insertions(+), 28 deletions(-) diff --git a/media/lua/client/ActionsMethods/TOC_CutLimb.lua b/media/lua/client/ActionsMethods/TOC_CutLimb.lua index 8eb95b4..0d07300 100644 --- a/media/lua/client/ActionsMethods/TOC_CutLimb.lua +++ b/media/lua/client/ActionsMethods/TOC_CutLimb.lua @@ -11,7 +11,7 @@ local function TocCheckIfStillInfected(limbs_data) local check = false - for _, v in ipairs(GetBodyParts()) do + for _, v in pairs(GetBodyParts()) do if limbs_data[v].is_infected then check = true end @@ -37,8 +37,8 @@ local function TocCureInfection(body_damage, part_name) -- TODO I think this is enough... we should just cycle if with everything instead of that crap up there for i = body_part_types:size() - 1, 0, -1 do - local bodyPart = body_part_types:get(i); - bodyPart:SetInfected(false); + local bodyPart = body_part_types:get(i) + bodyPart:SetInfected(false) end if body_part_type:scratched() then body_part_type:setScratched(false, false) end diff --git a/media/lua/client/ActionsMethods/TOC_OperateLimb.lua b/media/lua/client/ActionsMethods/TOC_OperateLimb.lua index 5379e83..8bd2e66 100644 --- a/media/lua/client/ActionsMethods/TOC_OperateLimb.lua +++ b/media/lua/client/ActionsMethods/TOC_OperateLimb.lua @@ -20,13 +20,10 @@ local function FixSingleBodyPartType(body_part_type, use_oven) end local function SetBodyPartsStatusAfterOperation(player, limbs_data, part_name, use_oven) - --for _, v in ipairs(GetBodyParts()) do - - local body_part_type = player:getBodyDamage():getBodyPart(TocGetAdiacentBodyPartFromPartName(part_name)) FixSingleBodyPartType(body_part_type, use_oven) - for _, v in ipairs(limbs_data[part_name].depends_on) do + for _, v in pairs(limbs_data[part_name].depends_on) do local depended_body_part_type = player:getBodyDamage():getBodyPart(TocGetAdiacentBodyPartFromPartName(v)) FixSingleBodyPartType(depended_body_part_type, use_oven) diff --git a/media/lua/client/Interface/TOC_ContextMenus.lua b/media/lua/client/Interface/TOC_ContextMenus.lua index f2bec76..fc6c519 100644 --- a/media/lua/client/Interface/TOC_ContextMenus.lua +++ b/media/lua/client/Interface/TOC_ContextMenus.lua @@ -16,7 +16,7 @@ TocContextMenus.CreateMenus = function(player, context, worldObjects, test) local local_player = getSpecificPlayer(player) --local players = getOnlinePlayers() - for k, v in ipairs(worldObjects) do + for k, v in pairs(worldObjects) do -- help detecting a player by checking nearby squares for x = v:getSquare():getX() - 1, v:getSquare():getX() + 1 do for y = v:getSquare():getY() - 1, v:getSquare():getY() + 1 do @@ -79,6 +79,7 @@ TocContextMenus.CreateOperateWithOvenMenu = function(player, context, worldObjec -- Check temperature if v_stove:getCurrentTemperature() > 250 then + -- ipairs here to keep the order for _, v_bodypart in ipairs(GetBodyParts()) do if part_data[v_bodypart].is_cut and part_data[v_bodypart].is_amputation_shown and not part_data[v_bodypart].is_operated then diff --git a/media/lua/client/TOC_Checks.lua b/media/lua/client/TOC_Checks.lua index 4086d77..0d7d51b 100644 --- a/media/lua/client/TOC_Checks.lua +++ b/media/lua/client/TOC_Checks.lua @@ -4,6 +4,10 @@ if TheOnlyCure == nil then TheOnlyCure = {} end + +local pairs = pairs + + ----------------------------------------- -- MP HANDLING CHECKS function CheckIfCanBeCut(part_name, limbs_data) @@ -60,9 +64,8 @@ end function CheckIfItemIsProsthesis(item) - -- TODO find a cleaner way local item_full_type = item:getFullType() - local prosthesis_list = GetProsthesisList() + local prosthesis_list = GetProsthesisList() -- TODO this isn't gonna work after the modular prost rewrite for _, v in pairs(prosthesis_list) do if v == item_full_type then @@ -88,7 +91,7 @@ end function CheckIfProsthesisAlreadyInstalled(limbs_data, part_name) - for _, side in ipairs(TOC_sides) do + for _, side in pairs(TOC_sides) do if string.find(part_name, side) then return (limbs_data[side .. "_Hand"].is_prosthesis_equipped or limbs_data[side .. "_LowerArm"].is_prosthesis_equipped) end diff --git a/media/lua/client/TOC_HelperFunctions.lua b/media/lua/client/TOC_HelperFunctions.lua index 2bb23c0..6793d07 100644 --- a/media/lua/client/TOC_HelperFunctions.lua +++ b/media/lua/client/TOC_HelperFunctions.lua @@ -74,7 +74,7 @@ end -- Override and mod compat helper function TocPopulateCanBeHeldTable(can_be_held, limbs_data) - for _, side in ipairs(TOC_sides) do + for _, side in pairs(TOC_sides) do can_be_held[side] = true if limbs_data[side .. "_Hand"].is_cut then diff --git a/media/lua/client/TOC_Init.lua b/media/lua/client/TOC_Init.lua index c28c70d..eb43a18 100644 --- a/media/lua/client/TOC_Init.lua +++ b/media/lua/client/TOC_Init.lua @@ -66,8 +66,8 @@ local function TocUpdateBaseData(mod_data) local accepted_prosthesis_upperarm = {} -- For future stuff local accepted_prosthesis_foot = {} - for _, side in ipairs(TOC_sides) do - for _, limb in ipairs(TOC_limbs) do + for _, side in pairs(TOC_sides) do + for _, limb in pairs(TOC_limbs) do local part_name = side .. "_" .. limb @@ -205,8 +205,8 @@ local function TocSetInitData(mod_data, player) - for _, side in ipairs(TOC_sides) do - for _, limb in ipairs(TOC_limbs) do + for _, side in pairs(TOC_sides) do + for _, limb in pairs(TOC_limbs) do local part_name = side .. "_" .. limb diff --git a/media/lua/client/TOC_OverridenFunctions.lua b/media/lua/client/TOC_OverridenFunctions.lua index 3ff974f..fd8fe8d 100644 --- a/media/lua/client/TOC_OverridenFunctions.lua +++ b/media/lua/client/TOC_OverridenFunctions.lua @@ -151,7 +151,7 @@ function ISEquipWeaponAction:perform() if self.item then local item_name = self.item:getFullType() - for _, prost_v in ipairs(GetProsthesisList()) do + for _, prost_v in pairs(GetProsthesisList()) do local prosthesis_name = string.match(item_name, prost_v) if prosthesis_name then self.character:Say("This isn't the right way to equip this...") diff --git a/media/lua/client/TOC_Update.lua b/media/lua/client/TOC_Update.lua index 8931761..254faf8 100644 --- a/media/lua/client/TOC_Update.lua +++ b/media/lua/client/TOC_Update.lua @@ -19,7 +19,7 @@ local function CheckIfPlayerIsInfected(player, toc_data) end -- Check for everything else - for _, v in ipairs(GetOtherBodyPartTypes()) do + for _, v in pairs(GetOtherBodyPartTypes()) do if body_damage:getBodyPart(v):bitten() then toc_data.Limbs.is_other_bodypart_infected = true -- Even one is enough, stop cycling if we find it break @@ -198,7 +198,7 @@ local function TocUpdateEveryTenMinutes() local part_data = player:getModData().TOC.Limbs --Experience for prosthesis user - for _, side in ipairs(TOC_sides) do + for _, side in pairs(TOC_sides) do if part_data[side .. "_Hand"].is_prosthesis_equipped or part_data[side .. "_LowerArm"].is_prosthesis_equipped then player:getXp():AddXP(Perks[side .. "_Hand"], 4) end diff --git a/python_helpers/main.py b/python_helpers/main.py index 74333e1..ab242ff 100644 --- a/python_helpers/main.py +++ b/python_helpers/main.py @@ -31,7 +31,7 @@ def generate_clothing_item(name, model, texture_choices, guid = None): m_AllowRandomTint.text = "false" root.append(m_AllowRandomTint) - # TODO Defined by the amount of textures that we're gonna pass + # Defined by the amount of textures that we're gonna pass for tex in texture_choices: textureChoices = gfg.Element("textureChoices") textureChoices.text = tex @@ -45,9 +45,6 @@ def generate_clothing_item(name, model, texture_choices, guid = None): tree.write(file, encoding='utf-8', xml_declaration=True, pretty_print=True ) def generate_recipe(recipe_name, recipe_items, result_name, time, skill_required, tooltip): - # TODO Simple txt, so strings should be fine. - print("Generating recipe") - root_element = f"recipe {recipe_name}\n" root_element += "\t{\n" @@ -71,8 +68,6 @@ def generate_recipe(recipe_name, recipe_items, result_name, time, skill_required file.close() def generate_item(item_name, weight, item_type, display_category, display_name, icon, tooltip, can_have_holes, clothing_item=None, body_location = None, blood_location = None): - # TODO This is a txt, so we're gonna use simple strings I guess - root_element = f"item {item_name}\n" root_element += "\t{\n" @@ -180,9 +175,7 @@ generate_normal_items(df_base, "Base") generate_normal_items(df_top, "Top") -#generate_clothing_item() - -# TODO we should get this stuff from a csv\xlsx and generate the correct values from that +######################################################################################### recipe_name = "Test Recipe" recipe_items = ["Ass", "Penis", "Shit=3"]