float autocvar_g_maxplayers_spectator_blocktime;
float autocvar_g_maxpushtime;
float autocvar_g_maxspeed;
-#define autocvar_g_midair cvar("g_midair")
float autocvar_g_midair_shieldtime;
#define autocvar_g_minstagib cvar("g_minstagib")
float autocvar_g_minstagib_ammo_drop;
float maxspeed;
vector gco, gno;
- if(autocvar_g_midair)
- return;
-
// Don't jump when attacking
if(self.aistatus & AI_STATUS_ATTACKING)
return;
if(autocvar_g_fullbrightplayers)
self.effects = self.effects | EF_FULLBRIGHT;
- // midair gamemode: damage only while in the air
- // if in midair mode, being on ground grants temporary invulnerability
- // (this is so that multishot weapon don't clear the ground flag on the
- // first damage in the frame, leaving the player vulnerable to the
- // remaining hits in the same frame)
- if (self.flags & FL_ONGROUND)
- if (g_midair)
- self.spawnshieldtime = max(self.spawnshieldtime, time + autocvar_g_midair_shieldtime);
-
if (time >= game_starttime)
if (time < self.spawnshieldtime)
self.effects = self.effects | (EF_ADDITIVE | EF_FULLBRIGHT);
// Globals
-float g_cloaked, g_footsteps, g_jump_grunt, g_grappling_hook, g_midair, g_minstagib, g_norecoil, g_bloodloss;
+float g_cloaked, g_footsteps, g_jump_grunt, g_grappling_hook, g_minstagib, g_norecoil, g_bloodloss;
float g_warmup_limit;
float g_warmup_allguns;
float g_warmup_allow_timeout;
// apply push
if (self.damageforcescale)
if (vlen(force))
- if (!IS_PLAYER(self) || time >= self.spawnshieldtime || g_midair)
+ if (!IS_PLAYER(self) || time >= self.spawnshieldtime)
{
vector farce = damage_explosion_calcpush(self.damageforcescale * force, self.velocity, autocvar_g_balance_damagepush_speedfactor);
if(self.movetype == MOVETYPE_PHYSICS)
if(autocvar_g_norecoil)
s = strcat(s, ":norecoil");
- // TODO to mutator system
- if(autocvar_g_midair)
- s = strcat(s, ":midair");
-
// TODO to mutator system
if(autocvar_g_powerups == 0)
s = strcat(s, ":no_powerups");
CHECK_MUTATOR_ADD("g_vampire", mutator_vampire, !cvar("g_minstagib"));
CHECK_MUTATOR_ADD("g_superspectate", mutator_superspec, 1);
CHECK_MUTATOR_ADD("g_pinata", mutator_pinata, !cvar("g_minstagib"));
+ CHECK_MUTATOR_ADD("g_midair", mutator_midair, 1);
CHECK_MUTATOR_ADD("g_sandbox", sandbox, 1);
#undef CHECK_MUTATOR_ADD
g_footsteps = cvar("g_footsteps");
g_grappling_hook = cvar("g_grappling_hook");
g_jetpack = cvar("g_jetpack");
- g_midair = cvar("g_midair");
g_norecoil = cvar("g_norecoil");
g_bloodloss = cvar("g_bloodloss");
sv_maxidle = cvar("sv_maxidle");
--- /dev/null
+.float midair_shieldtime;
+
+MUTATOR_HOOKFUNCTION(midair_PlayerDamage)
+{
+ if(IS_PLAYER(frag_attacker))
+ if(IS_PLAYER(frag_target))
+ if(time < self.midair_shieldtime)
+ frag_damage = FALSE;
+
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(midair_PlayerPowerups)
+{
+ if(time >= game_starttime)
+ if(self.flags & FL_ONGROUND)
+ {
+ self.effects |= (EF_ADDITIVE | EF_FULLBRIGHT);
+ self.midair_shieldtime = max(self.midair_shieldtime, time + autocvar_g_midair_shieldtime);
+ }
+
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(midair_PlayerSpawn)
+{
+ if(IS_BOT_CLIENT(self))
+ self.bot_moveskill = 0; // disable bunnyhopping
+
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(midair_BuildMutatorsString)
+{
+ ret_string = strcat(ret_string, ":midair");
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(midair_BuildMutatorsPrettyString)
+{
+ ret_string = strcat(ret_string, ", Midair");
+ return FALSE;
+}
+
+MUTATOR_DEFINITION(mutator_midair)
+{
+ MUTATOR_HOOK(PlayerDamage_Calculate, midair_PlayerDamage, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerPowerups, midair_PlayerPowerups, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerSpawn, midair_PlayerSpawn, CBC_ORDER_ANY);
+ MUTATOR_HOOK(BuildMutatorsString, midair_BuildMutatorsString, CBC_ORDER_ANY);
+ MUTATOR_HOOK(BuildMutatorsPrettyString, midair_BuildMutatorsPrettyString, CBC_ORDER_ANY);
+
+ return FALSE;
+}
MUTATOR_DECLARATION(mutator_minstagib);
MUTATOR_DECLARATION(mutator_touchexplode);
MUTATOR_DECLARATION(mutator_pinata);
+MUTATOR_DECLARATION(mutator_midair);
MUTATOR_DECLARATION(sandbox);
mutators/mutator_minstagib.qc
mutators/mutator_touchexplode.qc
mutators/mutator_pinata.qc
+mutators/mutator_midair.qc
../warpzonelib/anglestransform.qc
../warpzonelib/mathlib.qc
modifications = strcat(modifications, ", Cloaked");
if(g_grappling_hook)
modifications = strcat(modifications, ", Hook");
- if(g_midair)
- modifications = strcat(modifications, ", Midair");
if(g_weapon_stay && !g_cts)
modifications = strcat(modifications, ", Weapons stay");
if(g_bloodloss > 0)