local function RefreshAbility(player) player.pflags = $ | PF_JUMPED & ~PF_THOKKED player.secondjump = 0; end local function PreventAirWalk(player) if (player.mo.state == S_PLAY_WALK or player.mo.state == S_PLAY_RUN) and not player.powers[pw_carry] player.mo.state = S_PLAY_FALL end end local function SpinCharThink(player) -- Ignore if character is grounded if (P_IsObjectOnGround(player.mo)) player.mo.ao_donecheck = false return end PreventAirWalk(player) -- If spinning in the air if (player.pflags & PF_SPINNING) -- Turn off the spinning flag; this means you won't turn slowly like when rolling on ground player.pflags = $ & ~PF_SPINNING -- Use the jump state instead player.mo.state = S_PLAY_JUMP -- Enable air ability player.mo.ao_donecheck = true end if (player.mo.ao_donecheck and not player.mo.coyoteTime) player.mo.ao_donecheck = false RefreshAbility(player) end end local function NonSpinCharThink(player) -- Ignore if character is grounded if (P_IsObjectOnGround(player.mo)) player.mo.ao_donecheck = false return end PreventAirWalk(player) if (player.mo.state == S_PLAY_SPRING) player.mo.ao_donecheck = false end if not (player.mo.ao_donecheck or player.mo.coyoteTime) player.mo.ao_donecheck = true RefreshAbility(player) end end local function AirOptionsThink(player) -- Run spin or nonspin character logic if (player.charflags & SF_NOJUMPSPIN) NonSpinCharThink(player) else SpinCharThink(player) end end addHook("PreThinkFrame", function() for player in players.iterate do AirOptionsThink(player); end end);