From be895b0021c736c90393279de7360d5822fa56e8 Mon Sep 17 00:00:00 2001 From: Franklin Date: Mon, 20 Nov 2023 11:22:56 -0400 Subject: [PATCH] Modular weapons --- Cargo.lock | 10 -- Cargo.toml | 2 +- assets/attachments/aimpoint_t1.glb | Bin 1482192 -> 1482124 bytes assets/attachments/ak105_magazine.glb | Bin 1656840 -> 1656768 bytes assets/attachments/first_compensator.glb | Bin 2762600 -> 2762528 bytes assets/attachments/pk5_foregrip.glb | Bin 1221868 -> 1221796 bytes assets/attachments/tan_magpull_stock.glb | Bin 1405288 -> 1405216 bytes assets/character/main_character.glb | Bin 49370340 -> 49370340 bytes assets/weapons/ak105_rifle.glb | Bin 8226572 -> 8226624 bytes src/comps/core/events/pickup_item.rs | 8 +- src/comps/core/inventory/player_inventory.rs | 2 + src/comps/core/items/guns/ak105.rs | 87 +++++++++++++- src/comps/core/items/guns/glock17.rs | 85 +++++++++++++- src/comps/core/items/item.rs | 5 +- src/comps/core/markers/proxy/plugin.rs | 6 +- .../core/markers/proxy/weapons/firearm.rs | 111 +++++++++++++++++- src/comps/core/spawners/item.rs | 1 + src/comps/core/weapons/attachment_slot.rs | 9 ++ .../core/weapons/attachments/compensator.rs | 4 +- .../core/weapons/attachments/foregrip.rs | 4 +- .../core/weapons/attachments/magazine.rs | 12 +- src/comps/core/weapons/attachments/optic.rs | 4 +- src/comps/core/weapons/attachments/stock.rs | 4 +- .../weapons/attachments/weapon_attachment.rs | 2 +- src/comps/core/weapons/firearm.rs | 6 +- src/comps/core/weapons/firearm_state.rs | 15 +++ src/comps/core/weapons/mod.rs | 4 +- src/comps/core/weapons/slot/mod.rs | 3 +- src/comps/core/weapons/slot/slot.rs | 14 +++ src/logic/core/player/hands.rs | 1 + src/scenes/scene1/spawn_points.rs | 6 +- src/ui/editor/plugin.rs | 3 +- src/utils/hierarchy.rs | 2 + 33 files changed, 361 insertions(+), 49 deletions(-) create mode 100644 src/comps/core/weapons/attachment_slot.rs create mode 100644 src/comps/core/weapons/firearm_state.rs create mode 100644 src/comps/core/weapons/slot/slot.rs diff --git a/Cargo.lock b/Cargo.lock index afa0e86..23dd768 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -347,7 +347,6 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "329e344f835f5a9a4c46a6d1d57371f726aa2c482d1bd669b2b9c4eb1ee91fd7" dependencies = [ - "bevy_dylib", "bevy_internal", ] @@ -587,15 +586,6 @@ dependencies = [ "sysinfo", ] -[[package]] -name = "bevy_dylib" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "766980812401453563a7490a351dab88e8f53e62ff37e27a5236e6893deedc5a" -dependencies = [ - "bevy_internal", -] - [[package]] name = "bevy_ecs" version = "0.12.0" diff --git a/Cargo.toml b/Cargo.toml index 81de01e..40cf3f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ opt-level = 3 opt-level = 3 [dependencies] -bevy = { version = "0.12", features = ["dynamic_linking"]} +bevy = { version = "0.12", features = []} bevy-inspector-egui = "0.21.0" bevy_editor_pls = "0.6" bevy_rapier3d = { version = "0.23", features = ["debug-render-3d"] } diff --git a/assets/attachments/aimpoint_t1.glb b/assets/attachments/aimpoint_t1.glb index ad4b553a9cb9354eeaf8d9b92041993b73a0332b..404dbf9af35f1171fb4632d83d6bcb643c159e32 100644 GIT binary patch delta 578 zcmcbxJE~`Q6mNP?h#M0F14GYTF@}tdyfYa$zhS(>%BZk;KfB{%ZsR%S`(+uL_9LF2pr2|HMAu^lbavPd2Z*=*PtM%G7lKtxYEO0ox`s zUAd+BcI(9*bDVEjPx)8Bf9bKT{X2f0wsWp7vU$DrqUCI$_@vE$uiR!9myYn-_t>Cn zf1C3h+XZv8_uX4vv0qfMX!83TmHMIoCfMj%*6-h7J=@lTG2P~wc>VrWM_1Y|RI%J+ z`Mb`ZooDOb`W?M{((>!=m%24io_^Doo9A!+e(@#JHfy#7ZoYq$mxrsa=#$;GG++B- z*3I9Z7IAZ0vvb*AK3Bhg>gK|a`9fSYsa+NwXSvNzD%o~Ozf$3ES` zkWpg$6CFkc7A{@Q1berS$L;PnZ|5^)Ok?G;yr{kZ;mpZ)P1mN^nK2&X{JQm`#o0es zcF)`HY0enT!nKZB%BHLRq}_y|_GQ+LK+FWh%s|Wn#H>Kf2E^<@%mKulK+FZi+(66& h#JoVv2gLk9EC9rUKr95r!aytn#G>1mS&L~U0RR=;`=0;+ delta 653 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 delta 2618 zcma)6X;4&G7Jlb74fLZMP`b52P!w5|t&yFUcbyC+xDgo^mx!RmAu7ftVia&_laxVa z3X_|7i6Y>ZSQ*BIdf-#QekM8=qmFC}n4sbkozX^+P^gi}+-?-e)J)a<_+FiJ?peQk z?mJtws$lOb`^>DQ*(}2_wsFo(gl(n$=P=uE%6l0rvQ|xrdP^4&qzju7p^J8jB8sr51m}YAkGnAF{YT0(aiAorI41 zQ^3h?1xtyAkBv)C;L?k3|KU-8(G|EG?`KQrvUB*Af5wk5od!lYepzIJ)@X2_QW%jb zosQkaM=cTgZ|1tyIwz>m-?EcYqL>hAdpKG8lRZA%ki*TXNr+S)OGb|s*sF1xlOZ)o zgr+=k?&u7lFy%W5FcsWN^fP2 z9qOn`LCaS(^LRt28qaL<#4XzI8j!Xwu;F*7cMY$F>;m$nq?7?2*7fDaFg%c2VO$sqsEMh~AdY zO699@So;lXR9}za{;{_x`k}^7s`JGu*MArlC`A469Z;u%A3f;Ty`z}RWvcm()vR>6 zP58c}m9>5_IYrXU$ECN-x$-&_X`hXq^|<1Wqpz7GI+;{*^RV&KlASYizTRZv`t`K& z?R`f72llA=Q-8eYo+o~GI|Hw8QqT#M!iGD0SbE6=_ZEZV+TRbIsrrSJ*5TCq*otyw zzfabEG*L?RfGrPj>h7^|$-^*@XpsL;29FY-uRqUw*sAvNfd929A9hw#9;je4ndJZ*ULBJ<2RHx* zve*%dh%5j!Sogx0c#i=S37-fm;yxB)NKy!B#k{dJor?L_m3(x6$3)A&ihSloL#@KV ziA?f@1>$Bkyif0um^4rykkHxAv%zWT@wd6g(Q@jx99}jh4TTu48%JdFP!2Q3Q9t9T zm{&5HJ|0TVc-H0Z43rP!yQ8)6U?k= zNl_>im{_b{T&$2YMW9l}3L?&}1 zVHfStvXsgw_?b93gMzr*(t+Id=D&b5{U0ndt69!;s?Vl_POQ^|4NEThK^(E;A&G{k z^AM{tbS_=Q$Is3g+MFsLW_5W6%H!p+@<0kd`5bwod;$H=lPA${64e6bv*mN;fuge? z>kSYn{?4Dp0J@K_1+Ww{3M&dZg*Al@g)N1Gf}^mbP*SKU>?s^594W?7jHPg*P*Z3q Q#!-x?(2CaroF8fb4L(W`?f?J) diff --git a/assets/attachments/first_compensator.glb b/assets/attachments/first_compensator.glb index 202fbe62fead79099207dec59ebe6afb9f4a05ab..d33372a28314a6ea7196b3773efd3160ebb2740f 100644 GIT binary patch delta 229 zcmWN=xemc_0Knn?i#pr7?@~uyyDl~nPhju{7U^U#N(>&rY7i5PL@F_f#VDS`V6a$B zeqZvvo_n#SI+>1!vLs1nvm=d9>Q1;{aaG)NKsUs~y<4s>7VCNU9qJ!uH*GWMJ&sGq zUOBd)Ob@;EQK6p!1{q?Q5vtUvGs+m_Ofbn5)66i-9P=!&NP{JoX|lp9Ypl~^gH5(B Ij@|x!{^GMt`~Uy| delta 303 zcma*bF;2oz0D$55iedpv6+sX|OO>LAkfLp+uo_OlW*iJLn%E6SHwO>E#za_fGo}NH ziD6^p91IN1PX0$=_?B<9_>@a%&q1fH2q9i7S7P+7jb*!P_PUS3li9qtYjxYZZrHwm zd*i!q-F2MmhW8MD$=|4A7-695MJd9!a;Qr&u-#Ssb<&>=hIg&`&%5P)Se}G}2)3|| zD0ZMChBy+~g@z<_>|q}%93YJh4v|F;N66zC1r%|DQy3`0#2L;}hJ^|)rj~d4xBdsv Cc~C3> diff --git a/assets/attachments/pk5_foregrip.glb b/assets/attachments/pk5_foregrip.glb index 37996668e03b968dc01d4759d3e226f63dab06f5..91a69a2ffe8cd6444a3ed8da6112b10bd88f3a1e 100644 GIT binary patch delta 106 zcmaEJ(rd{{FW&T=5H}_U28Ja|gcw{l^0qK;zRq}@wRr)1`vP`GAZ7w$W*}w(Vpbq# m17eUI2M}`tF&7YX12GQ}^8zs+5c31E01yjqU%)QpGZz4UO(K;5 delta 180 zcmZ2-((BDhFW&T=5H}_U28K6Fgcy1@^0qL#=_nN^C+4IoSw$P@85)=wSr}Manj2f1 zni`s#nCK8G7Q1;O<8f9d1%>7a_Vx&NMj&PaVrC#_0b*7lW&>i790w3{0x=g5a|1CC X5c2{t9}x2cu>cSYZjWFW@|g<&()ulB diff --git a/assets/attachments/tan_magpull_stock.glb b/assets/attachments/tan_magpull_stock.glb index 6b4480a8a5fb67306cabee7b77a19ec86aba33d1..6562cf7af3c1b2276b1197a069220b4b3dfb756b 100644 GIT binary patch delta 1527 zcmY*Z3v5$m6u!4?uESflIYv7uj&R!maY-dKY%G;VE@;EI*fN< z%J9?qT7jUbG+A^g!xlTsNZjTis~`+Rs0Mx+ zBAuvQCCeqoi@(Ow&eX*5hUaOJx$L zb_g)Bcah|;PC+-)?wSG?0-}l~@N+E>%WN9p>r5~#YCsfMKx=It80$1J;!?xqNDkzS zN@OY(dEnh@5b6}rCuV~kHGH_gDlU1%V@f42e|4b{T5YEw(8EE|)^fD$+p5$uyRSbN zn_f^5EnMUjqC0mQvR-S5%R2U8iAXXNngNV&t%AG;EtuDE-;Eg4L2w=Kc|jZTxO+*_kbI^YD@A`EIxH`+|<>6A_j)ALbsvgo$Pq za4pNwiN0kO^4VG{aGhw`htjgGmnG7*Z56b)rtL=D^lcB)O@14XeK5BiwmZNSXTy|!nCyPr3Wpzr(bLD4IBStxL z;f06661e45!O1!$i;YM7qb@U+&dtMm7d6F8`9}+#@w0bU8bIyR!C6ra2i)@9B+u%Z z_k?=u>KOH&JV1ed?P!?qp^dS4bPqHK$35{E^-Gg+KGKYMXdP}j7r+fqI*48^sEH9W zd|KE=ieSWtgXL4ej4vC~+7r--`aL1#8fcN>8Oy##jhM8*(!rt++C*nBw zPj@W%VRM{4Q9wuM|M;$Xd8j5@INZ*|8@{#37bYSI?`HwmQH3!(I%viFIzWb38b3{= z+|T3sU6c%jsFX(i+h}+6okb{{IxnF#byac6)P9+sism)B;U4JWuWl9G?~*5*MFRTM z#m9bgV<;pJ;qIlxn783XF zKVDn{M}l@mQg7B4G$C3dYe>V=^e{Q9%Ci*u!|_a}84;yOPzVM)<>M zBR(YWkLZ%R6A}DNkY*xn*jk_Ukl%WUMaU3y5GjaM#8ZeggdCBMn2UHC!66igd58=| SCL#;*3?h5PdT74D5qL&U?eAU)xO;{y6FT{poCNoAoaZ2ICrf?rY{}jas4u_qvPb zx{6+9xxW4-4ZX80u+0}1&C)an@x>~Xg~e8yIP@3BQ%Dq3h4bk${(_O~x#)JngxGs|dNl!YTf?1OgwL5|Jx=8_9re}dOMuEbl#Edv| zI?8dgHI(pjkYM=&*GrZXmfI%<&6KIyFMJrK>9R?s$KhR#M_1{WxjVNe(^y`DK6h+N zSm_pmsA4b1+h5TE9X1wfZBkgNn2}M(z8&x_tyF5eZ{+y4e9D|Po7qeaeHCiRw@JWT zPTa{`3Ck5MOxi|}cRy!MnhxY0uF+$QyG~`H zo_)$o+P(M|mX{a4Z4;12P6QgsJKxC_M3OR67OTrYal0i0V`@QeRKUh*9eU{;1+Z*n z!0Xxpxz1R)=TN}BQv@nALkH~`@H?Kt#$hnH=2T#3W5UTj3OrqP_|XA3*QRX_41s-} zBMba>q^pZ{Dk!iZv4a7XOAO7ZOB^f+EezOPihq(2BiEQqf%dmtS#Z4}4i0kZV0XU) zer^hPWyYG=vVwy=}YLp!06Uo;$ z*U(@-!@{F8#2~)qJD6`_foaXdm7x_U3nqa$^|ul^8Q3wL-NpafdSDyVxlo?bsyAx4 zx82vky>2ny(-6?LXQ6LjJE0$MkHXIKa~-7Fd_w2J%SblbyFoZd-w&gsv2MXR4!&`o zr$2DZNJTl(XGgVDe{PTg3l@=rGOv~8$Z^mY?t0VVw3h)zKhC{Z1O@%#fB!fEGmv{E zd`EvRNkTZFBIJ+5UHClNAAhE4{8nZP34oV!fZQp|Knd`@Qpo!-nqM6d(;rG&V$vJU!$_nKP^+C(K7bjf@}ew`Z)?yR>k_B;`kkt=L7kbfj52LL&r- qZHN#=C}KMz3?W2>BO(wx5DbDv>_j|)5FsKFPa>kON=L-PZ~g|Wlpcxz diff --git a/assets/character/main_character.glb b/assets/character/main_character.glb index 1eb3cc7f52bcdedd9592754645fb253b52903dfa..7d5b880461116f9824fe8f378b3aec81831fee8d 100644 GIT binary patch delta 3584 zcmWmEXIKpY7>41iB6~-6_Ds&MWADB9&WZ-vBbyLHcJ^KoGBXQDWs|)!v$FRd@AKoi zukYvg>rIVHa8Fe+ZVs!(WU!lUR+GiY=3_7#t)50Ni_Pe5v6;G zs+y_hs)cH)TB+8mjcTjfsrIUa>Zm%Y&Z>**s=BG}s)zDbJykE&TlGVS$>2h|~USRGME)iD*P;?;3=LY-6& zbxI|uM3tmYt264XI;YO73+ke}q%NyubwyoO*VJ`&L)}!j)NOS~-BtHgin^~JsE6v2 zdaRzPRP|InQ_s~4^-`s&SL(HTqu#1_>b?4)KB`aZv-+aGs&DGM`k{WRU+TB|qyDOY z;X!Fm5el5a1=2x!aD@zz5i&t$$O2g*8)SzZkP~u2ZpZ^}kQefSJLHD~P!I}1VJHGc z!2^mxaVP;Lp%j#cGEf%EL3yYE6~PlKffrN;0~o;sX0U)2Y~T$(V23JD6{ImM!{$ZfiW-^#=&@)025&n zOok~C3R7VkOouR-0W)D1gu`r@19Kq)=D~be01IIeEQTcz2}@xaEQb}a5>~-#SOaTe z9ju29un{)FX4nE-Aquv^c8G=@uoHGc4D5zIuow2hemDTJa1ai`VK@Ru;TXh0JRFA; za1tDF3KAd@lHfF)fwOQ9&cg+`2$$e8B*PWB3fJH|+<=>K3vR<5xC{3n1@6NGcnFW+ zF+71(cnZ(pIlO?EkOr^dHN1hh@DAR?2lxn|;4^%Iuka1N!w>igzu-6gfxqz2N%QBd z!wHImM!{$ZfiW-^#=&@)025&nOok~C z3R7VkOouR-0W)D1gu`r@19Kq)=D~be01IIeEQTcz2}@xaEQb}a5>~-#SOaTe9ju29 zun{)FX4nE-Aquv^c8G=@uoHGc4D5zIuow2hemDTJa1ai`VK@Ru;TXh0JRFA;a1tDF z3KAd@lHfF)fwOQ9&cg+`2$$e8B*PWB3fJH|+<=>K3vR<5xC{3n1@6NGcnFW+F+71( dcnZ(pIlO?EkOr^dHN1hh@Xk42^XD8A_#cw@5ETFb delta 3585 zcmWmERa6uJ5JuqxD0ZMIHY(VN?827a3bxo?C?a-Y2OugcCfKcr7?{|oD|UA$7It_1 z_u+nL&OFW2q$Q-frKu!WyV+o~_!-SMgUMjFTFgeHm%-c5W;WWaW{ZzSD_@J%%SS7t z$>wLW*(^q1tHET8OAK;y4-d9S1=}5zqjFLiRL10ByR%c7sL*t0l}Tk*SyWb)O=VX( zR8EykRTB<t2t_}ny2Qg1u9m>sfB8hTCA3+rD~a4u2!g(YL!~8)~K~= zom#Kr)drQIHmXFmNo`hJ)K-{NnKV~)Kzs&T~{~MO?6A%R(I50bx++_57a~T zNIh0hRGNCKo~h^Rg?g#d)hqQ{y-{z~JM~_DP#@JN^;vyUU)4ADUHwo$)i3p1{ZW6_ zzv$3(hZqHp-~<^UBRE4Q$P8H^D`bQ0kOOi;F31fokO%UDE98Ux;06VtAQXbaPy~uX zF>r_CPy$MV2Y5m$C=F$xER=)tPyxK4B6ve3@BsrD!593%1ZJ>+6>Lx$sz6n!2GyYk z)P!148|pw^s0a0-0W<`E2!KY=7@9y+Xa>!p1+;`fXa%jI4YY-J&>lKKN9Y8dp$l|{ zZqOZiKu_oeLC_oeKrr-$5asfCKo|srVF(O`VK5vmeRCKmu%pMA!tIVGC@9B-jSqVF&DlU9cOHVGrzueXt)6z(F_!DR3B$ zz)`TnF-V2uZ~{)kDL4&h;4GYj^Kbz!!X>y2SKumKgX?euZo)0N4R_!!+=Kh@03O04 zcnnV<4W7a?cn&Y%C8WbEcnxphExd#G@Bu!;C-@9s;46HC@9+bD!Y}v@f8a0tbI|*9 z)ZhS)-~<^UBRE4Q$P8H^D`bQ0kOOi;F31fokO%UDE98Ux;06VtAQXbaPy~uXF>r_C zPy$MV2Y5m$C=F$xER=)tPyxK4B6ve3@BsrD!593%1ZJ>+6>Lx$sz6n!2GyYk)P!14 z8|pw^s0a0-0W<`E2!KY=7@9y+Xa>!p1+;`fXa%jI4YY-J&>lKKN9Y8dp$l|{ZqOZi zKu_oeLC_oeKrr-$5asfCKo|srVF(O`VK5vmeRCKmu%pMA!tIVGC@9B-jSqVF&DlU9cOHVGrzueXt)6z(F_!DR3B$z)`Tn zF-V2uZ~{)kDL4&h;4GYj^Kbz!!X>y2SKumKgX?euZo)0N4R_!!+=Kh@03O04cnnV< e4W7a?cn&Y%C8WbEcnxphExdC~(fe}@3;7T4O%r4Q diff --git a/assets/weapons/ak105_rifle.glb b/assets/weapons/ak105_rifle.glb index 653870349d9d980d852a4b79d9a7dd1099cb20de..3d37094805fa67e40dc83d17611944b99367c232 100644 GIT binary patch delta 817 zcmZwB$xjmj6vy$lQz=#}ph!XMHdzZV1}qf?L6=xO9ZEj+B{kIxe6jCLZu$ zjIk$=+&FkK9K3S(Um@}4*>C4U8qLe+^83A)yicG12x~~x>J!CCC=?oAS`5Aak!XZd z71MAXyIgmCu^^5*bFOJO4BzouN%L#?_dwf1(eccZXSqT9CE~TW<3`O`uxvAEdjvPW zaob!LdZR)9O_=##zM71#MEW)k_@?YT)3d?Nua1$pmX#zum&wa|GZ_>6+cqbCt8V%8 z!EPy5iOY(dlXX>A)aFX;qwG1p;aiR^7N(>jRZ=sOqGdHj)AMRRJ1Dj0pLn&=xt{t^ zO)pi`VMHJxicRQ144v4FIJRIb64-_=bfX8`u>-x>i9RIJj{)q$ZltgWd$AAuaR4F? z;t*Ot9mWwH#W5Vm2@K*ShHwfJGRPta8F?sBp+QFhr*Q^naSrD(j0+gSC@$g>iYQ?W zmvIGGaSh|RjvKg%TeyufCNPORsNgQ{;XbDD01xp9k5PqzCz!?zOgu#m&tTy>W>Lo+ eY&dZ70v;Oh@e;4_8gDR<1-!+(pVjo@cjGTs&*J8wjV-J#SqIeJuhoC?}R1R6g8dsKV+^h!(l?Be| zXtAxOg^h(nVJrU+Gj`T~7Ta6=n(w_g^L~B$BYs4(>dcgcNFNH(IaMR%=k z)f%SndS%D;<$@f1iT+NNT+bTz?0VR~3SMf$teP8k%?ew;SP!&VyTHk=xDrgq+N5x_ zD|YNG$36>*vhP+_!`dVb#dCQ@%PWSiWr8V5ZkhFM$M)C5jStdXTvs!?Zm9Zz5$s9t zi;aruSaM-r=~I=gW+;Z1Rdh|wsyVgiKikf?=Dp5$L3%q#M(e;vOb3g=v&AgIV0i z93J2y9$_8}Si}+@V;Lr%pn?@xc#0~X!Nzl}!oeD9a8bt#cxb@KOT5Bsyums)@D`gt JgY?#S^Dn3{2@L=M diff --git a/src/comps/core/events/pickup_item.rs b/src/comps/core/events/pickup_item.rs index 17029e4..959bd15 100644 --- a/src/comps/core/events/pickup_item.rs +++ b/src/comps/core/events/pickup_item.rs @@ -2,7 +2,12 @@ use std::sync::Arc; use bevy::prelude::*; -use crate::comps::core::items::item::Item; +use crate::comps::core::{items::item::Item, weapons::firearm_state::FirearmState}; + +#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Debug, Clone)] +pub enum ItemState { + Weapon(FirearmState), +} /// When an item gets picked up in the game world, this event should handle all the physical properties on the game world. /// Mainly, removing the item from the game world, triggering inventory events, changing the player's equipment, etc... @@ -12,4 +17,5 @@ pub struct PickupItemEvent { pub entity: Entity, pub item: Arc, pub player: Entity, + pub state: Option } diff --git a/src/comps/core/inventory/player_inventory.rs b/src/comps/core/inventory/player_inventory.rs index 2b6d0d6..2ab979b 100644 --- a/src/comps/core/inventory/player_inventory.rs +++ b/src/comps/core/inventory/player_inventory.rs @@ -111,6 +111,7 @@ pub fn drop_slot_in_game_world( &assets_gltf, &loaded_gltf_assets, drop_impulse, + None ); } player_inventory.drop_item(PlayerInventorySlotType::Primary); @@ -124,6 +125,7 @@ pub fn drop_slot_in_game_world( &assets_gltf, &loaded_gltf_assets, drop_impulse, + None ); } player_inventory.drop_item(PlayerInventorySlotType::Secondary); diff --git a/src/comps/core/items/guns/ak105.rs b/src/comps/core/items/guns/ak105.rs index fd2e595..3ec86c1 100644 --- a/src/comps/core/items/guns/ak105.rs +++ b/src/comps/core/items/guns/ak105.rs @@ -1,17 +1,18 @@ -use bevy::prelude::*; +use bevy::{prelude::*, gltf::Gltf}; +use bevy_rapier3d::{dynamics::{RigidBody, GravityScale, ExternalImpulse}, geometry::{ColliderMassProperties, Collider}}; -use crate::comps::core::{ +use crate::{comps::core::{ grid::UGrid, items::item::{Item, ItemType}, - markers::holdable::HoldableObjectType, inventory::slot::PlayerInventorySlotType, weapons::firearm::Firearm, -}; + markers::{holdable::HoldableObjectType, interactable::Interactable}, inventory::slot::PlayerInventorySlotType, weapons::{firearm::Firearm, firearm_data::FirearmData}, events::pickup_item::ItemState, +}, setup::assets::{GltfAssets, GltfAssetType}, utils}; #[derive(Component, Reflect)] pub struct Ak105GunItem; impl Item for Ak105GunItem { fn get_type(&self) -> ItemType { - ItemType::Holdable(HoldableObjectType::Firearm(Firearm::Glock17)) + ItemType::Holdable(HoldableObjectType::Firearm(Firearm::Ak105)) } fn asset_path(&self) -> &str { @@ -45,4 +46,80 @@ impl Item for Ak105GunItem { fn get_item_slot(&self) -> PlayerInventorySlotType { PlayerInventorySlotType::Primary } + + fn spawn( + &self, + commands: &mut Commands, + transform: Transform, + assets_gltf: &GltfAssets, + loaded_gltf_assets: &Assets, + with_impulse: Vec3, + item_state: Option, + ) { + let firearm = Firearm::Ak105; + if let Some(asset_handle) = assets_gltf.assets.iter().find(|asset| { + asset.asset_type == GltfAssetType::Firearm(firearm.clone()) + }) { + if let Some(gltf) = loaded_gltf_assets.get(&asset_handle.asset) { + let firearm_data: FirearmData = firearm.firearm_data(); + let mut firearm_transform = Transform::from_xyz(0.0, 0.0, 0.0); + + firearm_transform.rotate_local_y( + utils::rad_deg::radians_from_degrees( + firearm.holdable_object_data().y_rot, + ), + ); + firearm_transform.scale = + firearm_transform.scale * firearm_data.scale_factor; + + let scene = gltf.scenes[0].clone(); + let firearm_asset_entity = commands + .spawn(( + SceneBundle { + scene, + visibility: Visibility::Inherited, + transform: firearm_transform, + ..default() + }, + Name::new(format!( + "{} Item Gltf Asset", + self.inventory_title() + )), + )) + .id(); + match item_state { + Some(state) => { commands.entity(firearm_asset_entity).insert(state); }, + None => {}, + }; + let firearm_size = firearm.get_size(); + commands + .spawn(( + firearm.holdable_object_data(), + Name::new(format!("{} Item", self.inventory_title())), + TransformBundle { + local: transform, + ..Default::default() + }, + VisibilityBundle { + visibility: Visibility::Visible, + ..Default::default() + }, + RigidBody::Dynamic, + ColliderMassProperties::Mass(5.0), + GravityScale(4.0), + Collider::cuboid( + firearm_size.x, + firearm_size.y, + firearm_size.z, + ), + ExternalImpulse { + impulse: with_impulse, + ..Default::default() + }, + Interactable::Item(firearm.get_item_arc()), + )) + .push_children(&[firearm_asset_entity]); + } + } + } } diff --git a/src/comps/core/items/guns/glock17.rs b/src/comps/core/items/guns/glock17.rs index aff643b..671fb3d 100644 --- a/src/comps/core/items/guns/glock17.rs +++ b/src/comps/core/items/guns/glock17.rs @@ -1,10 +1,11 @@ -use bevy::prelude::*; +use bevy::{prelude::*, gltf::Gltf}; +use bevy_rapier3d::{geometry::{ColliderMassProperties, Collider}, dynamics::{RigidBody, GravityScale, ExternalImpulse}}; -use crate::comps::core::{ +use crate::{comps::core::{ grid::UGrid, items::item::{Item, ItemType}, - markers::holdable::HoldableObjectType, inventory::slot::PlayerInventorySlotType, weapons::firearm::Firearm, -}; + markers::{holdable::HoldableObjectType, interactable::Interactable}, inventory::slot::PlayerInventorySlotType, weapons::{firearm::Firearm, firearm_data::FirearmData}, events::pickup_item::ItemState, +}, setup::assets::{GltfAssets, GltfAssetType}, utils}; #[derive(Component, Reflect)] pub struct Glock17GunItem; @@ -45,4 +46,80 @@ impl Item for Glock17GunItem { fn get_item_slot(&self) -> PlayerInventorySlotType { PlayerInventorySlotType::Secondary } + + fn spawn( + &self, + commands: &mut Commands, + transform: Transform, + assets_gltf: &GltfAssets, + loaded_gltf_assets: &Assets, + with_impulse: Vec3, + item_state: Option, + ) { + let firearm = Firearm::Glock17; + if let Some(asset_handle) = assets_gltf.assets.iter().find(|asset| { + asset.asset_type == GltfAssetType::Firearm(firearm.clone()) + }) { + if let Some(gltf) = loaded_gltf_assets.get(&asset_handle.asset) { + let firearm_data: FirearmData = firearm.firearm_data(); + let mut firearm_transform = Transform::from_xyz(0.0, 0.0, 0.0); + + firearm_transform.rotate_local_y( + utils::rad_deg::radians_from_degrees( + firearm.holdable_object_data().y_rot, + ), + ); + firearm_transform.scale = + firearm_transform.scale * firearm_data.scale_factor; + + let scene = gltf.scenes[0].clone(); + let firearm_asset_entity = commands + .spawn(( + SceneBundle { + scene, + visibility: Visibility::Inherited, + transform: firearm_transform, + ..default() + }, + Name::new(format!( + "{} Item Gltf Asset", + self.inventory_title() + )), + )) + .id(); + match item_state { + Some(state) => { commands.entity(firearm_asset_entity).insert(state); }, + None => {}, + }; + let firearm_size = firearm.get_size(); + commands + .spawn(( + firearm.holdable_object_data(), + Name::new(format!("{} Item", self.inventory_title())), + TransformBundle { + local: transform, + ..Default::default() + }, + VisibilityBundle { + visibility: Visibility::Visible, + ..Default::default() + }, + RigidBody::Dynamic, + ColliderMassProperties::Mass(5.0), + GravityScale(4.0), + Collider::cuboid( + firearm_size.x, + firearm_size.y, + firearm_size.z, + ), + ExternalImpulse { + impulse: with_impulse, + ..Default::default() + }, + Interactable::Item(firearm.get_item_arc()), + )) + .push_children(&[firearm_asset_entity]); + } + } + } } diff --git a/src/comps/core/items/item.rs b/src/comps/core/items/item.rs index 3e35919..7f329ca 100644 --- a/src/comps/core/items/item.rs +++ b/src/comps/core/items/item.rs @@ -1,7 +1,7 @@ use crate::{ comps::core::{ grid::UGrid, - markers::{holdable::HoldableObjectType, interactable::Interactable}, inventory::slot::PlayerInventorySlotType, weapons::{firearm_data::FirearmData, firearm::Firearm}, + markers::{holdable::HoldableObjectType, interactable::Interactable}, inventory::slot::PlayerInventorySlotType, weapons::{firearm_data::FirearmData, firearm::Firearm}, events::pickup_item::ItemState, }, setup::assets::{GltfAssetType, GltfAssets}, utils, @@ -26,6 +26,8 @@ pub trait Item: Sync + Send + Reflect { fn inventory_rotatable(&self) -> bool; fn inventory_title(&self) -> String; fn inventory_description(&self) -> String; + /// Spawn an item on the game world. Every item should implement this + /// The transform passed to this function should be a GlobalTransform.into() fn spawn( &self, commands: &mut Commands, @@ -33,6 +35,7 @@ pub trait Item: Sync + Send + Reflect { assets_gltf: &GltfAssets, loaded_gltf_assets: &Assets, with_impulse: Vec3, + item_state: Option, ) { match self.get_type() { ItemType::Holdable(object_type) => { diff --git a/src/comps/core/markers/proxy/plugin.rs b/src/comps/core/markers/proxy/plugin.rs index d084aea..69ada81 100644 --- a/src/comps/core/markers/proxy/plugin.rs +++ b/src/comps/core/markers/proxy/plugin.rs @@ -1,8 +1,8 @@ use bevy::app::{Plugin, Update}; -use crate::{setup::load_state::update_game_load_state, comps::core::weapons::{firearm::Firearm, attachments::{weapon_attachment::WeaponAttachment, optic::Optic, stock::Stock, compensator::Compensator, magazine::Magazine, foregrip::ForeGrip}, parts::{charging_handle::ChargingHandle, fire_selector::FireSelector, firing_point::FiringPoint, trigger::Trigger}, slot::{compensator_slot::CompensatorSlot, fore_grip_slot::ForeGripSlot, magazine_slot::MagazineSlot, sight_placement_start_slot::SightPlacementStartSlot, sight_placement_end_slot::SightPlacementEndSlot, stock_slot::StockSlot, utility_slot::UtilitySlot}}}; +use crate::{setup::load_state::update_game_load_state, comps::core::weapons::{firearm::Firearm, attachments::{weapon_attachment::WeaponAttachment, optic::Optic, stock::Stock, compensator::Compensator, magazine::Magazine, foregrip::ForeGrip}, parts::{charging_handle::ChargingHandle, fire_selector::FireSelector, firing_point::FiringPoint, trigger::Trigger}, slot::{compensator_slot::CompensatorSlot, fore_grip_slot::ForeGripSlot, magazine_slot::MagazineSlot, sight_placement_start_slot::SightPlacementStartSlot, sight_placement_end_slot::SightPlacementEndSlot, stock_slot::StockSlot, utility_slot::UtilitySlot, slot::WeaponSlot}}}; -use super::{character::{player_hitbox::PlayerHitBox, player_character::PlayerCharacter, player_eye::{PlayerEye, insert_components_into_spawned_player}, in_player_hands_parent::{InPlayerHandsParent, insert_components_into_player_hand}, third_person_camera::ThirdPersonCameraProxy}, physics::{rapier::{AutoAABBCollider, physics_replace_proxies}, self}}; +use super::{character::{player_hitbox::PlayerHitBox, player_character::PlayerCharacter, player_eye::{PlayerEye, insert_components_into_spawned_player}, in_player_hands_parent::{InPlayerHandsParent, insert_components_into_player_hand}, third_person_camera::ThirdPersonCameraProxy}, physics::{rapier::{AutoAABBCollider, physics_replace_proxies}, self}, weapons::firearm::insert_firearm_state_to_firearms}; @@ -25,6 +25,7 @@ impl Plugin for ProxyComponentsPlugin { // Attachments app.register_type::(); + app.register_type::(); app.register_type::(); app.register_type::(); app.register_type::(); @@ -54,5 +55,6 @@ impl Plugin for ProxyComponentsPlugin { app.add_systems(Update, (physics_replace_proxies, update_game_load_state)); app.add_systems(Update, insert_components_into_spawned_player); app.add_systems(Update, insert_components_into_player_hand); + app.add_systems(Update, insert_firearm_state_to_firearms); } } \ No newline at end of file diff --git a/src/comps/core/markers/proxy/weapons/firearm.rs b/src/comps/core/markers/proxy/weapons/firearm.rs index 6912e0a..21c3025 100644 --- a/src/comps/core/markers/proxy/weapons/firearm.rs +++ b/src/comps/core/markers/proxy/weapons/firearm.rs @@ -1,8 +1,109 @@ -use bevy::prelude::*; +use bevy::{prelude::*, gltf::Gltf, ecs::system::SystemParam}; +use crate::{comps::core::{weapons::{firearm::Firearm, firearm_state::FirearmState, slot::slot::WeaponSlot, attachment_slot::AttachmentSlot, attachments::weapon_attachment::WeaponAttachment}, events::pickup_item::ItemState}, setup::assets::{GltfAssets, GltfAssetType}}; -#[derive(Component, Reflect, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] -pub enum Firearm { - Ak105, - Glock17 +#[derive(SystemParam)] +pub struct InsertFirearmStateIntoFirearmsParams<'w, 's> { + firearm_scene_bundle: Query<'w, 's, (Entity, Option<&'static ItemState>, &'static Children)>, + firearm_query: Query<'w, 's, (Entity, &'static Firearm, &'static Parent, Option<&'static FirearmState>), Or<(Without, Changed)>>, + slots_query: Query<'w, 's, (Entity, &'static WeaponSlot, &'static Parent)>, + attachments_query: Query<'w, 's, (Entity, &'static WeaponAttachment, &'static Parent)>, +} + +/// This query inserts FirearmState into firearms, updates firearm assets that already have a FirearmState, +/// And Re-inserts FirearmState into spawned Firearms that have a passed in ItemState at the root of the SceneBundle +pub fn insert_firearm_state_to_firearms( + // needed for tri meshes + queries: InsertFirearmStateIntoFirearmsParams, + assets_gltf: Res, + loaded_gltf_assets: Res>, + mut commands: Commands, +) { + for (firearm_scene_entity, item_state_opt, scene_bundle_children) in queries.firearm_scene_bundle.iter() { + for scene_bundle_child in scene_bundle_children.iter() { + for (firearm_entity, _, firearm_parent, firearm_state_opt) in queries.firearm_query.iter() { + if &firearm_parent.get() == scene_bundle_child { + if let Some(item_state) = item_state_opt { + // Firearm State is already created and item is being spawned again into world + #[allow(irrefutable_let_patterns)] + if let ItemState::Weapon(firearm_state) = item_state { + commands.entity(firearm_scene_entity).remove::(); + commands + .entity(firearm_entity) + .insert(firearm_state.clone()); + //TODO: spawn in attachments + println!("Reused firearm_state"); + return; + } + } + + match firearm_state_opt { + Some(firearm_state) => { + // Change the Slots + spawn_attachments_in_firearm(&mut commands, firearm_entity, firearm_state, &queries.slots_query, &assets_gltf, &loaded_gltf_assets) + }, + None => { + // Create the firearm_state + let mut firearm_slots = Vec::new(); + for (slot_entity, slot, parent_entity) in queries.slots_query.iter() { + if firearm_entity == parent_entity.get() { + let mut attachment = None; + for (_, weapon_attachment, attachment_parent) in queries.attachments_query.iter() { + if slot_entity == attachment_parent.get() { + attachment = Some(weapon_attachment.clone()) + } + } + firearm_slots.push(AttachmentSlot { + attachment, + slot_type: slot.clone(), + }); + } + } + commands + .entity(firearm_entity) + .insert(FirearmState::new(firearm_slots)); + }, + }; + } + } + } + } +} + +fn spawn_attachments_in_firearm( + commands: &mut Commands, + firearm_entity: Entity, + firearm_state: &FirearmState, + slots_query: &Query<(Entity, &WeaponSlot, &Parent)>, + assets_gltf: &GltfAssets, + loaded_gltf_assets: &Assets, +) { + for (slot_entity, weapon_slot, slot_parent) in slots_query.iter() { + if slot_parent.get() != firearm_entity { + continue; + } + for attachment_slot in firearm_state.attachment_slots.iter() { + if &attachment_slot.slot_type == weapon_slot { + commands.entity(slot_entity).despawn_descendants(); + match &attachment_slot.attachment { + Some(attachment) => + if let Some(asset_handle) = assets_gltf.assets.iter().find(|asset| { + asset.asset_type == GltfAssetType::Attachment(attachment.clone()) + }) { + if let Some(gltf) = loaded_gltf_assets.get(&asset_handle.asset) { + let scene_bundle = commands.spawn( + SceneBundle { + scene: gltf.scenes[0].clone(), + ..Default::default() + } + ).id(); + commands.entity(slot_entity).add_child( + scene_bundle + ); + }}, + None => {}, + }; + } + } + } } \ No newline at end of file diff --git a/src/comps/core/spawners/item.rs b/src/comps/core/spawners/item.rs index fa19278..14a79fd 100644 --- a/src/comps/core/spawners/item.rs +++ b/src/comps/core/spawners/item.rs @@ -31,6 +31,7 @@ pub fn item_spawner( &assets_gltf, &loaded_gltf_assets, Vec3::ZERO, + None ) } //m4.spawn(&mut commands, item_sp.at, &assets_gltf, &loaded_gltf_assets); diff --git a/src/comps/core/weapons/attachment_slot.rs b/src/comps/core/weapons/attachment_slot.rs new file mode 100644 index 0000000..b4d30f9 --- /dev/null +++ b/src/comps/core/weapons/attachment_slot.rs @@ -0,0 +1,9 @@ +use bevy::prelude::*; + +use super::{attachments::weapon_attachment::WeaponAttachment, slot::slot::WeaponSlot}; + +#[derive(Reflect, PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Default)] +pub struct AttachmentSlot { + pub attachment: Option, + pub slot_type: WeaponSlot, +} \ No newline at end of file diff --git a/src/comps/core/weapons/attachments/compensator.rs b/src/comps/core/weapons/attachments/compensator.rs index 83f0f29..cbe7839 100644 --- a/src/comps/core/weapons/attachments/compensator.rs +++ b/src/comps/core/weapons/attachments/compensator.rs @@ -1,8 +1,8 @@ -use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}}; +use bevy::{reflect::{Reflect, std_traits::ReflectDefault}, ecs::{component::Component, reflect::ReflectComponent}}; #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)] -#[reflect(Component)] +#[reflect(Component, Default)] pub enum Compensator { #[default] FirstCompensator, diff --git a/src/comps/core/weapons/attachments/foregrip.rs b/src/comps/core/weapons/attachments/foregrip.rs index 62cb3b7..4307623 100644 --- a/src/comps/core/weapons/attachments/foregrip.rs +++ b/src/comps/core/weapons/attachments/foregrip.rs @@ -1,8 +1,8 @@ -use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}}; +use bevy::{reflect::{Reflect, std_traits::ReflectDefault}, ecs::{component::Component, reflect::ReflectComponent}}; #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)] -#[reflect(Component)] +#[reflect(Component, Default)] pub enum ForeGrip { #[default] Pk5, diff --git a/src/comps/core/weapons/attachments/magazine.rs b/src/comps/core/weapons/attachments/magazine.rs index be7f861..995b899 100644 --- a/src/comps/core/weapons/attachments/magazine.rs +++ b/src/comps/core/weapons/attachments/magazine.rs @@ -1,9 +1,17 @@ -use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}}; +use bevy::{reflect::{Reflect, std_traits::ReflectDefault}, ecs::{component::Component, reflect::ReflectComponent}}; #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)] -#[reflect(Component)] +#[reflect(Component, Default)] pub enum Magazine { #[default] Ak105, +} + +impl Magazine { + pub fn capacity(&self) -> u32 { + match self { + Magazine::Ak105 => 30, + } + } } \ No newline at end of file diff --git a/src/comps/core/weapons/attachments/optic.rs b/src/comps/core/weapons/attachments/optic.rs index 6f83eee..7f600e8 100644 --- a/src/comps/core/weapons/attachments/optic.rs +++ b/src/comps/core/weapons/attachments/optic.rs @@ -1,8 +1,8 @@ -use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}}; +use bevy::{reflect::{Reflect, std_traits::ReflectDefault}, ecs::{component::Component, reflect::ReflectComponent}}; #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)] -#[reflect(Component)] +#[reflect(Component, Default)] pub enum Optic { #[default] AimpointT1, diff --git a/src/comps/core/weapons/attachments/stock.rs b/src/comps/core/weapons/attachments/stock.rs index ed86c9a..2f4637d 100644 --- a/src/comps/core/weapons/attachments/stock.rs +++ b/src/comps/core/weapons/attachments/stock.rs @@ -1,8 +1,8 @@ -use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}}; +use bevy::{reflect::{Reflect, std_traits::ReflectDefault}, ecs::{component::Component, reflect::ReflectComponent}}; #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)] -#[reflect(Component)] +#[reflect(Component, Default)] pub enum Stock { #[default] MagpullTan, diff --git a/src/comps/core/weapons/attachments/weapon_attachment.rs b/src/comps/core/weapons/attachments/weapon_attachment.rs index 5ea29ea..fabb90e 100644 --- a/src/comps/core/weapons/attachments/weapon_attachment.rs +++ b/src/comps/core/weapons/attachments/weapon_attachment.rs @@ -3,7 +3,7 @@ use bevy::prelude::*; use super::{compensator::Compensator, magazine::Magazine, stock::Stock, foregrip::ForeGrip, optic::Optic}; #[derive(Component, PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Debug)] -#[reflect(Component)] +#[reflect(Component, Default)] pub enum WeaponAttachment { Compensator(Compensator), Magazine(Magazine), diff --git a/src/comps/core/weapons/firearm.rs b/src/comps/core/weapons/firearm.rs index ac4903b..d6af92e 100644 --- a/src/comps/core/weapons/firearm.rs +++ b/src/comps/core/weapons/firearm.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use bevy::prelude::*; -use crate::comps::core::{markers::holdable::HoldableObjectData, items::{item::Item, guns::glock17::Glock17GunItem}}; +use crate::comps::core::{markers::holdable::HoldableObjectData, items::{item::Item, guns::{glock17::Glock17GunItem, ak105::Ak105GunItem}}}; use super::{firearm_data::{FirearmData, FirearmType}, caliber::Caliber, spray_pattern::FirearmSprayPattern}; @@ -157,14 +157,14 @@ impl Firearm { match self { //Firearm::M4A1 => Arc::new(M4a1GunItem), Firearm::Glock17 => Arc::new(Glock17GunItem), - Firearm::Ak105 => todo!(), + Firearm::Ak105 => Arc::new(Ak105GunItem), } } pub fn get_item_box(&self) -> Box { match self { //Firearm::M4A1 => Box::new(M4a1GunItem), Firearm::Glock17 => Box::new(Glock17GunItem), - Firearm::Ak105 => todo!(), + Firearm::Ak105 => Box::new(Ak105GunItem), } } } \ No newline at end of file diff --git a/src/comps/core/weapons/firearm_state.rs b/src/comps/core/weapons/firearm_state.rs new file mode 100644 index 0000000..413d6d3 --- /dev/null +++ b/src/comps/core/weapons/firearm_state.rs @@ -0,0 +1,15 @@ +use bevy::prelude::*; + +use super::{attachment_slot::AttachmentSlot, slot::slot::WeaponSlot}; + +#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Debug, Clone)] +pub struct FirearmState { + pub attachment_slots: Vec, +} + +impl FirearmState { + pub fn new(attachment_slots: Vec) -> Self { + Self { attachment_slots } + } + +} \ No newline at end of file diff --git a/src/comps/core/weapons/mod.rs b/src/comps/core/weapons/mod.rs index c7c3f58..dc00eef 100644 --- a/src/comps/core/weapons/mod.rs +++ b/src/comps/core/weapons/mod.rs @@ -5,4 +5,6 @@ pub mod caliber; pub mod spray_pattern; pub mod magazine_data; pub mod slot; -pub mod parts; \ No newline at end of file +pub mod parts; +pub mod firearm_state; +pub mod attachment_slot; \ No newline at end of file diff --git a/src/comps/core/weapons/slot/mod.rs b/src/comps/core/weapons/slot/mod.rs index 1568dbc..de1a9f9 100644 --- a/src/comps/core/weapons/slot/mod.rs +++ b/src/comps/core/weapons/slot/mod.rs @@ -4,4 +4,5 @@ pub mod stock_slot; pub mod fore_grip_slot; pub mod utility_slot; pub mod sight_placement_start_slot; -pub mod sight_placement_end_slot; \ No newline at end of file +pub mod sight_placement_end_slot; +pub mod slot; \ No newline at end of file diff --git a/src/comps/core/weapons/slot/slot.rs b/src/comps/core/weapons/slot/slot.rs new file mode 100644 index 0000000..8309669 --- /dev/null +++ b/src/comps/core/weapons/slot/slot.rs @@ -0,0 +1,14 @@ +use bevy::{reflect::Reflect, ecs::{reflect::ReflectComponent, component::Component}}; + +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Reflect, Default, Component)] +#[reflect(Component)] +pub enum WeaponSlot { + ForeGripSlot, + MagazineSlot, + CompensatorSlot, + SightPlacementEndSlot, + SightPlacementStartSlot, + #[default] + StockSlot, + UtilitySlot, +} \ No newline at end of file diff --git a/src/logic/core/player/hands.rs b/src/logic/core/player/hands.rs index ed16da6..c4c143f 100644 --- a/src/logic/core/player/hands.rs +++ b/src/logic/core/player/hands.rs @@ -336,6 +336,7 @@ pub fn interact_action( entity: interactable_entity, item: item.clone(), player: player_entity, + state: None }); } } diff --git a/src/scenes/scene1/spawn_points.rs b/src/scenes/scene1/spawn_points.rs index 5cb9499..80bf218 100644 --- a/src/scenes/scene1/spawn_points.rs +++ b/src/scenes/scene1/spawn_points.rs @@ -4,7 +4,7 @@ use crate::{ comps::core::{ markers::player::{Player, PlayerData}, spawners::{ - guns::glock17_spawner::Glock17SpawnPoint, + guns::{glock17_spawner::Glock17SpawnPoint, ak105_spawner::Ak105SpawnPoint}, player::PlayerSpawnPoint, }, }, @@ -30,13 +30,13 @@ pub fn set_spawn_points(mut commands: Commands) { transform }, }); - /*commands.spawn(M4a1SpawnPoint { + commands.spawn(Ak105SpawnPoint { transform: { let mut transform = Transform::from_xyz(18.0, 10.0, 18.0); transform.rotate_z(utils::rad_deg::radians_from_degrees(-90.0)); transform }, - });*/ + }); commands.spawn(Glock17SpawnPoint { transform: { let mut transform = Transform::from_xyz(20.0, 10.0, 20.0); diff --git a/src/ui/editor/plugin.rs b/src/ui/editor/plugin.rs index e59cc23..d13705e 100644 --- a/src/ui/editor/plugin.rs +++ b/src/ui/editor/plugin.rs @@ -6,7 +6,7 @@ use crate::{ comps::core::{markers::{ holdable::{HoldableObjectData, InPlayerHands}, player::{Player, PlayerData, PlayerHand}, - }, weapons::{firearm_data::FirearmData, magazine_data::MagazineData, caliber::Caliber, firearm::Firearm, spray_pattern::FirearmSprayPattern}}, + }, weapons::{firearm_data::FirearmData, magazine_data::MagazineData, caliber::Caliber, firearm::Firearm, spray_pattern::FirearmSprayPattern, firearm_state::FirearmState}}, logic::core::{ guns::player_firing::PlayerFiringInfo, player::{ @@ -51,6 +51,7 @@ impl Plugin for MainEditorUiPlugin { .register_type::() .register_type::() .register_type::() + .register_type::() //.register_type::() //.register_type::() .register_type::() diff --git a/src/utils/hierarchy.rs b/src/utils/hierarchy.rs index 3ce4b76..e8bf674 100644 --- a/src/utils/hierarchy.rs +++ b/src/utils/hierarchy.rs @@ -1,5 +1,6 @@ use bevy::prelude::*; +#[allow(unused)] pub fn find_child_in_parent_children( commands: &mut Commands, parent_entity: Entity, @@ -10,6 +11,7 @@ pub fn find_child_in_parent_children( all_children.contains(&descendant_entity) } +#[allow(unused)] fn flatten_if_possible_inf_levels( commands: &mut Commands, parent_entity: Entity,