From 65cc97a46c51e85946eac84311c2902a224d26f6 Mon Sep 17 00:00:00 2001 From: GoaLitiuM Date: Sun, 7 Nov 2021 20:26:21 +0200 Subject: [PATCH] demo recording stuff --- .../Maps/invalid_polyhedron_TB_bug_valve.map | 20 ++ Content/GameSettings.json | 7 +- Content/Materials/Material 0.flax | Bin 29959 -> 30283 bytes Content/Materials/SimpleMapMaterial.flax | Bin 31848 -> 32172 bytes Content/Materials/dev_128.flax | Bin 30845 -> 31169 bytes Content/Materials/dev_128_lit.flax | Bin 37882 -> 38206 bytes Content/Materials/missing.flax | Bin 30292 -> 30616 bytes Content/Materials/sky.flax | Bin 29662 -> 29986 bytes Content/Scenes/AerowalkScene.scene | 110 +++++----- .../Settings/EngineSettings/TimeSettings.json | 6 +- .../WindowsPlatformSettings.json | 2 +- Source/Game/Cabrito/FpsScript.cs | 2 + Source/Game/PlayerInput.cs | 189 ++++++++++++++++++ Source/Game/PlayerMovement.cs | 101 ++++++++-- 14 files changed, 353 insertions(+), 84 deletions(-) create mode 100644 Assets/Maps/invalid_polyhedron_TB_bug_valve.map create mode 100644 Source/Game/PlayerInput.cs diff --git a/Assets/Maps/invalid_polyhedron_TB_bug_valve.map b/Assets/Maps/invalid_polyhedron_TB_bug_valve.map new file mode 100644 index 0000000..5a90d95 --- /dev/null +++ b/Assets/Maps/invalid_polyhedron_TB_bug_valve.map @@ -0,0 +1,20 @@ +// Game: Goake +// Format: Standard +// entity 0 +{ +"classname" "worldspawn" +"_tb_textures" "textures/common;textures/dev" +// brush 0 +{ +( 832 -0 -0 ) ( 832 0 -1 ) ( 832 1 -0 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1 +( 877.8181762695312 0 0 ) ( 877.8181762695312 -1 0 ) ( 877.8181762695312 0 1 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1 +( 0 -272 0 ) ( -1 -272 0 ) ( 0 -272 1 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1 +( -0 -256 -0 ) ( 0 -256 -1 ) ( 1 -256 0 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1 +( -0 -0 48 ) ( 0 -1 48 ) ( 1 -0 48 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1 +( 0 0 106.90908813476562 ) ( -1 0 106.90908813476562 ) ( 0 1 106.90908813476562 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1 +( 779.4157104492188 0 -179.8651580810547 ) ( 779.190850943327 0 -180.8395493030548 ) ( 779.4157104492188 0.9743912220001221 -179.8651580810547 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1 +( 132.8000030517578 -0 -265.6000061035156 ) ( 131.9055758714676 0 -266.04721969366074 ) ( 132.8000030517578 0.8944271802902222 -265.6000061035156 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1 +( 702.8965454101562 0 -301.2413635253906 ) ( 702.8965454101562 -0.9191450476646423 -301.2413635253906 ) ( 703.2904646992683 0 -300.322218477726 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1 +( 68.79999542236328 0 -206.39999389648438 ) ( 68.79999542236328 -0.9486833214759827 -206.39999389648438 ) ( 69.74867874383926 0 -206.08376613259315 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1 +} +} \ No newline at end of file diff --git a/Content/GameSettings.json b/Content/GameSettings.json index 8e3a32e..982a29f 100644 --- a/Content/GameSettings.json +++ b/Content/GameSettings.json @@ -1,11 +1,11 @@ { "ID": "3c7bc3854d42f9b1b0fea9ba0d7fa8e9", "TypeName": "FlaxEditor.Content.Settings.GameSettings", - "EngineBuild": 6225, + "EngineBuild": 6226, "Data": { "ProductName": "Goake", "CompanyName": "GoaLitiuM", - "CopyrightNotice": "ddc", + "CopyrightNotice": "", "Icon": null, "FirstScene": "194e05f445ece24ec5448d886e1334df", "NoSplashScreen": true, @@ -30,6 +30,7 @@ "XboxOnePlatform": null, "XboxScarlettPlatform": null, "AndroidPlatform": null, - "SwitchPlatform": null + "SwitchPlatform": null, + "PS5Platform": null } } \ No newline at end of file diff --git a/Content/Materials/Material 0.flax b/Content/Materials/Material 0.flax index 490e7a4a4789d4d295a2e7061c5cdec22ccc04f9..4da219b32344e718c2a6636dbbe982e27aae450e 100644 GIT binary patch delta 4346 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 delta 4001 zcmZ{ncT|(n214olZ=4$5eNtjRSD7sBtmq8 z2@rZH0%{`>y@&XYc3teErM(X-oWgj&M#G zA0J=t;k>*+eguC(RXx9efRSlqqu`{M2&I$t#oBp3?~;!KE~SW=xw%o--l4+>I{quf z#33{ZfAv1)epN$j^P-Trgr=6YoqoLi<&c;(&U-%5FYMuYo_JzLS@msSpH@OsGkaim zJFkIC9eTx`8#`sruV#vJxfGXDURc*nA6*=t8reSryNnKtNzASNtC9I)Zu4&iFjy0@ zs%B_?+yLH!BbLVZa64#&+^JQQ!(c-_Q~RL6v_E=STq2t>ySOK#1UhYEZ4!w@1_x%~ zi|?~LCKtAhtXYI>P(dj_5>9$WRr2Bc)* zfQnisC)W!~1f}$JrWV9NDnP{!sPLFu1%(Y{CX>5uYU^Tm9tzLGc*e#Q;fZy-A6Aw( zr9>6OQf?)tXOZsHID;>jit;OI{j;AoKFfhmXy}@|A{~&Zo6L7}JTYqP->@^TP!p(O z1kwu|=6x+`c4&+Di|UM(se{c`Tu_ve*VAV9D1|Y!Cn}|4chOH3hC+L^xs?-}JG&KT zmIV*VYU-XT(fQ3OH|2U7zOZU-jXklov~$46(!$J+JxHK6bDqBa5W*Uq9k1`0*%Q*x zvxGUE#|EdD7m^+oQ3=(ms=D^@-Hq^sLVQ92zOv@W`Hz+eI2!jmJ~=tRG@jny${YhL z+n8*MAJVY!atlmt?O{Ef-IC|+!xugs6wrWPb`QkGWz^QRuqHP6_x9DHTJ~;!fCMd1 zhadO77Gsn8o^$7x2zAs0Ct)6^%v>+05jz@27`#ove(*6J7@Q{oH9Q&^pNc2ri-@g{ zc;cf->?j)Q8+#$i8QEzw_nE!i6~hCPU}YWab0;G0 zohw4)3d&k3JpJ1+PnCOVuGUDT$d#cOZ zJ77soQ*)?39PLNyoBGUqSVxuEiMpO&|O`RTZc z{v{W;_}k^B`FFB&`@jm?dhliGBU&)vfe(xCH;ghuGRXk$*2NBtBpcy?bT2C+?+t%Gx&ItTWO(5Ga6L*UniqG};o;RP}c9 zy_9zI=Jd#Z54|zI_uYqOkEjbyLH%00Xo~T6sd@7;mj>{PRyMQo_LbJZI0=r^ENk z>Xu$mdmG>U-FRT4sT(k&L%$kbDlTZMZz~<$;}euuF*QGY$`s{?!I@;1lb_Px0>it7 z16mm1e&wQ}g@soKt%udZpug*3PfKYV!5mWqqPm*8*+2)LwQX)XV_f3pT=d`$9-d)k zr1~<(DEqS#KcB<5X{JAF>1`+{)rfs)ZF)LVL4CnGsIYdz19LS(&)mN8+0giCb+7QM z`UwRa$T>lXa(qTg&EuK&_jzl4IL746wD7j8mM+}tGN$7?WpMnvhA5PYs zxmycgZDo$yz|K08ld}tp+UtRf7C|C1DyOrYPyc4^M{Z7SD{L7WnN~Vtw14cxua4$u z=f>V=?>;XJeR1)aipyx|Vy!6}7+pqUGb~-Nw*fdATOw4y`LM6yq62gCzyz7JD>!ZSqQL`ljY~_D-HbZvOFaIo-4Y>7k81VMW7mD~$8iRKT%T9}ls#Cgwq^IxwRW zl-`9a^f3alpFXiFAiE{92M!5y4~&b{KTC2N=ozB@<;7I3dqf`pwI%tJKFFyw8sm>yF$CJ5R;QI8}{J%^1Fwm*26VV zUUELRb*xAo*LIcE(Drw~9!;%(&K>=WP(7h(A_hSO1>(}PE85$haNpuSmQylxsT58N%Q78`DSN}nUwEN(2!t??gLa`W*IB35)U8Aaa;pV5WE z=S>{lJY#KaS+A3DNjc?!1lneB3-gPmuCzq7oAd z2qm4s8baLFH4RI2EFF-+Z5^%sn``{Q3)Pi$4WXy((5~dE#R*CygHz)fbbEYlOG*h4 z9>n8M0JfkU=;&xGb$IX%XPPIYEP!^`A+>Z4;l{YT8z2pck(s-H(6z`6VofcRHM>;s z9~P`^iiVpauX%?S+y(Zzc9J(g{YiNDr2RQ#Qxw`i{29KWnK=qlw{Wxr>*yoS^$Y+x z0vNInBOQ?(&c_8&DX_|#6EXyg&CVcIGyutJL`XzUMbG{`(#qL4SSK-^j3Ye(_$~Bt z3naI?E*|9@OaQi^j?Qf?dojJdVw86h<-lPMLM zF$GOT27P*Dc|}e=*wn%ZjS5Z4p*^Uf^@iRKjRvCK^H+0H7T!Q(Z(G=2WA>M_xv#fB zgA|qJU0kk5#btPg;6lH_q~ITzD1C#8mv8+40}~m*3D16q2{yNk+FBVA$zs3aF3qeT zkXEp;wgimGC;Vo9!TWtcf)4J)_{%TizZk9^lr#=Z4K91oNa^DCZSqS<&O?9D@bq0= zW?to!_#Do%@Ies>)avI%-{6#-Qc7(*UI38b-Rc*Rc2u~72l{GCUViTFzQKtxL#VR= zL`&WlVt{t{#NGXNeuoawY)4V;OzO2Ozehz6OcQ_L_`!sjkUZ?9g_pE8HXV?F$(|&S zfJBa{o<^KC{>B0%&MWkyclaj`XLse`=t-EFs|_|LGBi59qx(6Dbx8W{`i3CH00xF% z@=XJb==%`y1b^{ziI+#~!5v+aBcgK2gr-4}e;$xqij9da&LMSn^O}3PbEG~(9bn=A zI-q2q5q-Zbtf6guly_hle9Xw&24aAc_Q8F-ATgtOX5_=_?u@jqB>(QjI(kAT&~4o!_x3=mCTMIuIfLjmRwvp zFimdi9q#O7)_z$1BKIv7A40oF;!BYz-{`x%{azm5F8DAM;gt}AOHMC;fC^1an%$F= zIc#d}elY}>Qc!)by?cCoHhXGuPgKUt4kfE+W>@YRbE7yH2p9^l7X<{>RJ5#Jj3ZHQ z6`3XZdM4(0q6h86E<#S@LgOOKihzvx^v!B| z38ka!{nXMfNRnUXh_-)7L|XBKN44x%i`)B~5@16&Twqvu;_YH=SlskRWjVD?T;&8* zdq?%3A*Bh|@siIw_;0Z-pog2v5KDfYjJ`nADd%JhizkJO=#QUBSdg z+N2WiHQcHiSpp63YZ`}H!RHOp&hCL3w#8MgN$+3HiZYBX)y|wlqYM*oKOl9`Uy)es zH*`TMzV$)J0WX%zN+(ke*ZlGe!s8#eqHyqeBPgnyUAOz!;57Ix`pxZ@MIj$ z%tZ0p^5)c3^9~8~!7OUhM18KKkEkC&`5V=C(nhDbqWs{)Fq?DNLn5M6a%&q~S)ApZ z(&Y^iT~oVNKAAX6WON|5^zY%BwT6Y|^`&hwQMl_VYkO~0NGuau+Qxbh*0m45q-JE~ z?9$B~pBXJ{6q`>Xl)a&Kk8Q6Bs2qaAHDcpku-KF`0%LGubdO(F@f7;g+7T&C>N7mO zi8bNFD#(0pl_0XGaxakxa?`un@({lh2UgJiWx$7l`z{5=+phbj;(@=QZ?z`}q3j zYto0IdJsdopjaznbK~H<<)o5-s@iBH(+ID7aS&sK^Pe%8!knr%6!y&M_MU5nffava!Kog#JZ$rBjg!SaM}Arf+0{XBZ^o zW{X6G2IS(42yGpWq_;iXm1U?7kL)S!vzL8(Q6X75W%Z1%4-;2z$*aLGqk_Y7GV*Gg zT1FSA)FAf3Vwy0cH2>T8vyzI-`|4O^GLx}bw=QuAVk0dX819#I|GF>w@zVw>A0Jv) zUf=Zh)pb`_?T<<3Dm*GH zXX|BS`Rwc&Cn;rpb8U^7M@{s5<4bFMpDFF{rdGqy*xdUM3sP@Kr9OK4mCbri?-~0{ zZTun$F|@oE$Rnw578s2#oSN9>MfWcrH@0zxuUmO}2PR^3N<-T^mdeEsi2|vT@b-$1 z`YZiO?EArnj^zys?Gsl>S|ti-_pp9;LRN8pS^aR|lE7D4B{_Saj64b_JS_)Lm6nu{ zlhap`fmu8KJiq>)@rLwc3OGNe0Di_LBt9p9nDY%SBFv<4bmyhM*gGlZJ;!&@yVpN$ z9tLaZI=Ef-^o__XeL`wvjn1*g=H-r^9Gl(o);9ON@^VoNu(BeisiF+ZL9tb*9~VVwKRH(AxG4S^GvTtaKB zyGA+awRV1p@>e5AGnj+aeiuK(y=YBmO_RZ38GRjRr+bWH_U?xGk)vP}J7c@}ilXGm?ArgjMo7dFTa(1g9ygL6aJFduU935a zFOXx}wpMWaw76hY!pofcs`kCU?d2T>O{4gzJwU=R9;^}7dd9`5G1d4+8q9X05nV{_3b|$zS#JQ6|UgNg9;Wp z)`5y~_gn<KJOu5Alji?dhHtGd-YfXzPzo&LhXg^>MePWK@1#S(9*c_WL_MuLwB5 z{&raE*vW0Mx{wyk;}7@yY;^L_@XRtV$l$Eg5>&(1#wZ-&>=k=AH?L&1o;I_ww&kL! zXJYE=0`%#AvQ~0i`!ev&jq3_WEKXlTdbpy{6;I1)^zw=Ah9)`-c}{A0$6f&2@j1) z_rHw35$&B(`{E$$H?R`)Ado@>W1BQo5daAG`s%Laoc!#zfvi%3<->jQZhrhM_NA<) zb!rj-C+8H*LExrWTx!YnrVjGd?0UN(L|5I^2Drxq8I_cq?Ope}V|b&zS4{7;ZlEo~ z(A+8W&C7-vGKsCIWMXEALPjI~uA=Xy4}6#`q;*cR*97=&ZXK|2)qq`ar*Qu1jP*q3Io5{qwvR6%gy@QMEGU95gSFa@zTT*fPwa?!SzMIDp@a?p|k!|jX znkMwDnPXsV1g^Lcn@21r96Y9Pa~R=s_h$h9I6^IDS(>c}Gqm-TgwKcMci?6QF|Lr7@~y2X}}gvGsbr|4};Xsm^xesB%q$y z{D0)_9h+Jg{Y}oy80i&YZs&>uz&QFzEAwDwJ)lp;Fcz#87C&?eT%h<2)P#Q2_syprL-^z4o?{36sY1L)?dw>cy# z?_1{R=8oNUv)|DLgnFO^uUk2T$O>_V3ve@nc z`5&^M{-_{roICqXTwaqgv3%}~{k8aqxpf5miyqp{)U5Of)JO|vqpfn)&%L6C%6Kt8 z1DGh&a|rY=Fqd@4fP~aUfFlxJ+!+B71h9YBSw$5wSEC|xvG}UN_JvJBn2&Q zC@w7nM-bcfeMFn4{Irj1PIoYOu2eKuk*LHcfN2siHvHlKf?~39^%c!+g+#KZtPIi| z?urP)q*u3wHxD+Fn1kahQ)1}jFq_CnL2;?oO^e%m#NmO@yAmpvh-Al;;Xy$uNdzLP zWpsG?03TT6-h;e-Y*hV=jre_RGQK$<*UF6gLxsK1fiKv@J~b1I^XRIi70Aooj9j=_JWlD$sA1iKpUlx zJGQy?{ru4YfLrNhO>a_?TYHCAbkIiPKgnC}mQYp+gvHUb0{wL0X)(yCn6&J&)}DP9 zgrQTT@2A~Bg@vc%m#Qg!Rdfbp30p!`RMs@Vtf>)>EqIE5Nu$i|?D7Ia^u31w0}XI( zptfm@$&~=fX{cJ-|E}}z16J1=j5#z{6eO!GZsdWAAhtHsfgR+x6NXd#Qb!>v)<*gW zSI-xilmc7}rEf-KVgCYrJtZwDIVF3#s)GZ-h|Qf_2cJ;;^|ZysDEI}JXQbC%w1M4W z2~{;M+e=2*>@WI8VNxD@`^7DP<`Fn33U#oCUGa%A!4?;g$c(ZU2_m{f$4C&Qamv}# z_1uljCmEaD%e=>S`DJ8JI$jINxNYxLgvHf0ak|GR`9vk47B<0Q_X<+;@<~;+;jy6y zC1s6`A4az}!D^7H4IW8gl?YDn9$KvD0ZT)*EM4{1ojiPEBXi4fq@MJdQL?6?te%N2 zAezXMI*-_({1+`fXvQ4e;y)$$-UCwd^FO^yimhkr-xSVNeb?Hmxa9k>SrJi0l%+jD zvzV;H>CS(sHRKmVE6afS8C#VSRMXJ3vAXFMpVmz4;!bRWqz)W&aQ2N%NUp4SMIRhV z&n>SeP4=${N&KR5+}Pe4lZ*dUAdKdRD$VWvA`4H9vP4FNMFBg7V9_Y++gAyQiY7W= zUmxKd92S$tZYHrA%#pQipn( z3z|reXiQWAzOt!ubm7ZJ@BSM2T?bSjrX)SWQE5qkH}`hRYQan-?j@y^m5>Io;LS4a$?X!Lh{ykN!Yg+pK&@5F!C z$kibVp<{4tWPV#iH7SjNqz7e1z+zlJunzuBOq;A9LiJxe>4@9A@1grz{NGZ{BMCZt{u&5wldorN{ipwn$W-jBR#Hd5xx+aH z)nI$~$Y@+~MP)0Cz2@u@@R~czFU>YIFq1r_4bRHTt*r(!TE_*+s%TnTK>tgK_SevZ zLTU=?+GiXA$3-UAps8;w)>}q~S2sY?Cqm6V3%w&B<~>_^-AC`++>p7ZWPIA%H`di1 z`JxE>xRA=re$)(+Sb820ZVs%Ge^Wj*DHXK MFgUf#fTL9XU!C!b>Hq)$ delta 4002 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 ZE8$6WMqb4`y?vmMh$%%Mw{iBl`fpd3(;EN) diff --git a/Content/Materials/dev_128.flax b/Content/Materials/dev_128.flax index 23c9a0a4bef56c9bd9e455d35d9945ce7da6d6c5..0b55583999f06bbb14f17e69128e447b529b184c 100644 GIT binary patch delta 4330 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 WL&ws_s0kAE5l7D(goLz`n*Rc&)bOAH diff --git a/Content/Materials/dev_128_lit.flax b/Content/Materials/dev_128_lit.flax index 01658aeea1111341821f90944d5ed74aa0ab6cc7..4314c31c04cc66062bd70262b936a3c1586500cb 100644 GIT binary patch delta 10697 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 diff --git a/Content/Materials/missing.flax b/Content/Materials/missing.flax index b748545a8940507e1f70c0380d6611a4e5e426bf..83a5b75ac135061bc9c2826dcb5d34dbe97515d5 100644 GIT binary patch delta 4351 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 diff --git a/Content/Materials/sky.flax b/Content/Materials/sky.flax index f5a31f63651933b7167672c761bfce9a133f0476..028123106702dc4bfa496450429a78677faaa97d 100644 GIT binary patch delta 4322 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 LmckbhX)XT)GhCc= delta 3995 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 RPy(1EnMLDGUF$o7{{ceo2etqJ diff --git a/Content/Scenes/AerowalkScene.scene b/Content/Scenes/AerowalkScene.scene index c19ec29..3880747 100644 --- a/Content/Scenes/AerowalkScene.scene +++ b/Content/Scenes/AerowalkScene.scene @@ -1,7 +1,7 @@ { "ID": "194e05f445ece24ec5448d886e1334df", "TypeName": "FlaxEngine.SceneAsset", - "EngineBuild": 6225, + "EngineBuild": 6226, "Data": [ { "ID": "194e05f445ece24ec5448d886e1334df", @@ -23,55 +23,6 @@ "ParentID": "194e05f445ece24ec5448d886e1334df", "V": {} }, - { - "ID": "6c66fa4a4a5de8998eb84388d1648317", - "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", - "PrefabObjectID": "999a202c47de967d2bdfd09abcc6df4e", - "ParentID": "194e05f445ece24ec5448d886e1334df" - }, - { - "ID": "d5c84d67417ddf09908c76b6f0582b43", - "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", - "PrefabObjectID": "b29a58f545071ca393afaab21faa83ad", - "ParentID": "6c66fa4a4a5de8998eb84388d1648317", - "V": {} - }, - { - "ID": "d1a76c334a514c99f8f5b2bd81abae2c", - "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", - "PrefabObjectID": "a67383834fc3f6f1106e8099e5557e32", - "ParentID": "6c66fa4a4a5de8998eb84388d1648317" - }, - { - "ID": "357077e9405b2a7ba50198bbed8bd5f9", - "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", - "PrefabObjectID": "b8fc420f4efe96fa2b4042bd98fd3e74", - "ParentID": "d1a76c334a514c99f8f5b2bd81abae2c" - }, - { - "ID": "905d23324e7f98c9f8287e8e49a83981", - "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", - "PrefabObjectID": "226bdb004e72848777178a9d1f207cbf", - "ParentID": "357077e9405b2a7ba50198bbed8bd5f9" - }, - { - "ID": "89c02cd64b640185d9947ab451453c4c", - "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", - "PrefabObjectID": "8bd80bca49ac35da66aabaa2e473851d", - "ParentID": "6c66fa4a4a5de8998eb84388d1648317" - }, - { - "ID": "eebdb91647732ad3dfc7528c978cd19c", - "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", - "PrefabObjectID": "d9d61d314ad79d49ba08059cef50f802", - "ParentID": "6c66fa4a4a5de8998eb84388d1648317" - }, - { - "ID": "3e0f83fe407b2d9ed7c734a62fad0826", - "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", - "PrefabObjectID": "b377cc03418270d87e8a5b92cb5374ea", - "ParentID": "6c66fa4a4a5de8998eb84388d1648317" - }, { "ID": "ff6b6db54b5aa08e7286ef86246149ef", "TypeName": "FlaxEngine.UICanvas", @@ -117,13 +68,13 @@ "Transform": { "Translation": { "X": 0.0, - "Y": 248.0, + "Y": 254.0, "Z": 0.0 } }, "Control": "FlaxEngine.GUI.Label", "Data": { - "Text": "eFPS: 719\nuFPS: 650\nrFPS: 650\npFPS: 30\nCon: NaNms\nDirectX11\nGC memory: 15.66632MB", + "Text": "eFPS: 15\nuFPS: 15\nrFPS: 15\npFPS: 30\nCon: NaNms\nDirectX11\nGC memory: 12.47396MB", "TextColor": { "R": 1.0, "G": 1.0, @@ -170,9 +121,9 @@ }, "Offsets": { "Left": 0.0, - "Right": 30948.0, + "Right": 143.0, "Top": -562.0, - "Bottom": 576.0 + "Bottom": 112.0 }, "Scale": { "X": 1.0, @@ -211,7 +162,7 @@ "Transform": { "Translation": { "X": 45644.0, - "Y": -1.0, + "Y": 2.0, "Z": 0.0 } }, @@ -306,6 +257,55 @@ }, "PostFxMaterials": {} } + }, + { + "ID": "6c66fa4a4a5de8998eb84388d1648317", + "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", + "PrefabObjectID": "999a202c47de967d2bdfd09abcc6df4e", + "ParentID": "194e05f445ece24ec5448d886e1334df" + }, + { + "ID": "d5c84d67417ddf09908c76b6f0582b43", + "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", + "PrefabObjectID": "b29a58f545071ca393afaab21faa83ad", + "ParentID": "6c66fa4a4a5de8998eb84388d1648317", + "V": {} + }, + { + "ID": "d1a76c334a514c99f8f5b2bd81abae2c", + "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", + "PrefabObjectID": "a67383834fc3f6f1106e8099e5557e32", + "ParentID": "6c66fa4a4a5de8998eb84388d1648317" + }, + { + "ID": "357077e9405b2a7ba50198bbed8bd5f9", + "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", + "PrefabObjectID": "b8fc420f4efe96fa2b4042bd98fd3e74", + "ParentID": "d1a76c334a514c99f8f5b2bd81abae2c" + }, + { + "ID": "905d23324e7f98c9f8287e8e49a83981", + "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", + "PrefabObjectID": "226bdb004e72848777178a9d1f207cbf", + "ParentID": "357077e9405b2a7ba50198bbed8bd5f9" + }, + { + "ID": "89c02cd64b640185d9947ab451453c4c", + "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", + "PrefabObjectID": "8bd80bca49ac35da66aabaa2e473851d", + "ParentID": "6c66fa4a4a5de8998eb84388d1648317" + }, + { + "ID": "eebdb91647732ad3dfc7528c978cd19c", + "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", + "PrefabObjectID": "d9d61d314ad79d49ba08059cef50f802", + "ParentID": "6c66fa4a4a5de8998eb84388d1648317" + }, + { + "ID": "3e0f83fe407b2d9ed7c734a62fad0826", + "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7", + "PrefabObjectID": "b377cc03418270d87e8a5b92cb5374ea", + "ParentID": "6c66fa4a4a5de8998eb84388d1648317" } ] } \ No newline at end of file diff --git a/Content/Settings/EngineSettings/TimeSettings.json b/Content/Settings/EngineSettings/TimeSettings.json index 943fcda..692d208 100644 --- a/Content/Settings/EngineSettings/TimeSettings.json +++ b/Content/Settings/EngineSettings/TimeSettings.json @@ -1,11 +1,11 @@ { "ID": "a55dc3c04da4ea3744b7f1994565beac", "TypeName": "FlaxEditor.Content.Settings.TimeSettings", - "EngineBuild": 6224, + "EngineBuild": 6226, "Data": { - "UpdateFPS": 240.0, + "UpdateFPS": 120.0, "PhysicsFPS": 120.0, - "DrawFPS": 240.0, + "DrawFPS": 120.0, "TimeScale": 1.0, "MaxUpdateDeltaTime": 0.1 } diff --git a/Content/Settings/EngineSettings/WindowsPlatformSettings.json b/Content/Settings/EngineSettings/WindowsPlatformSettings.json index 3ed1e99..17f983a 100644 --- a/Content/Settings/EngineSettings/WindowsPlatformSettings.json +++ b/Content/Settings/EngineSettings/WindowsPlatformSettings.json @@ -1,7 +1,7 @@ { "ID": "4a5eec97484253fed72934860ae62c40", "TypeName": "FlaxEditor.Content.Settings.WindowsPlatformSettings", - "EngineBuild": 6225, + "EngineBuild": 6226, "Data": { "WindowMode": 0, "ScreenWidth": 1280, diff --git a/Source/Game/Cabrito/FpsScript.cs b/Source/Game/Cabrito/FpsScript.cs index 5b8bdca..6698eae 100644 --- a/Source/Game/Cabrito/FpsScript.cs +++ b/Source/Game/Cabrito/FpsScript.cs @@ -93,6 +93,7 @@ namespace Cabrito sb.Append("\nGC memory: " + (GC.GetTotalMemory(false) / 1000000.0f).ToString() + "MB"); //sb.Append("\nUpdate profiler: " + updateProfTime.ToString() + "ms"); + #if false #if BUILD_DEVELOPMENT var nameOffset = Marshal.OffsetOf(typeof(ProfilerCPU.Event), "Name0"); foreach (var eventsCpu in FlaxEngine.ProfilingTools.EventsCPU) @@ -119,6 +120,7 @@ namespace Cabrito } } +#endif #endif ((Label) control.Control).Text = sb.ToString(); diff --git a/Source/Game/PlayerInput.cs b/Source/Game/PlayerInput.cs new file mode 100644 index 0000000..0a85fc3 --- /dev/null +++ b/Source/Game/PlayerInput.cs @@ -0,0 +1,189 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Runtime.InteropServices; +using FlaxEngine; + +namespace Game +{ + [StructLayout(LayoutKind.Sequential)] + public struct PlayerInputState + { + public float viewDeltaX, viewDeltaY; + public float moveForward; + public float moveRight; + public bool attacking; + public bool jumping; + } + + [StructLayout(LayoutKind.Sequential)] + public struct PlayerActorState + { + public Vector3 position; + public Vector3 velocity; + public Quaternion orientation; + public float viewYaw, viewPitch, viewRoll; + } + + [StructLayout(LayoutKind.Sequential)] + public struct PlayerState + { + public PlayerInputState input; + public PlayerActorState actor; + } + + public class PlayerInput + { + public PlayerState lastState; + public PlayerState currentState; + public int frame; + + private const byte DemoVer = 1; + + private List buffer = new List(); + + private bool demoPlayback = false; + private bool demoRecording = true; + + private string demoPath = @"C:\dev\GoakeFlax\testdemo.gdem"; + + public void OpenDemo() + { + if (!File.Exists(demoPath)) + return; + + T RawDeserialize(byte[] rawData, int position) + { + int rawsize = Marshal.SizeOf(typeof(T)); + if (rawsize > rawData.Length - position) + throw new ArgumentException("Not enough data to fill struct. Array length from position: "+(rawData.Length-position) + ", Struct length: "+rawsize); + IntPtr buffer = Marshal.AllocHGlobal(rawsize); + Marshal.Copy(rawData, position, buffer, rawsize); + T retobj = (T)Marshal.PtrToStructure(buffer, typeof(T)); + Marshal.FreeHGlobal(buffer); + return retobj; + } + + var stream = File.OpenRead(demoPath); + var ver = (int)stream.ReadByte(); + if (ver != DemoVer) + { + Console.WriteLine("demover doesn't match: " + ver + " != " + DemoVer); + stream.Close(); + return; + } + + while (true) + { + var expectedSize = Marshal.SizeOf(typeof(PlayerInputState)); + byte[] b = new byte[expectedSize]; + var readBytes = stream.Read(b, 0, b.Length); + if (readBytes < expectedSize) + break; + + buffer.Add(RawDeserialize(b, 0)); + } + + Console.WriteLine("demo numstates: " + buffer.Count); + + demoPlayback = true; + demoRecording = false; + } + + public void OnUpdate() + { + lastState = currentState; + + // Record camera angles here? + if (!demoPlayback) + { + currentState.input.viewDeltaX = InputManager.GetAxisRaw("Mouse X"); + currentState.input.viewDeltaY = InputManager.GetAxisRaw("Mouse Y"); + } + } + + public void OnFixedUpdate() + { + // Record intent here + + if (!demoPlayback) + { + currentState.input.moveForward = InputManager.GetAxis("Vertical"); + currentState.input.moveRight = InputManager.GetAxis("Horizontal"); + currentState.input.attacking = InputManager.GetAction("Attack"); + currentState.input.jumping = InputManager.GetAction("Jump"); + } + } + + public void OnEndFrame() + { + if (demoRecording) + buffer.Add(currentState.input); + + frame++; + + if (demoPlayback) + { + if (frame < buffer.Count) + { + //var actorState = currentState.actor; + currentState.input = buffer[frame]; + //currentState.actor = actorState; + } + else + { + Console.WriteLine("demo ended"); + demoPlayback = false; + } + } + } + + public void RecordCurrentActorState(PlayerActorState actorState) + { + currentState.actor = actorState; + } + + public PlayerInputState GetCurrentInputState() + { + return currentState.input; + } + + public PlayerActorState GetCurrentActorState() + { + return currentState.actor; + } + + public void Flush() + { + if (!demoRecording) + return; + + var stream = File.Open(demoPath, FileMode.Create, FileAccess.Write); + //stream.Position = 0; + //stream.SetLength(0); + stream.WriteByte(DemoVer); + + byte[] RawSerialize(object anything) + { + int rawSize = Marshal.SizeOf(anything); + IntPtr buffer = Marshal.AllocHGlobal(rawSize); + Marshal.StructureToPtr(anything, buffer, false); + byte[] rawDatas = new byte[rawSize]; + Marshal.Copy(buffer, rawDatas, 0, rawSize); + Marshal.FreeHGlobal(buffer); + return rawDatas; + } + + foreach (var state in buffer) + { + var bytes = RawSerialize(state); + stream.Write(bytes, 0, bytes.Length * sizeof(byte)); + } + + stream.Close(); + + Debug.Write(LogType.Info, "demo, wrote states: " + buffer.Count); + } + } +} \ No newline at end of file diff --git a/Source/Game/PlayerMovement.cs b/Source/Game/PlayerMovement.cs index c6d06eb..8d767de 100644 --- a/Source/Game/PlayerMovement.cs +++ b/Source/Game/PlayerMovement.cs @@ -5,6 +5,7 @@ using System.Diagnostics; using System.Threading.Tasks; using FlaxEngine.Assertions; using Console = Cabrito.Console; +using Debug = FlaxEngine.Debug; using Object = FlaxEngine.Object; namespace Game @@ -45,11 +46,14 @@ namespace Game private Actor rootActor; private RigidBody rigidBody; + private PlayerInput input; public override void OnAwake() { base.OnAwake(); + input = new PlayerInput(); + onExit.Triggered += () => { if (Console.IsSafeToQuit) @@ -62,6 +66,16 @@ namespace Game //rigidBody.CollisionEnter += OnCollisionEnter; //rigidBody.TriggerEnter += OnTriggerEnter; //rigidBody.TriggerExit += OnTriggerExit; + + input.OpenDemo(); + } + + public override void OnDisable() + { + base.OnDisable(); + + if (input != null) + input.Flush(); } private List touchingActors = new List(); @@ -103,6 +117,68 @@ namespace Game viewRoll = initialEulerAngles.Z; } + public override void OnUpdate() + { + input.OnUpdate(); + + if (input.frame > 0) + { + PlayerActorState actorState = input.GetCurrentActorState(); + Actor.Position = actorState.position; + currentVelocity = actorState.velocity; + viewYaw = actorState.viewYaw; + viewPitch = actorState.viewPitch; + viewRoll = actorState.viewRoll; + } + + PlayerInputState inputState = input.GetCurrentInputState(); + + // Update camera view + float xAxis = inputState.viewDeltaX; + float yAxis = inputState.viewDeltaY; + if (xAxis != 0.0f || yAxis != 0.0f) + { + var camera = rootActor.GetChild(); + + viewPitch = Mathf.Clamp(viewPitch + yAxis, -90.0f, 90.0f); + viewYaw += xAxis; + + + // root orientation must be set first + rootActor.Orientation = Quaternion.Euler(0, viewYaw, 0); + camera.Orientation = Quaternion.Euler(viewPitch, viewYaw, viewRoll); + } + + input.RecordCurrentActorState(new PlayerActorState() + { + position = Actor.Position, + velocity = currentVelocity, + viewYaw = viewYaw, + viewPitch = viewPitch, + viewRoll = viewRoll + }); + } + + public override void OnFixedUpdate() + { + input.OnFixedUpdate(); + PlayerInputState inputState = input.GetCurrentInputState(); + + SimulatePlayerMovement(inputState); + + input.RecordCurrentActorState(new PlayerActorState() + { + position = Actor.Position, + velocity = currentVelocity, + viewYaw = viewYaw, + viewPitch = viewPitch, + viewRoll = viewRoll + }); + input.OnEndFrame(); + } + + + private bool SweepPlayerCollider(Vector3 start, Vector3 end, out RayCastHit[] hits) { Vector3 delta = end - start; @@ -560,25 +636,6 @@ namespace Game return slideMoveHit; } - public override void OnUpdate() - { - float xAxis = InputManager.GetAxisRaw("Mouse X"); - float yAxis = InputManager.GetAxisRaw("Mouse Y"); - if (xAxis != 0.0f || yAxis != 0.0f) - { - var camera = rootActor.GetChild(); - - viewPitch += yAxis; - viewYaw += xAxis; - - viewPitch = Mathf.Clamp(viewPitch, -90.0f, 90.0f); - - // root orientation must be set first - rootActor.Orientation = Quaternion.Euler(0, viewYaw, 0); - camera.Orientation = Quaternion.Euler(viewPitch, viewYaw, viewRoll); - } - } - [ReadOnly] public bool onGround = false; /* @@ -643,12 +700,12 @@ namespace Game private Vector3 currentVelocity; - public override void OnFixedUpdate() + public void SimulatePlayerMovement(PlayerInputState inputState) { Transform rootTrans = rootActor.Transform; Vector3 inputDirection = - new Vector3(InputManager.GetAxis("Horizontal"), 0.0f, InputManager.GetAxis("Vertical")); + new Vector3(inputState.moveRight, 0.0f, inputState.moveForward); Vector3 moveDirection = rootTrans.TransformDirection(inputDirection); Vector3 position = rigidBody.Position; @@ -698,7 +755,7 @@ namespace Game // TODO: snap to ground here - bool jumpAction = InputManager.GetAction("Jump"); + bool jumpAction = inputState.jumping; if (jumped && !jumpAction) jumped = false; // jump released