X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fturrets%2Futil.qc;h=6857ccad8dd8bc603637ff112e6e0e0cfc95d443;hp=17f42c8115edacd9b24b028c9a1a07ee578bb440;hb=da8276158beee12c65ce09e16c4b98c11e754acf;hpb=7bcb3a89b3271e018da4d92437dc5ba125ea8698 diff --git a/qcsrc/common/turrets/util.qc b/qcsrc/common/turrets/util.qc index 17f42c8115..6857ccad8d 100644 --- a/qcsrc/common/turrets/util.qc +++ b/qcsrc/common/turrets/util.qc @@ -1,17 +1,21 @@ +#include "util.qh" + +#ifdef SVQC + /* -* Update self.tur_shotorg by getting up2date bone info +* Update this.tur_shotorg by getting up2date bone info * NOTICE this func overwrites the global v_forward, v_right and v_up vectors. */ -float turret_tag_fire_update() -{SELFPARAM(); - if(!self.tur_head) +float turret_tag_fire_update(entity this) +{ + if(!this.tur_head) { - error("Call to turret_tag_fire_update with self.tur_head missing!\n"); - self.tur_shotorg = '0 0 0'; + LOG_DEBUG("Call to turret_tag_fire_update with this.tur_head missing!"); + this.tur_shotorg = '0 0 0'; return false; } - self.tur_shotorg = gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_fire")); + this.tur_shotorg = gettaginfo(this.tur_head, gettagindex(this.tur_head, "tag_fire")); v_forward = normalize(v_forward); return true; @@ -20,103 +24,119 @@ float turret_tag_fire_update() /* * Railgun-like beam, but has thickness and suppots slowing of target */ -void FireImoBeam (vector start, vector end, vector smin, vector smax, +void FireImoBeam(entity this, vector start, vector end, vector smin, vector smax, float bforce, float f_dmg, float f_velfactor, int deathtype) -{SELFPARAM(); - vector hitloc, force, endpoint, dir; - entity ent; - - dir = normalize(end - start); - force = dir * bforce; +{ + vector dir = normalize(end - start); + vector force = dir * bforce; // go a little bit into the wall because we need to hit this wall later end = end + dir; // 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 + entity o = this; while (1) { - tracebox(start, smin, smax, end, false, self); - - // if it is world we can't hurt it so stop now - if (trace_ent == world || trace_fraction == 1) - break; + if(CS(this).antilag_debug) + WarpZone_tracebox_antilag (this, start, smin, smax, end, false, o, CS(this).antilag_debug); + else + WarpZone_tracebox_antilag (this, start, smin, smax, end, false, o, ANTILAG_LATENCY(this)); + if(o && WarpZone_trace_firstzone) + { + o = NULL; + continue; + } - if (trace_ent.solid == SOLID_BSP) + // if it is NULL we can't hurt it so stop now + if (trace_ent == NULL || trace_fraction == 1) break; // make the entity non-solid so we can hit the next one + IL_PUSH(g_railgunhit, trace_ent); trace_ent.railgunhit = true; trace_ent.railgunhitloc = end; trace_ent.railgunhitsolidbackup = trace_ent.solid; + trace_ent.railgundistance = vlen(WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos) - start); + trace_ent.railgunforce = WarpZone_TransformVelocity(WarpZone_trace_transform, force); // stop if this is a wall + if (trace_ent.solid == SOLID_BSP) + break; // make the entity non-solid trace_ent.solid = SOLID_NOT; } - endpoint = trace_endpos; + vector endpoint = trace_endpos; + entity endent = trace_ent; + float endq3surfaceflags = trace_dphitq3surfaceflags; // find all the entities the railgun hit and restore their solid state - ent = findfloat(world, railgunhit, true); - while (ent) + IL_EACH(g_railgunhit, it.railgunhit, { - // restore their solid type - ent.solid = ent.railgunhitsolidbackup; - ent = findfloat(ent, railgunhit, true); - } + it.solid = it.railgunhitsolidbackup; + }); + + /* + Unlike the railgun, this does NOT check for targets close by + */ // find all the entities the railgun hit and hurt them - ent = findfloat(world, railgunhit, true); - while (ent) + IL_EACH(g_railgunhit, it.railgunhit, { - // get the details we need to call the damage function - hitloc = ent.railgunhitloc; - ent.railgunhitloc = '0 0 0'; - ent.railgunhitsolidbackup = SOLID_NOT; - ent.railgunhit = false; + // removal from the list is handled below + /* no falloff applied */ // apply the damage - if (ent.takedamage) + if (it.takedamage) { - Damage (ent, self, self, f_dmg, deathtype, hitloc, force); - ent.velocity = ent.velocity * f_velfactor; - //ent.alpha = 0.25 + random() * 0.75; + Damage(it, this, this, f_dmg, deathtype, DMG_NOWEP, it.railgunhitloc, it.railgunforce); + // slow down the target + it.velocity = it.velocity * f_velfactor; } - // advance to the next entity - ent = findfloat(ent, railgunhit, true); - } + it.railgunhitloc = '0 0 0'; + it.railgunhitsolidbackup = SOLID_NOT; + it.railgunhit = false; + it.railgundistance = 0; + }); + + IL_CLEAR(g_railgunhit); + + /* no accuracy, as a weapon entity is not attached */ + trace_endpos = endpoint; + trace_ent = endent; + trace_dphitq3surfaceflags = endq3surfaceflags; } #ifdef TURRET_DEBUG -void marker_think() -{SELFPARAM(); - if(self.cnt) - if(self.cnt < time) +void marker_think(entity this) +{ + if(this.cnt) + if(this.cnt < time) { - self.think = SUB_Remove; - self.nextthink = time; + setthink(this, SUB_Remove); + this.nextthink = time; return; } - self.frame += 1; - if(self.frame > 29) - self.frame = 0; + this.frame += 1; + if(this.frame > 29) + this.frame = 0; - self.nextthink = time; + this.nextthink = time; } void mark_error(vector where,float lifetime) { entity err = new(error_marker); setmodel(err, MDL_MARKER); - setorigin(err,where); - err.movetype = MOVETYPE_NONE; - err.think = marker_think; + setorigin(err, where); + set_movetype(err, MOVETYPE_NONE); + setthink(err, marker_think); err.nextthink = time; err.skin = 0; if(lifetime) @@ -125,11 +145,11 @@ void mark_error(vector where,float lifetime) void mark_info(vector where,float lifetime) { - entity err = spawn(info_marker); + entity err = new(info_marker); setmodel(err, MDL_MARKER); - setorigin(err,where); - err.movetype = MOVETYPE_NONE; - err.think = marker_think; + setorigin(err, where); + set_movetype(err, MOVETYPE_NONE); + setthink(err, marker_think); err.nextthink = time; err.skin = 1; if(lifetime) @@ -138,11 +158,11 @@ void mark_info(vector where,float lifetime) entity mark_misc(vector where,float lifetime) { - entity err = spawn(mark_misc); + entity err = new(mark_misc); setmodel(err, MDL_MARKER); - setorigin(err,where); - err.movetype = MOVETYPE_NONE; - err.think = marker_think; + setorigin(err, where); + set_movetype(err, MOVETYPE_NONE); + setthink(err, marker_think); err.nextthink = time; err.skin = 3; if(lifetime) @@ -165,9 +185,9 @@ void paint_target(entity onwho, float f_size, vector v_color, float f_time) e.scale = (f_size/512); //setsize(e, '0 0 0', '0 0 0'); //setattachment(e,onwho,""); - setorigin(e,onwho.origin + '0 0 1'); + setorigin(e, onwho.origin + '0 0 1'); e.alpha = 0.15; - e.movetype = MOVETYPE_FLY; + set_movetype(e, MOVETYPE_FLY); e.velocity = (v_color * 32); // + '0 0 1' * 64; @@ -184,9 +204,9 @@ void paint_target2(entity onwho, float f_size, vector v_color, float f_time) e.scale = (f_size/512); setsize(e, '0 0 0', '0 0 0'); - setorigin(e,onwho.origin + '0 0 1'); + setorigin(e, onwho.origin + '0 0 1'); e.alpha = 0.15; - e.movetype = MOVETYPE_FLY; + set_movetype(e, MOVETYPE_FLY); e.velocity = (v_color * 32); // + '0 0 1' * 64; e.avelocity_x = -128; @@ -202,10 +222,12 @@ void paint_target3(vector where, float f_size, vector v_color, float f_time) setmodel(e, MDL_TUR_C512); // precision set above e.scale = (f_size/512); setsize(e, '0 0 0', '0 0 0'); - setorigin(e,where+ '0 0 1'); - e.movetype = MOVETYPE_NONE; + setorigin(e, where + '0 0 1'); + set_movetype(e, MOVETYPE_NONE); e.velocity = '0 0 0'; e.colormod = v_color; SUB_SetFade(e,time,f_time); } #endif + +#endif