]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/mutators/mutator/itemstime.qc
Hook reset_map_global to call Item_ItemsTime_ResetTimes()
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mutators / mutator / itemstime.qc
1 REGISTER_MUTATOR(itemstime, true);
2
3 #ifdef SVQC
4 void IT_Write(entity e, int i, float f) {
5     if (!IS_REAL_CLIENT(e)) return;
6     msg_entity = e;
7     WriteByte(MSG_ONE, SVC_TEMPENTITY);
8     WriteMutator(MSG_ONE, itemstime);
9     WriteByte(MSG_ONE, i);
10     WriteFloat(MSG_ONE, f);
11 }
12 #endif
13
14 #ifdef CSQC
15 MUTATOR_HOOKFUNCTION(itemstime, CSQC_Parse_TempEntity) {
16     if (MUTATOR_RETURNVALUE) return false;
17     if (!ReadMutatorEquals(mutator_argv_int_0, itemstime)) return false;
18     int i = ReadByte();
19     float f = ReadFloat();
20     ItemsTime_time[i] = f;
21     return true;
22 }
23 #endif
24
25 #ifdef SVQC
26 float it_armor_large_time;
27 float it_health_mega_time;
28 float it_invisible_time;
29 float it_speed_time;
30 float it_extralife_time;
31 float it_strength_time;
32 float it_shield_time;
33 float it_fuelregen_time;
34 float it_jetpack_time;
35 float it_superweapons_time;
36
37 void Item_ItemsTime_Init()
38 {
39     it_armor_large_time = -1;
40     it_health_mega_time = -1;
41     it_invisible_time = -1;
42     it_speed_time = -1;
43     it_extralife_time = -1;
44     it_strength_time = -1;
45     it_shield_time = -1;
46     it_fuelregen_time = -1;
47     it_jetpack_time = -1;
48     it_superweapons_time = -1;
49 }
50
51 STATIC_INIT(ItemsTime_Init) {
52     // items time
53     Item_ItemsTime_Init();
54 }
55
56 void Item_ItemsTime_ResetTimes()
57 {
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;
68 }
69
70 void Item_ItemsTime_ResetTimesForPlayer(entity e)
71 {
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);
82 }
83
84 void Item_ItemsTime_SetTimesForPlayer(entity e)
85 {
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);
96 }
97
98 void Item_ItemsTime_SetTime(entity e, float t)
99 {
100     if (!autocvar_sv_itemstime)
101         return;
102
103     if (g_instagib)
104     {
105         switch (e.items)
106         {
107             case IT_STRENGTH://"item-invis"
108                 it_invisible_time = t;
109                 break;
110             case IT_NAILS://"item-extralife"
111                 it_extralife_time = t;
112                 break;
113             case IT_INVINCIBLE://"item-speed"
114                 it_speed_time = t;
115                 break;
116         }
117     }
118     else
119     {
120         switch (e.items)
121         {
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;
125                 break;
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;
129                 break;
130             case IT_STRENGTH://"item-strength"
131                 it_strength_time = t;
132                 break;
133             case IT_INVINCIBLE://"item-shield"
134                 it_shield_time = t;
135                 break;
136             default:
137                 if (e.weapons & WEPSET_SUPERWEAPONS)
138                     it_superweapons_time = t;
139         }
140     }
141     switch (e.items)
142     {
143         case IT_FUEL_REGEN://"item-fuelregen"
144             it_fuelregen_time = t;
145             break;
146         case IT_JETPACK://"item-jetpack"
147             it_jetpack_time = t;
148             break;
149     }
150 }
151
152 void Item_ItemsTime_SetTimesForAllPlayers()
153 {
154     entity e;
155     FOR_EACH_REALCLIENT(e) if (warmup_stage || !IS_PLAYER(e))
156         Item_ItemsTime_SetTimesForPlayer(e);
157 }
158
159 float Item_ItemsTime_UpdateTime(entity e, float t)
160 {
161     bool isavailable = (t == 0);
162     if (e.weapons & WEPSET_SUPERWEAPONS)
163     {
164         for (entity head = world; (head = nextent(head)); )
165         {
166             if (clienttype(head) != CLIENTTYPE_NOTACLIENT || !(head.weapons & WEPSET_SUPERWEAPONS) || head.classname == "weapon_info")
167                 continue;
168             if (e == head)
169                 continue;
170
171             if (head.scheduledrespawntime <= time)
172                 isavailable = true;
173             else if (t == 0 || head.scheduledrespawntime < t)
174                 t = head.scheduledrespawntime;
175         }
176     }
177     else
178     {
179         for (entity head = world; (head = nextent(head)); )
180         {
181             if (head.itemdef != e.itemdef)
182                 continue;
183             if (e == head)
184                 continue;
185
186             if (head.scheduledrespawntime <= time)
187                 isavailable = true;
188             else if (t == 0 || head.scheduledrespawntime < t)
189                 t = head.scheduledrespawntime;
190         }
191     }
192     if (isavailable)
193         t = -t; // let know the client there's another available item
194     return t;
195 }
196
197 MUTATOR_HOOKFUNCTION(itemstime, reset_map_global) {
198     Item_ItemsTime_ResetTimes();
199 }
200
201 #endif