]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/server/sv_main.qc
Don't play fall sound for dead players
[voretournament/voretournament.git] / data / qcsrc / server / sv_main.qc
1 \r
2 void CreatureFrame (void)\r
3 {\r
4         local entity oldself;\r
5         local float dm;\r
6         oldself = self;\r
7         self = findfloat(world, iscreature, TRUE);\r
8         while (self)\r
9         {\r
10                 if (self.movetype != MOVETYPE_NOCLIP)\r
11                 {\r
12                         if (self.waterlevel)\r
13                         {\r
14                                 if (!(self.flags & FL_INWATER))\r
15                                 {\r
16                                         self.flags |= FL_INWATER;\r
17                                         self.dmgtime = 0;\r
18                                 }\r
19                                 if (self.waterlevel != WATERLEVEL_SUBMERGED)\r
20                                 {\r
21                                         if(self.air_finished < time + 9)\r
22                                                 PlayerSound(self, playersound_gasp, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);\r
23                                         self.air_finished = time + 12;\r
24                                         self.dmg = 2;\r
25                                 }\r
26                                 else if (self.air_finished < time)\r
27                                 {       // drown!\r
28                                         if (!self.deadflag)\r
29                                         if (self.pain_finished < time)\r
30                                         {\r
31                                                 Damage (self, world, world, 5, DEATH_DROWN, self.origin, '0 0 0');\r
32                                                 self.pain_finished = time + 0.5;\r
33                                         }\r
34                                 }\r
35                                 if (self.dmgtime < time)\r
36                                 {\r
37                                         self.dmgtime = time + 0.1;\r
38                                         if (self.watertype == CONTENT_LAVA)\r
39                                         {\r
40                                                 if (self.watersound_finished < time)\r
41                                                 {\r
42                                                         self.watersound_finished = time + 0.5;\r
43                                                         sound (self, CHAN_PLAYER, "player/lava.wav", VOL_BASE, ATTN_NORM);\r
44                                                 }\r
45                                                 Damage (self, world, world, 6 * self.waterlevel, DEATH_LAVA, self.origin, '0 0 0');\r
46                                         }\r
47                                         else if (self.watertype == CONTENT_SLIME)\r
48                                         {\r
49                                                 if (self.watersound_finished < time)\r
50                                                 {\r
51                                                         self.watersound_finished = time + 0.5;\r
52                                                         sound (self, CHAN_PLAYER, "player/slime.wav", VOL_BASE, ATTN_NORM);\r
53                                                 }\r
54                                                 Damage (self, world, world, 2 * self.waterlevel, DEATH_SLIME, self.origin, '0 0 0');\r
55                                         }\r
56                                 }\r
57                         }\r
58                         else\r
59                         {\r
60                                 if (self.flags & FL_INWATER)\r
61                                 {\r
62                                         // play leave water sound\r
63                                         self.flags &~= FL_INWATER;\r
64                                         self.dmgtime = 0;\r
65                                 }\r
66                                 self.air_finished = time + 12;\r
67                                 self.dmg = 2;\r
68                         }\r
69                         // check for falling damage\r
70                         if(!(g_cts && !cvar("g_cts_selfdamage")))\r
71                         {\r
72                                 dm = vlen(self.oldvelocity) - vlen(self.velocity); // dm is now the velocity DECREASE. Velocity INCREASE should never cause a sound or any damage.\r
73                                 if (self.deadflag)\r
74                                         dm = (dm - cvar("g_balance_falldamage_deadminspeed")) * cvar("g_balance_falldamage_factor");\r
75                                 else\r
76                                         dm = min((dm - cvar("g_balance_falldamage_minspeed")) * cvar("g_balance_falldamage_factor"), cvar("g_balance_falldamage_maxdamage"));\r
77                                 if (dm > 0)\r
78                                 {\r
79                                         Damage (self, world, world, dm, DEATH_FALL, self.origin, '0 0 0');\r
80                                         // this must be allowed to cut the normal pain sounds (played after them and on the same channel)\r
81                                         // there's no way to detect falling damage and prevent the pain sounds for this to be played instead\r
82                                         if(self.health > 0)\r
83                                                 PlayerSound(self, playersound_fall, CHAN_PAIN, VOICETYPE_PLAYERSOUND);\r
84                                 }\r
85                                 else if(vlen(self.velocity) > 100000 && cvar("developer"))\r
86                                 {\r
87                                         dprint(strcat(self.netname, " became too fast, please investigate: ", vtos(self.spawnorigin), "\n"));\r
88                                         Damage (self, world, world, 50000, DEATH_SHOOTING_STAR, self.origin, '0 0 0');\r
89                                 }\r
90                         }\r
91 \r
92                         // play stupid sounds\r
93                         if (g_footsteps)\r
94                         if (!gameover)\r
95                         if (self.flags & FL_ONGROUND)\r
96                         if (vlen(self.velocity) > sv_maxspeed * 0.6)\r
97                         if (!self.deadflag)\r
98                         if (time < self.lastground + 0.2)\r
99                         {\r
100                                 if((time > self.nextstep) || (time < (self.nextstep - 10.0)))\r
101                                 {\r
102                                         self.nextstep = time + 0.3 + random() * 0.1;\r
103                                         trace_dphitq3surfaceflags = 0;\r
104                                         tracebox(self.origin, self.mins, self.maxs, self.origin - '0 0 1', MOVE_NOMONSTERS, self);\r
105                                         /*\r
106                                         if(trace_fraction == 1)\r
107                                                 dprint("nohit\n");\r
108                                         else\r
109                                                 dprint(ftos(trace_dphitq3surfaceflags), "\n");\r
110                                         */\r
111                                         if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS)\r
112                                         {\r
113                                                 if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS)\r
114                                                         GlobalSound(globalsound_metalstep, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);\r
115                                                 else\r
116                                                         GlobalSound(globalsound_step, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);\r
117                                         }\r
118                                 }\r
119                         }\r
120                         self.oldvelocity = self.velocity;\r
121                 }\r
122                 self = findfloat(self, iscreature, TRUE);\r
123         }\r
124         self = oldself;\r
125 }\r
126 \r
127 \r
128 /*\r
129 =============\r
130 StartFrame\r
131 \r
132 Called before each frame by the server\r
133 =============\r
134 */\r
135 \r
136 float game_delay;\r
137 float game_delay_last;\r
138 \r
139 float RedirectionThink();\r
140 entity SelectSpawnPoint (float anypoint);\r
141 void StartFrame (void)\r
142 {\r
143         remove = remove_unsafely; // not during spawning!\r
144         serverprevtime = servertime;\r
145         servertime = time;\r
146         serverframetime = frametime;\r
147 \r
148 #ifdef PROFILING\r
149         if(time > client_cefc_accumulatortime + 1)\r
150         {\r
151                 float t, pp, c_seeing, c_seen;\r
152                 entity cl;\r
153                 t = client_cefc_accumulator / (time - client_cefc_accumulatortime);\r
154                 print("CEFC time: ", ftos(t * 1000), "ms; ");\r
155                 c_seeing = 0;\r
156                 c_seen = 0;\r
157                 FOR_EACH_CLIENT(cl)\r
158                 {\r
159                         if(clienttype(cl) == CLIENTTYPE_REAL)\r
160                                 ++c_seeing;\r
161                         if(cl.classname == "player")\r
162                                 ++c_seen;\r
163                 }\r
164                 print("CEFC calls per second: ", ftos(c_seeing * (c_seen - 1) / t), "; ");\r
165                 print("CEFC 100% load at: ", ftos(solve_quadratic(t, -t, -1) * '0 1 0'), "\n");\r
166 \r
167                 client_cefc_accumulatortime = time;\r
168                 client_cefc_accumulator = 0;\r
169         }\r
170 #endif\r
171 \r
172         entity e;\r
173         for(e = world; (e = findfloat(e, csqcprojectile_clientanimate, 1)); )\r
174                 CSQCProjectile_Check(e);\r
175 \r
176         if(RedirectionThink())\r
177                 return;\r
178 \r
179         UncustomizeEntitiesRun();\r
180         InitializeEntitiesRun();\r
181 \r
182         WarpZone_StartFrame();\r
183 \r
184         sv_gravity = cvar("sv_gravity");\r
185         sv_maxairspeed = cvar("sv_maxairspeed");\r
186         sv_maxspeed = cvar ("sv_maxspeed");\r
187         sv_friction = cvar ("sv_friction");\r
188         sv_accelerate = cvar ("sv_accelerate");\r
189         sv_airaccelerate = cvar("sv_airaccelerate");\r
190         sv_airaccel_sideways_friction = cvar("sv_airaccel_sideways_friction");\r
191         sv_airaccel_qw = cvar("sv_airaccel_qw");\r
192         sv_stopspeed = cvar ("sv_stopspeed");\r
193         sv_airstopaccelerate = cvar("sv_airstopaccelerate");\r
194         sv_airstrafeaccelerate = cvar("sv_airstrafeaccelerate");\r
195         sv_maxairstrafespeed = cvar("sv_maxairstrafespeed");\r
196         sv_aircontrol = cvar("sv_aircontrol");\r
197         sv_warsowbunny_airforwardaccel = cvar("sv_warsowbunny_airforwardaccel");\r
198         sv_warsowbunny_accel = cvar("sv_warsowbunny_accel");\r
199         sv_warsowbunny_topspeed = cvar("sv_warsowbunny_topspeed");\r
200         sv_warsowbunny_turnaccel = cvar("sv_warsowbunny_turnaccel");\r
201         sv_warsowbunny_backtosideratio = cvar("sv_warsowbunny_backtosideratio");\r
202         teamplay = cvar ("teamplay");\r
203         sys_frametime = cvar("sys_ticrate") * cvar("slowmo");\r
204 \r
205         if (timeoutStatus == 1) // just before the timeout (when timeoutStatus will be 2)\r
206                 orig_slowmo = cvar("slowmo"); // slowmo will be restored after the timeout\r
207 \r
208         if(teams_matter && !teamplay)\r
209                 teamplay = 3;\r
210         if(!teams_matter && teamplay)\r
211                 teamplay = 0;\r
212 \r
213         skill = cvar("skill");\r
214 \r
215         Spawnqueue_Check();\r
216 \r
217 \r
218         // detect when the pre-game countdown (if any) has ended and the game has started\r
219         game_delay = (time < game_starttime) ? TRUE : FALSE;\r
220 \r
221         if(game_delay_last == TRUE)\r
222         if(game_delay == FALSE)\r
223         if(cvar("sv_eventlog"))\r
224                         GameLogEcho(":startdelay_ended");\r
225 \r
226         game_delay_last = game_delay;\r
227 \r
228         // if in warmup stage and limit for warmup is hit start match\r
229         if (inWarmupStage)\r
230         if ((g_warmup_limit > 0 && time >= g_warmup_limit)\r
231          || (g_warmup_limit == 0 && cvar("timelimit") != 0 && time >= cvar("timelimit") * 60))\r
232         {\r
233                 ReadyRestart();\r
234                 return;\r
235         }\r
236 \r
237         CreatureFrame ();\r
238         CheckRules_World ();\r
239 \r
240         AuditTeams();\r
241 \r
242         bot_serverframe();\r
243 \r
244         if(cvar("spawn_debugview"))\r
245         {\r
246                 RandomSelection_Init();\r
247                 for(self = world; (self = find(self, classname, "player")); )\r
248                         RandomSelection_Add(self, 0, string_null, 1, 0);\r
249                 self = RandomSelection_chosen_ent;\r
250                 SelectSpawnPoint(0);\r
251         }\r
252 \r
253         FOR_EACH_PLAYER(self)\r
254                 self.porto_forbidden = max(0, self.porto_forbidden - 1);\r
255 }\r
256 \r
257 .vector originjitter;\r
258 .vector anglesjitter;\r
259 .float anglejitter;\r
260 .string gametypefilter;\r
261 .string cvarfilter;\r
262 void SV_OnEntityPreSpawnFunction()\r
263 {\r
264         if(self.gametypefilter != "")\r
265         if not(isGametypeInFilter(game, teams_matter, self.gametypefilter))\r
266         {\r
267                 remove(self);\r
268                 return;\r
269         }\r
270         if(self.cvarfilter != "")\r
271         {\r
272                 float n, i, o, inv;\r
273                 string s, k, v;\r
274                 inv = 0;\r
275 \r
276                 s = self.cvarfilter;\r
277                 if(substring(s, 0, 1) == "+")\r
278                 {\r
279                         s = substring(s, 1, -1);\r
280                 }\r
281                 else if(substring(s, 0, 1) == "-")\r
282                 {\r
283                         inv = 1;\r
284                         s = substring(s, 1, -1);\r
285                 }\r
286 \r
287                 n = tokenize(s);\r
288                 for(i = 0; i < n; ++i)\r
289                 {\r
290                         s = argv(i);\r
291                         // syntax:\r
292                         // var>x\r
293                         // var<x\r
294                         // var>=x\r
295                         // var<=x\r
296                         // var==x\r
297                         // var!=x\r
298                         // var===x\r
299                         // var!==x\r
300                         if((o = strstrofs(s, ">=", 0)) >= 0)\r
301                         {\r
302                                 k = substring(s, 0, o);\r
303                                 v = substring(s, o+2, -1);\r
304                                 if(cvar(k) < stof(v))\r
305                                         goto cvar_fail;\r
306                         }\r
307                         else if((o = strstrofs(s, "<=", 0)) >= 0)\r
308                         {\r
309                                 k = substring(s, 0, o);\r
310                                 v = substring(s, o+2, -1);\r
311                                 if(cvar(k) > stof(v))\r
312                                         goto cvar_fail;\r
313                         }\r
314                         else if((o = strstrofs(s, ">", 0)) >= 0)\r
315                         {\r
316                                 k = substring(s, 0, o);\r
317                                 v = substring(s, o+1, -1);\r
318                                 if(cvar(k) <= stof(v))\r
319                                         goto cvar_fail;\r
320                         }\r
321                         else if((o = strstrofs(s, "<", 0)) >= 0)\r
322                         {\r
323                                 k = substring(s, 0, o);\r
324                                 v = substring(s, o+1, -1);\r
325                                 if(cvar(k) >= stof(v))\r
326                                         goto cvar_fail;\r
327                         }\r
328                         else if((o = strstrofs(s, "==", 0)) >= 0)\r
329                         {\r
330                                 k = substring(s, 0, o);\r
331                                 v = substring(s, o+2, -1);\r
332                                 if(cvar(k) != stof(v))\r
333                                         goto cvar_fail;\r
334                         }\r
335                         else if((o = strstrofs(s, "!=", 0)) >= 0)\r
336                         {\r
337                                 k = substring(s, 0, o);\r
338                                 v = substring(s, o+2, -1);\r
339                                 if(cvar(k) == stof(v))\r
340                                         goto cvar_fail;\r
341                         }\r
342                         else if((o = strstrofs(s, "===", 0)) >= 0)\r
343                         {\r
344                                 k = substring(s, 0, o);\r
345                                 v = substring(s, o+2, -1);\r
346                                 if(cvar_string(k) != v)\r
347                                         goto cvar_fail;\r
348                         }\r
349                         else if((o = strstrofs(s, "!==", 0)) >= 0)\r
350                         {\r
351                                 k = substring(s, 0, o);\r
352                                 v = substring(s, o+2, -1);\r
353                                 if(cvar_string(k) == v)\r
354                                         goto cvar_fail;\r
355                         }\r
356                         else if(substring(s, 0, 1) == "!")\r
357                         {\r
358                                 k = substring(s, 1, -1);\r
359                                 if(cvar(k))\r
360                                         goto cvar_fail;\r
361                         }\r
362                         else\r
363                         {\r
364                                 k = s;\r
365                                 if not(cvar(k))\r
366                                         goto cvar_fail;\r
367                         }\r
368                 }\r
369                 inv = !inv;\r
370 :cvar_fail\r
371                 // now inv is 1 if we want to keep the item, and 0 if we want to get rid of it\r
372                 if not(inv)\r
373                 {\r
374                         //print("cvarfilter fail\n");\r
375                         remove(self);\r
376                         return;\r
377                 }\r
378         }\r
379 \r
380         // support special -1 and -2 angle from radiant\r
381         if (self.angles == '0 -1 0')\r
382                 self.angles = '-90 0 0';\r
383         else if (self.angles == '0 -2 0')\r
384                 self.angles = '+90 0 0';\r
385 \r
386         if(self.originjitter_x != 0)\r
387                 self.origin_x = self.origin_x + (random() * 2 - 1) * self.originjitter_x;\r
388         if(self.originjitter_y != 0)\r
389                 self.origin_y = self.origin_y + (random() * 2 - 1) * self.originjitter_y;\r
390         if(self.originjitter_z != 0)\r
391                 self.origin_z = self.origin_z + (random() * 2 - 1) * self.originjitter_z;\r
392         if(self.anglesjitter_x != 0)\r
393                 self.angles_x = self.angles_x + (random() * 2 - 1) * self.anglesjitter_x;\r
394         if(self.anglesjitter_y != 0)\r
395                 self.angles_y = self.angles_y + (random() * 2 - 1) * self.anglesjitter_y;\r
396         if(self.anglesjitter_z != 0)\r
397                 self.angles_z = self.angles_z + (random() * 2 - 1) * self.anglesjitter_z;\r
398         if(self.anglejitter != 0)\r
399                 self.angles_y = self.angles_y + (random() * 2 - 1) * self.anglejitter;\r
400 }\r