emmVRC and VRChat: A post-mortem

This post is really hard to make, but I want to go over some of what has happened over the past four years, and give a look into my process for building emmVRC, and where everything started crashing down.

It started in late-2018, when a friend of mine was showing me a modification to VRChat that they found. They screenshared to me, and showed themselves ruffling my ears and pushing my tail around (this was WAY before physbones). I asked them how they were doing it, but was put off when they mentioned that they modded the game for it. At the time, I didn’t want to touch it at all, as it seemed like a lot of modding in the past was exploits and avatar stealing.

Fast forward to 2019, and my interest in vanilla VRChat was starting to dwindle. A lot of my friends didn’t get on anymore, and drama had put me off from others. I was in a position where I wanted something more. So I started looking into mods, and I came across the VRCTools Discord (this was before we became the VRChat Modding Group). In this server, I downloaded and tried out VRCModLoader, VRCTools and AvatarFav, and it was amazing. I was impressed by how smoothly it merged with the vanilla UI, and the functionality it provided. I was then reminded of the demonstration my friend gave me of their dynamic bones mod, and I immediately got to work.

Within a day or two, I was already working on code to execute with VRCModLoader. It was a painful process full of trial and error, but I finally got to the point where my mod would print to the console, and then stop. At this point, I decided to take some of my prior Unity knowledge, and try to recreate the dynamic bone trick my friend showed me. Before long, I had an integration into the VRCTools settings, and a basic implementation of “Global Colliders”.

I was also interested in having a proper UI for my mod. During this period, mods were transitioning from VRLoader (a primarily console-based modloader that had to be run after the game started) to VRCModLoader (an IPA-based modloader that started automatically with VRChat), and a lot of mods tended to either overlay a UI over the screen, or not have a UI at all, and use keybinds or the console. I wanted my mod to feel like it could have been part of VRChat. Around the same time, Dubya released Ruby’s Button API to the public, and I immediately took advantage of it.

At this point, the mod was simply called “YoshiUtils”. I quickly began running through a ton of ideas in my head, adding features almost every day. YoshiUtils became emmVRClient, and I added features like flying and noclip into a supplement called “emmVRSusp” (or emmVR-Suspicious). I added the HUD, mirror toggling, program loading, and a ton more. emmVRSusp got merged with the main mod, and I continued on quality-of-life features. All of these builds were initially only shared between me and Hordini. About a week after I started though, I messed with some channels in my personal server, Emmy’s Corner (previously just a place for some mutuals to hang out), and released emmVRClient to the public around June.

From then on, things were moving very quickly. emmVRClient was renamed to just emmVRC (because it wasn’t a client to begin with!), and we got a lot of interest. Friends told other friends, and the server grew to the point of making a brand new server: the emmVRC Network. It was also around this time that we started considering a network for things like our own avatar favourites, and fun user-to-user interactions (some of which ended up in another mod of mine, TotallyWholesome). This was around the time that VRChat started up with the first banwave against VRCModNetwork users. This was most likely caused by the authentication endpoints that it used to determine if you were actually logged into the account your game said it was. It’s the primary reason why VRCModNetwork moved to a user/password system, and what led emmVRC to use pincodes.

Fast forward to April of 2020. emmVRC was having a lighthearted April Fools joke (every bit of text in the game was in OwO speak), when suddenly, the IL2CPP update was rolled out. IL2CPP, in essence, takes the code that is compiled from C# (what Unity games including VRChat are written in) and converts it into C++ code. This in turn completely broke how our mods and even modloader worked. For the first time, VRChat went modless, at least from the perspective of the main mod groups. I still have doubts that IL2CPP was added for performance, as performance was generally even lower after this point. We had already mostly known this was coming (IL2CPP was released in open beta first, as was EasyAntiCheat), and a bunch of really talented developers came together to write a brand new modloader.

This new modloader wasn’t just for VRChat. IL2CPP modding in general was very difficult in the past, and a lot of mods were written in C++ for specific versions and platforms of games. But this new modloader was able to significantly change the game of modding IL2CPP. Using the power of the “AssemblyUnhollower”, we were not only able to extract the method and object structures of IL2CPP games, but we were able to make them available in a format that could once again be modded using C#. Using Boneworks, development continued on this brand new modloader, which we called “MelonLoader”.

Within weeks of this breaking update, the rewrite for emmVRC (and several other mods) began. I posted a ton of teasers, and was able to stretch the game far beyond what I could do before. I eventually realized that this new modloader and system allowed for a lot more complex mods, and gave me a better understanding of the inner workings of VRChat. Just a month later, on May 6th, I released the open beta for emmVRC 1.0.0, the first release of emmVRC since the IL2CPP update.

Progress was moving faster than ever. With AvatarFav no longer being supported, I integrated avatar searching into emmVRC. Global Dynamic Bones was overhauled several times, optimizations were made everywhere possible, and new features were being added constantly. We hit a lot of milestones for the server, and emmVRC blew up quicker than I ever could’ve imagined. My passion for the project was at an all-time high, and I was devoting multiple hours every day to just messing with VRChat to develop new things.

Around November of 2020, VRChat began to test out “VRChat Plus”. At the time, it only offered some basic features, like extra favourite lists and badges. Coincidentally, only a week later, I was banned from VRChat for 100 years, for “creation and distribution of malicious mods”

Using alt accounts, I pressed on with development. After all, we had to keep mods working after the VRChat Plus update, and I didn’t want to let anyone down. We had ideas for an avatar database that could actively detect changes in the VRChat API, and update them in the search database to keep content current (and this was in production for a very short period!) But in March of 2021, VRChat made their first major decision: they banned a significant amount of mod creators from the VRCMG. A lot of us were faced with a choice: pull our mods and stop, or don’t log into our many year-old accounts. But when we announced this, the community made a HUGE fuss about it, all over the VRChat Discord, social media, and ingame. So much so that VRChat backpedalled on their decision, and agreed to “start a dialogue with some of the authors of these modifications”.

From this announcement spawned a group chat between us and some of the VRChat staff. It was made very clear that they were unhappy with us stepping on their VRChat Plus features (nevermind that we were doing it significantly earlier), and that they wanted some changes. This led to VRChat Plus enforcement for avatar favourites, as well as the removal of the “adblock” for non-VRC+ members. This decision led to a lot of unhappy people, but it was our hope that this would give a good impression, and make the VRChat team more likely to support us in what we were doing. Some of our dreams were actual mod support, or at least some kind of acknowledgement and idea of where we stood. We also reported exploits we found to them, for the sake of user safety. But actual discussions or information didn’t come up at all, and the last message sent in the group chat was in October of 2021.

VRChat’s UI 2.0 update was in development around October, and it had me super excited. Obviously, Ruby’s Button API (which I had been maintaining for IL2CPP up to that point) broke, because the old UI was essentially discarded, so I got to work on a new UI system. Seeing how the new UI was coded made me even more happy, as it was adaptive and sensical, and was very easy to expand. I was able to not only bring emmVRC to this new UI system, but make things even better. Menus were organized better, and icons helped to garnish what would have been a bland menu of text in the past. Sliders and other UI elements were finally able to be added without jank, and the possibility of proper menu styling features was just the icing on the cake.

About a week ago (July 22nd), rumours were spreading that VRChat was implementing EasyAntiCheat. At the time, it was unconfirmed, but sure enough, 3 days later, it happened.

This led to a SIGNIFICANT public backlash. A canny post was made with over 22.7k upvotes (as of the writing of this), a petition was created with 14.2k signatures (as of writing again), and a lot of fuss was made all over social media. Hell, we even got interviewed for Motherboard.

Ultimately though, VRChat did not care. As of July 26th, the security update is live, and mods have once again gone dead.

In case you didn’t know, this update added EasyAntiCheat to the game. This is a kernel-level anti-cheat solution by Epic, which is also prevalent in games like Fortnite and Elden Ring. It prevents the use of MelonLoader entirely, detecting it as an “untrusted system file” (which it is, and that is the nature of how it injects into games). Some bypasses will and already have come out, but doing this puts everyone at risk. Not only could VRChat start banning people if the anticheat is found to be bypassed, but Epic would not be happy about a bypass being available for it. And more to the point, we could play cat and mouse with the developers for the coming years, but ultimately, the VRChat team lost my trust. Not only did our discussions not provide anything but “we want this and this” without any return, but their blatant ignorance towards their entire community made me lose any faith I had remaining in them.

They didn’t just kill off emmVRC, either. Mods like VRC-CC, a mod that adds closed captions for movie worlds and video players, were also killed off in this movement. Mods that allow you to use your menu while lying down are gone. A significant number of mods that literally enhance the safety of the game, via checking avatars before loading (AdvancedSafety), or enhance the janky IK system (IKTweaks), are all gone. Not to mention the literal thousands of avatar favourites we have stored in our database, and ReMod CE in theirs. Not only are the mods not compatible with new versions of VRChat, but old versions have been locked down and disabled, and all the old instances are being closed.

VRChat claims that they are going to work on adding some of these things in future updates, but that could take months, or even years. Modders already had these features working, and working well. Now that those mods are gone, the pressure is on VRChat to bring those features to the mainstream, and I don’t see them actually pulling that off. Regardless, I’m done. For those who are interested in keeping emmVRC working, we have released all of our source codes on GitHub. We cannot release our database contents, for obvious reasons. Avatar exports are no longer available either.

If you used emmVRC in the past, and want your avatars exported, please make a ticket in the Discord!

With that though, I leave you all with this code, and these final words. I don’t know what is to become of emmVRC. I don’t want to leave the community hanging, but I’m also not going to quarrel with VRChat any further. I’ve been toying with some ideas regarding ChilloutVR, but it’s way too soon to make any promises. But I will say, thank you. Thank you to our massive community, for sticking it through to the very end. Thank you to our Patreon and direct supporters, for keeping emmVRC running throughout all these years. Your support is what made this possible, and emmVRC was so much bigger and better than I ever could’ve imagined. Stay safe, and I’ll see you soon.

Source code

close-alt close collapse comment ellipsis expand gallery heart lock menu next pinned previous reply search share star