]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/mutators/mutator_random_gravity.qc
ff85f29059d01c892d1f7ae7c2fe3a0211ffd02e
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator_random_gravity.qc
1
2 #include "mutator.qh"
3
4 // Random Gravity
5 //
6 // Mutator by Mario
7 // Inspired by Player 2
8
9 float gravity_delay;
10
11 MUTATOR_HOOKFUNCTION(gravity_StartFrame)
12 {
13         if(gameover || !cvar("g_random_gravity")) return false;
14         if(time < gravity_delay) return false;
15         if(time < game_starttime) return false;
16         if(round_handler_IsActive() && !round_handler_IsRoundStarted()) return false;
17
18     if(random() >= autocvar_g_random_gravity_negative_chance)
19         cvar_set("sv_gravity", ftos(bound(autocvar_g_random_gravity_min, random() - random() * -autocvar_g_random_gravity_negative, autocvar_g_random_gravity_max)));
20     else
21         cvar_set("sv_gravity", ftos(bound(autocvar_g_random_gravity_min, random() * autocvar_g_random_gravity_positive, autocvar_g_random_gravity_max)));
22
23         gravity_delay = time + autocvar_g_random_gravity_delay;
24
25         LOG_TRACE("Gravity is now: ", ftos(autocvar_sv_gravity), "\n");
26
27         return false;
28 }
29
30 MUTATOR_HOOKFUNCTION(gravity_BuildMutatorsString)
31 {
32         ret_string = strcat(ret_string, ":RandomGravity");
33         return 0;
34 }
35
36 MUTATOR_HOOKFUNCTION(gravity_BuildMutatorsPrettyString)
37 {
38         ret_string = strcat(ret_string, ", Random gravity");
39         return 0;
40 }
41
42 MUTATOR_DEFINITION(mutator_random_gravity)
43 {
44         MUTATOR_HOOK(SV_StartFrame, gravity_StartFrame, CBC_ORDER_ANY);
45         MUTATOR_HOOK(BuildMutatorsString, gravity_BuildMutatorsString, CBC_ORDER_ANY);
46         MUTATOR_HOOK(BuildMutatorsPrettyString, gravity_BuildMutatorsPrettyString, CBC_ORDER_ANY);
47
48         MUTATOR_ONADD
49         {
50                 cvar_settemp("sv_gravity", cvar_string("sv_gravity")); // settemp current gravity so it's restored on match end
51         }
52
53         return false;
54 }