From a75cc548a75d1fd77f0ebf36a10ef9d6b2e82e62 Mon Sep 17 00:00:00 2001 From: NeonDmn Date: Sun, 1 Jun 2025 15:24:30 +0200 Subject: [PATCH] refactor: Crouching and camera controls. Cover broken --- Config/DefaultEngine.ini | 11 + .../Player/BP_ExoPlayerCharacter.uasset | Bin 33772 -> 102632 bytes Content/Blueprints/HeightChecker.uasset | Bin 0 -> 131883 bytes .../Player/BP_ExoPlayerController.uasset | Bin 22907 -> 24093 bytes Content/Levels/TestMap.umap | Bin 52620 -> 59667 bytes .../Components/ShootingComponent.cpp | 3 + .../Private/Characters/ExoPlayerCharacter.cpp | 205 +++++++++++- .../Private/Player/ExoPlayerController.cpp | 291 +++++++++--------- .../Characters/Components/ShootingComponent.h | 4 + .../Public/Characters/ExoPlayerCharacter.h | 86 +++++- .../Exo/Public/Player/ExoPlayerController.h | 52 ++-- 11 files changed, 467 insertions(+), 185 deletions(-) create mode 100644 Content/Blueprints/HeightChecker.uasset diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index c1d5b98..09ddd8d 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -63,3 +63,14 @@ ServerDefaultMap=/Engine/Maps/Entry.Entry GlobalDefaultGameMode=/Game/Blueprints/Game/BP_ExoGameMode.BP_ExoGameMode_C GlobalDefaultServerGameMode=None + +[CoreRedirects] ++FunctionRedirects=(OldName="/Script/Exo.ExoPlayerController.UpdateCoverStandHeight",NewName="/Script/Exo.ExoPlayerController.UpdateSmoothCoverCamera") ++FunctionRedirects=(OldName="/Script/Exo.ExoPlayerController.AdjustCameraWhileInCover",NewName="/Script/Exo.ExoPlayerController.CalculateCoverAim") ++FunctionRedirects=(OldName="/Script/Exo.ExoPlayerController.SetNewCameraLocationOffset",NewName="/Script/Exo.ExoPlayerController.SetEyePositionOffset") ++FunctionRedirects=(OldName="/Script/Exo.ExoPlayerController.SetNewCameraRotationOffset",NewName="/Script/Exo.ExoPlayerController.SetEyeRoll") ++PropertyRedirects=(OldName="/Script/Exo.ExoPlayerCharacter.IsInCover",NewName="/Script/Exo.ExoPlayerCharacter.bIsInCover") ++PropertyRedirects=(OldName="/Script/Exo.ExoPlayerCharacter.CoverEyeHeight",NewName="/Script/Exo.ExoPlayerCharacter.LowEyeHeight") ++FunctionRedirects=(OldName="/Script/Exo.ExoPlayerController.CalculateCoverAim",NewName="/Script/Exo.ExoPlayerController.CalculateCoverAimOffset") ++PropertyRedirects=(OldName="/Script/Exo.ExoPlayerController.UseEyeHeight",NewName="/Script/Exo.ExoPlayerController.bUseEyeHeight") ++FunctionRedirects=(OldName="/Script/Exo.ExoPlayerCharacter.SetEyePositionOffset",NewName="/Script/Exo.ExoPlayerCharacter.SetEyePositionOffsetTarget") \ No newline at end of file diff --git a/Content/Blueprints/Characters/Player/BP_ExoPlayerCharacter.uasset b/Content/Blueprints/Characters/Player/BP_ExoPlayerCharacter.uasset index 5ee5a328e518105cdcc65c53c9d1a4b1c767aa1a..f295766fa2c6108e85dac3ff2ed219afea8765c7 100644 GIT binary patch literal 102632 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

;X& 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 delta 12249 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 diff --git a/Content/Blueprints/HeightChecker.uasset b/Content/Blueprints/HeightChecker.uasset new file mode 100644 index 0000000000000000000000000000000000000000..b70f478deeca09a46a04b901c74359e9d853c6f5 GIT binary patch literal 131883 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 Dxx=OJ literal 0 HcmV?d00001 diff --git a/Content/Blueprints/Player/BP_ExoPlayerController.uasset b/Content/Blueprints/Player/BP_ExoPlayerController.uasset index 4ba70946490e079c596770b2bc79f4884e285786..11b0fb54d1f42b8e99441bfb8319584bbf67c233 100644 GIT binary patch delta 6584 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 EAEY_8;{X5v diff --git a/Content/Levels/TestMap.umap b/Content/Levels/TestMap.umap index 04c8b3894096532f9df753c1885b48f71602d010..8f81ca91018d4d49a29836fc312733207f26406a 100644 GIT binary patch literal 59667 zcmeHw2VfM%_y2&PSO7&3Dbl3|NN;>0cgbCfB(xNYVz}g%Ua$;}DJC?b*+=R?-ah{~-MXYd{^j_OE?@A&XAvE*fV?3i_YBX>if%G-_{5Dfzu#Ei z0P;3mn0@{4*A;gv-*kQDzU{wky9DxXzxtX{(+1jCf4<|YRiC{1Lqj*@-MVv<<4NvAn%ix&ny^LXJFQCP1=7wW5s>{ zLcG?k_OCy9#bX~$e{Ayfugf2HqkJj8Qy)}X)~0>Ybk6WPtlB0KIZ5aL8(!`0I%@;K{KlR(aBTna*bih_44hmAAT>ygo(SK8&CXmykN4_<# z#}LUW*}PKExLz@w&e*DmB?fdT#IHl!R^Nj+)1m$^zLWFl8w}_SYGp9gw_inz1cu&L zSBb+V^|sm_KDTFx)juM;C;dbR#czseCTeY!M?^eKIE(W|bcUigHCAoZgj^eTDepfLvvSu3}IDpo` zSu*?%JIi>gLk{*G&&jqGNlv!Bxu@_l%qoH6nG%Y_wmi0Eosu`iW_S3#Ea8xM1PWv> zD{=tmz~W-3-wU;*f#^P)%g0VO{bX+I5Da2Y=^E2BB={5?>weKQ>2!cd)yNpWj3FbEBSm5SBaOoC$9L4msDsVmbtjt@39qE zF!$5nt>Q}XNVYVm&Ff{JR;x$hz&3k4wu(U@gyiv6u&lNF9b7e_{t0PrC-lMLl*^or zWk$>rDrWh4qx&_)Y@g3oTsp|+0d=rmXI30QA&R(atu9-UQvwvH19ilrW;}Tv3Xy8F z=azdMK8dZrxYHZhpdz!=>7HP5pbm?rbcf`$v$`8CZLU^mx#d!^W3;2#I#Fnx-L)X^ z_vQ*cZ-P75VVCSVpc9Y7=49&*t=^1EmZ1xvb<#xMATPV3<%OMa%ob^T5yx!9Z}K){ zbBhAKgV`MuT6RZcNQI%2W-BiTowKCQ4R4Vp@PRFs`^ z4py2x!frw1D#C8?`y@LbDj*(?B&VO7d)XCtSK){to)9b#9De;c`sJcDum-G!I;h{u zv1hPPi>zf1uh%hN!j@+ZS`*C`37Nihztd@viu@&9;*rDcZ{lbul6xB439@ELF3H0O zDf^^;%J_=|40hJ7?B)l!baDwUTyCjtbYLX0pC&Dt%llns(GB_f6O*TLCCYTLJe$)g zIYFhU^e*?lHk0>>OwDzal{+1y!N8?KX!TvXo|?eB-s<)7@snxu*ax^hWj3dmEsD6X zA^OE4>qID2?C|B;T<8zHY;f?}JDko8Te+8YX#D+W+;T;0CDL<#0UPy6yN7ut zL9{Ykd47SHJ@(1ClUxHt9AI<7P>{v7bG4SnIm_Cj92p+BzdXwhA~=d|PNYfRbhk$| zb@#udT@8>e(_sf5Hu=4*OL(_tmAKpZ+ay{yxV1sxH*h;sz;-)Y=vI&Ybr4+_eK+9hc7r@Q-p7oZF( zt?)XEy*Sv|Z}&HTo*Q|NdWj4=P?zUM; zUdx#>q}!?Z@XPD1y$fAc5%d)paRmzf%e;r`@%AZs-m#e9_qW~0xatRj@E&lWc^;d~ zJ6iIPFJ_N__;#_}Ai+`Ko+vr_JT~{mZE;-3gB;`CzCmv2T(fV4_i zAp1ocu-6sWsp4HRMDlwj93OlXmdPXS^8?FTa^vPykYv2W?f3E!jTFpUr+yp91s&q{ zmz27o+fgeYJ)N@eLR7ZL4}Q7VFIU;QlJP0k?{M0opQo^kZ^vnZvnaOAHV!Yz=eo~@ zsH)hu=l{lrmQs}QzH%wLLUk|@TWwUKAySLa@E~SC@M*%JD%2CysX>ltlqqPkrRB0A#;%1>)=!FhP11ui@YIj z>`sVvI()g62U5V7Uv39SW@q-FJHLr04wmipV_Za`)K!%O$6uCth*< z(1-;IXLhJ}kOT`7mk)drv(#A_!OJ>EkM^Sl1|s;v%vH~0 zyDR`IuQH}sJ-yJ8DmgYMAJc)BznR}{iVVl67JI4(R~hJX*tgl9Wn6rRx7=wf<{b)y z+RJWy`^~q|!NJf`2>AtM49oLfAEAQ_F|a6$y}zfp3>9l}`(Zv)Oud(H*g+hiVwRRi zBNYOhLdV7BXG@>#awX1y)>LJx|MbYTGbpY#Ev;~<+vBv;Tt9PYlf7s$R>hu3)a=se zy1^7O!6~!n_Q7B$P)1OalLxpJ9QKfN@b9R-0GncsF(3Y?A$BB?#E8-u*TqMD7sph? zketlJM2WA$JbvDx@`95!USvNmsukEd?jna1W>q%yZu|GB{Xn%uN=_CUWTzI+y@e|; zZAhUUm9e{eU9Gd&8RP0LSBj0RU5-2wmY89f}wyqi&f0Vz+QO zK?V$_*safG+=$_qRqMoIJ}j1(WiM2lj9HSCGr?9_-8#!!b7hbleC+nH<3 zIJH|{cHArC>nxUdf8W+}roT*al!HHAVB&*A#PfF1TNN;0;OYcs4B6C{RZLjNd%Xt6 zX`C-ATO^1V+Z!(xR>oD*ynUXIDCc7ENPdxt<* z0VwbI;w8sUV3ch|WkaT{?^U+JAK@fw%`X_}_dzRJ!NEi;_vDn5oGepl8kzL{h6j*= zx?IfGd9dSy&GoW7Z`imBO@kOcuC$)Y%!$S%{UnnRanfC-T7NlymY7A=2Lq9 zNC&n@wxCX|6~fu)BW z7AEB1kc0>sZa3|L*`ysMD3r$O6kYc8kJysn>=9ybGWwAbWf&Oo{misMCrUY}ANHX< zd};RZk0ZC>ER!K;!9q}CQzv*vp;#fJ{T1);?2M6iU^j%D4?BGFKm9R2RL@I%So{3t zEGqHm`Z%?yiNOw$d3)`<7N`9z*y4aqInY>fX&N|dAA92T;rp@kapOT&uKR-v*Wq3f z`O2xGoJenoVxKO zhO61O3Ru+Lefzs5xB%c!UiQ%-_h^iB_>z$?{BQ#y%g!E-7&i=?#R)it;{q+qHQLQ` zi(W8cXKG@h(a59{`l z`LMzZaUw)QwENfcyL>Mf87s==yX$gK9(^}w6$f$4@dO)p%i7JHQ|qNS>|dEAb54+h z@E&LO^vBlHbP|~LOK-XUCTy0DQYZp(mQ(gf1v+Cr2e*`p5?Crt+cT^fEuDC{_fz(@ zrygz2H!F#%5ISD>^g3T)&=9Jx5TvY*?Idx|Si8#O7d^lrZ9AkKrx4mB#P09^AoH}{T5Z-_LI z6hc-Bw(j7BK@0>o>`2CVDl7z1fN$LJGT(aVg&nS-<@?OdF?@Z8Gso|_Li zmehLcw`h$NTeBBV)PE31th^)sQSw8h(Q)O#-i9L=R=zlqna%9ykDDLCK0zO$IFH+o zHn+gcRH%uHQG_a9*k&FB5Dgd?J9_3&RNg4;r^@3?neB6GtvjK1-#*SUEr6KOAiwdtgNY3Vy|E!s-(!>g>m_U2w!j7xh3^jKIQRkRzpo|b?R-`*^aL#w)nlHPf{bLRU z+}^a$IjY!;3Uu9ycmLB1+X8#7uwM)(jAH$YAsG8~*LPiUcV*gO#Tzw z!S}Le3~CmkCMcU+FTK348+IX;;PX|Cg>ALQtwwW`H}ulvom|x{<=K5=BMxe13IG1g z2|dxQDMQ}fPV00_nG7%QJ5dyP%dgqDb8gt-QQF0tZm>OqosauId;=&zdMl|Qlh;SP zbE)@Ed=t0TcuU}n^Df5=yHJhFF0f*8jW4pzKs729wNa%^nw^4b3_7#^e!yp2(b59$ znB7tIq(7xHkqd1ZTu|j0;y?jDz9KX2`FtZ6Z=?%2|+_4pAUzyumUMhKD zyMi_l<3CvRJ}M;FJ=(`T3=d5oeadkf&60=b%1(+V+JEb~zX`eyI$y=LSG#|IU5Ncn z`_+mvJdH+4XsJX{>!Q)M4R68Dl23L6vK@3?c$&)wN4s`(&U|Cf)cf_Xxsv$qH_kJx z$#7F12UoHJAg&|U4meH7o8`!Efwk9o*i(jptiM#jq>sl|p~VFl@Q};ngFRrr1A5hW zNtNi2b16s=qGSB*WnJ%lawb=T&!c#yIz-H5ICz<7J?-b;_6 z`3ZtrHIJm9c@?FXmm55c3y#|IfBkALPE0aGj>F|B^OwO`fb$qvF`O0kPi1viMh?c# zR9N^yGe5AvsSoBoh+lVZ{HSRF2SkwIu$D*HFu#Fa0gLnYd$X`vG7e0CayZ`Rn^6y< z2GnA|f2jKy929{(3}kS(XUx&{193w{M=69I`CQE@SaZN_yiN6~ij({kaE50){) zw`aj=#YEQQ!1a%z*!i$biHTP1(C(cT^@|i!BlDEK;9W2Hg5f1G#B-jiWvDL zC)k?fDx?4=R`5+vw614IapmI-sMG;(%&=c(cUyrj4Rd+M?h#wR!VwkNU0@f^>&Qoq ze1?cSOleNHKXCHO3hsI4Q=DA_M|zHzK6naSGt}lBi+jMZBzAj7ur@a|yArK_sDqE; zKs4K||GO(tIKB<61c~+TeBe#A4|?4P_BkBIu*X~uulfY;X#!=YFK=Fh<0BM1-}xW& z(l0x^s~F_Bh^V}`H?KVdjxQ;TUGr8{OWcnnNVx>K&)zwO+|f#KZ-IR`)^zJC2QDM@ zoVma{wj!7NT2}Y+yvKT|*kAzTkrW=7!#hhkh4fGeghH-0=6`6#?}@4+1Ir~Bmy~#W zE9+8{yLV1jA(&7xwuQY>xPEvqEYDvpQ_j!5y91b3HS(zKztM+zr;?9%-G_hy+U2OCf%dePq)kgde;BGBVahelNcim&})lS+^5wxRb4`A%Tn zTfIAQnxj|R;2j?+Uk;bq?^!+j;piipY_;rm)ATGHeUyzp#pblySwy`D8(=Ib&#Ass ze>{#eFn?0!&PcYR!BoDS2r=?(m+cykUMLj~zlz*&3ak`k_kVWsLUdq?-OX$Z3Tj2JCJ?gwy}M& z5y9u`k*u++ACHn0+s7avlJ$=JVL#4zfoyRe8feJDdo~ndkcKRHT8b2Q*U9Z0QFC%z zd=n=fX zhPP!{$5&&z@X~O48BFOs`_7MXx<&6sZxrk<8M6teG_iG3SQxCxTesb9$E^Z2Sv5pK zbw3?!J{>h0;NY(>Jo2k+O;ADY5hZKfAj*RCvr-V=f8y^^!dxeN4cG%^{ny70MXOf0 zm7&BH6B;2bLoO-%w;@BIe9R1g;?!SEs%0`e7iF?Ur}u zf?N32l^@i{QrZdb`nn%?!GTJ13_G;;XcTIcGU#0-CCsnar^!>i1iT={Uzs{k`P}_z zuIkxoU$0oc!G-%C;EoCh7J1=CP#7~O3QNmzZ6#L2%$qTz8OkM|A;^(I7ep+Tcs_>c z@Vb-BC%1l5-45@elcnXbvQQ3gZuXH+7vjMTv8h(g!Hi=ox6MQ0)#f^M=1cp~9%*(F z4jy`G{-xa)pcf+wOcId$`Wf~U4lVT*1KHD`+u+4D8h_Pb_|Ly>M;^`EGxKVDA;wr@ z#(`4zeBxVa*#VOs-UP&0j-%i8@VQ>p4c^i*InS;mN zOM~`}!d_H{+6&j6UXP8Yi~w|_DKk6bG@zqIvTtS|?#P$8>R_m^`%G&tXvnzd-7Q}Y z#`smd<2$P_`v&bnevD>amZvmFmko|1upkU>kmG|j(}P!Y!Sw$uY@dv#6IkuZzT%b( zM!th%IgqckF_N8HIdmO%gqWp4-``#xI~gUT*Y#r_9QQoJYCTN%ZNvB>0T13-`;pi4 z4P|}M*~(IPF{)7x@`BbYhk8Yih4L}y z3zIKDOum9J`G$tcN3lvMf3Mcx@G$Wxrl|?<`Y`cs2$OGQn0z;e$yXRA->5M8Y+>?| z?bf6}@)0%hiE4x5KdM9BzfuVKs1BMV(QizyhL7exj1#AZ!S`?An;!<>k742+3X|_( zn0)^UlkbNx`MwX6@4FiKD0aa3xx5X#=)HVo-`4HOY_f8PMK`+CCTm3H*I3o5iC}+RIeq zzkiPKQ9q&ZPo6`3+Ot*5-_;2fiwpHlAIz#r|7!i9{zJ*1e~$2zHTcxmx1A$=+`kGX z|9yV~|1*{SDGL!Z`!zgL5geN6ZiTTLks;3A$H zQ+*FmB$85Kk17w3y=bo)$Jf1rYyUWfT^U=1ODS@M!r!gJM|-C|YQ%q9zw_RDFg@0##GRpF!kPlEzj2FGt-QP_M_ zC}cUWCj3uS_!wW!6a`Q}m*YTyYx2!yKRZ?UC_nD6VHuR4;>cO}%WVc% zP52+H@Nxd7y*QMgV!1mf>%j?^Qsf9FKdx7(G|E2%3Xp%Gb=#Q`_*AAQ{2eNMJolI< z3ZQ;I7y4gX2@eKWP557^@DXCJD1gvrfqC0haRUjG)tCWFX#ISo!bknk84t?;ged&F z3SW(f_v*R;O3^j(Y4P!FqaJ(^{~f{Pm?myQBsJlGsHzj^Upy0`GG>7nGd%>b$Rb{R z3?=_|6+Y?*_ld9!%1^Pn?@!==puxv87{aIcXUgqRnZbp;bcK>X6h6MUg7QaVN5D1v zPvGOaTt;CG^@C^LG`{Kz;Wphx9Qw2-`Efl@r4S#_$_f7uL3nK@ap=>U@Npl2N+CX; zu@gQKHr-7e`m`qe_f`1#J{0W*qJJAM;9jMPSOrhGlp+bBNF;?*jo$=vD-;T2JH>tT zS*lFUZEf%|eo*5li^2!b5k9_9t;Q$$J5!*gksTjvBY#%|{FCPhzncO6_BkkN=&LsJ z#{xts{VcmLG&bhe20zXK|EBxT4Su`<{=m8C27j;tey4e7kB|F*R2uyQzFUJjMgK|h z&+&7NPyXkGsQB0e;wD5=Q~%<=Bo#yX@tq&SuOkZo_#koU)0*(Nsqk^WqP=?bZ?gs5 zPY)U6)`b6_3LoXi{eCQi`oBUHp8T*LpK@x#e^-T%`x~7^0hE800Ga&=p#@UHr4%Uu zrRbVC-%;hE{CK{AWl(;Mh44yxR8B*E*M$GJ3O^YDD5gdE=L^8Dbfc<(a4AJnDEZ$~ z;iLR_hyp188Y~3Y8zJyzO3nU9i@zH1$vzJY5YGZa)2FqSAMtU0hw?uq;EERNaVh6) z@F~6}{WN}z(Ddoq;N!AXt^Zg41pb?<{>AazQ6=zhl zpG(F4ki~jn!le{BLfNMpALAc7V?%zD|JM-sNXM%-`2PZaI+H>9`=TMiwQq@>s=o=B zQl!-+KgL&~ z&)tZngD=9R6sa}gV|=T&AM$U{zZ8tEeyRx{&!dUIE!?bu0yKZ^6omON6Nf&n34f~w zAJ46^49;J_3b=8v=y55hCj2cb{2@>%TNFV5JY0a3yh><+lyE6UN+|ump~6R=r$vEF z;r_~tFo&_K5co1hZY$Lh3jcK#KI(rEFjM@)I?5=C2XXG!mm={9 z|ChlBuN~jXX{hg-@X=QAj0)e=!K)cOquFnQ`xEeK6#^9L`2PHH_%s*%_+AeFS(YU6 zjPGUs2A^xhGxGlmAL7U7UsTUn{uq3)Jn9eM%lR2TSQozga1=hdaId|P-X1 z`1}p<9)J(#8(mn(Cg6D$KB0I}Z=FLBF#kn^G9lRiwprMY>Mo>T2p{>MlcBZIKR~;_ z1bU}bE{j}h8d?wi1917@h4+#HaHhfVQT))4+3S^j{8u{A{_tnQv_$^9c^od(->kvj zmVfXLe^k}0{0I>q zG{ClKVW=N$8D3;&*kXQR>u3u?WU-N!Wt9`B=A!9b?=s+|34MxDvIi&wNn-xsS$~T8RQ$pw>n}0O|U^L&GXaN1eX*{S-(St^D?@ergG6_dwUtX5iir zAG~zL1jsDoq!2`G;20w!xXkCAs*NV1^8} z+L589Q3JXI(NOiNKs0PRmaKKtFP*;U^a9h3+4K8s?lbfLc0ILnP5@B6s6nI}mIj#> zoD_oC0|oey%sfsCLBxoH;#yrv3}~Z7No|FU$2dsTQw%kYwY@6<$wI05M?^li zQ0nDccT2+U=|5*YVM@K@;fe?KQmr{iihnJ)nJt!^Sl5RLL0 zT`NbbEU1#x>rFgmu_kSw;~>L}fUlJw8Rd(|K=Qe`eNLpL1X$sXvJ(2)iF^6uCJwrN zW|a(Hpc9vzlg^wXpu}Gt$6yGJmrj_?5V(>8NwFPdUSq|^3I=`W|2eG+*g!H=r_}+% zx^#Vd@8-CaUqnf22sP|j05SLumsWV`&|p24T3@DxB1WcBLn#%!>^dPI4Qs7Pd?q3$ zlCw&bHjF+v-85U~qm&H~eh%cDH2m_jo}coGpVBJEF9lzlPtU<=0AHJL!q;)|BCTu@ z4viGR*SN$)nfD5&5pr4mca{dVsbHaHld^6?J_M@^pGg`f#VH`un}SGAm{w4VZ)_;4 zq$-rsSdeTXEV)n?lnEU$n&IC?E|djjLhHxY{axfjSx_d?0e>60un$otlnwRvchMJ! z!tEXV^DpYhcd$;lbfbsD7#bkRM8UsqM#6zH89Ct65nDm#`byyO=s494XTzc4D${jS`4LDVVkLqSk04zoIoe5*() zsl%p;Tm6h?nxB4~A#v0X={t;wpA`Hn#U_aQ3bzXidF>j*y-PArw)M?iYtp747}bAu z&Vw0KjEIeTMyC`S2nVlJ7!`xl22&H^O2U?0fN7En)0GB5hI;_VH#b}zxjD1y;k!E> zWD7f0Rdv6>)U5dprXK~gU8FSq+(T8)5;t0V@QHlgc)11$-Gz8M;>AETT%%ygS`ULx z?~QrgIs3W+55D7zo3T26j&>N}N{U}N9zy<#Vy%b5^8!(4@ITCp?t6A!{N?jiGH8~Z zZho;!t8jW}S*KH+1}-yFIPPG6B17w48|rGj5fOW$hY>8gcyh5ifpEkc?g!vf#Lxne zSZfQoVDavEHvQHqd+{ZUq8>Q8e1z5l@I-)L7zzgc?4@o)pq4hV^A8xg| zVao;YS@un-cSqK(>t6WQI_}hg(=$gtQP^}w=1Z;aW(U~I!w1g^FBNWFGyADiZ@)D1;rXTW`dVj81M0VJ)OP%dIa5B*{$Oa%tM4>h zd}D_r-QUwlRpa#7==k?{I)1o0`|+J;7VrAPa{`ZN@zV87K4hx95oZ(3yAnSCf=^5M z;NBj-qt_ZfxJS_!KAqq*7(QL$gHtS;Sr_=k!w27YiG@!beDLrj1wJPDw1E#wj!~PR z|4cI6$W_q~e8Z6#{%*F11v|z){{pLV?L4fK?UIGLhTX^Y+xJhU@J0NVWXNLuIH|+j&&ElMg=CBVY?e?D{ z6;PN=E#&W1sDFf4tp=2}x@Vjk7`y2W`SaFh(ETQ!rF;eT5#&~Gk_AzhQSMU(mW8pm z)c1fZUnC2@k3bhtfS0bI`hskN%Bt!RxKxIxm4qaxLGq$pP=?D(GD3Qj_WoSUOLYJ) z$x2e{^iBFzl|lJ}WPC&D7xVG{|3Y3BF3HGK)GvO-rRY~B3zrwmrwUzb@6WZofKU2S zlJH(2k8=mO#B`8l6udgY|(-P+b;EX%Kk@U8wu`S6;LGGU9f%|E+!@!@GEz=GhpTuvbhJU76m zN&>6`c(^*5{>lR~jKA<7fRa|Y2&ym2r@)N@#_Er2DsMG$j75{>6dr25QN#h@t8&bh zr_W3&sG{e;Qag2_((1H>G-?>hN9oyVPBDjmRWi^&!5qGvXX1@9jS-Eq`~z%U>8Ts# z#{DA(?urNG##Guwqx$^=da6=1ip2`^`zJI?F~6*Tkomp0NN&vGJ4H`r{jJQ;aHBbk zRTDWy0?{yXLSn5Wr#tsg_}x}HCv$qer+W?VG2jnvEX2;#lgmC zTW+{m=nu?>EsqAGVat(N>y|fvd!cW~jnk~N<{oQ*!*TmCZOdsZi@(4h{5O-rQvgbZ zZPF@$;&578QN^qoFkdb<@F+e+E#ifdQ^;$X$hC`<_CMDUcRzthVo*x-PJ*rzCkZ$% z7hF0bR%3V=h(=@BSqNL}&Ki2;q^sd0R@3UOEt0l7hm9qj(b~3&kdv=pga01YdOacU8@v7U-{?xpu(I~Qjl!n?yVy(5ke$l%--fXig^O^b9jg2DKP1kB0_u=`4o7eK+ z2Gp9kp|sghq?25_HZLJ#v0As|;R{n+ERTH9{7UzU`wJVq(oEY9@{|0H{GdOITWiZP zY%iLWVecTZ)~)JuXS3~Bthi&q(s3uQj5&3zjkZ-7Lh!3TeDl9D9CqgnfD(qnBC*!O zCNvtl;N6uk^uMhzb!5}yEq7{#4KgJZHd;5E8LD<*b_b zTB$Lg+WHsipgUBlHE|T{FBYQ*RQccN3d3-B4(xSZkBWdxJEJkyOY|TGIEn^;1NPiJ zb6!?jjx{&4FeWxKF)AT3J}y2gH8wiVoD>%wla>@47aM6c$0a3M3S;7uY?0APiLnV1 zd}1PtY;jTX3Gqqx$k9jVtQ0$Twt0Ma87X$3K%5X47aeIaM|Eh^=9=}xZVdq6 zjVC5TT`HKaHi~DRf?Yq-YSrKOtFh*=(_xqoSg$;F&>Ay2yJ_T2sE3E}nIsF+>}U zJRv~_=qj|ZJR_+Kkx&bC5we{ADNk7#8J@3v3Cy#J7}Vq@YFuCc5Yzhpx39d-^x`yc zv}x81)BGOyxqn%0(H#b%jh`PF)Vq+XJ6LW0az5oyin-?p2C7f3x5&u9@4)!-%S-vd znDtAezU}hwHg(-swkvyZ^Ya5ExC77682@WC#us8>%)WJP`rg^oOv}@^eAlFEkm)Rg zx5FuN{6y)g6p9AreEFLqdYae%kGE!Hpw|D!5`2PaGaVh&BOMHa8^gDiP+G&2S|rx` z>@#9TX1DfFe4qAA%K`1K`D{yeqL8DJNG}s9$;p=}SQE;r?Z0dhlMu7gs9az+d~XD+ zGHeu5e;emkr6 zO8~Ww#6;!6$(Pf06HbbeIt!ray`ngE)GPQ_23$05_=|PKM42-L(>9q`|6L-os6dTT zWiRiG{5K~rN*Tva!*5Pr_~NhpHz!LCfDC_cLNAM)Gg=UI2j$GvI^7|N`o%k$=J^Kw z<9g`b_cuM;#WvBD-u#~X)>e))mA~>G+xeW$RBMy_k@MvIZHP+)nB=&Ujri|&RaJM zEPXTZU2VMdlr)(Tf`XwKUivcag%D5349bsK%n{G*K5=t}V5GMD#T$A*5TiD2Ckkv8 z1PZbE)=`dO+nLF_+{aSJi(Qj{7# ziN^9SGW}bW()BXrr+g=fQ$>6XCSPH%E83Go5V5Yi~ zbVw1hc_}n!!j)lDHwp`rAO-^6GBkZ4JjFh6birf_1q%L)Y{hnINO4;!ZvDMly*7a^m6(mYi)H>({zQA!@y|ElA3!bwARa{H17X zC_i9I*NBDE;^mc-kl$y%5ZNIR7nwIzLrnch5OvcK&giEEQR|adihSj-e!gwMct0`D z6*p}}svnP8hLlW0$_<8;c7~Jz29!E%qydGoVFr{s{EyTiQQsbXksdECr4Eaf2|9}W z$CW~rVXV1fnO=sJp9O{NbdRvC??t{Yxz-R0|Fs-m+Qz`|70QGVl*Xbuy=B3OKP`&s zh;T4>CdQ~F65|Dt-Yur_!2#bAup!1lWlEYT8G;CZ>r0e;LZmdv9~aNcAK-kZx+e`I?m4ZmSQ8bBD=W#MI1!V%|8&O!7kjJ6)E5Shk9WIqKzSWf!8F4~qdYOT6 zksxYy_B5fb6*r+6v20k3b;D)6AY4W?nXsy^A1>pC;WAznit&6v4_d+Ne=DHhB{!P? zd?ns$XW8k3&VSPq@6QMHjGYhY(Gtji(=4?GGechJ>)`X(1@x7>MsY#@mje1%gz9y( zB+gws1yMUoE)w}{vAF3Xrc)gX((zw^;ANE)<-3luyQihdKk^W&jQlIRp(%X?vK|e8 zjTbL1r4GABCg>=P6&q0Mup$ErW5$7Vl0lj3LiZTMGG`OipAV_gnb37Uqy|lh2wHK; z`NGv6AT4Rr3k{;?`NX(D+|Zi?A=WFEDK5dJcNWk=tprg&R1-wyAuy{_q793gjEZf0 zFS~C`QB3RL9uWELL2)zC2nFaV5rRoC^9DiD$-M2o_xjc`(B^Vch^-JeW<&fA1`v-B z#G~RSNigbkz8%8)R6*293587?1%i%UQv=_vh&9=p$<6y8^^fs1H!&P(*G)Fysy-;X!tj-5i*39+9Hg$ox(UB=jzbs0MbIi|*NEt+wv>AAk%>Hpe2;i;~#CB{cU*@^TWZAvo3 zBbH_FxVQV&vyRn)vVGofyLL%^a{suUS1&m9MOepcplr~HJwwwoqMMcvE#ENXhYe*7 zp=^DF%webc7IrFoV_4gILpUmpi$9X`#O|9bz`Kjgt<%cY zO{Z40w0?zsJ5sXd;19`jPh7PpYN>H!YWU4iR#MpTyCIn!$CTZWFm=wz&MmHjvXS|W zHHSPR%~C2wWJ=>CyE`IBa(l8YWl&s~Er(V|f-vDfn+cTLL*BDTtf@zGvMIKwIX)pF zGBrLqCZT7nF*PbBGAhBGk_sq{y$HzZkjEMsLsIx0J6tAoVgzILMl#k6uB83Zsm~64 z(sXa9)i)f7=$O7NzI>DM@|MPDPtLyWe0FgM>^0IsM(VT6fRW#CeWOlOD7od9Tyxwl zgCx6TaZBCf!ecm`u~lJ9b>L8mrz6`}-;X!Z(EgC^av6Ps0$o62(!K?ublVafv6R(CKhTWask-v&-dlvEqG?Ex#V?Wf!_^WuAzB zmT|UXi^t}4WLLO7QYl-tp;N>SfM6^HdMVD*GN(gwcyeroV^Y12LPTWEH#~9>wSl9g zd2Lpf_H2hN96Mf;X(^EGY(+~~{=cxO7^>rj^SW8jBktRfA!BKQ z4KVu`7TUdTXe9+$_gEYrcDC7Pb6W>N$dSrDUYC?@yIo?p<`tZ~7I7Rlx6|WtmQ^U# zuNrST(!vjKPV8E8Ku+ZzW6jm_j z^WU%HLU2iz6uZUkX097nkHU#nOiX@tcdkEO6=fW-ykVBr^59z-SzxMWVf=q8%%AkQ()O;QlYKLR%k945@+`<$T`(g zf#-~OX4|ZiH49|ovRUkG?UB`+P{=arJm{TN&O790*R*QT3FmA<;3(ppZS-xv}NG6x>e#WIi4>v86kfbK~S1iwA^&@$|90hSNO zE`4{^o)j*gWXl*yX31pnSaO_MlDmYxck{;&wnF?Ai@nfmhmNE;T`sB6liA;t<+Os9 zCf;T>p>h@AFnB$Zl}{C54`-6y%hkQ~nweENBM2u5$|FbLI*oR@AO*AmTcH8!^YoYt zIHm>WQk&at8z*7UGX^{t%>@aCo>Z^hZjuVT#hl|2L#sorpBb+Kn8?sHf293}z z7MRPSQlZV0V{xE8aI=9COOEiNOtsnVX_hiK>(JzfFSzE4-by6r+&nhwvv%`%BYv<_ zOIdE7n=Sfm>{%`W0`{{wU@FM$TDe$D;_Rhuk&iT&(_5Bd1r}_D7CXWucdFARy1M({ z(k@&|3({>?z+scNWn9UJHKW+!bV)fjM+FE6xIf$CL@w`Fh65&#Rmy-l4A#@-W@`&> zUC$LN!vW7_PE@+VC6XiCTafLMWG%NWUwbPmMRKOOpDDk8nPse3V&z4D>&KTC2I zOXjg&+c*o*g(Xy;%Wl@`mAsBfynti)%HM0!cpC4STn+-thSnwM^XI#JfA50~D5-GU z3f(x_*vW^Qyu_6}OY(r`*a}g}KTn(dE^nZpRo~Mut3%kM7=M1 z;R{^<`Z+x?7%6tX5V*1>*Eq?=nzvu`BA+dMX|PJEE@x@7)8lcLvSF?E^yPwdS}QX6 za#1KT!@-r?+hGI!9rg-Ri4<5=aD0G#9?a`f$<0nI|E@lo>tv^MOsT~+hMR3xoYQKC zOwwsrZ1~mn*4&4tssP3cl(+(!{`KL<>hb<5W$rOp-uvY46I}HDfq54g&>WY=;VzO~ zWQ*C8AH7>BcSvC5Im;zGU&rRYvOSK=cz|u3(=)&cgKPBMCb^vK`N@awL2e6R-nmgQ zMzAz&#lH%M^EopB^?=NX+foeu+dE+QCtP_4NfvvKtrU$cE|~1V^gHk4l?F*L2V}cQ z6Si+*ohm*QgCwt8!ui2xVW~XRzC5_R6<2N!1y076rzpmzT+vm5n-Q@-l%0Cyv)}pnZE%}dj;Eb=L7>SkITR(GMLOiBUkj|^N^w&q&SJk%w{F}W#w9DM6kp!K=v$rR-K^{Rj0irwhzYhta^Y&nEgfr}o?6M37GOEB zz~ZWcDv{9Vrmb8wyqx=0$u>_6>9!@dPpv6*B!*kcC<=I}AC@JPzU`ES4O zRhL8M6maET7B=O%XDSf~9{amICC=NNFp0;xdT&5EL*W3Y+s2pN^(if;iLyaX98U0c zI_%%V9Vx)eEwh3lvoh;1owuTjgJ!$E=ogVI)uOWhSnQ8bc`l#+MR_)9Je%32GZHyXD+Odbxe}m=8~+*POrl%eD)=8MZbaCDnPh| zgAxyrVCUiRfbn6bIt#;iU0YF+7gf#Ys^_P#dI>vV0;2MEVzSv4juulXvDo?K^>uM; zZr8~&IlhKilU=x-K-Ar?32b8|ASpp>{3JJ1v3+GPY!b=&HFS}ptzVOReqE(Rhx;UHN?D3&( z+u>-K(`{g3T!pY%u)tc%eN?zb%ONJjsNwTp=^6?q@PJ+uyYq##k?3cc1FbbIe1-D< z>*cC;@3*fOB{4A_bd}Yuv%EDI2H8vAL{3GS#4KUgf5>})Hrlrj1;$l7BaV6K``5mT z!q#fS#PL^EW@ks7@`MGgi2ks{I>2smNZ@vH_Y@X78|-fr;!myYQ@c9YtW1z-v6gS2 zj_(qbivJjiMt?JX@O7_{(GwHXBxkAQaoGxUoOT#~*y*xY!j{D2Dy$U}m*M6F^S4|J zG%`dm4m}J4IN*w-?0n?jNDOId>E-4L?-GVe@SnffFp*Ce4RtMYVj}1f_=Q7^9ta<> zkE(voM|;KFffZYJcYri!d*$T4H+0g2CMGKTTd2r3H*fn9u3NO_R9oMdrcLX{Taouj zso<^`SPIAFSU}-DY}oI;C-He144RmTyHVD5#&bqo!_5vW28H;Bip4+FyR}^CEmaKV zz|R*L_~a0dyH$)<1*{ji4S^LyR<-37Ns_ufNv=y<~ZZ)?unJX!5Fm;P z=5w4R#|^I^)cg)y3<)YU=GgAsEy!M~-D&YCBY$?qm*>%Tr#g#G=rDoF|M|HoH_Jun z><_SbO4x)c_j7X&yMJ0fS^A4hJtzrfVw+%(A^U$lbB8A&g*2y=f?XEr<6>kgz~~hG z>-nFsC;r8^i6CV3OpD=bL?W9?y2oj>{z4n9U0WZ^nLY_JxCLQul@jBJuO<4WuU7EmB^`Nuu_awLeX zac}hZwB6H?!&@b(Ors5bUbHSnr%ZqCJ9uv7S@cUYEfuhPn|b&9#pvntCpX(Uz*&TT z4&NK{9UevsGOTP~*w`W1Ee^mX9Cu6?85_#xVRU&U zkH4R_iW70l{sbF4Va+Cv8EB=~A9y+eJ4dUBZ;>yVFzj~hg$9x@{BD+2`gjG}UM&V! zjEZ8|0!`gBq!1OGaJaEk;?+}*x8y-cf+~QHeZN_Rexd^KK7IdyrWcgy4odPlBKn&g=GdkF3K{0}yOWQ!H)|jte_}VFf?r;u26s z>gh?gg}6-cQo$Zu_{_9qlqMFU)l)Xiecs&pK2B6zOW7}N$3Dvi80aJ^y>xH7@h~oX zhz>0(PCxGDTN)#Jpz%W(a0(u(1R*&%IS_i!h8#;9N0kL53gMCKU*#cnUfJgG+m_GR z6vOvz2$L60rP}r{27S!M2_XN0`mm#AjND^6T&A2=M4lY*zRZOT@GS=tJ2mH>k9Zes zj(*#PhxK^k^Ze~2aWeDnYU{qQ@Q+avmh|AHN(?Fe$B3m(gH0=6f(VE{WR$dgd zKk%O$cx#fy#r<2ZmtEQMU-XHDh5qALftRI|ou@jeVZiKON;X;V`7`S0#iSO0u zy3;5|8SdK&G~4&iY8-93Ts?3z7uXxQ*7A~x<_dk9w^xtOo@56o!26lp7G zV4}@8zv;P-m&?&dMP1%WEtrq$qKZH&u=ySDz7GYbf~lEGZ?n^cf)ijh==9oolQ?7C zvEYogdw23MTybQN0%PvmhUYKCwIgV(%J87)2+D$hWOv-`>venIx)C4)z~_WGK_*yK zyX|(qzN7xR`C{ADQ!yP|1MjdR)oy{4xHC8I?}nO;CEzK$Q@%v<6fN=%!pir53`edY z8VV6zI0FS!e(+4yUQv;MR)W%o$b;ZG; z8hoLNF|jS?xYejQa>y-3j z!f%;(b8HCBDE(s1)>|IOVZ?w9kKFh`?f2P zR?(d%ms_Tz7!`J=Y#-O zh~m9hk8h1LF&jKxHr^t=jT)Riro!kcb-K$+Bp1XPD8$#}!^IzyWlh3DpfG)lQC7O zTRsFlaB_Jd9?PSVExu2vL>rn-3%g(vU0gT2`QB${@a}qCiuLLBrmGVl01pOjl;TJ> z{~Ss|gu#6?YtihhPN1R*fLaKTr(Sp+xtDhY+|%-Rta5+*dJQfnGD4QkVJr2Pg4V;? zh@%kBZEj6wb)SwLh{L9!@IzmIc!0|ltX1G*e!5|2GansbL4t!*?f}D@1R4Y=_Pb|i zV7FvCuw=;|bDM8RJ&F=gv;D!5Zlh8CeP!r;U_fT{@pb(%W}$)PLv%bFupp|h3TSTH z_`oLIdQusU0nUAV7egL|^^Nmx=A5PFgWd9o<1-fKo^lqoIHv^Gbce-e=dSR7GGo@F z>eGQEdMbR~mId+46U)!z)Z!;gJYcSxcO9g=4snXKu|wgo*ZSPio%a?jBUvtaW4Gv& z1IJN!a#OP5zzud9!X9V9$w4{0<>0VI$aXI5Bx0f!J^3;$zAq|duET{6G^i@=?d2%- zkg@CbqPnP~9%7D<7;kBb8-+Yr48aOL)w-S)*_DqLpivvVy~2K-)paErFD&H+yKmd_ zH5wRS0Dv`kxFer6@_8Nxfl};FukRF;<=y|n=eUmej@N7(KYSK@GuUDugJD|OwK`q5 zu{Oh-UyE8l*apq3J<#U2zP}QgOL{>&V40$2;g}t4>ZfH2x=dWcc zXV2~kSfS*D6E`p|l~zO~56Cx{JNZ2`?CSVZ=U}xmU>E8})HDd&!EO%YIqaRhZG$k% zrD;RKPKUEhPYLW-*iqx`r8rA=xJUDE4pUIHPvu2 z$W~;Rh-}lWnBVz$1xiKcIJ?B@L6R}eqUTg221G0NI*91$W`m=uA&T$9VV6pd?Y5v9 zkh>J{qFmiO-5=w6L+^RPi!V~H>}#@98QuHfG$5G#3K_fGFf9Y80Ttuqw%E;97FO@k zhUk8QhvFR1Jm-FY5*I!Gq%2~QY-PhK+!s%V)1U$;oPR1X_Rtq+8=$#Rw1$r5t+JQj z^@+0XINk9mJ`0ZG*#5<>kH8NK@>bEL;*}UAuc4&fqfC|`xK`@LB|N1mP;lZQ2{4{gF{5<2J3?sZ9!aC2o z_Y+*W5JKnVyNgG^fs2C(9OUQw3+c}7Gp)E$R)bY@48-#D;g-`-T0RVZDF66xj_3R; z2A;>UCJm!ZxY8*V;jJG2b|9=8a&Qd-e(ctDaf4AU6)f0&L4*i=7ng@Q798H<$Go3+ z$6AkVdK6`()CDm2D44Bfzscxj_#lcS#kaw1vZ3v0KZJmFfpvYL)i4$J%0Z{U#Gjiq zH64df)A@%>1}?yE1?}^iLET62@N*D>__SxqPe~(CQDlR>!(PtA^oryZ#7MU5(}ODz zlTT_kI&98d)MG9Q6;`Lc?fPJO;36`t?k8PvI*}b`N7fvVLfKFOy(^0d^eJcm7q~7NBh)2-sIBed_}I z8I@XXouPQzi|gIEqu?jnLw`BB191X&O6k{G^U+Tb#u{qf|Cwh6DuKUU2Ed-8F1K?> zdknmc0x=qYKmN6zgZSHSxP9^0s)_CD}&_N5{T| zWCJH|x9vlCpqYCsto?{#JW8qcvTiWdU4k-_y&6A<`bc>67~3Lcm)Gcr!x4dkOGnhJg1X;N2er-dez$ z9Rl8e0B=qRcrO6nq9Aw!MH$H!<;=g}0otzCzd-_zWQ%ex3qp_P#~?9ho(H_K)!^j_ zyhDIjR1Mx}frs$-E|dB=ef^Nai)+kt}P%yFJ8yOcY~X6TLe^q&Fc%yvZTr9SM=YUqi&Z zFT{4Q3=wZuh6Th?f>3-qH~9ZVdtNIj|dd zhk*Ai;5kCXTNVV5>?F-uv{$Zb@MzAWKU7%_9?e;#=dK2i<}CU-ld8eHOTbs`Q5pQUSc%(x$$&cn>O?aZ&8uf2P5dNqQT7z(2daA*r zwdF^^dmse7UjVNn1ia%R;vEYS?`Vj4KZl6-Q;2v+YQUp47yZuSYUDy|E{=z{8a!Ha zabHIFYJH*cr8O7njjM(pt+}{=d$bz7E&}!{;5`-s-bTQiR}CJm;mF_kYVc?c{}u2a z3IPxG^lRBX`^^uM3(-S8Ee(Ml>goIt@K8@f!9zU_1rPN!6#h_8L!pOy8VbGnfVZ%k z{*teR<5pe`UYda6exL5udU_Db#V|393R3K)A$+%{y8z&~;VB_Gy0A=;=U^bE(BcK~ zp{9?~DvH@4{Q`kB;}X%wm~b%uk6a@9Q9z&em}>d78YMac8Oes^LOEgtlg|N_%rI0> zF&;Jjv{6`FPJe_x$|o3o&nQ70vOh}y3DIFS|4S|reUyJN{y(@x^kV|((^#LqMD$Go z^l5%wWdVRlwUz%jD*Z_V8W^)c8W`$bC}_s3=!+sHLtIM1^b_qp!LNrKj91l#9O>U7 zDu4C|=${Cnk8v)dzfv?juu$9t$pi}=5{!RbU#J@LkFiIhPk_^Zfd1D3^f4Ah^eJX{ z%1Rvg<`H!f2)c< z${+XkmkByu@vI9{J)4{d`>cunJ{5h`Pu%xo9h_giMdj{}V3g&un&^L_qL1rurKo`N zxf&G}(rBlgt3Qb@

KVpS>#j$UoWytb_cYg$vW|W92;9XHE3?sOaPRNHGcIf1Dub zb!jORUCI$782`If^iu)nUQq%0|3Jv+#~}2P9;TY;f2*R8_|ruNByGe3NH2Tk96u4P zrs;zO=YN-qKFXhB(a8T(qVgFPeKkG2SGN^RK7sTx23rplbl{tOl5ex0mO zw>I?godxw!ek#cJtJKn`lG@O350!$^?|3Is)8@6I-$94|sY^s3-zW^m|Mt7Id{aqn z_(y*{82zPFh?+L94gGK(`s1f+=~78;=tt<#&zwfow0Ujlr|8gcf47z{mDEHZ<12)V z^B2$Fu@2fd@*jS?#PrGjoDmHlyGPsv$!g*s<33ak`Nwwxh<+VW`N!#mq0MWe|FMcb z`sc->0@|Nhg52SI_373`f2WE*@{jRPtb_8uMpVAzJ}rGJsfqqaD*Cv8Zzn1s|EmO% znKOu*FDJT`BLqk(vL?(OsxsssZ+`TtoU^_VGcf@C$(|4>CA;{z0%MgHdtdN_^(~L4{r;{SG?x zn?B-4((j=*^l^O;#(#@P{Yd&f)P_E;@9Oa-`Lue>kEGv2ZRq3r9*lmQd444Q9%@4$ z*Y{xZ>F~H8Nxz5M(C+~?)%w{`#5X!W;YX4`5M9c#uqORP|3NJunqT3Iv3BrO6MZ~S zp_*tv@m)LGpOXLFdy3!snZE?5Wc^KXLOp+7+XeHDEZ&`T2xp?w%C=z{%P>!Z9D!~IFPux&i6 z`wcEL+y^Fv|wt(L_!e@Mk^9Q)FJXk{d*q^uI3WTG4+65NEGnT&@1V0Gs|FlRw zzQGtlcmufP*V$2P=mq$OBjLMB`Enh^Qp1|VGkq~j{=QbYOaLt+s)+c`yV32IJp5~{ zs7LtQ7lA;J^3hR=y99&E(x2*_EOCs1VHM_&p95#=%2+NA-w_ zkBy8BkBkg!H`MRxHq}#ChK>__(L{pZrhwm|hF@92cB3Psxma?6?a6Pn_4 z4!Jt!m70N1>@Fr{c6kU<20qhL@P8Q_-t2w zOEHSY3u3sx!Gx9$6Y<53JxWt8c0_2Q*MUv|{2DPJ5f$QxH>cZmtXb=>Uo~yd`2~iN zne%&X>NVq`cHIN{B&SltN&>W2j!Z(*0B?dqT|N<5Yd(kW{_^p?uQX46EY}rwdA`(? zM4~rD%GYN#Lqx6(G0lAhxeY4I(nc5O*Qy>j)Yks$#aFq5|Xt(ffL;^qe>>8r(qX85KJ2Jy#wn$@k~PM zAmcJB7mvOyR@`dk{l_}uYeC!%)^sF845&tovp2;h{UWMSN2mkGHH1Y0dZw5()WAq5 z*Oy_zfRQQGQOX4_GYkG`CjBY^#1c3DghYi^0!eql=WxR;8IN){)c@I6ZV14apSAc@ zPWY5pF`g9qf#vkL}2x)2gy$P4m>HV@VCufiAdf;^%2 zqip^vd?7E$lNf-%3|}~g$P@C0a{H^u3s~X$j^p_!jU&BJrkOqDInV?_-pJq9tVlR9 zCL#tT4G?#t+c`)F_{TQ~*o3e=%IZ$c>TV8N56}5-XP@52XXZ_xyy>L^H(3>OaWDeG z6Ydf;zqav`0BQucLjcr*!=lcj+$?g+>aZ!|R=c7Z=BM7N3mkPQb*CQiv%G&NSp-nq z;D-W2R=Y+I>&o=AZ9OyA7y|PT^xD5J>(MlNgGAG<#@(Zn@^zSF>@7W-j8z#f&e;+a zeOZN}iLgn5BGBD-pWf7Hb>yb>s(CXz9cBwVRaJGn%+S2$aKm9i)hcpYer8f@_luiA zeej5K&3wVp=q%XN0MTUWZVRwxt*1e!ZKL0^&+6On(f2%Y(^vPH6F3d77ku(Rc^LG! zWokVYUKAuXnsMmi=-wAM#QR^Wl8I)>`KDK@0tJ3Vw5pM5YXHOxfs?o6709F?+#VAW z6&eJRu8EoQK;F`!^|u;cKDK+_4VxOZTCmNuZ*skRGVWaa@^|L3=MJ8qG2*HGX4BI* z-Y}CLWUmfAxNV}h=hS=5b8V@n>mI!R+gk#-nij|vsskYrR|9I|YWY3CeELkzptQRm z?!3HnSkCn~4LLLVz;kmlX7t*3c>0joPum=Hv|M*)Sn9_74bRPb_T0N0N6edF@^EkS zEU91pwvF44J2PkUmzf_9&U*d5=1WF)IM(g`0Iq7Zyp2!)aIfvq9hpyldSS_~uUu#F z00fg}WYVBeJ&forVp$Wo;^1ly7jCR$;A#n%39cS+wSg-It`2bFHVQ|zJzNoRb%d)s zT;Xuxo*5kgFaIGixPb#6xaha-AUKUb8Rv0Ta1ef2fHZQ8I`cnGYOx?A$W%iiN9<~i ze{VF9020wjhFJy>cHub*A$p28udRE+fixXjwsv(he@NER-X+c#+90KQQO5 ztqH&P-B>a9q-W>I9|7by`uKctiMXTOpdzE@vMrPoca$TC>Xg1OIlS)kjniKL@2&^> zUp|6fSQ03eNh(~Ue2-<7Nhbt=rYX^HAJ~A3fM54%T4`npnta{RY*PSk5F|A<(a}VO z$D{$`#L!)8kZi4&ngw&$@BaL`C0UQnVINN1?L9{#AdicB$mgZ{x3&UxwYq2Q6TCnF zwtT&_31t5UFH%1I#t2F)-;fzm*HP}11uYX}@2KyAuAGP$Jo%#p5WuD6*PfqFP+e6U zf-cqJc_mSjb3cBOFQ~)$B_1KaJ@Ecg^Gj_2UE-Cv)X1CUtEz+i`SJL+kS~_w{r?Sq zRdk6*o}+y65=oJ-iWkl=)=w6)4!pnA`~rQFkHQzXBlINavh3^e2R|La`oyCt;2xf_ zA95lcyaf7-?J07Q=Us5!sORHX)KPec`igGQy&v66!7sfLq_KIufU$BR7!442aJmK& zfweY>701^%IHZ<&G;KBCYp za?0v3+O;hgMdVrDM<_GIjhb<63cs>KQXyQ*shk|Q>ja>N$Uk+ePnC@Scj(mqhYh?l zhS8!^roYojjg&k0w@|;8kI0>=w1`gi`5TN>rRWrk73%kQ=#*mpGX6&Dw{5Z9nWOiL zk;?c>sUIC~XuKa>T6EX{t^m|s{}EX0_5a=j<4;*C=cG@o_k8%kTl)P@%N%(>7`x)> z3iuSi{u~|J+K>ETZ`3OtlG5!u1}=2F-VK1dT}NQ8yFRrrYem>2jr&%Hg?}<&`?!|_ zyH4ILj}D2hht_js2Rjqkb6uz30LZ#MzXgE0Jx5@zd*1Thg`ST`PBlL;_eA^Qr>#Q* zdrkov9_94^f$z`+fLs~i3KRf&lNzl@z`umYMP3euRWa3-GwtUxQDhZ4`C88sYJ#9h zY*0?{b^@+pCmJxw@7DlPTDqqr$b;@+A=z3F*5G4j9gQA08&+?*K4FJ_$e6&vY6?Vo z!d;mEkEg#RAU}(o1jKfTf>!g$6}khxba7%*HSZisoTm1gVTifhPe__6PL*uZu(*mV^ zr4SQ;H%9&w5`ikN%dHXWb`tdi#axZnV6|HJV_t*g>sLfRYJ9C*`GNd~uQdr8xi6Q+D~AlFz< zef^VUfLau&cF5MB%m$A1|6(X~y_^LQ;uwa4fTW#aUBw8J=Xq8}Wb7o|Wak)jGE%b4 z+3EQ)v61mnJ>z@C^@vK2jgB)W#6`!XB*ezWMw*Rr2??hBn79N>WOPD&Y)=WUn8*T4 zTvU&qJrb;uMNtW{(LMQJ6T`n1oF51OqNCz^Af%t7qY;1I74F4xUY>$uu1z2eTHwanr!%O@M-sPeo5Rv95M|=b1AE<-(iWaDx zgs$Yji#w~xiG{lfW16@r6S>CO=qUiz8kW`qNvjt$lP=9d$M(N*wU8BAgX=`o)ko7< zJA;hp%MXi+fufly%Gv$mhPpuIG za=a-fKE?>XU~F_kG)=~s)xV*Pl~`j&z~WPWCLWLCfI+eM1Z&mNq48w<&w ztOC`;y$&X=-w}(>YcQ9{$@ill zOB^f8HQBX-YjUi22N2-VNkSs3%LGz0Jx9+j5H!AWs;JRaTD3EKZOHmSt zwWdgvDZfa!xxyeb;L9)CZAL<*JtXRzWa>(}c=Tn}?mDP%y5Wp4AoRa5_qt~!*ni!V z0_0XVyotbC2dctWrgv@s)DI~ywCdOH#xFK!#sd*dG#&mWKPsAdb*v$nzim!#fLu?rmq@#>(lQ(Gj&a$XEzWZ6nSVyd|~)I@GouF zIskWR_O1J;X+q+O!bWJsnGS5v5`Cb7daZ$6K=XzlY7r6@P8UeqL}g7@EJ~*ClKE$ZP%=K1BlC@=*W-ssT|}-m_`eE>X0f~x0967=i{+Q?~4$ z;--;6q`rH_LF@N~7?`&f6*db1xmf(Y@^sz4GlOBbs6kE5t}hqt3T%R&dkAWQTcy>6 z&{H79iJT}?Z{H?FO^#f{6{FAZV#7gEOEbz)p7dVhL$O5U7O=)u|)DqaLgdV*_>Tkl_hz2lfoQbvo!mQgtC|x)5@| zwH(|b>eO1-&s}WA2%#IbZt>8?w%F=oTNK7iiA<3)zAZS>X7!*5uA6GzBGjuaUvk+J zL9*7uxvbVL3RWqwRqGZ>7`3i=TJ-Ttkq5H_24g^fkXuY{IScxEVV@`tLUFP2^=g30 z9|_=QkyCU0Tfb*Sp;hG6^OfS6JuPnD(LsEW5FZjZZA7k}j~TjMNU~A)>a3?SYKVpzjYzKbRqb41WZ~EFhGbY5CVTySq5kzb(Fu6uC1f* zI49^*(|6rtbn9G4g}q4 zI0VvWk)xfL6WrY(ZUZM*9TqJb4??plDO$H$FTHBpw`KNjC8{kKIW0;Li)Z$Txaq4$ z1>i~eN(3e?&+BA>)+gM)ZCmdP0vOo%Q=*)$5I07VYw5QUYz2~-MH?ab7vv^iy zz60EP`lHrCB+CrzMGXxQyYR9A2DbmGC})p}n^*LxV0kwI)b{TU{c2^&$vT~1AS$ti z;%1Y`HJv{LfbjyT=^q65lJ@HZtCIHW17njT1Te5qj2+dlb}`|aI_xJwP}4mur#~2} z1%j^svwIVw`^z22R3=q(98;NudvQ!bmA1y?n16O}vh*|tTmJP=1Zt=4Kf5=SORcv= zf8OqmyLYgzEkQmZ)tc4+2X}8{M!lA5G=Urb_w2GIkH_XHc5DCM4fP1C myg8-Y!bg8wUK!r&?T@gxt+7y*#(fz-u-GetCharacterMovement()->MaxWalkSpeed = PlayerCharacter->WalkSpeed * AimingMoveSpeedScale; TargetFOV = CurrentGunBase->AimingFOV; + OnStartedADS.Broadcast(); } } @@ -274,6 +275,8 @@ void UShootingComponent::StopAiming() PlayerCharacter->GetCharacterMovement()->MaxWalkSpeed = PlayerCharacter->WalkSpeed; TargetFOV = DefaultFOV; + + OnStoppedADS.Broadcast(); } void UShootingComponent::Throw() diff --git a/Source/Exo/Private/Characters/ExoPlayerCharacter.cpp b/Source/Exo/Private/Characters/ExoPlayerCharacter.cpp index bb7019b..1b0e232 100644 --- a/Source/Exo/Private/Characters/ExoPlayerCharacter.cpp +++ b/Source/Exo/Private/Characters/ExoPlayerCharacter.cpp @@ -5,6 +5,7 @@ #include "Blueprint/UserWidget.h" #include "Characters/Components/ShootingComponent.h" +#include "Components/CapsuleComponent.h" #include "GameFramework/CharacterMovementComponent.h" #include "Items/AmmoBoxBase.h" #include "Items/HealthBoxBase.h" @@ -15,6 +16,24 @@ AExoPlayerCharacter::AExoPlayerCharacter() { + PrimaryActorTick.bCanEverTick = true; + + // Setup eye height values + StandingEyeHeight = 175.f; + CrouchedEyeHeight = 50.f; + LowEyeHeightOffset = -20.f; + + + CapsuleBottom = CreateDefaultSubobject(TEXT("CapsuleBottom")); + CapsuleBottom->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform); + CapsuleBottom->SetRelativeLocation(FVector(0, 0, -GetCapsuleComponent()->GetScaledCapsuleHalfHeight())); + + // Create camera component + CameraComponent = CreateDefaultSubobject(TEXT("CameraComponent")); + CameraComponent->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform); + CameraComponent->bUsePawnControlRotation = true; + + GetCharacterMovement()->bSnapToPlaneAtStart = true; InteractionComponent = CreateDefaultSubobject(TEXT("Interaction Component")); @@ -30,21 +49,18 @@ AExoPlayerCharacter::AExoPlayerCharacter() //bUseControllerRotationPitch = false; //bUseControllerRotationYaw = true; //bUseControllerRotationRoll = false; - - // Setup camera component - CameraComponent = CreateDefaultSubobject(TEXT("CameraComponent")); - CameraComponent->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform); - CameraComponent->bUsePawnControlRotation = true; - CameraComponent->SetRelativeLocation(FVector(0.0f, 0.0f, BaseEyeHeight)); } void AExoPlayerCharacter::BeginPlay() { Super::BeginPlay(); + // Set correct starting camera height + SetTargetEyeHeight(StandingEyeHeight); + CameraComponent->SetRelativeLocation(FVector(0.0f, 0.0f, FromFeet(TargetEyeHeight))); + GetCapsuleComponent()->OnComponentBeginOverlap.AddDynamic(this, &AExoPlayerCharacter::OnActorBeginOverlap); //UGameplayStatics::GetPlayerCameraManager(GetWorld(), 0)->SetViewTarget(this); - StandingEyeHeight = CameraComponent->GetRelativeLocation().Z; PlayerHud = CreateWidget(GetWorld(),PlayerHudClass); @@ -64,8 +80,80 @@ void AExoPlayerCharacter::BeginPlay() } } +void AExoPlayerCharacter::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + //// NOT FINAL SOLUTION /// + /** Reset camera offset at the start of every frame */ + //TargetEyeLocationOffset = FVector::ZeroVector; + //TargetEyeRoll = 0.f; + ////////////////////////// + + UpdateCameraHeight(DeltaTime); + //ApplyCameraOffset(DeltaTime); +} + +float AExoPlayerCharacter::GetFootOffset() +{ + return -GetCapsuleComponent()->GetScaledCapsuleHalfHeight(); +} + +void AExoPlayerCharacter::UpdateCameraHeight(float DeltaTime) +{ + if (FMath::IsNearlyEqual(GetCurrentEyeHeight(), TargetEyeHeight, 0.01f)) + { + return; + } + + const float NewHeight = FMath::Lerp(GetCurrentEyeHeight(), TargetEyeHeight, DeltaTime*5); + const FVector CamRelXY = CameraComponent->GetRelativeLocation(); + CameraComponent->SetRelativeLocation(FVector(CamRelXY.X, CamRelXY.Y, + GetFootOffset() + NewHeight)); +} + +void AExoPlayerCharacter::ApplyCameraOffset(float DeltaTime) +{ + bool HasChanged = false; + //FVector NewOffset = EyeLocationOffset; + //FVector NoOffsetCameraPosition = CameraComponent->GetRelativeLocation() - EyeLocationOffset; + + if (!FVector::PointsAreNear(EyeLocationOffset, TargetEyeLocationOffset, 0.01f)) + { + // Smoothly offset view + EyeLocationOffset = FMath::Lerp(EyeLocationOffset, TargetEyeLocationOffset, 5*DeltaTime); + HasChanged = true; + } + + if (!FMath::IsNearlyEqual(EyeRoll, TargetEyeRoll, 0.01f)) + { + // Smoothly rotate view + EyeRoll = FMath::Lerp(EyeRoll, TargetEyeRoll, DeltaTime); + HasChanged = true; + } + + if (!HasChanged) + { + // Do not calculate anything if nothing changed + return; + } + + // Update actual camera position + //FVector BaseLocation = FVector(0, 0, GetCurrentEyeHeightBase(true)); + //CameraComponent->SetRelativeLocation(NoOffsetCameraPosition + NewOffset); + //FVector CapsuleRelativeOffset = BaseLocation + EyeLocationOffset; + //CapsuleRelativeOffset.Z += GetCurrentEyeHeightBase(true); + CameraComponent->SetRelativeLocation(EyeLocationOffset); + + UE_LOG(LogTemp, Log, TEXT("Camera relative: %s"), *CameraComponent->GetRelativeLocation().ToString()); + // Update actual camera rotation (Roll) + FRotator NewRotator = GetController()->GetControlRotation(); + NewRotator.Roll = EyeRoll; + GetController()->SetControlRotation(NewRotator); +} + void AExoPlayerCharacter::OnActorBeginOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, - int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) + int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) { if (OtherActor && OtherActor != this) { @@ -96,6 +184,30 @@ void AExoPlayerCharacter::OnActorBeginOverlap(UPrimitiveComponent* OverlappedCom } } +void AExoPlayerCharacter::CrouchCustom() +{ + SetTargetEyeHeight(CrouchedEyeHeight); + GetCharacterMovement()->MaxWalkSpeed = CrouchSpeed; + + float CurrentCamHeight = GetCurrentEyeHeight(); + GetCapsuleComponent()->SetCapsuleHalfHeight(44.f); + CameraComponent->SetRelativeLocation( + FVector(0, 0, GetFootOffset()) + + FVector(0, 0, CurrentCamHeight)); +} + +void AExoPlayerCharacter::UnCrouchCustom() +{ + SetTargetEyeHeight(StandingEyeHeight); + GetCharacterMovement()->MaxWalkSpeed = WalkSpeed; + + float CurrentCamHeight = GetCurrentEyeHeight(); + GetCapsuleComponent()->SetCapsuleHalfHeight(88.f); + CameraComponent->SetRelativeLocation( + FVector(0, 0, GetFootOffset()) + + FVector(0, 0, CurrentCamHeight)); +} + void AExoPlayerCharacter::AddHealthPoints(float addValue) { CurrentHealth += addValue; @@ -105,4 +217,79 @@ void AExoPlayerCharacter::AddHealthPoints(float addValue) if (PlayerHud) PlayerHud->SetHp(CurrentHealth,MaxHealth); -} \ No newline at end of file +} + +float AExoPlayerCharacter::ToFeet(float value) +{ + return value + GetCapsuleComponent()->GetScaledCapsuleHalfHeight(); +} + +float AExoPlayerCharacter::FromFeet(float value) +{ + return value - GetCapsuleComponent()->GetScaledCapsuleHalfHeight(); +} + +/*float AExoPlayerCharacter::GetCurrentEyeHeightBase(const bool bCapsuleRelative) +{ + if (bIsCrouched) + { + return GetCrouchingEyeHeight(bCapsuleRelative); + } + + return GetStandingEyeHeight(bCapsuleRelative); +}*/ + +float AExoPlayerCharacter::GetStandingEyeHeight(const bool bCapsuleRelative) const +{ + return bCapsuleRelative ? StandingEyeHeight - GetCapsuleComponent()->GetScaledCapsuleHalfHeight() + : StandingEyeHeight; +} + +float AExoPlayerCharacter::GetCrouchingEyeHeight(const bool bCapsuleRelative) const +{ + return bCapsuleRelative ? CrouchedEyeHeight - GetCapsuleComponent()->GetScaledCapsuleHalfHeight() + : CrouchedEyeHeight; +} + + +void AExoPlayerCharacter::SetEyePositionOffsetTarget(const FVector LocationOffset) +{ + //LocationOffset.Z = FMath::Clamp(LocationOffset.Z, CoverEyeHeight, StandingEyeHeight); + UE_LOG(LogTemp, Log, TEXT("Eye offset set to: %s"), *LocationOffset.ToString()); + TargetEyeLocationOffset = LocationOffset; +} + +void AExoPlayerCharacter::SetEyeRoll(float RollValue) +{ + TargetEyeRoll = RollValue; +} + +FVector AExoPlayerCharacter::GetPlayerLocationAtFeet() const +{ + FVector ReturnVector = GetActorLocation(); + ReturnVector.Z -= GetCapsuleComponent()->GetScaledCapsuleHalfHeight(); + return ReturnVector; +} + +void AExoPlayerCharacter::SetTargetEyeHeight(float NewEyeHeight, const bool bCapsuleRelative) +{ + if (bCapsuleRelative) + { + NewEyeHeight += GetCapsuleComponent()->GetScaledCapsuleHalfHeight(); + } + UE_LOG(LogTemp, Log, TEXT("Target eye height set to: %f"), NewEyeHeight); + TargetEyeHeight = FMath::Clamp(NewEyeHeight, + CrouchedEyeHeight + LowEyeHeightOffset, StandingEyeHeight + ); +} + +float AExoPlayerCharacter::GetCurrentEyeHeight(const bool bCapsuleRelative) +{ + float ReturnValue = CameraComponent->GetRelativeLocation().Z; + if (!bCapsuleRelative) + { + ReturnValue += GetCapsuleComponent()->GetScaledCapsuleHalfHeight(); + } + + return ReturnValue; +} diff --git a/Source/Exo/Private/Player/ExoPlayerController.cpp b/Source/Exo/Private/Player/ExoPlayerController.cpp index a9b24a0..5a8c7cd 100644 --- a/Source/Exo/Private/Player/ExoPlayerController.cpp +++ b/Source/Exo/Private/Player/ExoPlayerController.cpp @@ -5,9 +5,9 @@ #include "EnhancedInputComponent.h" #include "EnhancedInputSubsystems.h" #include "Characters/ExoPlayerCharacter.h" +#include "Components/CapsuleComponent.h" #include "GameFramework/Character.h" #include "GameFramework/CharacterMovementComponent.h" -#include "Kismet/GameplayStatics.h" AExoPlayerController::AExoPlayerController() { @@ -28,34 +28,43 @@ void AExoPlayerController::BeginPlay() { Subsystem->AddMappingContext(InputContext, 0); } - - //InteractionComponent = PlayerCharacter->FindComponentByClass(); - //ShootingComponent = PlayerCharacter->FindComponentByClass(); + InteractionComponent = PlayerCharacter->InteractionComponent; ShootingComponent = PlayerCharacter->ShootingComponent; // Ustawianie w komponencie poruszania pr�dko�ci zapisanej w characterze PlayerCharacter->GetCharacterMovement()->MaxWalkSpeed = PlayerCharacter->WalkSpeed; - - // Oblicz prawidłową maksymalną wysokość na którą można wychylić się z nad osłony - - UE_LOG(LogTemp, Display, TEXT("MaxCoverAimHeight: %f"), MaxCoverAimHeight); } void AExoPlayerController::PlayerTick(float DeltaTime) { Super::PlayerTick(DeltaTime); - // TESTING - if (bIsInCover) - { - AdjustCameraWhileInCover(); - } - UpdateCoverStandHeight(DeltaTime); + if (PlayerCharacter->bIsInCover) + { + //PlayerCharacter->SetEyePositionOffsetTarget( + // FVector(0, 0, PlayerCharacter->LowEyeHeightOffset) + // ); + if (PlayerCharacter->bIsAimingMode) + { + CoverAimHeightOffset = CalculateCoverAimOffset(); + PlayerCharacter->SetEyePositionOffsetTarget( + FVector(0.f, 0.f, CoverAimHeightOffset)); + } + } + //else + //{ + // PlayerCharacter->SetEyePositionOffsetTarget(FVector::ZeroVector); + //} + + // On screen cover state DEBUG if (bShowCoverSystemDebug) { - GEngine->AddOnScreenDebugMessage(2, -1, FColor::Red, FString::Printf(TEXT("In cover: %s"), bIsInCover ? "true" : "false")); + GEngine->AddOnScreenDebugMessage(2, -1, FColor::Red, + FString::Printf(TEXT("In cover: %hs"), + PlayerCharacter->bIsInCover ? "true" : "false") + ); } } @@ -155,18 +164,21 @@ void AExoPlayerController::PlayerStartCrouch() if (bIsSprinting) { PlayerCharacter->GetCharacterMovement()->MaxWalkSpeedCrouched = PlayerCharacter->SlideSpeed; + PlayerCharacter->SetTargetEyeHeight(PlayerCharacter->LowEyeHeightOffset); GetWorldTimerManager().SetTimer(SlideCooldownTimer, this, &AExoPlayerController::ResetSlide, PlayerCharacter->SlideCooldown, false); } - PlayerCharacter->Crouch(); - PlayerCharacter->CameraComponent->SetRelativeLocation(FVector( - 0.0f, - 0.0f, - PlayerCharacter->CrouchedEyeHeight) - ); + //PlayerCharacter->Crouch(); + PlayerCharacter->CrouchCustom(); + //PlayerCharacter->SetTargetEyeHeight(PlayerCharacter->CrouchedEyeHeight); + // PlayerCharacter->CameraComponent->SetRelativeLocation(FVector( + // 0.0f, + // 0.0f, + // PlayerCharacter->CrouchedEyeHeight) + // ); // Start checking for cover - bIsInCover = CheckForCover(); + PlayerCharacter->bIsInCover = CheckForCover(); GetWorld()->GetTimerManager().SetTimer( CoverCheckTimer, this, @@ -178,22 +190,25 @@ void AExoPlayerController::PlayerStartCrouch() void AExoPlayerController::PlayerStopCrouch() { - PlayerCharacter->UnCrouch(); - PlayerCharacter->CameraComponent->SetRelativeLocation(FVector( - 0.0f, - 0.0f, - PlayerCharacter->BaseEyeHeight) - ); + //PlayerCharacter->UnCrouch(); + PlayerCharacter->UnCrouchCustom(); + //PlayerCharacter->SetTargetEyeHeight(PlayerCharacter->GetStandingEyeHeight()); + // PlayerCharacter->CameraComponent->SetRelativeLocation(FVector( + // 0.0f, + // 0.0f, + // PlayerCharacter->BaseEyeHeight) + // ); // Stop checking for cover GetWorld()->GetTimerManager().ClearTimer(CoverCheckTimer); - bIsInCover = false; + PlayerCharacter->bIsInCover = false; TargetCoverStandAlpha = 0.0f; } void AExoPlayerController::ResetSlide() { PlayerCharacter->GetCharacterMovement()->MaxWalkSpeedCrouched = PlayerCharacter->CrouchSpeed; + PlayerCharacter->SetTargetEyeHeight(PlayerCharacter->CrouchedEyeHeight); } void AExoPlayerController::PlayerStartSprint() @@ -236,6 +251,10 @@ void AExoPlayerController::PlayerStartAim() void AExoPlayerController::PlayerStopAim() { ShootingComponent->StopAiming(); + if (PlayerCharacter->bIsInCover) + { + CalculateCoverAimOffset(); + } } void AExoPlayerController::PlayerMeleAttack() @@ -276,7 +295,10 @@ bool AExoPlayerController::CheckForCover() // Do a simple 8-directional line trace FVector TraceDirection = PlayerCharacter->GetActorForwardVector(); FVector TraceStart = PlayerCharacter->GetActorLocation(); - TraceStart.Z -= PlayerCharacter->GetCapsuleComponent()->GetScaledCapsuleHalfHeight() - CoverObstacleMinHeight; + TraceStart.Z += bUseEyeHeight ? + PlayerCharacter->GetCrouchingEyeHeight(true) + : + PlayerCharacter->GetPlayerLocationAtFeet().Z + CoverObstacleMinHeight; FCollisionQueryParams QueryParams; QueryParams.AddIgnoredActor(PlayerCharacter); @@ -306,11 +328,9 @@ bool AExoPlayerController::CheckForCover() // Check if this particular hit isn't against a wall (>CoverMaxHeight) FHitResult SphereHit; - FVector SpherePosition = Hit.ImpactPoint + - FVector( - 0.0f, 0.0f, - CoverObstacleMaxHeight + CoverAimWindowRadius - CoverObstacleMinHeight); - + FVector SpherePosition = Hit.ImpactPoint; + SpherePosition.Z = PlayerCharacter->GetPlayerLocationAtFeet().Z + CoverObstacleMaxHeight + CoverAimWindowRadius; + GetWorld()->SweepSingleByChannel( SphereHit, SpherePosition, @@ -342,20 +362,27 @@ bool AExoPlayerController::CheckForCover() return ValidHits.Num() > 0; } -void AExoPlayerController::AdjustCameraWhileInCover() +float AExoPlayerController::CalculateCoverAimOffset() { - if (!bIsInCover) + // Nic nie rób jak nie znajdujesz się za osłoną + if (!PlayerCharacter->bIsInCover) { - return; + return 0.f; } - MaxCoverAimHeight = PlayerCharacter->StandingEyeHeight * CoverAimStandFactor; + // Oblicz maksymalną wysokość na którą można wychylić się z nad osłony + MaxCoverAimHeightOffset = PlayerCharacter->GetStandingEyeHeight() * CoverAimStandFactor; - //FVector StartOffset = GetCharacter()->GetActorForwardVector() * 20.0f; FVector ObstacleTraceStart = GetCharacter()->GetActorLocation(); - ObstacleTraceStart.Z += GetCharacter()->CrouchedEyeHeight; + ObstacleTraceStart.Z += + bUseEyeHeight ? + PlayerCharacter->GetCurrentEyeHeight(true) + : + PlayerCharacter->CrouchedEyeHeight - GetCharacter()->GetCapsuleComponent()->GetScaledCapsuleHalfHeight(); + FVector ObstacleTraceEnd = ObstacleTraceStart + PlayerCameraManager->GetCameraRotation().Vector() * CoverAimFreeDistance; + FCollisionQueryParams QueryParams; QueryParams.AddIgnoredActor(PlayerCharacter); TEnumAsByte ObstacleTraceChannel = ECC_WorldStatic; @@ -363,138 +390,97 @@ void AExoPlayerController::AdjustCameraWhileInCover() FHitResult Hit; bool bFreeSpace = false; - // Trace until no hit is found (free space to aim) - for (int i = 0; i < MaxCoverAimHeight; i += 2*CoverAimWindowRadius) + // SphereTrace until no hit is found (free space to aim) + // for (int i = 0; i < MaxCoverAimHeight; i += CoverAimWindowRadius) + // { + // ObstacleTraceStart.Z += i; + // ObstacleTraceEnd.Z += i; + // + // GetWorld()->SweepSingleByChannel( + // Hit, + // ObstacleTraceStart, + // ObstacleTraceEnd, + // FQuat::Identity, + // ObstacleTraceChannel, + // FCollisionShape::MakeSphere(CoverAimWindowRadius), + // QueryParams + // ); + // + // if (bShowCoverSystemDebug) + // { + // DrawDebugSphere(GetWorld(), Hit.Location, CoverAimWindowRadius, 8, + // Hit.bBlockingHit ? FColor::Blue : FColor::Red, + // false, 0.0f, 0, 0); + // } + // + // if (Hit.bBlockingHit == false) + // { + // UE_LOG(LogTemp, Display, TEXT("Free space")); + // bFreeSpace = true; + // break; + // } + // } + + + float SafeCoverAimZOffset = 0.f; + while (SafeCoverAimZOffset < MaxCoverAimHeightOffset) { - ObstacleTraceStart.Z += i; - ObstacleTraceEnd.Z += i; + ObstacleTraceStart.Z += SafeCoverAimZOffset; + ObstacleTraceEnd.Z += SafeCoverAimZOffset; GetWorld()->SweepSingleByChannel( - Hit, - ObstacleTraceStart, - ObstacleTraceEnd, - FQuat::Identity, - ObstacleTraceChannel, - FCollisionShape::MakeSphere(CoverAimWindowRadius), - QueryParams - ); + Hit, + ObstacleTraceStart, + ObstacleTraceEnd, + FQuat::Identity, + ObstacleTraceChannel, + FCollisionShape::MakeSphere(CoverAimWindowRadius), + QueryParams + ); - if (bShowCoverSystemDebug) + if (Hit.bBlockingHit == true) { - DrawDebugSphere(GetWorld(), Hit.Location, CoverAimWindowRadius, 8, - Hit.bBlockingHit ? FColor::Blue : FColor::Red, - false, 0.0f, 0, 0); + // Increment check height every failed iteration + SafeCoverAimZOffset += 0.2f; } - - if (Hit.bBlockingHit == false) + else { - UE_LOG(LogTemp, Display, TEXT("Free space")); - bFreeSpace = true; + // Break the loop if free space found break; } } - - if (bFreeSpace) + + // If this is true that means that free space was found + if (SafeCoverAimZOffset <= MaxCoverAimHeightOffset) { - TargetCoverStandAlpha = FMath::GetMappedRangeValueClamped( - UE::Math::TVector2(GetCharacter()->CrouchedEyeHeight, GetCharacter()->CrouchedEyeHeight + MaxCoverAimHeight), - UE::Math::TVector2(0.0f, 1.0f), - Hit.TraceStart.Z - ); + //// DEBUG //// if (bShowCoverSystemDebug) { - DrawDebugLine(GetWorld(), Hit.TraceStart, Hit.TraceEnd, FColor::Red); + DrawDebugLine(GetWorld(), Hit.TraceStart, Hit.TraceEnd, FColor::Purple); } + ////////////// + + return SafeCoverAimZOffset;// + + //PlayerCharacter->CrouchedEyeHeight - PlayerCharacter->GetCurrentEyeHeight(); } - - - // IDEA FOR A MORE COMPLEX SYSTEM IN THE FUTURE: - //vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - // To not introduce accidental flickering and optimize it a bit, all of this should run - // ONLY on cover update - - // FVector CrouchedEyeWorldPosition = PlayerCharacter->GetActorLocation(); - // CrouchedEyeWorldPosition.Z += PlayerCharacter->CrouchedEyeHeight; - // FVector CoverCeiling = CrouchedEyeWorldPosition + MaxCoverAimHeight; - // float PlayerCapsuleRadius = PlayerCharacter->GetCapsuleComponent()->GetScaledCapsuleHalfHeight(); - // TEnumAsByte ObstacleTraceChannel = ECC_WorldStatic; - // FCollisionQueryParams QueryParams; - // QueryParams.AddIgnoredActor(PlayerCharacter); - // - // // Shoot ray up at maximum cover length to determine how high the player can "stand up" - // FHitResult WallTopHit; - // GetWorld()->SweepSingleByChannel( - // WallTopHit, - // CrouchedEyeWorldPosition, - // CoverCeiling, - // FQuat::Identity, - // ObstacleTraceChannel, - // FCollisionShape::MakeSphere(PlayerCapsuleRadius), - // QueryParams - // ); - // - // FVector CeilingWorldLocation; - // if (WallTopHit.bBlockingHit == true) - // { - // CeilingWorldLocation = WallTopHit.Location; - // } - // else - // { - // CeilingWorldLocation = WallTopHit.TraceEnd; - // } - // - // // From hit location (or if no hit - from end position) shoot ray towards camera's forward - // // vector at minimum cover length - // - // constexpr float WallFinderDistance = 75.0f; - // FVector WallFinderDirection = PlayerCharacter->GetActorForwardVector(); - // WallFinderDirection.Z = 0.0f; // Not needed if the player always stays upright - // - // GetWorld()->LineTraceSingleByChannel( - // WallTopHit, - // CeilingWorldLocation, - // CeilingWorldLocation + (WallFinderDirection * WallFinderDistance), - // ObstacleTraceChannel, - // QueryParams - // ); - // - // // regardless of the hit result shoot multi-ray downwards from end location - // // with maximum cover length - // - // FVector WallTopTraceStart = WallTopHit.bBlockingHit ? WallTopHit.Location : WallTopHit.TraceEnd; - // TArray ValidHitsCandidateArray; - // - // GetWorld()->LineTraceMultiByChannel( - // ValidHitsCandidateArray, - // WallTopTraceStart, - // WallTopTraceStart + (FVector(0.0f, 0.0f, 0.0f) * MaxCoverAimHeight), - // ObstacleTraceChannel, - // QueryParams - // ); - - // On every ray hit trace an in-place sphere to determine if the aiming spot is valid - - // All valid aiming spots are collected and the lowest (smallest Z) is chosen - - // Sphere trace from camera forward a certain distance to regulate camera position while - // aiming up and down // TODO: elaborate + // Return 0 offset if no free space to aim was found + return 0.f; } -void AExoPlayerController::UpdateCoverStandHeight(float DeltaTime) +void AExoPlayerController::UpdateSmoothCoverCamera(float DeltaTime) { - // if (FMath::IsNearlyEqual(CoverStandAlpha, TargetCoverStandAlpha, 0.01f)) - // { - // return; - // } + if (FMath::IsNearlyEqual(CoverStandAlpha, TargetCoverStandAlpha, 0.01f)) + { + return; + } CoverStandAlpha = FMath::Lerp(CoverStandAlpha, TargetCoverStandAlpha, DeltaTime * 5.0f); - //CoverStandAlpha = TargetCoverStandAlpha; // BANDAID SOLUTION const float NewZ = FMath::Lerp( - PlayerCharacter->CrouchedEyeHeight, - PlayerCharacter->StandingEyeHeight, + PlayerCharacter->GetCrouchingEyeHeight(), + PlayerCharacter->GetStandingEyeHeight(), CoverStandAlpha ); @@ -502,6 +488,7 @@ void AExoPlayerController::UpdateCoverStandHeight(float DeltaTime) FVector(0.0f, 0.0f, NewZ) ); + // DEBUG if (bShowCoverSystemDebug && GEngine) { GEngine->AddOnScreenDebugMessage(1, -1, FColor::Red, FString::Printf(TEXT("Current cover stand alpha: %f"), CoverStandAlpha)); @@ -510,11 +497,11 @@ void AExoPlayerController::UpdateCoverStandHeight(float DeltaTime) void AExoPlayerController::OnCoverTimer() { - bIsInCover = CheckForCover(); - if (bIsInCover == false) + PlayerCharacter->bIsInCover = CheckForCover(); + if (PlayerCharacter->bIsInCover == false) { TargetCoverStandAlpha = 0.0f; - UpdateCoverStandHeight(GetWorld()->GetDeltaSeconds()); + UpdateSmoothCoverCamera(GetWorld()->GetDeltaSeconds()); } } diff --git a/Source/Exo/Public/Characters/Components/ShootingComponent.h b/Source/Exo/Public/Characters/Components/ShootingComponent.h index 1c41581..717dfdb 100644 --- a/Source/Exo/Public/Characters/Components/ShootingComponent.h +++ b/Source/Exo/Public/Characters/Components/ShootingComponent.h @@ -99,6 +99,10 @@ public: AGunBase* SecondaryGunBase = nullptr; UStaticMeshComponent* SecondaryGunMesh = nullptr; + DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnADSEventSignature); + FOnADSEventSignature OnStartedADS; + FOnADSEventSignature OnStoppedADS; + private: void ResetFireCooldown(); void ReloadCompleted(); diff --git a/Source/Exo/Public/Characters/ExoPlayerCharacter.h b/Source/Exo/Public/Characters/ExoPlayerCharacter.h index d1e7ffa..02a4a0e 100644 --- a/Source/Exo/Public/Characters/ExoPlayerCharacter.h +++ b/Source/Exo/Public/Characters/ExoPlayerCharacter.h @@ -5,7 +5,6 @@ #include "CoreMinimal.h" #include "Camera/CameraComponent.h" #include "Characters/ExoCharacterBase.h" -#include "Components/CapsuleComponent.h" #include "ExoPlayerCharacter.generated.h" class UInteractionComponent; @@ -32,8 +31,8 @@ public: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Camera") TObjectPtr CameraComponent; - UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Camera") - float StandingEyeHeight; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly) + TObjectPtr CapsuleBottom; UPROPERTY(EditAnywhere, Category = "Dodge Properties") float DodgeForce = 5000.f; @@ -70,13 +69,94 @@ public: int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult ); + UFUNCTION(BlueprintCallable, Category = "Movement") + void CrouchCustom(); + + UFUNCTION(BlueprintCallable, Category = "Movement") + void UnCrouchCustom(); + + DECLARE_MULTICAST_DELEGATE(FOnPlayerCrouchEvent); + FOnPlayerCrouchEvent OnPlayerCrouchStart; + FOnPlayerCrouchEvent OnPlayerCrouchStop; + UFUNCTION() void AddHealthPoints(float addValue); + /** Przekształca wartość relatywną do pozycji środka kapsuły gracza + * na wartość relatywną do pozycji stóp gracza */ + UFUNCTION(BlueprintPure) + float ToFeet(float Value); + + /** Przekształca wartość relatywną do pozycji stóp kapsuły gracza + * na wartość relatywną do pozycji kapsuły gracza */ + UFUNCTION(BlueprintPure) + float FromFeet(float Value); + + UFUNCTION(BlueprintCallable, Category="Camera") + void SetEyePositionOffsetTarget(FVector LocationOffset); + + UFUNCTION(BlueprintCallable, Category="Camera") + void SetEyeRoll(float RollValue); + + UFUNCTION(BlueprintCallable) + FVector GetPlayerLocationAtFeet() const; + + UFUNCTION(BlueprintCallable, Category="Camera") + void SetTargetEyeHeight(float NewEyeHeight, const bool bCapsuleRelative = false); + + UFUNCTION(BlueprintCallable, Category="Camera") + float GetCurrentEyeHeight(const bool bCapsuleRelative = false); + + //UFUNCTION(BlueprintCallable, Category="Camera") + //float GetCurrentEyeHeightBase(const bool bCapsuleRelative = false); + + UFUNCTION(BlueprintPure, Category="Camera") + float GetStandingEyeHeight(const bool bCapsuleRelative = false) const; + + UFUNCTION(BlueprintPure, Category="Camera") + float GetCrouchingEyeHeight(const bool bCapsuleRelative = false) const; + + /** Czy postać gracza jest obecnie schowana za osłoną */ + UPROPERTY(BlueprintReadOnly, Category = "Cover System") + bool bIsInCover = false; + + /** Offset kamery podczas leżenia (osłona, ślizg)
+ * Bezpiecznie będzie założyć że to najniżej jak kamera + * może zejść podczas gameplaya + */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Camera") + float LowEyeHeightOffset; + + protected: virtual void BeginPlay() override; + + virtual void Tick(float DeltaTime) override; float MaxHealth = 100.0f; UWBP_PlayerUI* PlayerHud; + + /** Wysokość kamery podczas kucania jest dostarczana przez Character.h*/ + /** Wysokość kamery podczas stania
+ * Też najwyższa wysokość na którą kamera może się wznieść + * podczas gameplaya + */ + UPROPERTY(EditAnywhere, Category="Camera") + float StandingEyeHeight; + + UFUNCTION(BlueprintCallable) + float GetFootOffset(); + + +private: + FVector TargetEyeLocationOffset; + FVector EyeLocationOffset; + float TargetEyeRoll; + float EyeRoll; + + float TargetEyeHeight; + + void UpdateCameraHeight(float DeltaTime); + void ApplyCameraOffset(float DeltaTime); }; diff --git a/Source/Exo/Public/Player/ExoPlayerController.h b/Source/Exo/Public/Player/ExoPlayerController.h index 159fc63..017f0fb 100644 --- a/Source/Exo/Public/Player/ExoPlayerController.h +++ b/Source/Exo/Public/Player/ExoPlayerController.h @@ -96,16 +96,14 @@ protected: bool CheckForCover(); UFUNCTION(BlueprintCallable, Category = "Cover System") - void AdjustCameraWhileInCover(); + float CalculateCoverAimOffset(); UFUNCTION(BlueprintCallable, Category = "Cover System") - void UpdateCoverStandHeight(float DeltaTime); + void UpdateSmoothCoverCamera(float DeltaTime); void OnCoverTimer(); - float MapAlphaToCoverStandHeight(float Alpha); - - // DEBUG + // Cover System DEBUG UFUNCTION(Exec, Category = "Cover System") void DebugCoverSystem(bool show); bool bShowCoverSystemDebug = false; @@ -176,11 +174,7 @@ protected: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Character") TObjectPtr PlayerCharacter; - - // Czy postać gracza jest obecnie schowana za osłoną - UPROPERTY(EditAnywhere, Category = "Cover System") - bool bIsInCover = false; - + /** Alpha wysokości kamery podczas wychulania zza osłony * 0 - Wysokość kucania * 1 - Maksymalna wysokość wychylenia określona przez CoverAimStandFactor @@ -188,32 +182,40 @@ protected: UPROPERTY(EditAnywhere, Category = "Cover System") float TargetCoverStandAlpha = 0.0f; - // Częstotliwość okresowego szukania osłon podczas kucania + /** Częstotliwość okresowego szukania osłon podczas kucania */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cover System") float CoverCheckRate = 0.5f; - // Dystans na którym postać jest w stanie odnaleźć osłonę + /** Dystans na którym postać jest w stanie odnaleźć osłonę */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cover System") float MaxDistanceFromCover = 50.0f; - // Minimalna wysokość przeszkody którą można określić osłoną - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cover System") + /** Używa wysokości oczu do określenia minimalnej wysokości przeszkody + * którą można określić osłoną + */ + UPROPERTY(EditAnywhere, Category = "Cover System") + bool bUseEyeHeight = true; + + /** Minimalna wysokość przeszkody którą można określić osłoną */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cover System", + meta = (EditCondition = "!UseEyeHeight")) float CoverObstacleMinHeight = 75.0f; - // Maksymalna wysokość przeszkody którą można określić osłoną + /** Maksymalna wysokość przeszkody którą można określić osłoną */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cover System") float CoverObstacleMaxHeight = 125.0f; - // Promień wolnej przestrzeni przez którą można się wychylić + /** Promień wolnej przestrzeni przez którą można się wychylić */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cover System") float CoverAimWindowRadius = 2.0f; - // Dystans od kamery po wychyleniu który musi być wolny by dało się wychylić + /** Dystans od kamery po wychyleniu który musi być wolny by dało się wychylić */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cover System") float CoverAimFreeDistance = 150.0f; /** Określa na jaki procent "Stania" postać może się podnieść podczas celowania - * zza osłony. 0 -> Nie podniesie się wogóle (jakby wychylanie się było wyłączone) + * zza osłony.
+ * 0 -> Nie podniesie się wogóle (jakby wychylanie się było wyłączone)
* 1 -> Postać jest w stanie się podnieść do pełnej wysokości, tak jakby normalnie stała **/ UPROPERTY(EditAnywhere, @@ -229,10 +231,18 @@ protected: private: UInteractionComponent* InteractionComponent; - + UShootingComponent* ShootingComponent; - float CoverStandAlpha = 0.0f; + + + float CoverStandAlpha = 0.0f; // deprecated FTimerHandle CoverCheckTimer; - float MaxCoverAimHeight; + float MaxCoverAimHeightOffset; + float CoverAimHeightOffset; + + + + //FTransform TargetCameraOffset; + //FTransform CameraOffset; };