]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'martin-t/mg-solidpen' into 'master'
authorMario <mario.mario@y7mail.com>
Sat, 7 Sep 2019 07:00:41 +0000 (07:00 +0000)
committerMario <mario.mario@y7mail.com>
Sat, 7 Sep 2019 07:00:41 +0000 (07:00 +0000)
Increase MG solidpenetration

See merge request xonotic/xonotic-data.pk3dir!619

1  2 
qcsrc/server/weapons/tracing.qc
xonotic-server.cfg

index 91c23563f030f932348dc4de3e7f9a2258c4c8a3,09e9eab980e7ad51c1859542af51da1ccbc19f65..06bebeba2746f09b57e3cc37e6f0c4c95075f5c5
@@@ -330,20 -330,24 +330,19 @@@ void fireBullet_trace_callback(vector s
        fireBullet_last_hit = NULL;
  }
  
 -void fireBullet(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect)
 +void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect, bool do_antilag)
  {
-       vector  end;
        dir = normalize(dir + randomvec() * spread);
-       end = start + dir * max_shot_distance;
+       vector end = start + dir * max_shot_distance;
  
        fireBullet_last_hit = NULL;
        fireBullet_trace_callback_eff = tracer_effect;
  
-       float solid_penetration_left = 1;
+       float solid_penetration_fraction = 1;
+       float damage_fraction = 1;
        float total_damage = 0;
  
 -      float lag = ((IS_REAL_CLIENT(this)) ? ANTILAG_LATENCY(this) : 0);
 -      if(lag < 0.001)
 -              lag = 0;
 -      bool noantilag = ((IS_CLIENT(this)) ? CS(this).cvar_cl_noantilag : false);
 -      if(autocvar_g_antilag == 0 || noantilag)
 -              lag = 0; // only do hitscan, but no antilag
 +      float lag = ((do_antilag) ? antilag_getlag(this) : 0);
        if(lag)
                antilag_takeback_all(this, lag);
  
  
        for (;;)
        {
-               // TODO also show effect while tracing
                WarpZone_TraceBox_ThroughZone(start, '0 0 0', '0 0 0', end, false, WarpZone_trace_forent, NULL, fireBullet_trace_callback);
                dir = WarpZone_TransformVelocity(WarpZone_trace_transform, dir);
                end = WarpZone_TransformOrigin(WarpZone_trace_transform, end);
                        is_weapclip = true;
  
                if(!hit || hit.solid == SOLID_BSP || hit.solid == SOLID_SLIDEBOX)
-                       Damage_DamageInfo(start, damage * solid_penetration_left, 0, 0, max(1, force) * dir * solid_penetration_left, dtype, hit.species, this);
+                       Damage_DamageInfo(start, damage * damage_fraction, 0, 0, max(1, force) * dir * damage_fraction, dtype, hit.species, this);
  
                if (hit && hit != WarpZone_trace_forent && hit != fireBullet_last_hit)  // Avoid self-damage (except after going through a warp); avoid hitting the same entity twice (engine bug).
                {
                        MUTATOR_CALLHOOK(FireBullet_Hit, this, hit, start, end, damage, this.(weaponentity));
                        damage = M_ARGV(4, float);
                        bool gooddamage = accuracy_isgooddamage(this, hit);
-                       Damage(hit, this, this, damage * solid_penetration_left, dtype, weaponentity, start, force * dir * solid_penetration_left);
+                       Damage(hit, this, this, damage * damage_fraction, dtype, weaponentity, start, force * dir * damage_fraction);
                        // calculate hits for ballistic weapons
                        if(gooddamage)
                        {
                                // do not exceed 100%
-                               float added_damage = min(damage - total_damage, damage * solid_penetration_left);
-                               total_damage += damage * solid_penetration_left;
+                               float added_damage = min(damage - total_damage, damage * damage_fraction);
+                               total_damage += damage * damage_fraction;
                                accuracy_add(this, this.(weaponentity).m_weapon, 0, added_damage);
                        }
                }
                else if(hitstore.ballistics_density < 0)
                        maxdist = vlen(hit.maxs - hit.mins) + 1; // -1: infinite travel distance
                else if(hitstore.ballistics_density == 0)
-                       maxdist = max_solid_penetration * solid_penetration_left;
+                       maxdist = max_solid_penetration * solid_penetration_fraction;
                else
-                       maxdist = max_solid_penetration * solid_penetration_left * hitstore.ballistics_density;
+                       maxdist = max_solid_penetration * solid_penetration_fraction / hitstore.ballistics_density;
  
                if(maxdist <= autocvar_g_ballistics_mindistance)
                        break;
                        break;
  
                float dist_taken = max(autocvar_g_ballistics_mindistance, vlen(trace_endpos - start));
-               // fraction_used_of_what_is_left = dist_taken / maxdist
-               // solid_penetration_left = solid_penetration_left - solid_penetration_left * fraction_used_of_what_is_left
-               solid_penetration_left *= 1 - dist_taken / maxdist;
-               solid_penetration_left = max(solid_penetration_left, 0);
+               float fraction_used_of_what_is_left = dist_taken / maxdist;
+               solid_penetration_fraction -= solid_penetration_fraction * fraction_used_of_what_is_left;
+               solid_penetration_fraction = max(solid_penetration_fraction, 0);
+               damage_fraction = pow(solid_penetration_fraction, autocvar_g_ballistics_solidpenetration_exponent);
  
                // Only show effect when going through a player (invisible otherwise)
                if (hit && (hit.solid != SOLID_BSP))
                start = trace_endpos;
  
                if(hit.solid == SOLID_BSP)
-                       Damage_DamageInfo(start, 0, 0, 0, max(1, force) * normalize(dir) * -solid_penetration_left, dtype, 0, this);
+                       Damage_DamageInfo(start, 0, 0, 0, max(1, force) * normalize(dir) * -damage_fraction, dtype, 0, this);
        }
  
        if(lag)
        if(this)
                this.dphitcontentsmask = oldsolid;
  }
 +
 +void fireBullet(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect)
 +{
 +      fireBullet_antilag(this, weaponentity, start, dir, spread, max_solid_penetration, damage, force, dtype, tracer_effect, true);
 +}
diff --combined xonotic-server.cfg
index 828219ca9e5c882c151b1c8206feff7915ea1317,9dbfdc8f692a1862590ca8b42db06b91b1c69e89..cb3a550ae6db9a2b9aad575a34d30be2909839d6
@@@ -32,8 -32,6 +32,8 @@@ set g_warmup_allow_timeout 0  "allow cal
  set g_warmup_allguns 1        "provide more weapons on start while in warmup: 0 = normal start weapons, 1 = all guns available on the map, 2 = all normal weapons"
  set g_warmup_majority_factor 0.8 "minimum percentage of players ready needed for warmup to end"
  
 +alias sv_hook_warmupend
 +
  set g_chat_nospectators 0     "if 0 spec/observer chat is always visible to the player, if 1 it is never visible to players, if 2 it is only visible to players during warmup stage"
  set sv_vote_nospectators 0    "only players can call a vote (thus spectators and observers can't call a vote): 0 = all people can vote, 1 = spectators can vote in warmup stage, 2 = only players can vote (no exceptions)."
  
@@@ -423,15 -421,11 +423,11 @@@ set g_ban_sync_trusted_servers_verify 
  
  set g_showweaponspawns 1 "1: display waypoints for weapon spawns found on the map when a weapon key is pressed and the weapon is not owned; 2: for dropped weapons too; 3: for all the weapons sharing the same impulse"
  
- // ballistics use physical units, but qu based
- //   Quake-Newton: 1 qN  = 1 qu * 1 g / 1 s^2
- //   Quake-Joule:  1 qJ  = 1 qN * 1 qu
- //   Quake-Pascal: 1 qPa = 1 qN / 1 qu^2
- set g_ballistics_mindistance 2 "enable ballistics starting from 2 qu"
- set g_ballistics_density_player 0.50 "players are 2x as easy to pass through as walls"
- set g_ballistics_density_corpse 0.10 "corpses are 10x as easy to pass through as walls"
- set g_ballistics_penetrate_clips 0 "allow ballistics to pass through weapon clips"
+ set g_ballistics_mindistance 2 "when shooting through walls thinner than this, treat them as this thick (useful because patches (curved surfaces) have no thickness)"
+ set g_ballistics_density_player 0.50 "how hard players are to shoot through compared to walls"
+ set g_ballistics_density_corpse 0.10 "how hard corpses are to shoot through compared to walls"
+ set g_ballistics_penetrate_clips 1 "allow ballistics to pass through weapon clips"
+ set g_ballistics_solidpenetration_exponent 0.25 "how fast damage falls off when bullets pass through walls - 1 means linear, lower values mean slower initial falloff but faster once there's little solidpenetration left (damage_fraction = solidpen_fraction^exp for solidpen_fraction between 0 and 1)"
  
  sv_status_show_qcstatus 1     "Xonotic uses this field instead of frags"
  set g_full_getstatus_responses 0      "this currently breaks qstat"