1 REGISTER_MUTATOR(itemstime, true);
4 void IT_Write(entity e, int i, float f) {
5 if (!IS_REAL_CLIENT(e)) return;
7 WriteByte(MSG_ONE, SVC_TEMPENTITY);
8 WriteMutator(MSG_ONE, itemstime);
10 WriteFloat(MSG_ONE, f);
15 MUTATOR_HOOKFUNCTION(itemstime, CSQC_Parse_TempEntity) {
16 if (MUTATOR_RETURNVALUE) return false;
17 if (!ReadMutatorEquals(mutator_argv_int_0, itemstime)) return false;
19 float f = ReadFloat();
20 ItemsTime_time[i] = f;
26 float it_armor_large_time;
27 float it_health_mega_time;
28 float it_invisible_time;
30 float it_extralife_time;
31 float it_strength_time;
33 float it_fuelregen_time;
34 float it_jetpack_time;
35 float it_superweapons_time;
37 void Item_ItemsTime_Init()
39 it_armor_large_time = -1;
40 it_health_mega_time = -1;
41 it_invisible_time = -1;
43 it_extralife_time = -1;
44 it_strength_time = -1;
46 it_fuelregen_time = -1;
48 it_superweapons_time = -1;
51 STATIC_INIT(ItemsTime_Init) {
53 Item_ItemsTime_Init();
56 void Item_ItemsTime_ResetTimes()
58 it_armor_large_time = (it_armor_large_time == -1) ? -1 : 0;
59 it_health_mega_time = (it_health_mega_time == -1) ? -1 : 0;
60 it_invisible_time = (it_invisible_time == -1) ? -1 : 0;
61 it_speed_time = (it_speed_time == -1) ? -1 : 0;
62 it_extralife_time = (it_extralife_time == -1) ? -1 : 0;
63 it_strength_time = (it_strength_time == -1) ? -1 : 0;
64 it_shield_time = (it_shield_time == -1) ? -1 : 0;
65 it_fuelregen_time = (it_fuelregen_time == -1) ? -1 : 0;
66 it_jetpack_time = (it_jetpack_time == -1) ? -1 : 0;
67 it_superweapons_time = (it_superweapons_time == -1) ? -1 : 0;
70 void Item_ItemsTime_ResetTimesForPlayer(entity e)
72 IT_Write(e, item_armor_large_time , (it_armor_large_time == -1) ? -1 : 0);
73 IT_Write(e, item_health_mega_time , (it_health_mega_time == -1) ? -1 : 0);
74 IT_Write(e, item_invisible_time , (it_invisible_time == -1) ? -1 : 0);
75 IT_Write(e, item_speed_time , (it_speed_time == -1) ? -1 : 0);
76 IT_Write(e, item_extralife_time , (it_extralife_time == -1) ? -1 : 0);
77 IT_Write(e, item_strength_time , (it_strength_time == -1) ? -1 : 0);
78 IT_Write(e, item_shield_time , (it_shield_time == -1) ? -1 : 0);
79 IT_Write(e, item_fuelregen_time , (it_fuelregen_time == -1) ? -1 : 0);
80 IT_Write(e, item_jetpack_time , (it_jetpack_time == -1) ? -1 : 0);
81 IT_Write(e, item_superweapons_time, (it_superweapons_time == -1) ? -1 : 0);
84 void Item_ItemsTime_SetTimesForPlayer(entity e)
86 IT_Write(e, item_armor_large_time , it_armor_large_time );
87 IT_Write(e, item_health_mega_time , it_health_mega_time );
88 IT_Write(e, item_invisible_time , it_invisible_time );
89 IT_Write(e, item_speed_time , it_speed_time );
90 IT_Write(e, item_extralife_time , it_extralife_time );
91 IT_Write(e, item_strength_time , it_strength_time );
92 IT_Write(e, item_shield_time , it_shield_time );
93 IT_Write(e, item_fuelregen_time , it_fuelregen_time );
94 IT_Write(e, item_jetpack_time , it_jetpack_time );
95 IT_Write(e, item_superweapons_time, it_superweapons_time);
98 void Item_ItemsTime_SetTime(entity e, float t)
100 if (!autocvar_sv_itemstime)
107 case IT_STRENGTH://"item-invis"
108 it_invisible_time = t;
110 case IT_NAILS://"item-extralife"
111 it_extralife_time = t;
113 case IT_INVINCIBLE://"item-speed"
122 case ITEM_HealthMega.m_itemid:
123 // if (e.itemdef == ITEM_HealthMega) // e.items == IT_HEALTH unequivocally identifies it
124 it_health_mega_time = t;
126 case ITEM_ArmorMega.m_itemid:
127 if (e.itemdef == ITEM_ArmorMega) // e.items == IT_ARMOR doesn't unequivocally identifies it
128 it_armor_large_time = t;
130 case IT_STRENGTH://"item-strength"
131 it_strength_time = t;
133 case IT_INVINCIBLE://"item-shield"
137 if (e.weapons & WEPSET_SUPERWEAPONS)
138 it_superweapons_time = t;
143 case IT_FUEL_REGEN://"item-fuelregen"
144 it_fuelregen_time = t;
146 case IT_JETPACK://"item-jetpack"
152 void Item_ItemsTime_SetTimesForAllPlayers()
155 FOR_EACH_REALCLIENT(e) if (warmup_stage || !IS_PLAYER(e))
156 Item_ItemsTime_SetTimesForPlayer(e);
159 float Item_ItemsTime_UpdateTime(entity e, float t)
161 bool isavailable = (t == 0);
162 if (e.weapons & WEPSET_SUPERWEAPONS)
164 for (entity head = world; (head = nextent(head)); )
166 if (clienttype(head) != CLIENTTYPE_NOTACLIENT || !(head.weapons & WEPSET_SUPERWEAPONS) || head.classname == "weapon_info")
171 if (head.scheduledrespawntime <= time)
173 else if (t == 0 || head.scheduledrespawntime < t)
174 t = head.scheduledrespawntime;
179 for (entity head = world; (head = nextent(head)); )
181 if (head.itemdef != e.itemdef)
186 if (head.scheduledrespawntime <= time)
188 else if (t == 0 || head.scheduledrespawntime < t)
189 t = head.scheduledrespawntime;
193 t = -t; // let know the client there's another available item
197 MUTATOR_HOOKFUNCTION(itemstime, reset_map_global) {
198 Item_ItemsTime_ResetTimes();