Merge branch 'master' into Mario/wepent_experimental
authorMario <mario@smbclan.net>
Fri, 11 Nov 2016 11:04:16 +0000 (21:04 +1000)
committerMario <mario@smbclan.net>
Fri, 11 Nov 2016 11:04:16 +0000 (21:04 +1000)
1  2 
qcsrc/common/mutators/mutator/nix/sv_nix.qc
qcsrc/common/t_items.qc

@@@ -63,14 -63,8 +63,14 @@@ REGISTER_MUTATOR(nix, cvar("g_nix") && 
                        it.ammo_rockets = start_ammo_rockets;
                        it.ammo_fuel = start_ammo_fuel;
                        it.weapons = start_weapons;
 -                      if(!client_hasweapon(it, PS(it).m_weapon, true, false))
 -                              PS(it).m_switchweapon = w_getbestweapon(it);
 +                      for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
 +                      {
 +                              .entity weaponentity = weaponentities[slot];
 +                              if(it.(weaponentity).m_weapon == WEP_Null && slot != 0)
 +                                      continue;
 +                              if(!client_hasweapon(it, it.(weaponentity).m_weapon, weaponentity, true, false))
 +                                      it.(weaponentity).m_switchweapon = w_getbestweapon(it, weaponentity);
 +                      }
                });
        }
  
@@@ -170,24 -164,14 +170,24 @@@ void NIX_GiveCurrentWeapon(entity this
  
                // all weapons must be fully loaded when we spawn
                if(e.spawnflags & WEP_FLAG_RELOADABLE) // prevent accessing undefined cvars
 -                      this.(weapon_load[nix_weapon]) = e.reloading_ammo;
 +              {
 +                      for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
 +                      {
 +                              .entity weaponentity = weaponentities[slot];
 +                              this.(weaponentity).(weapon_load[nix_weapon]) = e.reloading_ammo;
 +                      }
 +              }
  
                // vortex too
                if(WEP_CVAR(vortex, charge))
                {
                        if(WEP_CVAR_SEC(vortex, chargepool))
                                this.vortex_chargepool_ammo = 1;
 -                      this.vortex_charge = WEP_CVAR(vortex, charge_start);
 +                      for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
 +                      {
 +                              .entity weaponentity = weaponentities[slot];
 +                              this.(weaponentity).vortex_charge = WEP_CVAR(vortex, charge_start);
 +                      }
                }
  
                // set last change info
        this.weapons |= e.m_wepset;
  
      Weapon w = Weapons_from(nix_weapon);
 -      if(PS(this).m_switchweapon != w)
 -              if(!client_hasweapon(this, PS(this).m_switchweapon, true, false))
 +    for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
 +    {
 +      .entity weaponentity = weaponentities[slot];
 +      if(this.(weaponentity).m_weapon == WEP_Null && slot != 0)
 +              continue;
 +
 +              if(this.(weaponentity).m_switchweapon != w)
 +              if(!client_hasweapon(this, this.(weaponentity).m_switchweapon, weaponentity, true, false))
                {
 -                      if(client_hasweapon(this, w, true, false))
 -                              W_SwitchWeapon(this, w);
 +                      if(client_hasweapon(this, w, weaponentity, true, false))
 +                              W_SwitchWeapon(this, w, weaponentity);
                }
 +      }
  }
  
  MUTATOR_HOOKFUNCTION(nix, ForbidThrowCurrentWeapon)
@@@ -255,24 -232,13 +255,13 @@@ MUTATOR_HOOKFUNCTION(nix, FilterItem
  {
        entity item = M_ARGV(0, entity);
  
-       switch (item.items)
+       if(item.itemdef.instanceOfHealth || item.itemdef.instanceOfArmor)
        {
-               case ITEM_HealthSmall.m_itemid:
-               case ITEM_HealthMedium.m_itemid:
-               case ITEM_HealthLarge.m_itemid:
-               case ITEM_HealthMega.m_itemid:
-               case ITEM_ArmorSmall.m_itemid:
-               case ITEM_ArmorMedium.m_itemid:
-               case ITEM_ArmorLarge.m_itemid:
-               case ITEM_ArmorMega.m_itemid:
-                       if (autocvar_g_nix_with_healtharmor)
-                               return false;
-                       break;
-               case ITEM_Strength.m_itemid:
-               case ITEM_Shield.m_itemid:
-                       if (autocvar_g_nix_with_powerups)
-                               return false;
-                       break;
+               return !autocvar_g_nix_with_healtharmor;
+       }
+       else if(item.itemdef.instanceOfPowerup)
+       {
+               return !autocvar_g_nix_with_powerups;
        }
  
        return true; // delete all other items
diff --combined qcsrc/common/t_items.qc
@@@ -183,7 -183,7 +183,7 @@@ NET_HANDLE(ENT_CLIENT_ITEM, bool isnew
              if(this.ItemStatus & ITS_ALLOWFB)
                  this.effects |= EF_FULLBRIGHT;
  
-         if(this.ItemStatus & ITS_POWERUP)
+         if(this.ItemStatus & ITS_GLOW)
          {
              if(this.ItemStatus & ITS_AVAILABLE)
                  this.effects |= (EF_ADDITIVE | EF_FULLBRIGHT);
@@@ -423,6 -423,7 +423,7 @@@ void Item_Show (entity e, float mode
  {
        e.effects &= ~(EF_ADDITIVE | EF_STARDUST | EF_FULLBRIGHT | EF_NODEPTHTEST);
        e.ItemStatus &= ~ITS_STAYWEP;
+       entity def = e.itemdef;
        if (mode > 0)
        {
                // make the item look normal, and be touchable
                e.ItemStatus &= ~ITS_AVAILABLE;
        }
        else {
-       entity def = e.itemdef;
        bool nostay = def.instanceOfWeaponPickup ? !!(def.m_weapon.weapons & WEPSET_SUPERWEAPONS) : false // no weapon-stay on superweapons
                || e.team // weapon stay isn't supported for teamed weapons
                ;
                e.ItemStatus &= ~ITS_AVAILABLE;
        }}
  
-       if (e.items & ITEM_Strength.m_itemid || e.items & ITEM_Shield.m_itemid)
-               e.ItemStatus |= ITS_POWERUP;
+       if (def.m_glow)
+               e.ItemStatus |= ITS_GLOW;
  
        if (autocvar_g_nodepthtestitems)
                e.effects |= EF_NODEPTHTEST;
@@@ -497,13 -497,7 +497,7 @@@ void Item_ItemsTime_SetTimesForAllPlaye
  void Item_Respawn (entity this)
  {
        Item_Show(this, 1);
-       // this is ugly...
-       if(this.items == ITEM_Strength.m_itemid)
-               sound (this, CH_TRIGGER, SND_STRENGTH_RESPAWN, VOL_BASE, ATTEN_NORM);   // play respawn sound
-       else if(this.items == ITEM_Shield.m_itemid)
-               sound (this, CH_TRIGGER, SND_SHIELD_RESPAWN, VOL_BASE, ATTEN_NORM);     // play respawn sound
-       else
-               sound (this, CH_TRIGGER, SND_ITEMRESPAWN, VOL_BASE, ATTEN_NORM);        // play respawn sound
+       sound(this, CH_TRIGGER, this.itemdef.m_respawnsound, VOL_BASE, ATTEN_NORM);     // play respawn sound
        setorigin(this, this.origin);
  
      if (Item_ItemsTime_Allow(this.itemdef) || this.weapons & WEPSET_SUPERWEAPONS)
@@@ -672,30 -666,21 +666,30 @@@ LABEL(YEAH
  
  float Item_GiveTo(entity item, entity player)
  {
 -      float _switchweapon;
        float pickedup;
  
        // if nothing happens to player, just return without taking the item
        pickedup = false;
 -      _switchweapon = false;
 +      int _switchweapon = 0;
        // in case the player has autoswitch enabled do the following:
        // if the player is using their best weapon before items are given, they
        // probably want to switch to an even better weapon after items are given
 -      if (player.autoswitch)
 -      if (PS(player).m_switchweapon == w_getbestweapon(player))
 -              _switchweapon = true;
  
 -      if (!(player.weapons & WepSet_FromWeapon(PS(player).m_switchweapon)))
 -              _switchweapon = true;
 +      if(player.autoswitch)
 +      {
 +              for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
 +              {
 +                      .entity weaponentity = weaponentities[slot];
 +                      if(player.(weaponentity).m_weapon != WEP_Null || slot == 0)
 +                      {
 +                              if(player.(weaponentity).m_switchweapon == w_getbestweapon(player, weaponentity))
 +                                      _switchweapon |= BIT(slot);
 +
 +                              if(!(player.weapons & WepSet_FromWeapon(player.(weaponentity).m_switchweapon)))
 +                                      _switchweapon |= BIT(slot);
 +                      }
 +              }
 +      }
  
        pickedup |= Item_GiveAmmoTo(item, player, ammo_fuel, g_pickup_fuel_max, ITEM_MODE_FUEL);
        pickedup |= Item_GiveAmmoTo(item, player, ammo_shells, g_pickup_shells_max, ITEM_MODE_NONE);
                        FOREACH(Weapons, it != WEP_Null, {
                                if(w & (it.m_wepset))
                                {
 -                                      W_DropEvent(wr_pickup, player, it.m_id, item);
 +                                      for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
 +                                      {
 +                                              .entity weaponentity = weaponentities[slot];
 +                                              if(player.(weaponentity).m_weapon != WEP_Null || slot == 0)
 +                                                      W_DropEvent(wr_pickup, player, it.m_id, item, weaponentity);
 +                                      }
                                        W_GiveWeapon(player, it.m_id);
                                }
                        });
@@@ -774,25 -754,13 +768,25 @@@ LABEL(skip
        // crude hack to enforce switching weapons
        if(g_cts && item.itemdef.instanceOfWeaponPickup)
        {
 -              W_SwitchWeapon_Force(player, Weapons_from(item.weapon));
 +              for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
 +              {
 +                      .entity weaponentity = weaponentities[slot];
 +                      if(player.(weaponentity).m_weapon != WEP_Null || slot == 0)
 +                              W_SwitchWeapon_Force(player, Weapons_from(item.weapon), weaponentity);
 +              }
                return 1;
        }
  
 -      if (_switchweapon)
 -              if (PS(player).m_switchweapon != w_getbestweapon(player))
 -                      W_SwitchWeapon_Force(player, w_getbestweapon(player));
 +      if(_switchweapon)
 +      {
 +              for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
 +              {
 +                      .entity weaponentity = weaponentities[slot];
 +                      if(_switchweapon & BIT(slot))
 +                      if(player.(weaponentity).m_switchweapon != w_getbestweapon(player, weaponentity))
 +                              W_SwitchWeapon_Force(player, w_getbestweapon(player, weaponentity), weaponentity);
 +              }
 +      }
  
        return 1;
  }
@@@ -1671,6 -1639,7 +1665,6 @@@ void GiveRot(entity e, float v0, float 
  float GiveItems(entity e, float beginarg, float endarg)
  {
        float got, i, val, op;
 -      float _switchweapon;
        string cmd;
  
        val = 999;
  
        got = 0;
  
 -      _switchweapon = false;
 -      if (e.autoswitch)
 -              if (PS(e).m_switchweapon == w_getbestweapon(e))
 -                      _switchweapon = true;
 +      int _switchweapon = 0;
 +
 +      if(e.autoswitch)
 +      {
 +              for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
 +              {
 +                      .entity weaponentity = weaponentities[slot];
 +                      if(e.(weaponentity).m_weapon != WEP_Null || slot == 0)
 +                      if(e.(weaponentity).m_switchweapon == w_getbestweapon(e, weaponentity))
 +                              _switchweapon |= BIT(slot);
 +              }
 +      }
  
        e.strength_finished = max(0, e.strength_finished - time);
        e.invincible_finished = max(0, e.invincible_finished - time);
        else
                e.superweapons_finished += time;
  
 -      if (!(e.weapons & WepSet_FromWeapon(PS(e).m_switchweapon)))
 -              _switchweapon = true;
 +      for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
 +      {
 +              .entity weaponentity = weaponentities[slot];
 +              if(e.(weaponentity).m_weapon != WEP_Null || slot == 0)
 +              if(!(e.weapons & WepSet_FromWeapon(e.(weaponentity).m_switchweapon)))
 +                      _switchweapon |= BIT(slot);
 +      }
 +
        if(_switchweapon)
 -              W_SwitchWeapon_Force(e, w_getbestweapon(e));
 +      {
 +              for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
 +              {
 +                      .entity weaponentity = weaponentities[slot];
 +                      if(_switchweapon & BIT(slot))
 +                              W_SwitchWeapon_Force(e, w_getbestweapon(e, weaponentity), weaponentity);
 +              }
 +      }
  
        return got;
  }