Merge branch 'master' into martin-t/mg-solidpen
authorMartin Taibr <taibr.martin@gmail.com>
Wed, 13 Feb 2019 23:38:24 +0000 (00:38 +0100)
committerMartin Taibr <taibr.martin@gmail.com>
Wed, 13 Feb 2019 23:38:24 +0000 (00:38 +0100)
1  2 
qcsrc/server/autocvars.qh
qcsrc/server/defs.qh
qcsrc/server/weapons/tracing.qc
vehicles.cfg
xonotic-server.cfg

@@@ -91,8 -91,7 +91,8 @@@ float autocvar_g_balance_selfdamageperc
  float autocvar_g_ballistics_density_corpse;
  float autocvar_g_ballistics_density_player;
  float autocvar_g_ballistics_mindistance;
 -bool autocvar_g_ballistics_penetrate_clips;
 +bool autocvar_g_ballistics_penetrate_clips = true;
 +float autocvar_g_ballistics_solidpenetration_exponent = 0.25;
  float autocvar_g_ban_default_bantime;
  float autocvar_g_ban_default_masksize;
  float autocvar_g_ban_sync_interval;
@@@ -252,6 -251,7 +252,7 @@@ bool autocvar_lastlevel
  int autocvar_leadlimit_and_fraglimit;
  int autocvar_leadlimit_override;
  int autocvar_minplayers;
+ int autocvar_minplayers_per_team;
  string autocvar_nextmap;
  string autocvar_quit_and_redirect;
  float autocvar_quit_and_redirect_timer;
diff --combined qcsrc/server/defs.qh
@@@ -50,7 -50,7 +50,7 @@@ float server_is_dedicated
  .float        pain_frame;                     //"
  .float  crouch;       // Crouching or not?
  
.float        superweapons_finished = _STAT(SUPERWEAPONS_FINISHED);
const .float superweapons_finished = _STAT(SUPERWEAPONS_FINISHED);
  
  .float cnt; // used in too many places
  .float count;
@@@ -338,7 -338,7 +338,7 @@@ string deathmessage
  .float cvar_cl_weaponimpulsemode;
  .int selectweapon; // last selected weapon of the player
  
 -.float ballistics_density; // wall piercing factor, larger = bullet can pass through more
 +.float ballistics_density;
  
  //const int FROZEN_NOT                                = 0;
  const int FROZEN_NORMAL                               = 1;
@@@ -26,6 -26,7 +26,7 @@@
  void W_SetupShot_Dir_ProjectileSize_Range(entity ent, .entity weaponentity, vector s_forward, vector mi, vector ma, float antilag, float recoil, Sound snd, float chan, float maxdamage, float range, int deathtype)
  {
        TC(Sound, snd);
+       float nudge = 1; // added to traceline target and subtracted from result  TOOD(divVerent): do we still need this? Doesn't the engine do this now for us?
        float oldsolid = ent.dphitcontentsmask;
        Weapon wep = DEATH_WEAPONOF(deathtype);
        if(!IS_CLIENT(ent))
        vector md = ent.(weaponentity).movedir;
        vector vecs = ((md.x > 0) ? md : '0 0 0');
  
-       vector dv = v_forward * vecs.x + v_right * -vecs.y + v_up * vecs.z;
-       w_shotorg = ent.origin + ent.view_ofs;
+       // TODO this is broken - see 637056bea7bf7f5c9c0fc6113e94731a2767476 for an attempted fix
+       // which fixes issue #1957 but causes #2129
+       vector dv = v_right * -vecs.y + v_up * vecs.z;
+       w_shotorg = ent.origin + ent.view_ofs + dv;
  
        // now move the shotorg forward as much as requested if possible
        if(antilag)
        {
                if(CS(ent).antilag_debug)
-                       tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent, CS(ent).antilag_debug);
+                       tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + v_forward * (vecs.x + nudge), MOVE_NORMAL, ent, CS(ent).antilag_debug);
                else
-                       tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
+                       tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + v_forward * (vecs.x + nudge), MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
        }
        else
-               tracebox(w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent);
-       w_shotorg = trace_endpos;
+               tracebox(w_shotorg, mi, ma, w_shotorg + v_forward * (vecs.x + nudge), MOVE_NORMAL, ent);
+       w_shotorg = trace_endpos - v_forward * nudge;
        // calculate the shotdir from the chosen shotorg
        if(W_DualWielding(ent))
                w_shotdir = s_forward;
        }
  
        // nudge w_shotend so a trace to w_shotend hits
-       w_shotend = w_shotend + normalize(w_shotend - w_shotorg);
+       w_shotend = w_shotend + normalize(w_shotend - w_shotorg) * nudge;
        //if(w_shotend != prevend) { printf("SERVER: shotEND differs: %s - %s\n", vtos(w_shotend), vtos(prevend)); }
        //if(w_shotorg != prevorg) { printf("SERVER: shotORG differs: %s - %s\n", vtos(w_shotorg), vtos(prevorg)); }
        //if(w_shotdir != prevdir) { printf("SERVER: shotDIR differs: %s - %s\n", vtos(w_shotdir), vtos(prevdir)); }
@@@ -347,14 -350,15 +350,14 @@@ void fireBullet_trace_callback(vector s
  
  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)
  {
 -      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);
  
        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)
diff --combined vehicles.cfg
@@@ -34,7 -34,7 +34,7 @@@ set g_vehicle_bumblebee_turnspeed 12
  set g_vehicle_bumblebee_pitchspeed 60
  set g_vehicle_bumblebee_pitchlimit 60
  set g_vehicle_bumblebee_friction 0.5
- set g_vehicle_bumblebee_swim 0
+ set g_vehicle_bumblebee_swim 1
  
  set g_vehicle_bumblebee_energy 500
  set g_vehicle_bumblebee_energy_regen 50
@@@ -287,7 -287,7 +287,7 @@@ set g_vehicle_spiderbot_minigun_ammo_ma
  set g_vehicle_spiderbot_minigun_ammo_regen 40
  set g_vehicle_spiderbot_minigun_ammo_regen_pause 1
  set g_vehicle_spiderbot_minigun_force 9
 -set g_vehicle_spiderbot_minigun_solidpenetration 32
 +set g_vehicle_spiderbot_minigun_solidpenetration 63
  
  set g_vehicle_spiderbot_rocket_damage 50
  set g_vehicle_spiderbot_rocket_force 150
diff --combined xonotic-server.cfg
@@@ -10,7 -10,8 +10,8 @@@ set sv_autotaunt 1 "allow autotaunts o
  // server settings
  hostname "Xonotic $g_xonoticversion Server"
  set sv_mapchange_delay 5
- set minplayers 0 "fill server with bots to reach this number of players (if bot_number is not enough)"
+ set minplayers 0 "fill server with bots to reach this number of players in teamless games (if bot_number is not enough)"
+ set minplayers_per_team 0 "fill server with bots to reach this number of players per team (if bot_number is not enough)"
  
  // restart server if all players hit "ready"-button
  set sv_ready_restart 0 "allow a map to be restarted once all players pressed the \"ready\" button"
@@@ -415,11 -416,15 +416,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 as walls
 -set g_ballistics_density_corpse 0.10 // corpses are 10x as easy to pass 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"