MultiFunPlayer v1.34.5 - Multi-axis funscript player with SLR & FapTap support

Can you screenshot the popup telling you to install .net? Its opened by windows, it should auto download and install the latest .net for you.

Alternatively you can manually install .net desktop runtime x64: Download .NET 9.0 Desktop Runtime (v9.0.9) - Windows x64 Installer

Thanks for the bug report.
I fixed 1.33.9 and reuploaded so just download it again and it should work correctly.

Thanks for the quick fix

Oh, never mind… Don’t think it’s MFP.

Seems to be something with .NET itself, whenever I open it there’s a notification to repair it. Then it doesn’t repair, then I open MFP and it tells me to install .NET, so I don’t even know.

I never seen .net require a repair so can’t help here. You could try uninstalling and reinstalling.
Also the self-contained version of MFP does not require .net installed so it should work for you.

Yeah, I think something went horribly wrong somewhere down the line. Oh well, it’s an old burner ACER I use solely for MFP :rofl:.

Factory reset it, re-download everything, that usually works when all else fails. Thanks for the help and the update :folded_hands:

Hi, I’m not sure if this is a bug. I don’t have it completely clear, but there’s something strange: when I’m connected via WEB and I move the browser window (Windows 11) of MFP to one side (to split the desktop into 2 — it also happens with 3 or 4), the video script stops syncing if I change scenes on the page I’m viewing. This does not happen when the window is maximized, only in this split-screen mode.

I’m not sure whether this is related to the browser page (local server) or to MFP itself. However, I don’t see any reason why it should be caused by the local server, since that only serves to pick and play videos, simply adding the name to fetch the script.

This is only info.

I could not reproduce this, I tested with FapTap and it all works correctly when split.
What is hosting the videos/scripts? What do you mean by stops syncing?
I would probably need you to DM me trace logs so I can see what is actually happening.

Hoping someone can help here. I can’t get DeoVR on my Quest 3 to play any scripts anymore. I’m running the SelfContained patreon 1.33.9 version and have tried both DeoVR 15.1 as well as reverting back to 14.6. MFP shows that it is able to connect (green connected) to DeoVR over 23554, but when playing a video, the script preview not only doesn’t show the heatmap, but doesn’t show the white line that marks the progress within the video.

I’m using XBVR as the repository if that matters. Even if it wasn’t able to pull a script, I would expect the white line to move across the progress indicator.

If I use VLC on the same Windows machine, MFP connects and plays as expected, it is just the DeoVR connection to MFP that is the issue.

The Quest 3, XBVR server, and my Windows machine are all on the same network segment. In my Windows firewall, I have allowed all inbound and outbound connections from the IP address of the Quest 3 headset as well as the XBVR server. I’ve cycled remote connections in DeoVR, restarted MFP and the Quest 3 100’s of times, released and renewed IP’s over and over again and just can’t get it to connect anymore. Any help to get this working again would be appreciated.

I’ve turned on trace logging, and here is what I believe is the relevant parts of the application log. In the middle of all the “keep-alive” messages, I’ve tried to play several scripted videos.

2025-09-27 08:58:57.4962|DEBUG|MultiFunPlayer.UI.Controls.ViewModels.ScriptViewModel|Resetting sync [Axes: L0, L1, V0, C0, P0, P1, P2, P3]
2025-09-27 08:58:58.0692|DEBUG|MultiFunPlayer.UI.Controls.ViewModels.ScriptViewModel|Resetting sync [Axes: C0]
2025-09-27 08:58:58.0692|DEBUG|MultiFunPlayer.UI.Controls.ViewModels.ScriptViewModel|Resetting sync [Axes: P0]
2025-09-27 08:58:58.0817|DEBUG|MultiFunPlayer.UI.Controls.ViewModels.ScriptViewModel|Resetting sync [Axes: P1]
2025-09-27 08:58:58.0817|DEBUG|MultiFunPlayer.UI.Controls.ViewModels.ScriptViewModel|Resetting sync [Axes: P3]
2025-09-27 08:58:58.6083|DEBUG|MultiFunPlayer|Bootstrapper OnLaunch
2025-09-27 09:00:13.9435|INFO|MultiFunPlayer.MediaSource.ViewModels.DeoVRMediaSource|Connecting to DeoVR at “192.168.242.202:23554” [Type: Manual]
2025-09-27 09:00:14.1198|DEBUG|MultiFunPlayer.Input.DeoVR.DeoVRInputProcessor|Waiting for incoming TCP connection [Endpoint: 0.0.0.0:38882]
2025-09-27 09:00:15.1193|TRACE|MultiFunPlayer.MediaSource.ViewModels.DeoVRMediaSource|Sending keep-alive to “DeoVR”
2025-09-27 09:00:16.1207|TRACE|MultiFunPlayer.MediaSource.ViewModels.DeoVRMediaSource|Sending keep-alive to “DeoVR”
2025-09-27 09:00:17.1208|TRACE|MultiFunPlayer.MediaSource.ViewModels.DeoVRMediaSource|Sending keep-alive to “DeoVR”
2025-09-27 09:00:18.1212|TRACE|MultiFunPlayer.MediaSource.ViewModels.DeoVRMediaSource|Sending keep-alive to “DeoVR”
2025-09-27 09:00:19.1143|TRACE|MultiFunPlayer.MediaSource.ViewModels.DeoVRMediaSource|Sending keep-alive to “DeoVR”
2025-09-27 09:00:20.1213|TRACE|MultiFunPlayer.MediaSource.ViewModels.DeoVRMediaSource|Sending keep-alive to “DeoVR”
2025-09-27 09:00:21.1199|TRACE|MultiFunPlayer.MediaSource.ViewModels.DeoVRMediaSource|Sending keep-alive to “DeoVR”
2025-09-27 09:00:22.1223|TRACE|MultiFunPlayer.MediaSource.ViewModels.DeoVRMediaSource|Sending keep-alive to “DeoVR”
2025-09-27 09:00:23.1224|TRACE|MultiFunPlayer.MediaSource.ViewModels.DeoVRMediaSource|Sending keep-alive to “DeoVR”
2025-09-27 09:00:24.1233|TRACE|MultiFunPlayer.MediaSource.ViewModels.DeoVRMediaSource|Sending keep-alive to “DeoVR”
2025-09-27 09:00:25.1235|TRACE|MultiFunPlayer.MediaSource.ViewModels.DeoVRMediaSource|Sending keep-alive to “DeoVR”

For DeoVR+XBVR you should not need any firewall changes.
If that is really the only logs from DeoVRMediaSource then it seems like DeoVR does not send playback information to MFP.

When did it stop working? It’s possible they disabled remote control for some reason like they did with Haptics Connect. Are you logged-in in DeoVR? If yes does you account have SLR subscription or did you buy a script with that account?

You can always try using HereSphere as it also supports XBVR/stash.

Thanks for your reply! It seemed to stop working around the time SLR went to 15.1 and messed with MFP.

I am logged into SLR, but wasn’t aware of logging into DeoVR, so I’ll try that. I do have an SLR sub with scripts and can’t get it to connect anymore either. That is why I went back to DeoVR 14.6, but still no go. I can’t get MFP to connect to HereSphere on my Quest 3 at all. I need to try and find documentation on how to configure it, because I haven’t found it on my own. Gonna start digging into my XBVR server to see if there is something there. Running 0.4.33 in a docker container and it was working previously.

SLR support was fixed in MFP 1.33.9.
If you are using older MFP maybe try setting SLR username and password to empty so it does not try to log-in. It’s possible that it stops working when you try to use Haptics Connect.

You need to enable timecode server in HereSphere settings.

It’s not XBVR problem, its just that DeoVR does not send any playback information according to your logs.

I seem to be back working now. I restarted my docker host and container, cleared the script repositories in MFP for XBVR and SLR completely and restarted MFP. Reconfigured the script repositories in MFP and restarted MFP again, and now things are working again as expected. Even SLR! Hopefully everything will continue to work in this state for a while.

I’ve got HereSphere working as a backup now! Thanks for letting me know about the timecode server setting!

Thanks for all your help!

Hi there. quick question about the MultiFunPlayer. If the script is perfectly synced, and i have connected via usb cable. have you found a sweet spot for the offset setting? i have it around -10, but i think it is a little behind the movement. Maybe its because i use the pchip interpolation. anyone who have found the perfect sync setting?

I just updated to 1.33.9 but I’m not having much luck, is there any trick to it?

I’ve enabled the new SLR repository and sign into it, DeoVR is connected, Haptics connect is enabled in DeoVR, but when I play a video of SLR no script loads.

Here are some screenshots if you can see something wrong (yes I know all the axis are being bypassed while I was taking the screenshot).


I don’t think there is one. There are too many variables.
I don’t use any offset with HereSphere and have not noticed the need to.

Do you have a “media path modifier” added? Your video path is missing “.mp4” at the end.
Its the button to the right of script repositories.

hy

I currently thinking and begin testing linux mint .
Planning to leave windows
Did this program work on linux?

Thanks for all

1 Like

It’s windows only but you might make it work using bottles. Can’t help with that tho.

1 Like

Thanks that was the problem. I don’t recall that turning that on, maybe it was from before there was a Stash repository.

MultiFunPlayer v1.33.10:

Download: timed patreon only exclusive
Patreon build: https://www.patreon.com/posts/122741611

1.33.10

Additional patreon only changelog:

  • Fix SLR stuck in connected state when cached session gets invalidated while running
  • Fix SLR script chunks sometimes streaming multiple times
  • Fix SLR script sometimes streaming more chunks than necessary

Changelog:

  • Allow adjusting keyframes heatmap max heat
  • Fix ability to connect to Emby/Jellyfin with invalid state
  • Fix playback when using integrated player in Jellyfin Android client (#189)
  • Fix playback not detected when using Jellyfin Android TV
  • Fix possible unwanted motion when DynamicKeyframeCollection gets updated
  • Fix main thread not idling when nothing needs updating
  • Fix MPV play/pause state not behaving correctly in some edge cases
  • Fix possibility of axis transition value or duration growing infinitely when offsetting from shortcuts/plugins
  • Fix motion provider speed matching also speed limiting script
  • Fix keyframes preview tooltip curve skipping script points
  • Fix draggable point canvas step curve skipping points
  • Fix draggable point canvas interpolated curve skipping points

  • Simplify FixedUpdate and PolledUpdate helper methods in plugins
  • Allow plugins to read action/property argument types and return types
  • Allow plugins to invoke actions with dynamic arguments
  • Fix child class constructors detected as plugin constructor

1.33.9

Additional patreon only changelog:

  • Convert SLR support from Haptics Connect to a script repository


    This is initial implementation so there are some drawbacks compared to Haptics Connect:

    • It currently does not support script switching, the repository only selects the latest user made script and falls back to latest ai script if it cannot find one. The script switching will come in later MFP versions but it requires big internal changes.
    • Heatmap in MFP will load in chunks, but there is a full one visible in DeoVR.
    • Only stroke axis works for multi-axis scripts (SLR limitation)
    • DeoVR haptics toggle gestures don’t work since they require Haptics Connect
    • Scripts stored on VR headset will not be detected by MFP since they require Haptics Connect

    If you had problems with SLR scripts not working on Quest due to firewall/VPN when using the old way then this fixes all of those issues.

Changelog:

  • Block plugins from accessing secure script resources
  • Add ability to toggle InPrivate mode in Web source
  • Add ability to export/import (copy/paste) shortcuts and shortcut actions (#195)
  • Add support for multi-axis funscript format
  • Support script scale when using PolledUpdate (#215)
  • Allow triggering multi key gestures without having to release all keys
  • Fix sync on script resource changed setting not being respected in some cases
  • Fix crash when invoking motion provider actions with axis set to null
  • Fix DeoVR and HereSphere MediaResetMessage spam when no video is loaded
  • Fix possible crash when opening error dialog from snackbar
  • Fix speed limit when using PolledUpdate

1.33.8

  • Fix possible crash when using LinkAxis::Set actions
  • Fix LinkAxis::Set action allowing circular links
  • Fix possible crash when window is restored after logging in into windows
  • Add ScriptChangingMessage to allow plugins to modify scripts before they are applied
  • Use PasswordBox for all api key fields

1.33.7

  • Fix possible deadlock when using Web media source
  • Fix possible duplicate items in Serial/Plex/Emby/Jellyfin selection box

1.33.6

  • Add ability to toggle script heat normalization
    • In previous versions script heat was always normalized, meaning the fastest section of the script was always red no matter how fast that section is, this version disables normalization by default and adds ability to enable/disable it. With normalization disabled script sections are only marked red if they are at or above 500 units/s.
  • Fix MPC source not responding correctly to play state changes causing no motion from scripts
  • Fix MPC source not resetting state when media file is closed
  • Fix XBVR/Stash not working in some cases due to endpoint check not resolving host names
  • Fix possible deadlock by compiling plugins only after the window is loaded
  • Fix missing maximize button in Web window
  • Fix main window padding when maximized
  • Limit number of heatmap preview updates caused by DynamicKeyframeCollection

1.33.5

  • Fix possible crash when using null to target all axes
  • Fix duplicate axis clear/reload actions
  • Fix Script::SkipGap action ignoring target axis
  • Fix Axis::Script::Reload and Axis::LinkAxis::Set actions not blocking until script reload is finished
  • Fire PostScriptSearchMessage before applying the scripts to allow plugins to modify the result

1.33.4

  • Support script invert and media playback speed when using PolledUpdate
  • Add ability to disable assigned shortcut actions without having to remove them
  • Add ability to search for local scripts from plugins
  • Add ability to load scripts from shortcuts actions
  • Improve randomness of random motion generation
  • Improve performance of heatmap generation
  • Change default Serial and UDP output settings to improve smoothness by adding some “additional elapsed time”
  • Fallback to default device when selected device has no axes
  • Remove CreateView from plugins and only load view from .xaml files
  • Fix Buttplug output PolledUpdate ignoring axis settings Enabled state
  • Fix broken interpolation preview
  • Fix exception when trying to schedule shortcut actions after disposing
  • Fix crash when disposing a plugin with registered actions
  • Fix crash when plugin throws exception during initializing or disposing
  • Fix crash when selected device is not found
  • Fix Axis::InvertValue actions migration
  • Fix cloned items in UI when using “move up”/“move down” buttons
  • Fix ability to set device axis name longer than 2 characters

1.33.3

  • Fix TCode commands sent without new line when using additional elapsed time
  • Disable Control-flow Enforcement Technology (CET) Shadow Stack, it was enabled by default in .net 9 but causes crashes on some systems

1.33.2

Additional patreon only changelog:

  • Fix FapTap repository not loading scripts for some videos

Changelog:

  • Add ability to stretch TCode move duration, can help with micro stutters caused by jitter
  • Add RawInput/XInput logging toggles
  • Add draggable separator between assigned actions and action search
  • Add ability to invoke shortcuts from plugins
  • Allow script file drag-drop on axis tabs
  • Allow drag-dropping multiple script files
  • Fix script out of sync when using PotPlayer
  • Fix PotPlayer media path containing garbage data in some cases

1.33.1

  • Improve Web window UI
  • Add support for F11 and video fullscreen in Web window
  • Close Web window if initialization fails
  • Show WebView2 runtime download dialog if it’s not installed
  • Allow changing playback speed of Web window player from MFP
  • Fix instant device movement due to invalid PolledUpdate events
  • Fix Web source start page not allowing urls with custom ports
  • Fix crash when calculating heatmap with negative keyframe positions
  • Fix crash when receiving messages in UDP output after disposing
  • Add FixedUpdate and PolledUpdate helpers for plugins
  • Add dynamic KeyframeCollection which allows live streaming of keyframes

1.33.0

Additional patreon only changelog:

  • Add FapTap script repository - works with Web media source
  • Fix scripts stored on VR headset not loading via SLR interactive api
  • Fix SLR login code not opening browser

Changelog:

  • Add Web media source - opens a custom Edge browser which sends playback information to MFP from a video element on the page
  • Add option to split axes in heatmap preview (#198)
  • Add ability to configure main thread update rate (#176) - can be used to lower CPU usage
  • Add support for reading and writing PotPlayer playback speed - requires 2501xx beta or later
  • Make looping optional in script motion provider
  • Aggregate plugin file watcher events and queue compile only once
  • Optimize axis state locking
  • Fix unable to receive data from auto-started PotPlayer
  • Fix OFS source PathAndQuery not set after changing ip or port (#203)
  • Fix first plugin #r reference not found if source file contains BOM

If you like what I’m doing, please consider supporting me on Patreon
https://www.patreon.com/yoooi

2 Likes

So, the last build available on Github is almost a year old now (v1.31.3). But i see this is still getting constant updates on Patreon (v1.33.10). Is this intentional? Every update post keeps saying this is a “timed” exclusive but how long does “timed” mean in this case?

I haven’t used the tool in a long while, just now came back to update it since i got a new machine and i noticed this. Is the new business model to hide all development from the public? Or is there a separate place to download from now? I’m not sure I understand.

1 Like