]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into Mario/overkill
authorMario <zacjardine@y7mail.com>
Tue, 16 Dec 2014 03:36:30 +0000 (14:36 +1100)
committerMario <zacjardine@y7mail.com>
Tue, 16 Dec 2014 03:36:30 +0000 (14:36 +1100)
1  2 
mutators.cfg
qcsrc/client/View.qc
qcsrc/client/autocvars.qh
qcsrc/client/hud.qc
qcsrc/client/weapons/projectile.qc
qcsrc/common/notifications.qh
qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c
qcsrc/server/autocvars.qh
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/mutators/mutator_instagib.qc

diff --combined mutators.cfg
index adfcd240522d7e07f21cbbecef049650c0ec755b,e751ae11701d2d59e7b33221dea2e18dc5c5c645..e8221b4f084a93936e20d5972a338c0bf1c43279
@@@ -33,41 -33,19 +33,48 @@@ set g_instagib_invis_alpha 0.1
  set g_instagib_speed_highspeed 1.5 "speed-multiplier that applies while you carry the invincibility powerup"
  
  
 +// ==========
 +//  overkill
 +// ==========
 +set g_overkill 0 "enable overkill"
 +set g_overkill_superguns_builtin 0
 +
 +set g_overkill_100a_anyway 1
 +set g_overkill_100h_anyway 1
 +set g_overkill_powerups_replace 1
 +set g_overkill_superguns_onemag 1
 +set g_overkill_superguns_respawn_time 20
 +
 +set g_overkill_ammo_charge 1
 +set g_overkill_ammo_charge_notice 1
 +set g_overkill_ammo_charge_limit 1
 +set g_overkill_ammo_charge_rate 0.5
 +set g_overkill_ammo_charge_rate_vortex 0.5
 +set g_overkill_ammo_charge_rate_machinegun 0.5
 +set g_overkill_ammo_charge_rate_shotgun 0.5
 +set g_overkill_ammo_charge_rate_hmg 0.25
 +set g_overkill_ammo_charge_rate_rpc 1.5
 +set g_overkill_ammo_decharge 0.1
 +set g_overkill_ammo_decharge_machinegun 0.025
 +set g_overkill_ammo_decharge_shotgun 0.15
 +set g_overkill_ammo_decharge_vortex 0.2
 +set g_overkill_ammo_decharge_rpc 1
 +set g_overkill_ammo_decharge_hmg 0.01
 +
 +
  // =========
  //  vampire
  // =========
  set g_vampire 0 "set to 1 to enable the vampire mode, where the damage done to your opponent gets added to your own health"
  
  
+ // ========
+ //  midair
+ // ========
+ set g_midair 0 "if set to 1 you can only apply damage to your opponent while he is airborne"
+ set g_midair_shieldtime 0.3 "number of seconds you are still invincible since you lost contact to the ground"
  // =========
  //  sandbox
  // =========
diff --combined qcsrc/client/View.qc
index 120b682a3020f083e28856052cd5980d74c17129,b78d960559f81bf961718557251dbcc1355bcfba..0a5f73b55fe05a3eda69637907e5642e50fd44e6
@@@ -162,7 -162,7 +162,7 @@@ vector GetCurrentFov(float fov
        else
                setsensitivityscale(1);
  
-       if(autocvar_cl_velocityzoom && autocvar_cl_velocityzoom_type) // _type = 0 disables velocity zoom too
+       if(autocvar_cl_velocityzoom_enabled && autocvar_cl_velocityzoom_type) // _type = 0 disables velocity zoom too
        {
                if(intermission) { curspeed = 0; }
                else
  
                velocityzoom = bound(0, drawframetime / max(0.000000001, autocvar_cl_velocityzoom_time), 1); // speed at which the zoom adapts to player velocity
                avgspeed = avgspeed * (1 - velocityzoom) + (curspeed / autocvar_cl_velocityzoom_speed) * velocityzoom;
-               velocityzoom = exp(float2range11(avgspeed * -autocvar_cl_velocityzoom / 1) * 1);
+               velocityzoom = exp(float2range11(avgspeed * -autocvar_cl_velocityzoom_factor / 1) * 1);
  
                //print(ftos(avgspeed), " avgspeed, ", ftos(curspeed), " curspeed, ", ftos(velocityzoom), " return\n"); // for debugging
        }
@@@ -394,6 -394,30 +394,30 @@@ float contentavgalpha, liquidalpha_prev
  vector liquidcolor_prev;
  
  float eventchase_current_distance;
+ float eventchase_running;
+ float WantEventchase()
+ {
+       if(autocvar_cl_orthoview)
+               return FALSE;
+       if(intermission)
+               return TRUE;
+       if(spectatee_status >= 0)
+       {
+               if(autocvar_cl_eventchase_nexball && gametype == MAPINFO_TYPE_NEXBALL && !(WepSet_GetFromStat() & WepSet_FromWeapon(WEP_PORTO)))
+                       return TRUE;
+               if(autocvar_cl_eventchase_death && (getstati(STAT_HEALTH) <= 0))
+               {
+                       if(autocvar_cl_eventchase_death == 2)
+                       {
+                               // don't stop eventchase once it's started (even if velocity changes afterwards)
+                               if(self.velocity == '0 0 0' || eventchase_running)
+                                       return TRUE;
+                       }
+                       else return TRUE;
+               }
+       }
+       return FALSE;
+ }
  
  vector damage_blurpostprocess, content_blurpostprocess;
  
@@@ -495,9 -519,10 +519,10 @@@ void CSQC_UpdateView(float w, float h
        // event chase camera
        if(autocvar_chase_active <= 0) // greater than 0 means it's enabled manually, and this code is skipped
        {
-               WepSet weapons_stat = WepSet_GetFromStat();
-               if(((spectatee_status >= 0 && (autocvar_cl_eventchase_death && is_dead)) || intermission) && !autocvar_cl_orthoview || (autocvar_cl_eventchase_nexball && gametype == MAPINFO_TYPE_NEXBALL && !(weapons_stat & WepSet_FromWeapon(WEP_PORTO))))
+               if(WantEventchase())
                {
+                       eventchase_running = TRUE;
                        // make special vector since we can't use view_origin (It is one frame old as of this code, it gets set later with the results this code makes.)
                        vector current_view_origin = (csqcplayer ? csqcplayer.origin : pmove_org);
  
                }
                else if(autocvar_chase_active < 0) // time to disable chase_active if it was set by this code
                {
+                       eventchase_running = FALSE;
                        cvar_set("chase_active", "0");
                        eventchase_current_distance = 0; // start from 0 next time
                }
        {
                // apply night vision effect
                vector tc_00, tc_01, tc_10, tc_11;
-               vector rgb;
-               rgb_x = 0; // fteqcc sucks
-               rgb_y = 0; // fteqcc sucks
-               rgb_z = 0; // fteqcc sucks
+               vector rgb = '0 0 0';
  
                if(!nightvision_noise)
                {
                                        weapon_clipload = getstati(STAT_WEAPON_CLIPLOAD);
                                        weapon_clipsize = getstati(STAT_WEAPON_CLIPSIZE);
  
 +                                      float ok_ammo_charge, ok_ammo_chargepool;
 +                                      ok_ammo_charge = getstatf(STAT_OK_AMMO_CHARGE);
 +                                      ok_ammo_chargepool = getstatf(STAT_OK_AMMO_CHARGEPOOl);
 +
                                        float vortex_charge, vortex_chargepool;
                                        vortex_charge = getstatf(STAT_VORTEX_CHARGE);
                                        vortex_chargepool = getstatf(STAT_VORTEX_CHARGEPOOL);
                                                ring_rgb = wcross_color;
                                                ring_image = "gfx/crosshair_ring.tga";
                                        }
 -
 -                                      if(autocvar_crosshair_ring_reload && weapon_clipsize) // forces there to be only an ammo ring
 +                                      else if (ok_ammo_charge)
 +                                      {
 +                                              ring_value = ok_ammo_chargepool;
 +                                              ring_alpha = autocvar_crosshair_ring_reload_alpha;
 +                                              ring_rgb = wcross_color;
 +                                              ring_image = "gfx/crosshair_ring.tga";
 +                                      }
 +                                      else if(autocvar_crosshair_ring_reload && weapon_clipsize) // forces there to be only an ammo ring 
                                        {
                                                ring_value = bound(0, weapon_clipload / weapon_clipsize, 1);
                                                ring_scale = autocvar_crosshair_ring_reload_size;
index 90a74a905b9bfaa1771ed3a9e157c9df9bdc234c,2555f3ebe41a4fa5e79d6f2413cbb5fcc33a3249..f06c5bfb3bd0f66e6dbc25ad67f201587b50a7c0
@@@ -77,7 -77,8 +77,8 @@@ float autocvar_cl_stripcolorcodes
  var float autocvar_cl_vehicle_spiderbot_cross_alpha = 0.6;
  var float autocvar_cl_vehicle_spiderbot_cross_size = 1;
  var float autocvar_cl_vehicles_hud_tactical = 1;
- float autocvar_cl_velocityzoom;
+ float autocvar_cl_velocityzoom_enabled;
+ float autocvar_cl_velocityzoom_factor;
  var float autocvar_cl_velocityzoom_type = 3;
  float autocvar_cl_velocityzoom_speed;
  float autocvar_cl_velocityzoom_time;
@@@ -116,6 -117,7 +117,7 @@@ string autocvar_crosshair_hitindication
  float autocvar_crosshair_hitindication_speed;
  float autocvar_crosshair_hittest;
  float autocvar_crosshair_hittest_blur;
+ var float autocvar_crosshair_hittest_scale = 1.25;
  float autocvar_crosshair_hittest_showimpact;
  float autocvar_crosshair_per_weapon;
  float autocvar_crosshair_pickup;
@@@ -452,12 -454,4 +454,12 @@@ string autocvar__cl_playermodel
  float autocvar_cl_deathglow;
  float autocvar_developer_csqcentities;
  float autocvar_g_jetpack_attenuation;
 +var string autocvar_crosshair_hmg = ""; 
 +var vector autocvar_crosshair_hmg_color = '0.2 1.0 0.2';
 +var float autocvar_crosshair_hmg_alpha = 1;
 +var float autocvar_crosshair_hmg_size = 1;
 +var string autocvar_crosshair_rpc = ""; 
 +var vector autocvar_crosshair_rpc_color = '0.2 1.0 0.2';
 +var float autocvar_crosshair_rpc_alpha = 1;
 +var float autocvar_crosshair_rpc_size = 1;
  float autocvar_cl_nade_timer;
diff --combined qcsrc/client/hud.qc
index 216940009dfed6fa0071e0e859686803b090f8d9,7359468e0969d236738b619a367e8fa8c8553d7f..ea126f9d6d64b63c6bf64e2992775c45d99744c3
@@@ -933,16 -933,16 +933,16 @@@ void DrawAmmoItem(vector myPos, vector 
        if(currently_selected)
                drawpic_aspect_skin(myPos, "ammo_current_bg", mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
  
-     if(a > 0 && autocvar_hud_panel_ammo_progressbar)
-         HUD_Panel_DrawProgressBar(myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, autocvar_hud_panel_ammo_progressbar_name, a/autocvar_hud_panel_ammo_maxammo, 0, 0, color, autocvar_hud_progressbar_alpha * panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL);
+       if(a > 0 && autocvar_hud_panel_ammo_progressbar)
+               HUD_Panel_DrawProgressBar(myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, autocvar_hud_panel_ammo_progressbar_name, a/autocvar_hud_panel_ammo_maxammo, 0, 0, color, autocvar_hud_progressbar_alpha * panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL);
  
-     if(autocvar_hud_panel_ammo_text)
-     {
-         if(a > 0 || infinite_ammo)
-             drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL);
-         else // "ghost" ammo count
-             drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * theAlpha * 0.5, DRAWFLAG_NORMAL);
-     }
+       if(autocvar_hud_panel_ammo_text)
+       {
+               if(a > 0 || infinite_ammo)
+                       drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL);
+               else // "ghost" ammo count
+                       drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * theAlpha * 0.5, DRAWFLAG_NORMAL);
+       }
        if(a > 0 || infinite_ammo)
                drawpic_aspect_skin(picpos, GetAmmoPicture(ammotype), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL);
        else // "ghost" ammo icon
@@@ -985,7 -985,7 +985,7 @@@ void HUD_Ammo(void
        if (autocvar_hud_panel_ammo_onlycurrent)
                total_ammo_count = 1;
        else
-               total_ammo_count = AMMO_COUNT - 1; // fuel
+               total_ammo_count = AMMO_COUNT;
  
        if(draw_nades)
        {
        float i;
        float infinite_ammo = (getstati(STAT_ITEMS, 0, 24) & IT_UNLIMITED_WEAPON_AMMO);
        row = column = 0;
 +      if(!infinite_ammo)
        if(autocvar_hud_panel_ammo_onlycurrent)
        {
                if(autocvar__hud_configure)
                                TRUE,
                                infinite_ammo
                        );
+               }
  
                ++row;
                if(row >= rows)
                        row = 0;
                        column = column + 1;
                }
-               }
        }
        else
        {
                row = column = 0;
                for(i = 0; i < AMMO_COUNT; ++i)
                {
-                       if(i == 4) continue; // fuel
                        ammotype = GetAmmoFieldFromNum(i);
                        DrawAmmoItem(
                                pos + eX * column * (ammo_size_x + offset_x) + eY * row * (ammo_size_y + offset_y),
index ec5b99d73b1ffed4fc1e5161e9b379dc9e1b604e,fc769408bdf584d785a0fa0f5dd1cdb0d71ed45e..fe047e390ef7525cfb050c0019973d7dbc750ee5
@@@ -45,7 -45,6 +45,6 @@@ void Projectile_DrawTrail(vector to
        }
  }
  
- .float proj_time;
  void Projectile_Draw()
  {
        vector rot;
@@@ -54,9 -53,6 +53,6 @@@
        float drawn;
        float t;
        float a;
-       float dt = time - self.proj_time;
-       self.proj_time = time;
  
        f = self.move_flags;
  
        if(Nade_IDFromProjectile(self.cnt) != 0)
                trailorigin += v_up * 4;
  
-       if(dt > 0)
        if(drawn)
                Projectile_DrawTrail(trailorigin);
        else
@@@ -204,7 -199,6 +199,6 @@@ void Ent_Projectile(
        self.count = (f & 0x80);
        self.iflags = (self.iflags & IFLAG_INTERNALMASK) | IFLAG_AUTOANGLES | IFLAG_ANGLES | IFLAG_ORIGIN;
        self.solid = SOLID_TRIGGER;
-       self.proj_time = time;
        //self.effects = EF_NOMODELFLAGS;
  
        // this should make collisions with bmodels more exact, but it leads to
                        case PROJECTILE_BUMBLE_GUN: setmodel(self, "models/elaser.mdl");self.traileffect = particleeffectnum("TR_NEXUIZPLASMA"); break;
                        case PROJECTILE_BUMBLE_BEAM: setmodel(self, "models/elaser.mdl");self.traileffect = particleeffectnum("TR_NEXUIZPLASMA"); break;
  
 +                      case PROJECTILE_RPC: setmodel(self, "models/weapons/ok_rocket.md3");self.traileffect = particleeffectnum("TR_ROCKET"); break;
 +
                        default:
                                if(Nade_IDFromProjectile(self.cnt) != 0) { setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum(Nade_TrailEffect(self.cnt, self.team)); break; }
                                error("Received invalid CSQC projectile, can't work with this!");
                                self.move_bounce_factor = g_balance_electro_secondary_bouncefactor;
                                self.move_bounce_stopspeed = g_balance_electro_secondary_bouncestop;
                                break;
 +                      case PROJECTILE_RPC:
                        case PROJECTILE_ROCKET:
                                loopsound(self, CH_SHOTS_SINGLE, "weapons/rocket_fly.wav", VOL_BASE, ATTEN_NORM);
                                self.mins = '-3 -3 -3';
@@@ -504,7 -495,6 +498,7 @@@ void Projectile_Precache(
        precache_model("models/sphere/sphere.md3");
  
        precache_model("models/weapons/v_ok_grenade.md3");
 +      precache_model("models/weapons/ok_rocket.md3");
  
        precache_sound("weapons/electro_fly.wav");
        precache_sound("weapons/rocket_fly.wav");
index dc47dd3ae45e2b8718ef801ea36a630fc02da0a5,35a2aebd814b198243939c603beca8707a8f7f2d..3774475484541d90baa2e610ba33726f08f79c58
@@@ -501,7 -501,7 +501,7 @@@ void Send_Notification_WOCOVA
      MSG_INFO_NOTIF(1, INFO_WATERMARK,                      1, 0, "s1", "",                          "",                     _("^F3SVQC Build information: ^F4%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_ACCORDEON_MURDER,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weapontuba",             _("^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Accordeon%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_ACCORDEON_SUICIDE,             2, 1, "s1 s2loc spree_lost", "s1",                 "weapontuba",             _("^BG%s^K1 hurt their own ears with the @!#%%'n Accordeon%s%s"), "") \
-     MSG_INFO_NOTIF(1, INFO_WEAPON_ARC_MURDER,                    3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponhlac",             _("^BG%s%s^K1 was electrocuted by ^BG%s^K1's Arc%s%s"), "") \
+     MSG_INFO_NOTIF(1, INFO_WEAPON_ARC_MURDER,                    3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponarc",              _("^BG%s%s^K1 was electrocuted by ^BG%s^K1's Arc%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_BLASTER_MURDER,                3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponlaser",            _("^BG%s%s^K1 was shot to death by ^BG%s^K1's Blaster%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_BLASTER_SUICIDE,               2, 1, "s1 s2loc spree_lost", "s1",                 "weaponlaser",            _("^BG%s^K1 shot themself to hell with their Blaster%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_CRYLINK_MURDER,                3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponcrylink",          _("^BG%s%s^K1 felt the strong pull of ^BG%s^K1's Crylink%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_HAGAR_SUICIDE,                 2, 1, "s1 s2loc spree_lost", "s1",                 "weaponhagar",            _("^BG%s^K1 played with tiny Hagar rockets%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_HLAC_MURDER,                   3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponhlac",             _("^BG%s%s^K1 was cut down with ^BG%s^K1's HLAC%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_HLAC_SUICIDE,                  2, 1, "s1 s2loc spree_lost", "s1",                 "weaponhlac",             _("^BG%s^K1 got a little jumpy with their HLAC%s%s"), "") \
 +    MSG_INFO_NOTIF(1, INFO_WEAPON_HMG_MURDER_SNIPE,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponhmg",              _("^BG%s%s^K1 was sniped by ^BG%s^K1's Heavy Machine Gun%s%s"), "") \
 +    MSG_INFO_NOTIF(1, INFO_WEAPON_HMG_MURDER_SPRAY,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponhmg",              _("^BG%s%s^K1 was torn to bits by ^BG%s^K1's Heavy Machine Gun%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_HOOK_MURDER,                   3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponhook",             _("^BG%s%s^K1 was caught in ^BG%s^K1's Hook gravity bomb%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_KLEINBOTTLE_MURDER,            3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weapontuba",             _("^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Klein Bottle%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_KLEINBOTTLE_SUICIDE,           2, 1, "s1 s2loc spree_lost", "s1",                 "weapontuba",             _("^BG%s^K1 hurt their own ears with the @!#%%'n Klein Bottle%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_HAIL,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponrifle",            _("^BG%s%s^K1 died in ^BG%s^K1's Rifle bullet hail%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_HAIL_PIERCING,    3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponrifle",            _("^BG%s%s^K1 failed to hide from ^BG%s^K1's Rifle bullet hail%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_PIERCING,         3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponrifle",            _("^BG%s%s^K1 failed to hide from ^BG%s^K1's Rifle%s%s"), "") \
 +    MSG_INFO_NOTIF(1, INFO_WEAPON_RPC_MURDER_DIRECT,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponrpc",              _("^BG%s%s^K1 was sawn in half by ^BG%s^K1's Rocket Propelled Chainsaw%s%s"), "") \
 +    MSG_INFO_NOTIF(1, INFO_WEAPON_RPC_MURDER_SPLASH,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponrpc",              _("^BG%s%s^K1 almost dodged ^BG%s^K1's Rocket Propelled Chainsaw%s%s"), "") \
 +    MSG_INFO_NOTIF(1, INFO_WEAPON_RPC_SUICIDE_DIRECT,            2, 1, "s1 s2loc spree_lost", "s1",                 "weaponrpc",              _("^BG%s^K1 was sawn in half by their own Rocket Propelled Chainsaw%s%s"), "") \
 +    MSG_INFO_NOTIF(1, INFO_WEAPON_RPC_SUICIDE_SPLASH,            2, 1, "s1 s2loc spree_lost", "s1",                 "weaponrpc",              _("^BG%s^K1 blew themself up with their Rocket Propelled Chainsaw%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_SEEKER_MURDER_SPRAY,           3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponseeker",           _("^BG%s%s^K1 was pummeled by ^BG%s^K1's Seeker rockets%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_SEEKER_MURDER_TAG,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponseeker",           _("^BG%s%s^K1 was tagged by ^BG%s^K1's Seeker%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_WEAPON_SEEKER_SUICIDE,                2, 1, "s1 s2loc spree_lost", "s1",                 "weaponseeker",           _("^BG%s^K1 played with tiny Seeker rockets%s%s"), "") \
      MSG_CENTER_NOTIF(1, CENTER_POWERUP_SPEED,               0, 0, "",              CPID_POWERUP,          "0 0", _("^F2You are on speed"), "") \
      MSG_CENTER_NOTIF(1, CENTER_POWERUP_STRENGTH,            0, 0, "",              CPID_POWERUP,          "0 0", _("^F2Strength infuses your weapons with devastating power"), "") \
      MSG_CENTER_NOTIF(1, CENTER_RACE_FINISHLAP,              0, 0, "",              CPID_RACE_FINISHLAP,   "0 0", _("^F2The race is over, finish your lap!"), "") \
 +    MSG_CENTER_NOTIF(1, CENTER_SECONDARY_NODAMAGE,          0, 0, "",              NO_CPID,               "0 0", _("^BGSecondary fire inflicts no damage!"), "") \
      MSG_CENTER_NOTIF(1, CENTER_SEQUENCE_COMPLETED,          0, 0, "",              NO_CPID,               "0 0", _("^BGSequence completed!"), "") \
      MSG_CENTER_NOTIF(1, CENTER_SEQUENCE_COUNTER,            0, 0, "",              NO_CPID,               "0 0", _("^BGThere are more to go..."), "") \
      MSG_CENTER_NOTIF(1, CENTER_SEQUENCE_COUNTER_FEWMORE,    0, 1, "f1",            NO_CPID,               "0 0", _("^BGOnly %s^BG more to go..."), "") \
      MSG_MULTI_NOTIF(1, WEAPON_HAGAR_SUICIDE,                 NO_MSG,        INFO_WEAPON_HAGAR_SUICIDE,                 CENTER_DEATH_SELF_GENERIC) \
      MSG_MULTI_NOTIF(1, WEAPON_HLAC_MURDER,                   NO_MSG,        INFO_WEAPON_HLAC_MURDER,                   NO_MSG) \
      MSG_MULTI_NOTIF(1, WEAPON_HLAC_SUICIDE,                  NO_MSG,        INFO_WEAPON_HLAC_SUICIDE,                  CENTER_DEATH_SELF_GENERIC) \
 +    MSG_MULTI_NOTIF(1, WEAPON_HMG_MURDER_SNIPE,              NO_MSG,        INFO_WEAPON_HMG_MURDER_SNIPE,              NO_MSG) \
 +    MSG_MULTI_NOTIF(1, WEAPON_HMG_MURDER_SPRAY,              NO_MSG,        INFO_WEAPON_HMG_MURDER_SPRAY,              NO_MSG) \
      MSG_MULTI_NOTIF(1, WEAPON_HOOK_MURDER,                   NO_MSG,        INFO_WEAPON_HOOK_MURDER,                   NO_MSG) \
      MSG_MULTI_NOTIF(1, WEAPON_KLEINBOTTLE_MURDER,            NO_MSG,        INFO_WEAPON_KLEINBOTTLE_MURDER,            NO_MSG) \
      MSG_MULTI_NOTIF(1, WEAPON_KLEINBOTTLE_SUICIDE,           NO_MSG,        INFO_WEAPON_KLEINBOTTLE_SUICIDE,           CENTER_DEATH_SELF_GENERIC) \
      MSG_MULTI_NOTIF(1, WEAPON_RIFLE_MURDER_HAIL,             NO_MSG,        INFO_WEAPON_RIFLE_MURDER_HAIL,             NO_MSG) \
      MSG_MULTI_NOTIF(1, WEAPON_RIFLE_MURDER_HAIL_PIERCING,    NO_MSG,        INFO_WEAPON_RIFLE_MURDER_HAIL_PIERCING,    NO_MSG) \
      MSG_MULTI_NOTIF(1, WEAPON_RIFLE_MURDER_PIERCING,         NO_MSG,        INFO_WEAPON_RIFLE_MURDER_PIERCING,         NO_MSG) \
 +    MSG_MULTI_NOTIF(1, WEAPON_RPC_MURDER_DIRECT,             NO_MSG,        INFO_WEAPON_RPC_MURDER_DIRECT,             NO_MSG) \
 +    MSG_MULTI_NOTIF(1, WEAPON_RPC_MURDER_SPLASH,             NO_MSG,        INFO_WEAPON_RPC_MURDER_SPLASH,             NO_MSG) \
 +    MSG_MULTI_NOTIF(1, WEAPON_RPC_SUICIDE_DIRECT,            NO_MSG,        INFO_WEAPON_RPC_SUICIDE_DIRECT,            NO_MSG) \
 +    MSG_MULTI_NOTIF(1, WEAPON_RPC_SUICIDE_SPLASH,            NO_MSG,        INFO_WEAPON_RPC_SUICIDE_SPLASH,            CENTER_DEATH_SELF_GENERIC) \
      MSG_MULTI_NOTIF(1, WEAPON_SEEKER_MURDER_SPRAY,           NO_MSG,        INFO_WEAPON_SEEKER_MURDER_SPRAY,           NO_MSG) \
      MSG_MULTI_NOTIF(1, WEAPON_SEEKER_MURDER_TAG,             NO_MSG,        INFO_WEAPON_SEEKER_MURDER_TAG,             NO_MSG) \
      MSG_MULTI_NOTIF(1, WEAPON_SEEKER_SUICIDE,                NO_MSG,        INFO_WEAPON_SEEKER_SUICIDE,                CENTER_DEATH_SELF_GENERIC) \
index c276a2cd2efd8b41f4a3f88f67e64315c346311c,3bc8fba3a4b467971025c6570e68e0ffdad65202..9e8969ac0f77126ba163a16c7734685050356f8a
@@@ -7,7 -7,7 +7,7 @@@ CLASS(XonoticMutatorsDialog) EXTENDS(Xo
        ATTRIB(XonoticMutatorsDialog, title, string, _("Mutators"))
        ATTRIB(XonoticMutatorsDialog, color, vector, SKINCOLOR_DIALOG_MUTATORS)
        ATTRIB(XonoticMutatorsDialog, intendedWidth, float, 0.9)
-       ATTRIB(XonoticMutatorsDialog, rows, float, 19)
+       ATTRIB(XonoticMutatorsDialog, rows, float, 20)
        ATTRIB(XonoticMutatorsDialog, columns, float, 6)
        ATTRIB(XonoticMutatorsDialog, refilterEntity, entity, NULL)
  ENDCLASS(XonoticMutatorsDialog)
@@@ -98,8 -98,6 +98,8 @@@ string XonoticMutatorsDialog_toString(e
                s = strcat(s, ", ", _("Blood loss"));
        if(cvar("g_jetpack"))
                s = strcat(s, ", ", _("Jet pack"));
 +      if(cvar("g_overkill"))
 +              s = strcat(s, ", ", _("Overkill"));
        if(cvar("g_powerups") == 0)
                s = strcat(s, ", ", _("No powerups"));
        if(cvar("g_powerups") > 0)
@@@ -255,9 -253,6 +255,9 @@@ void XonoticMutatorsDialog_fill(entity 
                me.TDempty(me, 0.2);
                me.TD(me, 1, 1.8, e = makeXonoticRadioButton(1, "g_instagib", "1", _("InstaGib")));
                        e.cvarOffValue = "0";
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_overkill", "1", _("Overkill")));
        me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 1.8, e = makeXonoticRadioButton(1, "g_nix", "1", _("NIX")));
index f20f07047af715517e226dcad8c7f8090bedfc27,4b9468552db2ce915736e5321ff8d27da540d3ef..d3003d7c4656b5fad4268b08b054a276327b5201
@@@ -64,7 -64,6 +64,6 @@@ float autocvar_bot_wander_enable
  float autocvar_captureleadlimit_override;
  #define autocvar_capturelimit_override cvar("capturelimit_override")
  #define autocvar_developer cvar("developer")
- float autocvar_developer_fteqccbugs;
  float autocvar_ekg;
  #define autocvar_fraglimit cvar("fraglimit")
  #define autocvar_fraglimit_override cvar("fraglimit_override")
@@@ -447,7 -446,6 +446,6 @@@ float autocvar_g_pickup_shells_max
  float autocvar_g_player_alpha;
  float autocvar_g_player_brightness;
  float autocvar_g_playerclip_collisions;
- string autocvar_g_playerstats_uri;
  float autocvar_g_powerups;
  float autocvar_g_projectiles_damage;
  float autocvar_g_projectiles_keep_owner;
@@@ -839,13 -837,6 +837,13 @@@ float autocvar_g_campcheck_damage
  float autocvar_g_campcheck_distance;
  float autocvar_g_campcheck_interval;
  float autocvar_g_jump_grunt;
 +float autocvar_g_overkill_powerups_replace;
 +float autocvar_g_overkill_superguns_respawn_time;
 +float autocvar_g_overkill_100h_anyway;
 +float autocvar_g_overkill_100a_anyway;
 +float autocvar_g_overkill_ammo_charge;
 +float autocvar_g_overkill_ammo_charge_notice;
 +float autocvar_g_overkill_ammo_charge_limit;
  float autocvar_g_spawn_near_teammate_distance;
  float autocvar_g_spawn_near_teammate_ignore_spawnpoint;
  float autocvar_g_spawn_near_teammate_ignore_spawnpoint_delay;
diff --combined qcsrc/server/defs.qh
index 14e524361574933419a563ab07240f7e70ac3a54,ab4dee3185ff06a02cff82b50c3a177d34b1021c..647030620b52cd5d470fcb67445d50da91850bae
@@@ -568,7 -568,6 +568,7 @@@ float serverflags
  .float team_forced; // can be a team number to force a team, or 0 for default action, or -1 for forced spectator
  
  .float player_blocked;
 +.float weapon_blocked; // weapon use disabled
  
  .float frozen; // for freeze attacks
  .float revive_progress;
@@@ -607,3 -606,12 +607,12 @@@ string modname
  #define MISSILE_IS_CONFUSABLE(m) ((m.missile_flags & MIF_GUIDED_CONFUSABLE) ? TRUE : FALSE)
  #define MISSILE_IS_GUIDED(m) ((m.missile_flags & MIF_GUIDED_ALL) ? TRUE : FALSE)
  #define MISSILE_IS_TRACKING(m) ((m.missile_flags & MIF_GUIDED_TRACKING) ? TRUE : FALSE)
+ ////
+ .entity player_stats;
+ //.float playerid;
+ .string playernick;
+ .float elos;
+ .float ranks;
diff --combined qcsrc/server/g_damage.qc
index 7c4b01c2d45ebae7b4b224bb561b9b764bf1aaab,28a1c8e8ca23e760a6d5a966899747be9be04ceb..4840e15dd25d6916239fb221de8fbd721d47cec0
@@@ -99,7 -99,7 +99,7 @@@ void GiveFrags (entity attacker, entit
                // regular frag
                PlayerScore_Add(attacker, SP_KILLS, 1);
                if(targ.playerid)
-                       PlayerStats_Event(attacker, sprintf("kills-%d", targ.playerid), 1);
+                       PS_GR_P_ADDVAL(attacker, sprintf("kills-%d", targ.playerid), 1);
        }
  
        PlayerScore_Add(targ, SP_DEATHS, 1);
@@@ -419,7 -419,7 +419,7 @@@ void Obituary(entity attacker, entity i
                                case counta: \
                                { \
                                        Send_Notification(NOTIF_ONE, attacker, MSG_ANNCE, ANNCE_KILLSTREAK_##countb); \
-                                       PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_##counta, 1); \
+                                       PS_GR_P_ADDVAL(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_##counta, 1); \
                                        break; \
                                }
                        switch(attacker.killcount)
                        {
                                checkrules_firstblood = TRUE;
                                notif_firstblood = TRUE; // modify the current messages so that they too show firstblood information
-                               PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD, 1);
-                               PlayerStats_Event(targ, PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM, 1);
+                               PS_GR_P_ADDVAL(attacker, PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD, 1);
+                               PS_GR_P_ADDVAL(targ, PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM, 1);
  
                                // tell spree_inf and spree_cen that this is a first-blood and first-victim event
                                kill_count_to_attacker = -1;
                if(PlayerScore_Add(targ, SP_SCORE, 0) == -5)
                {
                        Send_Notification(NOTIF_ONE, targ, MSG_ANNCE, ANNCE_ACHIEVEMENT_BOTLIKE);
-                       PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_BOTLIKE, 1);
+                       PS_GR_P_ADDVAL(attacker, PLAYERSTATS_ACHIEVEMENT_BOTLIKE, 1);
                }
        }
  
@@@ -727,7 -727,7 +727,7 @@@ void Damage (entity targ, entity inflic
                                                                attacker.dmg_take += v_x;
                                                                attacker.dmg_save += v_y;
                                                                attacker.dmg_inflictor = inflictor;
-                                                               mirrordamage = v_z; // = 0, to make fteqcc stfu
+                                                               mirrordamage = v_z;
                                                                mirrorforce = 0;
                                                        }
  
        // apply push
        if (self.damageforcescale)
        if (vlen(force))
 -      if (!IS_PLAYER(self) || time >= self.spawnshieldtime)
 +      if (!IS_PLAYER(self) || time >= self.spawnshieldtime || self == attacker)
        {
                vector farce = damage_explosion_calcpush(self.damageforcescale * force, self.velocity, autocvar_g_balance_damagepush_speedfactor);
                if(self.movetype == MOVETYPE_PHYSICS)
index 41de5a1b2a56a66ef282d8280acd671441cd5f7f,cd0ebdd0f052f7bb6cbdeea5e277094d0e02a257..4200b2207a9c5872def34c817b6efd3e772ae234
@@@ -253,7 -253,7 +253,7 @@@ MUTATOR_HOOKFUNCTION(instagib_PlayerDam
                                
                                if(frag_target != frag_attacker)
                                {
 -                                      if(frag_target.health > 0) { Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_INSTAGIB_SECONDARY); }
 +                                      if(frag_target.health > 0) { Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_SECONDARY_NODAMAGE); }
                                        frag_force = '0 0 0';
                                }
                        }
  
  MUTATOR_HOOKFUNCTION(instagib_SetStartItems)
  {
-       start_ammo_cells = cvar("g_instagib_ammo_start");
+       start_health       = warmup_start_health       = 100;
+       start_armorvalue   = warmup_start_armorvalue   = 0;
  
-       start_health = 100;
-       start_armorvalue = 0;
-       start_weapons = WEPSET_VAPORIZER;
-       warmup_start_weapons = WEPSET_VAPORIZER;
+       start_ammo_shells  = warmup_start_ammo_shells  = 0;
+       start_ammo_nails   = warmup_start_ammo_nails   = 0;
+       start_ammo_cells   = warmup_start_ammo_cells   = cvar("g_instagib_ammo_start");
+       start_ammo_plasma  = warmup_start_ammo_plasma  = 0;
+       start_ammo_rockets = warmup_start_ammo_rockets = 0;
+       start_ammo_fuel    = warmup_start_ammo_fuel    = 0;
+       start_weapons = warmup_start_weapons = WEPSET_VAPORIZER;
        start_items |= IT_UNLIMITED_SUPERWEAPONS;
  
        return FALSE;