]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into Mario/mutator_minstagib
authorMario <mario.mario@y7mail.com>
Tue, 9 Apr 2013 00:39:58 +0000 (10:39 +1000)
committerMario <mario.mario@y7mail.com>
Tue, 9 Apr 2013 00:39:58 +0000 (10:39 +1000)
1  2 
qcsrc/server/autocvars.qh
qcsrc/server/cl_client.qc
qcsrc/server/cl_physics.qc
qcsrc/server/cl_player.qc
qcsrc/server/cl_weaponsystem.qc
qcsrc/server/g_damage.qc
qcsrc/server/g_world.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/base.qh
qcsrc/server/progs.src
qcsrc/server/teamplay.qc

index 98f2d2f59986d0dbe203046b9f90db4a83f09255,1febc23d26801842d3f916d02357612009789d63..73e071af017882a8f1e4e805eefd5abcedb51ed6
@@@ -178,16 -178,6 +178,6 @@@ float autocvar_g_balance_crylink_second
  float autocvar_g_balance_crylink_secondary_spreadtype;
  float autocvar_g_balance_crylink_reload_ammo;
  float autocvar_g_balance_crylink_reload_time;
- float autocvar_g_balance_curse_empathy_minhealth;
- float autocvar_g_balance_curse_empathy_takedamage;
- float autocvar_g_balance_curse_slow_atkrate;
- float autocvar_g_balance_curse_slow_highspeed;
- float autocvar_g_balance_curse_venom_hpmod;
- float autocvar_g_balance_curse_venom_limitmod;
- float autocvar_g_balance_curse_venom_rotrate;
- float autocvar_g_balance_curse_vulner_takedamage;
- float autocvar_g_balance_curse_weak_damage;
- float autocvar_g_balance_curse_weak_force;
  float autocvar_g_balance_damagepush_speedfactor;
  float autocvar_g_balance_electro_combo_comboradius;
  float autocvar_g_balance_electro_combo_damage;
@@@ -593,26 -583,6 +583,6 @@@ float autocvar_g_balance_rocketlauncher
  float autocvar_g_balance_rocketlauncher_speedstart;
  float autocvar_g_balance_rocketlauncher_reload_ammo;
  float autocvar_g_balance_rocketlauncher_reload_time;
- float autocvar_g_balance_rune_defense_combo_takedamage;
- float autocvar_g_balance_rune_defense_takedamage;
- float autocvar_g_balance_rune_regen_combo_hpmod;
- float autocvar_g_balance_rune_regen_combo_limitmod;
- float autocvar_g_balance_rune_regen_combo_regenrate;
- float autocvar_g_balance_rune_regen_combo_rotrate;
- float autocvar_g_balance_rune_regen_hpmod;
- float autocvar_g_balance_rune_regen_limitmod;
- float autocvar_g_balance_rune_regen_regenrate;
- float autocvar_g_balance_rune_speed_atkrate;
- float autocvar_g_balance_rune_speed_combo_atkrate;
- float autocvar_g_balance_rune_speed_combo_highspeed;
- float autocvar_g_balance_rune_speed_highspeed;
- float autocvar_g_balance_rune_strength_combo_damage;
- float autocvar_g_balance_rune_strength_combo_force;
- float autocvar_g_balance_rune_strength_damage;
- float autocvar_g_balance_rune_strength_force;
- float autocvar_g_balance_rune_vampire_absorb;
- float autocvar_g_balance_rune_vampire_combo_absorb;
- float autocvar_g_balance_rune_vampire_maxhealth;
  float autocvar_g_balance_seeker_type;
  float autocvar_g_balance_seeker_flac_ammo;
  float autocvar_g_balance_seeker_flac_animtime;
@@@ -919,7 -889,7 +889,7 @@@ float autocvar_g_maxspeed
  float autocvar_g_midair_shieldtime;
  #define autocvar_g_minstagib cvar("g_minstagib")
  float autocvar_g_minstagib_ammo_drop;
 -float autocvar_g_minstagib_extralives;
 +//float autocvar_g_minstagib_extralives;
  float autocvar_g_minstagib_speed_highspeed;
  #define autocvar_g_mirrordamage cvar("g_mirrordamage")
  #define autocvar_g_mirrordamage_virtual cvar("g_mirrordamage_virtual")
@@@ -986,21 -956,6 +956,6 @@@ float autocvar_g_respawn_ghosts
  float autocvar_g_respawn_ghosts_maxtime;
  float autocvar_g_respawn_ghosts_speed;
  float autocvar_g_respawn_waves;
- float autocvar_g_runematch_allow_same;
- float autocvar_g_runematch_drop_runes_max;
- float autocvar_g_runematch_fixedspawns;
- float autocvar_g_runematch_frags_killed_runeholder;
- float autocvar_g_runematch_frags_killedby_runeholder;
- float autocvar_g_runematch_frags_norune;
- float autocvar_g_runematch_point_leadlimit;
- #define autocvar_g_runematch_point_limit cvar("g_runematch_point_limit")
- float autocvar_g_runematch_pointamt;
- float autocvar_g_runematch_pointrate;
- float autocvar_g_runematch_respawntime;
- float autocvar_g_runematch_rune_alpha;
- float autocvar_g_runematch_rune_color_strength;
- float autocvar_g_runematch_rune_effects;
- float autocvar_g_runematch_shuffletime;
  float autocvar_g_running_guns;
  float autocvar_g_shootfromcenter;
  float autocvar_g_shootfromclient;
index a2ee7ece342a143758f54fb732510cb8b203943e,4c7d5c57564d8f7b674c610629e45faac08ab7b7..671771bcb37e580f6e77780ce36123e1f1d95763
@@@ -401,9 -401,10 +401,8 @@@ void PutObserverInServer (void
                WriteEntity(MSG_ONE, self);
        }
  
-       DropAllRunes(self);
        MUTATOR_CALLHOOK(MakePlayerObserver);
  
 -      minstagib_stop_countdown(self);
 -
        Portal_ClearAll(self);
        
        if(self.alivetime)
        self.think = func_null;
        self.nextthink = 0;
        self.hook_time = 0;
-       self.runes = 0;
        self.deadflag = DEAD_NO;
        self.angles = spot.angles;
        self.angles_z = 0;
@@@ -721,7 -721,10 +719,7 @@@ void PutClientInServer (void
                if(autocvar__notarget)
                        self.flags |= FL_NOTARGET;
                self.takedamage = DAMAGE_AIM;
 -              if(g_minstagib)
 -                      self.effects = EF_FULLBRIGHT;
 -              else
 -                      self.effects = 0;
 +              self.effects = 0;
                self.effects |= EF_TELEPORT_BIT | EF_RESTARTANIM_BIT;
                self.air_finished = time + 12;
                self.dmg = 2;
  
                self.metertime = 0;
  
-               self.runes = 0;
                self.deadflag = DEAD_NO;
  
                self.angles = spot.angles;
@@@ -1632,7 -1633,6 +1628,6 @@@ void ClientDisconnect (void
                
        Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_QUIT_DISCONNECT, self.netname);
  
-       DropAllRunes(self);
        MUTATOR_CALLHOOK(ClientDisconnect);
  
        Portal_ClearAll(self);
@@@ -1789,7 -1789,55 +1784,7 @@@ void player_powerups (void
        Fire_ApplyDamage(self);
        Fire_ApplyEffect(self);
  
 -      if (g_minstagib)
 -      {
 -              self.effects |= EF_FULLBRIGHT;
 -
 -              if (self.items & IT_STRENGTH)
 -              {
 -                      play_countdown(self.strength_finished, "misc/poweroff.wav");
 -                      if (time > self.strength_finished)
 -                      {
 -                              self.alpha = default_player_alpha;
 -                              self.exteriorweaponentity.alpha = default_weapon_alpha;
 -                              self.items &~= IT_STRENGTH;
 -                              //Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERDOWN_INVISIBILITY, self.netname);
 -                              Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_INVISIBILITY);
 -                      }
 -              }
 -              else
 -              {
 -                      if (time < self.strength_finished)
 -                      {
 -                              self.alpha = g_minstagib_invis_alpha;
 -                              self.exteriorweaponentity.alpha = g_minstagib_invis_alpha;
 -                              self.items |= IT_STRENGTH;
 -                              Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_INVISIBILITY, self.netname);
 -                              Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_INVISIBILITY);
 -                      }
 -              }
 -
 -              if (self.items & IT_INVINCIBLE)
 -              {
 -                      play_countdown(self.invincible_finished, "misc/poweroff.wav");
 -                      if (time > self.invincible_finished)
 -                      {
 -                              self.items = self.items - (self.items & IT_INVINCIBLE);
 -                              //Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERDOWN_SPEED, self.netname);
 -                              Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_SPEED);
 -                      }
 -              }
 -              else
 -              {
 -                      if (time < self.invincible_finished)
 -                      {
 -                              self.items = self.items | IT_INVINCIBLE;
 -                              Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_SPEED, self.netname);
 -                              Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_SPEED);
 -                      }
 -              }
 -      }
 -      else // if we're not in minstagib, continue. I added this else to replace the "return" which was here that broke the callhook for this function -- This code is nasty.
 +      if not(g_minstagib)
        {
                if (self.items & IT_STRENGTH)
                {
@@@ -1958,32 -2006,6 +1953,6 @@@ void player_regen (void
  
        max_mod = regen_mod = rot_mod = limit_mod = 1;
  
-       if (self.runes & RUNE_REGEN)
-       {
-               if (self.runes & CURSE_VENOM) // do we have both rune/curse?
-               {
-                       regen_mod = autocvar_g_balance_rune_regen_combo_regenrate;
-                       max_mod = autocvar_g_balance_rune_regen_combo_hpmod;
-                       limit_mod = autocvar_g_balance_rune_regen_combo_limitmod;
-               }
-               else
-               {
-                       regen_mod = autocvar_g_balance_rune_regen_regenrate;
-                       max_mod = autocvar_g_balance_rune_regen_hpmod;
-                       limit_mod = autocvar_g_balance_rune_regen_limitmod;
-               }
-       }
-       else if (self.runes & CURSE_VENOM)
-       {
-               max_mod = autocvar_g_balance_curse_venom_hpmod;
-               if (self.runes & RUNE_REGEN) // do we have both rune/curse?
-                       rot_mod = autocvar_g_balance_rune_regen_combo_rotrate;
-               else
-                       rot_mod = autocvar_g_balance_curse_venom_rotrate;
-               limit_mod = autocvar_g_balance_curse_venom_limitmod;
-               //if (!self.runes & RUNE_REGEN)
-               //      rot_mod = autocvar_g_balance_curse_venom_rotrate;
-       }
        maxh = maxh * max_mod;
        //maxa = maxa * max_mod;
        //maxf = maxf * max_mod;
@@@ -2620,6 -2642,9 +2589,6 @@@ void PlayerPreThink (void
                        player_powerups();
                }
  
 -              if (g_minstagib)
 -                      minstagib_ammocheck();
 -
                if (self.deadflag != DEAD_NO)
                {
                        float button_pressed, force_respawn;
index 547789b44ac290751971b7d7e65a05c4835a359e,6ddf7b69ed806e75bf81c1cea5de0307176a03b6..f8012814b25f78644fa29150b2bc4985815c0917
@@@ -704,26 -704,14 +704,12 @@@ void SV_PlayerPhysics(
        WarpZone_PlayerPhysics_FixVAngle();
        
        maxspd_mod = 1;
 -      if(g_minstagib && (self.items & IT_INVINCIBLE))
 -              maxspd_mod *= autocvar_g_minstagib_speed_highspeed;
        if(self.ballcarried)
                if(g_nexball)
                        maxspd_mod *= autocvar_g_nexball_basketball_carrier_highspeed;
                else if(g_keepaway)
                        maxspd_mod *= autocvar_g_keepaway_ballcarrier_highspeed;
  
-       if(g_runematch)
-       {
-               if(self.runes & RUNE_SPEED)
-               {
-                       if(self.runes & CURSE_SLOW)
-                               maxspd_mod *= autocvar_g_balance_rune_speed_combo_highspeed;
-                       else
-                               maxspd_mod *= autocvar_g_balance_rune_speed_highspeed;
-               }
-               else if(self.runes & CURSE_SLOW)
-               {
-                       maxspd_mod *= autocvar_g_balance_curse_slow_highspeed;
-               }
-       }
        maxspd_mod *= autocvar_g_movement_highspeed;
  
        // fix physics stats for g_movement_highspeed
index cfa4ca4c75608ca3c645d6e000232b3f61b3654c,944db7e5b8b07dd7588c90679c5ad0ba1b872a12..4a5c8a00d2d4866e27f44f598ef3ba9e9942ae0b
@@@ -262,6 -262,10 +262,6 @@@ void player_anim (void
  
  void SpawnThrownWeapon (vector org, float w)
  {
 -      if(g_minstagib)
 -      if(self.ammo_cells <= 0)
 -              return;
 -
        if(g_pinata)
        {
                float j;
@@@ -387,10 -391,17 +387,10 @@@ void PlayerDamage (entity inflictor, en
        else
                Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);
  
 -      if (!g_minstagib)
 -      {
 -              v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, damage);
 -              take = v_x;
 -              save = v_y;
 -      }
 -      else
 -      {
 -              save = 0;
 -              take = damage;
 -      }
 +
 +      v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, damage);
 +      take = v_x;
 +      save = v_y;
  
        if(attacker == self)
        {
                // print an obituary message
                Obituary (attacker, inflictor, self, deathtype);
                race_PreDie();
-               DropAllRunes(self);
  
          // increment frag counter for used weapon type
          float w;
  
                if(clienttype(self) == CLIENTTYPE_REAL)
                {
-                       stuffcmd(self, "-zoom\n");
                        self.fixangle = TRUE;
                        //msg_entity = self;
                        //WriteByte (MSG_ONE, SVC_SETANGLE);
index cb62a44c5bfc3f5342438f82364cb5bc2961965e,afabe1820284522acf4d4dc0211d610d277de559..f84538d769d4f9e22a06c462b71cb65313a09b83
@@@ -14,21 -14,6 +14,6 @@@ float W_WeaponRateFactor(
        float t;
        t = 1.0 / g_weaponratefactor;
  
-       if(g_runematch)
-       {
-               if(self.runes & RUNE_SPEED)
-               {
-                       if(self.runes & CURSE_SLOW)
-                               t = t * autocvar_g_balance_rune_speed_combo_atkrate;
-                       else
-                               t = t * autocvar_g_balance_rune_speed_atkrate;
-               }
-               else if(self.runes & CURSE_SLOW)
-               {
-                       t = t * autocvar_g_balance_curse_slow_atkrate;
-               }
-       }
        return t;
  }
  
@@@ -132,10 -117,8 +117,10 @@@ vector w_shotend
  .float prevstrengthsoundattempt;
  void W_PlayStrengthSound(entity player) // void W_PlayStrengthSound
  {
 -              if((!g_minstagib)
 -                      && (player.items & IT_STRENGTH)
 +      if(MUTATOR_CALLHOOK(PlayStrengthSound))
 +              return;
 +              
 +              if((player.items & IT_STRENGTH)
                        && ((time > player.prevstrengthsound + autocvar_sv_strengthsound_antispam_time) // prevent insane sound spam
                        || (time > player.prevstrengthsoundattempt + autocvar_sv_strengthsound_antispam_refire_threshold)))
                {
diff --combined qcsrc/server/g_damage.qc
index 77f615788c562f60bf3d00f48f53ac5293661206,29eed9af8cf5aecd2d3ebbe65597a86eb711e8ab..593aaf7e378e889889e601a266aa58ab67be4239
@@@ -186,11 -186,7 +186,7 @@@ void GiveFrags (entity attacker, entit
        else
        {
                self = oldself;
-               if(g_runematch)
-               {
-                       f = RunematchHandleFrags(attacker, targ, f);
-               }
-               else if(g_lms)
+               if(g_lms)
                {
                        // remove a life
                        float tl;
@@@ -235,8 -231,6 +231,6 @@@ string AppendItemcodes(string s, entit
                s = strcat(s, "T");
        if(player.kh_next)
                s = strcat(s, "K");
-       if(player.runes)
-               s = strcat(s, "|", ftos(player.runes));
        return s;
  }
  
@@@ -666,7 -660,12 +660,7 @@@ void Damage (entity targ, entity inflic
                                                        if(complainteamdamage > 0 && !g_ca) // FIXME why is g_ca ruled out here? Why not just g_mirrordamage 0 on CA servers?
                                                                mirrordamage = autocvar_g_mirrordamage * complainteamdamage;
                                                        mirrorforce = autocvar_g_mirrordamage * vlen(force);
 -                                                      if(g_minstagib)
 -                                                      {
 -                                                              if(autocvar_g_friendlyfire == 0)
 -                                                                      damage = 0;
 -                                                      }
 -                                                      else if(g_ca)
 +                                                      if(g_ca)
                                                                damage = 0;
                                                        else
                                                                damage = autocvar_g_friendlyfire * damage;
                        attacker.lms_traveled_distance = autocvar_g_lms_campcheck_distance;
                }
  
 -              if(targ.classname == "player")
 -              if (g_minstagib)
 -              {
 -                      if ((deathtype == DEATH_FALL)  ||
 -                              (deathtype == DEATH_DROWN) ||
 -                              (deathtype == DEATH_SLIME) ||
 -                              (deathtype == DEATH_LAVA)  ||
 -                              (!DEATH_ISWEAPON(deathtype, WEP_LASER) && damage > 0 && damage < 100))
 -                      {
 -                              self = oldself;
 -                              return;
 -                      }
 -                      if(damage > 0)
 -                          damage = 10000;
 -                      if (targ.armorvalue && (deathtype == WEP_MINSTANEX) && damage)
 -                      {
 -                              targ.armorvalue -= 1;
 -                              centerprint(targ, strcat("^3Remaining extra lives: ",ftos(targ.armorvalue)));
 -                              damage = 0;
 -                              targ.hitsound += 1;
 -                              attacker.hitsound += 1; // TODO change this to a future specific hitsound for armor hit
 -                      }
 -                      if (DEATH_ISWEAPON(deathtype, WEP_LASER))
 -                      {
 -                              damage = 0;
 -                              mirrordamage = 0;
 -                              complainteamdamage = 0;
 -                              if (targ != attacker)
 -                              {
 -                                      if ((targ.health >= 1) && (targ.classname == "player"))
 -                                              centerprint(attacker, "Secondary fire inflicts no damage!");
 -                                      force = '0 0 0';
 -                                      // keep mirrorforce
 -                                      attacker = targ;
 -                              }
 -                      }
 -              }
 -
                if not(DEATH_ISSPECIAL(deathtype))
                {
                        damage *= g_weapondamagefactor;
                frag_damage = damage;
                frag_force = force;
          frag_deathtype = deathtype;
 +              frag_mirrordamage = mirrordamage;
                MUTATOR_CALLHOOK(PlayerDamage_Calculate);
                damage = frag_damage;
 +              mirrordamage = frag_mirrordamage;
                force = frag_force;
                
 -              // apply strength multiplier
 -              if ((attacker.items & IT_STRENGTH) && !g_minstagib)
 +              if not(g_minstagib)
                {
 -                      if(targ == attacker)
 +                      // apply strength multiplier
 +                      if (attacker.items & IT_STRENGTH)
                        {
 -                              damage = damage * autocvar_g_balance_powerup_strength_selfdamage;
 -                              force = force * autocvar_g_balance_powerup_strength_selfforce;
 -                      }
 -                      else
 -                      {
 -                              damage = damage * autocvar_g_balance_powerup_strength_damage;
 -                              force = force * autocvar_g_balance_powerup_strength_force;
 +                              if(targ == attacker)
 +                              {
 +                                      damage = damage * autocvar_g_balance_powerup_strength_selfdamage;
 +                                      force = force * autocvar_g_balance_powerup_strength_selfforce;
 +                              }
 +                              else
 +                              {
 +                                      damage = damage * autocvar_g_balance_powerup_strength_damage;
 +                                      force = force * autocvar_g_balance_powerup_strength_force;
 +                              }
                        }
 -              }
  
 -              // apply invincibility multiplier
 -              if (targ.items & IT_INVINCIBLE && !g_minstagib)
 -                      damage = damage * autocvar_g_balance_powerup_invincible_takedamage;
 +                      // apply invincibility multiplier
 +                      if (targ.items & IT_INVINCIBLE)
 +                              damage = damage * autocvar_g_balance_powerup_invincible_takedamage;
 +              }
  
                if (targ == attacker)
                {
                                damage = damage * autocvar_g_balance_selfdamagepercent; // Partial damage if the attacker hits himself
                }
  
-               if(g_runematch)
-               {
-                       // apply strength rune
-                       if (attacker.runes & RUNE_STRENGTH)
-                       {
-                               if(attacker.runes & CURSE_WEAK) // have both curse & rune
-                               {
-                                       damage = damage * autocvar_g_balance_rune_strength_combo_damage;
-                                       force = force * autocvar_g_balance_rune_strength_combo_force;
-                               }
-                               else
-                               {
-                                       damage = damage * autocvar_g_balance_rune_strength_damage;
-                                       force = force * autocvar_g_balance_rune_strength_force;
-                               }
-                       }
-                       else if (attacker.runes & CURSE_WEAK)
-                       {
-                               damage = damage * autocvar_g_balance_curse_weak_damage;
-                               force = force * autocvar_g_balance_curse_weak_force;
-                       }
-                       // apply defense rune
-                       if (targ.runes & RUNE_DEFENSE)
-                       {
-                               if (targ.runes & CURSE_VULNER) // have both curse & rune
-                                       damage = damage * autocvar_g_balance_rune_defense_combo_takedamage;
-                               else
-                                       damage = damage * autocvar_g_balance_rune_defense_takedamage;
-                       }
-                       else if (targ.runes & CURSE_VULNER)
-                               damage = damage * autocvar_g_balance_curse_vulner_takedamage;
-               }
                // count the damage
                if(attacker)
                if(!targ.deadflag)
                                                if not(DEATH_ISSPECIAL(deathtype))
                                                {
                                                        if(targ.classname == "player") // don't do this for vehicles
 -                                                      if(!g_minstagib)
                                                        if(IsFlying(victim))
                                                                yoda = 1;
 -
 -                                                      if(g_minstagib)
 -                                                      if(victim.items & IT_STRENGTH)
 -                                                              yoda = 1;
                                                }
                                        }
                                }
                self.event_damage (inflictor, attacker, damage, deathtype, hitloc, force);
        self = oldself;
  
-       if(targ.classname == "player" && attacker.classname == "player" && attacker != targ && attacker.health > 2)
-       {
-               if(g_runematch)
-               {
-                       if (attacker.runes & RUNE_VAMPIRE)
-                       {
-                       // apply vampire rune
-                               if (attacker.runes & CURSE_EMPATHY) // have the curse too
-                               {
-                                       //attacker.health = attacker.health + damage * autocvar_g_balance_rune_vampire_combo_absorb;
-                                       attacker.health = bound(
-                                               autocvar_g_balance_curse_empathy_minhealth, // LA: was 3, now 40
-                                               attacker.health + damage * autocvar_g_balance_rune_vampire_combo_absorb,
-                                               autocvar_g_balance_rune_vampire_maxhealth);     // LA: was 1000, now 500
-                               }
-                               else
-                               {
-                                       //attacker.health = attacker.health + damage * autocvar_g_balance_rune_vampire_absorb;
-                                       attacker.health = bound(
-                                               attacker.health,        // LA: was 3, but changed so that you can't lose health
-                                                                                       // empathy won't let you gain health in the same way...
-                                               attacker.health + damage * autocvar_g_balance_rune_vampire_absorb,
-                                               autocvar_g_balance_rune_vampire_maxhealth);     // LA: was 1000, now 500
-                                       }
-                       }
-                       // apply empathy curse
-                       else if (attacker.runes & CURSE_EMPATHY)
-                       {
-                               attacker.health = bound(
-                                       autocvar_g_balance_curse_empathy_minhealth, // LA: was 3, now 20
-                                       attacker.health + damage * autocvar_g_balance_curse_empathy_takedamage,
-                                       attacker.health);
-                       }
-               }
-       }
        // apply mirror damage if any
        if(mirrordamage > 0 || mirrorforce > 0)
        {
                attacker = attacker_save;
 -              if(g_minstagib)
 -              if(mirrordamage > 0)
 -              {
 -                      // just lose extra LIVES, don't kill the player for mirror damage
 -                      if(attacker.armorvalue > 0)
 -                      {
 -                              attacker.armorvalue = attacker.armorvalue - 1;
 -                              centerprint(attacker, strcat("^3Remaining extra lives: ",ftos(attacker.armorvalue)));
 -                              attacker.hitsound += 1;
 -                      }
 -                      mirrordamage = 0;
 -              }
  
                force = normalize(attacker.origin + attacker.view_ofs - hitloc) * mirrorforce;
                Damage(attacker, inflictor, attacker, mirrordamage, DEATH_MIRRORDAMAGE, attacker.origin, force);
diff --combined qcsrc/server/g_world.qc
index 3762e003ed2ce5c80fd9a45150bd630a5516012c,a9b958568948339d897aff0fc110fe0ccfe33811..90b1ce62dcafea3ae0218a0a5c20c464fe619a00
@@@ -271,7 -271,6 +271,6 @@@ void cvar_changes_init(
                BADCVAR("g_onslaught");
                BADCVAR("g_race");
                BADCVAR("g_race_qualifying_timelimit");
-               BADCVAR("g_runematch");
                BADCVAR("g_tdm");
                BADCVAR("g_tdm_teams");
                BADCVAR("leadlimit");
                BADCVAR("g_keyhunt_point_leadlimit");
                BADPREFIX("g_mod_");
                BADCVAR("g_nexball_goalleadlimit");
-               BADCVAR("g_runematch_point_leadlimit");
                BADCVAR("leadlimit_and_fraglimit");
                BADCVAR("leadlimit_override");
                BADCVAR("pausable");
                BADCVAR("g_mirrordamage");
                BADCVAR("g_nexball_goallimit");
                BADCVAR("g_powerups");
-               BADCVAR("g_runematch_point_limit");
                BADCVAR("g_start_delay");
                BADCVAR("g_warmup");
                BADCVAR("g_weapon_stay"); BADPRESUFFIX("g_", "_weapon_stay");
                BADCVAR("g_minstagib");
                BADCVAR("g_new_toys");
                BADCVAR("g_nix");
 -
 -              if(autocvar_g_minstagib)
 -              {
 -                      BADCVAR("g_grappling_hook");
 -                      BADCVAR("g_jetpack");
 -              }
 +              BADCVAR("g_grappling_hook");
 +              BADCVAR("g_jetpack");
 +              
  #undef BADPREFIX
  #undef BADCVAR
  
@@@ -712,6 -712,10 +709,6 @@@ void spawnfunc_worldspawn (void
                if(autocvar_g_midair)
                        s = strcat(s, ":midair");
  
 -              // TODO to mutator system
 -              if(autocvar_g_minstagib)
 -                      s = strcat(s, ":minstagib");
 -
                // TODO to mutator system
                if(autocvar_g_powerups == 0)
                        s = strcat(s, ":no_powerups");
                modname = cvar_string("g_mod_balance");
        if(cvar_string("g_mod_config") != cvar_defstring("g_mod_config"))
                modname = cvar_string("g_mod_config");
 -      // weird mutators that deserve to count as mod
 -      if(autocvar_g_minstagib)
 -              modname = "MinstaGib";
        // extra mutators that deserve to count as mod
        MUTATOR_CALLHOOK(SetModname);
  
index 23de1382984fcc66113b0bac2bf25e9f50cb640d,17a26821d9a997005184152cf57c5304dcd2eaf4..4a5282e45f29718f9c95265e715d3b8c31813c81
@@@ -831,6 -831,20 +831,6 @@@ void readplayerstartcvars(
                if(!(g_lms || g_ca))
                        start_items |= IT_UNLIMITED_AMMO;
        }
 -      else if (g_minstagib)
 -      {
 -              g_pinata = 0; // incompatible
 -              g_weapon_stay = 0; // incompatible
 -              g_bloodloss = 0; // incompatible
 -              start_health = 100;
 -              start_armorvalue = 0;
 -              WEPSET_COPY_AW(start_weapons, WEP_MINSTANEX);
 -              g_minstagib_invis_alpha = cvar("g_minstagib_invis_alpha");
 -              start_items |= IT_UNLIMITED_SUPERWEAPONS;
 -
 -              if (g_minstagib_invis_alpha <= 0)
 -                      g_minstagib_invis_alpha = -1;
 -      }
        else
        {
                for (i = WEP_FIRST; i <= WEP_LAST; ++i)
        if(cvar("g_nexball"))
                start_items |= IT_UNLIMITED_SUPERWEAPONS; // FIXME BAD BAD BAD BAD HACK, NEXBALL SHOULDN'T ABUSE PORTO'S WEAPON SLOT
  
 -      if(g_minstagib)
 -      {
 -              start_ammo_cells = cvar("g_minstagib_ammo_start");
 -              start_ammo_fuel = cvar("g_start_ammo_fuel");
 -      }
 -      else if(start_items & IT_UNLIMITED_WEAPON_AMMO)
 +      if(start_items & IT_UNLIMITED_WEAPON_AMMO)
        {
                start_ammo_rockets = 999;
                start_ammo_shells = 999;
@@@ -995,9 -1014,6 +995,9 @@@ void readlevelcvars(void
                MUTATOR_ADD(mutator_spawn_near_teammate);
        if(cvar("g_physical_items"))
                MUTATOR_ADD(mutator_physical_items);
 +      if(cvar("g_minstagib"))
 +              MUTATOR_ADD(mutator_minstagib); 
 +
        if(!g_minstagib)
        {
                if(cvar("g_invincible_projectiles"))
        g_warmup_allguns = cvar("g_warmup_allguns");
        g_warmup_allow_timeout = cvar("g_warmup_allow_timeout");
  
-       if ((g_race && g_race_qualifying == 2) || g_runematch || g_arena || g_assault || cvar("g_campaign"))
+       if ((g_race && g_race_qualifying == 2) || g_arena || g_assault || cvar("g_campaign"))
                inWarmupStage = 0; // these modes cannot work together, sorry
  
        g_pickup_respawntime_weapon = cvar("g_pickup_respawntime_weapon");
@@@ -1398,11 -1414,6 +1398,6 @@@ void precache(
  {
      // gamemode related things
      precache_model ("models/misc/chatbubble.spr");
-     if (g_runematch)
-     {
-         precache_model ("models/runematch/curse.mdl");
-         precache_model ("models/runematch/rune.mdl");
-     }
  
  #ifdef TTURRETS_ENABLED
      if (autocvar_g_turrets)
index 6feccf3c582d0006697940193a1b69d22eaba6a1,35b2e652349a3f95ac238df57e083082537c62ab..91d2d602062a8096235d592894f252aa211d428e
@@@ -123,9 -123,6 +123,9 @@@ MUTATOR_HOOKABLE(GetCvars)
        // INPUT:
                float get_cvars_f;
                string get_cvars_s;
 +              
 +MUTATOR_HOOKABLE(PlayStrengthSound);
 +      // called when a player fires a weapon with the strength powerup
  
  MUTATOR_HOOKABLE(EditProjectile);
        // can edit any "just fired" projectile
@@@ -145,7 -142,7 +145,7 @@@ MUTATOR_HOOKABLE(PlayerDamage_SplitHeal
                float damage_save;
                
  MUTATOR_HOOKABLE(PlayerDamage_Calculate);
-       // called to adjust damage and force values which are applied to the player, used for e.g. strength damage/force multiplier or runematch runes
+       // called to adjust damage and force values which are applied to the player, used for e.g. strength damage/force multiplier
        // i'm not sure if I should change this around slightly (Naming of the entities, and also how they're done in g_damage).
        // INPUT:
                entity frag_attacker;
                float frag_deathtype;
        // INPUT, OUTPUT:
                float frag_damage;
 +              float frag_mirrordamage;
                vector frag_force;
  
  MUTATOR_HOOKABLE(PlayerPowerups);
@@@ -224,24 -220,6 +224,24 @@@ MUTATOR_HOOKABLE(SetWeaponreplace)
                entity other; // weapon info
        // IN+OUT
                string ret_string;
 +              
 +MUTATOR_HOOKABLE(Item_RespawnCountdown);
 +      // called when an item is about to respawn
 +      // INPUT+OUTPUT:
 +      string item_name;
 +      vector item_color;
 +      
 +MUTATOR_HOOKABLE(Item_GiveTo);
 +      // called when an item is given to a player
 +      entity giveplayer;
 +      entity giveitem;
 +      float player_wswitch;
 +      float player_pickedup;
 +              
 +MUTATOR_HOOKABLE(BotShouldAttack);
 +      // called when a bot checks a target to attack
 +      // INPUT
 +      entity checkentity;
  
  MUTATOR_HOOKABLE(PortalTeleport);
        // called whenever a player goes through a portal gun teleport
diff --combined qcsrc/server/progs.src
index 1efa0e5650e488fb1d21594df93bea554f50decc,f33be85b9b4c3816451ef7de35efe6492e91800a..3664b6be545b9600fd0dbb761869a2e90ae7dfbc
@@@ -101,7 -101,7 +101,7 @@@ g_subs.q
  
  g_tetris.qc
  
- runematch.qc
//runematch.qc
  arena.qc
  
  g_violence.qc
@@@ -231,7 -231,6 +231,7 @@@ mutators/mutator_spawn_near_teammate.q
  mutators/mutator_physical_items.qc
  mutators/sandbox.qc
  mutators/mutator_superspec.qc
 +mutators/mutator_minstagib.qc
  
  ../warpzonelib/anglestransform.qc
  ../warpzonelib/mathlib.qc
diff --combined qcsrc/server/teamplay.qc
index 70966c43107a84c4f43adb2e93989f44fb3e6cb5,6608fc9a317e38e1e73686179016a354ecdabe45..cefcc328404b5af4c7dcf4855c7730d77da250b1
@@@ -13,7 -13,6 +13,6 @@@ void TeamchangeFrags(entity e
        PlayerScore_Clear(e);
  }
  
- void runematch_init();
  void tdm_init();
  void entcs_init();
  
@@@ -107,14 -106,6 +106,6 @@@ void InitGameplayMode(
                have_team_spawns = -1; // request team spawns
        }
  
-       if(g_runematch)
-       {
-               // ActivateTeamplay();
-               fraglimit_override = autocvar_g_runematch_point_limit;
-               leadlimit_override = autocvar_g_runematch_point_leadlimit;
-               runematch_init();
-       }
        if(g_lms)
        {
                fraglimit_override = autocvar_g_lms_lives_override;
@@@ -284,7 -275,9 +275,7 @@@ string getwelcomemessage(void
        ret_string = "";
        MUTATOR_CALLHOOK(BuildMutatorsPrettyString);
        modifications = ret_string;
 -      
 -      if(g_minstagib)
 -              modifications = strcat(modifications, ", MinstaGib");
 +
        if(g_weaponarena)
        {
                if(g_weaponarena_random)