set g_balance_blaster_primary_damage 20
set g_balance_blaster_primary_delay 0
set g_balance_blaster_primary_edgedamage 10
- set g_balance_blaster_primary_force 300
- set g_balance_blaster_primary_force_zscale 1.25
+ set g_balance_blaster_primary_force 375
+ set g_balance_blaster_primary_force_zscale 1
set g_balance_blaster_primary_lifetime 5
set g_balance_blaster_primary_radius 60
set g_balance_blaster_primary_refire 0.7
set g_balance_blaster_secondary_damage 25
set g_balance_blaster_secondary_delay 0
set g_balance_blaster_secondary_edgedamage 12.5
- set g_balance_blaster_secondary_force 300
- set g_balance_blaster_secondary_force_zscale 1.2
+ set g_balance_blaster_secondary_force 360
+ set g_balance_blaster_secondary_force_zscale 1
set g_balance_blaster_secondary_lifetime 5
set g_balance_blaster_secondary_radius 70
set g_balance_blaster_secondary_refire 0.7
set g_balance_shotgun_reload_ammo 0
set g_balance_shotgun_reload_time 2
set g_balance_shotgun_secondary 1
+ set g_balance_shotgun_secondary_alt_animtime 0.2
+ set g_balance_shotgun_secondary_alt_refire 1.2
set g_balance_shotgun_secondary_animtime 1.15
set g_balance_shotgun_secondary_damage 70
set g_balance_shotgun_secondary_force 200
set g_balance_shotgun_secondary_melee_time 0.15
set g_balance_shotgun_secondary_melee_traces 10
set g_balance_shotgun_secondary_refire 1.25
- set g_balance_shotgun_secondary_alt_animtime 0.2
- set g_balance_shotgun_secondary_alt_refire 1.2
set g_balance_shotgun_switchdelay_drop 0.2
set g_balance_shotgun_switchdelay_raise 0.2
set g_balance_shotgun_weaponreplace ""
set g_balance_shotgun_weaponstartoverride -1
set g_balance_shotgun_weaponthrowable 1
// }}}
- // {{{ #3: Machine Gun
+ // {{{ #3: MachineGun
set g_balance_machinegun_burst 3
set g_balance_machinegun_burst_ammo 3
set g_balance_machinegun_burst_animtime 0.3
set g_balance_machinegun_burst_refire 0.06
set g_balance_machinegun_burst_refire2 0.45
- set g_balance_machinegun_burst_speed 0
+ set g_balance_machinegun_burst_spread 0
set g_balance_machinegun_first 1
set g_balance_machinegun_first_ammo 1
set g_balance_machinegun_first_damage 14
set g_balance_machinegun_mode 1
set g_balance_machinegun_reload_ammo 60
set g_balance_machinegun_reload_time 2
-set g_balance_machinegun_solidpenetration 13.1
+set g_balance_machinegun_solidpenetration 63
set g_balance_machinegun_spread_add 0.012
set g_balance_machinegun_spread_max 0.05
set g_balance_machinegun_spread_min 0.02
// }}}
// {{{ #8: Vortex
set g_balance_vortex_charge 1
+ set g_balance_vortex_charge_always 0
set g_balance_vortex_charge_animlimit 0.5
set g_balance_vortex_charge_limit 1
set g_balance_vortex_charge_maxspeed 800
set g_balance_vaporizer_secondary_damage 25
set g_balance_vaporizer_secondary_delay 0
set g_balance_vaporizer_secondary_edgedamage 12.5
- set g_balance_vaporizer_secondary_force 400
+ set g_balance_vaporizer_secondary_force 480
+ set g_balance_vaporizer_secondary_force_zscale 1
set g_balance_vaporizer_secondary_lifetime 5
set g_balance_vaporizer_secondary_radius 70
set g_balance_vaporizer_secondary_refire 0.7
set g_balance_seeker_weaponstartoverride -1
set g_balance_seeker_weaponthrowable 1
// }}}
- // {{{ #19: Shockwave (MUTATOR WEAPON)
+ // {{{ #19: Shockwave
set g_balance_shockwave_blast_animtime 0.3
set g_balance_shockwave_blast_damage 40
set g_balance_shockwave_blast_distance 1000
set g_balance_arc_beam_healing_aps 50
set g_balance_arc_beam_healing_hmax 150
set g_balance_arc_beam_healing_hps 50
- set g_balance_arc_cooldown 2.5
- set g_balance_arc_cooldown_release 0
- set g_balance_arc_overheat_max 5
- set g_balance_arc_overheat_min 3
set g_balance_arc_beam_heat 0
- set g_balance_arc_burst_heat 5
set g_balance_arc_beam_maxangle 10
set g_balance_arc_beam_nonplayerdamage 80
set g_balance_arc_beam_range 1500
set g_balance_arc_burst_damage 250
set g_balance_arc_burst_healing_aps 100
set g_balance_arc_burst_healing_hps 100
+ set g_balance_arc_burst_heat 5
+ set g_balance_arc_cooldown 2.5
+ set g_balance_arc_cooldown_release 0
+ set g_balance_arc_overheat_max 5
+ set g_balance_arc_overheat_min 3
set g_balance_arc_switchdelay_drop 0.2
set g_balance_arc_switchdelay_raise 0.2
set g_balance_arc_weaponreplace ""
set g_balance_arc_weaponstartoverride -1
set g_balance_arc_weaponthrowable 1
// }}}
- // {{{ #21: Overkill Heavy Machine Gun
+ // {{{ #21: Overkill Heavy Machine Gun (MUTATOR WEAPON)
set g_balance_okhmg_primary_ammo 1
set g_balance_okhmg_primary_damage 30
set g_balance_okhmg_primary_force 10
set g_balance_okhmg_primary_refire 0.05
- set g_balance_okhmg_primary_solidpenetration 32
+ set g_balance_okhmg_primary_solidpenetration 127
set g_balance_okhmg_primary_spread_add 0.005
set g_balance_okhmg_primary_spread_max 0.06
set g_balance_okhmg_primary_spread_min 0.01
set g_balance_okhmg_secondary_damage 25
set g_balance_okhmg_secondary_delay 0
set g_balance_okhmg_secondary_edgedamage 12.5
- set g_balance_okhmg_secondary_force 300
+ set g_balance_okhmg_secondary_force 360
+ set g_balance_okhmg_secondary_force_zscale 1
set g_balance_okhmg_secondary_lifetime 5
set g_balance_okhmg_secondary_radius 70
set g_balance_okhmg_secondary_refire 0.7
set g_balance_okhmg_weaponstartoverride 0
set g_balance_okhmg_weaponthrowable 0
// }}}
- // {{{ #22: Overkill Rocket Propelled Chainsaw
- set g_balance_okrpc_primary_ammo 10
- set g_balance_okrpc_primary_animtime 1
- set g_balance_okrpc_primary_damage 150
- set g_balance_okrpc_primary_damage2 500
- set g_balance_okrpc_primary_damageforcescale 2
- set g_balance_okrpc_primary_edgedamage 50
- set g_balance_okrpc_primary_force 400
- set g_balance_okrpc_primary_health 25
- set g_balance_okrpc_primary_lifetime 30
- set g_balance_okrpc_primary_radius 300
- set g_balance_okrpc_primary_refire 1
- set g_balance_okrpc_primary_speed 2500
- set g_balance_okrpc_primary_speedaccel 5000
- set g_balance_okrpc_reload_ammo 10
- set g_balance_okrpc_reload_time 1
- set g_balance_okrpc_secondary_ammo 0
- set g_balance_okrpc_secondary_animtime 0.2
- set g_balance_okrpc_secondary_damage 25
- set g_balance_okrpc_secondary_delay 0
- set g_balance_okrpc_secondary_edgedamage 12.5
- set g_balance_okrpc_secondary_force 300
- set g_balance_okrpc_secondary_lifetime 5
- set g_balance_okrpc_secondary_radius 70
- set g_balance_okrpc_secondary_refire 0.7
- set g_balance_okrpc_secondary_refire_type 1
- set g_balance_okrpc_secondary_shotangle 0
- set g_balance_okrpc_secondary_speed 6000
- set g_balance_okrpc_secondary_spread 0
- set g_balance_okrpc_switchdelay_drop 0.2
- set g_balance_okrpc_switchdelay_raise 0.2
- set g_balance_okrpc_weaponreplace ""
- set g_balance_okrpc_weaponstart 0
- set g_balance_okrpc_weaponstartoverride 0
- set g_balance_okrpc_weaponthrowable 0
- // }}}
- // {{{ Overkill Shotgun
- set g_balance_okshotgun_primary_ammo 3
- set g_balance_okshotgun_primary_animtime 0.65
- set g_balance_okshotgun_primary_bot_range 512
- set g_balance_okshotgun_primary_bullets 10
- set g_balance_okshotgun_primary_damage 17
- set g_balance_okshotgun_primary_force 80
- set g_balance_okshotgun_primary_refire 0.75
- set g_balance_okshotgun_primary_solidpenetration 3.8
- set g_balance_okshotgun_primary_spread 0.07
- set g_balance_okshotgun_reload_ammo 24
- set g_balance_okshotgun_reload_time 2
- set g_balance_okshotgun_secondary_animtime 0.2
- set g_balance_okshotgun_secondary_damage 25
- set g_balance_okshotgun_secondary_delay 0
- set g_balance_okshotgun_secondary_edgedamage 12.5
- set g_balance_okshotgun_secondary_force 300
- set g_balance_okshotgun_secondary_lifetime 5
- set g_balance_okshotgun_secondary_radius 70
- set g_balance_okshotgun_secondary_refire 0.7
- set g_balance_okshotgun_secondary_refire_type 1
- set g_balance_okshotgun_secondary_shotangle 0
- set g_balance_okshotgun_secondary_speed 6000
- set g_balance_okshotgun_secondary_spread 0
- set g_balance_okshotgun_switchdelay_drop 0.2
- set g_balance_okshotgun_switchdelay_raise 0.2
- set g_balance_okshotgun_weaponreplace ""
- set g_balance_okshotgun_weaponstart 0
- set g_balance_okshotgun_weaponstartoverride -1
- set g_balance_okshotgun_weaponthrowable 1
- // }}}
- // {{{ Overkill Machine Gun
+ // {{{ #22: Overkill MachineGun (MUTATOR WEAPON)
set g_balance_okmachinegun_primary_ammo 1
set g_balance_okmachinegun_primary_damage 25
set g_balance_okmachinegun_primary_force 5
set g_balance_okmachinegun_primary_refire 0.1
- set g_balance_okmachinegun_primary_solidpenetration 63
+ set g_balance_okmachinegun_primary_solidpenetration 100
set g_balance_okmachinegun_primary_spread_add 0.012
set g_balance_okmachinegun_primary_spread_max 0.05
set g_balance_okmachinegun_primary_spread_min 0
set g_balance_okmachinegun_secondary_damage 25
set g_balance_okmachinegun_secondary_delay 0
set g_balance_okmachinegun_secondary_edgedamage 12.5
- set g_balance_okmachinegun_secondary_force 300
+ set g_balance_okmachinegun_secondary_force 360
+ set g_balance_okmachinegun_secondary_force_zscale 1
set g_balance_okmachinegun_secondary_lifetime 5
set g_balance_okmachinegun_secondary_radius 70
set g_balance_okmachinegun_secondary_refire 0.7
set g_balance_okmachinegun_weaponstartoverride -1
set g_balance_okmachinegun_weaponthrowable 1
// }}}
- // {{{ Overkill Nex
+ // {{{ #23: Overkill Nex (MUTATOR WEAPON)
set g_balance_oknex_charge 0
set g_balance_oknex_charge_animlimit 0.5
set g_balance_oknex_charge_limit 1
set g_balance_oknex_secondary_damagefalloff_halflife 0
set g_balance_oknex_secondary_damagefalloff_maxdist 0
set g_balance_oknex_secondary_damagefalloff_mindist 0
- set g_balance_oknex_secondary_force 300
- set g_balance_oknex_secondary_refire 0.7
- set g_balance_oknex_secondary_refire_type 1
set g_balance_oknex_secondary_delay 0
set g_balance_oknex_secondary_edgedamage 12.5
+ set g_balance_oknex_secondary_force 360
+ set g_balance_oknex_secondary_force_zscale 1
set g_balance_oknex_secondary_lifetime 5
set g_balance_oknex_secondary_radius 70
+ set g_balance_oknex_secondary_refire 0.7
+ set g_balance_oknex_secondary_refire_type 1
set g_balance_oknex_secondary_shotangle 0
set g_balance_oknex_secondary_speed 6000
set g_balance_oknex_secondary_spread 0
set g_balance_oknex_weaponstartoverride -1
set g_balance_oknex_weaponthrowable 1
// }}}
+ // {{{ #24: Overkill Rocket Propelled Chainsaw (MUTATOR WEAPON)
+ set g_balance_okrpc_primary_ammo 10
+ set g_balance_okrpc_primary_animtime 1
+ set g_balance_okrpc_primary_damage 150
+ set g_balance_okrpc_primary_damage2 500
+ set g_balance_okrpc_primary_damageforcescale 2
+ set g_balance_okrpc_primary_edgedamage 50
+ set g_balance_okrpc_primary_force 400
+ set g_balance_okrpc_primary_health 25
+ set g_balance_okrpc_primary_lifetime 30
+ set g_balance_okrpc_primary_radius 300
+ set g_balance_okrpc_primary_refire 1
+ set g_balance_okrpc_primary_speed 2500
+ set g_balance_okrpc_primary_speedaccel 5000
+ set g_balance_okrpc_reload_ammo 10
+ set g_balance_okrpc_reload_time 1
+ set g_balance_okrpc_secondary_ammo 0
+ set g_balance_okrpc_secondary_animtime 0.2
+ set g_balance_okrpc_secondary_damage 25
+ set g_balance_okrpc_secondary_delay 0
+ set g_balance_okrpc_secondary_edgedamage 12.5
+ set g_balance_okrpc_secondary_force 360
+ set g_balance_okrpc_secondary_force_zscale 1
+ set g_balance_okrpc_secondary_lifetime 5
+ set g_balance_okrpc_secondary_radius 70
+ set g_balance_okrpc_secondary_refire 0.7
+ set g_balance_okrpc_secondary_refire_type 1
+ set g_balance_okrpc_secondary_shotangle 0
+ set g_balance_okrpc_secondary_speed 6000
+ set g_balance_okrpc_secondary_spread 0
+ set g_balance_okrpc_switchdelay_drop 0.2
+ set g_balance_okrpc_switchdelay_raise 0.2
+ set g_balance_okrpc_weaponreplace ""
+ set g_balance_okrpc_weaponstart 0
+ set g_balance_okrpc_weaponstartoverride 0
+ set g_balance_okrpc_weaponthrowable 0
+ // }}}
+ // {{{ #25: Overkill Shotgun (MUTATOR WEAPON)
+ set g_balance_okshotgun_primary_ammo 3
+ set g_balance_okshotgun_primary_animtime 0.65
+ set g_balance_okshotgun_primary_bot_range 512
+ set g_balance_okshotgun_primary_bullets 10
+ set g_balance_okshotgun_primary_damage 17
+ set g_balance_okshotgun_primary_force 80
+ set g_balance_okshotgun_primary_refire 0.75
+ set g_balance_okshotgun_primary_solidpenetration 3.8
+ set g_balance_okshotgun_primary_spread 0.07
+ set g_balance_okshotgun_reload_ammo 24
+ set g_balance_okshotgun_reload_time 2
+ set g_balance_okshotgun_secondary_animtime 0.2
+ set g_balance_okshotgun_secondary_damage 25
+ set g_balance_okshotgun_secondary_delay 0
+ set g_balance_okshotgun_secondary_edgedamage 12.5
+ set g_balance_okshotgun_secondary_force 360
+ set g_balance_okshotgun_secondary_force_zscale 1
+ set g_balance_okshotgun_secondary_lifetime 5
+ set g_balance_okshotgun_secondary_radius 70
+ set g_balance_okshotgun_secondary_refire 0.7
+ set g_balance_okshotgun_secondary_refire_type 1
+ set g_balance_okshotgun_secondary_shotangle 0
+ set g_balance_okshotgun_secondary_speed 6000
+ set g_balance_okshotgun_secondary_spread 0
+ set g_balance_okshotgun_switchdelay_drop 0.2
+ set g_balance_okshotgun_switchdelay_raise 0.2
+ set g_balance_okshotgun_weaponreplace ""
+ set g_balance_okshotgun_weaponstart 0
+ set g_balance_okshotgun_weaponstartoverride -1
+ set g_balance_okshotgun_weaponthrowable 1
+ // }}}
void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector end, float bdamage, float bforce, float mindist, float maxdist, float halflifedist, float forcehalflifedist, int deathtype)
{
- entity pseudoprojectile = NULL;
-
vector dir = normalize(end - start);
- float length = vlen(end - start);
vector force = dir * bforce;
// go a little bit into the wall because we need to hit this wall later
it.solid = it.railgunhitsolidbackup;
});
- // spawn a temporary explosion entity for RadiusDamage calls
- //explosion = spawn();
+ // Find all players the beam passed close by (even those hit)
+ float length = vlen(endpoint - start);
+ entity pseudoprojectile = NULL;
+ FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != this, {
+ // not when spectating the shooter
+ if (IS_SPEC(it) && it.enemy == this) continue;
- // Find all non-hit players the beam passed close by
- if(deathtype == WEP_VAPORIZER.m_id || deathtype == WEP_VORTEX.m_id) // WEAPONTODO
- {
- FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != this, {
- if(!it.railgunhit)
- if(!(IS_SPEC(it) && it.enemy == this))
- {
- msg_entity = it;
- // nearest point on the beam
- vector beampos = start + dir * bound(0, (msg_entity.origin - start) * dir, length);
+ // nearest point on the beam
+ vector beampos = start + dir * bound(0, (it.origin - start) * dir, length);
- float f = bound(0, 1 - vlen(beampos - msg_entity.origin) / 512, 1);
- if(f <= 0)
- continue;
+ if(!pseudoprojectile)
+ pseudoprojectile = spawn(); // we need this so the sound uses the "entchannel4" volume
- if(!pseudoprojectile)
- pseudoprojectile = spawn(); // we need this so the sound uses the "entchannel4" volume
- soundtoat(MSG_ONE, pseudoprojectile, beampos, CH_SHOTS, SND(NEXWHOOSH_RANDOM()), VOL_BASE * f, ATTEN_NONE);
- }
- });
-
- if(pseudoprojectile)
- delete(pseudoprojectile);
- }
+ msg_entity = it;
+ // we want this to be very loud when close but fall off quickly -> using max base volume and high attenuation
+ soundtoat(MSG_ONE, pseudoprojectile, beampos, CH_SHOTS, SND(NEXWHOOSH_RANDOM()), VOL_BASEVOICE, ATTEN_IDLE);
+ });
+ if(pseudoprojectile)
+ delete(pseudoprojectile);
// find all the entities the railgun hit and hurt them
IL_EACH(g_railgunhit, it.railgunhit,
{
// removal from the list is handled below
- // get the details we need to call the damage function
- vector hitloc = it.railgunhitloc;
-
float foff = ExponentialFalloff(mindist, maxdist, halflifedist, it.railgundistance);
float ffs = ExponentialFalloff(mindist, maxdist, forcehalflifedist, it.railgundistance);
// apply the damage
if (it.takedamage)
- Damage (it, this, this, bdamage * foff, deathtype, weaponentity, hitloc, it.railgunforce * ffs);
-
- // create a small explosion to throw gibs around (if applicable)
- //setorigin(explosion, hitloc);
- //RadiusDamage (explosion, this, 10, 0, 50, NULL, NULL, 300, deathtype);
+ Damage(it, this, this, bdamage * foff, deathtype, weaponentity, it.railgunhitloc, it.railgunforce * ffs);
it.railgunhitloc = '0 0 0';
it.railgunhitsolidbackup = SOLID_NOT;
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)
// note that it doesn't reset all server cvars,
// some are shared with the client and so are left in xonotic-common.cfg
- set name_maxlength 64 "max player name length (not counting color codes) allowed by the server"
+ set sv_name_maxlength 64 "max player name length (not counting color codes) allowed by the server"
// taunts and voices
set sv_taunt 1 "allow taunts on the server"
set g_pickup_respawntime_scaling_reciprocal 0 "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `reciprocal` (with `offset` and `linear` set to 0) can be used to achieve a constant number of items spawned *per player*"
set g_pickup_respawntime_scaling_offset 0 "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `offset` offsets the curve left or right - the results are not intuitive and I recommend plotting the respawn time and the number of items per player to see what's happening"
set g_pickup_respawntime_scaling_linear 1 "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `linear` can be used to simply scale the respawn time linearly"
- set g_weaponarena "0" "put in a list of weapons to enable a weapon arena mode, or try \"all\" or \"most\""
+ set g_weaponarena "0" "put in a list of weapons to enable a weapon arena mode, or try \"all\", \"most\", \"all_available\" or \"most_available\" (available only gives the weapon if the map normally has it as a pickup item)"
set g_weaponarena_random "0" "if set to a number, only that weapon count is given on every spawn (randomly)"
set g_weaponarena_random_with_blaster "1" "additionally, always provide the blaster in random weapon arena games"
set g_spawnpoints_auto_move_out_of_solid 0 "if set to 1 you will see a warning if a spawn point was placed inside a solid"
set g_maplist_selectrandom 0 "if 1, a random map will be chosen as next map - DEPRECATED in favor of g_maplist_shuffle"
set g_maplist_shuffle 1 "new randomization method: like selectrandom, but avoid playing the same maps in short succession. This works by taking out the first element and inserting it into g_maplist with a bias to the end of the list"
set g_maplist_check_waypoints 0 "when 1, maps are skipped if there currently are bots, but the map has no waypoints"
+ set g_maplist_ignore_sizes 0 "when 1, all maps are shown in the map list regardless of player count"
set g_items_mindist 4000 "starting distance for the fading of items"
set g_items_maxdist 4500 "maximum distance at which an item can be viewed, after which it will be invisible"
set g_cloaked 0 "display all players mostly invisible"
set g_player_alpha 1 "default opacity of players"
set g_player_brightness 0 "set to 2 for brighter players"
+ set g_player_damageforcescale 2 "push multiplier of attacks against players"
set g_balance_cloaked_alpha 0.25 "opacity of cloaked players"
set g_playerclip_collisions 1 "0 = disable collision testing against playerclips, might be useful on some defrag maps"
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"