From: Martin Taibr Date: Wed, 13 Feb 2019 23:38:24 +0000 (+0100) Subject: Merge branch 'master' into martin-t/mg-solidpen X-Git-Tag: xonotic-v0.8.5~1307^2~8 X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=546842f7e5a63b11a9b862dbf1709318bb97689b;hp=-c Merge branch 'master' into martin-t/mg-solidpen --- 546842f7e5a63b11a9b862dbf1709318bb97689b diff --combined qcsrc/server/autocvars.qh index 620d32ccdf,a501917759..9ed29dea2e --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@@ -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 index 862bdd69a7,c66ad28fe3..055e8b9aa4 --- a/qcsrc/server/defs.qh +++ b/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; diff --combined qcsrc/server/weapons/tracing.qc index 9fda61202c,dfa1389721..fdee0d6fe9 --- a/qcsrc/server/weapons/tracing.qc +++ b/qcsrc/server/weapons/tracing.qc @@@ -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)) @@@ -73,20 -74,22 +74,22 @@@ 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; @@@ -151,7 -154,7 +154,7 @@@ } // 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); @@@ -375,6 -379,7 +378,6 @@@ 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); @@@ -412,7 -417,7 +415,7 @@@ 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). { @@@ -421,13 -426,13 +424,13 @@@ 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); } } @@@ -449,9 -454,9 +452,9 @@@ 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; @@@ -463,10 -468,10 +466,10 @@@ 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)) @@@ -476,7 -481,7 +479,7 @@@ 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 index 68018529d0,489d82b154..429e0cf5eb --- a/vehicles.cfg +++ b/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 index 9b845cd9ce,bb0d59371d..525c589f92 --- a/xonotic-server.cfg +++ b/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"