From 86d591685961950416c58087d6d2b3f4f07a5b5d Mon Sep 17 00:00:00 2001 From: Jakob MG Date: Mon, 21 Mar 2011 02:44:02 +0100 Subject: [PATCH] New cvar g_vehicle_raptor_cannon_locktarget, if 1 lets the raptors cannon lock onto and track a target if its udner the crosshaor for long enougth. New cvar g_vehicle_raptor_cannon_predicttarget, if above cvar and this one is 1, cannons also predicts target movement. --- gfx/vehicles/sbot-xhair2.tga | Bin 16428 -> 16428 bytes qcsrc/client/vehicles/vehicles.qc | 15 ++++- qcsrc/server/vehicles/raptor.qc | 104 +++++++++++++++++++++++++++-- qcsrc/server/vehicles/spiderbot.qc | 2 +- qcsrc/server/vehicles/vehicles.qc | 13 ++-- vehicle_raptor.cfg | 4 +- 6 files changed, 123 insertions(+), 15 deletions(-) diff --git a/gfx/vehicles/sbot-xhair2.tga b/gfx/vehicles/sbot-xhair2.tga index a66866cbaf87bb5fba2b9b684d52a146e7143b7b..bb3ade5884201cd3656e2cf96f733a20fe65c497 100644 GIT binary patch literal 16428 zcmeI3KTI4~5XMiDNE~DNilD@fQA~maDX>Lh%a;nfa0J5GQvRSQP8uY-xIoy2Yup&5 zP}3k8gUd7skW?tzH(kB}<`Dh&*8@sfTc=*>pOht;e`5y-c20jdhLUes3I)4z|zxr$ow%eg>y7ZvmvcJE--&j~!xHmXB zc+S-~L>s!Xfh`LM^Ap0B*5RA?ot>R$Q&Ur4=ssE9V+)&}F$lU2e82aVm6b*tn@#l^+@<#PE}Aadjuvj0-$#7fk}rBY z*foEjAJ`%MkF0rn3)lZyJ^#M-Z|r{;t??>)d)obv{JS2nHh=$BG#}sl&+vcl7JZ&A zd};lkPWOM`!t>Ana>%~(59`P{|6aA$SW(-XIsd|injO7obW;4oh<{bvF#h#Q&tsDK z7i+-f2NF}{Svy?BYBhJC->W$p@$ctt68}C&4Tk2QCjQ;#`Hy>=JNIzX^X$7f@?VWk z$bT^|p8V%C$u;I)@8Fv&o`ueTqBAD{ePVSFV0-iWFaN#ZTKCQ7ztNwd{vmZ;+ncyU ze2=MrsJBx80KS6PznrmZKUfQ)>LL@=KjmHz!SCIw`G9+<`lo1(#?-%U1PFGz6Hlr(R z?$KEI_JasZp!(-4oIR;Oi1b>Yp?~iYSL>7af>j%+F_MQRk4ijB;)xaFlB)i_OdGLA zkx5(sUJJF)TU@PndAFXnd?Y;vS=?hA3>Ln;+QnDy$p3%Q<4cVh=S)}ppw;;ook!?S zQ^%(9<#|u6g?bxTJTd85&=(y^<2HHnOJj?eE3tL*3*;ZjGf5uG_5Y9S$RJBBI*pC4 hYW4Qp15=S(sy4@+`4(W^e-!M-<$vd 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 vid_conwidth || loc_y > vid_conheight) + { + loc_z = 0; + psize_z = 0; + drawpic(loc, SPIDER_CROSS2, psize, self.colormod, 1, DRAWFLAG_ADDITIVE); + } if(time - self.cnt > 0.1) remove(self); @@ -63,6 +66,11 @@ void Ent_AuxiliaryXhair(float isNew) AuxiliaryXhair.origin_x = ReadCoord(); AuxiliaryXhair.origin_y = ReadCoord(); AuxiliaryXhair.origin_z = ReadCoord(); + + AuxiliaryXhair.colormod_x = ReadByte() / 255; + AuxiliaryXhair.colormod_y = ReadByte() / 255; + AuxiliaryXhair.colormod_z = ReadByte() / 255; + AuxiliaryXhair.drawmask = MASK_NORMAL; AuxiliaryXhair.cnt = time; @@ -188,6 +196,7 @@ void CSQC_RAPTOR_HUD() float movedt; vector where; + if(!dropmark) { dropmark = spawn(); diff --git a/qcsrc/server/vehicles/raptor.qc b/qcsrc/server/vehicles/raptor.qc index 0e215561c..325e10aae 100644 --- a/qcsrc/server/vehicles/raptor.qc +++ b/qcsrc/server/vehicles/raptor.qc @@ -28,6 +28,8 @@ float autocvar_g_vehicle_raptor_guns_turnlimit; float autocvar_g_vehicle_raptor_guns_pitchlimit_up; float autocvar_g_vehicle_raptor_guns_pitchlimit_down; +float autocvar_g_vehicle_raptor_cannon_locktarget; +float autocvar_g_vehicle_raptor_cannon_predicttarget; float autocvar_g_vehicle_raptor_cannon_cost; float autocvar_g_vehicle_raptor_cannon_damage; float autocvar_g_vehicle_raptor_cannon_radius; @@ -374,10 +376,82 @@ float raptor_frame() // Aim the gunz crosshair_trace(player); + vector vf, ad; + if(autocvar_g_vehicle_raptor_cannon_locktarget) + { + if(trace_ent) + { + if(raptor.gun2.enemy != world) + { + if(raptor.gun2.enemy == trace_ent) + raptor.gun2.cnt += 1; + else + raptor.gun2.cnt -= 1; + } + + raptor.gun2.enemy = trace_ent; + + if(raptor.gun2.cnt < 0) + { + raptor.gun2.enemy = world; + raptor.gun2.cnt = 0; + } + + if(raptor.gun2.cnt > 50) + { + raptor.gun2.enemy = world; + raptor.gun2.cnt = 0; + + raptor.gun1.enemy = trace_ent; + raptor.gun1.cnt = time + 1; + } + + // Allready have a lock? + if(raptor.gun1.enemy != world) + { + // Add 0.5 secs of tracking for each trace hit + if(trace_ent == raptor.gun1.enemy) + raptor.gun1.cnt = min(raptor.gun1.cnt + 0.25, time + 5); + + if(raptor.gun1.cnt < time) + raptor.gun1.enemy = world; + } + } + else + raptor.gun2.cnt = max(raptor.gun2.cnt - 1, 0); + + if(raptor.gun1.cnt - time < 0) + raptor.gun1.enemy = world; + + if(autocvar_g_vehicle_raptor_cannon_predicttarget) + { + vector o; + if(raptor.gun1.enemy != world) + { + float i, distance, impact_time; + + vf = real_origin(raptor.gun1.enemy); + ad = vf; + o = raptor.origin; + for(i = 0; i < 4; ++i) + { + + distance = vlen(ad - o); + impact_time = distance / autocvar_g_vehicle_raptor_cannon_speed; + ad = vf + raptor.gun1.enemy.velocity * impact_time; + o = raptor.origin + raptor.velocity * impact_time; + } + trace_endpos = ad; + + } + } + else + trace_endpos = real_origin(raptor.gun1.enemy); + } + ftmp2 = autocvar_g_vehicle_raptor_guns_turnspeed * frametime; ftmp = -ftmp2; - vector vf, ad; // Gun1 df = gettaginfo(raptor.gun1, gettagindex(raptor.gun1, "fire1")); ad += df; @@ -405,11 +479,31 @@ float raptor_frame() raptor.gun2.angles_y = bound(-autocvar_g_vehicle_raptor_guns_turnlimit, df_y + raptor.gun2.angles_y, autocvar_g_vehicle_raptor_guns_turnlimit); - ad = ad * 0.5; - v_forward = vf * 0.5; - traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, raptor); - SpawnOrUpdateAuxiliaryXhair(player, trace_endpos); + if(autocvar_g_vehicle_raptor_cannon_locktarget) + { + if(raptor.gun1.enemy) + { + SpawnOrUpdateAuxiliaryXhair(player, trace_endpos, '1 0 0'); + } + else + { + ad = ad * 0.5; + v_forward = vf * 0.5; + traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, raptor); + + if(raptor.gun2.enemy != world) + { + ftmp = raptor.gun2.cnt / 50; + SpawnOrUpdateAuxiliaryXhair(player, trace_endpos, '1 0 0' * ftmp + '1 1 1' * (1 - ftmp)); + } + else + SpawnOrUpdateAuxiliaryXhair(player, trace_endpos, '1 1 1'); + + } + } + else + SpawnOrUpdateAuxiliaryXhair(player, trace_endpos, '1 1 1'); if(player.BUTTON_ATCK) if(raptor.attack_finished_single <= time) diff --git a/qcsrc/server/vehicles/spiderbot.qc b/qcsrc/server/vehicles/spiderbot.qc index a160c5c04..b8f8279b1 100644 --- a/qcsrc/server/vehicles/spiderbot.qc +++ b/qcsrc/server/vehicles/spiderbot.qc @@ -475,7 +475,7 @@ float spiderbot_frame() v_forward = vf * 0.5; traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, spider); - SpawnOrUpdateAuxiliaryXhair(player, trace_endpos); + SpawnOrUpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload1) + ('0 1 0' * (1 - player.vehicle_reload1))); self = player; return 1; diff --git a/qcsrc/server/vehicles/vehicles.qc b/qcsrc/server/vehicles/vehicles.qc index 008e8a0ff..0e73e9fea 100644 --- a/qcsrc/server/vehicles/vehicles.qc +++ b/qcsrc/server/vehicles/vehicles.qc @@ -16,23 +16,26 @@ float AuxiliaryXhair_SendEntity(entity to, float sf) WriteCoord(MSG_ENTITY, self.origin_x); WriteCoord(MSG_ENTITY, self.origin_y); WriteCoord(MSG_ENTITY, self.origin_z); + + WriteByte(MSG_ENTITY, rint(self.colormod_x * 255)); + WriteByte(MSG_ENTITY, rint(self.colormod_y * 255)); + WriteByte(MSG_ENTITY, rint(self.colormod_z * 255)); + return TRUE; } -void SpawnOrUpdateAuxiliaryXhair(entity own, vector loc) +void SpawnOrUpdateAuxiliaryXhair(entity own, vector loc, vector clr) { 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; } + own.AuxiliaryXhair.colormod = clr; setorigin(own.AuxiliaryXhair, loc); own.AuxiliaryXhair.SendFlags |= 0x01; } @@ -40,7 +43,7 @@ void SpawnOrUpdateAuxiliaryXhair(entity own, vector loc) void Release_AuxiliaryXhair(entity from) { // from.AuxiliaryXhair.drawonlytoclient = from.AuxiliaryXhair; - if not (from.AuxiliaryXhair == world || wasfreed(from.AuxiliaryXhair)) + if (from.AuxiliaryXhair != world && !wasfreed(from.AuxiliaryXhair)) remove(from.AuxiliaryXhair); from.AuxiliaryXhair = world; diff --git a/vehicle_raptor.cfg b/vehicle_raptor.cfg index 9def388d5..1c4ccdc59 100644 --- a/vehicle_raptor.cfg +++ b/vehicle_raptor.cfg @@ -30,7 +30,9 @@ set g_vehicle_raptor_guns_turnlimit 10 set g_vehicle_raptor_guns_pitchlimit_up 8 set g_vehicle_raptor_guns_pitchlimit_down 32 -set g_vehicle_raptor_cannon_cost 1 +set g_vehicle_raptor_cannon_locktarget 1 +set g_vehicle_raptor_cannon_predicttarget 1 +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 -- 2.39.2