X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fw_common.qc;h=1efd6132d084e217b586015bf4910fb61446ebcc;hb=dd1c17f2775c0249509992ee85edb71020fa09e9;hp=25ca2f5c6225058f2e410bdf8382f35d160c216e;hpb=026b1e9f8a6d485705aaf949b7e16c08f50ba28f;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/w_common.qc b/qcsrc/server/w_common.qc index 25ca2f5c6..1efd6132d 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); @@ -159,7 +161,7 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f .float dmg_total; void W_BallisticBullet_Hit (void) { - float f, q; + float f, q, g; f = pow(bound(0, vlen(self.velocity) / vlen(self.oldvelocity), 1), 2); // energy multiplier q = 1 + self.dmg_edge / self.dmg; @@ -173,26 +175,25 @@ void W_BallisticBullet_Hit (void) headshot = 0; yoda = 0; - damage_headshotbonus = self.dmg_edge; + damage_headshotbonus = self.dmg_edge * f; railgun_start = self.origin - 2 * frametime * self.velocity; railgun_end = self.origin + 2 * frametime * self.velocity; - + g = accuracy_isgooddamage(self.owner, other); Damage(other, self, self.owner, self.dmg * f, self.projectiledeathtype, self.origin, self.dmg_force * normalize(self.velocity) * f); damage_headshotbonus = 0; - if(self.dmg_edge != 0) + if(headshot) + f *= q; + if(self.dmg_edge > 0) { if(headshot) - { - f *= q; AnnounceTo(self.owner, "headshot"); - } + if(yoda) + AnnounceTo(self.owner, "awesome"); } - if(yoda) - AnnounceTo(self.owner, "awesome"); // calculate hits for ballistic weapons - if(accuracy_isgooddamage(self.owner, other)) + if(g) { // do not exceed 100% q = min(self.dmg * q, self.dmg_total + f * self.dmg) - self.dmg_total; @@ -250,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); @@ -260,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) @@ -353,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(); @@ -371,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; @@ -392,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"); @@ -401,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) @@ -452,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;