setorigin(e, e.origin);
}
+float it_armor_large_time;
+float it_health_mega_time;
+float it_invisible_time;
+float it_speed_time;
+float it_extralife_time;
+float it_strength_time;
+float it_shield_time;
+float it_fuelregen_time;
+float it_jetpack_time;
+
+void Item_ItemsTime_Init()
+{
+ it_armor_large_time = -1;
+ it_health_mega_time = -1;
+ it_invisible_time = -1;
+ it_speed_time = -1;
+ it_extralife_time = -1;
+ it_strength_time = -1;
+ it_shield_time = -1;
+ it_fuelregen_time = -1;
+ it_jetpack_time = -1;
+}
+void Item_ClearItemsTime()
+{
+ self.item_armor_large_time = (it_armor_large_time == -1) ? -1 : 0;
+ self.item_health_mega_time = (it_health_mega_time == -1) ? -1 : 0;
+ self.item_invisible_time = (it_invisible_time == -1) ? -1 : 0;
+ self.item_speed_time = (it_speed_time == -1) ? -1 : 0;
+ self.item_extralife_time = (it_extralife_time == -1) ? -1 : 0;
+ self.item_strength_time = (it_strength_time == -1) ? -1 : 0;
+ self.item_shield_time = (it_shield_time == -1) ? -1 : 0;
+ self.item_fuelregen_time = (it_fuelregen_time == -1) ? -1 : 0;
+ self.item_jetpack_time = (it_jetpack_time == -1) ? -1 : 0;
+}
+void Item_GetItemsTime(entity e)
+{
+ e.item_armor_large_time = it_armor_large_time;
+ e.item_health_mega_time = it_health_mega_time;
+ e.item_invisible_time = it_invisible_time;
+ e.item_speed_time = it_speed_time;
+ e.item_extralife_time = it_extralife_time;
+ e.item_strength_time = it_strength_time;
+ e.item_shield_time = it_shield_time;
+ e.item_fuelregen_time = it_fuelregen_time;
+ e.item_jetpack_time = it_jetpack_time;
+}
+void Item_UpdateTime(entity e, float t)
+{
+ if(g_minstagib)
+ {
+ switch(e.items)
+ {
+ case IT_STRENGTH://"item-invis"
+ if (it_invisible_time > time && t > it_invisible_time)
+ return;
+ it_invisible_time = t;
+ return;
+ case IT_NAILS://"item-extralife"
+ if (it_extralife_time > time && t > it_extralife_time)
+ return;
+ it_extralife_time = t;
+ return;
+ case IT_INVINCIBLE://"item-speed"
+ if (it_speed_time > time && t > it_speed_time)
+ return;
+ it_speed_time = t;
+ return;
+ }
+ }
+ else
+ {
+ switch(e.items)
+ {
+ case IT_HEALTH:
+ //if (e.classname == "item_health_mega")
+ {
+ if (it_health_mega_time > time && t > it_health_mega_time)
+ return;
+ it_health_mega_time = t;
+ }
+ return;
+ case IT_ARMOR:
+ if (e.classname == "item_armor_large")
+ {
+ if (it_armor_large_time > time && t > it_armor_large_time)
+ return;
+ it_armor_large_time = t;
+ }
+ return;
+ case IT_STRENGTH://"item-strength"
+ if (it_strength_time > time && t > it_strength_time)
+ return;
+ it_strength_time = t;
+ return;
+ case IT_INVINCIBLE://"item-shield"
+ if (it_shield_time > time && t > it_shield_time)
+ return;
+ it_shield_time = t;
+ return;
+ }
+ }
+ switch(e.items)
+ {
+ case IT_FUEL_REGEN://"item-fuelregen"
+ if (it_fuelregen_time > time && t > it_fuelregen_time)
+ return;
+ it_fuelregen_time = t;
+ return;
+ case IT_JETPACK://"item-jetpack"
+ if (it_jetpack_time > time && t > it_jetpack_time)
+ return;
+ it_jetpack_time = t;
+ return;
+ }
+}
+
void Item_Respawn (void)
{
+ float t;
+ entity head;
Item_Show(self, 1);
if(!g_minstagib && self.items == IT_STRENGTH)
sound (self, CH_TRIGGER, "misc/strength_respawn.wav", VOL_BASE, ATTN_NORM); // play respawn sound
sound (self, CH_TRIGGER, "misc/itemrespawn.wav", VOL_BASE, ATTN_NORM); // play respawn sound
setorigin (self, self.origin);
+ if (self.flags & FL_POWERUP || self.classname == "item_armor_large" || self.items == IT_HEALTH)
+ {
+ for(t = 0, head = world; (head = find(head, classname, self.classname)); )
+ {
+ // in minstagib .classname is "minstagib" for every item
+ if (g_minstagib && self.items != head.items)
+ continue;
+ if (head.scheduledrespawntime > time)
+ if (t == 0 || head.scheduledrespawntime < t)
+ t = head.scheduledrespawntime;
+ }
+ Item_UpdateTime(self, t);
+ FOR_EACH_REALCLIENT(head)
+ {
+ if (head.classname != "player")
+ Item_GetItemsTime(head);
+ }
+ }
+
//pointparticles(particleeffectnum("item_respawn"), self.origin + self.mins_z * '0 0 1' + '0 0 48', '0 0 0', 1);
pointparticles(particleeffectnum("item_respawn"), self.origin + 0.5 * (self.mins + self.maxs), '0 0 0', 1);
}
{
case IT_STRENGTH: name = "item-strength"; rgb = '0 0 1'; break;
case IT_INVINCIBLE: name = "item-shield"; rgb = '1 0 1'; break;
+ case IT_HEALTH:
+ //if (self.classname == "item_health_mega")
+ {name = "item_health_mega"; rgb = '1 0 0';}
+ break;
+ case IT_ARMOR:
+ if (self.classname == "item_armor_large")
+ {name = "item_armor_large"; rgb = '0 1 0';}
+ break;
}
}
switch(self.items)
{
WaypointSprite_Spawn(name, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, TRUE, RADARICON_POWERUP, rgb);
if(self.waypointsprite_attached)
+ {
+ if (self.items == IT_HEALTH || self.items == IT_ARMOR)
+ WaypointSprite_UpdateRule(self.waypointsprite_attached, 0, SPRITERULE_SPECTATOR);
WaypointSprite_UpdateBuildFinished(self.waypointsprite_attached, time + ITEM_RESPAWN_TICKS);
+ }
}
}
sound (self, CH_TRIGGER, "misc/itemrespawncountdown.wav", VOL_BASE, ATTN_NORM); // play respawn sound
void Item_ScheduleRespawnIn(entity e, float t)
{
- if(e.flags & FL_POWERUP)
+ if(e.flags & FL_POWERUP || self.classname == "item_armor_large" || self.items == IT_HEALTH)
{
e.think = Item_RespawnCountdown;
e.nextthink = time + max(0, t - ITEM_RESPAWN_TICKS);
+ e.scheduledrespawntime = e.nextthink + ITEM_RESPAWN_TICKS;
e.count = 0;
}
else
{
e.think = Item_Respawn;
e.nextthink = time + t;
+ e.scheduledrespawntime = e.nextthink;
+ }
+ Item_UpdateTime(e, e.scheduledrespawntime);
+ FOR_EACH_REALCLIENT(e)
+ {
+ if (e.classname != "player")
+ Item_GetItemsTime(e);
}
}
Item_ScheduleRespawnIn(e, game_starttime - time + ITEM_RESPAWNTIME_INITIAL(e));
}
+float ITEM_MODE_NONE = 0;
+float ITEM_MODE_HEALTH = 1;
+float ITEM_MODE_ARMOR = 2;
+float ITEM_MODE_FUEL = 3;
+float Item_GiveAmmoTo(entity item, entity player, .float ammofield, float ammomax, float mode)
+{
+ if (!item.ammofield)
+ return FALSE;
+
+ if (item.spawnshieldtime)
+ {
+ if ((player.ammofield < ammomax) || item.pickup_anyway)
+ {
+ player.ammofield = bound(player.ammofield, ammomax, player.ammofield + item.ammofield);
+ goto YEAH;
+ }
+ }
+ else if(g_weapon_stay == 2)
+ {
+ float mi = min(item.ammofield, ammomax);
+ if (player.ammofield < mi)
+ {
+ player.ammofield = mi;
+ goto YEAH;
+ }
+ }
+
+ return FALSE;
+
+:YEAH
+ switch(mode)
+ {
+ case ITEM_MODE_FUEL:
+ player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + autocvar_g_balance_pause_fuel_rot);
+ break;
+ case ITEM_MODE_HEALTH:
+ player.pauserothealth_finished = max(player.pauserothealth_finished, time + autocvar_g_balance_pause_health_rot);
+ break;
+ case ITEM_MODE_ARMOR:
+ player.pauserotarmor_finished = max(player.pauserotarmor_finished, time + autocvar_g_balance_pause_armor_rot);
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
float Item_GiveTo(entity item, entity player)
{
float _switchweapon;
{
float prevcells = player.ammo_cells;
- if(item.spawnshieldtime)
- {
- if (item.ammo_fuel)
- if (player.ammo_fuel < g_pickup_fuel_max)
- {
- pickedup = TRUE;
- player.ammo_fuel = bound(player.ammo_fuel, g_pickup_fuel_max, player.ammo_fuel + item.ammo_fuel);
- player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + autocvar_g_balance_pause_fuel_rot);
- }
-
- if (item.ammo_cells)
- if (player.ammo_cells < g_pickup_cells_max)
- {
- pickedup = TRUE;
- player.ammo_cells = bound(player.ammo_cells, g_pickup_cells_max, player.ammo_cells + item.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)
{
if not(player.weapons & W_WeaponBit(player.switchweapon))
_switchweapon = TRUE;
- if(item.spawnshieldtime)
- {
- if (item.ammo_shells)
- if ((player.ammo_shells < g_pickup_shells_max) || item.pickup_anyway)
- {
- pickedup = TRUE;
- player.ammo_shells = bound(player.ammo_shells, g_pickup_shells_max, player.ammo_shells + item.ammo_shells);
- }
- if (item.ammo_nails)
- if ((player.ammo_nails < g_pickup_nails_max) || item.pickup_anyway)
- {
- pickedup = TRUE;
- player.ammo_nails = bound(player.ammo_nails, g_pickup_nails_max, player.ammo_nails + item.ammo_nails);
- }
- if (item.ammo_rockets)
- if ((player.ammo_rockets < g_pickup_rockets_max) || item.pickup_anyway)
- {
- pickedup = TRUE;
- player.ammo_rockets = bound(player.ammo_rockets, g_pickup_rockets_max, player.ammo_rockets + item.ammo_rockets);
- }
- if (item.ammo_cells)
- if ((player.ammo_cells < g_pickup_cells_max) || item.pickup_anyway)
- {
- pickedup = TRUE;
- player.ammo_cells = bound(player.ammo_cells, g_pickup_cells_max, player.ammo_cells + item.ammo_cells);
- }
- if (item.ammo_fuel)
- if ((player.ammo_fuel < g_pickup_fuel_max) || item.pickup_anyway)
- {
- pickedup = TRUE;
- player.ammo_fuel = bound(player.ammo_fuel, g_pickup_fuel_max, player.ammo_fuel + item.ammo_fuel);
- player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + autocvar_g_balance_pause_fuel_rot);
- }
- }
+ 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)
- if ((it = item.weapons - (item.weapons & player.weapons)) || (g_pickup_weapons_anyway))
+ if ((it = item.weapons - (item.weapons & player.weapons)) || (item.spawnshieldtime && g_pickup_weapons_anyway))
{
pickedup = TRUE;
for(i = WEP_FIRST; i <= WEP_LAST; ++i)
sprint (player, strcat("You got the ^2", item.netname, "\n"));
}
- if (item.strength_finished)
+ if (item.strength_finished)
{
pickedup = TRUE;
player.strength_finished = max(player.strength_finished, time) + autocvar_g_balance_powerup_strength_time;
pickedup = TRUE;
player.invincible_finished = max(player.invincible_finished, time) + autocvar_g_balance_powerup_invincible_time;
}
-
- if (item.health)
- if ((player.health < item.max_health) || item.pickup_anyway)
- {
- pickedup = TRUE;
- player.health = bound(player.health, item.max_health, player.health + item.health);
- player.pauserothealth_finished = max(player.pauserothealth_finished, time + autocvar_g_balance_pause_health_rot);
- }
- if (item.armorvalue)
- if ((player.armorvalue < item.max_armorvalue) || item.pickup_anyway)
- {
- pickedup = TRUE;
- player.armorvalue = bound(player.armorvalue, item.max_armorvalue, player.armorvalue + item.armorvalue);
- player.pauserotarmor_finished = max(player.pauserotarmor_finished, time + autocvar_g_balance_pause_armor_rot);
- }
}
:skip
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_UpdateTime(self, 0);
}
self.bot_pickup = TRUE;