]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/t_items.qc
Merge branch 'master' into Mario/modpack
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / t_items.qc
index e0f5a05e699afab484dfba7e571b872b793a8f54..37af9ee8618077742338ccdbdd6fa4b8becd1e8c 100644 (file)
@@ -475,17 +475,8 @@ void Item_ItemsTime_SetTimesForPlayer(entity e)
        e.item_jetpack_time = it_jetpack_time;
        e.item_superweapons_time = it_superweapons_time;
 }
-bool Item_ItemsTime_UpdateTime_Check(float item_time, float t)
-{
-       if(t == 0 && item_time == -1)
-               return true;
-       if(t < 0) // negative means there's another available item of the same kind
-               t = -t;
-       if(time < t && (item_time <= time || t < item_time))
-               return true;
-       return false;
-}
-void Item_ItemsTime_UpdateTime(entity e, float t)
+
+void Item_ItemsTime_SetTime(entity e, float t)
 {
        if(!autocvar_sv_itemstime)
                return;
@@ -495,16 +486,13 @@ void Item_ItemsTime_UpdateTime(entity e, float t)
                switch(e.items)
                {
                        case IT_STRENGTH://"item-invis"
-                               if(Item_ItemsTime_UpdateTime_Check(it_invisible_time, t))
-                                       it_invisible_time = t;
+                               it_invisible_time = t;
                                break;
                        case IT_NAILS://"item-extralife"
-                               if(Item_ItemsTime_UpdateTime_Check(it_extralife_time, t))
-                                       it_extralife_time = t;
+                               it_extralife_time = t;
                                break;
                        case IT_INVINCIBLE://"item-speed"
-                               if(Item_ItemsTime_UpdateTime_Check(it_speed_time, t))
-                                       it_speed_time = t;
+                               it_speed_time = t;
                                break;
                }
        }
@@ -513,38 +501,31 @@ void Item_ItemsTime_UpdateTime(entity e, float t)
                switch(e.items)
                {
                        case IT_HEALTH:
-                               //if (e.classname == "item_health_mega")
-                                       if(Item_ItemsTime_UpdateTime_Check(it_health_mega_time, t))
-                                               it_health_mega_time = t;
+                               // if(e.classname == "item_health_mega") // IT_HEALTH unequivocally identifies it
+                                       it_health_mega_time = t;
                                break;
                        case IT_ARMOR:
-                               if (e.classname == "item_armor_large")
-                                       if(Item_ItemsTime_UpdateTime_Check(it_armor_large_time, t))
-                                               it_armor_large_time = t;
+                               if(e.classname == "item_armor_large") // IT_ARMOR doesn't unequivocally identifies it
+                                       it_armor_large_time = t;
                                break;
                        case IT_STRENGTH://"item-strength"
-                               if(Item_ItemsTime_UpdateTime_Check(it_strength_time, t))
-                                       it_strength_time = t;
+                               it_strength_time = t;
                                break;
                        case IT_INVINCIBLE://"item-shield"
-                               if(Item_ItemsTime_UpdateTime_Check(it_shield_time, t))
-                                       it_shield_time = t;
+                               it_shield_time = t;
                                break;
                        default:
                                if(e.weapons & WEPSET_SUPERWEAPONS)
-                                       if(Item_ItemsTime_UpdateTime_Check(it_superweapons_time, t))
-                                               it_superweapons_time = t;
+                                       it_superweapons_time = t;
                }
        }
        switch(e.items)
        {
                case IT_FUEL_REGEN://"item-fuelregen"
-                       if(Item_ItemsTime_UpdateTime_Check(it_fuelregen_time, t))
-                               it_fuelregen_time = t;
+                       it_fuelregen_time = t;
                        break;
                case IT_JETPACK://"item-jetpack"
-                       if(Item_ItemsTime_UpdateTime_Check(it_jetpack_time, t))
-                               it_jetpack_time = t;
+                       it_jetpack_time = t;
                        break;
        }
 }
@@ -566,6 +547,45 @@ void Item_ItemsTime_SetTimesForAllPlayers()
        }
 }
 
+float Item_ItemsTime_UpdateTime(entity e, float t)
+{
+       entity head;
+       bool isavailable = (t == 0);
+       if(e.weapons & WEPSET_SUPERWEAPONS)
+       {
+               for(head = world; (head = nextent(head)); )
+               {
+                       if(clienttype(head) != CLIENTTYPE_NOTACLIENT || !(head.weapons & WEPSET_SUPERWEAPONS) || head.classname == "weapon_info")
+                               continue;
+                       if(e == head)
+                               continue;
+
+                       if(head.scheduledrespawntime <= time)
+                               isavailable = true;
+                       else if(t == 0 || head.scheduledrespawntime < t)
+                               t = head.scheduledrespawntime;
+               }
+       }
+       else
+       {
+               for(head = world; (head = nextent(head)); )
+               {
+                       if(head.itemdef != e.itemdef)
+                               continue;
+                       if(e == head)
+                               continue;
+
+                       if(head.scheduledrespawntime <= time)
+                               isavailable = true;
+                       else if(t == 0 || head.scheduledrespawntime < t)
+                               t = head.scheduledrespawntime;
+               }
+       }
+       if(isavailable)
+               t = -t; // let know the client there's another available item
+       return t;
+}
+
 void Item_Respawn (void)
 {
        Item_Show(self, 1);
@@ -580,21 +600,8 @@ void Item_Respawn (void)
 
        if(self.flags & FL_POWERUP || self.classname == "item_armor_large" || self.items == IT_HEALTH || (self.weapons & WEPSET_SUPERWEAPONS))
        {
-               entity head;
-               float t = 0;
-               float isavailable = true;
-               for(head = world; (head = find(head, classname, self.classname)); )
-               {
-                       // in instagib .classname is "instagib" for every item
-                       if(self == head || (g_instagib && self.items != head.items))
-                               continue;
-                       if(head.scheduledrespawntime > time && (t == 0 || head.scheduledrespawntime < t))
-                               t = head.scheduledrespawntime;
-               }
-
-               if(isavailable)
-                       t = -t; // let know the client there's another available item
-               Item_ItemsTime_UpdateTime(self, t);
+               float t = Item_ItemsTime_UpdateTime(self, 0);
+               Item_ItemsTime_SetTime(self, t);
                Item_ItemsTime_SetTimesForAllPlayers();
        }
 
@@ -637,9 +644,7 @@ void Item_RespawnCountdown (void)
                                                {name = "item_armor_large"; rgb = '0 1 0';}
                                        break;
                        }
-                       item_name = name;
-                       item_color = rgb;
-                       MUTATOR_CALLHOOK(Item_RespawnCountdown);
+                       MUTATOR_CALLHOOK(Item_RespawnCountdown, name, rgb);
                        name = item_name;
                        rgb = item_color;
                        if(self.flags & FL_WEAPON)
@@ -706,48 +711,12 @@ void Item_ScheduleRespawnIn(entity e, float t)
 {
        if((e.flags & FL_POWERUP) || (e.weapons & WEPSET_SUPERWEAPONS) || e.classname == "item_armor_large" || e.items == IT_HEALTH)
        {
-               entity head;
                e.think = Item_RespawnCountdown;
                e.nextthink = time + max(0, t - ITEM_RESPAWN_TICKS);
                e.scheduledrespawntime = e.nextthink + ITEM_RESPAWN_TICKS;
                e.count = 0;
-               if(e.weapons & WEPSET_SUPERWEAPONS)
-               {
-                       for(t = e.scheduledrespawntime, head = world; (head = nextent(head)); )
-                       {
-                               if(e == head)
-                                       continue;
-                               if(clienttype(head) == CLIENTTYPE_NOTACLIENT)
-                               if(head.weapons & WEPSET_SUPERWEAPONS)
-                               if(head.classname != "weapon_info")
-                               {
-                                       if(head.scheduledrespawntime <= time)
-                                       {
-                                               t = 0;
-                                               break;
-                                       }
-                                       if(head.scheduledrespawntime < t)
-                                               t = head.scheduledrespawntime;
-                               }
-                       }
-               }
-               else
-               {
-                       bool isavailable = false;
-                       for(t = e.scheduledrespawntime, head = world; (head = find(head, classname, e.classname)); )
-                       {
-                               // in instagib .classname is "instagib" for every item
-                               if(e == head || (g_instagib && e.items != head.items))
-                                       continue;
-                               if(head.scheduledrespawntime <= time)
-                                       isavailable = true;
-                               else if(head.scheduledrespawntime < t)
-                                       t = head.scheduledrespawntime;
-                       }
-                       if(isavailable)
-                               t = -t; // let know the client there's another available item
-               }
-               Item_ItemsTime_UpdateTime(e, t);
+               t = Item_ItemsTime_UpdateTime(e, e.scheduledrespawntime);
+               Item_ItemsTime_SetTime(e, t);
                Item_ItemsTime_SetTimesForAllPlayers();
        }
        else
@@ -905,8 +874,6 @@ float Item_GiveTo(entity item, entity player)
        return 1;
 }
 
-.entity itemdef;
-
 void Item_Touch (void)
 {
        entity e, head;
@@ -934,7 +901,7 @@ void Item_Touch (void)
        if (time < self.item_spawnshieldtime)
                return;
 
-       switch(MUTATOR_CALLHOOK(ItemTouch))
+       switch(MUTATOR_CALLHOOK(ItemTouch, self, other))
        {
                case MUT_ITEMTOUCH_RETURN: { return; }
                case MUT_ITEMTOUCH_PICKUP: { goto pickup; }
@@ -1329,7 +1296,7 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
                if((itemflags & (FL_POWERUP | FL_WEAPON)) || (itemid & (IT_HEALTH | IT_ARMOR | IT_KEY1 | IT_KEY2)))
                        self.target = "###item###"; // for finding the nearest item using find()
 
-               Item_ItemsTime_UpdateTime(self, 0);
+               Item_ItemsTime_SetTime(self, 0);
        }
 
        self.bot_pickup = true;
@@ -1389,7 +1356,7 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
                self.SendFlags |= ISF_ANGLES;
 
        // call this hook after everything else has been done
-       if(MUTATOR_CALLHOOK(Item_Spawn))
+       if(MUTATOR_CALLHOOK(Item_Spawn, self))
        {
                startitem_failed = true;
                remove(self);