addHook("PlayerThink", function(player)
	local mo = player.mo
	

	local underwater = (mo.eflags & MFE_UNDERWATER) ~= 0

	if player.mo.skin == "banjokazzoie" and player.mo and player.playerstate == PST_LIVE and displayplayer == player then
	
	if underwater and not player.wasunderwater then
		mo.momz = 0
	end
	
	
	if underwater and not player.powers[pw_carry] then
		if player.powers[pw_invulnerability] > 1 then player.powers[pw_invulnerability] = 1 end
		if player.powers[pw_sneakers] > 1 then player.powers[pw_sneakers] = 1 end
		
		mo.flags = (mo.flags | MF_NOGRAVITY)
		mo.eflags = mo.eflags & ~(MFE_ONGROUND | MFE_JUSTHITFLOOR)
		
		player.mo.state = S_PLAY_SWIM
		
		player.pflags = player.pflags & ~(PF_THOKKED|PF_SPINNING|PF_STARTDASH|PF_JUMPED)
		player.charability = 0
		player.charability2 = 0

		if player.mo.z - player.mo.floorz < 6*player.mo.scale and not (player.mo.eflags & MFE_VERTICALFLIP) then
			player.mo.z = $ + 6*player.mo.scale
		end
		
		if player.mo.ceilingz - player.mo.z + player.mo.height < 6*player.mo.scale and (player.mo.eflags & MFE_VERTICALFLIP) then
			player.mo.z = $ + 6*player.mo.scale
		end

		local headz = mo.z + mo.height
		if headz >= mo.watertop - FRACUNIT then
			player.powers[pw_underwater] = 0
		end

		if (player.cmd.buttons & BT_JUMP) ~= 0 and not (player.pflags & PF_STASIS) then
			mo.momz = min(mo.momz + (mo.scale/2)*P_MobjFlip(mo), 10*mo.scale*P_MobjFlip(mo))
		elseif (player.cmd.buttons & BT_SPIN) ~= 0 and not (player.pflags & PF_STASIS) then
			mo.momz = max(mo.momz - (mo.scale/2)*P_MobjFlip(mo), -10*mo.scale*P_MobjFlip(mo))
		else
			if mo.momz > 0 then
				mo.momz = mo.momz - FRACUNIT/4
			elseif mo.momz < 0 then
				mo.momz = mo.momz + FRACUNIT/4
			end
		end
			
		if not (player.pflags & PF_STASIS) then
			local fmove = player.cmd.forwardmove << FRACBITS
			local smove = player.cmd.sidemove << FRACBITS
			smove = -smove
		
			if fmove ~= 0 or smove ~= 0 then
				local angle = camera.angle or 0
				if (player.bot == BOT_2PAI or player.bot == BOT_MPAI) then
					angle = 0
				end
				
				local speedScale = mo.scale/4

				local newMomX = FixedMul(cos(angle), fmove) - FixedMul(sin(angle), smove)
				local newMomY = FixedMul(sin(angle), fmove) + FixedMul(cos(angle), smove)
	
				mo.momx = FixedMul(newMomX, speedScale)
				mo.momy = FixedMul(newMomY, speedScale)
		
				if mo.momx ~= 0 or mo.momy ~= 0 then
					player.drawangle = R_PointToAngle2(0, 0, mo.momx, mo.momy)
				end
			else
				mo.momx = mo.momx - FixedMul(mo.momx, FRACUNIT/8)
				mo.momy = mo.momy - FixedMul(mo.momy, FRACUNIT/8)
			end
		end
		
	else
		mo.flags = (mo.flags & ~MF_NOGRAVITY)

		if player.charability == 0 then 
		player.charability = skins[player.skin].ability or 0
		end
		
		if player.charability2 == 0 then
		player.charability2 = skins[player.skin].ability2 or 0
		end

	end
	
	end
	player.wasunderwater = underwater
end)


local originalIsOnGround = P_IsObjectOnGround
rawset(_G, "P_IsObjectOnGround", function(mo)
	if mo.player and mo.player.mo.skin == "banjokazzoie" then
		if (mo.eflags & MFE_UNDERWATER) ~= 0 then
			return false
		else
			return originalIsOnGround(mo)
		end
	else
		return originalIsOnGround(mo)
	end
end)

addHook("PlayerThink", function(player)
	if player.mo and player.mo.skin == "banjokazzoie" and (player.mo.eflags & MFE_UNDERWATER) and player.powers[pw_underwater] < 11*TICRATE then 
		S_ChangeMusic(mapmusname, true, player)
	end
end)

addHook("HUD", function(v, player, cam)
	if player.mo and player.mo.skin == "banjokazzoie"
		local xpos = hudinfo[HUD_RINGS].x
		local ypos = hudinfo[HUD_RINGS].y
		
		if player.mo.eflags & MFE_UNDERWATER then
			v.drawString(xpos, ypos + 60, ("OXYGEN : " + (player.powers[pw_underwater]/TICRATE) + " / " + (underwatertics/TICRATE)), V_PERPLAYER|V_BLUEMAP)
		end
	end
end, "game")