X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Ft_items.qc;h=11f81b1d644f8da3c61a50bb52dcb7814de555a9;hb=99e4fa0264127dfcf4675d5f645061b51af815e4;hp=b56dfec47d56a79f158cbad1d4e2c74a026467cd;hpb=ed623712a6dfd191c610cbb7b599226811ed814d;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index b56dfec47..11f81b1d6 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -441,8 +441,159 @@ void Item_Show (entity e, float mode) e.SendFlags |= ISF_STATUS; } +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; +float it_superweapons_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; + it_superweapons_time = -1; +} +void Item_ItemsTime_Reset() +{ + it_armor_large_time = (it_armor_large_time == -1) ? -1 : 0; + it_health_mega_time = (it_health_mega_time == -1) ? -1 : 0; + it_invisible_time = (it_invisible_time == -1) ? -1 : 0; + it_speed_time = (it_speed_time == -1) ? -1 : 0; + it_extralife_time = (it_extralife_time == -1) ? -1 : 0; + it_strength_time = (it_strength_time == -1) ? -1 : 0; + it_shield_time = (it_shield_time == -1) ? -1 : 0; + it_fuelregen_time = (it_fuelregen_time == -1) ? -1 : 0; + it_jetpack_time = (it_jetpack_time == -1) ? -1 : 0; + it_superweapons_time= (it_superweapons_time== -1) ? -1 : 0; +} +void Item_ItemsTime_ResetForPlayer(entity e) +{ + e.item_armor_large_time = (it_armor_large_time == -1) ? -1 : 0; + e.item_health_mega_time = (it_health_mega_time == -1) ? -1 : 0; + e.item_invisible_time = (it_invisible_time == -1) ? -1 : 0; + e.item_speed_time = (it_speed_time == -1) ? -1 : 0; + e.item_extralife_time = (it_extralife_time == -1) ? -1 : 0; + e.item_strength_time = (it_strength_time == -1) ? -1 : 0; + e.item_shield_time = (it_shield_time == -1) ? -1 : 0; + e.item_fuelregen_time = (it_fuelregen_time == -1) ? -1 : 0; + e.item_jetpack_time = (it_jetpack_time == -1) ? -1 : 0; + e.item_superweapons_time= (it_superweapons_time== -1) ? -1 : 0; +} +void Item_ItemsTime_Get(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; + e.item_superweapons_time = it_superweapons_time; +} +float Item_ItemsTime_UpdateTime_Check(float item_time, float t) +{ + if(t == 0 && item_time == -1) + return TRUE; + if(time < t && (item_time <= time || t < item_time)) + return TRUE; + return FALSE; +} +void Item_ItemsTime_UpdateTime(entity e, float t) +{ + if(g_minstagib) + { + switch(e.items) + { + case IT_STRENGTH://"item-invis" + if(Item_ItemsTime_UpdateTime_Check(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; + break; + case IT_INVINCIBLE://"item-speed" + if(Item_ItemsTime_UpdateTime_Check(it_speed_time, t)) + it_speed_time = t; + break; + } + } + else + { + 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; + 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; + break; + case IT_STRENGTH://"item-strength" + if(Item_ItemsTime_UpdateTime_Check(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; + break; + default: + if(WEPSET_CONTAINS_ANY_EA(e, WEPBIT_SUPERWEAPONS)) + if(Item_ItemsTime_UpdateTime_Check(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; + break; + case IT_JETPACK://"item-jetpack" + if(Item_ItemsTime_UpdateTime_Check(it_jetpack_time, t)) + it_jetpack_time = t; + break; + } +} +void Item_ItemsTime_GetForAll() +{ + entity e; + if(inWarmupStage) + { + FOR_EACH_REALCLIENT(e) + Item_ItemsTime_Get(e); + } + else + { + FOR_EACH_REALCLIENT(e) + { + if (e.classname != "player") + Item_ItemsTime_Get(e); + } + } +} + 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 @@ -452,6 +603,12 @@ void Item_Respawn (void) 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 || WEPSET_CONTAINS_ANY_EA(self, WEPBIT_SUPERWEAPONS)) + { + Item_ItemsTime_UpdateTime(self, 0); + Item_ItemsTime_GetForAll(); + } + //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); } @@ -488,6 +645,14 @@ void Item_RespawnCountdown (void) { 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) @@ -504,16 +669,20 @@ void Item_RespawnCountdown (void) rgb = '1 0 0'; } } - if(!name) - { - print("Unknown powerup-marked item is wanting to respawn\n"); - localcmd(sprintf("prvm_edict server %d\n", num_for_edict(self))); - } if(name) { 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); + } + } + else + { + print("Unknown powerup-marked item is wanting to respawn\n"); + localcmd(sprintf("prvm_edict server %d\n", num_for_edict(self))); } } sound (self, CH_TRIGGER, "misc/itemrespawncountdown.wav", VOL_BASE, ATTN_NORM); // play respawn sound @@ -527,16 +696,57 @@ void Item_RespawnCountdown (void) void Item_ScheduleRespawnIn(entity e, float t) { - if((e.flags & FL_POWERUP) || WEPSET_CONTAINS_ANY_EA(e, WEPBIT_SUPERWEAPONS)) + if((e.flags & FL_POWERUP) || WEPSET_CONTAINS_ANY_EA(e, WEPBIT_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(WEPSET_CONTAINS_ANY_EA(e, WEPBIT_SUPERWEAPONS)) + { + for(t = e.scheduledrespawntime, head = world; (head = nextent(head)); ) + { + if(e == head) + continue; + if(clienttype(head) == CLIENTTYPE_NOTACLIENT) + if(WEPSET_CONTAINS_ANY_EA(head, WEPBIT_SUPERWEAPONS)) + if(head.classname != "weapon_info") + { + if(head.scheduledrespawntime <= time) + { + t = 0; + break; + } + if(head.scheduledrespawntime < t) + t = head.scheduledrespawntime; + } + } + } + else + { + for(t = e.scheduledrespawntime, head = world; (head = find(head, classname, e.classname)); ) + { + // in minstagib .classname is "minstagib" for every item + if(e == head || (g_minstagib && e.items != head.items)) + continue; + if(head.scheduledrespawntime <= time) + { + t = 0; + break; + } + if(head.scheduledrespawntime < t) + t = head.scheduledrespawntime; + } + } + Item_ItemsTime_UpdateTime(e, t); + Item_ItemsTime_GetForAll(); } else { e.think = Item_Respawn; e.nextthink = time + t; + e.scheduledrespawntime = e.nextthink; } } @@ -639,7 +849,7 @@ float Item_GiveTo(entity item, entity player) // AnnounceTo(player, "ammo"); if (WEPSET_CONTAINS_EW(item, WEP_MINSTANEX)) - W_GiveWeapon (player, WEP_MINSTANEX, item.netname); + W_GiveWeapon (player, WEP_MINSTANEX); player.health = 100; } @@ -709,7 +919,7 @@ float Item_GiveTo(entity item, entity player) pickedup = TRUE; for(i = WEP_FIRST; i <= WEP_LAST; ++i) if(WEPSET_CONTAINS_AW(it, i)) - W_GiveWeapon (player, i, item.netname); + W_GiveWeapon(player, i); } } @@ -834,7 +1044,7 @@ void Item_Reset() if(self.classname != "droppedweapon") { - self.think = SUB_Null; + self.think = func_null; self.nextthink = 0; if(self.waypointsprite_attached) @@ -1161,6 +1371,8 @@ 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); } self.bot_pickup = TRUE; @@ -1214,6 +1426,14 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, Item_Reset(); Net_LinkEntity(self, FALSE, 0, ItemSend); + + // call this hook after everything else has been done + if(MUTATOR_CALLHOOK(Item_Spawn)) + { + startitem_failed = TRUE; + remove(self); + return; + } } /* replace items in minstagib