]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into Lyberta/RandomItems
authorLyberta <lyberta@lyberta.net>
Mon, 16 Oct 2017 14:04:26 +0000 (17:04 +0300)
committerLyberta <lyberta@lyberta.net>
Mon, 16 Oct 2017 14:04:26 +0000 (17:04 +0300)
1  2 
qcsrc/common/t_items.qc

diff --combined qcsrc/common/t_items.qc
index 81568e86a21ce1bbcc6de27620aabd8d039ee59f,50ae0c336c51393ee61d7a14e70875588fd1d6e3..f4431eed2887f84e812e7bd61bcc46dac87eb6c7
@@@ -842,8 -842,6 +842,6 @@@ float Item_GiveTo(entity item, entity p
                player.superweapons_finished = max(player.superweapons_finished, time) + item.superweapons_finished;
        }
  
- LABEL(skip)
        // always eat teamed entities
        if(item.team)
                pickedup = true;
  
  void Item_Touch(entity this, entity toucher)
  {
 -
        // remove the item if it's currnetly in a NODROP brush or hits a NOIMPACT surface (such as sky)
 -      if (this.classname == "droppedweapon")
 +      if (Item_IsLoot(this))
        {
                if (ITEM_TOUCH_NEEDKILL())
                {
  
        toucher = M_ARGV(1, entity);
  
 -      if (this.classname == "droppedweapon")
 +      if (Item_IsExpiring(this))
        {
                this.strength_finished = max(0, this.strength_finished - time);
                this.invincible_finished = max(0, this.invincible_finished - time);
                this.superweapons_finished = max(0, this.superweapons_finished - time);
        }
 -      entity it = this.itemdef;
 -      bool gave = ITEM_HANDLE(Pickup, it, this, toucher);
 +      bool gave = ITEM_HANDLE(Pickup, this.itemdef, this, toucher);
        if (!gave)
        {
 -              if (this.classname == "droppedweapon")
 +              if (Item_IsExpiring(this))
                {
                        // undo what we did above
                        this.strength_finished += time;
@@@ -931,40 -931,30 +929,40 @@@ LABEL(pickup
        Send_Effect(EFFECT_ITEM_PICKUP, CENTER_OR_VIEWOFS(this), '0 0 0', 1);
        _sound (toucher, (this.itemdef.instanceOfPowerup ? CH_TRIGGER_SINGLE : CH_TRIGGER), (this.item_pickupsound ? this.item_pickupsound : Sound_fixpath(this.item_pickupsound_ent)), VOL_BASE, ATTEN_NORM);
  
 -      if (this.classname == "droppedweapon")
 +      MUTATOR_CALLHOOK(ItemTouched, this, toucher);
 +      if (wasfreed(this))
 +      {
 +              return;
 +      }
 +
 +      if (Item_IsLoot(this))
 +      {
                delete(this);
 -      else if (this.spawnshieldtime)
 +              return;
 +      }
 +      if (!this.spawnshieldtime)
        {
 -              entity e;
 -              if(this.team)
 +              return;
 +      }
 +      entity e;
 +      if (this.team)
 +      {
 +              RandomSelection_Init();
 +              IL_EACH(g_items, it.team == this.team,
                {
 -                      RandomSelection_Init();
 -                      IL_EACH(g_items, it.team == this.team,
 +                      if (it.itemdef) // is a registered item
                        {
 -                              if(it.itemdef) // is a registered item
 -                              {
 -                                      Item_Show(it, -1);
 -                                      it.scheduledrespawntime = 0;
 -                                      RandomSelection_AddEnt(it, it.cnt, 0);
 -                              }
 -                      });
 -                      e = RandomSelection_chosen_ent;
 -                      Item_Show(e, 1); // reset its state so it is visible (extra sendflags doesn't matter, this happens anyway)
 -              }
 -              else
 -                      e = this;
 -              Item_ScheduleRespawn(e);
 +                              Item_Show(it, -1);
 +                              it.scheduledrespawntime = 0;
 +                              RandomSelection_AddEnt(it, it.cnt, 0);
 +                      }
 +              });
 +              e = RandomSelection_chosen_ent;
 +              Item_Show(e, 1); // reset its state so it is visible (extra sendflags doesn't matter, this happens anyway)
        }
 +      else
 +              e = this;
 +      Item_ScheduleRespawn(e);
  }
  
  void Item_Reset(entity this)
        Item_Show(this, !this.state);
        setorigin(this, this.origin);
  
 -      if (this.classname != "droppedweapon")
 +      if (Item_IsLoot(this))
        {
 -              setthink(this, Item_Think);
 -              this.nextthink = time;
 -
 -              if (this.waypointsprite_attached)
 -                      WaypointSprite_Kill(this.waypointsprite_attached);
 -
 -              if (this.itemdef.instanceOfPowerup || (this.weapons & WEPSET_SUPERWEAPONS)) // do not spawn powerups initially!
 -                      Item_ScheduleInitialRespawn(this);
 +              return;
 +      }
 +      setthink(this, Item_Think);
 +      this.nextthink = time;
 +      if (this.waypointsprite_attached)
 +      {
 +              WaypointSprite_Kill(this.waypointsprite_attached);
 +      }
 +      if (this.itemdef.instanceOfPowerup || (this.weapons & WEPSET_SUPERWEAPONS)) // do not spawn powerups initially!
 +      {
 +              Item_ScheduleInitialRespawn(this);
        }
  }
  
@@@ -1216,9 -1203,11 +1214,9 @@@ void _StartItem(entity this, entity def
                return;
        }
  
 -      // is it a dropped weapon?
 -      if (this.classname == "droppedweapon")
 +      if (Item_IsLoot(this))
        {
                this.reset = SUB_Remove;
 -              // it's a dropped weapon
                set_movetype(this, MOVETYPE_TOSS);
  
                // Savage: remove thrown items after a certain period of time ("garbage collection")
                this.takedamage = DAMAGE_YES;
                this.event_damage = Item_Damage;
  
 -              if(this.strength_finished || this.invincible_finished || this.superweapons_finished)
 +              if (Item_IsExpiring(this))
                {
                        // if item is worthless after a timer, have it expire then
                        this.nextthink = max(this.strength_finished, this.invincible_finished, this.superweapons_finished);
  
        if(def.instanceOfWeaponPickup)
        {
 -              if (this.classname != "droppedweapon") // if dropped, colormap is already set up nicely
 +              if (!Item_IsLoot(this)) // if dropped, colormap is already set up nicely
                        this.colormap = 1024; // color shirt=0 pants=0 grey
                else
                        this.gravity = 1;
  
  void StartItem(entity this, GameItem def)
  {
 +    def = def.m_spawnfunc_hookreplace(def, this);
 +    if (def.spawnflags & ITEM_FLAG_MUTATORBLOCKED)
 +    {
 +        delete(this);
 +        return;
 +    }
 +    this.classname = def.m_canonical_spawnfunc;
      _StartItem(
        this,
        this.itemdef = def,
@@@ -1442,9 -1424,114 +1440,9 @@@ void setItemGroupCount(
        }
  }
  
 -spawnfunc(item_rockets)
 -{
 -    StartItem(this, ITEM_Rockets);
 -}
 -
 -spawnfunc(item_bullets)
 -{
 -      if(!weaponswapping && autocvar_sv_q3acompat_machineshotgunswap &&
 -         (this.classname != "droppedweapon"))
 -      {
 -              weaponswapping = true;
 -              spawnfunc_item_shells(this);
 -              weaponswapping = false;
 -              return;
 -      }
 -
 -    StartItem(this, ITEM_Bullets);
 -}
 -
 -spawnfunc(item_cells)
 -{
 -      StartItem(this, ITEM_Cells);
 -}
 -
 -spawnfunc(item_plasma)
 -{
 -      StartItem(this, ITEM_Plasma);
 -}
 -
 -spawnfunc(item_shells)
 -{
 -      if(!weaponswapping && autocvar_sv_q3acompat_machineshotgunswap &&
 -         (this.classname != "droppedweapon"))
 -      {
 -              weaponswapping = true;
 -              spawnfunc_item_bullets(this);
 -              weaponswapping = false;
 -              return;
 -      }
 -
 -      StartItem(this, ITEM_Shells);
 -}
 -
 -spawnfunc(item_armor_small)
 -{
 -      StartItem(this, ITEM_ArmorSmall);
 -}
 -
 -spawnfunc(item_armor_medium)
 -{
 -      StartItem(this, ITEM_ArmorMedium);
 -}
 -
 -spawnfunc(item_armor_big)
 -{
 -      StartItem(this, ITEM_ArmorBig);
 -}
 -
 -spawnfunc(item_armor_mega)
 -{
 -      StartItem(this, ITEM_ArmorMega);
 -}
 -
 -spawnfunc(item_health_small)
 -{
 -      StartItem(this, ITEM_HealthSmall);
 -}
 -
 -spawnfunc(item_health_medium)
 -{
 -    StartItem(this, ITEM_HealthMedium);
 -}
 -
 -spawnfunc(item_health_big)
 -{
 -      StartItem(this, ITEM_HealthBig);
 -}
 -
 -spawnfunc(item_health_mega)
 -{
 -    StartItem(this, ITEM_HealthMega);
 -}
 -
 -// support old misnamed entities
 -spawnfunc(item_armor1) { spawnfunc_item_armor_small(this); }  // FIXME: in Quake this is green armor, in Xonotic maps it is an armor shard
 -spawnfunc(item_armor25) { spawnfunc_item_armor_mega(this); }
 -spawnfunc(item_armor_large) { spawnfunc_item_armor_mega(this); }
 -spawnfunc(item_health1) { spawnfunc_item_health_small(this); }
 -spawnfunc(item_health25) { spawnfunc_item_health_medium(this); }
 -spawnfunc(item_health_large) { spawnfunc_item_health_big(this); }
 -spawnfunc(item_health100) { spawnfunc_item_health_mega(this); }
 -
 -spawnfunc(item_strength)
 -{
 -      StartItem(this, ITEM_Strength);
 -}
 -
 -spawnfunc(item_invincible)
 -{
 -      StartItem(this, ITEM_Shield);
 -}
 -
 -// compatibility:
 -spawnfunc(item_quad) { this.classname = "item_strength";spawnfunc_item_strength(this);}
 -
  void target_items_use(entity this, entity actor, entity trigger)
  {
 -      if(actor.classname == "droppedweapon")
 +      if(Item_IsLoot(actor))
        {
                EXACTTRIGGER_TOUCH(this, trigger);
                delete(actor);
                EXACTTRIGGER_TOUCH(this, trigger);
        }
  
 -      IL_EACH(g_items, it.enemy == actor && it.classname == "droppedweapon",
 +      IL_EACH(g_items, it.enemy == actor && Item_IsLoot(it),
        {
                delete(it);
        });
@@@ -1581,6 -1668,31 +1579,6 @@@ spawnfunc(target_items
        }
  }
  
 -spawnfunc(item_fuel)
 -{
 -      StartItem(this, ITEM_JetpackFuel);
 -}
 -
 -spawnfunc(item_fuel_regen)
 -{
 -      if(start_items & ITEM_JetpackRegen.m_itemid)
 -      {
 -              spawnfunc_item_fuel(this);
 -              return;
 -      }
 -      StartItem(this, ITEM_JetpackRegen);
 -}
 -
 -spawnfunc(item_jetpack)
 -{
 -      if(start_items & ITEM_Jetpack.m_itemid)
 -      {
 -              spawnfunc_item_fuel(this);
 -              return;
 -      }
 -      StartItem(this, ITEM_Jetpack);
 -}
 -
  float GiveWeapon(entity e, float wpn, float op, float val)
  {
        WepSet v0, v1;