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