From 040baa6e5d480e8e44873afa5c744a9eb6cca301 Mon Sep 17 00:00:00 2001 From: Jakob MG Date: Sun, 20 Mar 2011 20:46:26 +0100 Subject: [PATCH] New branch, old was br0ked. new aux. crosshait system. --- effectinfo.txt | 181 +++++- gfx/vehicles/dropcross.tga | Bin 0 -> 262188 bytes gfx/vehicles/raptor.tga | Bin 0 -> 211644 bytes gfx/vehicles/raptor_bombs.tga | Bin 0 -> 211644 bytes gfx/vehicles/raptor_cross.tga | Bin 0 -> 16428 bytes gfx/vehicles/raptor_guns.tga | Bin 0 -> 211644 bytes gfx/vehicles/sb_bullets.tga | Bin 0 -> 14636 bytes gfx/vehicles/sb_cells.tga | Bin 0 -> 14636 bytes gfx/vehicles/sb_rocket.tga | Bin 0 -> 14636 bytes gfx/vehicles/sbot-xhair.tga | Bin 0 -> 16428 bytes gfx/vehicles/sbot-xhair2.tga | Bin 0 -> 16428 bytes qcsrc/client/Main.qc | 5 +- qcsrc/client/View.qc | 353 +---------- qcsrc/client/casings.qc | 2 +- qcsrc/client/progs.src | 2 +- qcsrc/client/vehicles/racer.qc | 0 qcsrc/client/vehicles/raptor.qc | 0 qcsrc/client/vehicles/spiderbot.qc | 0 qcsrc/client/vehicles/vehicles.qc | 398 ++++++++++++ qcsrc/common/constants.qh | 1 + qcsrc/qc-client.cbp | 8 + qcsrc/server/autocvars.qh | 62 -- qcsrc/server/vehicles/racer.qc | 757 ++++++++--------------- qcsrc/server/vehicles/raptor.qc | 959 +++++++++++------------------ qcsrc/server/vehicles/spiderbot.qc | 538 ++++++++-------- qcsrc/server/vehicles/vehicles.qc | 426 +++++++++++-- qcsrc/server/vehicles/vehicles.qh | 20 +- qcsrc/server/w_common.qc | 3 +- vehicle_racer.cfg | 81 ++- vehicle_raptor.cfg | 68 +- vehicle_spiderbot.cfg | 17 +- vehicles.cfg | 7 + 32 files changed, 1994 insertions(+), 1894 deletions(-) create mode 100644 gfx/vehicles/dropcross.tga create mode 100644 gfx/vehicles/raptor.tga create mode 100644 gfx/vehicles/raptor_bombs.tga create mode 100644 gfx/vehicles/raptor_cross.tga create mode 100644 gfx/vehicles/raptor_guns.tga create mode 100644 gfx/vehicles/sb_bullets.tga create mode 100644 gfx/vehicles/sb_cells.tga create mode 100644 gfx/vehicles/sb_rocket.tga create mode 100644 gfx/vehicles/sbot-xhair.tga create mode 100644 gfx/vehicles/sbot-xhair2.tga create mode 100644 qcsrc/client/vehicles/racer.qc create mode 100644 qcsrc/client/vehicles/raptor.qc create mode 100644 qcsrc/client/vehicles/spiderbot.qc create mode 100644 qcsrc/client/vehicles/vehicles.qc create mode 100644 vehicles.cfg diff --git a/effectinfo.txt b/effectinfo.txt index bb44e5b4d..c6ba57308 100644 --- a/effectinfo.txt +++ b/effectinfo.txt @@ -3889,7 +3889,7 @@ effect TE_TEI_G3RED_HIT trailspacing 40 type static color 0xFF0000 0xFF0011 -size 10 10 +size 10 10 sizeincrease -6 alpha 256 256 512 airfriction -4 @@ -3941,14 +3941,14 @@ effect TE_TEI_G3BLUE_HIT trailspacing 40 type static color 0x0000FF 0x1100FF -size 10 10 +size 10 10 sizeincrease -6 alpha 256 256 512 airfriction -4 //liquidfriction -4 type smoke -// Yellow +// Yellow effect TE_TEI_G3YELLOW countabsolute 1 type beam @@ -3990,7 +3990,7 @@ effect TE_TEI_G3YELLOW_HIT trailspacing 40 type static color 0xffff00 0xffff11 -size 10 10 +size 10 10 sizeincrease -6 alpha 256 256 512 airfriction -4 @@ -4044,7 +4044,7 @@ effect TE_TEI_G3PINK_HIT trailspacing 40 type static color 0xFF00FF 0xFF11FF -size 10 10 +size 10 10 sizeincrease -6 alpha 256 256 512 airfriction -4 @@ -4107,10 +4107,10 @@ originjitter 3 3 3 velocitymultiplier 2 staincolor 0x808080 0x808080 staintex 16 24 - + // effect for removing player model // "teleport" - + // cl_gentle deathfx // used in qcsrc/client/gibs.qc: pointparticles(particleeffectnum("damage_dissolve"), org, vel, amount) // small core blood no decals @@ -5194,3 +5194,170 @@ velocityjitter 0 0 5 velocitymultiplier 15 airfriction -1 rotate 0 360 -180 180 + +// ---------------vechicles + +effect spiderbot_minigun_trail +notunderwater +trailspacing 10 +type smoke +color 0xd0d0a0 0xffffff +tex 0 8 +size 1 2 +alpha 20 50 100 +sizeincrease 2 +velocityjitter 5 5 5 +gravity -0.03 +airfriction 1 + +effect spiderbot_minigun_muzzleflash +count 3 +type spark +color 0xff9c00 0xff8400 +tex 43 43 +size 5 7 +alpha 256 512 6280 +airfriction 10 +originjitter 2 2 2 +velocityjitter 150 150 150 +velocitymultiplier 0.2 +sizeincrease -100 +stretchfactor 1.3 +rotate -180 180 4000 -4000 +// fire +effect spiderbot_minigun_muzzleflash +count 6 +type spark +color 0xff9c00 0xff8400 +tex 8 15 +size 5 7 +alpha 256 512 6280 +airfriction 12 +originjitter 2 2 2 +velocityjitter 200 200 200 +velocitymultiplier 0.2 +sizeincrease -10 +stretchfactor 0.8 +effect spiderbot_minigun_muzzleflash +countabsolute 2 +type static +tex 43 43 +color 0xff9c00 0xf6ff00 +size 32 32 +alpha 256 512 6680 +sizeincrease -100 +stretchfactor 0.1 +rotate -180 180 4000 -4000 + +effect spiderbot_minigun_impact +countabsolute 1 +type static +tex 65 65 +color 0xff9c00 0xf6ff00 +size 52 52 +alpha 50 100 1680 +sizeincrease -100 +stretchfactor 0.1 +rotate -180 180 4000 -4000 +effect spiderbot_minigun_impact +count 7 +type spark +color 0xff9c00 0xff8400 +tex 43 43 +size 5 9 +alpha 256 512 6280 +airfriction 10 +originjitter 2 2 2 +velocityjitter 250 250 150 +velocitymultiplier 0.2 +sizeincrease 100 +stretchfactor 1.2 +airfriction 6 +rotate -180 180 4000 -4000 +effect spiderbot_minigun_impact +count 10 +type smoke +color 0xd0d0a0 0xffffff +tex 0 8 +size 10 20 +alpha 20 50 100 +sizeincrease 80 +velocityjitter 50 50 150 +velocitymultiplier 0.15 +gravity 1.1 +airfriction 6 +rotate -180 180 0 0 +// derbis +effect spiderbot_minigun_impact +notunderwater +count 8 +type alphastatic +tex 66 68 +color 0xffa35b 0xfff2be +size 2 5 +alpha 644 756 1484 +gravity 1.1 +airfriction 0.4 +sizeincrease -10 +velocitymultiplier 0.1 +originjitter 16 16 16 +velocityjitter 124 124 224 +rotate -180 180 -1000 1000 + +effect wakizashi_gun_impact +count 3 +type spark +color 0xff9c00 0xff8400 +tex 43 43 +size 5 7 +alpha 256 512 6280 +airfriction 10 +originjitter 2 2 2 +velocityjitter 150 150 150 +velocitymultiplier 0.2 +sizeincrease -100 +stretchfactor 1.3 +rotate -180 180 4000 -4000 + +effect wakizashi_gun_muzzleflash +count 6 +type spark +color 0xff9c00 0xff8400 +tex 8 15 +size 5 7 +alpha 256 512 6280 +airfriction 12 +originjitter 2 2 2 +velocityjitter 200 200 200 +velocitymultiplier 0.2 +sizeincrease -10 +stretchfactor 0.8 + +raptor_cannon_impact +count 3 +type spark +color 0xff9c00 0xff8400 +tex 43 43 +size 5 7 +alpha 256 512 6280 +airfriction 10 +originjitter 2 2 2 +velocityjitter 150 150 150 +velocitymultiplier 0.2 +sizeincrease -100 +stretchfactor 1.3 +rotate -180 180 4000 -4000 + +raptor_cannon_muzzleflash +count 6 +type spark +color 0xff9c00 0xff8400 +tex 8 15 +size 5 7 +alpha 256 512 6280 +airfriction 12 +originjitter 2 2 2 +velocityjitter 200 200 200 +velocitymultiplier 0.2 +sizeincrease -10 +stretchfactor 0.8 diff --git a/gfx/vehicles/dropcross.tga b/gfx/vehicles/dropcross.tga new file mode 100644 index 0000000000000000000000000000000000000000..b5b6e9416c00488cc11f408c65f182f20485378c GIT binary patch literal 262188 zcmeI53EWlF`uP3gUMiueq);IVm6E7P$`Fx6ijtJMREVx2LM4$)8B;fk3^yuM<{?v3 znJaD)*E|#I%D?~fecztfa-3oBv!`{=S^M*;ecrv-dgitF+G{<-1{+k`pyK$y4gRnG zCKZ3VA0;P&b;eP0%sYmi1WH^2#_(TP;-YZuI|-DW1l;&9Ih8wxodhZ*;KqN2DBKSx zfs&Je8~-Jza>uZfK!pU{_^%L!`{5)|auRUkzvNWz7qKjsKEUxntN#ph5y}{8xy={csW}ISIJ&UvesU3_A%_ zNWhK%3Q@QpP68z-0XP0jPUVhaCxHqHxba^h3ircFpyVXr#(&AF+%fDVP$2;~{wqY` zemDt~oCMtXFFBPvhMfc|B;dw>g(%z)CxMcafE)iMr*g-zlR$+8-1x5$h5O+oP;wG* zHS!%hMf5^&?cLKNWWsQ@LZf z$Rx1QMjQQYhaGmP)4qNC-H$u&xC75Q=bS#{#*I67>eQ)MKltE-x4-z}i;uqj_S>(l zT)A@D*I$4A>8e$$e)!-2{ zHbP@vYX#^Ca}p>J2~@9MebWODIG{Q2+&k{LWBlU9i=SV+cI|KJ#`kZ({r12A{O3P! zG8XT=^Umw8zWVC(&OP_sK7IT4?cAkHm%ZDxX|v0&yY9N395uJxa?8!CR;^m)Z-4vS z-%VI@tuptd%~rIf4}F0FEMNi~9N+?{*nj{^ofhJWUkdj)O;d^^4E;_IwNV=+UEt?Q}Z&?2*9cn{U49 z;fEi-&sA4lb*_ACKceGB&)y?y%hIks`Nl|bdnl{aBtJ%0T7 z;foe6dfprxvLyHWOE0}NmwP>X_Uyl_z0ofoUWEB@ZLGkRq`|kCZELrlJ@&Qk>W^!my zxUPTUOMv-3`(><~ne*UZe)(k;`)Yja@3F@o4U^(jZI*KqGzjlIuqJ>kL?%BeJ;(}~ ziR?Pr{C%*o9MGwBzx(dH3-;S@zul6MrNe2D1R6DJw2iEppYZ(i&p)WP!TFU}UU~eo z%Pt$(u3fubZJ^eqEopj?39=CxJ!aA+GMvNy12RpTMiYPCx^=g_|Ni?YnY7AUXcx1M z`(0WR;9Y+C<(Ch7=bd+6Rl8t*ukSM3_Q8}!&bDX@8Lgi)U61UPMv>`!WSiuC$&`^i ztIkx~zWnmb|1y`WQl&~ku3wmZx!?XJu;-q8?!+G0^5x4b_Ux7|Teb*4ynXlG*V_4@ z+AnASTu0vn+2MC6vRtgRB4cEY%%i8^uNXGlY_qDDTyn{2Yu2p!RcX5N$}7+QYfE>f z*d-uqKiiKQHR>#L+_R?79uRB7w)3y{%h_gHk)_D=WcCV_W|8^ZBKyJUAWqtQ_3G7W z_3G6>LkB)k)2C1WXT5s$wu+MmhbvhL;BPa0`0$h7dh4y1)gBitSnw1+unikFjC9W~ zOwN^d&SAoh3YN&WHongy>!+1=bbv1KM~VtBaPgOveZBS{e)!=M#XWQ8%t=w=bg=D` z06tzPope%{XP$ZH0kwfQ-+c3>3of{zKelNXwYjNL9ysT2ZBGkijm(j~@_k4owr#2!tQ4kaBsc5FUv+O%s`|HQtG88c?+ZoBOk>-;lJi7PLh z!-N|bEM$)k%or$iB)ZxoOd7yLtkv&wAglTF=RdLi_S@&>a~&pKg$}D)wQ5z?&*z@% z*RS7UHuAI0Hrvz~F=E82GVfc8?&X_r&E(0GuiStC{hQfHuOFJ=M-M;!Y-@`y&#d`7t$)Re6>k%>kS{#f?+*#!8;4&9Yv-Dag6}K*V3GSDE#v>iJAdTJk!ODK#TOrA zOP_r5$#VJo44L!Qil3V3FzPtr937T;Au}&WccQZu@P!W1o!_~D?DK87=iW?hopl#c>ZDRV#t$zmeP0Cm1zyl9#@xTKQOje!q`_MxVZC#9-P#!rK8-Jp+ zy+n7nDUaw8-FoG7$dDnu$cIFK{E;ub@WKIq|NGxJ_S)aI^DY5=KOcYm@q2Wh_0vy3 zeRs<(w_FkDnz}rSDh(Pms0V&K=$v=Hd_$gAt5&Vey>n7nE#Xs-!lK+8wW7N%SO?I# z0DeU17+q(AfKNa1Nh%l4_4@0tzesWO zEDG}77>-1uhoby)jviZb7|^BY^j_r`U5n1^q@(DNLk?-B-+io2-E+@9HNw4b~yVHZHa;*5nUr!~Lb>fpfT! z?SqC+8TY!@gwDyYrj+70aKsTuv?2GY%7yRJEw{pG8vrHWnx;P|zD2|z zRH{@dw0uhuvsN_V$wSHBfIN%K_S~^g_6f*E85Wa#>mXM>!jfwtz(LpO z9Nw{kYp%KGeE!zC0nZ1?W0qK6hC+~G)HISyj=WLtzyJOlYNO;?IpKs84%u|mP4nI# ztWl%JX2feLO!Cw=Yu2nm)cn{8UuD4AM*5$+Nl4_maIB`93&>{aL?!*RNl{7Hf*Cb8=9!M(h_(v9wn?a4r^}{P4kg zlNnR^>#x7A8a#M#FF!C`+vp`goCUsjYOmy5AXm)RTW?+6D|T|)Yp$kmzWL_!^UpuO zpVz*{+D_$Js^g#B0;UZ3O`dXWrC4=dsC>0((PD?Y@4kDY`ecZ&z-nSWcHD8twEH+F zpDkOq+);f&KKS5+cTYLxlq1dirTW{n{Zf;`fB^%JkZ=EwkipMC|NJAq!q^6X<12*C zl$uOz=a={W%{SkCxz@p9fA+4s?wY`}0bjy&^zXITUX31l=%G8%D>0komP*&I6t5u@ zJxYmxp8v`>XQ^E>S@!wLa zqrXQUdE`#oy!P5_&y<2sPpS;E{f%7o$kwiy?qL(uP=asXALQ^b{d=$xY=!&Sj1r)<0sBgpr=`U#;c)(G+6kP;GQIT)G0>3g4e?ZXZ`tSEi>v&kvfJ>;fGuC~Q+ zU;O`D;@7P_^RAbD|G(sG5?k3Do1q;x!`_~-}^kv(WiYJ zBu|l!1J21)6DMU(#YM9zuefj~foJN}saGqn-+lMpm#3X} z+EMbE=qb+(>&3b+fbWR-kGXh&B$Su~XVa!l>yw{F^~|2m#EBC}c-bG!0lH{!tE@N| zBa`@gQiu4*AAkH79@#TK{q)n1^2;mx1^A2r!{z$-E4_HylQ#(ca7cdkU&?>2TX)}m z_ucHC0qJ$1GUA-RMPXl+9Ki!j9_4*-NxpeyWWD)Bg+=U0VN0gCs3(R?eK~Hp;f71E zyY9LRdHs9OPT!I`?Tud-~BIIK*86SKxd0xsHaz+)#V; z=+U8^tMdP4-G6o%d1SCHjTsV~n@8@5+|;-hQAvOtE}FZ8_)Rm8k99$b<>;yN0xW@; z?h{Wu@z5aggHiF44_tC6GbYJfFlo}HG5A3I@WT(^n6@AGZ{UMR@Qns9_-(3txyvrQ z)RTR?vid;e>&J(Oe6IP(H(eiWOk;7T(CX9?RXDm>x=&n{vNdFV2(@tAT`{x^|R%k zykoXz4O-%#ZutE3&&y&~$~h^IU16;AEM&h^#z13g)Ow*^VQ}`+9=N~<4|dNpLDyLn zme9A7I4$UfZZB}dXd`)gDyh#Gw8%4QzL!1zd~suQ*dDmB#eCtoe*PtZAE)N&#SU{p zAeV^Ljo;z^`|qEGzBpJHWN(PIf?WNRx{nVUdzj2`%Be2@AOCf7rQ-h>#4pW+nJW(~kg-ym&x=7JMj^pjgW2+mUP%eNfTmc;+$@?(!Z_JG>8Ylo7vq#Sbj z|Ji8rdQa%84t@B^q&~CY2fm_s-s-wMoUl(%?*2H|c(6TkMS~Zc^jl-Zt6W{XKO{hH z7vxP&_k7~{nDdVvJN9fdc8F&}(sev*)~vbtnP;APj9FV4K8Zi!dK7bM;Op^+gv0p- zz0j>OSc(V!JU0u3#i9Jq;HA>!#x~2?0;-CI0>wD?eH2>ft_%Cqj5gb}( z2=DJJJg8*KYLC2yp#S6&Ha^5 z0_at1aWdBmnzxU&ELo%KYR*$-jqnAY0jw9Kqao~Tj0^k|u^kTbn&G3CE|)>rxPe!W zwfz4m;HScbFV+L#Q*pz;-{%}Tx!Kn-b;rJZD!#b>#ujz$5gSe7859?bll9FPZc@d6h)X&yNGlf#p>9WQ;OY9lt;TE7E=%uS=BuaMyq-zVd; ztQG*@|6%fipAh>*FTVKVqu3G$`-AuoQi~)^T)@JQ?u8d#c(@$Xx^=9J9ewoC?Zd|7 z1)kEt*-QJd+rYQE&WT)*Pc}T{?3J2Ovt;Y7EFUz!eYU)Bb#01wh}dk=`4+C$;vMr z=+MJ&->}*X|J6hey^#mBkb@gJiM;-j*Hz;9>*05+G!y4_h}7!~i zFJ53PpPaq4kFpK&KrTuX@zCQ;^2XI4EZ9AnDJld&Ye3W-#n1So2#!9>s5SLkiRevUUK2kvBWu7 z+c@qc7v!VsddLm=;g>vp`t*OA^okGn(Q(j}4-R~xpq0H&^3~=8!}Zx+c_je~%xU&9>O8#vWtC<~{e@n*{L5lX|RWx!A{y88g&d zukc#or$*c>F(f)h$TQfhSFcXFu&`!u(@i&x)P6VKc;iSveu}x^hjm}+;~W;uu;7Ti z>JnpU(#UTw{@!8H5Co3c>=5Xsrm#)^r9pU#v+t-;qs~Hp#O#W1ULy6Fh!G@@gqdHI zST}rJ@!Lr!5B%Y^&Y1WZel5?ClWm#rr_zgj^+>&E!{7MulcQg0r^)@7wlU#}#LrXk*U@pCDP|dtGVNI75-|ZNzffL~kZqH2)a3%(r8v zcJBJ0C4g@(dS9?$!Bgq#GyJ)AJb$%n)#@)bNLeFLKX%6c?Af#b1>MA+O5WI<-wE+h zo*4_Y>XErs{CCK)q2JHY$9mu;mt1lha^-L2jJ)Hg%pXQ<7aN9VY}#M%(rk@h<$3uQ zGCS|Q^G>u$3gnU?o<;ZYc_-m_N_?xn_whyR)~(yVHqo7l7G$hPrZ#b3Cx6HjPdst2 z)_9ct{uk6Q5V>l-ZsZ*#_Bk%T#D@DKV{Ez*o>_6pB@-U<%^)xIY|Fdfq?NrW*7nFP z1)Y2o=<|xT0kP3`W_z1|L%$w2&`DggS*HWqQrBB~1|Vndt*^;Z+XmV*(SQx>GmHJ8 zOzqtD4K`qn{GE5+c@^EVZf2`Y&?&xw>_tHF6q_y!`)k_v5@K z>#3Dl+t>Zlk3atS{Y*JL%$giLi>d7uC#`;Qv5$n5#kS|Oui>|UskA@$+;jUNC-M7O z+@whpPq83L$);-6s#PS0_21B|hr|#(g5P(cBYB)d8+sbROG&U|NZyhAa}0q^HSukhw>KZnb^yL0|)kyJ^s~72Y$Z9WqY9m zzY63}U-Th*u_hKMm40j*+lE$bJ@tO6|1E1d*CQL&bZnLdaeU&-TjraJPcLg0x?fEm zUR@U?en8d(2IX6CDh?SSZ$09`mx^P*{r209`4Th`GsC_f@=a}*?Qi6d9)Q8wZ~ttt z!@j3}VYb_N*nH=L$G)1brP=;$BsLXWlRfFTQr|btn>TMLaROzwNE`B6uh!a1te8lcCPg4A^yzPz957Up9bGlYKp_K&N*&T+BzDC!c##Yfn9#E+(I zeN=4Vahus_BXR*fHIAN$^W@4Yd}x)|x`&Y9Xoah-T- zvnC7v)#UW?8e5f)CgKL+gZ+bCIYiR+kK-D)jg3PmHXjF0+i}P;&nENc%`02?qb7%~ z^x}h}d3zY&*?jtWk5PkE^NjNhm^pLiB#9wz6vW2EmJN2ON7%44!COCHpRWEr;wQZ% zjCUdW(EI`DN%U1O6AejT7aK3jUoAHOke4;iBx#KUH~BWPL2|*hYu9eqIB@2JgZy;R zNuC-nxjV>7h0iMa3hBqeJCE8W`QVSDPdQcP|3?8o6(;+lX1-JM_pn#O`blcreEvo+ znnwtIuYKj0NkRPD+sD*rz!9153Qiqz@QT>a!%BmcMF59^G6;E1&s zzj=kjq9GR?Y#kc0{akH}`9Axg>KjSUT^o7j`$XSaDf@1>pIN z9M~7NH8z5G6f`nt3zDaooaN>-fcQ4@*bq;U$xfoa4qtjiiK|baJ_l8EwucwYPI7gt->@zlqceDy)_vggIO zAH0f>z*@!~-@oiv`JGb)p~LK}W1q8mJ<5XY~vdaUYp=cbA6kD99QeNRY%tqJ{TsY` zgpCV-SL$FWeEg;485irGoapTm@T12#<{W-xC^p{&+lM~Jf}g&{&{oz!%KSB??&e$@ z`O)uwYF0*(dw8p@w%T0ge&=W%E8dUPjv&8XTs{KWo*rT9fW3HfrYmgxd#KY9S6xNr z1-)s_Q5)9*s5y&_7z;{sshnrbm@yIFZQTRW?=$(1yfP}C;14!v(4ZbGR;+jjS#U64 zmV837)FCd%SpI)lJnp#Tj&)>z>kfUl5zj|$ys+T=g`?{LHm))0-Zx{xFJFb+9=lh6 zZSw2d#tZqpbZkVuKFd3i_*Y#Y2QTkS;s=A)AeHaRO86WCi`*K-CXio6-ie%gp zu{HzW#6iTh9^{7y{ca@JpPzpDww1lGjfr7-_0?COL@pexU9nFr``0<+;8XG92Y2bE zm!3g9VmY+@|0iBuV4a@J=aFX>zO5SL%J&RD`Kh!e@i%%z0%5P?1my+W*SNQ^)|Z3Q z6i0vc(PD2V4t#!apc9>&;G^TGZ_u{l8{C3tfX`4ttNRM{-T>?I~@Jr7eAw4&X4Zsf{Q&_DRPl z?|ItkLA^Fx_TA7UbfH(#?_cVQrsF5BYm5PClQGdJE}Ti@A!jZ;+vuZ>KRUFnw-sNp z=wZl}I3vx403F1|<15E{VJ7&*&yWXC*AnSR3=HuHL2{|k7Z@7%1YB?kuFC{xBcBa$T$eF$2z1Gqn3n|pxN%Axd_BGm z;hB6HapTX1j~IQa?eh_|QR6FH+oYj z+7#0@t%ove)~w04@x@+0dSLC!7TV;UTbX<|Y9qw8s8201M6&MID+yZh@sS#cCu^N9 z)(GN!2Ia#udPTqZ1mx2{sy;Fnra%{CBPtxWz*T$tMfSB!B^ zZVSzuCA7|mPIBlbB}e8beE+N5$ZN@WNmBIW!mB==(2KrvwU6t**1NRrxfBKe&p!L? zES`0?jWO1`p^LRP8|%u|s#R+X_TQk9cP{lWWPfdoq;m+!{$Vxp8|XZMH3`2yLs8gS zI+*BH>j($g7fA;@$TfW~F*bt0vAr+0s&>-8efy?1(aXL!V+(&5o9I$nc+Wx~-}}@> z#otEcxsl#a`po4{Y}Lb&roaS=fk;?^xC$ks-8(k<&9DS>@^@`n?Dm(RZ%4aouMu zFeadjF%lQvxbg7Lhev#C;>Mi|-^(w*{1~(i7%_uKLA>x*~a{~qTjN-6X+Yg+aNP&&~-7^Qf#3qY&z8M-?sWky7os5 zUeK7kuw{lnKjR7CJN5#@h95ROXjDHz)+@t?9~2(?6+N#&rZ%ksGA5vjF%pzVTl;Gb zRNMUiWq-XaN1bhJf8tNGtH#see`~8=Q|W?MY#G{Z^a(=G(1+erX;12JjRPoz+SmEY zXzJ9dW$!Ynfo@f-lhlzet3O8ln0$GQq8~B5*eSj>Vfyn&L8}Q9S~X^f*kSXY4ZpQc z5cR`tpa&XcOq_tOWsF>H3r%6uq4Pp=!iEhy2t4A|kiGcZTT_3G^?iL$5rY?mza;t! z&8H(%c(84+0zE^UO>v5vCz&ylguddyDY;I|@}1eXE~NgKMk zxvGtlhrT<@)T8j#sspGF)}|Y97)4nxpL()c(l#GR^!5K z%EPRFDmKkg{o0RySHX+lzEQRpJ(rC&VydFV;|Dflg0UfEWT~Hih18ZDlkm9RcH4Q% zXB8K3pMCb(htOqH{57%u(1c%dTyh8-4?ec=054&~4gwE7Ll=4v0w>JAj0tEW-$R&i zZGxrwscfsopfzceti_kAC&|S-AA2BQU+TR=`5W5dfxN;t(Ttv<3%%Py7h?jN7$dgO z6gC}_XL=1hl1CQj_rU26`y_xJKvlnf{jAAVewnW6nik_fQ=25Ni=L}8^3i(|_|xH(F|jc;;qR61elc9r_keA2 zY&Nd{7uovXXExcdvHt(PEp!>{f7U#c!j_H3vD@}elYQWoJbP{0|7Xt(n%w?h*jBi~ z1~%^h>s+ar_y6>rW}E+yjsAaz|Bp3!>imvGTm63w|G!0kd5WsNu9eCdv1+aqCcpSL z@=mkO|JU&Ux2FCAc?gkJk@){wl~d91|DPMCeFuSM`2Q{o0>|dQw#NV182?vf@jq78 z+*H|$-Y45KUX1vkS8SmvY&wW-z{2!JT^VP#<^LsjrsUB43ff%$&-}-h*;DfW zZfaxx-%`l`X>0!Pl>GmVO?yfDx7PgQ+sQV+sdTat8ms7c9=XfYwMp`tk^lc|(R<=G z-c=To|NDBL^D;)P%8je^g>j~~0X#~rgV|xg3loN|^?z6wQokuz|0B4@jru>eQ))?e)LZufnGKe~blc;_+@Q z=K5b64@TYv+vNu$ELXdB?V9xH(W8T|@7i4dQ`i1% z%Bv=0p(bMj{T6fmPwLj%TK}7T)ySXv@V5CUGTzPl-_+XXTD5A`s&Y>9z;CrfhYroC zRYL3n==^rcAieEBb{-n{uklJHMN+;GE8dY{ZQ_ZhW`hcH03eDkH_k3asvN^&G2t8_Tg zEA*k~boZ0G##peCt|;Uo`E2^at4+Sw%I8TZozw-|hzG1)yS6oZLrNcK-ua6bEqWe0 zdFLX}o;`bZG~2}WTfRe%)A#;E4?Q%EdU|iX@y3hL#(^ApK5Q&UTr_3EgFZFR6Fp~Y zm&A3AKPlu~PhRCljh*$jv5@(r*M4!dBQE^&&p$8A1#s-K$99MVr(YZg9duC34?g(d z-L-4i{)Qaoll%7@Z@lqR`3~65FRXmq^UWdakeBNBK64UXGvQgZWXY1(pp65csu3eb zoVL|gTWyvvzA*ZUJ`aE%(eFn#<#~`Xu%SGc7D5|wiDB?+GYn*}w%fdU^MZXNq>_yWy_X3KJv&T)0MVwzy0`IgZ)^W_F~9c_1tsM&4D)F`SN>q)22=9%f3K&_S?A5f$yEH z3mhgjxI^0;02XTv0{f0~EbG>RlRb${u|2I?wc3eifUF1pLLbSo_C0YojT<+vmyce8 z^g)lhzb^W-~j$p0Sw}g6fVAq-~y-O&vf2q zn{8@Lm@r|4=6wVPJ^~FJHrzT>pD3=QM{whJCi<-t1&(}Ss^33jB3~GV)=%RAo_gx3 znKsfsapJ@g*o&-bSrLngA3gMNEMLC-?QY$=?aOy#s_e+CKwFI&qCMZ})Zrz^0X{GC z4Y8-x<=KvWb1ho5*nz!+{rBI$Dc8718`{!Gzwdz~Fux`i0e|FFyxIQVe*5ifia)?b z`mMq|m%6(L9B@Fz^DA5bFz%s8co4l>xIOw>vO1;mdWM zyy}Ao5ALb^gU~`Q82pCFd!4I)ko)LQc^AF!mNY&lrHdIG=}JXp6Fq_>64I zTnxUG+Plid-<&yfrb1tmd&L)Cc;U&=z`?wGKHIq!G!UE%jGIYsXz zuP}L7nUl-E)$9MQ;TknZX+ynk`p`Gi_r2oqdd63gX8?N_hoGs@Q4$B!RBJW4$I!d9Ow#s%}^eBtENk9GEe0|)jX z7p#tzYp%H_bU7((&iT;kw-0**haP%p>(^g@{RPF1?enaWxct!8E0r$MTQij*`qb;T zoUwi6z*w+_rnu-BI&|o9@J{aCxN!Qx!}sws&pa~=8sq+MJo@OP+k;n+*|TT=D~dHU zh0ocKY=XAs`-(LHjd@{hfZQ;A?*xTy_SbbB(c=TQ)trD%%{$FlFzGIZ-Re=C({Tv zH>%n{XYy%y?VoQu6JNeC!sv&e&}ElhHqe~=5I=at5l6J~3m^UH*b=?njQ;$>h`K$t zu09$`?k`8pXD;~SSGuXjvdJ3A@wwV3bzgMU=9_Q6`JC|*g`WogG5X$LAKM>G4mexJ zKYIPU9H*atdUxW5lrFK2=fu~kou62J@@LW?ec3v;bnP4d7z0V!wGDW64}`g|4fJH9 zLH#t}efQl3L409M_{@FDm815~S@!$~m~Eo`ZQ_j*k5}0E2@z*t#t^giO1>lVjOBuZ zUeFJG+2~uY^keJLXzSj$(iz7Ye^O+@_nPF9+cgfH`QTu^TK(XOW7$NGeBhXUc;A`v zG1x<#`&7tX50kE>e@kq`9;|;TZOn$`k}oQjwXb|-EH+t3;@a=T);Kq6 z)My*8u<&`{y=MBq5?_;)?>9W?;gyHD+u`@fdtcXIp?B`wxii#90QsBxKtFNQ=oKHf z4gJ`?5OtcZ(l z*6wsIfV`Kv@QPpSmh4C4;|8DDYtnwt(4j{z`jfuT+TU4copmhv50vJwzWVA@e)G*Q z`Zy|S8nfXimkPEGy|&MBv+)ttJ@!GhHVgh>QQ-*_F7G7ti7y9v@iM`Nx0y3%-b!0N zSpUn^KCbIZ3+K3S2EoJk6S;do{`lkfP1?!tvBef!SiNq9O+zy_Ug~@PnQTC7p!04_ zVm&MqU74Bg4DrWZl0*m%*__YEq0)^f;Cft)klDQ0_6E7p1>B`v0y+{DBy<)lW!}nGlrazH}LThm^N+Nwd65_ z6P~m8-h1y&d+xdCPGRED7nat$!ltq9eBqQ*KdFayHo9D}V8PRcG6z6E=vU_fYLDo?7hG^b|FGaj4TpGjsd;&j`ZA$+vB{5Z^+kt1J))LPKJf9Y z;M-YaWm#v@I%BEu#7CeCK6R$-@wGeVm}B;rWtc?#Y_VPBi!F;y@0d!n`#ZA)blr?N z@HlJRWu_?i9rgpXzPXMo&iJUvx=-EQ5aMlN(iku1+}My8zEw)2d{2#Jtu<@7@P%JOKPj{NOTb>q`B> z*z$m}7XfZ;7+dyAyKDD{1cnbEe$smVy%%>5?mwvT_DgHaLoWxkGw;Mt5Pt@)5i=xl zYQ4Ss3wy(ye=BIxBY!C2^+Ybj@gXPZLT>r^^=-7#Mt{S%5+7mZkF{88nc+(u9>wV) zVXImf9Xm+h%3aMR0p6*a7mM+gt9=spC2h^d;(O9xzdMOhOZD-kHn~&D|EYP#@xQ(G)>}vIw9`(WW47|aFSa@s9BG;Tq<3NzsuBujX-uMvf^{ri@Kj%YuC>e1DkF(vELba*2@xC==|c zuS16(QRB)4AO6YNrQhtx2RR|HOnv-ZXU%}USaUxH9c{PWb~XLL@!D2w^dNoSV7p%X zxpwI#z+8^~UF`J9C!f4e>Pco@14<7inyb{4(|T5X_cKRHH}*~JtWRkkA$THJWt4e^ zP28!!!LLW^y*U1cZ_U*S9mpk$+#SSS${OrtGB^7UJm`vV1Bu1nJxo5Sbt*RcZ*X9< zV!N@fIfluLO|ZxZCAsjIB3IexJ;Mgtx_0f_*7QNAUar^L73>G%!>&0%B)82f>I=kG zV?^bLJoV6Pah$2m0l%6D3ppSUkxOLx&hfh>zC>z}E?1t(y-!@8glL44e;*$NU{klj ztj`{YOp6`Ih!G>oas;72YRDzYuYA+h)I2V~%kkWE&&}3+6n^L;KP@rAYLDz0P_rto zwNAy$*$>_MwuLYFgHOdxZuPkG^pan6{WD;N;wLVL8Uf5R^W}?vVv~DmePe7j2rSq4 zuM)tg8y{Nq_P_%VOs-X{R&0AYCN79;fFJl$e8TU);ak{`)i;Md8R`nCPd@apSJ*aHYk3pJ{wPTeuO-+?W05Zlgm zSq}?6uT?pQ^8bUL1zljI_;79n~BDGJPe@iUUzC6dZ?gDcX;&W=(u3g

6Bxy>|)dHx}Okamu=G-MTf{pVDWy-0K&bsiV$WD_%-I+m6$ zUAl<92F8>4!{@zbru=ZuSL^uWLkIK-T?e-y+PfVWlfSfUel&c z>*vCa?THQE1JBr`*yfhG`ndbSC2-(@2ewq7I>`-tad3#4A>flXc<|t!%M0Y`|>%g(v>AeCDaj$X@l1};7|-~pfDonz+Y1Ri-f zgw7kFH>^GUY&3;&kN81+4s<^PKJK~ao*UVZV4jc(2YHEUi!F*xw#d}ZT@POZg9Z)i zf$aHy<9GNN${|WUs>8se2l2h~Es)rAp4|8Nm9U$hxh@Q^0*CaM~tganIX@61jT*$EHv0O=?zcSB!D~h#p_J%dr6!tFhJQLzx zug<0;@`;cu8T*?wY0{XNUw-*9Gv|moM#K6Ie8DqU@Qns9_-)H;l1*mW?!gCnS=DzR znZ5ezt54yFY{n2{Yx+&bJSf{7Asaq-FPH?FU+Ov;`)B#=!DpfXU!3p0`|c|pH}Ado z-s^=B$0hZ#YA`18qa${n*kitLUwY}KxqP2fV;es>^-)#+_?zq8r=7HaRQgS(zrZ;~ z;C1GCn5q6&COH<`b)N6cd+-ZT+5Gpv|NRfoI-UX87<-r8!}bd08>i6p;FVs+sn*k> zh8}ydUi)ThM=oiN9b=A%uTLS2{Y?C1x~}%kIa8Zby^dW;?w+SqMzYttOlmWqOpG_z z#OCJFrc~u)6W@LM^f_4l0{DgtLL0uhrhh)~Mg07Oz_him+BRofX-tx?PMtdKK|UAR z^DV2{qPZQ&JB-aGNt?s{X9<{bc;}yge!oB8_5PQ{hmO{9!FOQKo;^EysXgxqKIO>zFl2krlOjZHhz7OnqtHx$?>@%kqY@hU>S+20kAXCQKNCKfjKPVqe!) zJ~@|`rTF6(UsE&Ii#g$=k3M==%a$!&PCtL5jI_1Hl2^m`413O0k0%oW#GuoU178sG zwc6sVmWk$|*UPyr|34_KV(pKQr^a{_GoXG#NR1pNvRArG(Ac43m0c2irPkxYKQkL0 z`1jz?V*1sPcQRX_V!7wWe|Ak`JL+RW?qPEHvIZ#o0n1f(>=TeG}>jWgoFneOUa;SZ$cI-@e7(9=pJHkPR^cns;2*f;Ps_$@CE*&o6Ng zRjXF5QtWam6#n=&li0Jecwx!S@npJZ0KT#d7cP8O{kWLVm68szZ9NJ_uW`_ctza|A zhWN$Q?|kBfWnK6Ht?fZO)|{yI!@W3YbU1QLfVh0kyUDZM{1%Y7kA^E&tau0AaWMaH z-@bjQ`Ji%Bm~4x3&ddK#mJ)lgi;c9^_rBQ9^lUYR@Q1=rO64g2(JQ0|$tix~2kqg! zI4R*7pfTw9^2&NnC-T7K$B&OUx+4ypnnT4Yfy`W~-Ez*{s&wv{H3peGW*hq|72=_0 z&YXFxtP8F}j_ecQ8y!`CQN`=d-X*~NP1ghXZqvFV=!+wYoRi+EORi-(_vQa5M}-}j z*)P_0er!c-#&fMsd;#!1)%OW;gv3l0qtB=v+VW2Y>o=_7nl?{7+sP-N+*N8rZRj6j z;rB3QQTW{C&jJ2o8uyp2#$YxKJOhX!#y3#qO0FX>bBJtk-Mw%mK&}q;4N(2??G{G7 zKsXe}4@Kp`IezTPV?2o=!E96$L(TWU8G|XgVdsz=)Qlg@2E*NpMgrt_ z)cg)+>>Km8FyjWJp*|X@YWJl${zd2Y(Y?w5-%)Cj1eLVJj#cAZf_PDd%{nt{3ocGL zsC51Jm*?)ref#!3)XX_eej4HhG^Y=H{!!!)@K0^LJ=8u+ZTzEabPnIx0JadePK_RNT$wnC z;no}?_yLhqD6X8MCLKxqMkabBfj>^1=oHmOun&XqhMRSSKo}8|xuTZhdQDwuqSb2mme0nrbFTA2_ z(Rt|g6f()MNs}hqksndkpUQj$c+bfG;MLAYAd|#`UFRJ?efso&O1_5G=zIC{`!yp0yd~|C;xS`U2E-DCYeEWTQtgiQCy5-JwHt37_be`M;<-lzM-DxMr+VdtCj5 zh$CbULasJHa9rE$5~xG*RuE^I2z|<@vjwJkG>>Xn%fZ$^o0568rBekDTqN z)*prJxv9?={GrFBb99T}>1G#PaKQjGk21c-&PTwXZnL!}=cU$prrzApp+k?$);`@m zYK&0dL-z-$??T<7V$1o$xX>e=918IoIzm@klZU);=+c(j9J2OD4bnbZ3z7JgAU+3$ zsG}%oCP$aVW)Dz%=6uslH(ge#Ql-3o`&a{@o}+=tTXx*mvic};Ek#TQ?EB&t|m^1PAz#oW&&_lvCQ^l#X( z;ntRm>M!J}%nEJ%BWq-i?3D*}f^J+czQ3rsC@-*I*Q!;ko$%>V8^GsU_FD6t{i& zpz!)r<4)Fl#;Pv`dnrd9b=1B|aY9~L@`dAPr1pug$+&UjhS}`jp|sjM{*fIrRG%#9 zM8?QEs&BlcY{=pDE&=Lvn6}GWFL}JZLx`p&IR&Yg{mwh@ysGql|NZx0kyC>B&+65y zSBnO7eo&Q0&iO$IzZWthM;kH|*?p}vB2#LaBjfO~I*5fJ0olv1G-Sw-vW<3$HK{8;9w$8i{PT0vemPS|^s>t?JF{K8cDvd@vq@Xh^dJ*tgN#hNkRkpu zr4o~sv>t55zu9J+RUJ5RU=Pzah~t;{#iq8>%pN4~eR-E%|LwQmexbAz2lC*958jS% zVv_GOrH6A8GK6=L!STpKbF)ATvO;Fe1H#_NO@dE{Gq?n(JHKkxsvocqsn@X@`@o+% zIOKRB5C=-^H?e`3yw?1OB~zV5e^K&k{Jwr>La{;Ags@o#dHl9PZOl;XEk zQAa|@2lHU^R9$`b)#s6?rg`(`4aMDYqp)~YJepu2&~ASBC_a3&;2GZC z{5}lHI~av70b7rS)W=&xatbhOhhf}jid|ztj!@t7h z?6*HS!3_=20!>2OLKCL`h8JS8`PPR=e7F4KbM2i3N=X9jgOQ&~>XP>+PwnExi=SV+ zcI|IErpz;OFXS&I*PN`2T*teYHFNTw@~t7?+)b!|Kn@COnp5MDcu5lm*SJR;X}c}o z>GTyCoq+{RV1tA4EI8Mg{q?udxE5NWnVRbGVB5ZDDcO}RQD73XLmDeaHZ zb_d_u)UaQWXtWa}V1 z3D_?B~j1l;(y zT|WGu4ziPg?GkX~-*yc-`kVx! zlYkrl(aF|9b`r2%0&e`0XP0_*N~&nNgz52xbYvIY#n4L0ox_u z#=q?va`ZU~L?;0^{-cwvgX|<=y9C_$w_QVyJ|}_bB;dw>bh34jodj%`fE)j|YbZYY bjy~#`1ABDt-nr`$yZ1b(bC&~~Zt(vBZCS4e literal 0 HcmV?d00001 diff --git a/gfx/vehicles/raptor.tga b/gfx/vehicles/raptor.tga new file mode 100644 index 0000000000000000000000000000000000000000..9a2519a95c81b1d311864aaa321eab97d403cfdc GIT binary patch literal 211644 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 Mo-=IZ*#kEE|CL&)AOHXW literal 0 HcmV?d00001 diff --git a/gfx/vehicles/raptor_bombs.tga b/gfx/vehicles/raptor_bombs.tga new file mode 100644 index 0000000000000000000000000000000000000000..9012fb259968cc005332f51312415898e4a7076e GIT binary patch literal 211644 zcmb^4d91bVRUY>D^MGd?jDwAhXTSsCfze?ygeU}+N>zzc2vUH6+R)Mhp%D-QBoN#Z zeyUd!LUq(xYpw zYr60A?0w#EuyGzdc+3O;?_WIl7Y|N{MK*% z*1vLIc4v<+Tw-dO&pFTQGqcOQWoa-yJ@X8vhCgws&pkbQQpZhK^8NFTuIHMUHfYv+ z3p10mJ2rNI?x(z;0cL03@090vmL5BOUclqRIo<1Dp-OyQylk?#1*{LtN^x>1! z2S@V`^6shYIh{9rcJ$o&?7nuUd#B%=s9%>He!ONHF8S; zOzLuj_?)*6I)9=$JsUTAKI6%sMF#52OwQxuHQQzFiDsVe-1f<2F0-leB$r;@^z`%L z?1|>hLmTvrFTZ!ET>5h!e|G3f4*F<`ObES47`<sPrgC3{_V`vTG!D%xtkla_nOAXV|SO~Jtu8=-@op$C+cfXf9ri0zT|N_ z?GO($>%93H-ul+JzVmlAJ*S>i-{wzm>-{})HeaIqUhCuMNxYVKE{~qZ(YHId&#rH< zx!IH7_G_H1Gsf#~wBhpMO+9Dc9xc*-7eeNxvI2|6mU4Q54c)mm)TzAXD^vRCqeP!NE zmxc7~$$9kL&4V-@jXZp^+diE8-}32AJZ12S?m3+A*`R;E&inBuPHuJ?{zhlwdmo+# z(}QbY?&&uVw&%1ruVdqf^S=0Q;bhu_gQ*XPhxARuHOeG*A1$-P+3C36x4!0PpLe$L z!_9Y&KD)=6ool}ReMh?_vw^L?{L0naP;BRZ^sStd#8GN?TIwFW&8Z` z>M+BTH+3Eza6IWV;~~Euccw#n?wRfR!(Q@b0wPAaAj`r)U)+X&XYM_Tw`ZaH@lO) zu{-RUlWEPq>6zziPHxbg-qXyVnbVvd>A@#Av+rf==^JhKeE4aJ=KFMvC%<1aciy?f z(_o&#*OL=}6I)Av&zb8vdost@T>5$7{A}h#9j7c^h7S+v zgE)wT!>1qL9DeiDptH8mP%n>6B2S`oA-|sFf&rF_amVwF3()?#^-s$i> zkQeHs_ny96p8K4aeP+4ban7XW{gUHLyrpN?eR9|Cl=+GPrM$$e&gWBNv$J50{>vb07cg{S1HYefu6{-aP1WmVW%^P0cKy{_HYu zr~__Ysp)8Lc3OA*|FvgNp6~4DdiQzU_nvzBb2mHVv}cwF2e*#VHh*(lwmDt+*?n*I zL3ip*X3g-LchgSX@TuLJPkwyn^RD>Kw{erjXOB5i_bqO8UfAEy>@fE|@KD$6InyBx z;^mSz51RRLct}r7ubG~^j^xJI`z=n-=F^p)Yj;V_47(%uoKODY$LI6sOVl%%k1TKc zHjUnXUftL9(cCrtx|7qJnBAvLdU}@8Y2WU|vvq9uY%X)oId$UsAYNBupO+aqp2qAk zrw6AecbxM!#PN3i(d^x2AN1%u?f6Fb8(v3p&C_`G<<2wOe6M)At9QBVl5LK+b^PY1 zIahW=c^Nyez4hLmh0nb^TASVPrT3Vbt#dMZ%$-eLAI=W(y6nz|_|2y)G5tDH$MM+{ z&8IW*_2hYv-x$Wmb2bQo#5rLVQ@ znz?mZn0_2=&7R0Rzc<7C9mEd~pF1x3?95q?mzEvPWu|kz^JX7TFHBEz&C5gH4Q03Y zCeJf@oH;vb8}g-wOB~&PZQiuz?1?km^PJ>z9#8K${NOfsKOgKr>-EY(emkEt?R5Us zTk8xRpB*{V)1PyCeWw!XnK6$x^U0I?=A&m{a@#x{9?B=CmUDY(gSTec^d*-a!}FP2 zmrWhVd+NZa&zv3G+~-}(-STFC-YNNF&s^`?RNddS-LxcYoTW z$;o6#_tNnC?GT@s^L=`{Ys+Nk%=7px?0V$43~fXH>`6`rH`u>FJdNYcT<*8LC%rqm zUoQFK>~z?DC-1dkWydJ#0 zz3ormHec)0E!W+%Z||BDR@Zy9}*!8=suHJMEC~ zgn5rGle&)l9u3DM4{5nKm)gwENFR&H1^Uv+3=zkN3Xs zIx~}VUh>JA)0?v#9~@8mPJ4PXo4uzjj}DkUC$2j)bKiHVJG(Z{J)L3C9BsHf|J0X$ zbKMbFbub&W@aUaD(R5ni~xV(?9dvC!g`1yfk|5W@o0S&rFXTe`@B=Z<+R<_Q{^U z8(VL3X5F*Ttgm_dU_N@}`S9DGoO$r{WOsXq6x+nMan04ftGCUimU&rRt#nU-_XVbT7IKHiimfo5B zv*+`!$Fud}`FqdIwYjzKn_f?P`@Hn<-KUF3MlZy-5AWO!(=&6w>&&Fr***g~eqP9* z`e@hm^qTcJuk$+lUi^CG`1Q7KPhED?Zuw4n-h;6)ug&S-e0sf8JCvW@gM-O; zjtA27JbBpOTfELKhl5)eZoAXu^e4*DX?c$M(PDOYmX_z`%%8r~Jl<2bdveb?yYY}V zyE)J6dD}ae`^@v1=}&Zr#y*4IeD2wchw_P|wceaPeLY{>-H9jB%mb6Z#*Nl`W_zB! ze|Ne=X0V^}PTs?tcStUI=iqY3InU0c6VlVqyJ7q8yE_j$x6kOl)KfEOA8&G-FS%{j z)0o~(^L>Cklbbp7&GBxSIr=G|-pxbLp7h~QC@;f@pFQW+X^pVmAtOkZZ@8n+xzYxz!ex5o~34Q9sw-$Zm;?&d_k z>^E=PWSi%w>BsY*^!D?~_uhT!+q&eTyd0EGpE;3F53Tp)J99ddFSDDMkLGMhhsn!0 zWAos6GLzb)nX|(@=*h0;($9yR{XYKm@ej`LVQPLayWhEq*~5<;-`17+ndO?_wD#s% zTOKC|vm2)?F@3sV`nrRsF*CGNHu>}>@BOB3KA}5|u8Y?WH&1&vPv`A}X1Ux?-R;Sq z)^sHDWG>IA%WS^XGCQBa_BnKCW_01~lhHRwKXu6^@+QvQyF25Zr7QW=wyxH5?>@cV zBh$LQd(xkt?B$V7l!2R;+|0av2954Bv~NAF>1@nyne^PJ`{c;-W?zwc4l~5&gs*IgXzzi4mWMM z(LK4FpLeozt22%E0!!Bfa;! zKDj(Qd9(fveMhf#Y}#;>-8AP8j-H;J`A(cH%)S%Hlil4vd;Z+5>&P>b%WgB>JJAX0 z_Uz7?FME@dPj2(3uf5KL?%X}6T>JFondXz$yuG_md-n5W2Ys~U(`)9j%Qo`i(|CL<7%lpWrhJ&eXGaux!4<A`L1w`PZ1Z*u9&*;%;3o_o(;Gu-mtnV$5{ zoP5sd(}9EIAI-jDcIKSkjZbdo-sM|s{@*00yE~F^&H0emzTuz4tupG+n?zKby z+0BEV^x;mv<}<5*^Wf4yT=Mo4$~p(?ki$bfOupyY^N|_EZ}W-6C(fL^J0zO<<~!uC z$NhccJ)!g9_}WWz9^|v1eD0RrGB{m!I;8g*_{_$;@{kpYi4Q zB6H5bxkK}#({euf^fmGix>I}X>BYg(=*gXC{`+Kj2J?=y`|nHgIB#&c=4ba=(4dTt z;ZwV%x4(D2iP_(?z0p1Jy$|0{p2?r@GIiPJ?6-9NaPy~T9`wjG@($0N9Dj1@!^83S zd&rK=_L(&P)K7DsoB8HDznvk!p*%c!Qt#P5Xm(GC_YVDT4W{SR!82&qX@@#emrIY? zo$S2Xqbt$uXW`dFx9hd1zcqVz*azJ^IdkTR^WX>5n>rrK@Zjyb@OHW0)5n9$PMSPV z@-$rMGt*jT^qf5DZI6ABPhTT1-)Yb96mNE!y z9^9bscjq>5=47{bNaN4$9aTLz~|Yx#_>3FaCA9{o4p^J z-pnM|x!n15>EOY)ule!kd!_56>BZZ#zq9GdxihETS@hGMymR1|<>yHp|4Hwz@p(UT zx_A?5urqilyX|wXXLMeeoH=`vJ7v;8p4`oY`3|ycG`Zxr`5H%qdG?9pp>NopZO`23 zc5`NMJcFBlUvA4g1NK>&Nl%{116#{Z9@t*{VCL+wwT*WMFVCPSJ*~?P&fho5T=TU@ z|Mt73hetN|$<4myhu@y9CpnqqavptlXwE%3eXXZwW_!-Esp)~~=gVAj>6Pcbw##K# z`svw~`iVdFZT{^Hd6>E6WSh%BOH<39p2xT4`i$(OWfvWeW^SaN`0P#Z_&wJ=t=YG% zJEUi3d}jLhGPNz!dV6|z=J2QIn#XxOP*?6br=I-Gr>8UN8!h*l({D~3&-Q+^i(en) zNu36Ha!;TztQw2W+wTW zQ%lZq6>;;I)}1 zJBaJ-eLb1emz)`nXZsm5oAcyy&pEZ>`=Jk?XP)lDpE|Dd&Z5t5el$2<{_Mm-nsemn z_SR?byUT3e?4b|l!vj;3amMDk#>vf{w|kFHYu!D%->#eQbXPvP@y%Iy=fd=vd9R(Z zc{VOPy1(y``qq`)^yH%eLI84&p*4zdG)6DEt^{2*_o5UcVA}H-#jhx8$gT=TD^b)0}Y)WwJva%JU}jKs|$g*7o1hbiq8oyK?uAae01ne7AZh)6Zm*%f0*B zmtGnUZhUGpd&ZlZEKF^i@6*$s*}d0O=jr_R>)!b6pf~ai>Pjx>lb)Ssxy;ZSH}7!m z%dXVr6YuMFMrZA<>-G8Z4W>3aj}Ch7nK$$0u5WO7dwOT4J7c`*(FtiVd0EIah)bM# z+wt(!L%)UceC}gEAz$WklQF~O%$ZHD=h<;NZ{4`=KIPk&`Ry$Frk&2%cwF|m3*;H> zho|#=bURG{aP7;T7iXWG-{J!hx+l*{a+^<>rzbq(fBAKYgC#LbIKbk2#}^zk|?bNKsk?U8k!emh-m(`me& zwQpJ6*5P+2^XW6EzV)RqJLTwb`24-xI&t06yUsxwGcEaR8sB}+NN@XT&QDCO=X@vb znce0@bDm)y&7&_hGtFl=yBYG(?0J5kHF|o|*E~%g>bQmSdilGDFVQTUyPi!;pBc74 zd7a74?CGpM(VQL4r8e_?j^nxZ-KlPm3J6dzO%cjrlyx#G8Qa8`fICDO7$(d=5 zsr&xx<{eMYnMvLZ)0ZSs&7QtZ$8EjxG+w;Db^C_0 ztz{PvAJ7oQBQg{jy`8~Z~AG&nKPSw=FBHOyYwZO`R-_+J$<;r z?7}CPIrE^;zdsM1i9P3@oilHHa+A&cHus$}Z{B*kizji*CpWXb=dGu`_RTxoef0Fq zoX^&qx;f7puHR|*jHffWr@ z_VdX?{>jYK=eSGy^G?b4oLT3jM^F34lbpNV=jW13FHUdX0hfLp-)W!T)^M_UHg3yw zZu8*MoBh}3K6~rPe4dqj=5(fxgRS+R=RBIvAn(z$z0sW@-JY0Q&OFU+dvY`T`S4KZ zAdWvX!+B)*xBZ%zHt3A((95@Jlk<$OM>aDvpU&!Bp4nP=ZhN2a?DXc0Ugv#5bl+yD!)N z$$4ln`QiFWedf;1yB}^aAHG|-eRg?H=FRle-aP-Hc|7?fpL2KRzV*pM{>IjGA8$UR zd6LggGauxiou|3pdGVdYJEQ%0pDn+h^z*i7^QOmq>cYeHCubfs=h?VhdS>o(R(iHM zId>Rtn{hC+`8($3wmLL}$U)nzzI8=bU+3>-NEXGQ07~nXjEO z9-U@6d+HlUcaEJ`U-FxVOP|ivy085*i9EROOa9UH>&?FGYCXFe=J0%;5MoExA*7db%q!*L-rYy}9SiKR7(i4EcJ`oGdTwO!{)>hct+X$bLyu)iKyvUVQGE zlZAYnhn6^V?wzxz&snLNq0Zd1BWIpLeCKJf^~|M~{3-i~~h9Ne&M?w|Q~Uy>!^KD>?j$)0;kA zW@hH0=f3IkwDjk^>6xV`=MJ>)Yu@MYdzb!Gm-9AnX3~e>kgxBS{XEHSGvE9?^sP5F znc?#3+-V=)dz4QubIwg)&pwOB&dTAPvmq`sa&SC+IcJ8R8TzJmkNxD$uJ+LK>{B1_ zrpxo>-hMmJ>^Y~7AM~WY&A9x&PPRY$@#!3tOD^a8=(qgSG56>$J9Hm?$>Vrh>wWX% z#%qS1x2N|$^YrmSXF&Y++0dX&B5lyK>BFVhXTaN8-p&p0u9@M7owL(rb9a~a;(6(K zJ00Q^Gn4aV@=48{y&IRhuJJXW?{9SfyAODo?7$87)4t8?4(T;Ry}Vmba&qb4Ix>@b z=j`3vd-loTX7?Ubqc^sPj)%?9zH#YK4{zc&-^$Zro^krQowH@Gaig{Fyc4GXluzEA zs2gV=94_(JtfO;w`PuXR$r^!1J#J~i{k&wIqf z>G6J{jyz*#JLJ;^+iSmt*~iT1Eb= zc9^^w@(d1_&!#1pnVjc)HM{SZ?^|}~`DU11GuvVMnj0;j*6oAaBYX0t-g(+!=V{(a zW^ZY{eBD2L_okOWdvb0)HFKl>G0GipV%2Y%r5tX)04UkvQeymHE`NYvYsKy5wmP54Z0aEpg_4bPn>G z)0(dotq!Fg1C|1Bbu%`D9mS@cnz4o|*Y_PVSa} zy!<(5E_LT@Tx+@OPTbDOjF}JWpl^F>a>-2wpLw2Znk?ka>}Wps)}1Hcd-t@Dj=xVo z&t%-I&$a8%3~oDOY)|%# zKlg1;kN))GPB>nEUAT?U9=_ysY}|eO^8IEeJ5Oh)$9&7%x_wXwq@DH?uWNobKi_aO zPbPcKGCCX6*IxTzpDCx$o_9$tXT8a7^Kg1)a&Jz@mZN1J2S>~Iy7lCla&YTzPF{Cn z_Lw(4HG1~alXH*uCr|SZ^xOxX)qS!XkLxVneX;{5W9Na{(H_}G*$sJh>4$zlPTzld z{;elD^PopZ@6FQ_`!nr(jJJDoPk(yTljoUJ&yJq2`Ln~>nU|&6*+JM$K8B}dfU&JJa23E)N%4O`=F=2Jjvr^HstTKHop60p#IM0?<8$F?^A9= z{=}K>?qp95m%Xj~@7uSx_v~;c%+B;}eD-d-&g{YQ!}i$o3|X4}^zJ*Gxt#f+ULHKe z!{JlQ-P|ZUNW;yJPt3VJvW?e#*R<>zA8+2lOh0+jXCB;U9dPsE68Q&vw)3Y4*Ld<| z*UY|q{B)RqHt@_@bm;v1csefwb;0D#eQ(}d-SUus_U_0tQp-7W-KqON{>_^?dY&=d z+_8Q3_Tn4;4DC<8Gqbn<-^8-?Cr&rL z&+VOWL*B&k%?`IYyXfubp%3QVx;*4fpAMQ`rm=Oo?A+$9r+wMwoaSWojXs|{KK;q* z!^!8~^VY?aTF={Aa)Wd^m>%=yz2$dCqFJB*QydUoWTp3d{Z)O#M!=1Xq#&>P(g-#dQLlOFns z8=hu{*~gRIshbC8pE>(BZp-F*@{k|mb>q8(o|v9%b8GfN^QkxanfW1oc7G1cOiwh+ zB(`>KAFXv=$)_**^fo`cpM!7kRu^yjGMBtLalFoLK6|!v_-Xvx&I{YK-C?}r8!h$D z=05Xw#>wN1EqChK_~B0XO#jU8lKjTCp4s%fyLXh@#?c#Z^{3z6;AoxCJ$-so-#8h* z-2GgsxdTpT@~P>gw;$hU;dSY;x8A+&n|^2Tj%VXKoBq)}$(sk|)0Z<3pS^MPxgS0| zWRn}8r}=G9uQOo!XXd5njyw5u(d|0$dSLUNOP|kCW^m(V2K&(u={hspp8IO)%lTU0 z_;|2YrQlEdS+4jgaxx26Zq&*I2Zobs$xWTOpM^D^ly)Zr5<-H|$ZRVf8d^$tJ58|dH zpXAM*vyYy0`g2Z?c~Bmv*7Mevp47KFIcIx+@YI)n@2dNFx+8b9>|k={#P;N#zMh?d zpS^$1?&{2B+oSJ<{Eg|SZCq+S=bqV_N85CKVrDm956yeCH}?7T=AD~5uD!lzaCCF$ zbD#Ot=?vIjeCD@VF3-((q$hnieW{sgy!s)XA9^ov_`DCFUYZ^9!HuU4n)wFJCmk;f z`s33U(-{|bGyHLbI+VU zcU$G%~5Gu!nx=l$a$ zKTN(eJcE3L_~d$SPj~R+Z}~U9x$c~OJo$6Y&PTVmw&~7HZ_YBCkCvG8DZ`WJm}SyK z!wq_9iRSbqH*-JT-FoKr!t~-c+&W~(pR+tpw)goiczAT_xVC2|{XM5|n{iOyK4|v+ zO)mX>aJ2T?Vdl*ncIUObWIl8Fyxee~|;!6$B+xkq|t*1>;Yls)BJ_YNA6-qWLRLplEJGt;(wYWy3@j%MDnshKmA-Kn2E z?YDRKTAp`MKK=C6QpdNi_sope-?i*%@AxdSUw8qniiH!uH{>;i+pfn>JkjEa`JTF7rKad**fI`yI~1tLKF2Hz#gAy2eMB zu|u9jb9-jj!(-?gZ&Zr`mA{^>9edKZv>It!nEne3gJ z7oR>FOb_mwKQ(8~os!??;gXlV#=G0*l}qHy9B%U^XU_NAJ-YBRx#vtDlr^U>wbt9m zoBS!mOHZ76e%A5$nW3CB8ucVU9NrB1dLLfKY=`(0rf)p?+(+XXoM+wv&YAW^b9`r-$FZWk$=Nr89O}XTa>nZJ0fyXRbB*=6g?{&g^YYo~L(xke++KD?CiU zGiZtF8$S1(Tho!<{Db{_Ns~*Y4JJP`&76Ar`C$8b>Amyg`<&#>gWIfY`+WGbzvuKg zqtO{KGugNCx?~f3&Rs4$apUtOmtI|)-oEV0dGjTg-ExVy^z@o#@|@IWP7fch^~~~~ zxa`maGuyt+b2O9Hyo#mm79cD*+Xz88V4%^4ms6R2Y*_T-!NIUI#*#6;@o0*rEJFb0rUV3)Z zcxj27Cpoi>J#o{9HVW(x4n)@7H`ZC<}F_o-^NI^Rv&-=;z$@;WC?^ zoHvi`Nt5S0?Wg?kshQ!U>CKFLBsX*Jx^dp2ee-uFce&(d_UMCnc#ThwdGM6s8Qshe zPg?s=zFTMOX{kJ^Vx@50;^7nGimdSf0moxu{@`kohXNEf9#t(;w*-iInLUz%T+kC0#8TdgwOwOFzDVv_t zEK48k8J8&6$df#7(D%RJ&G`9bXE$${de6FG=6O?dFB*S(hRZ$Y)Q0!-!PI-69cQ*r zS8_S$Ie31UJ;QnUVe`4?oP9m#-kH-m_{7QTg8BK-JJatv^;1uG-De-q=EHBAyYS@R z^Onz_jUR6Q(VEBM2Ya4#+UJ}^x#Y~7cH)vZ!|5{*ntd1gozOGacaoX^J002y^GqHb z#1G<5xOwDd?2V)2dbaE6J#)0-a?U;ZoOy=B`z-9vN^f($PuAy>xvf)nwA9TodpaYV z-uCls+2s1(G<|k`+nGEvyv@^Lcj4ty&$)HywFl1++c*4hz6<$IWOzF33>mvz`e$w* z9m>JsPug~;_R8boseg2LOpn=_iRL`Ze4kwAd+vPSzxB@F^7lP^zfWIgoY!3LI^Dgs z)^l%f?lYe{uW8x8&3T4?zV4-O{MM743_P9Ddiqk!yWnAK{he>!eqWq(`YhShavnYR zp7V~Q>66Rd%m?U7aoxiMQ#V5$iKE&1VDr7pUh|(k({(FH?~dGW z-AM;u;-l?xXB}I2bGcueb;9vFujgBPcC?oUN6)9vOy5bv!|XG+HoIp$=Je&99-X-P zJ@>nQ-;56D+I60IzSB8)`9$52ck7g+HJ-A`n_-?iT=K1L=kY@s-sbI)Z^QJ=oO}CI zGsE%DoX;u0Wj1g6Ha)pKH*@&$=A2nta=fQ58NO3i9`fDV)5km5GcM8ZWOmG)o^8j; zK{@-Q!O5mSyK+v?%$YMoUin1Y*1^Zq`^JxFc<)pu(OJ0cG4mu|n=^N9c4lJt+Q(zw zI(4)MpSb0db5?U3pC0oyUu&}`H*^2*!{{C4&kQ}eoau?(!w-4+a-W$mbsR5W^65`s zdfU_ceY|<5b8x4>_B)49&Uw9`e0uoXNB4Wl2h(qs84s@K+|#d@-uY|0j1FG?i9E2i z+-IJj|J1Kz!^z5Zr#*A`<+`)?{=D=K=6U85PfyIQYdIRf4m&-0b0QxcEoa{0JR8@U z^wOX+cpCj)@+CSOb|-K1&d6MP@Q~KI)KA)YGB4A-e0p=(r*$UJG4tf^%;xNH%i=cFJDNGWaI&=I zd)|I_dARlD9olDyd1mKm&dAKhxi3vVbLQdq?kVbJ=Bv={3)J^YA2^`^@1_4=+rgGxfHXyE%Kz+0$K{CU?!t zBcFTUg-0JRU*hJy#mT47Sw64rd%`0RvnS`&&4c5y^TUnryIk|ipU~NGe5bzDuKBmK z_-}Qe&cMU&=`&l;^L5DZ!sK(_^z5Zy2>XWz24(gSm^>;9R z<_)jq^SmuP9M5+CX!&GE@;XxQx&8LdH{9rbCz(MW^S0}jv!^%nsq^6Y63yuy&Li8H zxzyyK-uBZsULQ|>2Wfh9H|vDFc8Hft98daE+vfIX_B2lq&Cl4_x_!{&J4SQA*|RUt zGwVpCWlzrSO|9o^-qGB>bG?su6pNm*0=^=t^u)ca7IG-s~~cWwRf54byMt*A4N5yqm_?TJER0vwVZ8 zvI%sCS&1WuWen^w=oo~?Rfa9Ir zoM=uzZqOr7JMDVt(7p6+J>!{2Mpt@i`gri^%{hHJk0&46Da)JZwYT@~OkE$$UUTPj zKXu7^pP4z$-f4HHzcu%U?M*)C@y(uS#&2E8^(=QfC;NGIG}3k1`EK!f*38~5%$}T` zlbC1W^~2=#LHYD1$CsFWGv~c!(<8fav_V-MKYrVB@(@3m_uIO0owX;L^cyKnR3U}v_z^wM#I=4)N)OMhn4le{x=na??W=B=|iy)rO;c}~yv z4Tr-!r#XD0`IN=$vQN%~+dMeuWJWGEez^H*iJLDubEA&tXQ$=wC63e6I_xrdd!CW=DTmLVEk|#>k2gI%>pSuE#`M#Mn>o?kp7izH`*h^zstbCS`nj7dDqlr^yH39Kh7OypYD@K zU*gtrEl-2a9`ti1>gTt+gPq>I9j1RcyV(xq;PBTpK7IDib;s;}?$nxZ%{lnNeC~7p z=9f$4OK#@j=kDeWo14sVo^AI&vO9g|L639nJor8@bsD7UN`AP!*LGL_K^+hWH$JtQ zw`X$r?7$5s&!4!>a)bG^&CK6t$j}GPyc;K%9y8R_`CGeuqg*1-aHl!7@yPcqpC}7u zc#?0;o}QU|=gZFw#|ww2^{kuMzWI4*z2|qvtgo@}aoU|lhtrooyZ`;C;bfdCgU@}N zx7>YvliSX~U+ZvY-k(47J?GBfs2kFIA3pnXmf<;R>Ep%8z|@EHwEw<)_Q@od=hE}c z)N|Is3-Q@CpWl2J{okR?o?V@_r$-;;xwf~~eci#Ic*|F0Pjp9I?tQoH879@S*AO53%^dU3<&hPy8JO939Jo@FgJ0tAMNhlK6u+Z-to?N`(J+Bw|(ZP{@Ks?dhd1c?$5nP?!1r8@1`^Ryy;5K zxp4E-WKW-;tp3d9%$HoxI?|i-_<1thoV~MKCOvX|G(1e*@4?{k?MW}42PQvU@|mY? zx{kTW{B`o~yYa}E{?)(w=|B4BH-GdWd|#gW;K74m`cFRhbHDO#f6wp!p6~hWyYJ59 z$LowlXEo=Xjc+bHa^_2JX5IKi-@oLtXPZx)v*@sSI~?E4^Y}PoBfq*xv5Zaq{U)U56~sw*SHJ<%2iA@r|E) z_kH>GZ~EqM{>t}w*0cWJ-F&%we&Mq||MPzCb3X4ce%E}5-hTI8J9RnV*|0y)?G88@ zXV_u;nwN8C`{{7<9$aShrzd^*!8wyAH~a7Y?(aVQdyw~k)oZ`&sej~IKYRC1e{tUJ zv!C_uKlr16|0lod!$0xg`i<}XfgkvkdB5||5t-fYf`fU7p2w4YWR)`_gNMeHPyD<*)tfuRiDQ`|=y}oq6~? z;VGB*eE$!;Jb1#BFJJo&-|%@4e=qO;?4O*jJ{!+7=rbKmer8Yh=)lR~Wgs3VFPofR zf6vH+x5JI64SM{1(0%5dd3Rs<#b5LV^IjkG^mn^Fc+%4@4<7rt%VYk?3onm-#xsBI zSAPB1pZ)On^6-wP%X@U5{`=r5GyLS~Fu9qXJ=ogp`RLGn(l(tpH8X6_@SfE8;b_-< zCtYWv&U`O8K6_(l=$)JI&HTI9`CfeKSANCkJ?jN8`N!|^@(;MY=z~A>@|b5o|MIdA z`=kHx|N3YD>=h5cH+O%YXMQ@ncl6}UjePiR@3ZW%vpVSZ@wIo}PxI;5(Yf4t;Aq`D ze+`^>_lv*y3$J|F=REg+d+_9^US9m6ue&_s#V@zvJ$&tCP*H znVr|4XKFoX$K-WvzLO?L_vcu4=gg0Dmi&GA`*`&AdA;jOUN-NRTxV$6Av<{bOytt5 zW8Nb^eaZ3q?#%b&XMg7Z{HOOa(VEy zcYnvv|NJj}_;d;VVVb+;U(J1=?Me0SzQr=0J{Fa7iX`~B{|J8yg9b6@cA_ww7n z^Sl1T{_Z$CyL#50D2KCWb~JnI`1JIwJNe0ZciqXK-I+}tk4w~xn|Wp_%(n1 zt3PLcFQ53l7hWDb^_g$|wcq&lSNfgI`)ys$&U>aWd3Q+Uh1r)re4;tCxIr_0@Y+n1 z&HTIv`9xk^?&j>tGkVUBob}-3?DRw$%sXtpqKKppKC-1iP(YG_2%-La=N`Q`cUJb3V!-~abN59bHJ^y5GJ=8v84(EL4F-%F=+5_#e2zTMG#=bh0$ z{q)Q=M@y84H0R(UeK5Isum1k^hkodX{`lQH{g=Q0UjLPM`^#_o#y5T1yw~{*@;jMb zd4_p(XW|k&&wni=-`UJ`kG(T^or$TL{SH8Wy%0Yr+jH;f%lx%DGpAX8^v$zzok>q> z^PjKH_u{92`lmnm?tAm=|KE4#5B|OE@Bd!T@900h^F4jMzg_=+V!KzLm!6*UKJ&Tc zXLIsSCN+C@9^@H!?{5C{k^FNm=U@HDKl3vmH1Bmj3mwjc z?m^F;$31%Q3}1HSoO)*4lfG+b>Nxp_pU=Ge?Yi~gb3bwTJR5f{pJ(PQn|(d!o@X>a zdvp5znf|KRzV=(*`Q3T^6D|*)eE0A2pZ3hVe-3*3JHJE!!w>)P$ItgC&obv3&VtV3 zNnZY%=UOhiPCmS|WMK05mIkqxGD-Z2Cq|Pwz6#=f36Xv_`!! z^`2+H&tD(Lw`Fn8N^C7V9{TS7UTeM&ch4h_ebSSD;^Ft_ad+RF$36M-;2F=nJo(wr zn}0uX_n)=had+RT|LAi*=PSlPe~*@T?lbe;J~MZ|#VamPd*O>OPkP?-FVB7XD=)8l{l{MZ#3%om%d=ke zqRXH9lu!AN`R>ej&Yklv+3#FP8}!H~Zd!6Z%i;%dFtyX%-qSw34s+tn^XHcTO!yVA zc%Q%R_wog=eC6fc-utDOr@Yq-E>C~qOD`|I`_G79`cWTw`FB6{&;I1ydwuwOIaxo0 zbL`H+Z~Jh`&pe-1eqQ<-(<_r6bN3J58qZ+Qb{UB8yXuG8iAx-P>yUF!XJ&6tdV4*dF*-idFS`82ulVxI7k}kfUcUBQzxDFQZ~yko zmwoNmUS9qB*I)kBCx7yPJ>L1w`MLG==jhIf=It)YW#=ig`N!M-+;etD_vF6y$(^*( z=UsTOFL}vJ{?7bfKIPrt{qiZF^_iD1_$zes{dauF<`$ zd(ZcL&xh~zUGDz7cc1zhpLu!1-}oDsZ@&9|{L!EKsmnKh=XYNI%;$d2<@3Mr3m?AM z{JrdVraR9`?$O?pf5W+df0lEWvonK#G@5&N*50UFF3(Rbc^&lBPIG3`ljrt)@(s_M zz2-!7cKQ3Q_y52TeE8@3U-`O0y@>4$f?w>gy zcX|1%U;RUVFXwa9Grc}Xyt8O_8JPUc`J{&rj+S$JThqxyZ@%|i{!`EJ-qX{b_Oyrp zndK9o@r=u7eD-HwzTrFn_T~G2?8h$u)ero@^`BoYSwfbv@0? z-a>gkJ&mK!`^L}i-%ot($AA3an!jE?>m~1ddB2bR=*z1=`r|Gyzx!v)7kuFBE>C#g zdq4d56YuxIANC`@Z+`!#L*HQD!CA?*w=?P8X58SGZO(c8tEkNIPl_x*^EzC8EUuf2P(kGXv6XMNT;j(`3$ z%=ul=qZ{Jk@a}{gOn=U_=9(WpeUz_gbH8K%or16X#=rUSzq|P^@Aj6a zLmvKKe*7o=I}iU{pWo&D{^ULKE`1hl_>-o~o$b)iXCK6!GMiWK)?KFamPfyPjNjjf zyzl$G&v!liy}bMP+)sPni!RT8*=sJ(`+yI+JpY3}?DDKvzWU+6`~I%)`R^b8caYu5 z&ylG6zMMNH%I435gYLisN1r);yv|5%=G@zp+G&=7-6@ApoD5w)x%|20(q~T1tk=$~ zpT6zw?OoP?SL~nu+|R!D?)&rh2Ty<3%d=nk0hgD&?)8^fecT_vyz1jW@$#Y%d)>p| z%fI~PU-pImT;J~G4BhUPX!c%w*4dYNopP<&;pQ8S4*3#i&b@Q8&CB5DXY%(UpZ(c? z{)-;|UOx6QmuI}-g_rku`718Z|G*Esy!@l?{(AY^yFc%q^o+Ot{4f6EYv#SqXVGW$ zo@co)&O7aldkykHUL7az=#xp^`8pEKJo@c=a_6Bz9=P$tWxl;K(9gn`$di59pZu1S zPvmP(Z+Fi9{^0Mqp78YNJnt=ObQ!dBw;4iOVxz_I~qw`PQHP zxu5;O@yH{+Z+XjGK4{+E z{BAzu1uwb0*WKTHyx=vjyS((nKjQL)=f3Fj{vY|#|NGrLeZsug{Ckk;&*^}G$&AVlA*^%?~*r9G3q$j4<^IPw_{n>u^ zzgh6`|K8!<-sfeP7vB9@{`}W`@a4rH^hfXhyFX9Ayx(g-_^0l^JCB|3Pybottm(e? zjIYm6F0@bX@-eC_4EKH#;NCqDZ*mlwbCH9vp%&YwBIm-88PN8V+d z+wY!gyobS-%?*1%)*XKR=@{H#^_wtI@zUD1=-<^m5J5l-lk?+1d%j~{T z#?Ge`pT1jj>hiEPJIwQOgTwcCt955&$IN~&@7~>09(n9z{*QUDkG=cv8$bS;&$>MF z+)8}{cZEySi{|#-u`kbG8a{P_%u^}#daD$%iw6~tw_VBg`&)=AO&YQ2f zZSRiR(??IFr?=;8yZnaE87*gfX5u^an2-3FkNCUu9eVJzyZ`R`Bagj&@8A9YKRw?c z{~osQqt6+wZ~NxWp1d3H{C@QB2o1{hzI9*oj3(nue&{T|#F^*sExgxn|F&=Y_a45} zhyV9;k6b?GGd}%$@80QS=Dp^>@5#=b-3R9m&C>@*^Umy>Uzcp|IqTrded|ph@5y(K zzozL;%yTn4b3f_rnOFDLm6_C=rzPghKOBCz`TYF5ieLSeUwO`d_Qp4U;g^2ZSAEr+ zfBeTkVZJ;0{pqY8IDKa5+!Ky(^CoZRv-f#)XZ4(_}1*SYv?W;Is;}8f1lNSW@nzy@OS^<{~put;^6#eaku{dHP3gh zeuzJL>EmzDwrB6A~=PEN1nv-^qyRI*m-)N z?|}1Y`t4g5#|y7z(qo2skKy#tPkY|uKA!HD(F2`(AHPg?HK(un-198oqtWNDpY!)& z+dDe->T11tI)2Xc;CS2>&$sb1kayc@-IM2ZuD#ijbLM9DUgw?8|34*uA2ZY4-I01~ zI)>wc$>mI!wdZGz@zWA>=D}_Ib}lY+xD&QF z_nf!<=;_Jbd!@ta>Cb(*)N@b%H22-cm*;P};XLy8^ygjpaDI-?opyQs*HDKuWH;19 zv+J;ro}5`Ob#rU>%<6}kz4bYyH)pxzwlhc1ho|pyZFdGwWA>ZJ!ARLopFaLgXQw%l<2 z8T0AN{K@OR@j4$SuQxSkwl8-xZ{~HLJiL6lXJ6_$>uoOI$IPkE+_~*69w^sdd%x?< zb+)y6tmt-**1?;ZK=s zep#OW?hWrf56;dDb-?r_H}j_PKpy=t^L>}p_#5@}+Q;X?CDIaGpPk;?@btzl!_&F! zHE(%29=Lf^^G=7$4)c~zO>TP3*)K1XTF$MfHuI^cwYzhSLQ* zCzHC*hIcT3zU-F6WhOa3=kf70^5N}?w>q4u17u4?eXiy#|KeLCP zc=F23XXtb6&zOdvUb)kp=edUr#KYm8k@=jRcVAzhWgnaleTnXK;_!K|YxAZJca5hF z`dPPo@!h&pX3dlBd}?#9r~5OT9qHS6{U^-c^d#TC+nM~lFgxY$!=*K(q{rG6RvEgb*m(UaJ|(Y&7x@6$b<&d52rjZfVjqk3_j~nki_Bk{2beMPYGeLLBuGD0c%S_JcF~jtkM{{q! zM05JhFg-K(&Ij8wd~!Kw#=K#k*?RY-cjo^2Cocnij*Z5b{XHjn1fvF)SvXFPj%_ddDq<#7&lhD>65wiyTWO!L+^ z{!Jgw&nu@JHlID+d&=<1+WU7X&vGx=S^FSQo_}kmC+fV#(bJ#vNpFvR&^*~|^Y+f1 zm#8CgoBKRFZ|=i+`mEveb1)BPhgn|VAa3*EPQCK_u60cZU!uD@gO*+Hfosp~shQ>Y zVd~~v8sCO_e(E|QE%%&9@4Yjlw-1+ma$CoCPG)k}3uR9p=cPY6vmU-gp2R$F=KN0a z=}d2HxtpPU?m2gF?&d+?=gFD}XCIw6cYNcm^Rp}aGM6*|V7|lTH$N^>rn%(vqNXu2d{A_O|E;l8l91RX3S8p-^=Fp3{QipnG^XkOFwa=x8~1^E!$omIC{?f*Ldgg$`9f)pL}}p zP(}wHrj8plZ#nu2WxBh6$LV_H@@#V=e{gc&&rdC9eK zx%AQ@Uwg7|o3~tcY%@+ady~sK@0t0Wv&T%|_SSd?M@uxz4BqyB+t&fKVX_|(iN-8~xhKzjD!5=ZyDh|i1}o;>tH4{u}Zv!DJP$n2II zefahzf6DRDp|0%BnSLMKI=3!9s5`yp_M~?-pQm>!m%f>^hX?YeFSXO0xt!CVym|EW zqsp#beYk7rh~)V^By|nHcbEMGH}cA(Rd+! zcAn;VAzx-rTJq-1^;x>{y=T^Z>dg+G>`Oi8_RgN4_tw#w_T_pT@XxbZem z+xX%9Z0U0*&aOZAp7R{q){|W_8+L~--qy4Cq{-^yll4xLr{OxAojqq}wCUH^Jttl+ z{XJj1_juEvcglG@)8lE)4!6$KTHp5OKZNQ^g4rw#-BP*bNJ3SPlwav_pUoVyqJ7dFB_Qbmn*XP-0;2=eLhd~*_GPx|8HyemMYPfTxVDvvU*X50waNB z8~48@A|5{Y31Y6?0t*%+V%+A;mAOw{9!h)1L7h5ab3EnvAkXae;ftO5_3Zt>^Dbod z>zw_1=#a-gh#Ry++U#HVlpS9md3yJYyUx`oTTkcRSFN)i{?X|0^6C3{T~Bl6%!891A5I4H4DuE0GZr5<_N z7dj8h>4Eb0zxZX^iMx7m_3v}!H_8@w&r8$gtYT+<{7`Rq-f9;|?>V^kl`C)74eK{U z9yome^{KwjdydAO1p~X835coB1vej^A$t zR_D>DAJ1DISA6AO9=u$U_QHB+9^atPH)yVxujmZEt?9?_T^{P$zKfSB)~93R_;Kdu z%FXP33|6~3M(6PkaT}ev`R-qy(Rw%Y&g{MY*Zk%0nKSQvvz__muPhIgFIJoRFMZC^ zqvJwe-7@8??YaAvp~LMNzMAug>-Wo7;H4MM z^$fS4>N9)fA%6Sy(e1E)UDfDc`Ipun^FE{eHMhGn?{K>lhnJi02Y2P0dtv_&D4wEI6ZvD_VYj;c6jAS+xo@H(ys5ud)!|8p!^Ge zd3EsV!O#9nlY#s?pswx1H)p=QUw&uF!}geq+egE19KGKU|KNC`9KD+FygmH&wW~cm z)p79B%5|QMToFI_G}D`(*~3R4?B^`MHQkW6o#ke>!)7YpIT^27ld^s~e{o1dN%U|x5smJUt zgV*0x^~ref_Cf!f-lNT4G}pg7?7SP@kMHV|spc+n#Y>ajUEOEi_tCraa>YH{d!P1< z{^gOIJ2hv9yQBPMeI~Pg=j^aO!@ZvIy)rtW4jH*(=k2q@?Zrd-wGZbRU!VG~4qkbP z-x)gO>uw&Dhnw>q;`#L2t8Z>JPjfT3Uk7hd=L>n;kAs({Z#*;iw~HGrf8BZabk{Q+ zzB7GrKbNmu=iM`!dyi(8fmaU4GdP^**WP?HuRflQJx8|P^y19Eqw-ho*LgdmueoyO z!9Mlt+}y8SxBT9lr@@^mPm>?b`@{VeC)@7VtdIZY8{Y30PL>}B@%5Ouws&_bj)%`| zukY6xvdxs+oizBB+u7~icjMP>mn(1H9lZGNdwz8|7wVeta%Xhbi@R{=?ag;?NBQRP zo16Pie)D#kGxU_N7hfOluN}Lud7A$2xSm7r_kx4^?Xa18+HZd8(^XG>&Y{1&^ed}F z*4~WV=Dzl;2iLROv32LxZ|=L5(`7GK(+l}{Hjci}s&fxG@hDXok-MP!tJbic9)A^TQPw!zK z^u6eW?cE(TJ@hNf1M9{4UIs6nubO$ZnLYL5irY_X#%*+#&e8WQGrad8N0YNx zZy)^^%3s-E+@&gZtA6#i$60<0gSegD zymz(l(%oFV&L6IK;NNF<-=3?N2i7xOcir9rt-j85xtDh7_0DWJ_uV>&*4^w3`^&p| zx#7)M2c5_L>>KN+m7BR8JR8UN){+*XC>aMq3`JKCb-VqJ92Upzl z?6_vX?!XVfax{H1gMF%(=cgA(oA=;dRGV4P|BqR>`@qdR3%W!7W||HeSl{KjIGs>e z-;-V%FC4ypzQJq0`s!^j{=)5R?>@Kr`a0KR-umpg&d#I#B`?EUoSy5Qw!gFNaDDJ_ zXS#PDfA`n?mtI}d(H^|dIaq!B?ZxYS9eg~_v-9D*^K5N*+OO>9y34)J+2`_2uJ5Ux z_29i*JCA<*=$D5Md7vKojXP(T+t^+juHEf1SKk?3usRNIZTM<^|FjGB&}PR$+Te>T zZ-&3}^vmze(YB5ooX=aYSvP!j)ZbpY>gINtq1?5Xo4L=<)w|E770tZ*_CCIPFTH=4 zymEeD_?@>`AI?+W40+(i59i^7c)5++*L}~;n#VJ9_s!AZ?&ZgKml^ELTh1)MGxYMj zkOrMYx9hTReCc|tukI6Mtr=Wajm&ilLM z*Ja;1JAM1hn|mfd4)Vh59NBudPv7R7rPXWR-P=nq?yR$9_g=m|^^M1O!w>o3=Iw)K z=ak#pL*QPb<tqS*?1zFJ2D5`egOhzh@mX8|$a({k4zJzvrrV z=SO=zyn|-m?l1ktUme5MZyuz{T|14x`^C|VfAvjfykCAAA9P-I|175!n`_3ry}Cx9 zd2}5zP?rA7%Lkpcdv^cUyPF5~cD^{7YCF@tetbDSgLE@racg$SJA1jA=bd?+wXqpp z7yiXJp38?XUT5@fd$za3S(_{GoO0%N?zy@8FTVPoXW!iZEj!zHB?EgVZ#(JLbPblT zxAX4n{&kPnXSwp_UU%AO?K`%kv%dOq?QF)p_04a6pV3`*pIv@5-_Pd1x~lz}_nqy| zEA~6&d-Yd;&6BOR_pM#J^Lf9JclY3B>3B$ocz*orI~$#MXS)_72b;aP(cN`>?Stl?^B4Z|Z0@?(=5}UwciEaO-Ol&I`gwM?o@!=z zE^e>=@(fqK^VYia4Yt=zmw_){ZliuVs1I)6)x$&61>03`bsim%2X21nzI?JWu#2Xco|(q^W~vI9{)_YkIu8_dS>posys(*i%=DgJP7l4fwO^gh`YxK$*Ymee2hW9<2j`6LI&iahrfW$8|>iI?K)6y&bw=o_gC+KYpVutUl+?Gny{Q59N3-zS{O*y*yASEH96< z*INxg_}}H5?fiA7bDY(^TzT)__h5I9TyZ>hU0+zOb32BoZN7WwUzzb<{(a8Nck%5r z!+oFfGk5287s$8Yas9l-OV{OG$V>13`W^5w)y$hv$QQv)9v^w^;paerY|AXVC1d%~hY- zySeys&Kqv?v$k^Bfm3vNQb)iUjJzH&dt*O76-R3yMO;Z z%UqnC3|^OWhwp6X`<1)0&6tb3do(>S?U&yE&bv=fJ)QY~`6g43ocB$G&agv0-M6=% z@zvY8zIMp)Zmd_we2)EDX!Yyb+TPt^^SWStygh^OOS?Ln`^sKE?_q0tUi#O)n|a;0 zd7jN(ciLPt?p#i{Ts8i!)nnFUZ>E~L-J5GiXPq1Cxw^{r+|JuWySi~#rgs~?-*r3j zI$-nsxU28-@Nb+vPS@PSv+q#99OQ-NXKwcL;P{}P7s@%Kxz65id#cMr+FS>0CD{gzMU~}bO z^Y%NZ{GNB$rR%AeuUhBroxOVJdim&so@(^#cTs;co#lu7dUV0@ex1qp3-t_culo%D z*SQ@!;ns9Q`qy5~T+{(+_KliI=r;us?Tiy%iK;~a*#)_9oENFjt}z8&WD3E8OTrHdwrd+-iy=Q?+^F# zSMPnw&wTCWJNK;SHs6fDkD~wI81+qu&$oH|#_My9N7t*b_uU=x_2BmT*RHR)eKh<& zYxr{JD|c~vA%EYbl=|b;P^Mv z^}x$lu0FHxVfH?gTd%$^Zfm{EYnFk|fy2`}?><^l$M$~lyw1G7 zlULr^yJPd!r@wpWeFxw3_PqG<>DYI$)9W=?bLQ6cROi`TdEG^Gb60BCnz?-EEAL!ByRI*+*W8|8S-Q;ZdT4`R@8MTgk6!-i)I0B+ zZ;)qmyJPFJ!{%`-||NYN@{;z-h>%aULB@B-D literal 0 HcmV?d00001 diff --git a/gfx/vehicles/raptor_cross.tga b/gfx/vehicles/raptor_cross.tga new file mode 100644 index 0000000000000000000000000000000000000000..4eb3b66c22e0bc4d45065d901061bd2547afe695 GIT binary patch literal 16428 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 XP+eJ*SF5Yim6cwp=eLu239tPRDHU2t literal 0 HcmV?d00001 diff --git a/gfx/vehicles/sb_cells.tga b/gfx/vehicles/sb_cells.tga new file mode 100644 index 0000000000000000000000000000000000000000..536531480ab65bc94998acb4bcde66e248153660 GIT binary patch literal 14636 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 literal 0 HcmV?d00001 diff --git a/gfx/vehicles/sb_rocket.tga b/gfx/vehicles/sb_rocket.tga new file mode 100644 index 0000000000000000000000000000000000000000..e2b4df2fada3c8d00d8bc04c49eb8d41fa409012 GIT binary patch literal 14636 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 literal 0 HcmV?d00001 diff --git a/gfx/vehicles/sbot-xhair.tga b/gfx/vehicles/sbot-xhair.tga new file mode 100644 index 0000000000000000000000000000000000000000..caad1d71cc33b0b162c06e5420ace330dbcf692d GIT binary patch literal 16428 zcmeI2T}WkB6vriOEVXXxP&W|mAsiKonl#iGr(njf7_|=xx`Cs=!v27zVrb?BZ`9f&|n|aR0EQt$don}y~y-XPqu!ivo71iJ>&fxueA?s&N+Lpz5Z+c z_u5})pNx$AGW0r=aVF!52lUO}Ed!PT%YbFTGGH073|Iy%1C{~HfMvikkPHS&N=lw- zZ*RXiK0f}*%F4% z_aC(%@!&T$Hip*L)_zjAH#RnQCnqPbc6WCV*VfiH7ZnwiWMySNNRsDMPZ` zdv(vw&VH!1wY6(>bo9#V>gtbsdwX{z{YjfhAN`d$O|>obE3m)>n}jXc zgl*WE3L9ElS~@m2H^cK1_~ykpl?vQQI>9or&1bRkw%FPksb0K!b8~ZFDaOLW!Z*FW zy&qInRh3stp}E1R)UQU*n&-BTX^2Z=2-Pcl2_lix3_=m z>+Ab4H#hf@NOI|rhi%x1t+ZF791!#9L0>2odIuj_(-ssIJYH5-R#8(^(;%syXUPjv z77Gu}&CM4ib;MGK^{|Uy>EbsCekFOjR>oH403Tw}ud<9I^d+0$n z7#ka#mNcVx$?K;qmU(GpWMoRxM~Zpa9o>R)+Q7#KCy{63V>7nnLp)=mjHR8_r@s?d zaEt!I!NGCX>DATMb$NMtkCNoMo;=Es(RMh@AAFD2e-HjJm_GQYk;P_g#|P$x!))=E z%X~6TUB(s4h%Y#1|58|3_#}Cz{p7&`GRRVX*cD6s8~8(tKQS@!DG3}Gf7r!$)`!@R z5BPGJE#7kGRO&LeQbr#q*5F-bP5;TG3>o^P$|UP<;Mb{67k^6M1;0-4XOJZi+wlQk zR3_THu4|ZMsKYpiZ^WG7(r>5S_Pd}wPzFBZl8M6@hYb5Ut!I|=j4sO9FCxpkDT7YM zmp1=QWwai7UVLoFe|#}@Me`iNfAD8q|LM2tzvCP427Wk3z)~Cid^2R=2>;Q2VBB{7 zcko^R72n~Xe&FIyEB~wwT>tMx}7#5DdBV=6}*ko4V+KjPnsKh00Z-Hm_n z!`!;~X8aSQX8hOTe?0MTjDPQAzdQc)d&WQdf#ZLi<6nn2&i%MD#=r3ROPiCZnU`sI7(zko6STxOi7t%)}h&+roG{1K6;76MOz`yLyzb9n=3nViCx$7Ti zzhkU_SbymHhqaHn{yDJzxSKCp=IuY4?{_!WU;TpZU4I?GPjvl*4eX=nKc4lku0PH7 z?}7EFpZ(r^Vn5pW*Sf@k^o1bffsAwYjCDNIKPW@av;IwJFL=!MKLOfZ+ROPqAhv(0 zyd`o+4{^XnpYrT~PqG(Hll`x=-o?&D_kLc!=nMbX?;pwqVBkTIa^w5=wN!Axw_m=k)3@F4-`Rfl97R5762|$* zjTE1Mr0p3HZ9^N;M^kYAwVQ5dKi*iQFX(sx5A5gUEc23_X`b@R`n|j7pO>hM4lZ<} z+pkW#<;$7%8*+C2^S{>b?{lW@o_`O?S@(I)yzz&`S-5fjef2n>f1B;VdQ|>lcw7Eu zaLz83i)il0{r?A(2cG4hmS_35MgDR5SpIdn>Hh!n7r(%`|G(UH|9`oNthc^>w+vVY xECZGS%YbFTGGH073|Iy%1C{~HKr$G3_2t*jwl%!c(0u->*UvS)boS|te*ou#pTGbB literal 0 HcmV?d00001 diff --git a/gfx/vehicles/sbot-xhair2.tga b/gfx/vehicles/sbot-xhair2.tga new file mode 100644 index 0000000000000000000000000000000000000000..a66866cbaf87bb5fba2b9b684d52a146e7143b7b GIT binary patch literal 16428 zcmeI3Jxpaq6vtmgL~9ziA<($dL<7A`Uh_;yba$h&v7~{57PnACo~^X9K)EKgt|eJY zNzG#+R?(0HKnK;waWJTN{!J~1^lb#r!h_SXFT{0Ga+%bzbTE#045rIA=C1V+Ph%90oI+Jo$vm3e}Bo}>gsCu>^n5fd3bD}$o`FXbTL1e zZ9P)6hHg9lz;pSIyw zXutv{Z6D;5vC(m7FOTU0pV+b$qqF@f_QONYfDSO_%rUDkQP%)91%)S$f^C4VdB1YuQ zP39Rq@P_32+Q9}!u=@I|wt-!9n_L-%{Vy34dnL9D?`5t&_`sUu@0bqVkI6q`w7&iv zOpLwYe*}+DR;-Qu3*Nfs0C*(#e#AJ&bcgySmpubhS?AK(Y#wZ!)=V!Zy-7*2mbwu1$J8V*sE#^7vi8FawEv68^da)ZGmDBH2ZD(I#P5a`S z)4vEtS3fudJ2q6+FSWSO$n~h(P?tzqOM-*_t5*l9s@L){r?4H_w$Hv3v%pFn3GCDp zEluh>XA7yxJ)tgDR=2V87$Y#V25n#NJ2H^PK9tHUSjWH&c5F!Hvvkzys8#yvb(XgH z&RndLzZPZaZ)`^vGPNz`>9F6;#hxNNg@*kd>?yQmG{`_!8OJ0Iz510$+GWs7F{k{9se$PLJ^Y2w2tNAE6 z>>qt0{B^Z!Jg~ZXr%(0p+ns-JYFqA;^N!4?O=RcthUf)XS^c9n|A86ooQFbKQrcP5 z$m(}JoB10(zo%de(TJ{E>R-qwuGCQf?BO9cmc-BAHzRe#Pv)4bf4&eWLq02O*E!(3 z+b`qOKIV_um2`f`-|7S9&w18e|3Fa8+d(vwoP*%XL~I%&+5>3d{FrQAzE8=_Gi~`Qtjt_gAVuo!$56U zAGq&d9-=ok51_#o z@MZD5z;EgY)FsO9QRst4@2?a){Os-ckvtMzqhh;a 200) { wcross_color_x = 0; @@ -945,7 +936,7 @@ void CSQC_UpdateView(float w, float h) { wcross_color_x = 1; wcross_color_y = 1; - wcross_color_z = 0.2 + (x-50)*0.02 * 0.8; + wcross_color_z = 0.2 + (x-50)*0.02 * 0.8; } else if(x > 20) { @@ -989,7 +980,7 @@ void CSQC_UpdateView(float w, float h) wcross_scale += sin(pickup_crosshair_size) * autocvar_crosshair_pickup; } - + vector hitindication_color; if(autocvar_crosshair_hitindication) { @@ -1073,7 +1064,7 @@ void CSQC_UpdateView(float w, float h) float ring_value, ring_scale, ring_alpha, ring_inner_value, ring_inner_alpha; string ring_image, ring_inner_image; vector ring_rgb, ring_inner_rgb; - + ring_scale = autocvar_crosshair_ring_size; float weapon_clipload, weapon_clipsize; @@ -1086,30 +1077,30 @@ void CSQC_UpdateView(float w, float h) if(nex_charge_movingavg == 0) // this should only happen if we have just loaded up the game nex_charge_movingavg = nex_charge; - + // handle the values if (activeweapon == WEP_NEX && nex_charge && autocvar_crosshair_ring_nex) // ring around crosshair representing velocity-dependent damage for the nex { - if (nex_chargepool || use_nex_chargepool) { - use_nex_chargepool = 1; + if (nex_chargepool || use_nex_chargepool) { + use_nex_chargepool = 1; ring_inner_value = nex_chargepool; - } else { + } else { nex_charge_movingavg = (1 - autocvar_crosshair_ring_nex_currentcharge_movingavg_rate) * nex_charge_movingavg + autocvar_crosshair_ring_nex_currentcharge_movingavg_rate * nex_charge; - ring_inner_value = bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1); + ring_inner_value = bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1); } - + ring_inner_alpha = wcross_alpha * autocvar_crosshair_ring_nex_inner_alpha; ring_inner_rgb = eX * autocvar_crosshair_ring_nex_inner_color_red + eY * autocvar_crosshair_ring_nex_inner_color_green + eZ * autocvar_crosshair_ring_nex_inner_color_blue; ring_inner_image = "gfx/crosshair_ring_inner.tga"; - + // draw the outer ring to show the current charge of the weapon ring_value = nex_charge; ring_alpha = wcross_alpha * autocvar_crosshair_ring_nex_alpha; ring_rgb = wcross_color; ring_image = "gfx/crosshair_ring_nexgun.tga"; } - else if (activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer) + else if (activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer) { ring_value = bound(0, getstati(STAT_LAYED_MINES) / minelayer_maxmines, 1); // if you later need to use the count of bullets in another place, then add a float for it. For now, no need to. ring_alpha = wcross_alpha * autocvar_crosshair_ring_minelayer_alpha; @@ -1117,7 +1108,7 @@ void CSQC_UpdateView(float w, float h) ring_image = "gfx/crosshair_ring.tga"; } - if(autocvar_crosshair_ring_reload && weapon_clipsize) // forces there to be only an ammo ring + if(autocvar_crosshair_ring_reload && weapon_clipsize) // forces there to be only an ammo ring { // if the main ring is already used by another weapon, instead use the inner one for ammo. // inner ring is secondary anyway and doesn't matter as much as main ring, so overriding it is no issue. @@ -1134,7 +1125,7 @@ void CSQC_UpdateView(float w, float h) ring_scale = autocvar_crosshair_ring_reload_size; ring_alpha = autocvar_crosshair_ring_reload_alpha; ring_rgb = wcross_color; - + // Note: This is to stop Taoki from complaining that the image doesn't match all potential balances. // if a new image for another weapon is added, add the code (and its respective file/value) here if ((activeweapon == WEP_SNIPERRIFLE) && (weapon_clipsize == 80)) @@ -1263,298 +1254,6 @@ void CSQC_UpdateView(float w, float h) R_SetView(VF_SIZE, '1 0 0' * w + '0 1 0' * h); } -#define spider_h "gfx/vehicles/hud_bg.tga" -#define spider_b "gfx/vehicles/sbot.tga" -#define spider_r "gfx/vehicles/sbot_rpods.tga" -#define spider_g "gfx/vehicles/sbot_mguns.tga" -#define spider_s "gfx/vehicles/shiled.tga" -#define spider_a1 "gfx/hud/sb_rocket.tga" -#define spider_a2 "gfx/sb_bullets.tga" - -void CSQC_SPIDER_HUD() -{ - float rockets, reload, heat, hp, shield; - vector picsize, hudloc; - - // Fetch health & ammo stats - hp = bound(0,getstatf(STAT_VEHICLESTAT_HEALTH), 1); - shield = bound(0,getstatf(STAT_VEHICLESTAT_SHIELD), 1); - heat = min(getstatf(STAT_VEHICLESTAT_RELOAD1), 2); - rockets = getstati(STAT_VEHICLESTAT_AMMO2); - reload = min(getstatf(STAT_VEHICLESTAT_RELOAD2), 1); - - // Draw the crosshairs - picsize = drawgetimagesize(SPIDER_CROSS); - picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size; - picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size; - drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL); - - hudloc_y = 4; - hudloc_x = 4; - - picsize = drawgetimagesize(spider_h) * 0.5; - drawpic(hudloc, spider_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - - picsize = drawgetimagesize(spider_a2) * 0.5; - drawpic(hudloc + '120 96 0', spider_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - - drawstring(hudloc + '145 19 0', strcat(ftos(rint(hp * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL); - drawstring(hudloc + '175 34 0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL); - drawstring(hudloc + '136 102 0', strcat(ftos(100 - rint(heat * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL); - - picsize = drawgetimagesize(spider_a1) * 0.85; - if(rockets == 9) - { - drawpic(hudloc + '132 54 0', spider_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL); - drawstring(hudloc + '179 69 0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL); - } - else - { - drawpic(hudloc + '132 54 0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawstring(hudloc + '179 69 0', strcat(ftos(9 - rockets), "/8"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL); - } - - picsize = drawgetimagesize(spider_b) * 0.5; - hudloc_y = 10.5; - hudloc_x = 10.5; - - drawpic(hudloc, spider_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL); - drawpic(hudloc, spider_b, picsize, '0 1 0' * hp + '1 0 0' * (1 - hp), 1, DRAWFLAG_NORMAL); - drawpic(hudloc, spider_r, picsize, '1 1 1' * reload + '1 0 0' * (1 - reload), 1, DRAWFLAG_NORMAL); - drawpic(hudloc, spider_g, picsize, '1 1 1' * (1 - heat) + '1 0 0' * heat, 1, DRAWFLAG_NORMAL); - - - /* - // Draw health bar - p = '0.5 0 0' * (vid_conwidth - (rkt_size * 8)); - p = p + '0 1 0' * vid_conheight - '0 32 0'; - //pp = ('0 1 0' * hp) + ('1 0 0' * (1-hp)); - drawfill(p, '256 0 0' * shield + '0 8 0' , '0.5 0.5 1', 0.75, DRAWFLAG_NORMAL); - p_y += 8; - drawfill(p, '256 0 0' * hp + '0 8 0' , '0 1 0', 0.75, DRAWFLAG_NORMAL); - p_x += 256 * hp; - drawfill(p, '256 0 0' * (1-hp) + '0 8 0' , '0 0 0', 0.75, DRAWFLAG_NORMAL); - - // Draw minigun heat indicator - p = '0.5 0 0' * (vid_conwidth - 256); - p = p + '0 1 0' * vid_conheight - '0 34 0'; - drawfill(p, '256 0 0' * (1-heat) + '0 2 0' ,'0 0 1', 0.5, DRAWFLAG_NORMAL); - p_x += 256 * (1-heat); - drawfill(p, '256 0 0' * heat + '0 2 0' , '1 0 0', 0.5, DRAWFLAG_NORMAL); - - - // Draw rocket icons for loaded/empty tubes. - pp = '0.5 0 0' * (vid_conwidth - (rkt_size * 8)); - pp += '0 1 0' * vid_conheight - '0 64 0'; - for(i = 0; i < 8; ++i) - { - p = pp + '1 0 0' * (rkt_size * i); - if(rockets == 8) - { - if(floor(reload * 8) == i) - { - drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '1 0 0' + '0 1 0' * ((reload*8)-i), 0.75 , DRAWFLAG_NORMAL); - } - else if(i < reload * 8) - drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '1 1 0', 0.75 , DRAWFLAG_NORMAL); - else - drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0.5 0.5 0.5', 0.75, DRAWFLAG_NORMAL); - } - else - { - if(i < rockets) - drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0 0 0', 0.25, DRAWFLAG_NORMAL); - else - drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0 1 0' * reload, 0.75, DRAWFLAG_NORMAL); - } - } - */ - - if (scoreboard_showscores) - { - HUD_DrawScoreboard(); - HUD_DrawCenterPrint(); - } - -} - -#define raptor_h "gfx/vehicles/hud_bg.tga" -#define raptor_b "gfx/vehicles/raptor.tga" -#define raptor_g1 "gfx/vehicles/raptor_guns.tga" -#define raptor_g2 "gfx/vehicles/raptor_bombs.tga" -#define raptor_s "gfx/vehicles/shiled.tga" - -void CSQC_RAPTOR_HUD() -{ - float reload, hp, shield, energy; - vector picsize, hudloc; - - // Fetch health & ammo stats - hp = bound(0,getstatf(STAT_VEHICLESTAT_HEALTH), 1); - shield = bound(0,getstatf(STAT_VEHICLESTAT_SHIELD), 1); - reload = min(getstatf(STAT_VEHICLESTAT_RELOAD1), 1); - energy = min(getstatf(STAT_VEHICLESTAT_ENERGY), 1); - - // Draw the crosshairs - picsize = drawgetimagesize(SPIDER_CROSS); - picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size; - picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size; - drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL); - - hudloc_y = 4; - hudloc_x = 4; - - picsize = drawgetimagesize(raptor_h) * 0.5; - drawpic(hudloc, raptor_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - - picsize = drawgetimagesize(spider_a2) * 0.5; - drawpic(hudloc + '120 96 0', spider_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - - drawstring(hudloc + '145 19 0', strcat(ftos(rint(hp * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL); - drawstring(hudloc + '175 34 0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL); - drawstring(hudloc + '136 102 0', strcat(ftos(rint(energy * 100)), "%"),'15 15 0','0.5 0.5 1', 1, DRAWFLAG_NORMAL); - - - picsize = drawgetimagesize(spider_a1) * 0.85; - if(reload == 1) - { - drawpic(hudloc + '132 54 0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawstring(hudloc + '179 69 0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','0 1 0', 0.5, DRAWFLAG_NORMAL); - } - else - { - drawpic(hudloc + '132 54 0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawstring(hudloc + '179 69 0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','0 0 1', 1, DRAWFLAG_NORMAL); - } - - picsize = drawgetimagesize(raptor_b) * 0.5; - hudloc_y = 10.5; - hudloc_x = 10.5; - - drawpic(hudloc, raptor_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL); - drawpic(hudloc, raptor_b, picsize, '0 1 0' * hp + '1 0 0' * (1 - hp), 1, DRAWFLAG_NORMAL); - drawpic(hudloc, raptor_g1, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); - drawpic(hudloc, raptor_g2, picsize, '1 1 1' * reload + '1 0 0' * (1 - reload), 1, DRAWFLAG_NORMAL); - - - if (scoreboard_showscores) - { - HUD_DrawScoreboard(); - HUD_DrawCenterPrint(); - } - -} - -#define waki_h "gfx/vehicles/hud_bg.tga" -#define waki_b "gfx/vehicles/waki.tga" -#define waki_e "gfx/vehicles/waki_e.tga" -#define waki_g "gfx/vehicles/waki_guns.tga" -#define waki_r "gfx/vehicles/waki_rockets.tga" -#define waki_s "gfx/vehicles/shiled.tga" - -#define waki_a1 "gfx/hud/sb_rocket.tga" -#define waki_a2 "gfx/sb_cells.tga" - -void CSQC_WAKIZASHI_HUD() -{ - // 0--1 floats. 1 = 100%, 0.6 = 50%. - float health, shield, energy, rockets; - vector picsize, hudloc; - - picsize = drawgetimagesize(SPIDER_CROSS); - picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size; - picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size; - drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL); - -/* -const float STAT_VEHICLESTAT_HEALTH = 60; -const float STAT_VEHICLESTAT_SHIELD = 61; -const float STAT_VEHICLESTAT_ENERGY = 62; -const float STAT_VEHICLESTAT_AMMO1 = 63; -const float STAT_VEHICLESTAT_RELAOD1 = 64; -const float STAT_VEHICLESTAT_AMMO2 = 65; -const float STAT_VEHICLESTAT_RELOAD2 = 66; -*/ - health = min(getstatf(STAT_VEHICLESTAT_HEALTH), 1); - shield = min(getstatf(STAT_VEHICLESTAT_SHIELD), 1); - energy = min(getstatf(STAT_VEHICLESTAT_ENERGY), 1); - rockets = bound(0,getstatf(STAT_VEHICLESTAT_RELOAD1), 1); - - hudloc_y = 4; - hudloc_x = 4; - - picsize = drawgetimagesize(waki_h) * 0.5; - drawpic(hudloc, waki_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - - picsize = drawgetimagesize(waki_a2) * 0.7; - drawpic(hudloc + '116 92 0', waki_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - - - drawstring(hudloc + '145 19 0', strcat(ftos(rint(health * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL); - drawstring(hudloc + '175 34 0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL); - - drawstring(hudloc + '136 102 0', strcat(ftos(rint(energy * 100)), "%"),'14 14 0','1 1 1', 1, DRAWFLAG_NORMAL); - - picsize = drawgetimagesize(waki_a1) * 0.75; - if(rockets == 1) - { - drawpic(hudloc + '140 55 0', waki_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawpic(hudloc + '144 59 0', waki_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - } - else - { - drawpic(hudloc + '140 55 0', waki_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL); - drawpic(hudloc + '144 59 0', waki_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL); - drawstring(hudloc + '165 69 0', strcat(ftos(rint(rockets * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL); - } - - picsize = drawgetimagesize(waki_b) * 0.5; - hudloc_y = 10.5; - hudloc_x = 10.5; - - drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL); - drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0' * (1 - health), 1, DRAWFLAG_NORMAL); - drawpic(hudloc, waki_r, picsize, '1 1 1' * rockets + '1 0 0' * (1 - rockets), 1, DRAWFLAG_NORMAL); - drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); - - - - /* - p = '0.5 0 0' * (vid_conwidth - (rkt_size * 8)); - p = p + '0 1 0' * vid_conheight - '0 32 0'; - - // Draw health bar - p_y += 8; - drawfill(p, '256 0 0' * health + '0 8 0' , '0 0.7 0', 0.75, DRAWFLAG_NORMAL); - p_x += 256 * health; - drawfill(p, '256 0 0' * (1 - health) + '0 8 0' , '0 0 0', 0.75, DRAWFLAG_NORMAL); - - // Draw shiled bar - p_x -= 256 * health; - p_y += 4; - drawfill(p, '256 0 0' * shield + '0 4 0' , '0.25 0.25 1', 0.5, DRAWFLAG_NORMAL); - - // Draw energy - //p_x -= 256 * health; - p_y -= 8; - drawfill(p, '256 0 0' * energy + '0 4 0' , '1 1 1', 0.75, DRAWFLAG_NORMAL); - - // Draw rockets bar - p_y += 12; - drawfill(p, '256 0 0' * rockets + '0 4 0' , '1 0 0', 0.75, DRAWFLAG_NORMAL); - */ - - - - - if (scoreboard_showscores) - { - HUD_DrawScoreboard(); - HUD_DrawCenterPrint(); - } - -} - void CSQC_common_hud(void) { @@ -1590,7 +1289,7 @@ void CSQC_common_hud(void) HUD_DrawScoreboard(); if (scoreboard_active) // scoreboard/accuracy - { + { HUD_Reset(); // HUD_DrawScoreboard takes care of centerprint_start } diff --git a/qcsrc/client/casings.qc b/qcsrc/client/casings.qc index 860e8296f..423896f39 100644 --- a/qcsrc/client/casings.qc +++ b/qcsrc/client/casings.qc @@ -75,7 +75,7 @@ void Ent_Casing(float isNew) { entity casing; - casing = RubbleNew("casing"); + casing = RubbleNew("casing"); casing.state = ReadByte(); casing.silent = (casing.state & 0x80); casing.state = (casing.state & 0x7F); diff --git a/qcsrc/client/progs.src b/qcsrc/client/progs.src index 1334d7d3c..6e8564f30 100644 --- a/qcsrc/client/progs.src +++ b/qcsrc/client/progs.src @@ -56,7 +56,7 @@ modeleffects.qc tuba.qc target_music.qc -//vehicles/spiderbot.qc +vehicles/vehicles.qc Main.qc View.qc interpolate.qc diff --git a/qcsrc/client/vehicles/racer.qc b/qcsrc/client/vehicles/racer.qc new file mode 100644 index 000000000..e69de29bb diff --git a/qcsrc/client/vehicles/raptor.qc b/qcsrc/client/vehicles/raptor.qc new file mode 100644 index 000000000..e69de29bb diff --git a/qcsrc/client/vehicles/spiderbot.qc b/qcsrc/client/vehicles/spiderbot.qc new file mode 100644 index 000000000..e69de29bb diff --git a/qcsrc/client/vehicles/vehicles.qc b/qcsrc/client/vehicles/vehicles.qc new file mode 100644 index 000000000..6420e89ff --- /dev/null +++ b/qcsrc/client/vehicles/vehicles.qc @@ -0,0 +1,398 @@ +#define spider_rocket_icon "gfx/vehicles/rocket_ico.tga" +#define spider_rocket_targ "gfx/vehicles/target.tga" +//#define SPIDER_CROSS "textures/spiderbot/cross.tga" +#define SPIDER_CROSS "gfx/vehicles/sbot-xhair.tga" +#define SPIDER_CROSS2 "gfx/vehicles/sbot-xhair2.tga" + +#define spider_h "gfx/vehicles/hud_bg.tga" +#define spider_b "gfx/vehicles/sbot.tga" +#define spider_r "gfx/vehicles/sbot_rpods.tga" +#define spider_g "gfx/vehicles/sbot_mguns.tga" +#define spider_s "gfx/vehicles/shiled.tga" +#define spider_a1 "gfx/vehicles/sb_rocket.tga" +#define spider_a2 "gfx/vehicles/sb_bullets.tga" + +#define raptor_h "gfx/vehicles/hud_bg.tga" +#define raptor_s "gfx/vehicles/shiled.tga" + +#define raptor_b "gfx/vehicles/raptor.tga" +#define raptor_g1 "gfx/vehicles/raptor_guns.tga" +#define raptor_g2 "gfx/vehicles/raptor_bombs.tga" +#define raptor_d "gfx/vehicles/dropcross.tga" +#define raptor_c "gfx/vehicles/raptor_cross.tga" + +entity dropmark; +vector lastpos; + + +void CSQC_WAKIZASHI_HUD(); +void CSQC_SPIDER_HUD(); +void CSQC_RAPTOR_HUD(); + +entity AuxiliaryXhair; +void AuxiliaryXhair_Draw2D() +{ + vector loc, psize; + + psize = 0.5 * drawgetimagesize(SPIDER_CROSS2); + loc = project_3d_to_2d(self.origin) - 0.5 * psize; + loc_z = 0; + psize_z = 0; + drawpic(loc, SPIDER_CROSS2, psize, '0 1 1', 1, DRAWFLAG_ADDITIVE); + +} + +void Ent_AuxiliaryXhair(float isNew) +{ + entity ax; + + if(isNew) + { + AuxiliaryXhair = spawn(); + AuxiliaryXhair.draw2d = AuxiliaryXhair_Draw2D; + setmodel(AuxiliaryXhair, "null"); + setsize(AuxiliaryXhair, '0 0 -1', '0 0 -1'); + } + + AuxiliaryXhair.origin_x = ReadCoord(); + AuxiliaryXhair.origin_y = ReadCoord(); + AuxiliaryXhair.origin_z = ReadCoord(); + AuxiliaryXhair.drawmask = MASK_NORMAL; + //AuxiliaryXhair.solid = SOLID_NOT; +} + +void Vehicles_Precache() +{ + //precache_model("models/ax_shell.mdl"); + //precache_sound("weapons/brass1.wav"); +} + + +void CSQC_SPIDER_HUD() +{ + float rockets, reload, heat, hp, shield; + vector picsize, hudloc; + + // Fetch health & ammo stats + hp = bound(0,getstatf(STAT_VEHICLESTAT_HEALTH), 1); + shield = bound(0,getstatf(STAT_VEHICLESTAT_SHIELD), 1); + heat = min(getstatf(STAT_VEHICLESTAT_RELOAD1), 2); + rockets = getstati(STAT_VEHICLESTAT_AMMO2); + reload = min(getstatf(STAT_VEHICLESTAT_RELOAD2), 1); + + + hudloc_y = 4; + hudloc_x = 4; + drawfill('130 28 0', ('115 0 0' * hp) + '0 10 0', hp * '0 1 0' + (1 - hp) * '1 0 0', 0.5, DRAWFLAG_NORMAL); + picsize = drawgetimagesize(spider_h) * 0.5; + drawpic(hudloc, spider_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + + picsize = drawgetimagesize(spider_a2) * 0.5; + drawpic(hudloc + '120 96 0', spider_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + + drawstring(hudloc + '145 19 0', strcat(ftos(rint(hp * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL); + drawstring(hudloc + '175 34 0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL); + drawstring(hudloc + '136 102 0', strcat(ftos(100 - rint(heat * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL); + + picsize = drawgetimagesize(spider_a1) * 0.85; + if(rockets == 9) + { + drawpic(hudloc + '132 54 0', spider_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL); + drawstring(hudloc + '179 69 0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL); + } + else + { + drawpic(hudloc + '132 54 0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawstring(hudloc + '179 69 0', strcat(ftos(9 - rockets), "/8"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL); + } + + picsize = drawgetimagesize(spider_b) * 0.5; + hudloc_y = 10.5; + hudloc_x = 10.5; + + drawpic(hudloc, spider_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL); + drawpic(hudloc, spider_b, picsize, '0 1 0' * hp + '1 0 0' * (1 - hp), 1, DRAWFLAG_NORMAL); + drawpic(hudloc, spider_r, picsize, '1 1 1' * reload + '1 0 0' * (1 - reload), 1, DRAWFLAG_NORMAL); + drawpic(hudloc, spider_g, picsize, '1 1 1' * (1 - heat) + '1 0 0' * heat, 1, DRAWFLAG_NORMAL); + + + if (scoreboard_showscores) + { + HUD_DrawScoreboard(); + HUD_DrawCenterPrint(); + } + else + { + + /* + float movedt, vel; + movedt = time - self.move_time; + self.move_time = time; + vel = (view_origin - lastpos) * (1 / movedt); + lastpos = view_origin; + dprint("vel: ", ftos(vel), " angles: ", vtos(self.angles), "\n"); + */ + + /* + dprint("aim1: ", vtos(aim1), " aim2: ", vtos(aim2), "\n"); + aim2_x *= -1; + makevectors(aim2); + te_lightning1(self, view_origin, view_origin + v_forward * MAX_SHOT_DISTANCE); + traceline(view_origin, view_origin + v_forward * MAX_SHOT_DISTANCE, MOVE_WORLDONLY, self); + aim2 = trace_endpos; + + + aim1 = aim1 + view_origin; + + // Draw the crosshairs + aim1 = project_3d_to_2d(aim1); + aim2 = project_3d_to_2d(aim2); + + picsize = 0.5 * drawgetimagesize(SPIDER_CROSS2); + aim2 = aim2 - 0.5 * picsize; + aim2_z = 0; + picsize_z = 0; + drawpic(aim2, SPIDER_CROSS2, picsize, '0 1 1', 1, DRAWFLAG_ADDITIVE); + + picsize = 0.5 * drawgetimagesize(SPIDER_CROSS2); + aim1 = aim1 - 0.5 * picsize; + aim1_z = 0; + picsize_z = 0; + drawpic(aim1, SPIDER_CROSS2, picsize, '1 0 0', 1, DRAWFLAG_ADDITIVE); + + */ + picsize = drawgetimagesize(SPIDER_CROSS); + picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size; + picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size; + + drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_ADDITIVE); + + } + +} + + +void CSQC_RAPTOR_HUD() +{ + if(autocvar_r_letterbox) + return; + + float reload, hp, shield, energy; + vector picsize, hudloc, vel; + float movedt; + vector where; + + if(!dropmark) + { + dropmark = spawn(); + dropmark.owner = self; + } + + movedt = time - dropmark.move_time; + dropmark.move_time = time; + vel = (view_origin - lastpos) * (1 / movedt); + lastpos = view_origin; + + // Fetch health & ammo stats + hp = bound(0,getstatf(STAT_VEHICLESTAT_HEALTH), 1); + shield = bound(0,getstatf(STAT_VEHICLESTAT_SHIELD), 1); + reload = min(getstatf(STAT_VEHICLESTAT_RELOAD1), 1); + energy = min(getstatf(STAT_VEHICLESTAT_ENERGY), 1); + + // Draw the crosshairs + picsize = drawgetimagesize(raptor_c); + picsize_x *= 0.2; + picsize_y *= 0.2; + drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), raptor_c, picsize, '1 0 0' + '0 1 1' * energy, 0.5, DRAWFLAG_ADDITIVE); + + hudloc_y = 4; + hudloc_x = 4; + + picsize = drawgetimagesize(raptor_h) * 0.5; + drawpic(hudloc, raptor_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + + picsize = drawgetimagesize(spider_a2) * 0.5; + drawpic(hudloc + '120 96 0', spider_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + + drawstring(hudloc + '145 19 0', strcat(ftos(rint(hp * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL); + drawstring(hudloc + '175 34 0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL); + drawstring(hudloc + '136 102 0', strcat(ftos(rint(energy * 100)), "%"),'15 15 0','0.5 0.5 1', 1, DRAWFLAG_NORMAL); + + + picsize = drawgetimagesize(spider_a1) * 0.85; + if(reload == 1) + { + drawpic(hudloc + '132 54 0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawstring(hudloc + '179 69 0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','0 1 0', 0.5, DRAWFLAG_NORMAL); + } + else + { + drawpic(hudloc + '132 54 0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawstring(hudloc + '179 69 0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','0 0 1', 1, DRAWFLAG_NORMAL); + } + + picsize = drawgetimagesize(raptor_b) * 0.5; + hudloc_y = 10.5; + hudloc_x = 10.5; + + drawpic(hudloc, raptor_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL); + drawpic(hudloc, raptor_b, picsize, '0 1 0' * hp + '1 0 0' * (1 - hp), 1, DRAWFLAG_NORMAL); + drawpic(hudloc, raptor_g1, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); + drawpic(hudloc, raptor_g2, picsize, '1 1 1' * reload + '1 0 0' * (1 - reload), 1, DRAWFLAG_NORMAL); + + if(reload == 1) + { + where = dropmark.origin; + setorigin(dropmark, view_origin); + dropmark.velocity = vel; + tracetoss(dropmark, self); + + // Blend old with new predicted impact to smooth out jumpyness + where = project_3d_to_2d(trace_endpos * 0.2 + where * 0.8); + + setorigin(dropmark, trace_endpos); + picsize = drawgetimagesize(raptor_d) * 0.2; + + if not (where_z < 0 || where_x < 0 || where_y < 0 || where_x > vid_conwidth || where_y > vid_conheight) + { + where_x -= picsize_x * 0.5; + where_y -= picsize_y * 0.5; + where_z = 0; + drawpic(where, raptor_d, picsize, '0 2 0', 1, DRAWFLAG_ADDITIVE); + } + dropmark.cnt = time + 2; + } + else + { + if(dropmark.cnt > time) + { + where = project_3d_to_2d(dropmark.origin); + picsize = drawgetimagesize(raptor_d) * 0.25; + + if not (where_z < 0 || where_x < 0 || where_y < 0 || where_x > vid_conwidth || where_y > vid_conheight) + { + where_x -= picsize_x * 0.5; + where_y -= picsize_y * 0.5; + where_z = 0; + drawpic(where, raptor_d, picsize, '2 0 0', 1, DRAWFLAG_ADDITIVE); + } + } + } + + if (scoreboard_showscores) + { + HUD_DrawScoreboard(); + HUD_DrawCenterPrint(); + } + +} + +#define waki_h "gfx/vehicles/hud_bg.tga" +#define waki_b "gfx/vehicles/waki.tga" +#define waki_e "gfx/vehicles/waki_e.tga" +#define waki_g "gfx/vehicles/waki_guns.tga" +#define waki_r "gfx/vehicles/waki_rockets.tga" +#define waki_s "gfx/vehicles/shiled.tga" + +#define waki_a1 "gfx/vehicles/sb_rocket.tga" +#define waki_a2 "gfx/vehicles/sb_cells.tga" + +void CSQC_WAKIZASHI_HUD() +{ + // 0--1 floats. 1 = 100%, 0.6 = 50%. + float health, shield, energy, rockets; + vector picsize, hudloc; + + picsize = drawgetimagesize(SPIDER_CROSS); + picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size; + picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size; + drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL); + +/* +const float STAT_VEHICLESTAT_HEALTH = 60; +const float STAT_VEHICLESTAT_SHIELD = 61; +const float STAT_VEHICLESTAT_ENERGY = 62; +const float STAT_VEHICLESTAT_AMMO1 = 63; +const float STAT_VEHICLESTAT_RELAOD1 = 64; +const float STAT_VEHICLESTAT_AMMO2 = 65; +const float STAT_VEHICLESTAT_RELOAD2 = 66; +*/ + health = min(getstatf(STAT_VEHICLESTAT_HEALTH), 1); + shield = min(getstatf(STAT_VEHICLESTAT_SHIELD), 1); + energy = min(getstatf(STAT_VEHICLESTAT_ENERGY), 1); + rockets = bound(0,getstatf(STAT_VEHICLESTAT_RELOAD1), 1); + + hudloc_y = 4; + hudloc_x = 4; + + picsize = drawgetimagesize(waki_h) * 0.5; + drawpic(hudloc, waki_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + + picsize = drawgetimagesize(waki_a2) * 0.7; + drawpic(hudloc + '116 92 0', waki_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + + + drawstring(hudloc + '145 19 0', strcat(ftos(rint(health * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL); + drawstring(hudloc + '175 34 0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL); + + drawstring(hudloc + '136 102 0', strcat(ftos(rint(energy * 100)), "%"),'14 14 0','1 1 1', 1, DRAWFLAG_NORMAL); + + picsize = drawgetimagesize(waki_a1) * 0.75; + if(rockets == 1) + { + drawpic(hudloc + '140 55 0', waki_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawpic(hudloc + '144 59 0', waki_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + } + else + { + drawpic(hudloc + '140 55 0', waki_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL); + drawpic(hudloc + '144 59 0', waki_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL); + drawstring(hudloc + '165 69 0', strcat(ftos(rint(rockets * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL); + } + + picsize = drawgetimagesize(waki_b) * 0.5; + hudloc_y = 10.5; + hudloc_x = 10.5; + + drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL); + drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0' * (1 - health), 1, DRAWFLAG_NORMAL); + drawpic(hudloc, waki_r, picsize, '1 1 1' * rockets + '1 0 0' * (1 - rockets), 1, DRAWFLAG_NORMAL); + drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); + + + + /* + p = '0.5 0 0' * (vid_conwidth - (rkt_size * 8)); + p = p + '0 1 0' * vid_conheight - '0 32 0'; + + // Draw health bar + p_y += 8; + drawfill(p, '256 0 0' * health + '0 8 0' , '0 0.7 0', 0.75, DRAWFLAG_NORMAL); + p_x += 256 * health; + drawfill(p, '256 0 0' * (1 - health) + '0 8 0' , '0 0 0', 0.75, DRAWFLAG_NORMAL); + + // Draw shiled bar + p_x -= 256 * health; + p_y += 4; + drawfill(p, '256 0 0' * shield + '0 4 0' , '0.25 0.25 1', 0.5, DRAWFLAG_NORMAL); + + // Draw energy + //p_x -= 256 * health; + p_y -= 8; + drawfill(p, '256 0 0' * energy + '0 4 0' , '1 1 1', 0.75, DRAWFLAG_NORMAL); + + // Draw rockets bar + p_y += 12; + drawfill(p, '256 0 0' * rockets + '0 4 0' , '1 0 0', 0.75, DRAWFLAG_NORMAL); + */ + + + + + if (scoreboard_showscores) + { + HUD_DrawScoreboard(); + HUD_DrawCenterPrint(); + } + +} diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index 419ab73e8..fb17f6a0e 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -115,6 +115,7 @@ const float ENT_CLIENT_GAUNTLET = 29; const float ENT_CLIENT_ACCURACY = 30; const float ENT_CLIENT_TURRET = 40; +const float ENT_CLIENT_AUXILIARYXHAIR = 50; const float SPRITERULE_DEFAULT = 0; const float SPRITERULE_TEAMPLAY = 1; diff --git a/qcsrc/qc-client.cbp b/qcsrc/qc-client.cbp index 056b98ef2..70afff46f 100644 --- a/qcsrc/qc-client.cbp +++ b/qcsrc/qc-client.cbp @@ -21,6 +21,8 @@ + + @@ -39,6 +41,8 @@ + + @@ -81,6 +85,10 @@ + + + + diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index c78460c17..077289e2a 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -994,68 +994,6 @@ float autocvar_g_turrets_unit_walker_std_rocket_turnrate; float autocvar_g_turrets_unit_walker_std_rockets_range; float autocvar_g_turrets_unit_walker_std_rockets_range_min; float autocvar_g_use_ammunition; -float autocvar_g_vehicle_racer_afterburn_cost; -float autocvar_g_vehicle_racer_anglestabilizer; -float autocvar_g_vehicle_racer_downforce; -float autocvar_g_vehicle_racer_energy; -float autocvar_g_vehicle_racer_energy_usepause; -float autocvar_g_vehicle_racer_health; -float autocvar_g_vehicle_racer_laser_cost; -float autocvar_g_vehicle_racer_laser_damage; -float autocvar_g_vehicle_racer_laser_radius; -float autocvar_g_vehicle_racer_laser_refire; -float autocvar_g_vehicle_racer_laser_speed; -float autocvar_g_vehicle_racer_pitchspeed; -float autocvar_g_vehicle_racer_power_air; -float autocvar_g_vehicle_racer_power_min; -float autocvar_g_vehicle_racer_power_solid; -float autocvar_g_vehicle_racer_reload; -float autocvar_g_vehicle_racer_respawntime; -float autocvar_g_vehicle_racer_rocket_accel; -float autocvar_g_vehicle_racer_rocket_damage; -float autocvar_g_vehicle_racer_rocket_radius; -float autocvar_g_vehicle_racer_rocket_refire; -float autocvar_g_vehicle_racer_rocket_speed; -float autocvar_g_vehicle_racer_rocket_turnrate; -float autocvar_g_vehicle_racer_shield; -float autocvar_g_vehicle_racer_speed_afterburn; -float autocvar_g_vehicle_racer_speed_forward; -float autocvar_g_vehicle_racer_speed_strafe; -float autocvar_g_vehicle_racer_springlength; -float autocvar_g_vehicle_racer_turnroll; -float autocvar_g_vehicle_racer_turnspeed; -float autocvar_g_vehicle_raptor_reload; -float autocvar_g_vehicle_spiderbot_crush_dmg; -float autocvar_g_vehicle_spiderbot_crush_force; -float autocvar_g_vehicle_spiderbot_head_pitchlimit_down; -float autocvar_g_vehicle_spiderbot_head_pitchlimit_up; -float autocvar_g_vehicle_spiderbot_head_pitchspeed; -float autocvar_g_vehicle_spiderbot_head_turnlimit; -float autocvar_g_vehicle_spiderbot_head_turnspeed; -float autocvar_g_vehicle_spiderbot_health; -float autocvar_g_vehicle_spiderbot_minigun_cooldown; -float autocvar_g_vehicle_spiderbot_minigun_damage; -float autocvar_g_vehicle_spiderbot_minigun_heat; -float autocvar_g_vehicle_spiderbot_minigun_refire; -float autocvar_g_vehicle_spiderbot_minigun_spread; -float autocvar_g_vehicle_spiderbot_movement_inertia; -float autocvar_g_vehicle_spiderbot_respawntime; -float autocvar_g_vehicle_spiderbot_rocket_damage; -float autocvar_g_vehicle_spiderbot_rocket_edgedamage; -float autocvar_g_vehicle_spiderbot_rocket_force; -float autocvar_g_vehicle_spiderbot_rocket_health; -float autocvar_g_vehicle_spiderbot_rocket_lifetime; -float autocvar_g_vehicle_spiderbot_rocket_noise; -float autocvar_g_vehicle_spiderbot_rocket_radius; -float autocvar_g_vehicle_spiderbot_rocket_refire; -float autocvar_g_vehicle_spiderbot_rocket_reload; -float autocvar_g_vehicle_spiderbot_rocket_speed; -float autocvar_g_vehicle_spiderbot_rocket_turnrate; -float autocvar_g_vehicle_spiderbot_shield; -float autocvar_g_vehicle_spiderbot_speed_stop; -float autocvar_g_vehicle_spiderbot_speed_strafe; -float autocvar_g_vehicle_spiderbot_speed_walk; -float autocvar_g_vehicle_spiderbot_turnspeed; float autocvar_g_waypointeditor; float autocvar_g_waypoints_for_items; float autocvar_g_waypointsprite_deadlifetime; diff --git a/qcsrc/server/vehicles/racer.qc b/qcsrc/server/vehicles/racer.qc index 09efab4bf..2e6f97cf0 100644 --- a/qcsrc/server/vehicles/racer.qc +++ b/qcsrc/server/vehicles/racer.qc @@ -1,122 +1,92 @@ -#define RACER_MIN '-80 -80 -40' -#define RACER_MAX '80 80 40' +#define RACER_MIN '-120 -120 -40' +#define RACER_MAX '120 120 40' #define RACER_TICRATE 0.05 void racer_exit(float eject); void racer_enter(); -//void racer_think(); -float racer_power_air; -float racer_power_solid; -float racer_power_min; -float racer_anglestabilizer; -float racer_springlength; +// Auto cvars +float autocvar_g_vehicle_racer_speed_afterburn; +float autocvar_g_vehicle_racer_afterburn_cost; -float racer_healthmax; -float racer_shieldmax; -float racer_energymax; +float autocvar_g_vehicle_racer_anglestabilizer; +float autocvar_g_vehicle_racer_downforce; -float racer_pitchspeed; -float racer_turnspeed; -float racer_turnroll; -float racer_speed_forward; -float racer_speed_strafe; +float autocvar_g_vehicle_racer_speed_forward; +float autocvar_g_vehicle_racer_speed_strafe; +float autocvar_g_vehicle_racer_springlength; +float autocvar_g_vehicle_racer_upforcedamper; -float racer_afterburn_cost; +float autocvar_g_vehicle_racer_hovertype; +float autocvar_g_vehicle_racer_hoverpower; -float jetfromtag_power; -float jetfromtag_normpower; -vector jetfromtag_origin; -float jetfromtag_groundcontact; +float autocvar_g_vehicle_racer_turnroll; +float autocvar_g_vehicle_racer_turnspeed; +float autocvar_g_vehicle_racer_pitchspeed; -void racer_loadsettings() -{ - racer_power_min = autocvar_g_vehicle_racer_power_min * 0.25; - racer_power_air = autocvar_g_vehicle_racer_power_air * 0.25; - racer_power_solid = autocvar_g_vehicle_racer_power_solid * 0.25; - - racer_springlength = autocvar_g_vehicle_racer_springlength; - racer_anglestabilizer = autocvar_g_vehicle_racer_anglestabilizer; - racer_pitchspeed = autocvar_g_vehicle_racer_pitchspeed; - racer_turnspeed = autocvar_g_vehicle_racer_turnspeed; - racer_turnroll = autocvar_g_vehicle_racer_turnroll; - racer_speed_forward = autocvar_g_vehicle_racer_speed_forward; - racer_speed_strafe = autocvar_g_vehicle_racer_speed_strafe; +float autocvar_g_vehicle_racer_energy; +float autocvar_g_vehicle_racer_energy_regen; +float autocvar_g_vehicle_racer_energy_regen_pause; - racer_afterburn_cost = autocvar_g_vehicle_racer_afterburn_cost; +float autocvar_g_vehicle_racer_health; +float autocvar_g_vehicle_racer_health_regen; +float autocvar_g_vehicle_racer_health_regen_pause; - racer_healthmax = autocvar_g_vehicle_racer_health; - racer_shieldmax = autocvar_g_vehicle_racer_shield; - racer_energymax = autocvar_g_vehicle_racer_energy; +float autocvar_g_vehicle_racer_shield; +float autocvar_g_vehicle_racer_shield_regen; +float autocvar_g_vehicle_racer_shield_regen_pause; -} +float autocvar_g_vehicle_racer_laser_cost; +float autocvar_g_vehicle_racer_laser_damage; +float autocvar_g_vehicle_racer_laser_radius; +float autocvar_g_vehicle_racer_laser_refire; +float autocvar_g_vehicle_racer_laser_speed; -vector racer_jetfromtag(string tagname) -{ - vector force_dir; - float air_frac, solid_frac, air_pwr, solid_pwr; +float autocvar_g_vehicle_racer_rocket_accel; +float autocvar_g_vehicle_racer_rocket_damage; +float autocvar_g_vehicle_racer_rocket_radius; +float autocvar_g_vehicle_racer_rocket_refire; +float autocvar_g_vehicle_racer_rocket_speed; +float autocvar_g_vehicle_racer_rocket_turnrate; - jetfromtag_origin = gettaginfo(self,gettagindex(self,tagname)); - v_forward = normalize(v_forward) * -1; +float autocvar_g_vehicle_racer_respawntime; +float autocvar_g_vehicle_racer_collision_multiplier; - force_dir = jetfromtag_origin - (v_forward * racer_springlength); - traceline(jetfromtag_origin, force_dir, MOVE_NORMAL, self); - //te_lightning1(world,jetfromtag_origin, force_dir); +var vector racer_force_from_tag(string tag_name, float spring_length, float max_power); - //trace_fraction *= trace_fraction; +void racer_align4point() +{ + vector push_vector, v_add; + float fl_push, fr_push, bl_push, br_push; - solid_frac = 1 - trace_fraction; - air_frac = trace_fraction; + push_vector = racer_force_from_tag("tag_engine_fr", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower); + fr_push = force_fromtag_normpower; + vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier); - if (trace_fraction != 1.0) - jetfromtag_groundcontact = 1; + push_vector += racer_force_from_tag("tag_engine_fl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower); + fl_push = force_fromtag_normpower; + vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier); - solid_pwr = solid_frac * racer_power_solid; - air_pwr = air_frac * racer_power_air; + push_vector += racer_force_from_tag("tag_engine_br", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower); + br_push = force_fromtag_normpower; + vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier); - jetfromtag_power = solid_pwr + air_pwr; - jetfromtag_normpower = jetfromtag_power / (racer_power_air + racer_power_solid); + push_vector += racer_force_from_tag("tag_engine_bl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower); + bl_push = force_fromtag_normpower; + vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier); - //te_lightning1(world,jetfromtag_origin,jetfromtag_origin + normalize(self.origin - force_dir) * max(jetfromtag_power, racer_power_min)); - //return normalize(self.origin - force_dir) * max(jetfromtag_power, racer_power_min); - return v_forward * max(jetfromtag_power, racer_power_min); -} + self.velocity += (push_vector * frametime); -void racer_align4point() -{ - vector push_vector; - float fl_push, fr_push, bl_push, br_push; + // Anti ocilation + if(self.velocity_z > 0) + self.velocity_z *= autocvar_g_vehicle_racer_upforcedamper; - jetfromtag_groundcontact = 0; - - push_vector = racer_jetfromtag("tag_engine_fr"); - fr_push = jetfromtag_normpower; - traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self); - if(trace_fraction != 1) - self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25); - - push_vector += racer_jetfromtag("tag_engine_fl"); - fl_push = jetfromtag_normpower; - traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self); - if(trace_fraction != 1) - self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25); - - push_vector += racer_jetfromtag("tag_engine_br"); - br_push = jetfromtag_normpower; - traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self); - if(trace_fraction != 1) - self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25); - - push_vector += racer_jetfromtag("tag_engine_bl"); - bl_push = jetfromtag_normpower; - traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self); - if(trace_fraction != 1) - self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25); - - self.velocity = self.velocity + (push_vector * frametime); + self.velocity += v_add; self.velocity_z -= autocvar_sv_gravity * frametime; - push_vector_x = (fl_push - bl_push); + + + push_vector_x = (fl_push - bl_push); push_vector_x += (fr_push - br_push); push_vector_x *= 360; @@ -126,72 +96,56 @@ void racer_align4point() //if (push_vector_z != 0) if(self.angles_z > 0) - self.angles_z = max(0, self.angles_z - (racer_anglestabilizer * frametime)); + self.angles_z = max(0, self.angles_z - (autocvar_g_vehicle_racer_anglestabilizer * frametime)); else - self.angles_z = min(0, self.angles_z + (racer_anglestabilizer * frametime)); + self.angles_z = min(0, self.angles_z + (autocvar_g_vehicle_racer_anglestabilizer * frametime)); //else self.angles_z += push_vector_z * frametime; //if (push_vector_x != 0) if(self.angles_x > 0) - self.angles_x = max(0, self.angles_x - (racer_anglestabilizer * frametime)); + self.angles_x = max(0, self.angles_x - (autocvar_g_vehicle_racer_anglestabilizer * frametime)); else - self.angles_x = min(0, self.angles_x + (racer_anglestabilizer * frametime)); + self.angles_x = min(0, self.angles_x + (autocvar_g_vehicle_racer_anglestabilizer * frametime)); //else self.angles_x += push_vector_x * frametime; } -void racer_bolt_explode() -{ - vector org2; - - org2 = findbetterlocation (self.origin, 8); - pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1); - RadiusDamage (self, self.realowner, autocvar_g_vehicle_racer_laser_damage, 0, autocvar_g_vehicle_racer_laser_radius, world, 150, DEATH_WAKIGUN, world); - sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); - - remove (self); -} - void racer_rocket_explode() { - vector org2; + PROJECTILE_TOUCH; + if(other.owner == self.owner) + return; - //if not(self.owner) - // self.owner = self.realowner; + self.event_damage = SUB_Null; sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM); - org2 = findbetterlocation (self.origin, 16); - pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1); + pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1); RadiusDamage (self, self.realowner ,autocvar_g_vehicle_racer_rocket_damage, 0, autocvar_g_vehicle_racer_rocket_radius, world, 150, DEATH_WAKIROCKET, world); remove (self); } -void racer_rocket_touch() +void racer_bolt_explode() { - if(other.owner == self.owner) - return; - - PROJECTILE_TOUCH; - /* - if(pointcontents(self.origin) == CONTENT_SKY) - { - self.think = SUB_Remove; - self.nextthink = time; - return; - } - */ - - racer_rocket_explode(); + PROJECTILE_TOUCH; + pointparticles(particleeffectnum("wakizashi_gun_impact"), findbetterlocation (self.origin, 8), trace_plane_normal * 1000, 1); + RadiusDamage (self, self.realowner, autocvar_g_vehicle_racer_laser_damage, 0, autocvar_g_vehicle_racer_laser_radius, world, 150, DEATH_WAKIGUN, world); + sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM); + remove (self); } void racer_fire_cannon(string tagname) { entity bolt; + vector v; bolt = spawn(); - bolt.solid = SOLID_TRIGGER; + sound (self, CHAN_WEAPON, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM); + + setorigin(bolt, gettaginfo(self, gettagindex(self, tagname))); + PROJECTILE_MAKETRIGGER(bolt); + bolt.movetype = MOVETYPE_FLYMISSILE; bolt.flags = FL_PROJECTILE | FL_NOTARGET; bolt.owner = self; @@ -199,62 +153,25 @@ void racer_fire_cannon(string tagname) bolt.touch = racer_bolt_explode; bolt.think = racer_bolt_explode; bolt.nextthink = time + 9; + bolt.bot_dodge = TRUE; bolt.bot_dodgerating = autocvar_g_vehicle_racer_laser_damage; - setorigin(bolt, gettaginfo(self,gettagindex(self,tagname))); - vector v; - // FIXME this uses prydon cursor - v = normalize(self.owner.cursor_trace_endpos - bolt.origin); + // Fix z-aim (for chase mode) + crosshair_trace(self.owner); + v = normalize(trace_endpos - bolt.origin); v_forward_z = v_z * 0.5; bolt.velocity = v_forward * autocvar_g_vehicle_racer_laser_speed; + pointparticles(particleeffectnum("wakizashi_gun_muzzleflash"), bolt.origin, bolt.velocity, 1); + CSQCProjectile(bolt, TRUE, PROJECTILE_LASER, TRUE); } void racer_rocket_groundhugger() { - vector newdir,olddir; - float oldspeed, newspeed; - - self.nextthink = time; - - if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time)) - { - racer_rocket_explode(); - return; - } - - if not (self.realowner.vehicle) - { - UpdateCSQCProjectile(self); - return; - } - - olddir = normalize(self.velocity); - oldspeed = vlen(self.velocity); - - tracebox(self.origin, self.mins, self.maxs, self.origin + olddir * 512, MOVE_WORLDONLY,self); - if(trace_fraction >= 0.35) - { - traceline(trace_endpos, trace_endpos - '0 0 512', MOVE_NORMAL, self); - if(trace_fraction != 1.0) - newdir = trace_endpos + '0 0 32'; - - newdir = normalize(newdir - self.origin); - } - - newspeed = oldspeed + self.lip; - self.velocity = normalize(olddir + newdir * self.wait) * newspeed; - - UpdateCSQCProjectile(self); -} - -void racer_rocket_think() -{ - vector newdir,olddir, eorg, edir; - float oldspeed, newspeed, dist; + vector olddir; self.nextthink = time; @@ -271,26 +188,29 @@ void racer_rocket_think() } olddir = normalize(self.velocity); - oldspeed = vlen(self.velocity); - fixedmakevectors(olddir); - eorg = 0.5 * (self.enemy.absmin + self.enemy.absmax); - edir = normalize(eorg - self.origin); - dist = vlen(self.origin - self.enemy.origin); - - if(dist > 512) + tracebox(self.origin, self.mins, self.maxs, self.origin + olddir * 64, MOVE_WORLDONLY,self); + if(trace_fraction >= 0.5) { - vector ddir; - float p; - p = dist / self.delay; - p = max(0.05, p * 0.25); - ddir = steerlib_traceavoid(p, oldspeed * 0.25); - edir += ddir * 0.95; + traceline(trace_endpos, trace_endpos - '0 0 64', MOVE_NORMAL, self); + if(trace_fraction != 1.0) + { + // Follow ground + self.velocity = normalize(olddir + normalize((trace_endpos + '0 0 32') - self.origin) * self.wait) * (vlen(self.velocity) + self.lip); + UpdateCSQCProjectile(self); + return; + } + else + { + // "In air", add gravity. + self.velocity = olddir * (vlen(self.velocity) + self.lip); + self.velocity_z -= sys_frametime * 1250; + UpdateCSQCProjectile(self); + return; + } } - newdir = normalize(olddir + edir * self.wait); - newspeed = oldspeed + self.lip; - self.velocity = normalize(olddir + newdir * self.wait) * newspeed; - + // Hitting somethign soon. + self.velocity = olddir * (vlen(self.velocity) + self.lip); UpdateCSQCProjectile(self); } @@ -298,84 +218,46 @@ void racer_fire_rocket(string tagname) { entity rocket; + sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM); + rocket = spawn(); setsize (rocket, '-1 -1 -1', '1 1 1'); - rocket.lip = autocvar_g_vehicle_racer_rocket_accel * sys_frametime; - rocket.wait = autocvar_g_vehicle_racer_rocket_turnrate; - rocket.solid = SOLID_BBOX; - rocket.movetype = MOVETYPE_FLYMISSILE; - rocket.flags = FL_PROJECTILE; - rocket.owner = self; - rocket.realowner = self.owner; - rocket.touch = racer_rocket_touch; - rocket.bot_dodge = TRUE; - rocket.bot_dodgerating = autocvar_g_vehicle_racer_rocket_damage; - setorigin(rocket, gettaginfo(self,gettagindex(self,tagname))); - - /* - if( (self.tur_head.gun1) && (self.tur_head.cnt > time)) - rocket.enemy = self.tur_head.gun1; - - if(rocket.enemy) - { - rocket.delay = vlen(rocket.enemy.origin - rocket.origin); - rocket.cnt = time + 9; - rocket.velocity = v_forward * autocvar_g_vehicle_racer_rocket_speed; - rocket.think = racer_rocket_think; - rocket.nextthink = time; - CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound - } - else - { - */ - rocket.cnt = time + 9; - rocket.velocity = v_forward * autocvar_g_vehicle_racer_rocket_speed; - rocket.think = racer_rocket_groundhugger; - rocket.nextthink = time; - CSQCProjectile(rocket, TRUE, PROJECTILE_ROCKET, TRUE); - //} + setorigin(rocket, gettaginfo(self, gettagindex(self, tagname))); + + rocket.lip = autocvar_g_vehicle_racer_rocket_accel * sys_frametime; + rocket.wait = autocvar_g_vehicle_racer_rocket_turnrate; + rocket.solid = SOLID_BBOX; + rocket.movetype = MOVETYPE_FLYMISSILE; + rocket.flags = FL_PROJECTILE; + rocket.owner = self; + rocket.realowner = self.owner; + rocket.touch = racer_rocket_explode; + rocket.bot_dodge = TRUE; + rocket.bot_dodgerating = autocvar_g_vehicle_racer_rocket_damage; + rocket.cnt = time + 9; + rocket.velocity = v_forward * autocvar_g_vehicle_racer_rocket_speed; + rocket.think = racer_rocket_groundhugger; + rocket.nextthink = time; + + CSQCProjectile(rocket, TRUE, PROJECTILE_ROCKET, TRUE); } -float racer_customizeentityforclient() -{ - - if(self.deadflag == DEAD_DEAD) - return FALSE; - - /* - if(other == self.owner) - self.alpha = -1; - else - self.alpha = 1; - */ - - return TRUE; -} - -float racer_pplug() +float racer_frame() { entity player, racer; float ftmp, ftmp2; vector df; - if(autocvar_g_vehicle_racer_reload) - { - racer_loadsettings(); - cvar_set("g_vehicle_racer_reload","0"); - } - player = self; racer = self.vehicle; - player.BUTTON_ZOOM = 0; - player.BUTTON_CROUCH = 0; + player.BUTTON_ZOOM = player.BUTTON_CROUCH = 0; self = racer; if(player.BUTTON_USE) { - self = racer; - racer_exit(0); + vehicles_exit(VHEF_NORMAL); self = player; return 0; } @@ -387,32 +269,31 @@ float racer_pplug() return 1; } - racer_align4point(); racer.angles_x *= -1; makevectors(racer.angles); - // Rotate Body - ftmp = racer_turnspeed * sys_frametime; + // Yaw + ftmp = autocvar_g_vehicle_racer_turnspeed * sys_frametime; ftmp2 = ftmp * -1; ftmp = bound(ftmp2, shortangle_f(player.v_angle_y - racer.angles_y, racer.angles_y), ftmp); ftmp2 = anglemods(racer.angles_y + ftmp); // Roll - ftmp = bound(-45, shortangle_f(player.v_angle_z + ((racer.angles_y - ftmp2) * racer_turnroll), racer.angles_z), 45); - ftmp = anglemods(racer.angles_z + ftmp); - racer.angles_z = bound(-85, ftmp, 85); + ftmp = bound(-45, shortangle_f(player.v_angle_z + ((racer.angles_y - ftmp2) * autocvar_g_vehicle_racer_turnroll), racer.angles_z), 45); + ftmp = anglemods(racer.angles_z + ftmp) * frametime; + racer.angles_z = bound(-65, racer.angles_z + ftmp, 65); // Turn racer.angles_y = ftmp2; // Pitch Body - ftmp = racer_pitchspeed * sys_frametime; + ftmp = autocvar_g_vehicle_racer_pitchspeed * sys_frametime; ftmp2 = ftmp * -1; - ftmp = bound(ftmp2,shortangle_f(player.v_angle_x - racer.angles_x,racer.angles_x),ftmp); + ftmp = bound(ftmp2, shortangle_f(player.v_angle_x - racer.angles_x, racer.angles_x), ftmp); racer.angles_x = anglemods(racer.angles_x + ftmp); racer.angles_x *= -1; @@ -421,31 +302,32 @@ float racer_pplug() if(player.movement_x != 0) { if(player.movement_x > 0) - df += v_forward * racer_speed_forward; + df += v_forward * autocvar_g_vehicle_racer_speed_forward; else if(player.movement_x < 0) - df -= v_forward * racer_speed_forward; + df -= v_forward * autocvar_g_vehicle_racer_speed_forward; } if(player.movement_y != 0) { if(player.movement_y < 0) - df -= v_right * racer_speed_strafe; + df -= v_right * autocvar_g_vehicle_racer_speed_strafe; else if(player.movement_y > 0) - df += v_right * racer_speed_strafe; + df += v_right * autocvar_g_vehicle_racer_speed_strafe; } // limit _z to avoid flying on normal thrust if(df_z > 0) - df_z = min(df_z,700); + df_z = min(df_z, 700); // Afterburn if (player.BUTTON_JUMP) - if(racer.vehicle_energy >= (racer_afterburn_cost * frametime)) + if(racer.vehicle_energy >= (autocvar_g_vehicle_racer_afterburn_cost * frametime)) { - racer.wait = time + autocvar_g_vehicle_racer_energy_usepause; - racer.vehicle_energy -= racer_afterburn_cost * frametime; + racer.wait = time; + racer.vehicle_energy -= autocvar_g_vehicle_racer_afterburn_cost * frametime; df += (v_forward * autocvar_g_vehicle_racer_speed_afterburn); + self.owner.vehicle_energy = racer.vehicle_energy / autocvar_g_vehicle_racer_energy; } racer.velocity += df * frametime; @@ -454,22 +336,12 @@ float racer_pplug() racer.velocity = racer.velocity - df; player.movement = racer.velocity; - /* - // for homing rockets - // FIXME this uses prydon cursor - if(self.owner.cursor_trace_ent) - { - self.tur_head.gun1 = self.owner.cursor_trace_ent; - self.tur_head.cnt = time + 1; - } - */ - if(player.BUTTON_ATCK) if(time > racer.attack_finished_single) if(racer.vehicle_energy >= autocvar_g_vehicle_racer_laser_cost) { racer.vehicle_energy -= autocvar_g_vehicle_racer_laser_cost; - racer.wait = time + autocvar_g_vehicle_racer_energy_usepause; + racer.wait = time; if(racer.cnt) { @@ -482,6 +354,7 @@ float racer_pplug() racer.cnt = 1; } racer.attack_finished_single = time + autocvar_g_vehicle_racer_laser_refire; + self.owner.vehicle_energy = racer.vehicle_energy / autocvar_g_vehicle_racer_energy; } if(player.BUTTON_ATCK2) @@ -491,176 +364,79 @@ float racer_pplug() racer_fire_rocket("tag_rocket_l"); racer.delay = time + autocvar_g_vehicle_racer_rocket_refire; racer.lip = time; - } - player.vehicle_reload1 = (time - racer.lip) / (racer.delay-racer.lip); - vehicle_stdproc_shiledregen(racer_shieldmax, frametime); - vehicle_stdproc_healthregen(racer_healthmax, frametime); + player.vehicle_reload1 = (time - racer.lip) / (racer.delay - racer.lip); - if (racer.wait < time) - vehicle_stdproc_energyregen(racer_energymax, frametime); - else - player.vehicle_energy = (racer.vehicle_energy / racer_energymax); + if(self.vehicle_flags & VHF_SHIELDREGEN) + vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_racer_shield, autocvar_g_vehicle_racer_shield_regen_pause, autocvar_g_vehicle_racer_shield_regen, frametime); - self = player; + if(self.vehicle_flags & VHF_HEALTHREGEN) + vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_racer_health, autocvar_g_vehicle_racer_health_regen_pause, autocvar_g_vehicle_racer_health_regen, frametime); - player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0; - setorigin(player,racer.origin + '0 0 32'); - player.velocity = racer.velocity; + if(self.vehicle_flags & VHF_ENERGYREGEN) + vehicles_regen(wait, vehicle_energy, autocvar_g_vehicle_racer_energy, autocvar_g_vehicle_racer_energy_regen_pause, autocvar_g_vehicle_racer_energy_regen, frametime); - return 1; -} -void racer_exitthink() -{ - float a, b, c; - - self.nextthink = time; - - a = racer_anglestabilizer; - b = racer_springlength; - c = racer_power_solid; + VEHICLE_UPDATE_PLAYER(health, racer); - racer_anglestabilizer = 36; - racer_springlength = 96; - racer_power_solid = 300; + if(self.vehicle_flags & VHF_HASSHIELD) + VEHICLE_UPDATE_PLAYER(shield, racer); - racer_align4point(); - if(self.velocity_z < 0) - self.velocity_z *= 0.95; - - racer_anglestabilizer = a; - racer_springlength = b; - racer_power_solid = c; + player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0; + setorigin(player,racer.origin + '0 0 32'); + player.velocity = racer.velocity; - self.velocity_x *= 0.95; - self.velocity_y *= 0.95; + self = player; + return 1; } -void racer_spawnthink() +void racer_think() { float a, b, c; - vector dorg; self.nextthink = time; - a = racer_anglestabilizer; - b = racer_springlength; - c = racer_power_solid; - - racer_anglestabilizer = 36; - racer_springlength = 96; - racer_power_solid = 300; + a = autocvar_g_vehicle_racer_anglestabilizer; + b = autocvar_g_vehicle_racer_springlength; + c = autocvar_g_vehicle_racer_hoverpower; - // self.velocity_z += sin(time * 128) * 4; + autocvar_g_vehicle_racer_anglestabilizer = 36; + autocvar_g_vehicle_racer_springlength = 96; + autocvar_g_vehicle_racer_hoverpower = 300; racer_align4point(); if(self.velocity_z < 0) - self.velocity_z *= 0.98; + self.velocity_z *= 0.95; - racer_anglestabilizer = a; - racer_springlength = b; - racer_power_solid = c; + autocvar_g_vehicle_racer_anglestabilizer = a; + autocvar_g_vehicle_racer_springlength = b; + autocvar_g_vehicle_racer_hoverpower = c; self.velocity_x *= 0.95; self.velocity_y *= 0.95; - - dorg = self.pos1 - self.origin ; - - self.velocity_x = bound(-32, self.velocity_x + dorg_x, 32); - self.velocity_y = bound(-32, self.velocity_y + dorg_y, 32); } void racer_enter() { - self.owner = other; - - - self.nextthink = 0; - self.flags = 0; - self.vehicle_hudmodel.viewmodelforclient = self.owner; - self.colormap = self.owner.colormap; - - self.owner.PlayerPhysplug = racer_pplug; - self.owner.takedamage = DAMAGE_NO; - self.owner.event_damage = SUB_Null; - self.owner.vehicle = self; - self.owner.angles = self.angles; - self.owner.solid = SOLID_NOT; - self.owner.movetype = MOVETYPE_NOCLIP; - self.owner.alpha = -1; - self.owner.hud = HUD_WAKIZASHI; - self.owner.effects |= EF_NODRAW; - self.owner.view_ofs = '0 0 0'; - self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_racer_health); self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_racer_shield); - - setorigin(other,self.origin + '0 0 32'); - other.velocity = self.velocity; - - other.flags &~= FL_ONGROUND; - msg_entity = other; - WriteByte (MSG_ONE, SVC_SETVIEWPORT); - WriteEntity( MSG_ONE, self.vehicle_viewport); - - WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES - WriteAngle(MSG_ONE, self.angles_x * -1); // tilt - WriteAngle(MSG_ONE, self.angles_y); // yaw - WriteAngle(MSG_ONE, 0); // roll } void racer_spawn(); -void racer_return() -{ - pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1); - self.enemy.think = racer_spawn; - self.enemy.nextthink = time; - remove(self); -} void racer_exit(float eject) { - self.colormap = 1024; - self.flags = FL_NOTARGET; + vehicles_setreturn(autocvar_g_vehicle_racer_respawntime, racer_spawn); + + self.think = racer_think; + self.nextthink = time; if not (self.owner) return; - msg_entity = self.owner; - WriteByte (MSG_ONE, SVC_SETVIEWPORT); - WriteEntity( MSG_ONE, self.owner); - - WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES - WriteAngle(MSG_ONE, 0); // tilt - WriteAngle(MSG_ONE, self.angles_y); // yaw - WriteAngle(MSG_ONE, 0); // roll - - if (self.deadflag == DEAD_NO) - { - self.think = racer_exitthink; - self.nextthink = time; - } - - self.owner.takedamage = DAMAGE_AIM; - self.owner.solid = SOLID_SLIDEBOX; - self.owner.movetype = MOVETYPE_WALK; - - setsize(self.owner,PL_MIN,PL_MAX); - - self.owner.effects &~= EF_NODRAW; - self.owner.alpha = 1; - self.owner.PlayerPhysplug = SUB_Null; - self.owner.vehicle = world; - self.owner.view_ofs = PL_VIEW_OFS; - self.owner.event_damage = PlayerDamage; - self.owner.hud = HUD_NORMAL; - - self.vehicle_hudmodel.viewmodelforclient = self; - if(eject) { makevectors(self.angles); @@ -669,20 +445,11 @@ void racer_exit(float eject) } else { - self.owner.velocity = (v_forward) * -150; - setorigin(self.owner,self.origin - v_forward * 128); + self.owner.velocity = v_forward * -150; + setorigin(self.owner, self.origin - v_forward * 128); } self.owner = world; - - if (self.deadflag != DEAD_NO) - { - entity ret; - ret = spawn(); - ret.enemy = self; - ret.think = racer_return; - ret.nextthink = time + autocvar_g_vehicle_racer_respawntime; - } } void racer_touch() @@ -711,32 +478,32 @@ void racer_touch() if(other.vehicle != world) return; - racer_enter(); + vehicles_enter(); } void racer_spawn() { - self.think = racer_spawnthink; + self.think = racer_think; self.nextthink = time; self.flags = FL_NOTARGET; self.effects = 0; - self.vehicle_health = racer_healthmax; - self.vehicle_shield = racer_shieldmax; + self.vehicle_health = autocvar_g_vehicle_racer_health; + self.vehicle_shield = autocvar_g_vehicle_racer_shield; - self.event_damage = vehicle_stdproc_damage; + self.event_damage = vehicles_damage; self.touch = racer_touch; self.iscreature = TRUE; self.scale = 0.5; - self.movetype = MOVETYPE_FLY; + self.movetype = MOVETYPE_BOUNCEMISSILE; self.solid = SOLID_SLIDEBOX; self.takedamage = DAMAGE_AIM; - self.alpha = 1; - self.colormap = 1024; - self.deadflag = DEAD_NO; + self.alpha = 1; + self.colormap = 1024; + self.deadflag = DEAD_NO; self.bot_attack = TRUE; self.vehicle_energy = 1; @@ -745,12 +512,11 @@ void racer_spawn() setorigin(self, self.pos1); self.angles = self.pos2; - setsize(self,RACER_MIN * 0.5,RACER_MAX * 0.5); + setsize(self, RACER_MIN * 0.5, RACER_MAX * 0.5); pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1); self.delay = time; } - void racer_blowup() { @@ -771,16 +537,16 @@ void racer_blowup() self.colormod = '0 0 0'; setorigin(self,self.pos1); + self.avelocity = '0 0 0'; + self.velocity = '0 0 0'; } -void racer_dietouch() +void racer_deadtouch() { - if(self.wait > time) - return; - - self.wait = time + 0.75; - - pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1); + self.avelocity_x *= 0.7; + self.cnt -= 1; + if(self.cnt <= 0) + racer_blowup(); } void racer_die() @@ -788,111 +554,88 @@ void racer_die() self.health = 0; self.event_damage = SUB_Null; self.iscreature = FALSE; - self.solid = SOLID_NOT; + self.solid = SOLID_CORPSE; self.takedamage = DAMAGE_NO; - self.touch = racer_dietouch; self.deadflag = DEAD_DYING; self.movetype = MOVETYPE_BOUNCE; - self.wait = time; + self.wait = time; + self.cnt = 1 + random() * 3; + self.touch = racer_deadtouch; pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1); - self.velocity += '0 0 128'; + self.velocity += '0 0 700'; if(random() < 0.5) self.avelocity_z = 16; else self.avelocity_z = -16; + self.avelocity_x = -vlen(self.velocity) * 0.2; + self.colormod = '-0.5 -0.5 -0.5'; self.think = racer_blowup; - self.nextthink = time + 3; + self.nextthink = 2 + time + random() * 3; } void racer_dinit() { + if not (vehicle_initialize( + "Wakizashi", + "models/vehicles/wakizashi.dpm", + "", + "models/vehicles/wakizashi_cockpit.dpm", + "", "", "tag_viewport", + HUD_WAKIZASHI, + 0.5 * RACER_MIN, 0.5 * RACER_MAX, + FALSE, + racer_spawn, racer_frame, + racer_enter, racer_exit, + racer_die, racer_think)) + { + remove(self); + return; + } - tracebox(self.origin + '0 0 100', RACER_MIN * 0.5, RACER_MAX * 0.5, self.origin - '0 0 10000', MOVE_WORLDONLY, self); - setorigin(self,trace_endpos); - - if (self.netname == "") - self.netname = "Race PoD"; - - self.cvar_basename = "g_vehicle_racer"; - - self.vehicle_viewport = spawn(); - self.vehicle_hudmodel = spawn(); - //self.ccamera = spawn(); - - setorigin(self, self.origin); - - setmodel(self,"models/vehicles/wakizashi.dpm"); - setmodel(self.vehicle_hudmodel, "models/vehicles/wakizashi_cockpit.dpm"); - setmodel (self.vehicle_viewport, "null"); + if(autocvar_g_vehicle_racer_hovertype != 0) + racer_force_from_tag = vehicles_force_fromtag_maglev; + else + racer_force_from_tag = vehicles_force_fromtag_hover; + // FIXME: this be hakkz, fix the models insted (scale body, add tag_viewport to the hudmodel). + self.scale = 0.5; setattachment(self.vehicle_hudmodel, self, ""); setattachment(self.vehicle_viewport, self, "tag_viewport"); - - self.vehicle_hudmodel.viewmodelforclient = self; - self.customizeentityforclient = racer_customizeentityforclient; - - self.tur_head = spawn(); - - self.pos1 = self.origin; - self.pos2 = self.angles; - self.angles = '0 0 0'; - self.angles = self.pos1; - - self.vehicle_die = racer_die; - self.vehicle_exit = racer_exit; - - addstat(STAT_HUD, AS_INT, hud); - addstat(STAT_VEHICLESTAT_HEALTH, AS_FLOAT, vehicle_health); - addstat(STAT_VEHICLESTAT_SHIELD, AS_FLOAT, vehicle_shield); - addstat(STAT_VEHICLESTAT_ENERGY, AS_FLOAT, vehicle_energy); - - addstat(STAT_VEHICLESTAT_AMMO1, AS_INT, vehicle_ammo1); - addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1); - - addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2); - addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2); - - racer_spawn(); } void spawnfunc_vehicle_racer() { - g_turrets_common_precash(); - racer_loadsettings(); - - self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN; - /* - traceline(self.origin,self.origin - '0 0 2048',MOVE_WORLDONLY,self); - if(trace_startsolid) - { - dprint("WARNING: vehicle_racer placed in solid\n"); - traceline(self.origin + '0 0 512' ,self.origin - '0 0 2048',MOVE_WORLDONLY,self); - if(trace_startsolid || trace_fraction == 1.0) - { - dprint("ERROR: vehicle_racer placed in more then 512 units into solid\n"); - remove(self); - return; - } - } - */ - - if(trace_fraction != 1.0) - setorigin(self,trace_endpos + '0 0 128'); - else - dprint("WARNING: vehicle_racer placed more then 2048 units above ground.\n"); + precache_sound ("weapons/laserimpact.wav"); + precache_sound ("weapons/lasergun_fire.wav"); + precache_sound ("weapons/rocket_fire.wav"); + precache_sound ("weapons/rocket_impact.wav"); + precache_model ("models/vhshield.md3"); precache_model ("models/vehicles/wakizashi.dpm"); precache_model ("models/vehicles/wakizashi_cockpit.dpm"); - precache_model ("maps/bspmodel.bsp"); + vehicles_configcheck("vehicle_racer.cfg", autocvar_g_vehicle_racer_health); + if(autocvar_g_vehicle_racer_energy) + if(autocvar_g_vehicle_racer_energy_regen) + self.vehicle_flags |= VHF_ENERGYREGEN; + + if(autocvar_g_vehicle_racer_shield) + self.vehicle_flags |= VHF_HASSHIELD; + + if(autocvar_g_vehicle_racer_shield_regen) + self.vehicle_flags |= VHF_SHIELDREGEN; + + if(autocvar_g_vehicle_racer_health_regen) + self.vehicle_flags |= VHF_HEALTHREGEN; + self.think = racer_dinit; self.nextthink = time + 1; } diff --git a/qcsrc/server/vehicles/raptor.qc b/qcsrc/server/vehicles/raptor.qc index 38ebad042..f55faac3c 100644 --- a/qcsrc/server/vehicles/raptor.qc +++ b/qcsrc/server/vehicles/raptor.qc @@ -1,97 +1,64 @@ -#define RAPTOR_MIN '-40 -40 0' -#define RAPTOR_MAX '40 40 40' - -float raptor_movestyle; -float raptor_turnspeed; -float raptor_turnroll; -float raptor_pitchspeed; -float raptor_speed_forward; -float raptor_speed_strafe; -float raptor_speed_up; -float raptor_speed_down; - -float raptor_bomblet_waves; -float raptor_bomblet_wavefirst; -float raptor_bomblet_wavenext; -float raptor_bomblet_wawespread; -float raptor_bomblets; -float raptor_bomblet_damage; -float raptor_bomblet_edgedamage; -float raptor_bomblet_radius; -float raptor_bomblet_force; -float raptor_bombs_refire; - -float raptor_beam_dps; -float raptor_beam_fops; -float raptor_beam_aps; -float raptor_beam_size; -float raptor_beam_leangth; -float raptor_beam_refire; - -float raptor_shield_max; -float raptor_shield_regen; - -float raptor_health_max; -float raptor_health_regen; - -float raptor_energy_max; -float raptor_energy_regen; +#define RAPTOR_MIN '-80 -80 0' +#define RAPTOR_MAX '80 80 70' + +float autocvar_g_vehicle_raptor_respawntime; + +float autocvar_g_vehicle_raptor_movestyle; +float autocvar_g_vehicle_raptor_turnspeed; +float autocvar_g_vehicle_raptor_pitchspeed; +float autocvar_g_vehicle_raptor_pitchlimit; + +float autocvar_g_vehicle_raptor_speed_forward; +float autocvar_g_vehicle_raptor_speed_strafe; +float autocvar_g_vehicle_raptor_speed_up; +float autocvar_g_vehicle_raptor_speed_down; + +float autocvar_g_vehicle_raptor_bomblets; +float autocvar_g_vehicle_raptor_bomblet_alt; +float autocvar_g_vehicle_raptor_bomblet_time; +float autocvar_g_vehicle_raptor_bomblet_damage; +float autocvar_g_vehicle_raptor_bomblet_spread; +float autocvar_g_vehicle_raptor_bomblet_edgedamage; +float autocvar_g_vehicle_raptor_bomblet_radius; +float autocvar_g_vehicle_raptor_bomblet_force; +float autocvar_g_vehicle_raptor_bombs_refire; + +float autocvar_g_vehicle_raptor_guns_turnspeed; +float autocvar_g_vehicle_raptor_guns_turnlimit; +float autocvar_g_vehicle_raptor_guns_pitchlimit; + +float autocvar_g_vehicle_raptor_cannon_cost; +float autocvar_g_vehicle_raptor_cannon_damage; +float autocvar_g_vehicle_raptor_cannon_radius; +float autocvar_g_vehicle_raptor_cannon_refire; +float autocvar_g_vehicle_raptor_cannon_speed; +float autocvar_g_vehicle_raptor_cannon_spread; + + +float autocvar_g_vehicle_raptor_energy; +float autocvar_g_vehicle_raptor_energy_regen; +float autocvar_g_vehicle_raptor_energy_regen_pause; + +float autocvar_g_vehicle_raptor_health; +float autocvar_g_vehicle_raptor_health_regen; +float autocvar_g_vehicle_raptor_health_regen_pause; + +float autocvar_g_vehicle_raptor_shield; +float autocvar_g_vehicle_raptor_shield_regen; +float autocvar_g_vehicle_raptor_shield_regen_pause; void raptor_spawn(); -void raptor_return(); -float raptor_pplug(); -float raptor_takeoff(); -float raptor_land(); +//void raptor_return(); +float raptor_frame(); +//float raptor_takeoff(); .entity bomb1; .entity bomb2; float raptor_altitude(float amax) { - tracebox(self.origin, self.mins, self.maxs, '0 0 -1' * amax, TRUE, self); - if(trace_fraction == 1) - return amax+1; - else - return vlen(self.origin - trace_endpos); -} - -void raptor_loadsettings() -{ - raptor_movestyle = CCVAR("_movestyle"); - raptor_turnspeed = CCVAR("_turnspeed"); - raptor_turnroll = CCVAR("_turnroll"); - raptor_pitchspeed = CCVAR("_pitchspeed"); - raptor_speed_forward = CCVAR("_speed_forward"); - raptor_speed_strafe = CCVAR("_speed_strafe"); - raptor_speed_up = CCVAR("_speed_up"); - raptor_speed_down = CCVAR("_speed_down"); - - raptor_bomblet_waves = CCVAR("_bomblet_waves "); - raptor_bomblet_wavefirst = CCVAR("_bomblet_wavefirst"); - raptor_bomblet_wavenext = CCVAR("_bomblet_wavenext"); - raptor_bomblet_wawespread = CCVAR("_bomblet_wawespread"); - raptor_bomblets = CCVAR("_bomblets"); - raptor_bomblet_damage = CCVAR("_bomblet_damage"); - raptor_bomblet_edgedamage = CCVAR("_bomblet_edgedamage"); - raptor_bomblet_radius = CCVAR("_bomblet_radius"); - raptor_bomblet_force = CCVAR("_bomblet_force "); - raptor_bombs_refire = CCVAR("_bombs_refire"); - - raptor_beam_dps = CCVAR("_beam_dps"); - raptor_beam_fops = CCVAR("_beam_fops"); - raptor_beam_aps = CCVAR("_beam_aps"); - raptor_beam_size = CCVAR("_beam_size"); - raptor_beam_leangth = CCVAR("_beam_length"); - raptor_beam_refire = CCVAR("_beam_refire"); - - raptor_shield_max = CCVAR("_shield"); - raptor_shield_regen = CCVAR("_shield_regen"); - - raptor_health_max = CCVAR("_health"); - raptor_health_regen = CCVAR("_health_regen"); - - raptor_energy_max = CCVAR("_energy"); - raptor_energy_regen = CCVAR("_energy_regen"); + tracebox(self.origin, self.mins, self.maxs, self.origin - ('0 0 1' * amax), TRUE, self); + return vlen(self.origin - trace_endpos); } void raptor_bombs_return() @@ -103,11 +70,14 @@ void raptor_bombs_return() void raptor_bomblet_boom() { - if(other.enemy == self.enemy) + if(other == self.owner || other.owner == self.owner) return; pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1); - RadiusDamage (self, self.enemy, raptor_bomblet_damage, raptor_bomblet_edgedamage, raptor_bomblet_radius, world, raptor_bomblet_force, DEATH_SBROCKET, world); + RadiusDamage (self, self.enemy, autocvar_g_vehicle_raptor_bomblet_damage, + autocvar_g_vehicle_raptor_bomblet_edgedamage, + autocvar_g_vehicle_raptor_bomblet_radius, world, + autocvar_g_vehicle_raptor_bomblet_force, DEATH_SBROCKET, world); remove(self); } @@ -115,55 +85,51 @@ void raptor_bomb_burst() { self.angles = vectoangles(self.velocity); - if(self.cnt < time) - { - entity bomblet; - float i,v; - vector d; - - makevectors(self.angles); - v = vlen(self.velocity) + random(); - d = normalize(self.velocity); - pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1); - for(i = 0; i < raptor_bomblets; ++i) - { + if(autocvar_g_vehicle_raptor_bomblet_alt) + { + self.nextthink = time; + // FIXME: this can make bombs stic forever if fierd at low altitude and land close to vehicle. + traceline(self.origin, self.origin + (normalize(self.velocity) * autocvar_g_vehicle_raptor_bomblet_alt), MOVE_NORMAL, self); + if(trace_fraction == 1.0) + return; - bomblet = spawn(); - setorigin(bomblet,self.origin); + if(vlen(self.origin - self.owner.origin) < autocvar_g_vehicle_raptor_bomblet_radius) + return; + } - setmodel(bomblet,"models/vehicles/raptor_bomb.dpm"); - bomblet.scale = 0.5; + entity bomblet; + float i,v; + vector d; - bomblet.owner = self.owner; - bomblet.enemy = self.enemy; + v = vlen(self.velocity); + d = normalize(self.velocity); + pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1); - bomblet.solid = SOLID_TRIGGER; - bomblet.movetype = MOVETYPE_BOUNCE; - bomblet.touch = raptor_bomblet_boom; + for(i = 0; i < autocvar_g_vehicle_raptor_bomblets; ++i) + { - bomblet.think = raptor_bomblet_boom; - bomblet.nextthink = time + 5; + bomblet = spawn(); + setorigin(bomblet,self.origin); - //bomblet.modelflags = MF_ROCKET; - bomblet.modelflags = MF_GRENADE; + setmodel(bomblet,"models/vehicles/raptor_bomb.dpm"); + bomblet.scale = 0.5; - bomblet.velocity = normalize(d + randomvec() * raptor_bomblet_wawespread) * v; + bomblet.solid = SOLID_TRIGGER; + bomblet.movetype = MOVETYPE_BOUNCE; + bomblet.touch = raptor_bomblet_boom; + bomblet.think = raptor_bomblet_boom; + bomblet.nextthink = time + 5; + bomblet.owner = self.owner; - bomblet.angles = vectoangles(bomblet.velocity); - } + bomblet.modelflags = MF_GRENADE; - self.wait -= 1; - if(self.wait <= 0) - { - remove(self); - return; - } + bomblet.velocity = normalize(d + (randomvec() * autocvar_g_vehicle_raptor_bomblet_spread)) * v; - self.cnt = time + raptor_bomblet_wavenext; + bomblet.angles = vectoangles(bomblet.velocity); } - self.nextthink = time; + remove(self); } void raptor_bomb_touch() @@ -187,457 +153,292 @@ void raptor_bombdrop() setorigin(bomb_1, gettaginfo(self, gettagindex(self, "bombmount_left"))); setorigin(bomb_2, gettaginfo(self, gettagindex(self, "bombmount_right"))); - bomb_1.movetype = bomb_2.movetype = MOVETYPE_TOSS; - bomb_1.velocity = bomb_2.velocity = self.velocity; - bomb_1.touch = bomb_2.touch = raptor_bomb_touch; - bomb_1.think = bomb_2.think = raptor_bomb_burst; - bomb_1.nextthink = bomb_2.nextthink = time; - bomb_1.cnt = bomb_2.cnt = time + raptor_bomblet_wavefirst; - bomb_1.wait = bomb_2.wait = raptor_bomblet_waves; - - bomb_1.avelocity = bomb_2.avelocity = '0 0 180'; - bomb_1.owner = bomb_2.owner = self; - bomb_1.enemy = bomb_2.enemy = self.owner; - bomb_1.angles = bomb_2.angles = self.angles; + bomb_1.movetype = bomb_2.movetype = MOVETYPE_TOSS; + bomb_1.velocity = bomb_2.velocity = self.velocity; + bomb_1.touch = bomb_2.touch = raptor_bomb_touch; + bomb_1.think = bomb_2.think = raptor_bomb_burst; + + if(autocvar_g_vehicle_raptor_bomblet_alt) + bomb_1.nextthink = bomb_2.nextthink = time; + else + bomb_1.nextthink = bomb_2.nextthink = time + autocvar_g_vehicle_raptor_bomblet_time; + + bomb_1.avelocity = bomb_2.avelocity = '0 0 180'; + bomb_1.owner = bomb_2.owner = self; + bomb_1.enemy = bomb_2.enemy = self.owner; + bomb_1.angles = bomb_2.angles = self.angles; bomb_1.solid = bomb_2.solid = SOLID_BBOX; bomb_1 = spawn(); bomb_1.owner = self; bomb_1.think = raptor_bombs_return; - bomb_1.nextthink = time + raptor_bombs_refire; -} - -void raptor_animator_think() -{ - self.owner.frame += 1; - if(self.owner.frame == self.cnt) - remove(self); - else - self.nextthink = time + self.wait; + bomb_1.nextthink = time + autocvar_g_vehicle_raptor_bombs_refire; } -void raptor_setanim(float start, float end, float length) +void raptor_bolt_explode() { - entity ani; - if(self.tur_head.enemy) - ani = self.tur_head.enemy; - else - ani = spawn(); - - self.tur_head.enemy = ani; - ani.owner = self; - self.frame = start; - ani.cnt = end; - ani.wait = sys_frametime / length; - ani.think = raptor_animator_think; - ani.nextthink = time + ani.wait; + PROJECTILE_TOUCH; + pointparticles(particleeffectnum("raptor_cannon_impact"), findbetterlocation (self.origin, 8), trace_plane_normal * 1000, 1); + RadiusDamage (self, self.realowner, autocvar_g_vehicle_raptor_cannon_damage, 0, autocvar_g_vehicle_raptor_cannon_radius, world, 150, DEATH_WAKIGUN, world); + sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM); + remove (self); } -void raptor_beam (vector start, vector end, vector smin, vector smax, float bforce, float f_dmg, float deathtype) +void raptor_fire_cannon(entity gun, string tagname) { - vector hitloc, force, endpoint, dir; - entity ent; - - dir = normalize(end - start); - force = dir * bforce; + entity bolt; - // go a little bit into the wall because we need to hit this wall later - end = end + dir; + bolt = spawn(); - // trace multiple times until we hit a wall, each obstacle will be made unsolid. - // note down which entities were hit so we can damage them later - while (1) - { - tracebox(start, smin, smax, end, FALSE, world); - - // if it is world we can't hurt it so stop now - if (trace_ent == world || trace_fraction == 1) - break; + PROJECTILE_MAKETRIGGER(bolt); + sound (gun, CHAN_WEAPON, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM); + setorigin(bolt, gettaginfo(gun, gettagindex(gun, tagname))); - if (trace_ent.solid == SOLID_BSP) - break; + bolt.movetype = MOVETYPE_FLYMISSILE; + bolt.flags = FL_PROJECTILE | FL_NOTARGET; + bolt.owner = self; + bolt.realowner = self.owner; + bolt.touch = raptor_bolt_explode; + bolt.think = raptor_bolt_explode; + bolt.nextthink = time + 9; + bolt.bot_dodge = TRUE; + bolt.bot_dodgerating = autocvar_g_vehicle_raptor_cannon_damage; + bolt.velocity = normalize(v_forward + randomvec() * autocvar_g_vehicle_raptor_cannon_spread) * autocvar_g_vehicle_raptor_cannon_speed; - // make the entity non-solid so we can hit the next one - trace_ent.railgunhit = TRUE; - trace_ent.railgunhitloc = end; - trace_ent.railgunhitsolidbackup = trace_ent.solid; + pointparticles(particleeffectnum("raptor_cannon_muzzleflash"), bolt.origin, bolt.velocity, 1); - // make the entity non-solid - trace_ent.solid = SOLID_NOT; - } - - endpoint = trace_endpos; - - // find all the entities the railgun hit and hurt them - ent = findchainfloat(railgunhit, TRUE); - while (ent) - { - // get the details we need to call the damage function - ent.solid = ent.railgunhitsolidbackup; - hitloc = ent.railgunhitloc; - ent.railgunhitloc = '0 0 0'; - ent.railgunhitsolidbackup = SOLID_NOT; - ent.railgunhit = FALSE; - - // apply the damage - if (ent.takedamage) - Damage (ent, self, self, f_dmg, deathtype, hitloc, force); - - ent = ent.chain; - } - trace_endpos = endpoint; + CSQCProjectile(bolt, TRUE, PROJECTILE_CRYLINK , TRUE); } +void raptor_think() +{ +} void raptor_enter() { - // Remove this when bots know how to use vehicles - if (clienttype(other) != CLIENTTYPE_REAL) - return; - - if(teams_matter) - if(self.team) - if(self.team != other.team) - return; - - self.owner = other; - self.switchweapon = other.switchweapon; - - self.event_damage = vehicle_stdproc_damage; - self.colormap = self.owner.colormap; - self.vehicle_hudmodel.viewmodelforclient = self.owner; - self.nextthink = 0; - self.owner.angles = self.angles; - self.owner.takedamage = DAMAGE_NO; - self.owner.solid = SOLID_NOT; - self.owner.movetype = MOVETYPE_NOCLIP; - self.owner.alpha = -1; - self.owner.PlayerPhysplug = raptor_takeoff; - self.owner.vehicle = self; - self.owner.event_damage = SUB_Null; - self.owner.hud = HUD_RAPTOR; - self.owner.vehicle_health = self.vehicle_health / raptor_health_max; - self.owner.vehicle_shield = self.vehicle_shield / raptor_shield_max; - self.owner.view_ofs = '0 0 1'; - self.owner.vehicle_ammo1 = self.vehicle_ammo1; - self.owner.vehicle_ammo2 = self.vehicle_ammo2; - self.owner.vehicle_reload1 = self.vehicle_reload1; - self.owner.vehicle_reload2 = self.vehicle_reload2; - - other.flags &~= FL_ONGROUND; - self.flags &~= FL_ONGROUND; + self.movetype = MOVETYPE_BOUNCEMISSILE; + self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_raptor_health); + self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_raptor_shield); + self.velocity_z = 1; +} - self.frame = 0; - raptor_setanim(0, 25, 1); +void raptor_land() +{ + float hgt; - self.team = self.owner.team; - self.flags -= FL_NOTARGET; + hgt = raptor_altitude(512); + self.velocity = (self.velocity * 0.9) + ('0 0 -1800' * (hgt / 256) * sys_frametime); + self.angles_x *= 0.95; + self.angles_z *= 0.95; - self.velocity = '0 0 1'; + if(hgt < 128) + if(self.frame != 0) + self.frame = max(self.frame - 0.25, 0); - setorigin(other,self.origin + '0 0 32'); - other.velocity = self.velocity; + self.bomb1.gun1.avelocity_y = 90 + ((self.frame / 25) * 2000); + self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y; - other.flags &~= FL_ONGROUND; - msg_entity = other; - WriteByte (MSG_ONE, SVC_SETVIEWPORT); - WriteEntity( MSG_ONE, self.vehicle_viewport); + if(hgt < 16) + { + self.movetype = MOVETYPE_BOUNCE; + self.think = raptor_think; + } - WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES - WriteAngle(MSG_ONE, self.angles_x * -1); // tilt - WriteAngle(MSG_ONE, self.angles_y); // yaw - WriteAngle(MSG_ONE, 0); // roll + self.nextthink = time; } void raptor_exit(float eject) { - self.colormap = 1024; - self.flags = FL_NOTARGET; - if not (self.owner) - return; - - msg_entity = self.owner; - WriteByte (MSG_ONE, SVC_SETVIEWPORT); - WriteEntity( MSG_ONE, self.owner); - - WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES - WriteAngle(MSG_ONE, 0); // tilt - WriteAngle(MSG_ONE, self.angles_y); // yaw - WriteAngle(MSG_ONE, 0); // roll - - if (self.deadflag == DEAD_NO) + if(self.deadflag == DEAD_NO) { - //self.think = racer_exitthink; - self.nextthink = time; + vehicles_setreturn(autocvar_g_vehicle_raptor_respawntime, raptor_spawn); + self.think = raptor_land; + self.nextthink = time; } - self.owner.takedamage = DAMAGE_AIM; - self.owner.solid = SOLID_SLIDEBOX; - self.owner.movetype = MOVETYPE_WALK; - - setsize(self.owner,PL_MIN,PL_MAX); - - self.owner.effects &~= EF_NODRAW; - self.owner.alpha = 1; - self.owner.PlayerPhysplug = SUB_Null; - self.owner.vehicle = world; - self.owner.view_ofs = PL_VIEW_OFS; - self.owner.event_damage = PlayerDamage; - self.owner.hud = HUD_NORMAL; - //self.exteriormodeltoclient = self; - - self.vehicle_hudmodel.viewmodelforclient = self; + if not (self.owner) + return; + makevectors(self.angles); if(eject) { - makevectors(self.angles); - setorigin(self.owner,self.origin + v_forward * 100); + setorigin(self.owner,self.origin + v_forward * 100 + '0 0 64'); self.owner.velocity = (v_up + v_forward * 0.25) * 750; } else - { - self.owner.velocity = (v_forward) * -150; - setorigin(self.owner,self.origin - v_forward * 128); - } + setorigin(self.owner,self.origin - v_forward * 200 + '0 0 64'); self.owner = world; - - if (self.deadflag != DEAD_NO) - { - entity ret; - ret = spawn(); - ret.enemy = self; - ret.think = raptor_return; - ret.nextthink = time + autocvar_g_vehicle_racer_respawntime; - } } - -float raptor_pplug() +float raptor_frame() { - entity player, vhic; - float ftmp, ftmp2, energy_used; + entity player, raptor; + float ftmp, ftmp2; vector df; - - if(autocvar_g_vehicle_raptor_reload) - { - raptor_loadsettings(); - cvar_set("g_vehicle_raptor_reload","0"); - } - player = self; - vhic = self.vehicle; - self = vhic; + raptor = self.vehicle; + self = raptor; if(player.BUTTON_USE) { - self = vhic; - raptor_exit(0); + self = raptor; + vehicles_exit(VHEF_NORMAL); self = player; return 0; } - if(vhic.deadflag != DEAD_NO) + if(raptor.deadflag != DEAD_NO) { self = player; player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0; return 1; } - vhic.angles_x *= -1; - // Rotate Body - ftmp = raptor_turnspeed * sys_frametime; - - ftmp = bound(-ftmp, shortangle_f(player.v_angle_y - vhic.angles_y, vhic.angles_y), ftmp); + // Takeoff sequense + if(raptor.frame < 25) + { + raptor.frame += 0.25; + raptor.velocity_z = min(raptor.velocity_z * 1.5, 256); + self.bomb1.gun1.avelocity_y = 90 + ((raptor.frame / 25) * 2000); + self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y; + return 1; + } - // Roll - //ftmp = bound(-90,shortangle_f(player.v_angle_z + ((vhic.angles_y - ftmp2) * raptor_turnroll), vhic.angles_z),90); - //ftmp = safeangle(vhic.angles_z + ftmp); - //vhic.angles_z = ftmp; + raptor.angles_x *= -1; + // Rotate Body + ftmp = autocvar_g_vehicle_raptor_turnspeed * sys_frametime; + ftmp = bound(-ftmp, shortangle_f(player.v_angle_y - raptor.angles_y, raptor.angles_y), ftmp); // Turn - vhic.angles_y = anglemods(vhic.angles_y + ftmp); + raptor.angles_y = anglemods(raptor.angles_y + ftmp); // Pitch Body - ftmp = raptor_pitchspeed * sys_frametime; - - ftmp = bound(-ftmp, shortangle_f(player.v_angle_x - vhic.angles_x,vhic.angles_x), ftmp); + ftmp = autocvar_g_vehicle_raptor_pitchspeed * sys_frametime; + ftmp = bound(-ftmp, shortangle_f(player.v_angle_x - raptor.angles_x, raptor.angles_x), ftmp); - vhic.angles_x = bound(-60,anglemods(vhic.angles_x + ftmp),60); - vhic.angles_x *= -1; + raptor.angles_x = bound(-autocvar_g_vehicle_raptor_pitchlimit, anglemods(raptor.angles_x + ftmp), autocvar_g_vehicle_raptor_pitchlimit); + raptor.angles_x *= -1; - if(raptor_movestyle == 1) + if(autocvar_g_vehicle_raptor_movestyle == 1) { - ftmp = vhic.angles_z; - vhic.angles_z = 0; - ftmp2 = vhic.angles_x; - vhic.angles_x = 0; - fixedmakevectors(vhic.angles); - vhic.angles_z = ftmp; - vhic.angles_x = ftmp2; + ftmp = raptor.angles_z; + raptor.angles_z = 0; + ftmp2 = raptor.angles_x; + raptor.angles_x = 0; + fixedmakevectors(raptor.angles); + raptor.angles_z = ftmp; + raptor.angles_x = ftmp2; } else - fixedmakevectors(vhic.angles); + makevectors(player.v_angle); - df = vhic.velocity * -1; + df = raptor.velocity * -1; if(player.movement_x != 0) { if(player.movement_x > 0) - df += v_forward * raptor_speed_forward; + df += v_forward * autocvar_g_vehicle_raptor_speed_forward; else if(player.movement_x < 0) - df -= v_forward * raptor_speed_forward; + df -= v_forward * autocvar_g_vehicle_raptor_speed_forward; } if(player.movement_y != 0) { if(player.movement_y < 0) - df -= v_right * raptor_speed_strafe; + df -= v_right * autocvar_g_vehicle_raptor_speed_strafe; else if(player.movement_y > 0) - df += v_right * raptor_speed_strafe; + df += v_right * autocvar_g_vehicle_raptor_speed_strafe; - vhic.angles_z = bound(-30,vhic.angles_z + (player.movement_y / raptor_speed_strafe),30); + raptor.angles_z = bound(-30,raptor.angles_z + (player.movement_y / autocvar_g_vehicle_raptor_speed_strafe),30); } else { - vhic.angles_z *= 0.95; - if(vhic.angles_z >= -1 && vhic.angles_z <= -1) - vhic.angles_z = 0; + raptor.angles_z *= 0.95; + if(raptor.angles_z >= -1 && raptor.angles_z <= -1) + raptor.angles_z = 0; } if(player.BUTTON_CROUCH) - df -= v_up * raptor_speed_down; + df -= v_up * autocvar_g_vehicle_raptor_speed_down; else if (player.BUTTON_JUMP) - df += v_up * raptor_speed_up; - //else - //df_z = vhic.velocity_z * -1; + df += v_up * autocvar_g_vehicle_raptor_speed_up; - vhic.velocity += df * frametime; - player.velocity = player.movement = vhic.velocity; - setorigin(player,vhic.origin + '0 0 32'); + raptor.velocity += df * frametime; + player.velocity = player.movement = raptor.velocity; + setorigin(player,raptor.origin + '0 0 32'); // Aim the gunz - /* - vector target_angle, move_angle, org1, org2, targ; - - makevectors(player.v_angle); - - //targ = (vhic.origin + player.view_ofs) + v_forward * MAX_SHOT_DISTANCE; - targ = player.cursor_trace_endpos; - - org1 = gettaginfo(vhic.gun1,gettagindex(vhic.gun1, "fire1")); - org2 = gettaginfo(vhic.gun2,gettagindex(vhic.gun2, "fire1")); - - traceline(vhic.origin + player.view_ofs, targ, FALSE, vhic); - targ = trace_endpos; - - // Find the direction - target_angle = vectoangles(normalize(targ - org1)); // And make a angle - - // Find the diffrence between where we currently aim and where we want to aim - move_angle = target_angle - (vhic.angles + vhic.gun1.angles); - move_angle = shortangle_vxy(move_angle,(vhic.angles + vhic.gun1.angles)); - vhic.gun1.angles_x = bound(-10, move_angle_x + vhic.gun1.angles_x, 10); - vhic.gun1.angles_y = bound(-15, move_angle_y + vhic.gun1.angles_y, 15); + crosshair_trace(player); + ftmp2 = autocvar_g_vehicle_raptor_guns_turnspeed * frametime; + ftmp = -ftmp2; + + // Gun1 + df = vectoangles(normalize(trace_endpos - gettaginfo(raptor.gun1, gettagindex(raptor.gun1, "fire1")))); // Find the direction & angle + df = shortangle_vxy(df - (raptor.angles + raptor.gun1.angles), raptor.angles + raptor.gun1.angles); // Find aim offset + // Bind to aimspeed + df_x = bound(ftmp, df_x, ftmp2); + df_y = bound(ftmp, df_y, ftmp2); + // Bind to limts + raptor.gun1.angles_x = bound(-(autocvar_g_vehicle_raptor_guns_pitchlimit + 8), df_x + raptor.gun1.angles_x, autocvar_g_vehicle_raptor_guns_pitchlimit); + raptor.gun1.angles_y = bound(-autocvar_g_vehicle_raptor_guns_turnlimit, df_y + raptor.gun1.angles_y, autocvar_g_vehicle_raptor_guns_turnlimit); + + //Gun 2 + df = vectoangles(normalize(trace_endpos - gettaginfo(raptor.gun2, gettagindex(raptor.gun2, "fire1")))); // Find the direction & angle + df = shortangle_vxy(df - (raptor.angles + raptor.gun2.angles), raptor.angles + raptor.gun2.angles); // Find aim offset + // Bind to aimspeed + df_x = bound(ftmp, df_x, ftmp2); + df_y = bound(ftmp, df_y, ftmp2); + // Bind to limts + raptor.gun2.angles_x = bound(-(autocvar_g_vehicle_raptor_guns_pitchlimit + 8), df_x + raptor.gun2.angles_x, autocvar_g_vehicle_raptor_guns_pitchlimit); + raptor.gun2.angles_y = bound(-autocvar_g_vehicle_raptor_guns_turnlimit, df_y + raptor.gun2.angles_y, autocvar_g_vehicle_raptor_guns_turnlimit); - // Find the direction - target_angle = vectoangles(normalize(targ - org2)); // And make a angle - move_angle = target_angle - (vhic.angles + vhic.gun2.angles); - move_angle = shortangle_vxy(move_angle,(vhic.angles + vhic.gun2.angles)); - vhic.gun2.angles_x = bound(-15,move_angle_x + vhic.gun2.angles_x,15); - vhic.gun2.angles_y = bound(-20,move_angle_y + vhic.gun2.angles_y,20); - */ if(player.BUTTON_ATCK) - if(vhic.vehicle_energy > (raptor_beam_aps * sys_frametime)) + if(raptor.attack_finished_single <= time) + if(raptor.vehicle_energy > autocvar_g_vehicle_raptor_cannon_cost) { - vector start; - self = player; - - start = gettaginfo(vhic.gun1, gettagindex(vhic.gun1, "fire1")); - traceline(start, start + v_forward * MAX_SHOT_DISTANCE, TRUE, player); - te_lightning1(vhic.gun1, start, trace_endpos); - raptor_beam(start, trace_endpos, '-1 -1 -1' * raptor_beam_size, '1 1 1' * raptor_beam_size, raptor_beam_fops * sys_frametime, raptor_beam_dps * sys_frametime, DEATH_SBROCKET); - - - start = gettaginfo(vhic.gun2, gettagindex(vhic.gun2, "fire1")); - traceline(start, start + v_forward * MAX_SHOT_DISTANCE, TRUE, player); - te_lightning1(vhic.gun2, start, trace_endpos); - raptor_beam(start, trace_endpos, '-1 -1 -1' * raptor_beam_size, '1 1 1' * raptor_beam_size, raptor_beam_fops * sys_frametime, raptor_beam_dps * sys_frametime, DEATH_SBROCKET); - - self = vhic; + raptor_fire_cannon(self.gun1, "fire1"); + raptor_fire_cannon(self.gun2, "fire1"); - vhic.vehicle_energy -= raptor_beam_aps * sys_frametime; - vhic.cnt = time + 1; + raptor.vehicle_energy -= autocvar_g_vehicle_raptor_cannon_cost; + raptor.attack_finished_single = time + autocvar_g_vehicle_raptor_cannon_refire; + self.cnt = time; } - if(vhic.cnt < time) - vhic.vehicle_energy = min(vhic.vehicle_energy += raptor_energy_regen * frametime, raptor_energy_max); + if(self.vehicle_flags & VHF_SHIELDREGEN) + vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, frametime); - player.vehicle_energy = vhic.vehicle_energy / raptor_energy_max; + if(self.vehicle_flags & VHF_HEALTHREGEN) + vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, frametime); + if(self.vehicle_flags & VHF_ENERGYREGEN) + vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, frametime); + player.vehicle_energy = raptor.vehicle_energy / autocvar_g_vehicle_raptor_energy; + + if(time > raptor.delay) if(player.BUTTON_ATCK2) - if(time > vhic.delay) { raptor_bombdrop(); - vhic.delay = time + raptor_bombs_refire; + raptor.delay = time + autocvar_g_vehicle_raptor_bombs_refire; + raptor.lip = time; } - player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0; - vehicle_stdproc_shiledregen(raptor_shield_max, frametime); - vehicle_stdproc_healthregen(raptor_health_max, frametime); - - self = player; - - return 1; -} - -float raptor_takeoff() -{ - entity player, vhic; + player.vehicle_reload1 = (time - raptor.lip) / (raptor.delay - raptor.lip); + VEHICLE_UPDATE_PLAYER(health, raptor); - if(self.vehicle.frame < 25) - return 1; + if(self.vehicle_flags & VHF_HASSHIELD) + VEHICLE_UPDATE_PLAYER(shield, raptor); - player = self; - vhic = self.vehicle; - self = vhic; - - if(raptor_altitude(512) <= 256) - { - vhic.velocity_z = min(vhic.velocity_z * 1.5, 256); - } - else - { - player.PlayerPhysplug = raptor_pplug; - } + player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0; - player.BUTTON_CROUCH = player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0; self = player; - return 1; } -float raptor_land() -{ - return 0; -} - -void raptor_return() -{ - pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1); - self.enemy.think = raptor_spawn; - self.enemy.nextthink = time; - remove(self); -} - -void raptor_think() -{ -} - void raptor_touch() { if(self.owner) @@ -660,7 +461,27 @@ void raptor_touch() if(other.vehicle != world) return; - raptor_enter(); + vehicles_enter(); +} + +void raptor_blowup() +{ + sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM); + pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1); + + self.deadflag = DEAD_DEAD; + self.vehicle_exit(VHEF_NORMAL); + RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_WAKIBLOWUP, world); + + self.alpha = -1; + self.movetype = MOVETYPE_NONE; + self.effects = EF_NODRAW; + self.colormod = '0 0 0'; + self.avelocity = '0 0 0'; + self.velocity = '0 0 0'; + + setorigin(self, self.pos1); + self.touch = SUB_Null; } void raptor_die() @@ -668,26 +489,26 @@ void raptor_die() self.health = 0; self.event_damage = SUB_Null; self.iscreature = FALSE; - self.solid = SOLID_NOT; + self.solid = SOLID_CORPSE; self.takedamage = DAMAGE_NO; - //self.touch = racer_dietouch; self.deadflag = DEAD_DYING; self.movetype = MOVETYPE_BOUNCE; - self.wait = time; + //self.wait = time; pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1); - self.velocity += '0 0 128'; + self.velocity_z += 128; if(random() < 0.5) - self.avelocity_z = 45; + self.avelocity_z = 45 + random() * 270; else - self.avelocity_z = -45; + self.avelocity_z = -45 + random() * -270; self.colormod = '-0.5 -0.5 -0.5'; + self.touch = raptor_blowup; self.think = raptor_spawn; - self.nextthink = time + 5; + self.nextthink = time + autocvar_g_vehicle_raptor_respawntime; } void raptor_spawn() @@ -695,121 +516,97 @@ void raptor_spawn() self.flags = FL_NOTARGET; self.effects = 0; - self.vehicle_health = raptor_health_max; - self.vehicle_shield = raptor_shield_max; - - self.event_damage = vehicle_stdproc_damage; - self.touch = raptor_touch; - - self.iscreature = TRUE; - self.movetype = MOVETYPE_FLY; - self.solid = SOLID_SLIDEBOX; - self.takedamage = DAMAGE_AIM; - - self.alpha = 1; - self.colormap = 1024; - self.deadflag = DEAD_NO; - self.bot_attack = TRUE; - - self.colormod = '1 1 1'; - self.avelocity = '0 0 0'; - self.velocity = '0 0 0'; - + self.vehicle_health = autocvar_g_vehicle_raptor_health; + self.vehicle_shield = autocvar_g_vehicle_raptor_shield; + self.event_damage = vehicles_damage; + self.touch = raptor_touch; + self.iscreature = TRUE; + self.movetype = MOVETYPE_FLY; + self.solid = SOLID_SLIDEBOX; + self.takedamage = DAMAGE_AIM; + self.alpha = 1; + self.colormap = 1024; + self.deadflag = DEAD_NO; + self.bot_attack = TRUE; + self.colormod = '1 1 1'; + self.avelocity = '0 0 0'; + self.velocity = '0 0 0'; self.vehicle_energy = 1; self.vehicle_hudmodel.viewmodelforclient = self; + self.bomb1.gun1.avelocity_y = 90; + self.bomb1.gun2.avelocity_y = -90; + self.frame = 0; + setorigin(self, self.pos1); self.angles = self.pos2; - setsize(self,RAPTOR_MIN ,RAPTOR_MAX ); + setsize(self, RAPTOR_MIN, RAPTOR_MAX ); pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1); self.delay = time; } -float raptor_customizeentityforclient() -{ - if(self.deadflag == DEAD_DEAD) - return FALSE; - - /* - if(other == self.owner) - self.alpha = -1; - else - self.alpha = 1; - */ - - return TRUE; -} - void raptor_dinit() { + entity spinner; + vector ofs; + + if not (vehicle_initialize( + "Raptor", + "models/vehicles/raptor.dpm", + "", + "models/vehicles/raptor_cockpit.dpm", + "", "tag_hud", "tag_camera", + HUD_RAPTOR, + RAPTOR_MIN, RAPTOR_MAX, + FALSE, + raptor_spawn, raptor_frame, + raptor_enter, raptor_exit, + raptor_die, raptor_think)) + { + remove(self); + return; + } - if (self.netname == "") - self.netname = "Raptor"; - - setorigin(self, self.origin); + //FIXME: Camera is in a bad place in HUD model. + setorigin(self.vehicle_viewport, '10 0 3'); self.frame = 0; - setmodel(self,"models/vehicles/raptor.dpm"); - self.bomb1 = spawn(); self.bomb2 = spawn(); + self.gun1 = spawn(); + self.gun2 = spawn(); setmodel(self.bomb1,"models/vehicles/raptor_bomb.dpm"); setmodel(self.bomb2,"models/vehicles/raptor_bomb.dpm"); + setmodel(self.gun1, "models/vehicles/raptor_gun.dpm"); + setmodel(self.gun2, "models/vehicles/raptor_gun.dpm"); setattachment(self.bomb1, self,"bombmount_left"); setattachment(self.bomb2, self,"bombmount_right"); + // FIXME Guns mounts to angled bones + // This messes up gun-aim, so work arround it. + //setattachment(self.gun1, self, "gunmount_left"); + ofs = gettaginfo(self, gettagindex(self, "gunmount_left")); + ofs -= self.origin; + setattachment(self.gun1, self, ""); + setorigin(self.gun1, ofs); - if not (self.vehicle_hudmodel) - { - self.vehicle_hudmodel = spawn(); - setmodel(self.vehicle_hudmodel, "models/vehicles/raptor_cockpit.dpm"); - //setattachment(self.vehicle_hudmodel, self, "tag_viewport"); - setattachment(self.vehicle_hudmodel, self, "tag_hud"); - } - - if not (self.vehicle_viewport) - { - self.vehicle_viewport = spawn(); - setmodel (self.vehicle_viewport, "null"); - setattachment(self.vehicle_viewport, self.vehicle_hudmodel, "tag_camera"); - } - - if not (self.gun1) - { - self.gun1 = spawn(); - setmodel(self.gun1, "models/vehicles/raptor_gun.dpm"); - setattachment(self.gun1, self, "gunmount_left"); - } + //setattachment(self.gun2, self, "gunmount_right"); + ofs = gettaginfo(self, gettagindex(self, "gunmount_right")); + ofs -= self.origin; + setattachment(self.gun2, self, ""); + setorigin(self.gun2, ofs); - if not (self.gun2) - { - self.gun2 = spawn(); - setmodel(self.gun2, "models/vehicles/raptor_gun.dpm"); - setattachment(self.gun2, self, "gunmount_right"); - } - - self.tur_head = spawn(); - self.pos1 = self.origin; - self.pos2 = self.angles; - - self.vehicle_hudmodel.viewmodelforclient = self; - self.customizeentityforclient = raptor_customizeentityforclient; - - self.vehicle_die = raptor_die; - self.vehicle_exit = raptor_exit; - - - entity spinner; spinner = spawn(); spinner.owner = self; setmodel(spinner,"models/vehicles/spinner.dpm"); setattachment(spinner, self, "engine_left"); spinner.movetype = MOVETYPE_NOCLIP; spinner.avelocity = '0 90 0'; + self.bomb1.gun1 = spinner; spinner = spawn(); spinner.owner = self; @@ -817,45 +614,24 @@ void raptor_dinit() setattachment(spinner, self, "engine_right"); spinner.movetype = MOVETYPE_NOCLIP; spinner.avelocity = '0 -90 0'; - - addstat(STAT_HUD, AS_INT, hud); - addstat(STAT_VEHICLESTAT_HEALTH, AS_FLOAT, vehicle_health); - addstat(STAT_VEHICLESTAT_SHIELD, AS_FLOAT, vehicle_shield); - addstat(STAT_VEHICLESTAT_ENERGY, AS_FLOAT, vehicle_energy); - - addstat(STAT_VEHICLESTAT_AMMO1, AS_INT, vehicle_ammo1); - addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1); - - addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2); - addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2); - - raptor_spawn(); + self.bomb1.gun2 = spinner; } void spawnfunc_vehicle_raptor() { - self.cvar_basename = "g_vehicle_raptor"; - raptor_loadsettings(); + vehicles_configcheck("vehicle_raptor.cfg", autocvar_g_vehicle_raptor_health); - self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN; + if(autocvar_g_vehicle_raptor_shield) + self.vehicle_flags |= VHF_HASSHIELD; - traceline(self.origin, self.origin - '0 0 2048', MOVE_WORLDONLY, self); - if(trace_startsolid) - { - dprint("WARNING: vehicle_raptor placed in solid\n"); - traceline(self.origin + '0 0 512' ,self.origin - '0 0 2048',MOVE_WORLDONLY,self); - if(trace_startsolid || trace_fraction == 1.0) - { - dprint("ERROR: vehicle_raptor placed in more then 512 units into solid\n"); - remove(self); - return; - } - } + if(autocvar_g_vehicle_raptor_shield_regen) + self.vehicle_flags |= VHF_SHIELDREGEN; - if(trace_fraction != 1.0) - setorigin(self,trace_endpos + '0 0 8'); - else - dprint("WARNING: vehicle_racer placed more then 2048 units above ground.\n"); + if(autocvar_g_vehicle_raptor_health_regen) + self.vehicle_flags |= VHF_HEALTHREGEN; + + if(autocvar_g_vehicle_raptor_energy_regen) + self.vehicle_flags |= VHF_ENERGYREGEN; precache_model ("models/vehicles/raptor.dpm"); precache_model ("models/vehicles/raptor_gun.dpm"); @@ -867,26 +643,3 @@ void spawnfunc_vehicle_raptor() self.think = raptor_dinit; self.nextthink = time + 1; } - - -void spawnfunc_vehicle_raptor2() -{ - entity iqm,dpm,md3; - - precache_model ("models/vehicles/test.iqm"); - precache_model ("models/vehicles/test.dpm"); - precache_model ("models/vehicles/test.md3"); - - iqm = spawn(); - dpm = spawn(); - md3 = spawn(); - iqm.scale = md3.scale = dpm.scale = 10; - - //setmodel(iqm,"models/vehicles/test.iqm"); - //setmodel(dpm,"models/vehicles/test.dpm"); - setmodel(md3,"models/vehicles/test.md3"); - - setorigin(iqm, self.origin + '0 0 16'); - setorigin(dpm, self.origin + '0 20 32'); - setorigin(iqm, self.origin + '0 40 48'); -} diff --git a/qcsrc/server/vehicles/spiderbot.qc b/qcsrc/server/vehicles/spiderbot.qc index 6743f73d2..3d42e71ac 100644 --- a/qcsrc/server/vehicles/spiderbot.qc +++ b/qcsrc/server/vehicles/spiderbot.qc @@ -1,10 +1,62 @@ -const vector spiderbot_MIN = '-75 -75 0'; -const vector spiderbot_MAX = '75 75 100'; - -#define spiderbot_spawnpnt wkr_spawn +const vector spiderbot_MIN = '-75 -75 10'; +const vector spiderbot_MAX = '75 75 110'; + +float autocvar_g_vehicle_spiderbot_respawntime; + +float autocvar_g_vehicle_spiderbot_crush_dmg; +float autocvar_g_vehicle_spiderbot_crush_force; + +float autocvar_g_vehicle_spiderbot_head_pitchlimit_down; +float autocvar_g_vehicle_spiderbot_head_pitchlimit_up; +float autocvar_g_vehicle_spiderbot_head_pitchspeed; +float autocvar_g_vehicle_spiderbot_head_turnlimit; +float autocvar_g_vehicle_spiderbot_head_turnspeed; + +//float autocvar_g_vehicle_spiderbot_energy; +//float autocvar_g_vehicle_spiderbot_energy_regen; +//float autocvar_g_vehicle_spiderbot_energy_regen_pause; + +float autocvar_g_vehicle_spiderbot_health; +float autocvar_g_vehicle_spiderbot_health_regen; +float autocvar_g_vehicle_spiderbot_health_regen_pause; + +float autocvar_g_vehicle_spiderbot_shield; +float autocvar_g_vehicle_spiderbot_shield_regen; +float autocvar_g_vehicle_spiderbot_shield_regen_pause; + +float autocvar_g_vehicle_spiderbot_minigun_cooldown; +float autocvar_g_vehicle_spiderbot_minigun_damage; +float autocvar_g_vehicle_spiderbot_minigun_heat; +float autocvar_g_vehicle_spiderbot_minigun_refire; +float autocvar_g_vehicle_spiderbot_minigun_spread; +float autocvar_g_vehicle_spiderbot_movement_inertia; + +float autocvar_g_vehicle_spiderbot_rocket_damage; +float autocvar_g_vehicle_spiderbot_rocket_edgedamage; +float autocvar_g_vehicle_spiderbot_rocket_force; +float autocvar_g_vehicle_spiderbot_rocket_health; +float autocvar_g_vehicle_spiderbot_rocket_lifetime; +float autocvar_g_vehicle_spiderbot_rocket_noise; +float autocvar_g_vehicle_spiderbot_rocket_radius; +float autocvar_g_vehicle_spiderbot_rocket_refire; +float autocvar_g_vehicle_spiderbot_rocket_reload; +float autocvar_g_vehicle_spiderbot_rocket_speed; +float autocvar_g_vehicle_spiderbot_rocket_turnrate; + +float autocvar_g_vehicle_spiderbot_shield; +float autocvar_g_vehicle_spiderbot_speed_stop; +float autocvar_g_vehicle_spiderbot_speed_strafe; +float autocvar_g_vehicle_spiderbot_speed_walk; +float autocvar_g_vehicle_spiderbot_turnspeed; + + +float autocvar_g_vehicle_spiderbot_springlength; +float autocvar_g_vehicle_spiderbot_springup; +float autocvar_g_vehicle_spiderbot_springblend; void spiderbot_exit(float eject); void spiderbot_enter(); +void spiderbot_spawn(); void spiderbot_rocket_explode() { @@ -131,7 +183,6 @@ void spiderbot_rocket_do() return; } - self.wait = 1; } else @@ -188,40 +239,25 @@ void spiderbot_rocket_do() self.gun2.cnt = time + self.attack_finished_single; } -/* -void spiderbot_minigun_fire_Flash_Go() { - if (self.frame > 10) - { - self.alpha = -1; - setmodel(self,""); - return; - } - - self.frame = self.frame + 2; - self.alpha = self.alpha - 0.2; - self.scale -= 0.01; - self.nextthink = time + 0.02; -} -*/ - void spiderbot_minigun_fire(entity gun, float trail) { vector v; - - v = gettaginfo(gun,gettagindex(gun,"barrels")); - v_forward = normalize(v_forward); + entity oldself; - sound (gun, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM); + v = gettaginfo(gun, gettagindex(gun,"barrels")); + v_forward = normalize(v_forward); + v += v_forward * 50; fireBullet (v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage, autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0); - - UziFlash(); - setattachment(self.muzzle_flash, self.tur_head, "tag_fire"); - if(trail) - trailparticles(self, particleeffectnum("EF_MGTURRETTRAIL"), v, trace_endpos); + { + sound (gun, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM); + trailparticles(self, particleeffectnum("spiderbot_minigun_trail"), v, trace_endpos); + pointparticles(particleeffectnum("spiderbot_minigun_muzzleflash"), v, v_forward * 2500, 1); + pointparticles(particleeffectnum("spiderbot_minigun_impact"), trace_endpos, trace_plane_normal * 2500,1); + } } void spiderbot_miniguns_do() @@ -230,13 +266,12 @@ void spiderbot_miniguns_do() if((self.vehicle_reload1 == 1) || (!self.owner.BUTTON_ATCK)) { - ftmp = 1 / autocvar_g_vehicle_spiderbot_minigun_cooldown * sys_frametime; self.owner.vehicle_reload1 = max(self.owner.vehicle_reload1 - ftmp, 0); if(self.owner.vehicle_reload1 <= 0) self.vehicle_reload1 = 0; - return ; + return; } if (self.owner.BUTTON_ATCK) @@ -267,7 +302,6 @@ void spiderbot_miniguns_do() spiderbot_minigun_fire(self.vehicle.gun2, 0); self.misc_bulletcounter += 1; } - self = self.vehicle; ftmp = autocvar_g_vehicle_spiderbot_minigun_refire / autocvar_g_vehicle_spiderbot_minigun_heat; @@ -281,42 +315,37 @@ void spiderbot_miniguns_do() } else self.tur_head.attack_finished_single = autocvar_g_vehicle_spiderbot_minigun_refire + time; - } - self = self.owner; + } return; } } -float spiderbot_pplug() +float spiderbot_frame() { vector ad; - entity player,spider; + entity player, spider; float ftmp; - if not (self.owner) - { - } - player = self; spider = self.vehicle; - player.BUTTON_ZOOM = 0; - player.BUTTON_CROUCH = 0; - player.switchweapon = 0; + player.BUTTON_ZOOM = 0; + player.BUTTON_CROUCH = 0; + player.switchweapon = 0; if(player.BUTTON_USE) { self = spider; - spiderbot_exit(0); + vehicles_exit(VHEF_NORMAL); self = player; return 0; } + self = spider; + crosshair_trace(player); ad = vectoangles(normalize(trace_endpos - gettaginfo(spider.tur_head,gettagindex(spider.tur_head,"tag_hud")))) - (spider.tur_head.angles + spider.angles); - - fixedmakevectors(spider.angles); if(ad_x > 180) ad_x -= 360; if(ad_x < -180) ad_x += 360; if(ad_y > 180) ad_y -= 360; @@ -336,7 +365,24 @@ float spiderbot_pplug() ftmp = autocvar_g_vehicle_spiderbot_turnspeed * sys_frametime; ftmp = bound(-ftmp, spider.tur_head.angles_y, ftmp); - self = spider; + //fixedmakevectors(self.angles); + // Not sure why this works better, but it does. + spider.tur_head.angles_x *= -1; + spider.angles_x *= -1; + makevectors(spider.angles); + spider.tur_head.angles_x *= -1; + spider.angles_x *= -1; + + /* + vector ofs; + ofs = self.origin + v_up * 128; + te_lightning1(world, ofs, ofs + v_up * 32); + te_lightning1(world, ofs, ofs + v_right * 128); + te_lightning1(world, ofs, ofs + v_forward * 256); + */ + + movelib_groundalign4point(autocvar_g_vehicle_spiderbot_springlength, autocvar_g_vehicle_spiderbot_springup, autocvar_g_vehicle_spiderbot_springblend); + if(spider.flags & FL_ONGROUND) { if(player.BUTTON_JUMP && self.tur_head.wait < time) @@ -387,16 +433,21 @@ float spiderbot_pplug() } movelib_move_simple(normalize(v_right * player.movement_y),autocvar_g_vehicle_spiderbot_speed_strafe,autocvar_g_vehicle_spiderbot_movement_inertia); } - } } - movelib_groundalign4point(300,100,0.25); } + self.angles_x = bound(-60, self.angles_x, 60); + self.angles_z = bound(-60, self.angles_z, 60); + spiderbot_miniguns_do(); spiderbot_rocket_do(); - vehicle_stdproc_shiledregen(CCVAR("_shield"), frametime); - vehicle_stdproc_healthregen(CCVAR("_health"), frametime); + + if(self.vehicle_flags & VHF_SHIELDREGEN) + vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_spiderbot_shield, autocvar_g_vehicle_spiderbot_shield_regen_pause, autocvar_g_vehicle_spiderbot_shield_regen, frametime); + + if(self.vehicle_flags & VHF_HEALTHREGEN) + vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_spiderbot_health, autocvar_g_vehicle_spiderbot_health_regen_pause, autocvar_g_vehicle_spiderbot_health_regen, frametime); player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0; player.vehicle_ammo2 = spider.tur_head.frame; @@ -406,11 +457,34 @@ float spiderbot_pplug() else player.vehicle_reload2 = 1 - ((spider.gun2.cnt - time) / spider.attack_finished_single); - setorigin(player,spider.origin + '0 0 64'); + setorigin(player, spider.origin + '0 0 64'); player.velocity = spider.velocity; - self = player; + VEHICLE_UPDATE_PLAYER(health, spiderbot); + + if(self.vehicle_flags & VHF_HASSHIELD) + VEHICLE_UPDATE_PLAYER(shield, spiderbot); + vector vf; + + ad = gettaginfo(spider.gun1, gettagindex(spider.gun1, "barrels")); + vf = v_forward; + ad += gettaginfo(spider.gun2, gettagindex(spider.gun2, "barrels")); + vf += v_forward; + ad = ad * 0.5; + v_forward = vf * 0.5; + + traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, spider); + SpawnOrUpdateAuxiliaryXhair(player, trace_endpos); + + //player.angles_x = 0.01 * spider.angles_x + 0.99 * player.v_angle_x; + //player.angles_y = 0.01 * spider.angles_y + 0.99 * player.v_angle_y; + player.v_angle_y = spider.angles_y; + //player.angles_x = player.v_angle_x; + //player.angles_y = player.v_angle_y; + //player.fixangle = TRUE; + + self = player; return 1; } @@ -424,70 +498,15 @@ void spiderbot_think() void spiderbot_enter() { - // Remove this when bots know how to use the spiderbot - if (clienttype(other) != CLIENTTYPE_REAL) - return; - - self.colormod = self.tur_head.colormod = '0 0 0'; - - if(teams_matter) - if(self.team) - if(self.team != other.team) - return; - - self.owner = other; - self.switchweapon = other.switchweapon; - - self.event_damage = vehicle_stdproc_damage ; - self.colormap = self.owner.colormap; - self.tur_head.colormap = self.owner.colormap; - self.vehicle_hudmodel.viewmodelforclient = self.owner; - self.nextthink = 0; - self.owner.angles = self.angles; - self.owner.takedamage = DAMAGE_NO; - self.owner.solid = SOLID_NOT; - self.owner.movetype = MOVETYPE_NOCLIP; - self.owner.alpha = -1; - self.owner.PlayerPhysplug = spiderbot_pplug; - self.owner.vehicle = self; - self.owner.event_damage = SUB_Null; - self.owner.hud = HUD_SPIDERBOT; self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_spiderbot_health); self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_spiderbot_shield); - self.owner.view_ofs = '0 0 0'; - self.owner.vehicle_ammo1 = self.vehicle_ammo1; - self.owner.vehicle_ammo2 = self.vehicle_ammo2; - self.owner.vehicle_reload1 = self.vehicle_reload1; - self.owner.vehicle_reload2 = self.vehicle_reload2; - - //if(other.flags & FL_ONGROUND) - other.flags &~= FL_ONGROUND; - - //if(self.flags & FL_ONGROUND) - self.flags &~= FL_ONGROUND; - - self.team = self.owner.team; - self.flags -= FL_NOTARGET; - - if(clienttype(other) == CLIENTTYPE_REAL) - { - msg_entity = other; - WriteByte (MSG_ONE, SVC_SETVIEWPORT); - WriteEntity(MSG_ONE, self.vehicle_viewport); - - WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES - WriteAngle(MSG_ONE, self.tur_head.angles_x + self.angles_x); // tilt - WriteAngle(MSG_ONE, self.tur_head.angles_y + self.angles_y); // yaw - WriteAngle(MSG_ONE, 0); // roll - } } void spiderbot_exit(float eject) { entity e; - self.frame = 5; - self.flags |= FL_NOTARGET; + vehicles_setreturn(autocvar_g_vehicle_spiderbot_respawntime, spiderbot_spawn); e = findchain(classname,"spiderbot_rocket"); while(e) @@ -500,66 +519,29 @@ void spiderbot_exit(float eject) e = e.chain; } - self.owner.switchweapon = self.switchweapon; - - self.velocity = '0 0 0'; - if(clienttype(self.owner) == CLIENTTYPE_REAL) - { - msg_entity = self.owner; - WriteByte (MSG_ONE, SVC_SETVIEWPORT); - WriteEntity( MSG_ONE, self.owner); - - WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES - WriteAngle(MSG_ONE, 0); // tilt - WriteAngle(MSG_ONE, self.angles_y); // yaw - WriteAngle(MSG_ONE, 0); // roll - } - - self.think = spiderbot_think; - self.nextthink = time; - self.owner.takedamage = DAMAGE_AIM; - self.owner.solid = SOLID_SLIDEBOX; - self.owner.movetype = MOVETYPE_WALK; - - setsize(self.owner,PL_MIN,PL_MAX); - - self.owner.alpha = 1; - self.owner.PlayerPhysplug = SUB_Null; - self.owner.vehicle = world; - self.owner.view_ofs = PL_VIEW_OFS; - self.owner.hud = HUD_NORMAL; - self.owner.event_damage = PlayerDamage; - - self.colormap = 1024; - self.tur_head.colormap = 1024; - - if not (teams_matter) - self.team = 0; - else - { - self.team = self.spiderbot_spawnpnt.team ; - if (self.team == COLOR_TEAM1) self.colormod = '1.4 0.8 0.8'; - if (self.team == COLOR_TEAM2) self.colormod = '0.8 0.8 1.4'; - self.tur_head.colormod = self.colormod; - } + self.velocity = '0 0 0'; + self.think = spiderbot_think; + self.nextthink = time; + self.frame = 5; - self.vehicle_hudmodel.viewmodelforclient = self; - self.tur_head.nodrawtoclient = self; + if not (self.owner) + return; - setattachment(self.owner,world,""); + Release_AuxiliaryXhair(self.owner); makevectors(self.angles); if(eject) { - setorigin(self.owner,self.origin + v_forward * 100 + '0 0 64'); + setorigin(self.owner ,self.origin + v_forward * 100 + '0 0 64'); self.owner.velocity = (v_up + v_forward * 0.25) * 750; } else - setorigin(self.owner,self.origin - v_forward * 200 + '0 0 64'); + setorigin(self.owner, self.origin - v_forward * 200 + '0 0 64'); self.owner = world; } +// Better way of determening whats crushable needed! (fl_crushable?) float spiderbot_crushable(entity e) { if(e.classname == "corpse") @@ -586,7 +568,7 @@ void spiderbot_touch() //todo: add check for velocity/angle here (so we dont cush players runing into us from behind) - Damage(other,self,self.owner,autocvar_g_vehicle_spiderbot_crush_dmg,DEATH_SBCRUSH,'0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicle_spiderbot_crush_force ); + Damage(other, self, self.owner,autocvar_g_vehicle_spiderbot_crush_dmg,DEATH_SBCRUSH, '0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicle_spiderbot_crush_force); return; } @@ -599,47 +581,40 @@ void spiderbot_touch() if(other.vehicle != world) return; - spiderbot_enter(); + vehicles_enter(); } -float spiderbot_customizeentityforclient() -{ - if(self.deadflag == DEAD_DEAD) - return FALSE; - - return TRUE; -} void spiderbot_spawn() { - self.frame = 5; - self.think = spiderbot_think; - self.nextthink = time; - setsize(self,spiderbot_MIN,spiderbot_MAX); - - self.owner = world; - self.velocity = '0 0 0'; - self.vehicle_health = CCVAR("_health"); - self.vehicle_shield = CCVAR("_shield"); - self.event_damage = vehicle_stdproc_damage; - self.iscreature = TRUE; - self.movetype = MOVETYPE_WALK; - self.solid = SOLID_SLIDEBOX; - self.takedamage = DAMAGE_AIM; - self.touch = spiderbot_touch; - self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1; - self.tur_head.angles = '0 0 0'; - self.colormap = 1024; - self.tur_head.colormap = 1024; - self.deadflag = DEAD_NO; - self.bot_attack = TRUE; - self.flags |= FL_NOTARGET; + setsize(self, spiderbot_MIN, spiderbot_MAX); + + self.frame = 5; + self.think = spiderbot_think; + self.nextthink = time; + self.owner = world; + self.velocity = '0 0 0'; + self.vehicle_health = autocvar_g_vehicle_spiderbot_health; + self.vehicle_shield = autocvar_g_vehicle_spiderbot_shield; + self.event_damage = vehicles_damage; + self.iscreature = TRUE; + self.movetype = MOVETYPE_WALK; + self.solid = SOLID_SLIDEBOX; + self.takedamage = DAMAGE_AIM; + self.touch = spiderbot_touch; + self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1; + self.tur_head.angles = '0 0 0'; + self.colormap = 1024; + self.tur_head.colormap = 1024; + self.deadflag = DEAD_NO; + self.bot_attack = TRUE; + self.flags |= FL_NOTARGET; + self.tur_head.frame = 1; self.vehicle_hudmodel.viewmodelforclient = self; - self.tur_head.frame = 1; - setorigin(self,self.spiderbot_spawnpnt.origin + '0 0 1.25' * spiderbot_MAX_z); - self.angles = self.spiderbot_spawnpnt.angles; + setorigin(self, self.pos1 + '0 0 128'); + self.angles = self.pos2; if (self.team == COLOR_TEAM1) self.colormod = '1.4 0.8 0.8'; @@ -651,13 +626,81 @@ void spiderbot_spawn() self.tur_head.colormod = self.colormod; - pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1); +} + +void spiderbot_headfade() +{ + self.think = spiderbot_headfade; + self.nextthink = self.fade_time; + self.alpha = 1 - (time - self.fade_time) * self.fade_rate; + + if(self.cnt < time || self.alpha < 0.1) + { + if(self.alpha > 0.1) + { + sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM); + pointparticles(particleeffectnum("rocket_explode"), self.origin + '0 0 100', '0 0 0', 1); + } + remove(self); + } } void spiderbot_blowup() { + float i; sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM); - pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1); + + for(i = 0; i < 5; ++i) + { + pointparticles(particleeffectnum("rocket_explode"), self.origin + (randomvec() * 100) + '0 0 100', '0 0 0', 1); + } + + entity h, g1, g2, b; + b = spawn(); + h = spawn(); + g1 = spawn(); + g2 = spawn(); + + setmodel(b, "models/vehicles/spiderbot.dpm"); + setmodel(h, "models/vehicles/spiderbot_top.dpm"); + setmodel(g1, "models/vehicles/spiderbot_barrels.dpm"); + setmodel(g2, "models/vehicles/spiderbot_barrels.dpm"); + + setorigin(b, self.origin); + setorigin(h, gettaginfo(self, gettagindex(self, "tag_head"))); + h.movetype = MOVETYPE_BOUNCE; + h.solid = SOLID_BBOX; + h.velocity = v_up * (500 + random() * 500) + randomvec() * 128; + h.modelflags = MF_ROCKET; + h.effects = EF_FLAME | EF_LOWPRECISION; + h.avelocity = randomvec() * 360; + + h.alpha = 1; + h.cnt = time + (3.5 * random()); + h.fade_rate = 1 / min(autocvar_g_vehicle_spiderbot_respawntime, 10); + h.fade_time = time; + h.think = spiderbot_headfade; + h.nextthink = time; + + setorigin(g1, gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_hardpoint01"))); + g1.movetype = MOVETYPE_TOSS; + g1.solid = SOLID_CORPSE; + g1.velocity = v_forward * 700 + (randomvec() * 32); + g1.avelocity = randomvec() * 180; + + setorigin(g2, gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_hardpoint02"))); + g2.movetype = MOVETYPE_TOSS; + g2.solid = SOLID_CORPSE; + g2.velocity = v_forward * 700 + (randomvec() * 32); + g2.avelocity = randomvec() * 180; + b.frame = 5; + + h.colormod = b.colormod = g1.colormod = g2.colormod = '-2 -2 -2'; + + SUB_SetFade(b, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10)); + //SUB_SetFade(h, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10)); + SUB_SetFade(g1, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10)); + SUB_SetFade(g2, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10)); RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_SBBLOWUP, world); @@ -665,87 +708,61 @@ void spiderbot_blowup() self.nextthink = time + autocvar_g_vehicle_spiderbot_respawntime; self.think = spiderbot_spawn; self.movetype = MOVETYPE_NONE; + self.deadflag = DEAD_DEAD; + self.solid = SOLID_NOT; + self.tur_head.effects &~= EF_FLAME; + self.vehicle_hudmodel.viewmodelforclient = self; - setorigin(self, self.tur_aimpos); + //setorigin(self, self.tur_aimpos); } void spiderbot_die() { - - self.health = 0; - self.event_damage = SUB_Null; - self.iscreature = FALSE; - self.solid = SOLID_NOT; - self.takedamage = DAMAGE_NO; - self.touch = SUB_Null; - self.nextthink = time + random() * 2; - self.think = spiderbot_blowup; - self.deadflag = DEAD_DEAD; - self.vehicle_hudmodel.viewmodelforclient = self; - self.frame = 0; - self.tur_head.frame = 1; + sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM); + pointparticles(particleeffectnum("rocket_explode"), self.origin + '0 0 100', '0 0 0', 1); + + self.health = 0; + self.event_damage = SUB_Null; + self.takedamage = DAMAGE_NO; + self.touch = SUB_Null; + self.nextthink = 1 + time + random() * 2; + self.think = spiderbot_blowup; + self.deadflag = DEAD_DYING; + self.frame = 5; + self.tur_head.effects |= EF_FLAME; + self.colormod = self.tur_head.colormod = '-1 -1 -1'; } void vewhicle_spiderbot_dinit() { + if not (vehicle_initialize( + "Spiderbot", + "models/vehicles/spiderbot.dpm", + "models/vehicles/spiderbot_top.dpm", + "models/vehicles/spiderbot_cockpit.dpm", + "tag_head", "tag_hud", "", + HUD_SPIDERBOT, + spiderbot_MIN, spiderbot_MAX, + FALSE, + spiderbot_spawn, spiderbot_frame, + spiderbot_enter, spiderbot_exit, + spiderbot_die, spiderbot_think)) + { + remove(self); + return; + } - self.spiderbot_spawnpnt = spawn(); - self.spiderbot_spawnpnt.angles = self.angles; - - setorigin(self,self.origin); - tracebox(self.origin + '0 0 100', spiderbot_MIN, spiderbot_MAX, self.origin - '0 0 10000', MOVE_WORLDONLY, self); - setorigin(self.spiderbot_spawnpnt,trace_endpos); - - if(self.team && !teams_matter) - self.team = 0; - else - self.spiderbot_spawnpnt.team = self.team; - - addstat(STAT_HUD, AS_INT, hud); - addstat(STAT_VEHICLESTAT_HEALTH, AS_FLOAT, vehicle_health); - addstat(STAT_VEHICLESTAT_SHIELD, AS_FLOAT, vehicle_shield); - addstat(STAT_VEHICLESTAT_ENERGY, AS_FLOAT, vehicle_energy); - addstat(STAT_VEHICLESTAT_AMMO1, AS_INT, vehicle_ammo1); - addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1); - addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2); - addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2); - - if (self.netname == "") - self.netname = "spiderbot"; - - self.tur_head = spawn(); self.gun1 = spawn(); self.gun2 = spawn(); - self.vehicle_viewport = spawn(); - self.vehicle_hudmodel = spawn(); - self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN | VHF_HEALTHREGEN | VHF_DEATHEJECT; - self.cvar_basename = "g_vehicle_spiderbot"; - self.gravity = 2; - setmodel(self, "models/vehicles/spiderbot.dpm"); - setmodel(self.tur_head, "models/vehicles/spiderbot_top.dpm"); setmodel(self.gun1, "models/vehicles/spiderbot_barrels.dpm"); setmodel(self.gun2, "models/vehicles/spiderbot_barrels.dpm"); - setmodel(self.vehicle_hudmodel, "models/vehicles/spiderbot_cockpit.dpm"); - setmodel(self.vehicle_viewport, "null"); - - setattachment(self.tur_head, self, "tag_head"); - setattachment(self.vehicle_hudmodel, self.tur_head, "tag_hud"); - setattachment(self.vehicle_viewport, self.vehicle_hudmodel, ""); setattachment(self.gun1, self.tur_head, "tag_hardpoint01"); setattachment(self.gun2, self.tur_head, "tag_hardpoint02"); - self.tur_head.owner = self; - self.customizeentityforclient = spiderbot_customizeentityforclient; - - self.tur_aimpos = self.origin; - - spiderbot_spawn(); - - self.vehicle_die = spiderbot_die; - self.vehicle_exit = spiderbot_exit; + self.gravity = 2; } void spawnfunc_vehicle_spiderbot() @@ -758,8 +775,19 @@ void spawnfunc_vehicle_spiderbot() precache_model ( "models/uziflash.md3"); precache_sound ( "weapons/rocket_impact.wav" ); + precache_sound ( "weapons/uzi_fire.wav" ); + precache_sound ( "weapons/rocket_impact.wav" ); + + vehicles_configcheck("vehicle_spiderbot.cfg", autocvar_g_vehicle_spiderbot_health); + if(autocvar_g_vehicle_spiderbot_shield) + self.vehicle_flags |= VHF_HASSHIELD; + + if(autocvar_g_vehicle_spiderbot_shield_regen) + self.vehicle_flags |= VHF_SHIELDREGEN; + + if(autocvar_g_vehicle_spiderbot_health_regen) + self.vehicle_flags |= VHF_HEALTHREGEN; - //self.team = -1; self.think = vewhicle_spiderbot_dinit; self.nextthink = time + 0.5; } diff --git a/qcsrc/server/vehicles/vehicles.qc b/qcsrc/server/vehicles/vehicles.qc index 7cc2949f6..ef825fe55 100644 --- a/qcsrc/server/vehicles/vehicles.qc +++ b/qcsrc/server/vehicles/vehicles.qc @@ -1,53 +1,256 @@ -void vehicle_stdproc_enter() +void vehicles_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force); +void vehicles_return(); +void vehicles_clearrturn(); + +.entity AuxiliaryXhair; +float AuxiliaryXhair_customizeentityforclient() +{ + if(other == self.owner) + return TRUE; + + return FALSE; +} +float AuxiliaryXhair_SendEntity(entity to, float sf) { + WriteByte(MSG_ENTITY, ENT_CLIENT_AUXILIARYXHAIR); + WriteCoord(MSG_ENTITY, self.origin_x); + WriteCoord(MSG_ENTITY, self.origin_y); + WriteCoord(MSG_ENTITY, self.origin_z); + return TRUE; +} + +void SpawnOrUpdateAuxiliaryXhair(entity own, vector loc) +{ + + if(own.AuxiliaryXhair == world || wasfreed(own.AuxiliaryXhair)) + { + own.AuxiliaryXhair = spawn(); + own.AuxiliaryXhair.owner = own; + //own.AuxiliaryXhair.customizeentityforclient = AuxiliaryXhair_customizeentityforclient; + own.AuxiliaryXhair.drawonlytoclient = own; + setorigin(own.AuxiliaryXhair, loc); + Net_LinkEntity(own.AuxiliaryXhair, FALSE, 0, AuxiliaryXhair_SendEntity); + return; + } + + setorigin(own.AuxiliaryXhair, loc); + own.AuxiliaryXhair.SendFlags |= 0x01; +} + +void Release_AuxiliaryXhair(entity from) +{ + + from.AuxiliaryXhair.drawonlytoclient = from.AuxiliaryXhair; + from.AuxiliaryXhair = world; + + //if not (from.AuxiliaryXhair == world || wasfreed(from.AuxiliaryXhair)) + remove(from.AuxiliaryXhair); } -void vehicle_stdproc_exit(float eject) +#define VEHICLE_UPDATE_PLAYER(fld,vhname) \ +self.owner.vehicle_##fld = self.vehicle_##fld / autocvar_g_vehicle_##vhname##_##fld + +#define vehicles_sweap_collision(orig,vel,dt,acm,mult) \ +traceline(orig, orig + vel * dt, MOVE_NORMAL, self); \ +if(trace_fraction != 1) \ + acm += normalize(self.origin - trace_endpos) * (vlen(vel) * mult) + +float force_fromtag_power; +float force_fromtag_normpower; +vector force_fromtag_origin; +vector vehicles_force_fromtag_hover(string tag_name, float spring_length, float max_power) { + force_fromtag_origin = gettaginfo(self, gettagindex(self, tag_name)); + v_forward = normalize(v_forward) * -1; + traceline(force_fromtag_origin, force_fromtag_origin - (v_forward * spring_length), MOVE_NORMAL, self); + + force_fromtag_power = (1 - trace_fraction) * max_power; + force_fromtag_normpower = force_fromtag_power / max_power; + + return v_forward * force_fromtag_power; } -void vehicle_stdproc_shiledregen(float rmax, float dt) +vector vehicles_force_fromtag_maglev(string tag_name, float spring_length, float max_power) { - if(self.vehicle_shield < rmax) - if(self.dmg_time + CCVAR("_shield_regen_dmgpause") < time) + + force_fromtag_origin = gettaginfo(self, gettagindex(self, tag_name)); + v_forward = normalize(v_forward) * -1; + traceline(force_fromtag_origin, force_fromtag_origin - (v_forward * spring_length), MOVE_NORMAL, self); + + if(trace_fraction == 1.0) { - self.vehicle_shield = min(self.vehicle_shield + CCVAR("_shield_regen") * dt, rmax); + force_fromtag_normpower = -0.25; + return '0 0 -200'; + } - if(self.owner) - self.owner.vehicle_shield = self.vehicle_shield / rmax; + force_fromtag_power = ((1 - trace_fraction) - trace_fraction) * max_power; + force_fromtag_normpower = force_fromtag_power / max_power; + + return v_forward * force_fromtag_power; +} + + +void vehicles_touch() +{ + if(other.classname != "player") + return; + + if(other.deadflag != DEAD_NO) + return; + + if(other.vehicle != world) + return; + + // Remove this when bots know how to use vehicles. + if (clienttype(other) != CLIENTTYPE_REAL) + return; + + self.vehicle_enter(); +} + +void vehicles_enter() +{ + // Remove this when bots know how to use vehicles + if (clienttype(other) != CLIENTTYPE_REAL) + return; + + self.colormod = self.tur_head.colormod = '0 0 0'; + + if(teams_matter) + if(self.team) + if(self.team != other.team) + return; + + self.owner = other; + self.switchweapon = other.switchweapon; + + self.vehicle_hudmodel.viewmodelforclient = self.owner; + self.event_damage = vehicles_damage; + self.nextthink = 0; + self.owner.angles = self.angles; + self.owner.takedamage = DAMAGE_NO; + self.owner.solid = SOLID_NOT; + self.owner.movetype = MOVETYPE_NOCLIP; + self.owner.alpha = -1; + self.owner.vehicle = self; + self.owner.event_damage = SUB_Null; + self.owner.view_ofs = '0 0 0'; + self.colormap = self.owner.colormap; + if(self.tur_head) + self.tur_head.colormap = self.owner.colormap; + + self.owner.hud = self.hud; + self.owner.PlayerPhysplug = self.PlayerPhysplug; + + self.owner.vehicle_ammo1 = self.vehicle_ammo1; + self.owner.vehicle_ammo2 = self.vehicle_ammo2; + self.owner.vehicle_reload1 = self.vehicle_reload1; + self.owner.vehicle_reload2 = self.vehicle_reload2; + + other.flags &~= FL_ONGROUND; + self.flags &~= FL_ONGROUND; + + self.team = self.owner.team; + self.flags -= FL_NOTARGET; + + msg_entity = other; + WriteByte (MSG_ONE, SVC_SETVIEWPORT); + WriteEntity(MSG_ONE, self.vehicle_viewport); + + WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES + if(self.tur_head) + { + WriteAngle(MSG_ONE, self.tur_head.angles_x + self.angles_x); // tilt + WriteAngle(MSG_ONE, self.tur_head.angles_y + self.angles_y); // yaw + WriteAngle(MSG_ONE, 0); // roll } + else + { + WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES + WriteAngle(MSG_ONE, self.angles_x * -1); // tilt + WriteAngle(MSG_ONE, self.angles_y); // yaw + WriteAngle(MSG_ONE, 0); // roll + } + + vehicles_clearrturn(); + + if(self.vehicle_enter) + self.vehicle_enter(); } -void vehicle_stdproc_healthregen(float rmax, float dt) +void vehicles_exit(float eject) { + self.colormap = 1024; + self.tur_head.colormap = 1024; - if(self.dmg_time + CCVAR("_health_regen_dmgpause") < time) - if(self.vehicle_health < rmax) + if (teams_matter) { - self.vehicle_health = min(self.vehicle_health + CCVAR("_health_regen") * dt, rmax); + if (self.team == COLOR_TEAM1) + self.colormod = '1.4 0.8 0.8'; - if(self.owner) - self.owner.vehicle_health = self.vehicle_health / rmax; + if (self.team == COLOR_TEAM2) + self.colormod = '0.8 0.8 1.4'; + + self.tur_head.colormod = self.colormod; + } + + + self.flags |= FL_NOTARGET; + + if (self.owner) + { + msg_entity = self.owner; + WriteByte (MSG_ONE, SVC_SETVIEWPORT); + WriteEntity( MSG_ONE, self.owner); + + WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES + WriteAngle(MSG_ONE, 0); // tilt + WriteAngle(MSG_ONE, self.angles_y); // yaw + WriteAngle(MSG_ONE, 0); // roll + + setsize(self.owner,PL_MIN,PL_MAX); + + self.owner.takedamage = DAMAGE_AIM; + self.owner.solid = SOLID_SLIDEBOX; + self.owner.movetype = MOVETYPE_WALK; + self.owner.effects &~= EF_NODRAW; + self.owner.alpha = 1; + self.owner.PlayerPhysplug = SUB_Null; + self.owner.vehicle = world; + self.owner.view_ofs = PL_VIEW_OFS; + self.owner.event_damage = PlayerDamage; + self.owner.hud = HUD_NORMAL; + self.owner.switchweapon = self.switchweapon; } + + self.vehicle_hudmodel.viewmodelforclient = self; + self.tur_head.nodrawtoclient = self; + + if(self.vehicle_exit) + self.vehicle_exit(eject); + + self.owner = world; } -void vehicle_stdproc_energyregen(float rmax, float dt) + +void vehicles_regen(.float timer, .float regen_field, float field_max, float rpause, float regen, float delta_time) { - if(self.vehicle_energy < rmax) + if(self.regen_field < field_max) + if(self.timer + rpause < time) { - self.vehicle_energy = min(self.vehicle_energy + CCVAR("_energy_regen") * dt, rmax); + self.regen_field = min(self.regen_field + regen * delta_time, field_max); if(self.owner) - self.owner.vehicle_energy = self.vehicle_energy / rmax; + self.owner.regen_field = self.regen_field / field_max; } } void shieldhit_think() { - self.alpha = self.alpha - 0.2; + self.alpha -= 0.1; if (self.alpha <= 0) { - setmodel(self,""); + setmodel(self, ""); self.alpha = -1; } else @@ -56,17 +259,14 @@ void shieldhit_think() } } -void vehicle_stdproc_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) +void vehicles_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) { - float ddmg_take; self.dmg_time = time; if((self.vehicle_flags & VHF_HASSHIELD) && (self.vehicle_shield > 0)) { - - if (wasfreed(self.tur_head.enemy) || self.tur_head.enemy == world) { self.tur_head.enemy = spawn(); @@ -76,45 +276,187 @@ void vehicle_stdproc_damage(entity inflictor, entity attacker, float damage, flo setmodel(self.tur_head.enemy, "models/vhshield.md3"); setattachment(self.tur_head.enemy, self, ""); - self.tur_head.enemy.colormod = '1 1 1'; - self.tur_head.enemy.alpha = 0.45; - self.tur_head.enemy.scale = (256 / vlen(self.maxs - self.mins)); - self.tur_head.enemy.angles = vectoangles(normalize(hitloc - self.origin)) - self.angles; - self.tur_head.enemy.think = shieldhit_think; - self.tur_head.enemy.nextthink = time; + self.tur_head.enemy.colormod = '1 1 1'; + self.tur_head.enemy.alpha = 0.45; + self.tur_head.enemy.scale = (256 / vlen(self.maxs - self.mins)); + self.tur_head.enemy.angles = vectoangles(normalize(hitloc - self.origin)) - self.angles; + self.tur_head.enemy.think = shieldhit_think; + self.tur_head.enemy.nextthink = time; self.vehicle_shield -= damage; if(self.vehicle_shield < 0) { self.tur_head.enemy.colormod = '10 0 -1'; ddmg_take = fabs(self.vehicle_shield); - self.vehicle_shield = 0; - self.tur_head.enemy.alpha = 0.75; - self.vehicle_health -= ddmg_take; + self.vehicle_shield = 0; + self.tur_head.enemy.alpha = 0.75; + self.vehicle_health -= ddmg_take; } } else self.vehicle_health -= damage; - if(self.owner) + if(self.vehicle_health <= 0) { - self.owner.vehicle_health = self.vehicle_health / CCVAR("_health"); + if(self.owner) + if(self.vehicle_flags & VHF_DEATHEJECT) + vehicles_exit(VHEF_EJECT); + else + vehicles_exit(VHEF_RELESE); + + self.vehicle_die(); + } +} - if(self.vehicle_flags & VHF_HASSHIELD) - self.owner.vehicle_shield = self.vehicle_shield / cvar(strcat(self.cvar_basename,"_shield")); +void vehicles_return() +{ + pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1); + self.enemy.think = self.use; + self.enemy.nextthink = time; + remove(self); +} +void vehicles_clearrturn() +{ + entity ret; + // Remove "return helper", if any. + ret = findchain(classname, "vehicle_return"); + while(ret) + { + if(ret.enemy == self) + { + ret.think = SUB_Remove; + ret.nextthink = time + 0.1; + return; + } + ret = ret.chain; } +} - if(self.vehicle_health <= 0) +void vehicles_setreturn(float retime, void() respawn_proc) +{ + vehicles_clearrturn(); + + if (self.deadflag == DEAD_NO) { - if(self.owner) - if(self.vehicle_flags & VHF_DEATHEJECT) - self.vehicle_exit(VHEF_EJECT); + entity ret; - self.vehicle_die(); + ret = spawn(); + ret.classname = "vehicle_return"; + ret.enemy = self; + ret.think = vehicles_return; + ret.nextthink = time + retime; + ret.use = respawn_proc; + } +} + +float vehicles_customizeentityforclient() +{ + if(self.deadflag == DEAD_DEAD) + return FALSE; + + return TRUE; +} + +void vehicles_configcheck(string configname, float check_cvar) +{ + if(check_cvar == 0) + localcmd(strcat("exec ", configname, "\n")); +} + +float vehicle_initialize(string net_name, + string bodymodel, + string topmodel, + string hudmodel, + string toptag, + string hudtag, + string viewtag, + float vhud, + vector min_s, + vector max_s, + float nodrop, + void() spawnproc, + float() physproc, + void() enterproc, + void(float extflag) exitfunc, + void() dieproc, + void() thinkproc ) +{ + addstat(STAT_HUD, AS_INT, hud); + addstat(STAT_VEHICLESTAT_HEALTH, AS_FLOAT, vehicle_health); + addstat(STAT_VEHICLESTAT_SHIELD, AS_FLOAT, vehicle_shield); + addstat(STAT_VEHICLESTAT_ENERGY, AS_FLOAT, vehicle_energy); + + addstat(STAT_VEHICLESTAT_AMMO1, AS_INT, vehicle_ammo1); + addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1); + + addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2); + addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2); + + if(bodymodel == "") + error("vehicles: missing bodymodel!"); + + if(hudmodel == "") + error("vehicles: missing hudmodel!"); + + if(net_name == "") + self.netname = self.classname; + else + self.netname = net_name; + + if(self.team && !teams_matter) + self.team = 0; + + setmodel(self, bodymodel); + + self.vehicle_viewport = spawn(); + self.vehicle_hudmodel = spawn(); + self.tur_head = spawn(); + self.tur_head.owner = self; + self.takedamage = DAMAGE_AIM; + self.bot_attack = TRUE; + self.iscreature = TRUE; + self.hud = vhud; + + self.customizeentityforclient = vehicles_customizeentityforclient; + self.vehicle_die = dieproc; + self.vehicle_exit = exitfunc; + self.vehicle_enter = enterproc; + self.PlayerPhysplug = physproc; + self.event_damage = vehicles_damage; + self.touch = vehicles_touch; + self.think = spawnproc; + self.nextthink = time; + + setmodel(self.vehicle_hudmodel, hudmodel); + setmodel(self.vehicle_viewport, "null"); + + if(topmodel != "") + { + setmodel(self.tur_head, topmodel); + setattachment(self.tur_head, self, toptag); + setattachment(self.vehicle_hudmodel, self.tur_head, hudtag); + setattachment(self.vehicle_viewport, self.vehicle_hudmodel, viewtag); + } + else + { + setattachment(self.tur_head, self, ""); + setattachment(self.vehicle_hudmodel, self, hudtag); + setattachment(self.vehicle_viewport, self.vehicle_hudmodel, viewtag); + } + + setsize(self, min_s, max_s); + if not (nodrop) + { + setorigin(self, self.origin); + tracebox(self.origin + '0 0 100', min_s, max_s, self.origin - '0 0 10000', MOVE_WORLDONLY, self); + setorigin(self, trace_endpos); } + self.pos1 = self.origin; + self.pos2 = self.angles; + return TRUE; } void bugmenot() diff --git a/qcsrc/server/vehicles/vehicles.qh b/qcsrc/server/vehicles/vehicles.qh index 8e452478e..4f17d4af7 100644 --- a/qcsrc/server/vehicles/vehicles.qh +++ b/qcsrc/server/vehicles/vehicles.qh @@ -1,13 +1,13 @@ -//#define VEHICLES_ENABLED +#define VEHICLES_ENABLED #ifdef VEHICLES_ENABLED #message "with tZork vehicles (experimental)" -float SVC_SETVIEWPORT = 5; // Net.Protocol 0x05 -float SVC_SETVIEWANGLES = 10; // Net.Protocol 0x0A -float SVC_UPDATEENTITY = 128; // Net.Protocol 0x80 +float SVC_SETVIEWPORT = 5; // Net.Protocol 0x05 +float SVC_SETVIEWANGLES = 10; // Net.Protocol 0x0A +float SVC_UPDATEENTITY = 128; // Net.Protocol 0x80 -#define CCVAR(part) cvar(strcat(self.cvar_basename,part)) +//#define CCVAR(part) cvar(strcat(self.cvar_basename,part)) //.string cvar_basename; .float vehicle_flags; @@ -22,7 +22,7 @@ float SVC_UPDATEENTITY = 128; // Net.Protocol 0x80 .entity gun1; .entity gun2; -.entity shield; +//.entity shield; .float vehicle_health; .float vehicle_shield; @@ -38,13 +38,11 @@ float SVC_UPDATEENTITY = 128; // Net.Protocol 0x80 .entity vehicle_viewport; .entity vehicle_hudmodel; -//.float anim_start; -//.float anim_end; - .float dmg_time; #define VHEF_NORMAL 0 -#define VHEF_EJECT 1 +#define VHEF_EJECT 1 +#define VHEF_RELESE 2 var .void(float exit_flags) vehicle_exit; var .void() vehicle_enter; @@ -54,8 +52,8 @@ var .void() vehicle_spawn; #include "vehicles.qc" -#include "spiderbot.qc" #include "racer.qc" +#include "spiderbot.qc" #include "raptor.qc" #endif diff --git a/qcsrc/server/w_common.qc b/qcsrc/server/w_common.qc index 2d9ecfd8b..c20b6aa4c 100644 --- a/qcsrc/server/w_common.qc +++ b/qcsrc/server/w_common.qc @@ -517,11 +517,10 @@ void fireBullet (vector start, vector dir, float spread, float damage, float for if ((trace_fraction != 1.0) && (pointcontents (trace_endpos) != CONTENT_SKY)) { - pointparticles(particleeffectnum("TE_KNIGHTSPIKE"),end,trace_plane_normal * 2500,1); if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)) Damage_DamageInfo(trace_endpos, damage, 0, 0, dir * max(1, force), dtype, self); + Damage (trace_ent, self, self, damage, dtype, trace_endpos, dir * force); - //void(float effectnum, vector org, vector vel, float howmany) pointparticles = #337; // same as in CSQC } trace_endpos = end; } diff --git a/vehicle_racer.cfg b/vehicle_racer.cfg index 1ab10cdae..a95aee34a 100644 --- a/vehicle_racer.cfg +++ b/vehicle_racer.cfg @@ -1,54 +1,49 @@ -set g_vehicle_racer_reload 1 - -set g_vehicle_racer_respawntime 10 -set g_vehicle_racer_health 250 - -set g_vehicle_racer_shield 100 -set g_vehicle_racer_shield_block 1 -set g_vehicle_racer_shield_regen 50 -set g_vehicle_racer_shield_regen_dmgpause 0.25 -set g_vehicle_racer_shield_regen_energyrate 2 - -set g_vehicle_racer_energy 150 -set g_vehicle_racer_energy_regen 50 -set g_vehicle_racer_energy_usepause 1 - -set g_vehicle_racer_speed_stop 2000 -set g_vehicle_racer_speed_forward 1600 -set g_vehicle_racer_speed_strafe 750 - -set g_vehicle_racer_speed_afterburn 3500 -set g_vehicle_racer_speed_afterburn_emin 25 -set g_vehicle_racer_speed_afterburn_cost 50 - -set g_vehicle_racer_power_min 0 -set g_vehicle_racer_power_air 0 -set g_vehicle_racer_power_solid 8000 - -set g_vehicle_racer_drag 0.25 -set g_vehicle_racer_dragexp 0.9 - -set g_vehicle_racer_downforce 0.01 - -set g_vehicle_racer_springlength 125 -set g_vehicle_racer_anglestabilizer 18 - -set g_vehicle_racer_turnspeed 180 -set g_vehicle_racer_pitchspeed 360 +set g_vehicle_racer_respawntime 60 + +set g_vehicle_racer_health 300 +set g_vehicle_racer_health_regen 0 +set g_vehicle_racer_health_regen_pause 0 + +set g_vehicle_racer_shield 80 +set g_vehicle_racer_shield_regen 25 +set g_vehicle_racer_shield_regen_pause 1 + +set g_vehicle_racer_energy 150 +set g_vehicle_racer_energy_regen 50 +set g_vehicle_racer_energy_regen 50 +set g_vehicle_racer_energy_regen_pause 1 + +set g_vehicle_racer_speed_stop 2000 +set g_vehicle_racer_speed_forward 1500 +set g_vehicle_racer_speed_strafe 1000 +set g_vehicle_racer_speed_afterburn 3500 +set g_vehicle_racer_afterburn_cost 50 // energy consumed per second + +set g_vehicle_racer_hovertype 0 // 0 = hover, != 0 = maglev +set g_vehicle_racer_hoverpower 3600 // NOTE!! x 4 (4 engines) +set g_vehicle_racer_upforcedamper 0.94 + +set g_vehicle_racer_downforce 0.01 +set g_vehicle_racer_springlength 40 +set g_vehicle_racer_collision_multiplier 0.55 +set g_vehicle_racer_anglestabilizer 18 + +set g_vehicle_racer_turnspeed 200 +set g_vehicle_racer_pitchspeed 100 set g_vehicle_racer_maxpitch 25 -set g_vehicle_racer_turnroll 0.3 +set g_vehicle_racer_turnroll 32 -set g_vehicle_racer_laser_speed 18000 +set g_vehicle_racer_laser_speed 9000 set g_vehicle_racer_laser_damage 20 set g_vehicle_racer_laser_radius 100 -set g_vehicle_racer_laser_refire 0.05 +set g_vehicle_racer_laser_refire 0.1 set g_vehicle_racer_laser_cost 2 set g_vehicle_racer_rocket_speed 1500 set g_vehicle_racer_rocket_accel 1500 -set g_vehicle_racer_rocket_turnrate 0.5 -set g_vehicle_racer_rocket_damage 200 +set g_vehicle_racer_rocket_turnrate 0.4 +set g_vehicle_racer_rocket_damage 120 set g_vehicle_racer_rocket_radius 100 -set g_vehicle_racer_rocket_refire 5 +set g_vehicle_racer_rocket_refire 3 set g_vehicle_racer_rocket_cost 0 diff --git a/vehicle_raptor.cfg b/vehicle_raptor.cfg index cbc3a1a69..eae7b5e7a 100644 --- a/vehicle_raptor.cfg +++ b/vehicle_raptor.cfg @@ -1,37 +1,49 @@ -set g_vehicle_raptor_reload 1 +set g_vehicle_raptor_respawntime 60 +// 0: go where player aims, +forward etc relative to aim angles +// 1: ignore aim for up/down movement. +forward always moved forward, +jump always moves up set g_vehicle_raptor_movestyle 1 -set g_vehicle_raptor_turnspeed 90 + set g_vehicle_raptor_turnroll 0.1 + +set g_vehicle_raptor_turnspeed 90 set g_vehicle_raptor_pitchspeed 45 +set g_vehicle_raptor_pitchlimit 30 + set g_vehicle_raptor_speed_forward 1500 set g_vehicle_raptor_speed_strafe 1500 set g_vehicle_raptor_speed_up 1250 set g_vehicle_raptor_speed_down 1400 -set g_vehicle_raptor_bomblet_waves 2 -set g_vehicle_raptor_bomblet_wavefirst 0.5 -set g_vehicle_raptor_bomblet_wavenext 0.3 -set g_vehicle_raptor_bomblet_wawespread 0.3 -set g_vehicle_raptor_bomblets 3 -set g_vehicle_raptor_bomblet_damage 90 -set g_vehicle_raptor_bomblet_edgedamage 40 -set g_vehicle_raptor_bomblet_radius 250 -set g_vehicle_raptor_bomblet_force 300 -set g_vehicle_raptor_bombs_refire 1 - -set g_vehicle_raptor_beam_dps 200 -set g_vehicle_raptor_beam_fops 150 -set g_vehicle_raptor_beam_aps 100 -set g_vehicle_raptor_beam_size 8 -set g_vehicle_raptor_beam_leangth 1 -set g_vehicle_raptor_beam_refire 2 - -set g_vehicle_raptor_shield 250 -set g_vehicle_raptor_shield_regen 50 - -set g_vehicle_raptor_health 250 -set g_vehicle_raptor_health_regen 10 - -set g_vehicle_raptor_energy 300 -set g_vehicle_raptor_energy_regen 50 \ No newline at end of file +set g_vehicle_raptor_bomblets 10 +set g_vehicle_raptor_bomblet_alt 500 +set g_vehicle_raptor_bomblet_time 0.5 +set g_vehicle_raptor_bomblet_spread 0.25 +set g_vehicle_raptor_bomblet_damage 40 +set g_vehicle_raptor_bomblet_edgedamage 20 +set g_vehicle_raptor_bomblet_radius 300 +set g_vehicle_raptor_bomblet_force 150 +set g_vehicle_raptor_bombs_refire 5 + +set g_vehicle_raptor_guns_turnspeed 32 +set g_vehicle_raptor_guns_turnlimit 10 +set g_vehicle_raptor_guns_pitchlimit 8 + +set g_vehicle_raptor_cannon_cost 1 +set g_vehicle_raptor_cannon_damage 10 +set g_vehicle_raptor_cannon_radius 25 +set g_vehicle_raptor_cannon_refire 0.1 +set g_vehicle_raptor_cannon_speed 9000 +set g_vehicle_raptor_cannon_spread 0.05 + +set g_vehicle_raptor_energy 200 +set g_vehicle_raptor_energy_regen 50 +set g_vehicle_raptor_energy_regen_pause 1 + +set g_vehicle_raptor_health 250 +set g_vehicle_raptor_health_regen 0 +set g_vehicle_raptor_health_regen_pause 0 + +set g_vehicle_raptor_shield 250 +set g_vehicle_raptor_shield_regen 50 +set g_vehicle_raptor_shield_regen_pause 1.5 diff --git a/vehicle_spiderbot.cfg b/vehicle_spiderbot.cfg index d25ce205b..9fca2f27a 100644 --- a/vehicle_spiderbot.cfg +++ b/vehicle_spiderbot.cfg @@ -1,18 +1,25 @@ +set g_vehicle_spiderbot_isloaded 1 + set g_vehicle_spiderbot_respawntime 30 + set g_vehicle_spiderbot_health 875 set g_vehicle_spiderbot_health_regen 10 -set g_vehicle_spiderbot_health_regen_dmgpause 10 +set g_vehicle_spiderbot_health_regen_pause 10 set g_vehicle_spiderbot_shield 125 set g_vehicle_spiderbot_shield_block 1 set g_vehicle_spiderbot_shield_regen 25 -set g_vehicle_spiderbot_shield_regen_dmgpause 0.25 +set g_vehicle_spiderbot_shield_regen_pause 0.25 + +set g_vehicle_spiderbot_energy 0 +set g_vehicle_spiderbot_energy_regen 0 +set g_vehicle_spiderbot_energy_regen_pause 0 set g_vehicle_spiderbot_turnspeed 90 set g_vehicle_spiderbot_head_turnspeed 120 set g_vehicle_spiderbot_head_turnlimit 120 set g_vehicle_spiderbot_head_pitchspeed 60 -set g_vehicle_spiderbot_head_pitchlimit_up 8 +set g_vehicle_spiderbot_head_pitchlimit_up 16 set g_vehicle_spiderbot_head_pitchlimit_down -24 set g_vehicle_spiderbot_speed_stop 50 @@ -28,6 +35,10 @@ set g_vehicle_spiderbot_minigun_refire 0.05 set g_vehicle_spiderbot_minigun_heat 10 set g_vehicle_spiderbot_minigun_cooldown 10 +set g_vehicle_spiderbot_springlength 150 +set g_vehicle_spiderbot_springup 5 +set g_vehicle_spiderbot_springblend 0.15 + set g_vehicle_spiderbot_rocket_health 100 set g_vehicle_spiderbot_rocket_damage 75 set g_vehicle_spiderbot_rocket_edgedamage 15 diff --git a/vehicles.cfg b/vehicles.cfg new file mode 100644 index 000000000..501c60ba8 --- /dev/null +++ b/vehicles.cfg @@ -0,0 +1,7 @@ +set g_vehicles 1 + +exec vehicle_racer.cfg +exec vehicle_raptor.cfg +exec vehicle_spiderbot.cfg + + -- 2.39.2