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;
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;
}
}
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;
}
}
}
}
+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);
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();
}
{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)
{
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
return 1;
}
-.entity itemdef;
-
void Item_Touch (void)
{
entity e, head;
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; }
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;
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);