]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/mutators/mutator_multijump.qc
584ece8f1987ce52ca25faf23e3f61c4ba4fdd22
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator_multijump.qc
1 #include "../_.qh"
2
3 #include "mutator.qh"
4
5 #include "../antilag.qh"
6
7 .float multijump_count;
8 .float multijump_ready;
9
10 MUTATOR_HOOKFUNCTION(multijump_PlayerPhysics)
11 {
12         if(self.flags & FL_ONGROUND)
13                 self.multijump_count = 0;
14
15         return false;
16 }
17
18 MUTATOR_HOOKFUNCTION(multijump_PlayerJump)
19 {
20         if (self.flags & FL_JUMPRELEASED && !(self.flags & FL_ONGROUND)) // jump button pressed this frame and we are in midair
21                 self.multijump_ready = true;  // this is necessary to check that we released the jump button and pressed it again
22         else
23                 self.multijump_ready = false;
24
25         if(!player_multijump && self.multijump_ready && (autocvar_g_multijump == -1 || self.multijump_count < autocvar_g_multijump) && self.velocity.z > autocvar_g_multijump_speed)
26         {
27                 if (autocvar_g_multijump)
28                 {
29                         if (autocvar_g_multijump_add == 0) // in this case we make the z velocity == jumpvelocity
30                         {
31                                 if (self.velocity.z < autocvar_sv_jumpvelocity)
32                                 {
33                                         player_multijump = true;
34                                         self.velocity_z = 0;
35                                 }
36                         }
37                         else
38                                 player_multijump = true;
39
40                         if(player_multijump)
41                         {
42                                 if(self.movement.x != 0 || self.movement.y != 0) // don't remove all speed if player isnt pressing any movement keys
43                                 {
44                                         float curspeed;
45                                         vector wishvel, wishdir;
46
47                                         curspeed = max(
48                                                 vlen(vec2(self.velocity)), // current xy speed
49                                                 vlen(vec2(antilag_takebackavgvelocity(self, max(self.lastteleporttime + sys_frametime, time - 0.25), time))) // average xy topspeed over the last 0.25 secs
50                                         );
51                                         makevectors(self.v_angle.y * '0 1 0');
52                                         wishvel = v_forward * self.movement.x + v_right * self.movement.y;
53                                         wishdir = normalize(wishvel);
54
55                                         self.velocity_x = wishdir.x * curspeed; // allow "dodging" at a multijump
56                                         self.velocity_y = wishdir.y * curspeed;
57                                         // keep velocity_z unchanged!
58                                 }
59                                 self.multijump_count += 1;
60                         }
61                 }
62                 self.multijump_ready = false; // require releasing and pressing the jump button again for the next jump
63         }
64
65         return false;
66 }
67
68 MUTATOR_HOOKFUNCTION(multijump_BuildMutatorsString)
69 {
70         ret_string = strcat(ret_string, ":multijump");
71         return false;
72 }
73
74 MUTATOR_HOOKFUNCTION(multijump_BuildMutatorsPrettyString)
75 {
76         ret_string = strcat(ret_string, ", Multi jump");
77         return false;
78 }
79
80 MUTATOR_DEFINITION(mutator_multijump)
81 {
82         MUTATOR_HOOK(PlayerPhysics, multijump_PlayerPhysics, CBC_ORDER_ANY);
83         MUTATOR_HOOK(PlayerJump, multijump_PlayerJump, CBC_ORDER_ANY);
84         MUTATOR_HOOK(BuildMutatorsString, multijump_BuildMutatorsString, CBC_ORDER_ANY);
85         MUTATOR_HOOK(BuildMutatorsPrettyString, multijump_BuildMutatorsPrettyString, CBC_ORDER_ANY);
86
87         return false;
88 }