From 9e7fab354417648a3e0b4d28980cfa932b304448 Mon Sep 17 00:00:00 2001 From: Kubson96 <42842162+Kubson96@users.noreply.github.com> Date: Fri, 21 Feb 2025 20:42:52 +0100 Subject: [PATCH] feat: add simple shooting component Added interface for damage. Added shooting component with simple shooting system. Fix missing action bindings in player controller. Added cylinder mesh to ExoEnemy and place him on TestMap. --- .../Characters/Enemy/BP_ExoEnemy.uasset | Bin 22209 -> 46136 bytes .../Player/BP_ExoPlayerCharacter.uasset | Bin 24581 -> 25331 bytes .../Inputs/IMC_ExoMappingContext.uasset | Bin 13310 -> 13310 bytes Content/Levels/TestMap.umap | Bin 40242 -> 43284 bytes .../Components/ShootingComponent.cpp | 60 ++++++++++++++++++ .../Private/Player/ExoPlayerController.cpp | 13 +++- .../Characters/Components/ShootingComponent.h | 42 ++++++++++++ Source/Exo/Public/Interfaces/Damageable.h | 27 ++++++++ .../Exo/Public/Player/ExoPlayerController.h | 5 +- 9 files changed, 144 insertions(+), 3 deletions(-) create mode 100644 Source/Exo/Private/Characters/Components/ShootingComponent.cpp create mode 100644 Source/Exo/Public/Characters/Components/ShootingComponent.h create mode 100644 Source/Exo/Public/Interfaces/Damageable.h diff --git a/Content/Blueprints/Characters/Enemy/BP_ExoEnemy.uasset b/Content/Blueprints/Characters/Enemy/BP_ExoEnemy.uasset index 085438db826c1774dab82bdd16be9a41b83cdbe1..acdb0d9cb5e63644ff2422ccce4cebde96e6f018 100644 GIT binary patch literal 46136 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 Ua9nuYFUjirZO%AT!wvEOA5-pjVgLXD delta 6241 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 delta 27 jcmeyD{x5yPB>}5DRg0Uitn=FIbgkubzqj7TM>56$-SQ6A diff --git a/Content/Levels/TestMap.umap b/Content/Levels/TestMap.umap index 9d75a17633e95aecaba9e7f63ad2dd3d307b6eef..25f5e19c3cbaf91ba801b1e5b4473fdb72f93123 100644 GIT binary patch literal 43284 zcmeG_33wD$(hmg018`A9ZUh9uko$HaGs#R2$OSpL#4wrZBmr3V7?v zsVE>KE($0fh#V>)ilQ9i1un|MuHb=O%U|{SRZnMnI+>vV{=5HYL(l83s#mXGy?Ryk zUiVDio<3l~uNN*{7&JoU)!G>;+uKpzRAz_eZ`L_ig`v=}&)Ez5A;9M?Vki{U?A8AG?24W>$3jno%|DXMMlE zsx`pYwaOmz>kw<7s<+0}9sKa;otFdb?(4dZyDQJO@{5nJUGeF*qitLOyJOE3`}4-U zza1MkWW|kZ*S%Q{uwHu#pL#Q|@3QnuuYdT%J72bh0qoP)FU%j=EHCTM_Sb(ibJ>G` zMt)tp99nzqPYZX?SU7dYH&su#P`(uJxm|Up)oEW|Gw&f!&u$%W09fj+f7zR!^G2U# zE8E{y+tKzV_U(AZ>ciisKK#=a`=gc^H>8K(2(Suk>mwtxdrzq9l62R+Tl-#n1;DoC zG1dXfhzv`m6p<}eOAb#&q2%%ASgHWroIM1s-U`Zu|15bRW7k8O5FcxbPfaz&CYTeG zk|NU+Q)7}6VvXrhX^~M$=CpJmVXPF0qoBMqnXy7~|4p{cC_R_4VmQm-ta-uk*uwqS zWxba7(e{=ShLA^X-DG=r{<16Ur^o)dyRZhke2Kc5aeG&-)hz#AUEAqWRAOO zxa5#59%*1)cnrrgwjyka4jwA;T-G_3QG8m+3j|@S^2@omv+K>1y;Ac${Ueu zskWC}ymptfpw{D+D%pzleImL5fzb;5(p;5QE~n)57TT>7(tS=V60#2KA3coLz)3QE zb{orhp;r!$9fxFFN+kz-uA{r;N(7Zd^-KxHVOth1S);&)TWofphb0{Mj7EWsm8Eu| z%(Ge@J`c2#2BLc{PA@xq&8H7{4MI>T)p&hwsla}l#D*4^p1T@poOX}P>vmPuD%G!; zWI29qJ(RlQbA89Rz6P;XRc=>}z0%^93M8-B?kx8(SIx4oc})ceVi~PgpW9-sWv&;$ zTfvp!mMm!wi^s#~3i@e-!OKm;~A-TP^ENk^4J68>;e^Q#u0b}q(%9W0GG9iM5 zidj)%+2A$^_IfSWihPS3)WO0pEIW)slycRYot9FE1Y8_;)DerC`TP(RBGqCmsB+uA z5?gy&pUv2zQlrD+nq;!04y{tUU2@o1^Yy0g*D1JyD#>auvs=wILgVbd`GvoBRPcq9 zTm^QUWXl1axa}4PTXTHnCRDP_x)^#V)$k5^*q=JL>VtE(G;kDg&bIlsa1(a7)IT~1 z?w!zi02)IoOqDcCRTb!*CG~AHS(d;Hwpisg`n;~f3a~xNiRjG_AAJV9TZ-@z*rg*^ z>`&wBNwrLnWRXl3ucgqHBY7&=`!|04U}vOHvpB3i2XrLO<#tO}Z+4z3$7KU6O&)DC zp>dVsF!;QZjZYO24`-6Y$IZR+PqR1Tj3AmIB#-{^&S~_^rDEl%_Y9yTmu@o_$s>2`-B!&2p8z1n^MIk#NVTZ!~sRLsVG+VctCNIhJorK+gd z!xnxz@hsN>A#*KGmONoKm@zh;y|3_Nq4zLSNHu{+KZvI zG}CSa8a8!D*5!Oyv&x+=w^V3%)`D_C`m@*mRK)w0<%G#&ld@nAgZFfM*qYLz>$pK> zIpMy_g+@1`LUI=PN(;P_Y~_}vYlfmxq-L9QO(l6%mWe)z)s*dB$)~bIa@x>1*_l(# zmt2Kp4wrQTOlMQA(^6@-vICY=bFsgv4xa>*-szQ%&Zc-04+}R2$kouhxK`_xHmE{3l9x8Dc$X=Om%s^u1Yqh^Zp@RkuF5tyC z${i9E#jYC3!Q7+j-wwB&ZN7pEP)2c<2AdFMgJ7{Sx9=dLWh zh0mFMv;%S@9!oj&??C>(Pq^_8mn@D#dnGzq44CZD%scMmm4-_&2V}oU6LyHT*+xDT z!zG_b!ui2xVWm9NzBs(JGdFII1xc#yE}w^|Xry4)HT6gw7j(GGS6< zD^#}I2YxyH=WA_T$#|FQvpZ}s&ePascVn2~B#JGw^`pv*xb6!etFn5z4Ru`8aXB|Q zjA7u{-PlC$oTs;N*ID2NS83&Pga1PI-i)Fw6C3>aglo9o3w%{oF1L5Mr547*oq#y#`Ft2{o*^5wf6wQPU4=OVcuD)LAssm$VYc>TV9;@X>^<&F}N=md?< za)(q{0pnHSf>34r<%bPaH{0U0d90QyDGj_o3UEo)>Z`f%P?rqH3BE*fW3=O*j&;pUuj57wxIzf97*)_Dk_O+f zjjM*kd0v%jck-CK`1s?0?I{}e2Ux{tlILKL9~xH3$F$ZfDHG>!xdS&|3YF6!m3Ld% z^i|K-Ar0K-xxE#x(Jq+8)$T#-QO^L(cX{kQIZ*`{|6;s7T1}Dy#S$HNh-$^296olU;{+%M|HFv|%mS$(L}H z6|(?cl-V6pE@*&V)_Twa-WJt@ECcdukHnJiSiYVM9EkC-P8G-hj#G!HT5RP!sT{+E zzpsCpx2_}38y*EfQQ(9tTsC&kBzI9u1p7)QwytY#31{zfSMw1!I_%|6-pfc-^+ z`WAL1+r5;FZ}(I=ELJ{pFnc}h*7vr(i=GVTh=M38rcr;c$hjLmS&$h-Aojt2Yb7ey z7Sjr>jH{vPD?8p;c`1{ z6x3&pXnz1r!>kw%iJDyz-Ml`AY;D?{hi}HL#$QKZl9O{?3Lo~kW7w~#JwKUZb}=9Q zy$uc|pv2S(u%gROdM}G^TDs~dZ6$L$AwlH}w} zuvON)+0w3D8RRc{6NR-^60?ML+QoZ-KH9$y1;JG-BTjkryEnd!!qyt2#PL^EW@pF# z>J1B85%XcEE#F~rN|1K(^b`V}9oDx=iN7uz+_XB_tjv&jv5uQhC-w`$Y19T@Dz2Sn0CY!WJiD6xJ$<>u^hw`CD!U8XY1UhaLt25^yC^ zc0GD;ByMSG`4tt5>=K4b$X~L^FojPS4R}Asqbm^mqO-@$Uw@{I7>CodNj9awiRD0i7X3QACTanjD>5#6MTC5WaEnx6o zHs)W0rt*0i44a&ct5Mct)+!^$aI@2fn?ig+#S$MH)Kv!hDiudL?6dg>J~>3FsMhKIWi(%TyJ_OC%rZ8g1fBodU?kE+sUQ;V)v*^=&a`GTt zK;k2&1p^zSf_`G+HiB8^4UCQRV+|G8@VjWP(6{d|kJf=!-&KX>P_ z`ls;8GGAWeMNKFZ+XQP2IsZ#2x+MuYWVl?k*=3PFE=QpPoKESLFa862QXf28Y(hpq zIl2-PBffE&mVc&#GxfoSlbf%>p7_VuEf{4oWDuZ4?#Ss|7aV3`JEOW7f(pL>Qm;t$8SfnqT3xX*hZ9%77Y?5L#DQ8n2!NK7biK4&? z8y@VstbP-*&m0A_hxOlJ{6V3GJP|S>+UD#0U6F^2j13j=ZFG4gPj1gy!I`+^e1c7! zym}L-4D{0L4lPf@&QbL62lYyo}3L6j}wz#8ott@>F@3?>JJ+$*Q z&meOwh`|MSu>_k^IIpj7eta#C8lYfVnr88Maa`ER3(xU~TwDXnNG+dgUw~nPLxp&3 z!SgdxQJV-vucs`S2fw|0J5E%LrR>KZ6JOv83`~-gUV1ilJBDEo$)QCh>BqHvM`J`h zIzPmLq>!OXuq6ji4usvaktZ^$sj?76VSMYl*ZGz@uWWbLTb9q-6vNkTh?9e+Qf=qw z!$0Qg1XTTj+SS`KLGH1(8rhGZbUcA$f-XVv z6?dL&Jp}!e+$AnO1q#yGH{(D34hKG<*XvGIF2M-~o6N>?SPcr6cCfFxvpyP&u|kdV zFyra1BhjV@!bbgafi^(a^XoA`{|M`ZE&w#q!40%4AL+W;%{zq-Dy;#jQ6hut~vPb zN*rw&t{%AA^SgCJMdg)_hXt>qV&j1|M=|oqU>@rqnALR&@>ZUKi8kNN?z>H>IDuB9POo`lDi@3=7F@8N?@b$n5l7A_ zaL;|mEhW!j>S zwKK6b$PR1M9Ts>Jcc$A{1JIHY0-3TW?F(d2yG8y%ShoG|;V2dChQf|6JOdO9Pt2Xz zXM4Z95e=PNGdZ8(liS~hQ;|F&O2l`YX6APYQzMjZs12_l?2m&%HF%(jF|n=YxRq!) z@|Ihgyw|Dre!`&?|E<9?y&;IIO)RnRss~AYTOD!`|R|-aL11VGHq@b?qJv#nA z_w%i27=G``?kWB14P;V3cM)cLeTSNpX!rtIE5HY?n$#7iTLGlAY?4LVjAmLeq1NcF zba|>OBsXj(&^})Lu0-+povtbwXw6BiPrp;9fAKAFI`-U}!?3n4I1^{^Z7eSQ}2j@PZYkelCj z_u&fm;?9c#j$}`r!(NKLZ2$CFIQNR5aMBBex|2_)Uw9Lxlhb;hF4fPDihlWeHAV!P zAjj^sSNbZ!bm0Mq(+Uq?hNiOS%Oi*3uqY(_$t`~ZfH4OG4&;e@*6+T?&j&=1;OQsN zVj-}Ag#d};?zvgmEtwC*9Xajo{_VKOPy=eQKR7;MJes#3h8YCzs*FFmHV-!*G?)_D z;w}Ix*qT@EN^aWlz$RQj5{$+GCosNHArHd3w#7Gc$udg7`FO=MFc#*Seip5?umS?J z(_(kBDY>8T;68$9^Riumy_OV8uf;g5&-uD5Dl^^)#9$~n^N43)#)7<~Ic z-dk{QXw(j`ps=6k z^k0U~385UYZ}ir$(Si6^@vPM&z4@$=AIjlQPMX8z^FPXD#rMDT83qIYGcx;zT`yp7 zMpzsZaIY1Xo-X%j*8P?aSEEQHBnxb*v+BC*PT?dNVFzi{S!IWz+n1rNeD_sJ)>_>A z=(Yg>RbHpzZ`CM)D}qyJz~ejuv2O21b;fPG`Zd6hMdXxlk0-&k3AU%$HCtEMG5yw3 z769pl+5+zMSo5n27v7{IgZYP#Xz&3tyu*`ILN_IVDB+!EzQ>pSny9LhS0y>Qq(mE` zEZ<1(h@7kvumCIeg>5cbJ1QLO^H;5u=gFQ3h&uAa5Dy3~Rn|tN=9idjT>P3D_V#{- z_b0Gc7OX7gSG8b4!75Jdv!He^PcGR(Op#m3=TMtB*4^__F?C+K1k zLyu+mm5+Z5-I!RXmXy@*^c_2A+i7zBQ|tx+z2!xg$h!6*lvIz>h?0{{9{||iB>O*U|lD+{{c0i)CDw;Y|P#< zcN#`JKSl}Id`-os8G4MbM-bqjSpNq)k5NglJT?@-@7-JU6_sKN|ZED@L|V`c}GOWZ>Ml9|pAdq(1Lc&h_;9AK#_ z_isw`UOTWcwV{ldwc#KdDIX@K&n)vg8{cv-m;kR9z>2$m!uCeOaQ^NR=Bf3Eb&99m zM4bNh&22;e!ExAa#mZhCa(*q^9|8Ogx1BbtH%3+sCX#(S=ZD@r^Hzt3L9Pp3F}w$l z0^7HIJq#nCcmwc(LF`*ppnMz6`aPG@5f$Z6JY^f7e974N(FXl+MZidQZuy8c7|$!Z7W1&<%$UD;v*J1v9wXCU29pc@ea-G&hPtphreAy~U3 zMO)i}?%oF4B|2<3RJ!{@;D_>s!ta$3>0W4rZj_MeZJ-;|fP6%^5$Ns@LYFUK!~^+B zLFj0Fhl??P6X?nspeqz~CxPyk2I$5MI<%|O5a@8+EDg}zDsafJBnVxBfQ=L7TR>ME z0v+}@nEeIvLpriCwVei|8y#Z1r1Qr3kW4bah? z#W?M0fNqk&Z3Vh{A<%6By6Oh#Y6NZ*(A^elfWrs+Y6Cz!1 zh;(@&(ou|WtRKTdp>( z>YGjkHKu>Heo+6x&7nm8kBiEKXn{wBsYt3#61OmhR9FN zQ+*Ar6j`apcPdyL0Mc3>?Q^amN-831zikp|062?=s#%>0QtWt*uJOYFF;Bk zn!+FFFYO&5|Mvv5nquPWFNrUehzTbD-vZ<>5fzaCBEil$LR_c{;!7o>g7M#_;*a{r zF%>^@!2083emK4k!e7SJAM0TJzg6)^`^0qt%7pegNCKU4AV z0}N=5i}F7u80J@LITK$hks_G1XZjD#ihqjq%6*3aWzkgU{e7evyBh zKba`BWn=t53E+?W8dwMI=NG}wO`Et{_KKfFR51O2tl~cqXlM@v$9I(AS20yws0xys zN<;59A#qeuqaC|aDE`xm% zZ^Q-T|AC4>=5M&?j&)G~IN$L2WSLwB`)rIq+6t~AaUT+oc5si=3ispx1t-4bh4=Ve z^gNsx^YI?{56{7gUBr9bZ$As?wc;M>&%jCacz;@TkM;4F)v!M5>lL^@1t;>ty|7>4 z42Nqv5Z(z+d~c&YoOqAVeow%O@L&h>#eVF7GZ2q@=^hA#dxXCiggyvq$RPC?1gnJj zR&dI%T;RykOB$ndK^u8;9i&p@aJ4}1(#fybh06@kYyAmM@fN+& zl7E|wvkUfX>jUxvQOo|JSiwf&GYEV*COn7W!SkKXeBEzF1 z`}1*9)il@OTRsfEAl8eDkBy9qi3*R8#kx`PF-b8>{iyi3*qEev;MSkD0eW~1NrJDz zz|UR57dla(=*Z}}@W|-!sDyz~DLN@UGLru!9DAzwg$vVOKYtPo8HXR0hTX;Eyj*bi z$S={>)qAZ7L>L}7i9ti1;SnUn$Oy0%{)+&3r)dF24QxSI9Gog46XU!InHVQ!$iz(& zqe;ZUWDZ#@bOwRM9|H^z8Z3MX6c3{qJo!%bc~j@DVRxT@aO32N<)_cBjW!fq*wymo z-4hMhiVA^@I_fb3p3d)kwb=;exbruBkOJkR(vPkdko?5)F%9z0e@hu5qyN&>*pw*Nd($uy|(|CTTh>)`8GhbLbHXt0oALkQ4C+4#seb)9_SnKAi4P5 zM^&rG1PKiI0f$*Gl+R|$<^r)GVR+;z6oeWi3Q(Yj#8?$2kbw=#kqnVqjINfkHQJb< zu2UlLPtg$XI%S$o9+HH+(|^o(){uJ7Wj#Kfx?<`Q(gF<$rcV606h8UO(oq^6(>9Gp zS)HIxkz74UuiJ`IC-Z4^LUT@a#T(^vjDeRd)(|-6sWL*b%NxW!!Nsk=_*`7B5hW=B zlC*JV;(l@BUiGwrGyQPZMwxlBMqG?}cxcr3Aw(OJnUvH^rey>dxBenlTxzZCw{^td zg18!?=}3kcP>mYrZi-9!QB*_Cgh`; z^s_*aNZhLs5dk*}BHb{<@rF4v9hGcU{d+&$5I`^AYv~D2^i*zS{80D@!s)(#>E|B^ zH{d289;B5m!iSIoc(zJJ1e_~~M$2`zpQ!;{F*(9xi(JU-R=h?!WY!!`TDlUEG7phx zE1Y_Ii zbz&33^C;1sgw@SDyWUcGWcT1f#^;}yIc?J`r5^Gsl;YrGm>-yaYQFvRia=@<_n|Qe>@a(M)Zradd%FL{jB9Ce_k=e%$kX;qZ*RAL+ZaZ&+cc8%CZPe`wXb ztXVf7JT`M=?4It2ogLSn8I!)DWc{i+FPwXC!`LUDs(56Od5)CZvPat<)o12S`yzYS zh@3ay@38pRUMB`@50I)+&)fF&_xIY5-k$yRo(qfje(63lM9GTpFQ2 zy&BG5aQ1-{-St2?`@z{2&M-KU9s|6Of6W*!X7TD25Y0xJA zPY-psQ4kcWwb0Y`aNX!1%LrtEOmq&z90SKt$wnCtjPuPo)AvyWY7h@94g602ps;}+ z12=-nb5M!Wa-31WuNaHsem#n z>LIr#^>=&KYCu^Vy2m~-cH3t8e0LM*{w)qtKI)ATKgu2Tgs6JzhHuYs?8 zkSzE>hz`I2EgkjRt7j8bSJj5#OLcfzN1Wucp1dd*)Zy}yj8NVdc>R0JOKkvOl9i;? z=$rJbs)O>?lX0`qFT(Nqe?wjsUy_lRs9!wAq3Bm73zrw`rwUyMUjN?m0)NtvA{X}~ zbSIax?pyGidNzRdNk&t^HQZxA>+$_P zpVAm-~l%H}aBY8R+fQEi!<~9TPW$MQIi#70noBk4puJ76tba$t-a}oyA*> z6ZobY2`@;Lf}VnC9C>M{a>bN@*-=5U_}-|I?!FLv?}X=%grg0d0pqJr#4>xd>gVuVnB&h!#m!hRi!XY zGXz>rU_(0vv1W8`0EF)7;LmjEjtHd?pw`)GXQofp3;LEn_q3`KtsT36eMY_hi3F53R_w(ff~UwX>CzHQi= z8G+iqT&Rifw97w`6KF`f(hh*SeMJ30H8;=?tk&dyJkct(({quJ8Q&OCbEu^C8yy1s zL4J}iTI>B-Sd%R$Rdk7FBw9Hh1efnrpP!3s%|?s*0VWBk8S|b{``;M=NpSj_s79c_ zLUbG>sId4+rN&0b8I$6oW73jh z<6i)&XSZATNamKlj5w2F;;7AX-RxyWK2|IdQ5CmT&gM6WKK25 zrbR`;AGl02#U>@BnIq|l5*Jhw97YIlqAC4L@`5LREhGR0fa0;02;Jr z-15OgYZv4-ejo43zIy8_p(|2Bh=H-EfeXm| zO_L^1kLH4B7r0PO9%Ev9RAgLYoXH%Y5Sx@_Hp2UUsqt~qrnFd?NO9(p=;*|lnCMia zIWjsr)?|uKiZw^WePV(sF(xTCF@2cNVuN3Z#GmOJF4^QiHd9g@-6vX#EQv`lnSfhb zpJfY(hy|UT#6*aAQ`k*;G=0CM4Fo4V*1> zkEJ;}HqDrnl$4N~Xo^XUF~XdWjZTUNkB|@-7aeI-7}0E`k`Q!HCBdl-fX5P?$^blq z)5R<&61{us2d9gZsbkIY>G9@xyi1cIF>;~!jC!>=F1DTwS|1`9M3!V1MCRlc+$N65 zl7bQ0qghCP<6SU4{cxNrERCkqLSfwmR~ff_=@O8@X>$)z&J-81qSX2XU0?I7sNxnS z3DsN(HBrDd#npm<9O%9P2K>P;5fRsC1kp8m6WSpNG(OQJYP1(+pf1QQvj+qRav{1L zB|+F^j>MVDi*%2*23Y`qdC~3>8Ikpns&A0FD{yh^FB*(4)HmH+sRuCnzsQy7F+IiU z7Sy4e;G#y{XpktaZZ?m|CTGE6%QE|4|Lpf^FLloC+3oW!*@>cQnhsY6h{C4>wuEw$ zb_I>{{SS@Y;Xt9gAjAcOZl|zjlRH(r>mSz46}Jvu{@(LVA3$ouQcYZUzDHzK0RG*b}mAO!@L2YY+g6c05-5?N37Lw5he$YAh{YCOuld-#*2*j@$WV{YB#XF zhz0W-#m%HK?h% zEoH#oz$WNER&WbkDy<}fI6)92O5#kt-Asg<5~YSSN?+bZhQp#(kj}7_zX{}>qNFC} z+nMhe-q5dIXZT(p$=G%JLa~&~8mig5p_*dnFxWROU;;K!lfRIK%?43KUCJIIkWG}N zh=;{J`%GNK>k!^WgmK~mUy8&daE>%%DKa7mW|R&F)_A&@VY--3x|m{JOfOwbx-KR| z7encHpbi+jUDRo^t)IKtiUWmhG`Yp27u#Z|i)~RjFJ&!6#<*EXqAgkg2+lrDZV~F$ z)hxbbv0&L`pHqACwjkk6Z-(yl_x}gK%7A ze6s;$>PG^p2}9`S&IqJUl+^QO;+`!R7w_s2K1hTQiHq){)Xv8&T}-Af<`!K{PhCu| z4yG9!tAk-|qzQ2ZIKD;y+KrWRsc0f*f76<84w;pkr4t(5AtY!@EY6rr%r_Z zv#1$lk}&pHQFEy%$<&vKd-k-rSS`vRTxM+wJXAv5hB>w;gQ%YyU2 zAfd0@JB~}dn1A}68U@tN0s(Ay|3^x#PUGuR{z$2r$e@+vtw`*hd?O4`Q?$^@n*TzSPl*e9b0FwS!zqZg&H~(M z7l90%T+LXdXgmndjVaN()spn8?c9+)h`uqpR8%KV|A@F}kBW;dJuZMx2@^zGnb!)8 zM&_M6b_}{8kb#XqE8y%oabXmtmVY-PRv?Qfh{coQB3ck`5%(Cd`0*j6^*1-rIm0?Z z7_P^;Oke$CjR&PQzREU+$f5GaFr*|OkVj((hNl{GSOkL8H zqL2TDtG5ZFFG2jk55`ma$hwqq0;!Ep{dF+S*p0fFY#j`vU(yaT)lQ2#wW18thcl+z z^pTmVe-}tiY{RuHu{Q~#wxXnD?Yy{W^uUm^VS)!Mai10svaPG+Ted-znqpkRQ?pN3 z#pFEq=-Xc|dgg31G&MZvZPcsfTlwdU`L941NM5hqS?IgqJ;Dyr literal 40242 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 Jgt$lg{{a~jS{eWV diff --git a/Source/Exo/Private/Characters/Components/ShootingComponent.cpp b/Source/Exo/Private/Characters/Components/ShootingComponent.cpp new file mode 100644 index 0000000..31dc989 --- /dev/null +++ b/Source/Exo/Private/Characters/Components/ShootingComponent.cpp @@ -0,0 +1,60 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Characters/Components/ShootingComponent.h" + +// Sets default values for this component's properties +UShootingComponent::UShootingComponent() +{ + // Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features + // off to improve performance if you don't need them. + PrimaryComponentTick.bCanEverTick = true; + + // ... +} + + +// Called when the game starts +void UShootingComponent::BeginPlay() +{ + Super::BeginPlay(); + + // ... + +} + + +void UShootingComponent::Shoot() +{ + AActor* Owner = GetOwner(); + + FVector LineStart = Owner->GetActorLocation(); + FVector ForwardVector = Owner->GetActorForwardVector(); + FVector LineEnd = LineStart + (ForwardVector * MaxRange); + + FHitResult HitResult; + FCollisionQueryParams QueryParams; + QueryParams.AddIgnoredActor(Owner); + + bool bHit = GetWorld()->LineTraceSingleByChannel(HitResult, LineStart, LineEnd, ECC_Visibility, QueryParams); + + if (bHit && HitResult.GetActor() && HitResult.GetActor()->Implements()) + { + IDamageable::Execute_TakeDamage(HitResult.GetActor(), DamageValue); + + UE_LOG(LogTemp, Warning, TEXT("Shoot")); + } + + if (bShowDebugLine) + DrawDebugLine(GetWorld(), LineStart, LineEnd, FColor::Red, false, 1.0f, 0, 1.0f); +} + + +// Called every frame +void UShootingComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) +{ + Super::TickComponent(DeltaTime, TickType, ThisTickFunction); + + // ... +} + diff --git a/Source/Exo/Private/Player/ExoPlayerController.cpp b/Source/Exo/Private/Player/ExoPlayerController.cpp index 7417f9d..68803ed 100644 --- a/Source/Exo/Private/Player/ExoPlayerController.cpp +++ b/Source/Exo/Private/Player/ExoPlayerController.cpp @@ -29,6 +29,7 @@ void AExoPlayerController::BeginPlay() } InteractionComponent = PlayerCharacter->FindComponentByClass(); + ShootingComponent = PlayerCharacter->FindComponentByClass(); } void AExoPlayerController::PlayerTick(float DeltaTime) @@ -47,6 +48,14 @@ void AExoPlayerController::SetupInputComponent() EnhancedInputComponent->BindAction(InteractAction, ETriggerEvent::Triggered, this, &AExoPlayerController::Interact); EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Started, this, &AExoPlayerController::PlayerJump); EnhancedInputComponent->BindAction(DodgeAction, ETriggerEvent::Started, this, &AExoPlayerController::PlayerDodge); + //EnhancedInputComponent->BindAction(, ETriggerEvent::Started, this, &AExoPlayerController::ResetDodge); + EnhancedInputComponent->BindAction(CrouchAction, ETriggerEvent::Started, this, &AExoPlayerController::PlayerCrouch); + EnhancedInputComponent->BindAction(SprintAction, ETriggerEvent::Started, this, &AExoPlayerController::PlayerSprint); + EnhancedInputComponent->BindAction(ShootAction, ETriggerEvent::Started, this, &AExoPlayerController::PlayerShoot); + EnhancedInputComponent->BindAction(AimAction, ETriggerEvent::Started, this, &AExoPlayerController::PlayerAim); + EnhancedInputComponent->BindAction(MeleAction, ETriggerEvent::Started, this, &AExoPlayerController::PlayerMeleAttack); + EnhancedInputComponent->BindAction(ChangeWeaponAction, ETriggerEvent::Started, this, &AExoPlayerController::PlayerChangeWeapon); + EnhancedInputComponent->BindAction(ReloadAction, ETriggerEvent::Started, this, &AExoPlayerController::PlayerReload); } void AExoPlayerController::Move(const FInputActionValue& InputActionValue) @@ -74,7 +83,7 @@ void AExoPlayerController::Look(const FInputActionValue& InputActionValue) } -void AExoPlayerController::Interact(const FInputActionValue& InputActionValue) +void AExoPlayerController::Interact() { if (InteractionComponent->InteractedActor) IInteractable::Execute_Interact(InteractionComponent->InteractedActor); @@ -123,7 +132,7 @@ void AExoPlayerController::PlayerSprint() void AExoPlayerController::PlayerShoot() { - + ShootingComponent->Shoot(); } void AExoPlayerController::PlayerAim() diff --git a/Source/Exo/Public/Characters/Components/ShootingComponent.h b/Source/Exo/Public/Characters/Components/ShootingComponent.h new file mode 100644 index 0000000..6730a8d --- /dev/null +++ b/Source/Exo/Public/Characters/Components/ShootingComponent.h @@ -0,0 +1,42 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "Components/ActorComponent.h" +#include "Interfaces/Damageable.h" +#include "ShootingComponent.generated.h" + + +UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) +class EXO_API UShootingComponent : public UActorComponent +{ + GENERATED_BODY() + +public: + // Sets default values for this component's properties + UShootingComponent(); + + UPROPERTY(EditAnywhere, Category = "Shooting") + float MaxRange = 2000.0f; + + UPROPERTY(EditAnywhere, Category = "Shooting") + float DamageValue = 100.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Debug") + bool bShowDebugLine = true; + +protected: + // Called when the game starts + virtual void BeginPlay() override; + +public: + // Called every frame + virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; + + UFUNCTION(Category = "Shooting") + void Shoot(); + + //UFUNCTION(Category = "Shooting") + //void Reload(); +}; diff --git a/Source/Exo/Public/Interfaces/Damageable.h b/Source/Exo/Public/Interfaces/Damageable.h new file mode 100644 index 0000000..92408fc --- /dev/null +++ b/Source/Exo/Public/Interfaces/Damageable.h @@ -0,0 +1,27 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "UObject/Interface.h" +#include "Damageable.generated.h" + +// This class does not need to be modified. +UINTERFACE(MinimalAPI, Blueprintable) +class UDamageable : public UInterface +{ + GENERATED_BODY() +}; + +/** + * + */ +class EXO_API IDamageable +{ + GENERATED_BODY() + + // Add interface functions to this class. This is the class that will be inherited to implement this interface. +public: + UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Damage") + void TakeDamage(float damageValue); +}; diff --git a/Source/Exo/Public/Player/ExoPlayerController.h b/Source/Exo/Public/Player/ExoPlayerController.h index 00cf92d..93b3025 100644 --- a/Source/Exo/Public/Player/ExoPlayerController.h +++ b/Source/Exo/Public/Player/ExoPlayerController.h @@ -5,6 +5,7 @@ #include "CoreMinimal.h" #include "GameFramework/PlayerController.h" #include +#include #include "ExoPlayerController.generated.h" class AExoPlayerCharacter; @@ -35,7 +36,7 @@ protected: void Look(const FInputActionValue& InputActionValue); // MouseXY UFUNCTION(BlueprintCallable, Category = "Input") - void Interact(const FInputActionValue& InputActionValue); // E + void Interact(); // E UFUNCTION(BlueprintCallable, Category = "Input") void PlayerJump(); // Space @@ -125,4 +126,6 @@ protected: private: UInteractionComponent* InteractionComponent; + + UShootingComponent* ShootingComponent; };