From 86b084f69457cb22f75174545bf1bf3da8bc82a5 Mon Sep 17 00:00:00 2001 From: derek Date: Tue, 26 Nov 2024 17:07:36 -0600 Subject: [PATCH] made bullet with a camera on the end. other tweaks --- assets/Models/revolver1.roughness.png | Bin 24514 -> 18434 bytes assets/bullet.tscn | 2 +- assets/bullet_cam.tscn | 143 ++++++++++++++++++ assets/mac_10.tscn | 6 +- assets/pistol1.tscn | 121 +++++++-------- assets/player.tscn | 6 +- assets/tracker_bullet.tscn | 2 +- assets/tracker_marker.tscn | 21 ++- scripts/bullet.gd | 103 +++++++++---- scripts/bullet_cam.gd | 106 +++++++++++++ .../{tracker_bullet.gd => bullet_tracking.gd} | 5 +- scripts/player.gd | 88 ++++++----- scripts/room_manager.gd | 21 ++- scripts/shotgun_pellet.gd | 5 +- scripts/signal_bus.gd | 1 + scripts/spider.gd | 5 +- scripts/trackerGun.gd | 7 +- 17 files changed, 484 insertions(+), 158 deletions(-) create mode 100644 assets/bullet_cam.tscn create mode 100644 scripts/bullet_cam.gd rename scripts/{tracker_bullet.gd => bullet_tracking.gd} (98%) diff --git a/assets/Models/revolver1.roughness.png b/assets/Models/revolver1.roughness.png index 569b156e6c22d92068b9fe8d58a47e72aa061471..aebb732f936129e782c996058bf1c233b0b874e7 100644 GIT binary patch literal 18434 zcmbTc2UL^YwkQfe3Zj6DbV8BdLT{l;CkY@;dXY}(B!F}gRHOw69Reb~_pS(n5Nd!( zkuEiKL=cqbi~H=e$9Zqu_wIN%V|*iDnQN}u*PLt37=1l0%G*r0iHL|O!P@GEL`1}{ zf3I7lgg3z(c2k5uavyDT1QF4l2Y)YOqHHt+5z&nUn6a6knXZnUgSV%!oujwClW?G? z4*{BpNI^N!$Iijs$&cOM$pz-6$Z`0-i-R5JsK{X|r7NoIqvqra(+-9^83pSZI|REs zfE+oLmDm*m

Boo&4AN4Wp{T7-lBUm$+&iX19`CuBF%)n`}p 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 P00000NkvXXu0mjfpq6O? literal 24514 zcmX`T2|Qcd_dZKOkYaKk{*%>I>N0Wc8?zf_^`Kp&VpjyI_5FV{eMH ztbZqFJa@8n5a?c-#k0ejZ)4?3*}9WYl4KV7N)f^h4%~6MaqXZKqjt_ly=hL@>6VXd zTaiok&T{qn??N;_PI&o-kqr;Ki-`WVw-sj_9a0)1+Vo~`d#NGBqlBmy{KVT+MEtj+ z9fdBuSewo{(NKotgKCg`Y9C57BEU;`L3dJ!jv1vGcvID9lG$#1qvA6Iutx}h5z`}o zTeoK|`>mYa@gF*bZ(-2z-HYA{A?sr*acV@1x3K-V-MiCwHy7h&2i=+@9ngvLKTUBC z-tkAT`fqmrXsgML-b4IZ6>C{XkF=m=OCMPgB!w2|9`ynpf4(xFV% z!o(YGn-w2*o+Sel&d_HNXMc|}da6?F@A9xo+AVC+;jbpeh}OspOUKOBMxoz=qpT#a z{!8d-Axtlkk5e_7v7;lmA7H1#KGNu28QAc9K!uOc;eVXXirtw3v5DITv0ahdc8#;7 zeOzeQVWd#slHq3{ZqVWOQ&n#;>*KzZGpBLL3MF|jvqfw;RiauG()bcazW_L6E-aJw z`2Ov{fAhK%F8&qjgOZaKKYp>ow7#|E`sGt(KQuYSkZM*EWS19ucKddspjO$5B&Wu4 zzXo`yLFUYpeZQ;vPma;DjvsP=t@oG+ zfp^k%uTqXqoP%Evkt24SH!?qISH|I(PhF()40*<$ZBIs_D;d$-mvONsCDH~8LAXxL zFn)d2Y=czI=+iP{#daMWI!hZjS)r;T#HIrL4~zagxO9##5ewZGzvOYsh`aY2>ol4- z{nhJwj^w1}#tD{?Or_1vv#7)o+^f!}`1QC|mA9Qv{pg7+b?&cmlCqmv`}M&rUV;@S zFPH38EV2P~803JQYp71|$_(&b3JuUUr=>NhKy>*ClR ziW-7mRP*nL5cTXhmLW5*q15--_|-^JSFv!C&U|*wl4oPb$W*R~!-*lhX8hd5JKq;_ zqWXgD1X}=$9gUmLXTwlk}=wUCGx!G7U1fKzwPh8QIQ{WI_x~>Ykzo-%g2s ziu`m}DMa%kw^Y2Cl$EEJ!G$4(wyFF`gxv{o2jP#Ckfn%-dTkA2vCU3A_qE8Nmkztzw?279;vUEI6B>=L<>BPx|`Uz2C(<{M-2 zz`oc9>0PL~ozzj$U1^DHbgGVbp*d$cMA1p3i`fqdJ5TYQ-Gm!s%AmN{q0ExErYat; zrf8=Csuk5taX|FX&9nNtc>x+%nQ(~yb|h`AVU00#wvKE`wcR{Lwd8(xVLy(jh)Be% zUg7Kq$otsV6%0FFW=ToxIv6>yu`h`G%%3Z68r)tNYK33o#$KG9=o)={zdt>wj3@_X zR47_J!H%LnjpEnoPkSCuXMHNjV7KWE1F{%UwzGV4_TE^4mZR66)|mJV{BK%kJz>-R z&@{h#jvs~x0N zYsFL0Y+xDm`B%maazRRaGR&-mRATY;=mJSs%Gt$COLBVq=Enbk$AL;Pn-Ngb~?Iq79e+E<JC@wQ zj+~vdh#~B@mclpQH~5MbJ}IMFVKVLLUHF+CY|u+_Uk3M(Vogz*?N+p1|H8Do@D>lW zWH9p5gVdR~Tzt5BHe-U(FZy9q139Xmgjr|TytdeBMS#VprAaZstz=|~Mvy8im~PjC8jKx`C&4>9L%o!o+i`Q$HxtU3QvQ zEv2~IG2UA|!axzFU1H3+u43xd-){mD(%2%%=}JqnI^mY) zS9`xupXI)iL3KW)&(B5mat#AFTWgzir2cgoQAeqyD0(GNEul&vCe28%%JV&6%G0!} zi+EZkiv{tVnwXzZa(sdFe(I!rs*@H!FsQ^!HXI_cf3si4c*THcM%pyvp_rtgcLN9? zM^a^DRjFhGhi0LsrAlq6X84&-u0g4G#8P#?;FAg=MKxA+1wVWT{mxUG8qE?VyWUP- z4x~3)2J}!Y!(k01;j!I@Yyu?`=8nSvKm1kRha?DkJXug!*Q&^_rl~fftNy+0bVMxt zWHR9!YqKG`K})b&HW%6R*MWgY4WMnhi56dnoPjRo!BQ@OQR@~#6yiy4FHxM>C>4=##eC4hDyPmAz=z4mEWk4b@ z4!!=P`Z{`MJT9K8R5wF$@M?8WnBMro3gR%5Yx!*ifU3@V`tl;@h}mT5uXmq6+>DFP z=UZ8?v@laJ0<)0*53^YT1LYa<&3$5bK^HX0A1Z!)>n) zW!~g@c!m;p&V+J`%tj&Vz}M6Tim5lQ|7;tH53r!QLS<20p4dxj&TA$v-4i2?V_F!2Hts&v#nW|X`Rnp~kf5Gi|WBu+LE z7I7WTEGdOxYpaHeC7`4w6+?a7tK=l#%b)->?fqt}@AHNvx*+Sgpx{iLY)dFO`?jxH~Fq5lAn+WMIdoFb+p zL!i%F3t(?#H%#^(+>`_}ObjAyHZDI5Ip%D1-289CiVjF_O^q^Hamop=$^7BOTP@?o ztsn$Pd=Bq$6gW$@ptieT47f>Dse#Rx0A#V`+z$7{JU<981(( z5t1l7N}ZCS<@jt}_&k(brRG$u7zpb#7=i1+oW&{62wHIP!Yo3f%RwEZb#^*3pp$Mg))u-Ys}TqNaQStVbmH6uvJ_Y&Ib2jWja;)EEdef9ga&}LhB!wY zsFbj^l?AM1!byITR)5iYD3orBW=`Z~S2L71J;zi+u9tMgX4&p0FG?-_<<+fXVWE~{ z#ux-&U1yK24vtuQ9EFCEi0+u>zxFP}=XqlZ256{>N(KHZoOdlbQBECVPQAaES54G2 z7(O1FHc%Ht+-U~YzXkXtQzy$Sdp52tvcITj~BLwOE7-+9Sd8hxR^52ga4z=G7({y~J-?TRM&K>#c7#YHK?XcL6+smtv zOOEB6_&+$ieSD~^)n{g%MHs{^F4(vj(o7P8!HF$~8{#r1p*xy>Z%(yX^pS>23i^p};}sPy%y_yJz4Ot~GT?}OWV z7|}2<;MTyo@+T(k<|C=JFtXaigJm0x)wx96Oa+lwoZ*v9I?7?3I=Nzj-g0yHsC2iB z$>g-V6KcA8T?2?s=_KZn&OvT5e9ObW*$fds&K~hYE`0g6>h4vH3s6Ypyu&z2vWPeM z64vKEG{19^%~eikBVH7gq@s0-rC?NPaQK+v+m@u=+%OlWd9!sGbgRs|DRC<$c+)D@bob4EHs>`Eb)mZW{ z_mV0zv}SE4$>}Q;i)KX42k^a7oq=E9L^&>*$VRM5+t_3v=@puem==}&)SU)^|M)Yr z@7R-{WW0QM9`XDgR42uhb@z%Iqw{OprIVcI)v%cinty(YN=?tWYoYyDzODO0VrQsR zP41ZW$n0hZyre+F#!<5*PFTCtalgmPL&Fk|Y*aztB|7<|rwKZ6o)hr?x=4@J=&-^3 zq+#ukxhgqm7Vh&)@NV%t7{&J6ixtpD?sj2@Ev(sLbD^efbFsRo7BpFoNXO}1pWXB7 zy!6P3S8O;6*P+tmJ~c=l&2sWLPolS-3O{Y52H*M$rOH9QA@fDgy1K{OYFbFn@NZm& z8k=?dA4tQFc_Db)*7dQ~$jZ;>a3$767T3e!YCN8GH-UU9))TdL3`$Ks3iS=P8j744 zn;h&51djpT+uY0Qi&;{2vGky+DUv8BMd2?qXPkq+zby&XNw@emn6?lm+s#Ofd*;OLq*#AL#dzHtL@?<#KqJ%2t=cKK+M&+ZX^9NiN{rtrg_)eSdvi~1 zi3l>f9IjJt2G1sr^oN=5qQ)3nbaMw1&TY87YvzecQ8?8g17C|9fgc}8wVEc1xqAMQ zjY_QdSQo63y4MxetW>&ClI#f@)v9DZo(HsQ@A>oSLb~>4U;ZqCu;{~ED>a|*1Nskg z6^2S$f7DWmNVBcnT3oOqkN$UPXh~FT(0C4`P~nEf{TG0s8Ru6LPYB7;n3EvKrMo4l zqup&c9u}*I*oI*DFG~QnKW+8r!^y?FliK-JJZ8f7^1`+wJk{+-SXf|o|mG^Qdvu$3luLbo|=5pGVy@E|5!gA@0dBb=~nCh(Nk%$l1luy?# zzg-Da_!#>nb5Ro&IAT1486SrDI1~?sh7@fa5l>T6$cU5T{GjjlY*x;P4+N7U{P#=N zvpx;8GojoHOCK%XoU%B3t?Tv+qtcMT_(_IS$jsfW5;~L`H(mdFrF87{!o*qDf~1Ur zr}}D^g=4B8)dsr8me(yuELodV+xt;^WA8Hg`+SI;%1RIU4RF=^Vfq6w5kivMgcdDk)jSRQAN;oQIKCEjlI7SrrNG6x(RNw?6ZiE83jd;0)gcsyI;R$VEsoDq*SUi8eO1$w z(lRrv8x4&YpBkDJgM!0>q_imDO+KAX_|j!v!zi#0vvuFrCQqN~EjM<$sboO8 zmV}&`9`-dE2(9uUq(_Up<=G=cE|19zIIHUSs>Ud{c8pdMzT)n^e*&O-79ui)C%_TZ znCjM7;l#q@hUHI&la&dN@E>KI?uXm@ zK?ha}_dI_zZ6S+L8i!7ql4eUN|G;k~zcZ{x@}WwKSO&NFhzi(Bf>aJCY-w z8s*@>(E1*S{{&T&!bp{4L@DZ-zD#~ma6c3_a*u5h!s|63n+HDJY2DhDuQ<7&**g?G zGr!U(wW$Pe_S4i~gPts!rq0g^P(`|1hsJ4fqI4C7KlRo3^8PHUrr3}UnI^2zs)N3N zg1`rUuvZ?2Gw#9YO9Hj2aH}o22AfP*_6bbfNgky*?v4~iBSzLp!a`+ZO*gyTz0RWC z!z3XzOR^;w>^%e;m#%Jg^ODxXUeBy)A0`+(ToZ_Nx6Yo1gU4?lhV~oz zHc{t?Z|_;xtZyxT`?@oz4%qIbG3g-zKilLFjpzK8p{+-?0%mTh zB&o+J`GVIV*U+J=?)GDvs~$3V9!@@O6yH!T%cu*X<->0ipl$qHAS(*7J!5?-PBUj| zY<=(^`*wsuxDr3U1rNzaQ|dy479tDajHOcBWY)NK!3C| zH_0Jd0aaM3kfe|eU*Wmx2*c1zg-cLZcIO?AZOIo72q!`|0cd^=_m9|)6aH*-nwrtN zmHvoRVG8>@ap5>}KJFTP_*00gytR?bl&8;&O;SCN2^1f6S-G|2KCXUpF&?-{NJ=KT z53>~%dT6rTt|1J;FdWc%+QGP((P<_(xll{<+6=BFrW_^Pw5mB1^eVl(riOC!B;k_T zc>{hJ1RNIAFmbC&R^niKT{|Say%VbeI#a( zUSwxI`4;y4dc?hZICMrR^BCUJxmhi@095Ccjwz6$M1uG_Rl!#j)KbhTn0kx7xEP>X zH#T4)9VWtO*dROhcjYx?PL4h!Mkb>lcx}Rcn)$^=H)P)d!|iBPxwt1rPHV+F6fk54 z$3!-E_V)Lkbn<+~!P85s59I}q!itCT!c~oet<0N4Ug~eFKjtR~yxcO|!iA*-lNBxa zf)$czoblAN2Nk^Dmk(>l4O+uz5;BI^UK6&p(&OJPcYemr7c~p3=U%LPr|xL^p&&lM zcl3J-IcXUhwlq5l^dUPu)evfuG23d;M4Y?mOoVPtD~liW!(kv{w0r~5A}~Ayy*Dco z>8L74ZA<3-KtDGNBk83%Yb31%z8p83@2|IUK&hy5dzP?T0)7ZQ5$A*@W%N<(R}ySo zcrIp%kp3x}<`Y&QMDD)Ss4I%(uEb9nC@!mfh+4mp{{Xh;F>mB+bT6JB_8Bo#9$*C& z(6Ysi-@Tkq;CXy;yE1dh2Sf^%eQH#gwjs4Ix-Tdv{n}DKZph`(XtYwTajWF!f*5oC zz)G@w{d}y<^{becNgh+#M*;GJ>w9aE!E=Ab`;$$ZFUV(*7;P7MA_Mf9wRGSn}8i@ zECl(}H-`@fvQB5~R_E&9P-~9ybi>{$@=Gh+)#+}T8c0M%6_F=L z{z|%trdaaZjB;`Rfc%~=H$PoFpx#C`P=~mFogK^gpj*DBY*W4wN5QV7$fq^Hqn!dI-PqrHllc<` zKKkSgY83Bwze3-`TdnVDq$bydrI>jj;`f zu+&Md9JMUTzmI-D7wY35adcxV7Mi#8WFQY_W@v}Z-$3Z-m` znBoma{p^|bjQdx@#_B<`lW?b`=EsTyVijn5}#+Sj>5v9 z;_7dkBg3^E&0monOaYpf>&IGPEgN{SIl!YoB()@n8ow7pGPQSzP`~0dwi`OK{{eDI zfwr?ZBD=!(ytW_xZD&2AREW!m2(QfjMFhZ=RQF6m@{Uehs4Y6MND4onRcWc#w`gVJ zGBP#6D@(8YYC}sli?_9A{**2^m;Bk zZH(1-ZvZ2gzB#7is#uPWCRttH;7XyyGPH>o!*FJoyiy%C zEq!Fv{fz!W2P8Fj^_SSe-Oi}O=vlQF#VZfpt8+>bhHt$k>;;UCMfHp^hptH}<1F(F z-zYg!)S6-qHfnZtXNSG_^nUs&Ht=^JEDS*8BKEj^#eG)9{&=0DaNWjNjn6kQ zOY7L>)b4ddfl-rWE zvaTm;sUhCvPwQjhN)P7WJx8_a6{*Exrf#Vu3;>-cqO%Q)N$BLXDCI+O=d^g_qW&NKgp0<3Hp|@F0MWy@V+ja`b=1K|Qu2W)+q*0-PPO19B zzPnclN|qm5AA(k^vx{d}ua(w#b=xFp8FQ8@`7(_%p|IZ-!bm2vFJK zzIcV=PVS#w@U?<~-K0fjcVb3<9^BjCkf&eUFxxWp-GkO;m)bJauy5#kbV~P+yAc8B zk&=%RjbuT)>i#dZ8%6hmCes+Uw)!==;BkBFOwQzjy1SSCha>q#_xwVr=q;s(-e8fzIBz%xrbFoz}e3A$~*y|R0vyw`JQMP zupJCG57z4!a9e70DY9vxEYeRW$1+Uf)5mk=^2sKCc=1jQV)W0ZQ|r$a87ksXr*hyVCauRn+9(_)HKd`+E1d*!roNU~82EuhTz;Na5d6F`q|lWgTX<~6`DP!dx>qB zz{QDyu)!*)Q^PjUm5S9D2zuqmR8lZLqjID0V>sixrm|E<$!93oe(Hz&@Z-8^0(1sV z;?1lq)ALycLY*Qj6po5W^V^pOfA);E0}N_PFDmlzhHVlLvos|L7;Hx7h#kgf>GgJh zZP#K03Gg+Rf0nvbo@Ag;8@f^jgoN-YrnP7F*NHnX@2D&4d9TDCt}33&_)->I0Em}? zuh?!qPJEMZUF)*)lt68sGx@Zgu3PCFvis)2`aA+wk7}5YM_yDj(oot}RZQHGH}|Xe)<18J-%H%@q$0ccuc-EoMYk-UGGTect~1 zfMeA-Z|dNeJi_I%KQK6Q9-=+Zuuie_d5Gbr9VeLs*IXQhL)rDdKoppoN^4}t=`5=6 z+;_y$rRt{@X(hx;kfq~!?V9TAGt&loId=x@a$S{g>Uuos*Dgo;c6O=fdTN*vsD%=8 zZMsEl`N`ZpdCT}2FMDC~V>C1mS6=B0)+tI;z)E@??CTW~=R{3ERji(c=zCg}T#7vj z^<0F=Nqu%Ydt6dKq#EqRYs|`SsLH>u8paFtoPd;E@$yQ-Fs<|G;h(`IMEB3RPY=ra zXBo4YV(ZZk+lln39~GA(4i=F5twwDX;NUB~`HKxhSH|L3u2qEC2{?(vLJFj7c|Ip} z;Oj?F+0I_|J*aZtU1BV@nPb15ydzLJo$IQ;Zm-ORJ%|c%qqYSFZ}iN3K|>@1g@}XN zNAot7vjpr^Y7;6i&8RAjTsG|#^4evXc)`vd&$(fWqyLD_`Je%w=l=gVVey1ZqY!c|c|utfbx)V$`qm4sIYyy<|XImpW?@^N)5~XobhSs_@0>@)d&* zEhWYAfhb!H**qlr)%o3XMyd(ezshY#^c?GitCM(VYATtrdb3GueSBl1!1Sf4p~`rF zODoJk-amP5F9R4la1jNq9b*8sDsiVNKEAY65Xn%w`D4?$(qjkt*G8;V=vn|OMZ$o= zJ>oc3pt_0J*@VRi@cXK4V*B3 z5%(6vsYY*3S{kEE6c*jJW)lr19b?`FKZl}EO!`=Qw)O4AnWz?vAlm95J09fzwQChH zq8|xc1U`cESP5A)8H|pha-&}Z0Sc_aSka!&)j_DYuXbjV`yhf&?j<=&G%MG>MM6fTzl}N0xYcwt~I;Lv|LiXSJEYT*h*ffQW$Q8gsviIN}8V^ zm_OFPOILooQ}pSddt9~y;eFrM`iMZH!vlzbp9KL2B$5rUf%=VY*`x-rPY4UeUQ;1f( ziD+mmi9E}2TF`C!4qY+Y5~~f(gFPA8WBEr)OiS~Bpmc3V0&f$!l6?0SkK*HoJdjWA zMY^q~R=gl=Qa6@EkQG$%OfM23F7c9 zLEXz6&k1=>uhn}mkiUSx{6Y;q%Z=$z+3xMlU#}=lR^(kaZ;pbWU&U(Anuq-Ze$c0% zBQfE>dgJ@?2TE$`2Fr8iF{4dT_P3n)82f)4P8xkz&u}K)0F65EXhMBLqR~Bo&PNaQ z9Ugp;PrKv~qlPj)_rS&LFoUqr%9DwR_D|IvAiJ2&_&bLj*z=9^#v?)or3_(7(4L*S z*3@81ae)JoIR}vqnQKZ%5RMmMV)0t28g~PJy182SpU(woe4*b40*I4uRaowTd|rxK zpIIOW9hEs0d0|&N=k|EuHxOdFQp@X6ugDcc17+kWe|!sTtZG-F2;t>y~Ae;tonf zlJ~9-{-j=O9->X+(|(3+w_`JfWxn0N86`AvW=7dn=W}<;l#<@FC5Yj@rAJvbM8!-Y zBzd&&<8v$(^$n0Y02sVdA8-Lplb((wY2@6wErfdJ#IvEc)<9I^`K-Xxwa85m4ntc1 z>4J2PQaF6Rd?Zg08JNmRgwFKh2LQ~4Hl32SVf>JiSmQ09?UCO$}HFa#e*Kd;8av$;Ox7KP&IIb)V)`-lPlj{e256GSh8tYg}Hq9Ir7~z z;2bA^N3vVT5Kg>UykpLIdXsxCtcz7xjen|(RX|Bo@$Ps-lw>sNBus5A-RI{ts`}E& z-7!4@5r{mcrR=SIHO`Soi!xs@Uf*Oq*7seTDl>^$seRSc7e}!1bihzoLspvK$3u&y zaE1%X)R_t>)5Bw$I4tXrx%L+G?6T>Vj$aeU5nzTU_2?9u6l)WUSEa7@9;l;)))-{2 zS{qRnVhra8Mk<~Ybk+&Hh`nFXDB{bbgB7oB_8dwa!j$({1{&*8se+7D~t|s@ATuxD@kzyvH$|(eYOd2mlONls^^H z#apn49U$zecw$3!jar++^mNK_%kQI=om=ndgSYx;I2aw-ZD0;*N@_$88COd5;E6s+ zg=a$mhF^qvA$XP&`_>|fYl}eT=?XQhPl)O}6F^d!dRKG94J8N4b*MSYZTyD1F1f?T zQw=_y{v~LoSbS$ne3tu_S~7&+b4_3t11E*05VFFC6jMXNn*Cb2yy;_j;hCmx?U%;< zb1#_5>xBkNLtsIdN$NdAC-_$4vYBE6L4KM4f2z{?YrekY1Hv5G+^$Rk_H7=z zWto*|%lf74;R5M?%ttbE^DhF*?36>J&Nu{wYHd8PBFeM?C*Muq)%UJY6TxiJx`58t zNBSZ~-rqRKDF4OAJCjQU^^NEs1AcI)icosOpW0_+2AV5}H~Qtz-Blp(?()Y~g;Ug; zhb31W5I@h>O}l2JMf{HzBUB!8Myht2u>!Lg@N8dv%|HOpWUj+4q3aWJZn2|G%adU; z5{fnDR!)%@jUa=Sh?x3lutjoY`q@0W_IkZiz3xTh=@7ydJbGNgP=ZZ6kU3PtXIh}i zu+D^uB14MJ@Nw3JAg4y|M0NJrm5H|2MQYYb5}1?`WfqhC%yiQp6_d6^@lZi zq>tuh%ftASCU!AzsN4q8*-JtnUhFBLFXmrFJpZNKV|Bu5LZ?zms&BI7wNe9zC5O^u zq4AS7(-)JJms3v7K~WV$84AIX1w{|)pxSnvvO$vEHu2RDWKChMQ|mtEBFNl?`b zeeF6gUW&$t3q8Q=08)RlHw=gb`NPdz5Y(sACrLgG_7sYR-=%@W6=NIG*X}_?ZDt_>|5WKM`FBbxH6o>U83y4|<%}c3R1UQhH+iQloVw zxT_)$R@?3}j|BeL!-jdnwrIHi+bfD)J2zUcIMlg1(;%Z&I#1($A48NC)GQOoKrvVL zQ?)VFZ@}^YW?|SXz%}Ji*1@_@KD7mCW!6!@l@3ei0O|&c@CWXcd#Ub;zR4$7bXtGm zOkoo6?|(YDs>1^7+6WCiE%P|V9pn-t$Zyzmm8H@CL_eR4F0oK~dyv{EtC7IQ|JM=$ ziZX$|SYB&>VI?04hDrfE+9gCcNOBGye;<@Eq%WWKEDw_+ExoV6y}%c}B|d^X9gg-fszi zfWrQpsigwEcUs2RS~NThA}Rh%S;yBeQIG>{i&$l6)Zh5$hs@uO>Q6t|P({tq|v?IAq^^i3u9Y;GUz9I$E z$vGZu)@SoZW&hVh^Tz!`;`Z70frtM1(`Ri^rHbNWDDWYwmU6Hkpe1)*_>u{U*8f>Q z{%oXpE$IZc<6FqBhbYUsp|?*OMupK6p_^BXs8c<5i?S8Jom#-2TMKKi{IB01%^jF& zRlxt9#W2Xs&eX*Oz;$T-J5S^kzWs095rFbl?dND(dUS@;;pMru3vB z;w1E+_AdMBMSg3Xxb|36L=<7B>mdiAzm<|T@uZiq+zl~*${mlONN=`kYUC(AR`KWj zXG}1{W8GiDjZwetTtc1{q>*Ku9ZA?s@hLqS*F&P25($$#%176J3tdrY`A>K|jBsA` zHQB2`Nq20dMZr*c_|c`!(WM;xx%MhSCoEgbcTZShJ7k@d47AWKFtsIw zOQJ9;X|51+ z>t%`6U2e3y{g=IN@u%o;QH+O9Ubtk3Im{1p(ZSqP5DMEGXmE&0KG_<-ES%x7y~2_x z3`yB&(t9t)n%(pwT$=PCe@6yq!j++#UVmd|sNRCqThL}*J=6H?aO2yJ2b@5iJW&Gn z`ELHnz#oXk11M*CIa@SrI<)JlkwueeNhlqrw7(@}QWbj8{}@QEx%h^BfGcA>Us&#K z-fOzqYGpsCw9#T`sv>O_JeggJ1Gzu5ZHR{m1p&*D$k|5oWQ*pKBX zH+93n8m9$YMdZ>GL(a-uFRWt4?TUm!676|h)6T9j@4Pf?-lv8uZs1jM1<~r{GqFNH z&iwG_-QPwj2V^C~skKskiMhs}rq$W7>IB<{2dzwX$H1ckdfK(?((_c0*Agb7?eB;G z(7&;lcvCZBCs+Mm3)5Quw!Syz{ogtG)%;GKA9LcfA1a>qC5gMqC(!KRlR0i;bEG=r zMxDSgL>j0EK|YB878F7DNfzOW6O_fFcFZw7@mdvd26`w;9lfOPS5?Bd9>3%-F$+Ee z*cuP7Ce`f;tFGT&pOdd{^X?MynHgqp5xJ3O=3@b^B+Mddv55?i63@~+M{U#Z^%b2{ z0tD#fjDK}gN;Fh+5o7(C+3LMXQ>Q80*j*Ppa|x=Gga3_pENvRLG3NG@ z^nq?R{1G1T%ocD}3xtY$C*tw~>fLUhRTWxhB0QvI#0VsR13cidrnInY7~z50#*|p~ zikDl&8%6e>o01r~DocM)O&@!Qe<}vF=a#6vmz%Tu%Uin_*eH7o@<*Fc=A6fKn>}~Z zoUH$a(u|+RBQjk8E%=wMEOEKbEX8yfTax)+e&R;9y1V?|b`JEM;$H^ubmtR!g$8%N zwiEQO6$pb2TR<}zec3A!yYO~z2*=#3`}8#O^_Xh|e|aQxKhcKtxgHKkl1mdj6>e_^ z&6V%vc?5*+6$oJ;$VtBZfbt%Ly!0n9=>Da2i`@m73f^3==x&S#PDpt zUjGD;r0_3@rO&kKC_Zd5IEk+umepv~Bf#Sbe*??BBJGXzC*;hd)5n$NtRld>bsgXu&xn%bS08;H_OYYD|h4_@!q z_B3`}JG(AE>_FtO1EYp2|2i<{)ov?~hrI3bct?-B)T797-FPVxkl z$40;`P8nb)@R}`k&0ceUnApCtoSqJF`BCjKG1gJXtn(Zj`QS-bSe2QXiC#J6&3*Z9 z+GoI|O;gphk=5eeDn0K`@n_d?6AO-+#j1?=U16YXsq>CeY{V0Z4%O|s8)rzl{`@I`LUK3MV&R)dSU%M=3SV%aK^1*jKXfGNqzDM z_F1+J#%7*HV`cnCwS?|voIowD>*UG1{Re{0K3zya!LC~sz+ zdnNyYuuQJnXIt%??Gevb*a7>EF1V*HLC?fyCgFzqdG)4V3f-1ICuMpqe;lpSTL#Np zQ3vZkvRn6jZ=1_@gW|^d*RKftQvUn_6lr~j6Va)ok#`@D6I$J+o%MY8xa?=!vPy$5 zr@Cc8j&1I@F!<9n{64^jx~O&;0ha2hQrbodCS---pOa#fykidB73gR$W{4r*iu%E* zks5~ql4N?TyBr;T687t*4-qrT__7Y%dmJ_R;i`a_5zuL;L&p#{iY1S5d|w+H?YLlf z3ueTu(6qcP zkfU<`>yWedvH$CM2?0!Sz82IFfh^uB&@n#oespMh(?Avu-!FL4lgi5cLWK+|0~6OK5{d4V!Jb4vrSeb7GE;*X9;GBD^d=HJK5m+ zhLV2qjElx>#->O~=Y)J(fG0v?u3$n`7V*Lu7QVN9ka_jU-bF*Pz=k7kl6|X2=dJ!v zx}yP&#KZi{M`P#OBPs30_1#<1>QndLY}z5;r|w7D)%~w_KZx>DPgh*YUlYZUg{2fbUhX_#R-PYm)!-UV|1JX^WefxsXYiEdp+q_-hNw-*%qD zE_SB{pp-G9Bgl4M_z&6?i_6iXo`IiVi*3?{n1cEFaL9E25=zi?o2a=pd{AcA|~b{i@g5ka<)Jn(DRj)sGpJLFrO zMcpXGN9&bM8D^UZLp>lQkm7wX|Fsh0SBZ0twO%;i z^G@=N_pj`Xf^KU&y}F4K(fD$vRB~rosVdW`Y+PNCq(8%QfW$vRFJg2Ot^d<@qAL z8n69J=f?gJcm^C@WmR721@jjLXw1ob;{uwuYq7Cl1kGr-o6)b^zc|$(HaCB-R6hqh zyKtc`Y|2d#bRsbPQe>+yrOLtV1uoMdJ!)2(E#IYAP2AN=;pP$?<`o3IV~?QM9eE*C5IW! zoN~xs@J)e)q{eHXMuD9TyrL{2mJ?H-r0Gl89 zcVe*qB-CQc>XtX*-mw&YJi4e9;&>+15EQ)f93Gfo8%Cl{0Ep7zElwe*t*{wEE5 zYtTo{o4&Owh%GzAby>|a^HihZQv>s_VVB9@ty-!p= zUxs-lxFPpJ~(!t zg9W=k$E^+@vW)X}ldkqz3f1g-y$M(+XDyq&G0|febFj8p8U`Y4=94Fi7-|ROo>%c#Wj{G{h~dQwF*`OCyPZaH6YcvnhueUnY8hb49b@g;gWGyi z0t9mfc8V~0#QA4d*b9rckD3?=&NsK!;BUc@S5TbW_PQnKF)d#75YpraacXFGEBJX7 zBiYKI8G2HotTcP-vtCUSDFh7Lq@|I_Puof9;}sC+;ue8MQDQU2pg5R1c8q3;2J)Swr&Wx<^EaMY4kFq)IEk(=+SK=Gb zf0J5Rc8?NzW9EA<(h^Bz-f)Q-1Sq0QMSll2u8fBMPyq@3ETfKN0K0uGn{#ZaPGs`q zXB4Jir`}Igh!s!d~snnH7*9bTR(EH&Yv$|#w$ z+3R5z8#e@hlx2Ojv!H7c`6+pZramK*_Y3?R(mzuF+V4muR(jy8Gsv!Vp(>7?G^E;< z+T~gij-@J;uf(y#rN@XNmuc6wRFEJ%NU;9Z*zdC;GNG*NcS=@l7FG19i$V(sfkgk4 zA%-{hPq*p+6rV_&p%0=cYJ_}H43|)k+G7}>$c!GJ5#HQ zNkC9diqbkar!<`f)<1b~8KfL{*Zqsr_MqWAB}_4np$PWBUUVlklyGditwz#k-|CVA z@jo;V34HQ-`UH9_KF(I!F5P_x)(~x{liJD=w@Lo}HzGx*Xxs-#OMPFE&|JR*2E`VBA!E z7yv=M>Bf}?mEY~Zl2Y5-Q!F<=w>tZ*2H2SRq96Owplv9anFhu*r2jlHmbThHRbL2Q z&yTd*jVyUsGav?IW#lHS=NQJs!|$1lUin8T4W!6-K9EAyW^3lT zmy^nts@2oLNRR3Crls!AW?o0*LB6Kn+jk+daup8&b^wzGq%KS(d;7@oYZmk@WJpJ- zwD&+qRsRC%Y1s42Nov9ur-o`1amFy?)pV|=8KXFIcz1s;YAa4w4&xGw@LAa6WXc-t z#kA@^-&K}vmk#jME_W$;|KXGBQg-z7k8~fhi+;$ zE}w>9c@kq7>I3fI1M&aY=7rONl#4E&_RXapD>PNRWYo|b9X8{0L{Y`OzG6 zWPX7p<+|BrYb00V2Qmz>vi!AQ8kv+S zOfAv0v|Fd{eAnE?!{@EuJ*%>|L6x0sEAjAtOnkEp+;lT5t&a{Fj*uS3kYP<>T<(q^ zJ$R9q<2bI1U!77Xh^1p=>DL1l&#oFcYE+KwQ5XPDAsR;}d#ooLo-y;GS`c%o`A9ak z8tM^lBRdU=R9&e9oTbw4r?8GdixkwaDV}nv%^Q1sr%*ox8E~D-MMBuv{2LPePrbor~gvbU9nP|w+`qr+^&@OQaii9itfT) z&ur)5(}(=(mW4|zao0dTwCWc+Z`Cjp8T!HB0!;pX;B_o9HlaVp#4h2%0L{+~0=~GN zGVi}xE5QT(i!Llz?=IZ}J8`aU=R_>-W%V`oSU9X}hsJsleP~7*H`fd75m0S=$r_Gv zQt_!t3Cc-caQ#lF)EenLi9HC|wlThQvxff&H{1$!KD3%lb{d#p9Yo9qdcIMqOP^4m z?jcL0Xf#9c1rF7pA~{whK#wZQtx8uDQ{TfG*CIsWsg>#ZRVKj+)R?S9$&_m+JOq(; zt1J;0FvAe#ynk>lvDk9CEK##tc+`8;Vk=7=xz--Ay$d&kor~O!04P_ju zxU=25CaK~ajYLXNM0EX~tx=wi5((T(7QW_TXkoIKqa(Y>Z#`C4F;4_=;=o{CIyhz1 zFLCX`6|FBasB20f1IF0Uo9kM^!@71jfOO>4>c`{Z18NO-aqM>#Ji%t0M-kD5bqX7Z zhaM!YW2wF~u|^Klj*p{^A2u}zDy7oVxnG_(Zun8K!-=CWk3wUXsG;ZB%BO$&c0Q>3 zBW(PyWOA^X6$q*qM7!FUodK=rsIGfODqE;RCDTb>Fs{z@m>~R$cv{6w4w5S!HXJ5< z8OhYp+L*phzu~7eWzauzK~-Ow@xQSqz*!)Y#r#LZd%mm8c7Gr_=sVHkNTU- za}^@D*re^+F~?~a^%~lS?dI5eQTX`8$Vwp7=SKwx9s*nOg7OVCzwIqjmHkF@W&Cnn zh0&TVG@5=1Os&lwMhVnRxao<;o8|s@<)TP+Sp{Za?FYNxFm#Nc2ySVTRvHcz@CDaz zyK#bE_4}1?z%RO_AqujoB~s8{A~ zYT%Fe1tCCv0~lfWS&Y-Su)C9eMZBRdW3FP@*4X!dJlf%_zIu97S#d_e%9jnb>l$Pq zpG|?j_EAZe))G+WhAS|sgjLdLA1tVI3BRkSBXl;bD{ZnW@8T`r(={HADr?7Ms$GND z-3Qz2t{d(+xw_CZjd*?~!>>Iu{*1wWP)7DnXOzjgb-T6t+HQr5p4j|)KqzG(jFD*E z_G+PjnpA`kbd)I2_PTehg;WR3{1wD@GYfFn!Ld*mwgaHsMsighB{&m(7%tW9E^h2z zEep8&f)IYs28VidCos88I{yRxjU$y%#tm@_W6z@4=)=NaP;KX%<*hs*I@_gr5FX#R z(plfmx=008Uxw<3Ax7)8adVfB#}?^uqUvpgaQDwLS`YynN1&&g*G2dI7|-oxR*b%B zNg~X=L=SKAl;jj@y7x*G=Aj?Y9)OSQ1_JG}w7F<^rMLV<@~Jeju69g^W9S1_jxTh~ z=mH5{<);NO1A`3wCtGA16^e3dy0n5bi;|=l%aO?Evax4_r03^f;qbi}Rb0H;a4}}# z)oM~Jw9PuA3$@#q7)4azz@0+RO_2rx$eSuvgiQ1$sF$ldzM!hd&Ml$Xjw#(FBntQG z_pvpouBnNpZB{^-ZIOC3^9jpvgB-h~Fm~ifU$||(*+JvcylO3VC|>V^cd%zGqpe!v zf-ReD|8&8tsNB;+QQ+m|>iZMR zGEQB4KygOw1DNHWE#y@eP<^V(rwK8E<1em?aNm$6RV#KOPwphb%7jW_YyL(Jr$(aZ z0Z)e1ZkJ&75pa-{)e+xAktpqq$*e}rs8A#STyJ2*%d1Q^0(f+ zFTkAI!hWy2D<2WPo?(4pP>#;`Lx%(_(V%012}|5s!lasUv>C)L*u^pJJbOh`e0EQ} zTEY17YFQXS!$8WCpldM8Ec%W-EM{Fj#D@Q}MFq6!Y!RIsGDMvkkAfVvf|ghR9>kwo zytm6h`)oRHNxg`PdB)oUbhOj5s3E)=x^9{0f?Kn?Ut8zGihxRPoVOg8#xt_|ppSAu z&}6|7w7dgV)d4PKw`=lsZ8s+{?pvNxbH~D)inT%iATFMQ&XsXe=H3)+qJG@lrTOt{ zHrynz#nR=ww*{>MTGJ~8mzAo_`_Sb4@PROBiyp>I8cq1^G_`(F$O)fziSHNfM} zV{ZO8y>+16S|d~y1WKDan&FA!KB&J`Fk>V1DE8)C_@vP9X?RTV0N^Km+9xso@3FS?DE%o;v??_r=KRIByN_KCNuwt9t`jg3 zW(EJA@OL&H9`#ZeENw=NVj~Du%LfBg5 z--%p(P1PHU*d44mX61kHxQlA}x@gDO(w(uU# z! zla?I=?I#rx-hv6iydaS~dXL@hMu2Yp>&b>$fa)zMZ^=#Ahuh{5eu~@ zn6q&4?eP)Xb@8A%EWA&Bph(yR4P-@24ED*_?%ExDj;x+x>Lb=>sjiiUbZRu7`NLa2 zbTC0ZX!@#mI~53cxzKnJ)!HX%7&ASg+WQRLr!xdT$aPXHIT|%N9@YESGcbVag09_C zsG6TUpy_6+NOU({LFv?n1~MF&>Ctb(l7l)1R0rJ10jZS3T&VddI4*!IWJihEEB*?j zAW|QV{{^;56*SKMlne>&5RAQ|6a0zSNoP>K%9k(lpSYpD=igA6D9HUSj+=bd)StRe zfDFcA*2Aw}Gv3YVqc7j)rN<>V^*~6#WnL)8WTtiz7gh4${=&VkUuF<;H(!KZqhG&O zu>f7tT{IXi*R~M5BRX_ix}YsQKkzcD1(N1;ybv_ufeab-;o98&JXTjcbADh>53n;B z9o(}*^lJjo*Tz(bJ@A-kAXY!EM%?&^ysQYaD2U_yX$`-iu^IV^a^iV@ z;nvxJkiQdkg!SjO0~?~T)DH$t7|zKHr7(l6Y0+2DHIs_)DfM8X7IgVHplaUc(OJE9 zJ2Ti$|4miw0{ZKNb9{G`SX=_dkugBL@Kb+jkiecgyfTob(}^d+EJ z>x9}5g5AR~fqn3R3Eqkct@l$OFL(OmnsLZJIQef1&Km>@Ztm%I-udlU6AZRvLnosx z&WLY2kGwK*9XH>qZ-*=YF~A(0P}g86Wvm&~;TQUg8Y{WwZw8wdzE9yoYvz3TA2Q46 zao2X5KTz78(aeSLp~TG`0k7V(&oD^bJ@g1<>N>;+kE?xT4ZfYiM@7ZeE&4%#HrJqI zYmgqvR(xU&adHT6CY2G@fBC*F7t*1V*yWbKVQsSgwWx8ToeBss#bDVac#6 z27>&+l&bQOJgR2~uJ{-4!z;;tyC7hMr*Z5ql@*ZRykZ1r~G-6wLyO)WaF;b za9~E0l@!`IM%aywOMh9>T2|qdtWst&silr;q7w>K`yW## zFrh8LD1R(laV@1NZX0>`|Hr# zI@5&f+*34~H9co6hXyNjqA^`<#hZSDxnWwobzUNUq6g9-SCCzd!^!ltd?31aSc3Hq z2_MPgvX7%riM1l92RKpVRYZJq<`M22jQ-Ym&l!#xD2{F zaJQ>qZbl|y?}S4@^?A79i^IA4s01oBhJQ;Qj{Qo_jHu`V9Ort0I=>}mf>MhPl`S|S zdx=$9$k>KjNpy|ImLv03tqxNQI|tDS?5H+<*$aQM_wAbbAgUkA<1X zV!y5P8*FAuhNu}~2FhS87>tT*1fp}n?lIH8YZs2|&(v}U;x2Qo|B+IT@(4~5G3BJX zP5@xKpOcCaDu~QB@O{u@hCri!(gW&Trq*|u?v7~~aWf*AS#D{L38{XVf^vv^(DFj2 ziU2)lSw%}AjeQ(%A4(kI4t+3X&vH56q+Cl+a$>(Y$_n62#p0-P=P%;n3mDpweTH7f zyLjfFC;D{B7j_k!fk6O>*k=IWWTacP{yczt?zZV z%m%fDS;lszLyiGle|9}7*gQs&dlj+prU_=d=!qTqPZ(Wka$)YYZ5YZ#l;%qI(Jvn9 zN5Ct;j7Ft$V|vzwkhh^hjP>rdAKw#?V4-hlyDu|~w`;3Pb0z>4B3oV*7*7~LScfh- zZgw#C^g(M^%^!7#Bbj*1uqkmU3(Zyx!6D^mUAna2ec)h zgRhbJig7pT{#fYVH0_9{XOW+-S=p`S<^n3l(#EF4Sd3GXQs7wHgPbV=4$<##LpI6< z>FuE~0Z8>!L2zw7$n0G&Gd}Axuyc1)tmo>T*P{EQYg-Iz{+HiQ&>%p4)}WibdN9#mbi;JOcn6IXR02MED*(Y>TqK*vf&Xk3g3&+T7IL8o9FUzNMw z9M{a>nm+z&l!f>D+AdJ#f7_*64g?=*u9+X<=(5?=gjSvQHw%b2%EB1dN2H;1Q#w4^ zAtx<=HLN9)qCr|Ry$ys5j?y%CE=mGRuP{nDx>z$dX)0!dJbuCWlVSY{4I zuUiYvbm8PBL`ZtRYT5f@h0sT2_i918qXNG>)F13`e|#gF-8$+H)&T`Z^k1~s8}_N+ z(&#+zGk^#5N7OVwt$ko>6}FPWb*i39Jj}VvA#Z_AfsIrHM$=;l#ou;6pi|>CXMl?X zv0_&62TG`&@S6ga8D~5x9K5+Rbo^zjlgjo4Gj0a~;=koC{^a6*0yqv&3!P&W9Hia% T|NoWxzud64y;kwZy=VUiwg9cy diff --git a/assets/bullet.tscn b/assets/bullet.tscn index cbf1f5f..f4771c3 100644 --- a/assets/bullet.tscn +++ b/assets/bullet.tscn @@ -85,7 +85,7 @@ radius = 0.055 [node name="Bullet" type="RigidBody3D" node_paths=PackedStringArray("collision_shape")] top_level = true collision_layer = 128 -collision_mask = 225 +collision_mask = 233 axis_lock_angular_x = true axis_lock_angular_y = true axis_lock_angular_z = true diff --git a/assets/bullet_cam.tscn b/assets/bullet_cam.tscn new file mode 100644 index 0000000..409ebfe --- /dev/null +++ b/assets/bullet_cam.tscn @@ -0,0 +1,143 @@ +[gd_scene load_steps=12 format=4 uid="uid://ba0jycejax6n7"] + +[ext_resource type="Script" path="res://scripts/bullet_cam.gd" id="1_uvdg3"] +[ext_resource type="AudioStream" uid="uid://dqj4cx05f25jj" path="res://assets/Audio/punch-body-hard-SBA-300156881.wav" id="3_t6e3w"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_mfpbf"] +resource_name = "bullet" +transparency = 1 +albedo_color = Color(0.701961, 0.556863, 0.223529, 1) +roughness = 0.5 +emission_enabled = true +emission = Color(1, 0.606841, 0.365696, 1) +emission_energy_multiplier = 4.0 + +[sub_resource type="ArrayMesh" id="ArrayMesh_dtlcm"] +_surfaces = [{ +"aabb": AABB(-0.0255907, -0.0689083, -0.0255907, 0.0511814, 0.735285, 0.0511814), +"format": 34359742465, +"index_count": 180, +"index_data": PackedByteArray("AAADAAEAAAACAAMAAgAFAAMAAgAEAAUABAAHAAUABAAGAAcABgAJAAcABgAIAAkACAALAAkACAAKAAsACgANAAsACgAMAA0ABQAQAAMABQASABAADAAPAA0ADAAOAA8ADgABAA8ADgAAAAEADgACAAAAAgAGAAQABgAKAAgACgAOAAwADgAGAAIABgAOAAoAFgAdABUAFgAeAB0ACwAUAAkACwAVABQAAQAXAA8AAQARABcAAwARAAEAAwAQABEABwASAAUABwATABIADQAVAAsADQAWABUACQATAAcACQAUABMADwAWAA0ADwAXABYAGgAZABgAGQAeAB8AHgAcAB0AHAAaABsAGgAeABkAHgAaABwAFAAbABMAFAAcABsAEgAYABAAEgAaABgAFwAeABYAFwAfAB4AFQAcABQAFQAdABwAEwAaABIAEwAbABoAEAAZABEAEAAYABkAEQAfABcAEQAZAB8A"), +"lods": [0.0176836, PackedByteArray("AAAZAAEAAAACABkAAgASABkAEgAaABkAAgAEABIABAAGABIABgAIABIAHQAaABIACAAdABIACAAKAB0ACgAMAB0ADAAfAB0ADAAOAB8ADgABAB8AAQAZAB8ADgAAAAEADgACAAAADgAGAAIAAgAGAAQABgAOAAoACgAOAAwABgAKAAgAGQAdAB8AGgAdABkA"), 0.0191346, PackedByteArray("AAAEAAEABAASAAEAEgAZAAEAEgAaABkABAAMABIAHQAaABIADAAdABIADAABAB0AAQAZAB0ADAAAAAEADAAEAAAAGgAdABkA"), 0.0400226, PackedByteArray("AAAMAAEADAAdAAEAHQAZAAEADAABAB0AAQAZAB0ADAAAAAEA")], +"name": "bullet", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 32, +"vertex_data": PackedByteArray("AAAAAM4fjb2do9G8AAAAALkAIT+Mo9G8sDyUPM4fjb3BPJS8sDyUPLkAIT+wPJS8jKPRPM4fjb0iqQmzjKPRPLkAIT8AAACAsDyUPM4fjb2fPJQ8sDyUPLkAIT+wPJQ8AAAAAM4fjb17o9E8AAAAALkAIT+Mo9E8sDyUvM4fjb2fPJQ8sDyUvLkAIT+wPJQ8jKPRvM4fjb0iqQmzjKPRvLkAIT8AAACAsDyUvM4fjb3BPJS8sDyUvLkAIT+wPJS8nSBDPJymJz+cIEO8AAAAAJymJz/V+Ym81fmJPJymJz9PL4IvnSBDPJymJz+eIEM8AAAAAJymJz/V+Yk8nSBDvJymJz+eIEM81fmJvJymJz9PL4IvnSBDvJymJz+cIEO8bdeSO6uXKj9r15K7tqyfLquXKj9Mqs+7TqrPO6uXKj+nU1AwbdeSO6uXKj9v15I7tqyfLquXKj9Qqs87bdeSu6uXKj9v15I7TqrPu6uXKj+nU1AwbdeSu6uXKj9r15K7") +}] +blend_shape_mode = 0 + +[sub_resource type="ArrayMesh" id="ArrayMesh_gi7r4"] +resource_name = "gunbullet1_Cylinder" +_surfaces = [{ +"aabb": AABB(-0.0255907, -0.0689083, -0.0255907, 0.0511814, 0.735285, 0.0511814), +"attribute_data": PackedByteArray("zVRQPzJjDj9eEic5j/V/PxkeJzkAECc5AAAAP4/1fz8AAAA/j/V/PwEAAD8AECc5AQAAPwAQJzl1UiE/MWMOP9YTJzkr+F8/1hMnOSv4Xz8AAAA/LPhfPwAAAD8s+F8/AAAAPyz4Xz8AAAA/LPhfP+QUAD9AS9o+TRUnOcj6Pz9NFSc5yPo/PwAAAD/I+j8/AAAAP8j6Pz8AAAA/yPo/PwAAAD/I+j8/5RQAPyCNeD7FFic5ZP0fP8UWJzlk/R8/AAAAP2T9Hz8AAAA/ZP0fPwAAAD9k/R8/AAAAP2T9Hz92UiE/uC3nPTwYJzkAAAA/PBgnOQAAAD8BAAA/AAAAPwEAAD8AAAA/AQAAPwAAAD8BAAA/AAAAP85UUD/ALec9sxknOTgFwD6zGSc5OAXAPgEAAD84BcA+AQAAPzgFwD4BAAA/OAXAPgEAAD84BcA+X5JxPySNeD4rGyc5cAqAPisbJzlwCoA+AQAAP3IKgD4BAAA/cgqAPgEAAD9yCoA+AQAAP3IKgD5eknE/QkvaPqIcJzlUHwA+ohwnOVQfAD4BAAA/VB8APgEAAD9UHwA+AQAAP1QfAD4BAAA/VB8APgAAAD8s+F8/AAAAPyz4Xz8AAAA/LPhfPwAAAD8s+F8/AAAAP4/1fz8AAAA/j/V/PwEAAD8AECc5AQAAPwAQJzkAAAA/yPo/PwAAAD/I+j8/AAAAP8j6Pz8AAAA/yPo/PwAAAD9k/R8/AAAAP2T9Hz8AAAA/ZP0fPwAAAD9k/R8/AQAAPwAAAD8BAAA/AAAAPwEAAD8AAAA/AQAAPwAAAD8BAAA/OAXAPgEAAD84BcA+AQAAPzgFwD4BAAA/OAXAPgEAAD9yCoA+AQAAP3IKgD4BAAA/cgqAPgEAAD9yCoA+AQAAP1QfAD4BAAA/VB8APgEAAD9UHwA+AQAAP1QfAD52UiE/jvV/PwAAAD8s+F8/AAAAPyz4Xz/OVFA/jvV/PwAAAD+P9X8/AQAAPwAQJznlFAA//rdePwAAAD/I+j8/AAAAP8j6Pz/lFAA/prUvPwAAAD9k/R8/AAAAP2T9Hz91UiE/FHgOPwEAAD8AAAA/AQAAPwAAAD/NVFA/FHgOPwEAAD84BcA+AQAAPzgFwD5eknE/pbUvPwEAAD9yCoA+AQAAP3IKgD5fknE//bdePwEAAD9UHwA+AQAAP1QfAD4="), +"format": 34359742487, +"index_count": 180, +"index_data": PackedByteArray("AQALAAQAAQAIAAsACQAUAA0ACQAQABQADwAbABMADwAXABsAFgAgABkAFgAdACAAHgAnACIAHgAkACcAJQAvACkAJQArAC8AEgA7AAwAEgBDADsALAA3ADAALAAzADcAMgAGADUAMgACAAYAMQAHAAAABwAVAA4AFQAjABwAIwAxACoAMQAVAAcAFQAxACMAUABpAE4AUABrAGkAJgBLACEAJgBNAEsABQBVADQABQA/AFUACgA9AAMACgA5AD0AGgBCABEAGgBHAEIALQBPACgALQBSAE8AHwBFABgAHwBJAEUANgBTAC4ANgBXAFMAXgBbAFgAWwBqAG0AagBkAGcAZABeAGEAXgBqAFsAagBeAGQASABiAEQASABlAGIAQQBaADoAQQBgAFoAVgBsAFEAVgBvAGwATABmAEoATABoAGYARgBfAEAARgBjAF8AOABcADwAOABZAFwAPgBuAFQAPgBdAG4A"), +"lods": [0.0176836, PackedByteArray("AQBcAAMAAQAIAFwACABAAFwAQABfAFwACAAPAEAADwAWAEAAFgAdAEAAaABfAEAAHQBoAEAAHQAkAGgAJAArAGgAKwBuAGgAKwAyAG4AMgAFAG4ABQBdAG4AMgACAAUAMQAHAAAAMQAVAAcABwAVAA4AFQAxACMAIwAxACoAFQAjABwAWwBnAG0AXgBnAFsA"), 0.0191346, PackedByteArray("AQAPAAMADwBAAAMAQABcAAMAQABfAFwADwArAEAAaABfAEAAKwBoAEAAKwAFAGgABQBdAGgAKwACAAUAKgAOAAAAXgBnAFsA"), 0.0400226, PackedByteArray("AQArAAMAKwBoAAMAaABcAAMAKwAFAGgABQBdAGgAKwACAAUA")], +"material": SubResource("StandardMaterial3D_mfpbf"), +"name": "bullet", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 112, +"vertex_data": PackedByteArray("AAAAAM4fjb2do9G8AAAAAM4fjb2do9G8AAAAAM4fjb2do9G8AAAAALkAIT+Mo9G8AAAAALkAIT+Mo9G8AAAAALkAIT+Mo9G8AAAAALkAIT+Mo9G8sDyUPM4fjb3BPJS8sDyUPM4fjb3BPJS8sDyUPM4fjb3BPJS8sDyUPLkAIT+wPJS8sDyUPLkAIT+wPJS8sDyUPLkAIT+wPJS8sDyUPLkAIT+wPJS8jKPRPM4fjb0iqQmzjKPRPM4fjb0iqQmzjKPRPM4fjb0iqQmzjKPRPLkAIT8AAACAjKPRPLkAIT8AAACAjKPRPLkAIT8AAACAjKPRPLkAIT8AAACAsDyUPM4fjb2fPJQ8sDyUPM4fjb2fPJQ8sDyUPM4fjb2fPJQ8sDyUPLkAIT+wPJQ8sDyUPLkAIT+wPJQ8sDyUPLkAIT+wPJQ8sDyUPLkAIT+wPJQ8AAAAAM4fjb17o9E8AAAAAM4fjb17o9E8AAAAAM4fjb17o9E8AAAAALkAIT+Mo9E8AAAAALkAIT+Mo9E8AAAAALkAIT+Mo9E8AAAAALkAIT+Mo9E8sDyUvM4fjb2fPJQ8sDyUvM4fjb2fPJQ8sDyUvM4fjb2fPJQ8sDyUvLkAIT+wPJQ8sDyUvLkAIT+wPJQ8sDyUvLkAIT+wPJQ8sDyUvLkAIT+wPJQ8jKPRvM4fjb0iqQmzjKPRvM4fjb0iqQmzjKPRvM4fjb0iqQmzjKPRvLkAIT8AAACAjKPRvLkAIT8AAACAjKPRvLkAIT8AAACAjKPRvLkAIT8AAACAsDyUvM4fjb3BPJS8sDyUvM4fjb3BPJS8sDyUvM4fjb3BPJS8sDyUvLkAIT+wPJS8sDyUvLkAIT+wPJS8sDyUvLkAIT+wPJS8sDyUvLkAIT+wPJS8nSBDPJymJz+cIEO8nSBDPJymJz+cIEO8nSBDPJymJz+cIEO8nSBDPJymJz+cIEO8AAAAAJymJz/V+Ym8AAAAAJymJz/V+Ym8AAAAAJymJz/V+Ym8AAAAAJymJz/V+Ym81fmJPJymJz9PL4Iv1fmJPJymJz9PL4Iv1fmJPJymJz9PL4Iv1fmJPJymJz9PL4IvnSBDPJymJz+eIEM8nSBDPJymJz+eIEM8nSBDPJymJz+eIEM8nSBDPJymJz+eIEM8AAAAAJymJz/V+Yk8AAAAAJymJz/V+Yk8AAAAAJymJz/V+Yk8AAAAAJymJz/V+Yk8nSBDvJymJz+eIEM8nSBDvJymJz+eIEM8nSBDvJymJz+eIEM8nSBDvJymJz+eIEM81fmJvJymJz9PL4Iv1fmJvJymJz9PL4Iv1fmJvJymJz9PL4Iv1fmJvJymJz9PL4IvnSBDvJymJz+cIEO8nSBDvJymJz+cIEO8nSBDvJymJz+cIEO8nSBDvJymJz+cIEO8bdeSO6uXKj9r15K7bdeSO6uXKj9r15K7bdeSO6uXKj9r15K7tqyfLquXKj9Mqs+7tqyfLquXKj9Mqs+7tqyfLquXKj9Mqs+7TqrPO6uXKj+nU1AwTqrPO6uXKj+nU1AwTqrPO6uXKj+nU1AwbdeSO6uXKj9v15I7bdeSO6uXKj9v15I7bdeSO6uXKj9v15I7tqyfLquXKj9Qqs87tqyfLquXKj9Qqs87tqyfLquXKj9Qqs87bdeSu6uXKj9v15I7bdeSu6uXKj9v15I7bdeSu6uXKj9v15I7TqrPu6uXKj+nU1AwTqrPu6uXKj+nU1AwTqrPu6uXKj+nU1AwbdeSu6uXKj9r15K7bdeSu6uXKj9r15K7bdeSu6uXKj9r15K7/38AAAAAQS3//4Ha/3///wAAgdr/f///Xue34f///7///4Ha/3///6AYt+H///+/AACB2v9/////fwAAAABBLf//gdr/f/////99pf9///9e57fh////v///gdr/f///Xufntv///7///32l/3////9/AAAAAEEtgdr/f/9//////32l/3///xfJn5j///8/Xufntv///7+B2v9//3//////faX/f////38AAAAAQS19pf9//3///4Ha/3//f///Rp6fmP///z99pf9//3///xfJn5j///8/gdr/f/9/////fwAAAABBLX2l/3//f///gVr/f/9///9Gnp+Y////P32l/3//f///uGGfmP///z+BWv9//3////9/AAAAAEEtgVr/f/9///99Jf9//3///7hhn5j///8/gVr/f/9////nNp+Y////P30l/3//f////38AAAAAQS19Jf9//3///wAAfaX/f///5zafmP///z+gGOe2////v30l/3//f///AAB9pf9/////fwAAAABBLQAAgdr/f///AAB9pf9///+gGLfh////vwAAgdr/f///oBjntv///78AAH2l/3///73NOen///+/Xue34f///7+9zQfJ////v17n57b///+/vc056f///79e57fh////v0EyOen///+/oBi34f///7/3tkGy////P73NB8n///+/F8mfmP///z9e5+e2////v8WWQbL///8/Rp6fmP///z/3tkGy////PxfJn5j///8/xZZBsv///z9Gnp+Y////PzlpQbL///8/uGGfmP///z85aUGy////P7hhn5j///8/B0lBsv///z/nNp+Y////PwdJQbL///8/QTIHyf///7/nNp+Y////P6AY57b///+/QTI56f///7+gGLfh////v0EyB8n///+/oBjntv///7//f///AAC90r3NOen///+/vc0Hyf///7//f///AAC90r3NOen///+/QTI56f///7//f///AAC90ve2QbL///8/vc0Hyf///7//f///AAC90sWWQbL///8/97ZBsv///z//f///AAC90sWWQbL///8/OWlBsv///z//f///AAC90jlpQbL///8/B0lBsv///z//f///AAC90gdJQbL///8/QTIHyf///7//f///AAC90kEyOen///+/QTIHyf///78=") +}] +blend_shape_mode = 0 +shadow_mesh = SubResource("ArrayMesh_dtlcm") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_x6v7s"] +metallic = 1.0 +emission_enabled = true +emission = Color(1, 0.607843, 0.364706, 1) +emission_energy_multiplier = 4.0 + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_3wvag"] +direction = Vector3(0, 0, 1) +initial_velocity_min = 1.0 +initial_velocity_max = 2.0 +collision_mode = 1 +collision_friction = 1.0 +collision_bounce = 1.0 +collision_use_scale = true + +[sub_resource type="BoxMesh" id="BoxMesh_qy3jk"] +size = Vector3(0.025, 0.025, 0.025) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ywt21"] +transparency = 1 +blend_mode = 1 +albedo_color = Color(0.383052, 0.264096, 0.213327, 1) +emission_enabled = true +emission = Color(0.737886, 0.150238, 0.0835467, 1) +emission_energy_multiplier = 8.0 + +[sub_resource type="BoxMesh" id="BoxMesh_jrtee"] +size = Vector3(0.04, 0.04, 0.04) + +[sub_resource type="CylinderShape3D" id="CylinderShape3D_tqvit"] +margin = 0.001 +height = 1.5 +radius = 0.055 + +[node name="BulletCam" type="RigidBody3D"] +top_level = true +collision_layer = 128 +collision_mask = 225 +mass = 0.01 +center_of_mass_mode = 1 +continuous_cd = true +contact_monitor = true +max_contacts_reported = 3 +script = ExtResource("1_uvdg3") + +[node name="CameraHandle" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.789394) + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.789394) +fov = 150.0 + +[node name="Cylinder" type="MeshInstance3D" parent="."] +transform = Transform3D(-1, -1.50996e-07, 6.60024e-15, 0, -4.37114e-08, -1, 1.50996e-07, -1, 4.37114e-08, 1.46364e-07, 0, -0.113697) +cast_shadow = 0 +mesh = SubResource("ArrayMesh_gi7r4") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_mfpbf") + +[node name="GPUParticles3D" type="GPUParticles3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.718767) +material_override = SubResource("StandardMaterial3D_x6v7s") +cast_shadow = 0 +emitting = false +amount = 20 +one_shot = true +explosiveness = 1.0 +process_material = SubResource("ParticleProcessMaterial_3wvag") +draw_pass_1 = SubResource("BoxMesh_qy3jk") + +[node name="GPUParticlesEnemy" type="GPUParticles3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.718767) +material_override = SubResource("StandardMaterial3D_ywt21") +cast_shadow = 0 +emitting = false +one_shot = true +explosiveness = 1.0 +process_material = SubResource("ParticleProcessMaterial_3wvag") +draw_pass_1 = SubResource("BoxMesh_jrtee") + +[node name="Audio" type="Node" parent="."] + +[node name="HitIndicator" type="AudioStreamPlayer" parent="Audio"] +stream = ExtResource("3_t6e3w") + +[node name="BulletCollision" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0) +shape = SubResource("CylinderShape3D_tqvit") + +[node name="RayCast3D" type="RayCast3D" parent="."] +target_position = Vector3(0, 0, -2) +collision_mask = 105 +collide_with_areas = true + +[connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/assets/mac_10.tscn b/assets/mac_10.tscn index 24febec..6107553 100644 --- a/assets/mac_10.tscn +++ b/assets/mac_10.tscn @@ -3,7 +3,7 @@ [ext_resource type="PackedScene" uid="uid://c33b6ldlxxfro" path="res://assets/Models/mac10.blend" id="1_nb4p5"] [ext_resource type="Script" path="res://scripts/gun.gd" id="2_tskiy"] [ext_resource type="PackedScene" uid="uid://nq5nq2hjc4ec" path="res://assets/bullet_fake.tscn" id="3_heo3y"] -[ext_resource type="PackedScene" uid="uid://dqhltdnqyg8ni" path="res://assets/bullet.tscn" id="3_xr8co"] +[ext_resource type="PackedScene" uid="uid://dqhltdnqyg8ni" path="res://assets/bullet.tscn" id="3_w1kko"] [ext_resource type="PackedScene" uid="uid://crvohhc6kgshn" path="res://assets/bullet_hole.tscn" id="4_eleuq"] [ext_resource type="PackedScene" uid="uid://cp8563f0oxvff" path="res://assets/mag1.tscn" id="4_ji2hu"] [ext_resource type="PackedScene" uid="uid://c1gdehrsytlkk" path="res://assets/casing_2.tscn" id="4_kpr3h"] @@ -489,11 +489,11 @@ fov_zoom_amt = 0.995 recoil_amount = Vector3(0.02, 0.05, 0.05) max_ammo = 20 bullet_damage = 2 -bullet_speed = 1500 +bullet_speed = 1200 r_hand_location = NodePath("mac10/RHandLocation") l_hand_location = NodePath("mac10/mag/LHandLocation") flare_light = NodePath("mac10/flare") -bullet = ExtResource("3_xr8co") +bullet = ExtResource("3_w1kko") bullet_fake = ExtResource("3_heo3y") bullethole = ExtResource("4_eleuq") casing = ExtResource("4_kpr3h") diff --git a/assets/pistol1.tscn b/assets/pistol1.tscn index 5eb7aa1..9619203 100644 --- a/assets/pistol1.tscn +++ b/assets/pistol1.tscn @@ -1,12 +1,11 @@ -[gd_scene load_steps=24 format=3 uid="uid://dslxb3psx30vp"] +[gd_scene load_steps=23 format=3 uid="uid://dslxb3psx30vp"] [ext_resource type="PackedScene" uid="uid://svrb3n31mkag" path="res://assets/Models/gun.blend" id="1_frekg"] [ext_resource type="Script" path="res://scripts/trackerGun.gd" id="2_ieev5"] -[ext_resource type="PackedScene" uid="uid://7u8hjsvnfwjn" path="res://assets/tracker_bullet.tscn" id="3_hixkr"] [ext_resource type="PackedScene" uid="uid://crvohhc6kgshn" path="res://assets/bullet_hole.tscn" id="4_bu1g0"] [ext_resource type="PackedScene" uid="uid://c1gdehrsytlkk" path="res://assets/casing_2.tscn" id="5_gls8p"] [ext_resource type="PackedScene" uid="uid://cp8563f0oxvff" path="res://assets/mag1.tscn" id="6_ysonb"] -[ext_resource type="AudioStream" uid="uid://ba0w04uqqexpn" path="res://assets/Audio/Weapons/machine-gun-m16-double-shot-close-perspective-SBA-300130711.wav" id="8_jtjwm"] +[ext_resource type="AudioStream" uid="uid://bxjv50ivk3fvn" path="res://assets/Audio/Weapons/9mm Full Size Pistol/Gunshots/9mm Full Size Pistol - Gunshot B 001.wav" id="7_25stk"] [ext_resource type="AudioStream" uid="uid://t50i483xmj3a" path="res://assets/Audio/Weapons/toy-click-spin-SBA-300071143.wav" id="9_btm61"] [ext_resource type="AudioStream" uid="uid://db3iy0f1pa5lg" path="res://assets/Audio/Weapons/gun-m-16-reload-full-clip-magazine-SBA-300121257.wav" id="10_xn8pu"] [ext_resource type="Texture2D" uid="uid://dtg3nb2ew72c3" path="res://assets/star_05.png" id="11_x0sef"] @@ -241,6 +240,64 @@ tracks/4/keys = { }] } +[sub_resource type="Animation" id="Animation_lhlkm"] +resource_name = "remove_tracker" +length = 0.35 +step = 0.01 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("gun:position") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.16, 0.24, 0.35), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector3(0, -0.000397999, 0), Vector3(0, -0.0215431, 0), Vector3(0, 0.116845, 0), Vector3(0, -0.000397999, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("gun:rotation") +tracks/1/interp = 2 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.16, 0.24, 0.35), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector3(0, -1.5708, 0), Vector3(1.04543e-06, -1.5708, 0.288695), Vector3(-2.69979e-06, -1.5708, -0.841737), Vector3(0, -1.5708, 0)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("gun/slide:position") +tracks/2/interp = 2 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(), +"transitions": PackedFloat32Array(), +"update": 0, +"values": [] +} +tracks/3/type = "method" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath(".") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0.16, 0.35), +"transitions": PackedFloat32Array(1, 1), +"values": [{ +"args": [], +"method": &"remove_tracker" +}, { +"args": [], +"method": &"check_ammo" +}] +} + [sub_resource type="Animation" id="Animation_bsc1a"] resource_name = "shoot" length = 0.1 @@ -356,61 +413,6 @@ tracks/2/keys = { }] } -[sub_resource type="Animation" id="Animation_lhlkm"] -resource_name = "remove_tracker" -length = 0.35 -step = 0.01 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("gun:position") -tracks/0/interp = 2 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.16, 0.24, 0.35), -"transitions": PackedFloat32Array(1, 1, 1, 1), -"update": 0, -"values": [Vector3(0, -0.000397999, 0), Vector3(0, -0.0215431, 0), Vector3(0, 0.116845, 0), Vector3(0, -0.000397999, 0)] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("gun:rotation") -tracks/1/interp = 2 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0, 0.16, 0.24, 0.35), -"transitions": PackedFloat32Array(1, 1, 1, 1), -"update": 0, -"values": [Vector3(0, -1.5708, 0), Vector3(1.04543e-06, -1.5708, 0.288695), Vector3(-2.69979e-06, -1.5708, -0.841737), Vector3(0, -1.5708, 0)] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("gun/slide:position") -tracks/2/interp = 2 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(), -"transitions": PackedFloat32Array(), -"update": 0, -"values": [] -} -tracks/3/type = "method" -tracks/3/imported = false -tracks/3/enabled = true -tracks/3/path = NodePath(".") -tracks/3/interp = 1 -tracks/3/loop_wrap = true -tracks/3/keys = { -"times": PackedFloat32Array(0.24), -"transitions": PackedFloat32Array(1), -"values": [{ -"args": [], -"method": &"remove_tracker" -}] -} - [sub_resource type="AnimationLibrary" id="AnimationLibrary_vkrtt"] _data = { "RESET": SubResource("Animation_urfns"), @@ -433,7 +435,6 @@ recoil_amount = Vector3(0, 0.05, 0.05) bullet_speed = 50 tracker_indicator = NodePath("gun/slide/TrackerIndicator") flare_light = NodePath("SpotLight3D") -bullet = ExtResource("3_hixkr") bullethole = ExtResource("4_bu1g0") casing = ExtResource("5_gls8p") mag = ExtResource("6_ysonb") @@ -479,7 +480,7 @@ libraries = { [node name="Audio" type="Node3D" parent="." index="2"] [node name="Fire" type="AudioStreamPlayer3D" parent="Audio" index="0"] -stream = ExtResource("8_jtjwm") +stream = ExtResource("7_25stk") volume_db = 5.0 bus = &"SFX" diff --git a/assets/player.tscn b/assets/player.tscn index 3aeffc6..021e106 100644 --- a/assets/player.tscn +++ b/assets/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=27 format=3 uid="uid://drwae3loscbw7"] +[gd_scene load_steps=28 format=3 uid="uid://drwae3loscbw7"] [ext_resource type="Script" path="res://scripts/player.gd" id="1_x7wms"] [ext_resource type="Script" path="res://scripts/recoil.gd" id="3_405jc"] @@ -19,6 +19,7 @@ [ext_resource type="Shader" path="res://assets/crtTest.gdshader" id="14_v5svg"] [ext_resource type="AudioStream" uid="uid://c1e6vr2hndho7" path="res://assets/Audio/Weapons/Misc (Ammo Boxes, Holsters, Etc)/Kydex Unholster 002.wav" id="17_1fyjm"] [ext_resource type="AudioStream" uid="uid://dqj4cx05f25jj" path="res://assets/Audio/punch-body-hard-SBA-300156881.wav" id="19_6jglu"] +[ext_resource type="AudioStream" uid="uid://c3cnnyotrri2b" path="res://assets/Audio/Foley Inventory and Interactions/Foley Inventory and Interactions/Drop Item/Drop Jewelery A.wav" id="20_t7lfm"] [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_l5ga0"] blend_mode = 1 @@ -241,6 +242,9 @@ stream = ExtResource("17_1fyjm") [node name="HitIndicator" type="AudioStreamPlayer" parent="Audio"] stream = ExtResource("19_6jglu") +[node name="EnemyKilled" type="AudioStreamPlayer" parent="Audio"] +stream = ExtResource("20_t7lfm") + [connection signal="tree_entered" from="." to="." method="_on_tree_entered"] [connection signal="body_entered" from="pick_up_detection" to="." method="_on_pick_up_detection_body_entered"] [connection signal="body_entered" from="pick_up_magnet" to="." method="_on_pick_up_magnet_body_entered"] diff --git a/assets/tracker_bullet.tscn b/assets/tracker_bullet.tscn index 8c616de..6fa4cee 100644 --- a/assets/tracker_bullet.tscn +++ b/assets/tracker_bullet.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=13 format=4 uid="uid://7u8hjsvnfwjn"] -[ext_resource type="Script" path="res://scripts/tracker_bullet.gd" id="1_d1qoc"] +[ext_resource type="Script" path="res://scripts/bullet_tracking.gd" id="1_d1qoc"] [ext_resource type="Texture2D" uid="uid://dqytegxsmb5kg" path="res://assets/Models/bullet.transparency.png" id="2_m1lpb"] [ext_resource type="AudioStream" uid="uid://dqj4cx05f25jj" path="res://assets/Audio/punch-body-hard-SBA-300156881.wav" id="3_irpoj"] diff --git a/assets/tracker_marker.tscn b/assets/tracker_marker.tscn index f848313..39b3488 100644 --- a/assets/tracker_marker.tscn +++ b/assets/tracker_marker.tscn @@ -114,7 +114,8 @@ tracks/1/keys = { [sub_resource type="Animation" id="Animation_ylwlm"] resource_name = "remove" -length = 0.5 +length = 0.35 +step = 0.01 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true @@ -122,7 +123,7 @@ tracks/0/path = NodePath("MeshHandle:position") tracks/0/interp = 2 tracks/0/loop_wrap = true tracks/0/keys = { -"times": PackedFloat32Array(0, 0.5), +"times": PackedFloat32Array(0, 0.35), "transitions": PackedFloat32Array(2, 2), "update": 0, "values": [Vector3(0, 0, 0), Vector3(0, 20, 0)] @@ -134,7 +135,7 @@ tracks/1/path = NodePath(".") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { -"times": PackedFloat32Array(0.5), +"times": PackedFloat32Array(0.35), "transitions": PackedFloat32Array(1), "values": [{ "args": [], @@ -148,11 +149,23 @@ tracks/2/path = NodePath("Sphere:scale") tracks/2/interp = 2 tracks/2/loop_wrap = true tracks/2/keys = { -"times": PackedFloat32Array(0, 0.5), +"times": PackedFloat32Array(0, 0.35), "transitions": PackedFloat32Array(1, 1), "update": 0, "values": [Vector3(1, 1, 1), Vector3(0, 0, 0)] } +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("MeshHandle/Mesh:visible") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} [sub_resource type="AnimationLibrary" id="AnimationLibrary_776o6"] _data = { diff --git a/scripts/bullet.gd b/scripts/bullet.gd index 280f98e..b4046e0 100644 --- a/scripts/bullet.gd +++ b/scripts/bullet.gd @@ -12,6 +12,7 @@ var distance_from_player var player_position var player_velocity var bullet_active = true +var bullet_target : Node @onready var mesh = $Cylinder @onready var particles = $GPUParticles3D @@ -23,47 +24,85 @@ var bullet_active = true func _ready(): visible = false - linear_velocity += transform.basis * Vector3(0, 0, -bullet_speed) + player_velocity + if bullet_target == null: + linear_velocity += transform.basis * Vector3(0, 0, -bullet_speed) + player_velocity # Called every frame. 'delta' is the elapsed time since the previous frame. func _physics_process(delta): angular_velocity = Vector3(0,0,0) - distance_from_player = abs(self.global_position - player_position) + distance_from_player = self.global_position.distance_to(player_position) - if distance_from_player.length() > 1.5: + if distance_from_player > 1.5: visible = true - + + if bullet_target != null: + linear_velocity = transform.basis * Vector3(0, 0, -bullet_speed) + look_at(bullet_target.global_position) + + if ray.is_colliding(): + var body = ray.get_collider() + if body != null and !body.is_in_group("player"): + + mesh.visible = false + ray.enabled = false + + if body.is_in_group("enemy_target"): + hit_indicator.play() + enemy_particles.emitting = true + SignalBus.emit_signal("enemy_hit") + ray.get_collider().hit(bullet_damage) + + #bullethole effect + body.add_child(instance_bullethole) + instance_bullethole.global_transform.origin = ray.get_collision_point() + if (abs(ray.get_collision_normal().y) > 0.99): + instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal(), Vector3(0,0,1)) + else: + instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal()) + + if body.is_in_group("switch"): + body.hit() + + #move rigidbodies + if body.is_in_group("scene_rigidbody"): + body.linear_velocity += transform.basis * Vector3(0,0,-1 * bullet_force_mod) + + if body.is_in_group("breakable"): + var current_velocity = transform.basis * Vector3(0,0,-1 * bullet_force_mod) + ray.get_collider().breaking(current_velocity) + + despawn() -func _on_body_entered(body: Node) -> void: - - if !body.is_in_group("player"): - - ray.enabled = false - - if ray.is_colliding(): - var ray_body = ray.get_collider() - if ray_body != null: - #bullethole effect - ray_body.add_child(instance_bullethole) - instance_bullethole.global_transform.origin = ray.get_collision_point() - if (abs(ray.get_collision_normal().y) > 0.99): - instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal(), Vector3(0,0,1)) - else: - instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal()) - - if body.is_in_group("switch"): - body.hit() - - ##move rigidbodies - #if body.is_in_group("scene_rigidbody"): - #body.linear_velocity += transform.basis * Vector3(0,0,-1 * bullet_force_mod) - - if body.is_in_group("breakable"): - var current_velocity = transform.basis * Vector3(0,0,-1 * bullet_force_mod) - body.breaking(current_velocity) - despawn() +#func _on_body_entered(body: Node) -> void: + # + #if !body.is_in_group("player"): + # + #ray.enabled = false + # + #if ray.is_colliding(): + #var ray_body = ray.get_collider() + #if ray_body != null: + ##bullethole effect + #ray_body.add_child(instance_bullethole) + #instance_bullethole.global_transform.origin = ray.get_collision_point() + #if (abs(ray.get_collision_normal().y) > 0.99): + #instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal(), Vector3(0,0,1)) + #else: + #instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal()) + # + #if body.is_in_group("switch"): + #body.hit() + # + ###move rigidbodies + ##if body.is_in_group("scene_rigidbody"): + ##body.linear_velocity += transform.basis * Vector3(0,0,-1 * bullet_force_mod) + # + #if body.is_in_group("breakable"): + #var current_velocity = transform.basis * Vector3(0,0,-1 * bullet_force_mod) + #body.breaking(current_velocity) + #despawn() func despawn(): #visible = false diff --git a/scripts/bullet_cam.gd b/scripts/bullet_cam.gd new file mode 100644 index 0000000..300efbd --- /dev/null +++ b/scripts/bullet_cam.gd @@ -0,0 +1,106 @@ +extends RigidBody3D + +@export var collision_shape : Node + +var bullet_speed +var bullet_drop +var random_spread_amt +var bullet_damage +var instance_bullethole +var bullet_force_mod = 1.0 +var distance_from_player +var player_position +var player_velocity +var bullet_active = true +var bullet_target : Node +var hold_cam_pos = null +var camera_start +var distance_to_cam_start +var player_cam_FOV : float +var opaque_color = Color(0.702, 0.557, 0.224) +var transparent_color = Color(0.702, 0.557, 0.224, 0) + +@onready var level_control = get_tree().current_scene +@onready var player = level_control.player +@onready var mesh = $Cylinder +@onready var particles = $GPUParticles3D +@onready var enemy_particles = $GPUParticlesEnemy +@onready var hit_indicator = $Audio/HitIndicator +@onready var ray: RayCast3D = $RayCast3D +@onready var camera: Camera3D = $Camera3D +@onready var camera_handle: Node3D = $CameraHandle +@onready var bullet_material = mesh.get_surface_override_material(0) + +const BULLET_CAM_FOV : float = 130 +const BULLET_SENSITIVITY : float = 1 + +func _input(event): + if event is InputEventMouseMotion and hold_cam_pos == null: + var av_y = -event.relative.x * BULLET_SENSITIVITY + var av_x = -event.relative.y * BULLET_SENSITIVITY + angular_velocity += transform.basis * Vector3(av_x,av_y,0) + +# Called when the node enters the scene tree for the first time. +func _ready(): + Engine.time_scale = .01 + player.gamespeed_controlled = true + player.controlled_elsewhere = true + player_cam_FOV = player.camera.fov + camera.fov = player_cam_FOV + camera_start = player.camera.global_position + camera.global_position = camera_start + distance_to_cam_start = camera.global_position.distance_to(camera_handle.global_position) + camera.current = true + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _physics_process(delta): + camera.fov = lerp(player_cam_FOV,BULLET_CAM_FOV, delta * 3000) + linear_velocity = transform.basis * Vector3(0, 0, -bullet_speed) + + var distance_to_cam = camera.global_position.distance_to(camera_handle.global_position) / (distance_to_cam_start*2) + bullet_material.albedo_color = lerp(transparent_color,opaque_color,distance_to_cam) + + if hold_cam_pos != null: + camera.global_position = hold_cam_pos + else: + camera.global_position = lerp(camera.global_position,camera_handle.global_position, delta * 300) + + if ray.is_colliding() and hold_cam_pos == null: + hold_cam_pos = camera.global_position + Engine.time_scale = .005 + + +func _on_body_entered(body: Node) -> void: + + if !body.is_in_group("player"): + + ray.enabled = false + + if ray.is_colliding(): + var ray_body = ray.get_collider() + if ray_body != null: + #bullethole effect + ray_body.add_child(instance_bullethole) + instance_bullethole.global_transform.origin = ray.get_collision_point() + if (abs(ray.get_collision_normal().y) > 0.99): + instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal(), Vector3(0,0,1)) + else: + instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal()) + + if body.is_in_group("switch"): + body.hit() + + + if body.is_in_group("breakable"): + var current_velocity = transform.basis * Vector3(0,0,-1 * bullet_force_mod) + body.breaking(current_velocity) + despawn() + +func despawn(): + player.camera.current = true + player.controlled_elsewhere = false + player.gamespeed_controlled = false + #visible = false + #collision_shape.disabled = true + #await get_tree().create_timer(1).timeout + queue_free() diff --git a/scripts/tracker_bullet.gd b/scripts/bullet_tracking.gd similarity index 98% rename from scripts/tracker_bullet.gd rename to scripts/bullet_tracking.gd index f3a3d3a..a97ec12 100644 --- a/scripts/tracker_bullet.gd +++ b/scripts/bullet_tracking.gd @@ -22,7 +22,7 @@ var bullet_target : Node # Called when the node enters the scene tree for the first time. func _ready(): - + linear_velocity += player_velocity visible = false # Called every frame. 'delta' is the elapsed time since the previous frame. @@ -37,8 +37,7 @@ func _physics_process(delta): if distance_from_player.length() > 1.5: visible = true - - + func _on_body_entered(body: Node) -> void: if !body.is_in_group("player"): diff --git a/scripts/player.gd b/scripts/player.gd index 51b41ad..415c55d 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -10,7 +10,7 @@ const SPRINT_SPEED = 15.0 const DASH_SPEED = 40 const SLOWSPEED = .1 const MAX_STAMINA : float = 100 -const STAMINA_DRAIN = 200 +const STAMINA_DRAIN = 100 #multiplied times the delta when draining var speed var double_jump = true @@ -75,6 +75,7 @@ var held_item_angular_damp_cache var held_item_gravity_cache var held_item_mass_cache var held_item_rotation = Vector3(0,0,0) +var gamespeed_controlled = false # Slow Down Variables var remaining_stamina : float = MAX_STAMINA @@ -84,6 +85,7 @@ var picked_up_text var pickup_announce = load("res://assets/pickup_announce.tscn") var dead_announce = load("res://assets/dead_announce.tscn") var pickupmsg +var controlled_elsewhere = false @onready var crosshair = $Head/Recoil/Camera3D/Crosshair @onready var head = $Head @@ -110,11 +112,13 @@ var pickupmsg @onready var stand_check: RayCast3D = $StandCheck @onready var r_hand_test: MeshInstance3D = $Head/Recoil/Camera3D/WeaponHolder/RHandTest @onready var l_hand_test: MeshInstance3D = $Head/Recoil/Camera3D/WeaponHolder/LHandTest +@onready var enemy_killed_audio: AudioStreamPlayer = $Audio/EnemyKilled func _ready(): SignalBus.enemy_hit.connect(enemy_hit) + SignalBus.enemy_killed.connect(enemy_killed) weapon_holder_start_rot = weapon_holder.rotation weapon_holder_start_pos = weapon_holder.position @@ -134,20 +138,20 @@ func _ready(): AudioServer.set_bus_volume_db(0,-80) func _input(event) -> void: - - if !level_control.paused: - if event is InputEventMouseMotion: - self.rotate_y(-event.relative.x * SENSITIVITY) - head.rotate_x(-event.relative.y * SENSITIVITY) - head.rotation.x = clamp(head.rotation.x, deg_to_rad(-90), deg_to_rad(85)) - mouse_input = event.relative - else: - if event is InputEventMouseMotion: - self.rotate_y(event.relative.x * .00001) - head.rotate_x(event.relative.y * .00001) - head.rotation.x = clamp(head.rotation.x, deg_to_rad(-90), deg_to_rad(85)) - mouse_input = event.relative - + if !controlled_elsewhere: + if !level_control.paused: + if event is InputEventMouseMotion: + self.rotate_y(-event.relative.x * SENSITIVITY) + head.rotate_x(-event.relative.y * SENSITIVITY) + head.rotation.x = clamp(head.rotation.x, deg_to_rad(-90), deg_to_rad(85)) + mouse_input = event.relative + else: + if event is InputEventMouseMotion: + self.rotate_y(event.relative.x * .00001) + head.rotate_x(event.relative.y * .00001) + head.rotation.x = clamp(head.rotation.x, deg_to_rad(-90), deg_to_rad(85)) + mouse_input = event.relative + func _physics_process(delta): if !dead and !level_control.paused: @@ -219,13 +223,10 @@ func _physics_process(delta): health_indicator.color = lerp(Color(0.471, 0, 0, 0), Color(0.471, 0, 0, .25),health_opacity) # Moving Fast Sound - #initiate fast movement -- may be done with this block - #change sounds with speed + var wind_volume = clamp(velocity.length()/20,0,1) #expected max velocity for effect + ear_wind.volume_db = lerp(-80,0,wind_volume) + if moving_fast: - var wind_volume = clamp( velocity.length() - 20 ,-80,10) - ear_wind.volume_db = wind_volume - #reset at apex - #cache fastest speed if abs(velocity.y) > moving_fast_top_speed: moving_fast_top_speed = abs(velocity.y) @@ -243,23 +244,25 @@ func _physics_process(delta): # Game Speed if !level_control.paused: if Input.is_action_pressed("slow_down") and remaining_stamina > 0 : - Engine.time_scale = lerp(Engine.time_scale, SLOWSPEED, delta * 20) - gun.random_spread_amt = 0 - AudioServer.set_bus_effect_enabled(0,0,true) - camera.fov = lerp(camera.fov, camera.fov * gun.fov_zoom_amt, delta * 100) - if sensitivity_shift == true: - SENSITIVITY = lerp(SENSITIVITY, SENSITIVITY * .998, delta * 100) - if remaining_stamina > 0: - remaining_stamina = clamp(remaining_stamina - (delta * STAMINA_DRAIN),0,MAX_STAMINA) + if !gamespeed_controlled: + Engine.time_scale = lerp(Engine.time_scale, SLOWSPEED, delta * 20) + gun.random_spread_amt = 0 + AudioServer.set_bus_effect_enabled(0,0,true) + camera.fov = lerp(camera.fov, camera.fov * gun.fov_zoom_amt, delta * 100) + if sensitivity_shift == true: + SENSITIVITY = lerp(SENSITIVITY, SENSITIVITY * .998, delta * 100) + if remaining_stamina > 0: + remaining_stamina = clamp(remaining_stamina - (delta * STAMINA_DRAIN),0,MAX_STAMINA) else: - Engine.time_scale = lerp(Engine.time_scale, 1.0, delta * 50) - gun.random_spread_amt = gun.random_spread_start - AudioServer.set_bus_effect_enabled(0,0,false) - if sensitivity_shift == true: - camera.fov = lerp(camera.fov, BASE_FOV, delta * .5) - SENSITIVITY = start_sensitivity - if remaining_stamina < MAX_STAMINA and !Input.is_action_pressed("slow_down"): - remaining_stamina = clamp(remaining_stamina + (delta * STAMINA_DRAIN/10), 0, MAX_STAMINA) + if !gamespeed_controlled: + Engine.time_scale = lerp(Engine.time_scale, 1.0, delta * 50) + gun.random_spread_amt = gun.random_spread_start + AudioServer.set_bus_effect_enabled(0,0,false) + if sensitivity_shift == true: + camera.fov = lerp(camera.fov, BASE_FOV, delta * .5) + SENSITIVITY = start_sensitivity + if remaining_stamina < MAX_STAMINA and !Input.is_action_pressed("slow_down"): + remaining_stamina = clamp(remaining_stamina + (delta * STAMINA_DRAIN/10), 0, MAX_STAMINA) # Reloading @@ -354,6 +357,7 @@ func _physics_process(delta): weapon_sway(delta) weapon_bob(velocity.length(), delta) + func _headbob(time) -> Vector3: var pos = Vector3.ZERO pos.y = sin(time * BOB_FREQ) * BOB_AMP @@ -414,6 +418,9 @@ func enemy_hit(): camera.add_child(hitmarker_spawn) hit_indicator.play() +func enemy_killed(): + enemy_killed_audio.play() + func toggle_hud(hud_on): if dead: @@ -426,7 +433,7 @@ func toggle_hud(hud_on): func grab_moveable(body): moveable_holder.global_position = body.global_position held_item = body - held_item_rotation = body.rotation + held_item_rotation = Vector3(0,0,0)#body.rotation #cache rigidbody settings held_item_linear_damp_cache = body.linear_damp held_item_angular_damp_cache = body.angular_damp @@ -443,8 +450,9 @@ func hold_item(): if held_item != null: var held_dir = moveable_holder.global_position - held_item.global_position var held_av = held_item_rotation - held_item.rotation - held_item.linear_velocity = held_dir * 30 - held_item.angular_velocity = held_av * 10 + held_item.linear_velocity = held_dir * 5 + held_item.look_at(camera.global_position) + #held_item.angular_velocity = held_av * 10 #break when moved too far away var distance_from_player = abs(self.global_position - held_item.global_position) diff --git a/scripts/room_manager.gd b/scripts/room_manager.gd index 1c0862b..7d93780 100644 --- a/scripts/room_manager.gd +++ b/scripts/room_manager.gd @@ -20,10 +20,11 @@ var rot_amount : float # Called when the node enters the scene tree for the first time. func _ready(): + SignalBus.enemy_killed.connect(enemy_in_room_killed) + for i in self.get_children(): if i.is_in_group("enemy"): enemies.append(i) - i.last_enemy_dead.connect(last_enemy_dead) if i.is_in_group("door"): doors.append(i) if i.is_in_group("room_check"): @@ -66,13 +67,19 @@ func _process(delta): i.loot_amount = 20 #assign loot to the last enemy drop from this section i.last_enemy = true -func last_enemy_dead(): - if room_lockdown: - room_lockdown = false +func enemy_in_room_killed(): + var enemy_count = 0 + for i in self.get_children(): + if i.is_in_group("enemy") and i.health > 0: + enemy_count += 1 - for i in doors: - if !i.door_open: - i.open() + if enemy_count <= 0: + if room_lockdown: + room_lockdown = false + + for i in doors: + if !i.door_open: + i.open() func room_entered(): if room_lockdown: diff --git a/scripts/shotgun_pellet.gd b/scripts/shotgun_pellet.gd index e3d0b2f..93dc688 100644 --- a/scripts/shotgun_pellet.gd +++ b/scripts/shotgun_pellet.gd @@ -12,6 +12,7 @@ var player_position var bounces = 0 var start_time var end_time +var start_velocity const EMISSION_MAX : float = 200 const EMISSION_LIFETIME : float = 1.75 #in seconds @@ -22,7 +23,8 @@ func _ready() -> void: visible = false start_time = Time.get_ticks_msec() end_time = start_time + (EMISSION_LIFETIME * 1000) - + start_velocity = linear_velocity.length() + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: var current_time = (Time.get_ticks_msec())/end_time @@ -30,6 +32,7 @@ func _process(delta: float) -> void: var distance_from_player = abs(self.global_position - player_position) + if distance_from_player.length() > 1.5: visible = true diff --git a/scripts/signal_bus.gd b/scripts/signal_bus.gd index e369b7e..b3df90a 100644 --- a/scripts/signal_bus.gd +++ b/scripts/signal_bus.gd @@ -3,3 +3,4 @@ extends Node signal switch_changed() signal switch_timeout() signal enemy_hit() +signal enemy_killed() diff --git a/scripts/spider.gd b/scripts/spider.gd index 7979f80..ac3fc42 100644 --- a/scripts/spider.gd +++ b/scripts/spider.gd @@ -185,10 +185,7 @@ func die(): get_tree().get_root().add_child(particlespawn) drop_loot(loot_amount) - - if last_enemy: - emit_signal("last_enemy_dead") - + SignalBus.emit_signal("enemy_killed") queue_free() func drop_loot(number_of_drops): diff --git a/scripts/trackerGun.gd b/scripts/trackerGun.gd index f4e114c..1346642 100644 --- a/scripts/trackerGun.gd +++ b/scripts/trackerGun.gd @@ -20,7 +20,6 @@ extends Node3D @export_subgroup("Main Assets") @export var tracker_indicator : Node @export var flare_light : Node -@export var bullet : Resource @export var bullet_fake : Resource @export var bullethole : Resource @export var casing : Resource @@ -39,6 +38,7 @@ extends Node3D @onready var level_control = get_tree().current_scene @onready var ammo_current @onready var tracker_marker = load("res://assets/tracker_marker.tscn") +@onready var bullet : Resource = load("res://assets/bullet.tscn") @onready var tracker_indicator_material = tracker_indicator.get_surface_override_material(0) var tracker : Node @@ -160,6 +160,11 @@ func remove_tracker(): tracker.remove() tracker = null +func check_ammo(): + if level_control.ammo_current[gun_index] == 0 and level_control.ammo_reserve[gun_index] > 0: + anim_player.play("reload") + audio_reload.play() + func reload(): if tracker != null: anim_player.play("remove_tracker")