X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fw_common.qc;h=2d9ecfd8b31085d0fb0ea2eb2d4294d56d3826a0;hb=ce739edbbc63e396bcdaccad69a8b29d1a5b7c26;hp=2dd97c831df1f86c613cdb90bc14f7cf682f710c;hpb=26c8963b7747f4c53fc541df0dd71b7024d1d496;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/w_common.qc b/qcsrc/server/w_common.qc index 2dd97c831..2d9ecfd8b 100644 --- a/qcsrc/server/w_common.qc +++ b/qcsrc/server/w_common.qc @@ -23,6 +23,7 @@ void W_GiveWeapon (entity e, float wep, string name) } .float railgundistance; +.vector railgunforce; void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, float mindist, float maxdist, float halflifedist, float forcehalflifedist, float deathtype) { local vector hitloc, force, endpoint, dir; @@ -67,6 +68,7 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f 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) @@ -130,7 +132,7 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f // apply the damage if (ent.takedamage) - Damage (ent, self, self, bdamage * f, deathtype, hitloc, force * ffs); + Damage (ent, self, self, bdamage * f, deathtype, hitloc, ent.railgunforce * ffs); // create a small explosion to throw gibs around (if applicable) //setorigin (explosion, hitloc); @@ -182,7 +184,7 @@ void W_BallisticBullet_Hit (void) if(headshot) f *= q; - if(DEATH_WEAPONOF(self.projectiledeathtype) == WEP_CAMPINGRIFLE) + if(DEATH_WEAPONOF(self.projectiledeathtype) == WEP_SNIPERRIFLE) { if(headshot) AnnounceTo(self.owner, "headshot"); @@ -249,7 +251,7 @@ float W_BallisticBullet_LeaveSolid(entity e, vector vel, float constant) // maxdist = 0.5 * v0 * v0 / constant // dprint("max dist = ", ftos(maxdist), "\n"); - if(maxdist <= cvar("g_ballistics_mindistance")) + if(maxdist <= autocvar_g_ballistics_mindistance) return 0; traceline_inverted (self.origin, self.origin + normalize(vel) * maxdist, MOVE_NORMAL, self); @@ -259,7 +261,7 @@ float W_BallisticBullet_LeaveSolid(entity e, vector vel, float constant) self.W_BallisticBullet_LeaveSolid_origin = trace_endpos; - dst = max(cvar("g_ballistics_mindistance"), vlen(trace_endpos - self.origin)); + dst = max(autocvar_g_ballistics_mindistance, vlen(trace_endpos - self.origin)); // E(s) = E0 - constant * s, constant = area of bullet circle * material constant / mass Es_m = E0_m - constant * dst; if(Es_m <= 0) @@ -352,7 +354,7 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f entity pl, oldself; float antilagging; - antilagging = (cvar("g_antilag_bullets") && (pSpeed >= cvar("g_antilag_bullets"))); + antilagging = (autocvar_g_antilag_bullets && (pSpeed >= autocvar_g_antilag_bullets)); entity proj; proj = spawn(); @@ -370,7 +372,7 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f proj.nextthink = time + lifetime; // min(pLifetime, vlen(world.maxs - world.mins) / pSpeed); W_SetupProjectileVelocityEx(proj, dir, v_up, pSpeed, 0, 0, spread, antilagging); proj.angles = vectoangles(proj.velocity); - proj.dmg_radius = cvar("g_ballistics_materialconstant") / bulletconstant; + proj.dmg_radius = autocvar_g_ballistics_materialconstant / bulletconstant; // so: bulletconstant = bullet mass / area of bullet circle setorigin(proj, start); proj.flags = FL_PROJECTILE; @@ -391,6 +393,8 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f if(tracereffects & EF_RED) eff = particleeffectnum("tr_rifle"); + else if(tracereffects & EF_BLUE) + eff = particleeffectnum("tr_rifle_weak"); else eff = particleeffectnum("tr_bullet"); @@ -400,7 +404,7 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f lag = 0; if(clienttype(self) != CLIENTTYPE_REAL) lag = 0; - if(cvar("g_antilag") == 0 || self.cvar_cl_noantilag) + if(autocvar_g_antilag == 0 || self.cvar_cl_noantilag) lag = 0; // only do hitscan, but no antilag if(lag) @@ -451,6 +455,23 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f W_BallisticBullet_Hit(); } + // if we hit "weapclip", bail out + // + // rationale of this check: + // + // any shader that is solid, nodraw AND trans is meant to clip weapon + // shots and players, but has no other effect! + // + // if it is not trans, it is caulk and should not have this side effect + // + // matching shaders: + // common/weapclip (intended) + // common/noimpact (is supposed to eat projectiles, but is erased farther above) + if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NODRAW) + if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NONSOLID) + if not(trace_dphitcontents & DPCONTENTS_OPAQUE) + break; + density = other.ballistics_density; if(density == 0) density = 1;