Merge branch 'master' into Mario/mutator_minstagib
authorMario <mario.mario@y7mail.com>
Thu, 25 Apr 2013 17:37:27 +0000 (03:37 +1000)
committerMario <mario.mario@y7mail.com>
Thu, 25 Apr 2013 17:37:27 +0000 (03:37 +1000)
1  2 
qcsrc/common/notifications.qh
qcsrc/server/cl_client.qc
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_world.qc
qcsrc/server/mutators/mutator_minstagib.qc
qcsrc/server/t_items.qc
qcsrc/server/w_common.qc
qcsrc/server/w_minstanex.qc

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 7d3980d2afcc577b8f82a64ae38529db14079d24,0000000000000000000000000000000000000000..83886077c4683274635a0c5120387a6b29f5f139
mode 100644,000000..100644
--- /dev/null
@@@ -1,414 -1,0 +1,412 @@@
-                       AnnounceTo(self, "terminated");
 +void spawnfunc_item_minst_cells (void) 
 +{
 +      if not(g_minstagib) { remove(self); return; }
 +      if not(self.ammo_cells)
 +              self.ammo_cells = autocvar_g_minstagib_ammo_drop;
 +              
 +      StartItem ("models/items/a_cells.md3",
 +                         "misc/itempickup.wav", 45, 0,
 +                         "MinstaNex Ammo", IT_CELLS, 0, 0, generic_pickupevalfunc, 100);
 +}
 +
 +void minstagib_health_mega()
 +{
 +      self.max_health = 1;
 +      StartItem ("models/items/g_h100.md3",
 +                         "misc/megahealth.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup,
 +                         "Extralife", IT_NAILS, 0, FL_POWERUP, generic_pickupevalfunc, BOT_PICKUP_RATING_HIGH);
 +}
 +
 +.float minstagib_nextthink;
 +.float minstagib_needammo;
 +void minstagib_stop_countdown(entity e)
 +{
 +      if (!e.minstagib_needammo)
 +              return;
 +      Kill_Notification(NOTIF_ONE_ONLY, e, MSG_CENTER_CPID, CPID_MINSTA_FINDAMMO);
 +      e.minstagib_needammo = FALSE;
 +}
 +void minstagib_ammocheck(void)
 +{
 +      if (time < self.minstagib_nextthink)
 +              return;
 +
 +      if (self.deadflag || gameover)
 +              minstagib_stop_countdown(self);
 +      else if (self.ammo_cells > 0 || (self.items & IT_UNLIMITED_WEAPON_AMMO))
 +              minstagib_stop_countdown(self);
 +      else
 +      {
 +              self.minstagib_needammo = TRUE;
 +              if (self.health == 5)
 +              {
 +                      Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
-                       AnnounceTo(self, "1");
++                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_MINSTAGIB_TERMINATED);
 +              }
 +              else if (self.health == 10)
 +              {
 +                      Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
-                       AnnounceTo(self, "2");
++                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_1);
 +              }
 +              else if (self.health == 20)
 +              {
 +                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-                       AnnounceTo(self, "3");
++                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_2);
 +              }
 +              else if (self.health == 30)
 +              {
 +                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-                       AnnounceTo(self, "4");
++                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_3);
 +              }
 +              else if (self.health == 40)
 +              {
 +                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-                       AnnounceTo(self, "5");
++                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_4);
 +              }
 +              else if (self.health == 50)
 +              {
 +                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-                       AnnounceTo(self, "6");
++                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_5);
 +              }
 +              else if (self.health == 60)
 +              {
 +                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-                       AnnounceTo(self, "7");
++                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_6);
 +              }
 +              else if (self.health == 70)
 +              {
 +                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-                       AnnounceTo(self, "8");
++                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_7);
 +              }
 +              else if (self.health == 80)
 +              {
 +                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-                       AnnounceTo(self, "9");
++                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_8);
 +              }
 +              else if (self.health == 90)
 +              {
 +                      Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_MINSTA_FINDAMMO);
 +                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-                       Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_MINSTA_FINDAMMO_FIRST);
++                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_9);
 +              }
 +              else if (self.health == 100)
 +              {
-                       if not(self.flags & FL_GODMODE)
-                               AnnounceTo(self, "10");
++                      Send_Notification(NOTIF_ONE_ONLY, self, MSG_MULTI, MULTI_MINSTA_FINDAMMO);
 +                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-                               AnnounceTo(other, "lastsecond");
 +              }
 +      }
 +      self.minstagib_nextthink = time + 1;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_BotShouldAttack)
 +{
 +      if(checkentity.items & IT_STRENGTH)
 +              return TRUE;
 +              
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_MakePlayerObserver)
 +{
 +      minstagib_stop_countdown(self);
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_PlayerSpawn)
 +{
 +      self.effects |= EF_FULLBRIGHT;
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_PlayerPreThink)
 +{
 +      minstagib_ammocheck();
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_PlayerPowerups)
 +{
 +      if not(self.effects & EF_FULLBRIGHT)
 +              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_ONE, self, MSG_CENTER, CENTER_POWERDOWN_INVISIBILITY);
 +              }
 +      }
 +      else
 +      {
 +              if (time < self.strength_finished)
 +              {
 +                      self.alpha = autocvar_g_minstagib_invis_alpha;
 +                      self.exteriorweaponentity.alpha = autocvar_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 &~= IT_INVINCIBLE;
 +                      Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_SPEED);
 +              }
 +      }
 +      else
 +      {
 +              if (time < self.invincible_finished)
 +              {
 +                      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);
 +              }
 +      }
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_PlayerPhysics)
 +{
 +      if(self.items & IT_INVINCIBLE)
 +              self.stat_sv_maxspeed = self.stat_sv_maxspeed * autocvar_g_minstagib_speed_highspeed;
 +              
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_SplitHealthArmor)
 +{
 +      damage_save = 0;
 +      //damage_take = frag_damage; // frag_damage isn't even set here?!
 +      
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_ForbidThrowing)
 +{
 +      if (self.health < 1)
 +              return FALSE;
 +              
 +      return TRUE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_PlayerDamage)
 +{
 +      if(autocvar_g_friendlyfire == 0 && !IsDifferentTeam(frag_target, frag_attacker) && IS_PLAYER(frag_target))
 +              frag_damage = 0;
 +              
 +      if(IS_PLAYER(frag_target))
 +      {
 +              if ((frag_deathtype == DEATH_FALL)  ||
 +                      (frag_deathtype == DEATH_DROWN) ||
 +                      (frag_deathtype == DEATH_SLIME) ||
 +                      (frag_deathtype == DEATH_LAVA))
 +              {
 +                      frag_damage = 0;
 +              }
 +              
 +              if (frag_target.armorvalue && (frag_deathtype == WEP_MINSTANEX) && frag_damage)
 +              {
 +                      frag_target.armorvalue -= 1;
 +                      Send_Notification(NOTIF_ONE, frag_target, MSG_CENTER, CENTER_MINSTA_LIVES_REMAINING, frag_target.armorvalue);
 +                      frag_damage = 0;
 +                      frag_target.hitsound += 1;
 +                      frag_attacker.hitsound += 1; // TODO change this to a future specific hitsound for armor hit
 +              }
 +              if (DEATH_ISWEAPON(frag_deathtype, WEP_LASER))
 +              {
 +                      frag_damage = 0;
 +                      frag_mirrordamage = 0;
 +                      if (frag_target != frag_attacker)
 +                      {
 +                              if ((frag_target.health >= 1) && IS_PLAYER(frag_target))
 +                                      Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_MINSTA_SECONDARY);
 +                              frag_force = '0 0 0';
 +                              // keep mirrorfrag_force
 +                              frag_attacker = frag_target;
 +                      }
 +              }
 +      }
 +      
 +      if(frag_mirrordamage > 0)
 +      {
 +              // just lose extra LIVES, don't kill the player for mirror damage
 +              if(frag_attacker.armorvalue > 0)
 +              {
 +                      frag_attacker.armorvalue = frag_attacker.armorvalue - 1;
 +                      Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_MINSTA_LIVES_REMAINING, frag_attacker.armorvalue);
 +                      frag_attacker.hitsound += 1;
 +              }
 +              frag_mirrordamage = 0;
 +      }
 +      
 +      if(frag_target.items & IT_STRENGTH)
 +              yoda = 1;
 +              
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_SetStartItems)
 +{
 +      start_ammo_cells = cvar("g_minstagib_ammo_start");
 +      
 +      start_health = 100;
 +      start_armorvalue = 0;
 +      WEPSET_COPY_AW(start_weapons, WEP_MINSTANEX);
 +      start_items |= IT_UNLIMITED_SUPERWEAPONS;
 +              
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_FilterItem)
 +{
 +      if(self.classname == "item_cells")
 +              return TRUE; // no normal cells?
 +              
 +      if(self.weapon == WEP_MINSTANEX && self.classname == "droppedweapon")
 +      {
 +              self.ammo_cells = autocvar_g_minstagib_ammo_drop;
 +              return FALSE;
 +      }
 +      
 +      if(self.weapon == WEP_ROCKET_LAUNCHER || self.weapon == WEP_NEX)
 +      {
 +              entity e = spawn();
 +              setorigin(e, self.origin);
 +              entity oldself;
 +              oldself = self;
 +              self = e;
 +              spawnfunc_item_minst_cells();
 +              self = oldself;
 +              return TRUE;
 +      }
 +              
 +      if(self.flags & FL_POWERUP)
 +              return FALSE;
 +              
 +      if(self.ammo_cells > autocvar_g_minstagib_ammo_drop && self.classname != "item_minst_cells")
 +              self.ammo_cells = autocvar_g_minstagib_ammo_drop;
 +              
 +      if(self.ammo_cells && !self.weapon)
 +              return FALSE;
 +              
 +      return TRUE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_CustomizeWaypoint)
 +{
 +      entity e = WaypointSprite_getviewentity(other);
 +      
 +      // if you have the invisibility powerup, sprites ALWAYS are restricted to your team
 +      // but only apply this to real players, not to spectators
 +      if((self.owner.flags & FL_CLIENT) && (self.owner.items & IT_STRENGTH) && (e == other))
 +      if(IsDifferentTeam(self.owner, e))
 +              return TRUE;
 +      
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_ItemCountdown)
 +{
 +      switch(self.items)
 +      {
 +              case IT_STRENGTH:   item_name = "item-invis"; item_color = '0 0 1'; break;
 +              case IT_NAILS:      item_name = "item-extralife"; item_color = '1 0 0'; break;
 +              case IT_INVINCIBLE: item_name = "item-speed"; item_color = '1 0 1'; break;
 +      }
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_GiveItem)
 +{
 +      if(giveitem.ammo_cells)
 +      {
 +              // play some cool sounds ;)
 +              if (IS_CLIENT(other))
 +              {
 +                      if(other.health <= 5)
-                               AnnounceTo(other, "narrowly");
++                              Send_Notification(NOTIF_ONE, other, MSG_ANNCE, ANNCE_MINSTAGIB_LASTSECOND);
 +                      else if(other.health < 50)
++                              Send_Notification(NOTIF_ONE, other, MSG_ANNCE, ANNCE_MINSTAGIB_NARROWLY);
 +              }
 +
 +              if(other.health < 100)
 +                      other.health = 100;
 +                      
 +              player_pickedup = TRUE;
 +      }
 +      
 +      if(giveitem.max_health)
 +      {
 +              other.armorvalue = bound(other.armorvalue, 999, other.armorvalue + autocvar_g_minstagib_extralives);
 +              sprint(other, "^3You picked up some extra lives\n");
 +              player_pickedup = TRUE;
 +      }
 +              
 +      return TRUE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_OnEntityPreSpawn)
 +{
 +      if not(autocvar_g_powerups) { return FALSE; }
 +      if not(self.classname == "item_strength" || self.classname == "item_invincible" || self.classname == "item_health_mega")
 +              return FALSE;
 +      
 +      entity e = spawn();
 +      
 +      if(random() < 0.3)
 +              e.think = spawnfunc_item_strength;
 +      else if(random() < 0.6)
 +              e.think = minstagib_health_mega;
 +      else
 +              e.think = spawnfunc_item_invincible;
 +              
 +      e.nextthink = time + 0.1;
 +      e.spawnflags = self.spawnflags;
 +      e.noalign = self.noalign;
 +      setorigin(e, self.origin);
 +      
 +      return TRUE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_BuildMutatorsString)
 +{
 +      ret_string = strcat(ret_string, ":MinstaGib");
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(minstagib_BuildMutatorsPrettyString)
 +{
 +      ret_string = strcat(ret_string, ", MinstaGib");
 +      return FALSE;
 +}
 +
 +MUTATOR_DEFINITION(mutator_minstagib)
 +{
 +      MUTATOR_HOOK(BotShouldAttack, minstagib_BotShouldAttack, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(PlayerPhysics, minstagib_PlayerPhysics, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(PlayerSpawn, minstagib_PlayerSpawn, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(PlayerDamage_Calculate, minstagib_PlayerDamage, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(MakePlayerObserver, minstagib_MakePlayerObserver, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(SetStartItems, minstagib_SetStartItems, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(Item_GiveTo, minstagib_GiveItem, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(FilterItem, minstagib_FilterItem, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(CustomizeWaypoint, minstagib_CustomizeWaypoint, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(Item_RespawnCountdown, minstagib_ItemCountdown, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(PlayerDamage_SplitHealthArmor, minstagib_SplitHealthArmor, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(PlayerPowerups, minstagib_PlayerPowerups, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(ForbidThrowCurrentWeapon, minstagib_ForbidThrowing, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(PlayerPreThink, minstagib_PlayerPreThink, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(OnEntityPreSpawn, minstagib_OnEntityPreSpawn, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(BuildMutatorsString, minstagib_BuildMutatorsString, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(BuildMutatorsPrettyString, minstagib_BuildMutatorsPrettyString, CBC_ORDER_ANY);
 +
 +      return FALSE;
 +}
index 87fda06aef9b6a76675903a8ff4e66eec2acf88d,392c05ce14f3e9b9ac0671b662e510adf34393fd..45698f1b2b978eeec8a7ceab1ea11b9edde10dea
@@@ -600,73 -614,130 +600,72 @@@ float Item_GiveTo(entity item, entity p
        // if nothing happens to player, just return without taking the item
        pickedup = FALSE;
        _switchweapon = FALSE;
 -      if (g_minstagib)
 -      {
 -              float prevcells = player.ammo_cells;
 -
 -              pickedup |= Item_GiveAmmoTo(item, player, ammo_fuel, g_pickup_fuel_max, ITEM_MODE_FUEL);
 -              pickedup |= Item_GiveAmmoTo(item, player, ammo_cells, 999, ITEM_MODE_NONE);
 -
 -              if(player.ammo_cells > prevcells)
 -              {
 -                      _switchweapon = TRUE;
++      // 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 (player.switchweapon == w_getbestweapon(player))
++              _switchweapon = TRUE;
 -                      // play some cool sounds ;)
 -                      if (clienttype(player) == CLIENTTYPE_REAL)
 -                      {
 -                              if(player.health <= 5)
 -                                      Send_Notification(NOTIF_ONE, player, MSG_ANNCE, ANNCE_MINSTAGIB_LASTSECOND);
 -                              else if(player.health < 50)
 -                                      Send_Notification(NOTIF_ONE, player, MSG_ANNCE, ANNCE_MINSTAGIB_NARROWLY);
 -                      }
 -                      // sound not available
 -                      // else if(item.items == IT_CELLS)
 -                      //      AnnounceTo(player, "ammo");
++      if not(WEPSET_CONTAINS_EW(player, player.switchweapon))
++              _switchweapon = TRUE;
 -                      if (WEPSET_CONTAINS_EW(item, WEP_MINSTANEX))
 -                              W_GiveWeapon (player, WEP_MINSTANEX);
 -                      player.health = 100;
 -              }
 -
 -              if((it = (item.items - (item.items & player.items)) & IT_PICKUPMASK))
 -              {
 -                      pickedup = TRUE;
 -                      player.items |= it;
 -                      sprint (player, strcat("You got the ^2", item.netname, "\n"));
 -              }
++      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);
++      pickedup |= Item_GiveAmmoTo(item, player, ammo_nails, g_pickup_nails_max, ITEM_MODE_NONE);
++      pickedup |= Item_GiveAmmoTo(item, player, ammo_rockets, g_pickup_rockets_max, ITEM_MODE_NONE);
++      pickedup |= Item_GiveAmmoTo(item, player, ammo_cells, g_pickup_cells_max, ITEM_MODE_NONE);
++      pickedup |= Item_GiveAmmoTo(item, player, health, item.max_health, ITEM_MODE_HEALTH);
++      pickedup |= Item_GiveAmmoTo(item, player, armorvalue, item.max_armorvalue, ITEM_MODE_ARMOR);
++      if (item.flags & FL_WEAPON)
++      {
++              WEPSET_DECLARE_A(it);
++              WEPSET_COPY_AE(it, item);
++              WEPSET_ANDNOT_AE(it, player);
  
-               // 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 (player.switchweapon == w_getbestweapon(player))
-                       _switchweapon = TRUE;
-               if not(WEPSET_CONTAINS_EW(player, player.switchweapon))
-                       _switchweapon = TRUE;
-               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);
-               pickedup |= Item_GiveAmmoTo(item, player, ammo_nails, g_pickup_nails_max, ITEM_MODE_NONE);
-               pickedup |= Item_GiveAmmoTo(item, player, ammo_rockets, g_pickup_rockets_max, ITEM_MODE_NONE);
-               pickedup |= Item_GiveAmmoTo(item, player, ammo_cells, g_pickup_cells_max, ITEM_MODE_NONE);
-               pickedup |= Item_GiveAmmoTo(item, player, health, item.max_health, ITEM_MODE_HEALTH);
-               pickedup |= Item_GiveAmmoTo(item, player, armorvalue, item.max_armorvalue, ITEM_MODE_ARMOR);
-               if (item.flags & FL_WEAPON)
 -              // extralife powerup
 -              if (item.max_health)
++              if (!WEPSET_EMPTY_A(it) || (item.spawnshieldtime && self.pickup_anyway))
                {
-                       WEPSET_DECLARE_A(it);
-                       WEPSET_COPY_AE(it, item);
-                       WEPSET_ANDNOT_AE(it, player);
-                       if (!WEPSET_EMPTY_A(it) || (item.spawnshieldtime && self.pickup_anyway))
-                       {
-                               pickedup = TRUE;
-                               for(i = WEP_FIRST; i <= WEP_LAST; ++i)
-                                       if(WEPSET_CONTAINS_AW(it, i))
-                                               W_GiveWeapon(player, i);
-                       }
 -                      pickedup = TRUE;
 -                      // sound not available
 -                      // AnnounceTo(player, "_lives");
 -                      player.armorvalue = bound(player.armorvalue, 999, player.armorvalue + autocvar_g_minstagib_extralives);
 -                      sprint(player, "^3You picked up some extra lives\n");
++              pickedup = TRUE;
++              for(i = WEP_FIRST; i <= WEP_LAST; ++i)
++                      if(WEPSET_CONTAINS_AW(it, i))
++                      W_GiveWeapon(player, i);
                }
++      }
  
-               if((it = (item.items - (item.items & player.items)) & IT_PICKUPMASK))
 -              // invis powerup
 -              if (item.strength_finished)
--              {
--                      pickedup = TRUE;
-                       player.items |= it;
-                       sprint (player, strcat("You got the ^2", item.netname, "\n"));
 -                      // sound not available
 -                      // AnnounceTo(player, "invisible");
 -                      player.strength_finished = max(player.strength_finished, time) + autocvar_g_balance_powerup_strength_time;
--              }
++      if((it = (item.items - (item.items & player.items)) & IT_PICKUPMASK))
++      {
++              pickedup = TRUE;
++              player.items |= it;
++              sprint (player, strcat("You got the ^2", item.netname, "\n"));
++      }
  
-               if (item.strength_finished)
-               {
-                       pickedup = TRUE;
-                       player.strength_finished = max(player.strength_finished, time) + item.strength_finished;
-               }
 -              // speed powerup
--              if (item.invincible_finished)
-               {
-                       pickedup = TRUE;
-                       player.invincible_finished = max(player.invincible_finished, time) + item.invincible_finished;
-               }
-               if (item.superweapons_finished)
--              {
--                      pickedup = TRUE;
-                       player.superweapons_finished = max(player.superweapons_finished, time) + item.superweapons_finished;
 -                      // sound not available
 -                      // AnnounceTo(player, "speed");
 -                      player.invincible_finished = max(player.invincible_finished, time) + autocvar_g_balance_powerup_invincible_time;
--              }
++      if (item.strength_finished)
++      {
++              pickedup = TRUE;
++              player.strength_finished = max(player.strength_finished, time) + item.strength_finished;
+       }
 -      else
++      if (item.invincible_finished)
+       {
 -              // 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 (player.switchweapon == w_getbestweapon(player))
 -                      _switchweapon = TRUE;
 -
 -              if not(WEPSET_CONTAINS_EW(player, player.switchweapon))
 -                      _switchweapon = TRUE;
 -
 -              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);
 -              pickedup |= Item_GiveAmmoTo(item, player, ammo_nails, g_pickup_nails_max, ITEM_MODE_NONE);
 -              pickedup |= Item_GiveAmmoTo(item, player, ammo_rockets, g_pickup_rockets_max, ITEM_MODE_NONE);
 -              pickedup |= Item_GiveAmmoTo(item, player, ammo_cells, g_pickup_cells_max, ITEM_MODE_NONE);
 -              pickedup |= Item_GiveAmmoTo(item, player, health, item.max_health, ITEM_MODE_HEALTH);
 -              pickedup |= Item_GiveAmmoTo(item, player, armorvalue, item.max_armorvalue, ITEM_MODE_ARMOR);
 -
 -              if (item.flags & FL_WEAPON)
 -              {
 -                      WEPSET_DECLARE_A(it);
 -                      WEPSET_COPY_AE(it, item);
 -                      WEPSET_ANDNOT_AE(it, player);
 -
 -                      if (!WEPSET_EMPTY_A(it) || (item.spawnshieldtime && self.pickup_anyway))
 -                      {
 -                              pickedup = TRUE;
 -                              for(i = WEP_FIRST; i <= WEP_LAST; ++i)
 -                                      if(WEPSET_CONTAINS_AW(it, i))
 -                                              W_GiveWeapon(player, i);
 -                      }
 -              }
 -
 -              if((it = (item.items - (item.items & player.items)) & IT_PICKUPMASK))
 -              {
 -                      pickedup = TRUE;
 -                      player.items |= it;
 -                      sprint (player, strcat("You got the ^2", item.netname, "\n"));
 -              }
 -
 -              if (item.strength_finished)
 -              {
 -                      pickedup = TRUE;
 -                      player.strength_finished = max(player.strength_finished, time) + item.strength_finished;
 -              }
 -              if (item.invincible_finished)
 -              {
 -                      pickedup = TRUE;
 -                      player.invincible_finished = max(player.invincible_finished, time) + item.invincible_finished;
 -              }
 -              if (item.superweapons_finished)
 -              {
 -                      pickedup = TRUE;
 -                      player.superweapons_finished = max(player.superweapons_finished, time) + item.superweapons_finished;
 -              }
++              pickedup = TRUE;
++              player.invincible_finished = max(player.invincible_finished, time) + item.invincible_finished;
++      }
++      if (item.superweapons_finished)
++      {
++              pickedup = TRUE;
++              player.superweapons_finished = max(player.superweapons_finished, time) + item.superweapons_finished;
+       }
  
  :skip
 +
 +      other = player;
 +      giveitem = item;
 +      player_wswitch = _switchweapon;
 +      player_pickedup = pickedup;
 +      MUTATOR_CALLHOOK(Item_GiveTo);
 +      _switchweapon = player_wswitch;
 +      pickedup = player_pickedup;
 +      
        // always eat teamed entities
        if(item.team)
                pickedup = TRUE;
Simple merge
index ce166f3c3b25da5fb2d09fefa27c99bb6bb3988c,b34d66bf677184220955ef3b6b69304c1130ab3d..45deff17bc20c5b8d7cc1d2fa316e336a04c8086
@@@ -16,15 -16,20 +16,12 @@@ void W_MinstaNex_Attack (void
        damage_goodhits = 0;
        FireRailgunBullet (w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, 10000, 800, 0, 0, 0, 0, WEP_MINSTANEX);
  
 -      if(g_minstagib)
++      if(yoda && flying)
++              Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_ACHIEVEMENT_YODA);
 +      if(damage_goodhits && self.minstanex_lasthit)
        {
 -              if(yoda)
 -                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_ACHIEVEMENT_YODA);
 -      }
 -      else
 -      {
--              if(yoda && flying)
-                       AnnounceTo(self, "yoda");
 -                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_ACHIEVEMENT_YODA);
--              if(damage_goodhits && self.minstanex_lasthit)
--              {
-                       AnnounceTo(self, "impressive");
 -                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_ACHIEVEMENT_IMPRESSIVE);
--                      damage_goodhits = 0; // only every second time
--              }
++              Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_ACHIEVEMENT_IMPRESSIVE);
++              damage_goodhits = 0; // only every second time
        }
  
        self.minstanex_lasthit = damage_goodhits;
            }
        }
        else
--        WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3"), w_shotorg, v);
-               
 -
 -      if (g_minstagib)
 -              W_DecreaseAmmo(ammo_cells, 1, autocvar_g_balance_minstanex_reload_ammo);
 -      else
 -              W_DecreaseAmmo(ammo_cells, autocvar_g_balance_minstanex_ammo, autocvar_g_balance_minstanex_reload_ammo);
 -}
 -
 -
 -.float minstagib_nextthink;
 -.float minstagib_needammo;
 -void minstagib_stop_countdown(entity e)
 -{
 -      if (!e.minstagib_needammo)
 -              return;
 -      Kill_Notification(NOTIF_ONE_ONLY, e, MSG_CENTER_CPID, CPID_MINSTA_FINDAMMO);
 -      e.minstagib_needammo = FALSE;
 -}
 -void minstagib_ammocheck(void)
 -{
 -      if (time < self.minstagib_nextthink)
 -              return;
 -
 -      if (self.deadflag || gameover || (self.flags & FL_GODMODE))
 -              minstagib_stop_countdown(self);
 -      else if (self.ammo_cells > 0 || (self.items & IT_UNLIMITED_WEAPON_AMMO))
 -      {
 -              minstagib_stop_countdown(self);
 -              self.health = 100;
 -      }
 -      else
 -      {
 -              self.minstagib_needammo = TRUE;
 -              if (self.health == 5)
 -              {
 -                      Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
 -                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_MINSTAGIB_TERMINATED);
 -              }
 -              else if (self.health == 10)
 -              {
 -                      Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
 -                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_1);
 -              }
 -              else if (self.health == 20)
 -              {
 -                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
 -                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_2);
 -              }
 -              else if (self.health == 30)
 -              {
 -                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
 -                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_3);
 -              }
 -              else if (self.health == 40)
 -              {
 -                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
 -                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_4);
 -              }
 -              else if (self.health == 50)
 -              {
 -                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
 -                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_5);
 -              }
 -              else if (self.health == 60)
 -              {
 -                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
 -                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_6);
 -              }
 -              else if (self.health == 70)
 -              {
 -                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
 -                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_7);
 -              }
 -              else if (self.health == 80)
 -              {
 -                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
 -                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_8);
 -              }
 -              else if (self.health == 90)
 -              {
 -                      Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_MINSTA_FINDAMMO);
 -                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
 -                      Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_9);
 -              }
 -              else if (self.health == 100)
 -              {
 -                      Send_Notification(NOTIF_ONE_ONLY, self, MSG_MULTI, MULTI_MINSTA_FINDAMMO);
 -                      Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
 -              }
 -      }
 -      self.minstagib_nextthink = time + 1;
++              WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3"), w_shotorg, v);
++      
 +      W_DecreaseAmmo(ammo_cells, ((g_minstagib) ? 1 : autocvar_g_balance_minstanex_ammo), autocvar_g_balance_minstanex_reload_ammo);
  }
  
  void spawnfunc_weapon_minstanex (void); // defined in t_items.qc