Jump to Content VRChatGuides HomeGuides[v2022.4.1] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ GuidesVRChat v2022.4.1 Search Overview • Welcome to VRChat • Getting Started • Frequently Asked Questions • Controls □ HTC Vive Wands □ Oculus Touch □ Valve Index Controllers □ Keyboard and Mouse □ Gamepad □ Action Menu • Additional Options □ Gesture Toggle □ Launch Options □ Configuration File □ VRChat Performance Options □ Local VRChat Storage Guides • Currently Supported Unity Version • Choosing your SDK • Setting up the SDK • Updating the SDK • SDK Troubleshooting • Avatars □ Creating Your First Avatar □ Whitelisted Avatar Components □ Rig Requirements □ Avatar Optimization Tips • Worlds □ Creating Your First World □ Whitelisted World Components □ Supported Scripted Assets □ World Creation, Optimization, and Community Labs Tips • Two-Factor Authentication • Upgrading Unity Projects □ Migrating from 2018 LTS to 2019 LTS □ Migrating from 2017 LTS to 2018 LTS □ Migrating from 5.6 to 2017 LTS • Using VRChat in a Virtual Machine Avatars • Avatars 3.0 □ Playable Layers □ Animator Parameters □ State Behaviors □ Expression Menu and Controls • Avatar Dynamics □ PhysBones □ Contacts □ Permissions and Settings □ Debugging Avatar Dynamics VRChat Udon • What is Udon? • Getting Started with Udon • Using Build & Test • Udon Node Graph □ Graph Elements □ Searching for Nodes □ Event Nodes □ Type Nodes □ Special Nodes • Input Events • Video Players □ Video Player Whitelist • Debugging Udon Projects • UI Events • Animation Events • Player API □ Getting Players □ Player Positions □ Player Forces □ Player Collisions □ Player Audio • Networking □ Network Components □ Network Specs and Tips □ Network ID Utility • Midi in Udon • Networking (Legacy) • World Debug Views • VRCGraphics VRChat Quest • Creating Content for VRChat on Oculus Quest □ Setting up Unity for Creating Quest Content □ Quest Content Optimization □ Cross-Platform Setup □ Quest Content Limitations Systems • VRChat Community Labs • VRChat Safety and Trust System • Avatar Particle System Limits • Avatar Dynamic Bone Limits • Shader Blocking and Fallback System • Avatar Performance Ranking System • Public Avatar Cloning • Full-Body Tracking □ IK 2.0 Features and Options • Avatar Fallback System VRChat OSC API • OSC Overview □ OSC Avatar Parameters □ OSC Debugging □ OSC DIY □ OSC as Input Controller □ OSC Resources Examples & Kits • SDK Prefabs • Examples • Udon Example Scene □ Simple Pen System □ Udon Video Sync Player • Obstacle Course □ Obstacle Course Toolkit □ Obstacle Course: Build From Demo Parts □ Obstacle Course: Build From Custom Parts □ Obstacle Course: How Stuff Works □ Obstacle Course: Flythrough • VRChat Kits □ VRChat Home Kit Components • Avatar Components □ VRC_AvatarDescriptor □ VRC_IKFollower • Scene Components □ VRC_SceneDescriptor □ VRC_AvatarPedestal □ VRC_MirrorCamera □ VRC_MirrorReflection □ VRC_PortalMarker □ VRC_CustomRendererBehaviour □ VRC_Station □ VRC_Trigger □ VRC_EventHandler □ VRC_PlayerAudioOverride □ VRC_SpatialAudioSource • Combat Components □ VRC_CombatSystem • Prop Components □ VRC_Pickup • General Components □ VRC_AudioBank □ VRC_DataStorage □ VRC_DestructibleStandard □ VRC_ObjectSync □ VRC_Panorama □ VRC_PlayerMods □ VRC_UiShape □ VRC_SyncVideoPlayer □ VRCPipelineManager □ VRC_SyncVideoStream □ VRC_VideoScreen □ VRC_VideoSpeaker □ VRC_MidiNoteIn □ VRC_OscButtonIn • Legacy Components □ VRC_ObjectSpawn □ VRC_SyncAnimation VRC_Trigger • Summary • Triggers □ Custom □ Relay □ OnEnable □ OnDisable □ OnDestroy □ OnSpawn □ OnNetworkReady □ OnPlayerJoined □ OnPlayerLeft □ OnPickupUseUp □ OnPickupUseDown □ OnTimer □ OnEnterTrigger □ OnExitTrigger □ OnKeyDown □ OnKeyUp □ OnPickup □ OnDrop □ OnInteract □ OnEnterCollider □ OnExitCollider □ OnAvatarHit □ OnOwnershipTransfer • Actions □ AnimationFloat □ AnimationBool □ AnimationTrigger □ AudioTrigger □ PlayAnimation □ SetParticlePlaying □ TeleportPlayer □ SetGameObjectActive □ SpawnObject □ SendRPC □ ActivateCustomTrigger □ DestroyObject □ SetLayer □ SetMaterial □ AddHealth □ AddDamage □ SetComponentActive • Broadcast Types Latest Release • VRChat 2022.4.1 □ VRChat 2022.4.1p1 □ VRChat 2022.4.1p2 Release Notes • Recent Releases □ VRChat 2022.3.1p2 □ VRChat 2022.3.1p1 □ VRChat 2022.3.1 □ VRChat 2022.2.2p5 □ VRChat 2022.2.2p4 □ VRChat 2022.2.2p3 □ VRChat 2022.2.2p2c □ VRChat 2022.2.2p2b □ VRChat 2022.2.2p2 □ VRChat 2022.2.2p1b □ VRChat 2022.2.2p1 □ VRChat 2022.2.2 □ VRChat 2022.2.1p6 □ VRChat 2022.2.1p5 □ VRChat 2022.2.1p4 □ VRChat 2022.2.1p3 □ VRChat 2022.2.1p2 □ VRChat 2022.2.1p1 □ VRChat 2022.2.1 □ VRChat 2022.1.2p4 □ VRChat 2022.1.2p3 □ VRChat 2022.1.2p2 □ VRChat 2022.1.2p1 □ VRChat 2022.1.2 □ VRChat 2022.1.1p5 □ VRChat 2022.1.1p4 □ VRChat 2022.1.1p3 □ VRChat 2022.1.1p2 □ VRChat 2022.1.1p1 □ VRChat 2022.1.1 • Archived □ VRChat 2021.4.2p4 □ VRChat 2021.4.2p3 □ VRChat 2021.4.2p2 □ VRChat 2021.4.2p1 □ VRChat 2021.4.2 □ VRChat 2021.4.1p1 □ VRChat 2021.4.1 □ VRChat 2021.3.4p3 □ VRChat 2021.3.4p2 □ VRChat 2021.3.4p1 □ VRChat 2021.3.4 □ VRChat 2021.3.3p2 □ VRChat 2021.3.3p1 □ VRChat 2021.3.3 □ VRChat 2021.3.2p1 □ VRChat 2021.3.2 □ VRChat 2021.3.1p1 □ VRChat 2021.3.1 □ VRChat 2021.2.4p3 □ VRChat 2021.2.4p2 □ VRChat 2021.2.4p1 □ VRChat 2021.2.4 □ VRChat 2021.2.3p1 □ VRChat 2021.2.3 □ VRChat 2021.2.2 □ VRChat 2021.2.2p1 □ VRChat 2021.2.1 □ VRChat 2021.1.5p2 □ VRChat 2021.1.5p1 □ VRChat 2021.1.5 □ VRChat 2021.1.4p1 □ VRChat 2021.1.4 □ VRChat 2021.1.3p2 □ VRChat 2021.1.3p1 □ VRChat 2021.1.3 □ VRChat 2021.1.2p1 □ VRChat 2021.1.2 □ VRChat 2021.1.1p1 □ VRChat 2021.1.1 □ Patch Notes - 2020 □ Patch Notes - 2019 □ Patch Notes - 2018 □ Patch Notes - Pre-2018 Powered by  Using VRChat in a Virtual Machine Suggest Edits 🚧 Advanced Users Only! This information is generally only useful for advanced users and specifically only those running VRChat in a virtual machine. It will contain language that may not be recognizable or useful for most users. ❗️ Running VRChat in VMs is Unsupported! Using VRChat via a Virtual Machine is not directly supported, however we have done some research to try to make things easier for those that choose to try anyways. The presence of this documentation does not mean we support running VRChat in a VM. It is possible that these methods or any others may stop working at any given time. We will try to keep this documentation up to date regardless. VRChat's anti-cheat solution, Easy Anti-Cheat (EAC) generally fails when running in a Virtual Machine (VM) environment. This can be very easily worked around though. Most notably, working around it does not have a performance impact. libvirt Use virsh edit VM_NAME to open the VM's XML config in your favorite editor. Then simply add the following line under features > hyperv: In the end, your features block should look something like this: Again, this does not affect performance. You can leave other settings, such as the hypervisor, topoext and invtsc cpuid flags or the hyper-v clock (which all do have performance benefits) enabled. In fact, here's a little trick: Instead of just adding a vendor_id, you can set the Hyper-V mode to passthrough: This will enable all available hyper-v enlightenments* that are available for your kernel/QEMU version - including a vendor id, meaning EAC will not complain, but also including other features you might not have had enabled before, meaning this may very well improve your performance! * "enlightenments" is hyper-v's way of saying "paravirtualized extensions", i.e. interfaces that the linux kernel or QEMU provide to windows guests to enhance performance or functionality in virtual environments After 26 AUG 2022, the above fixes may not be enough to get the game to run still (you should still do them). If you are still facing issues, try manually setting SMBIOS strings for your virtual machine. Theoretically, any valid hardware configuration should work fine, but your best bet would be to pull your own system's baseboard information via dmidecode. You should be able to extrapolate info about your baseboard from these commands: dmidecode --type bios dmidecode --type baseboard dmidecode --type system To do so, add this to your domain root but preferably use your system's information: American Megatrends Inc. F31o 12/03/2020 Gigabyte Technology Co., Ltd. X570 AORUS ULTRA x.x BASEBOARD SERIAL HERE (or "Default string") BASEBOARD UUID HERE BASEBOARD SKU HERE (or "Default string" X570 MB For your UUID entry, you can use the VM's generated UUID at the top of your domain XML. The UUID in your domain XML and in your sysinfo will need to match, otherwise libvirt will complain. Also, add this under your group to make use of those new system parameters: QEMU If you're starting your VM using a raw QEMU command line, you just have to add the vendor id to the -cpu flag. For example: -cpu host,migratable=off,hypervisor=on,invtsc=on,hv-time=on,hv-vendor-id=0123756792CD There may be other stuff in your -cpu argument already, in which case you just append ,hv-vendor-id=0123756792CD to the end, as shown above. You can use hyper-v passthrough mode here too: -cpu host,migratable=off,hypervisor=on,invtsc=on,hv-time=on,hv-passthrough=on (note: you do not need any other hv-foo arguments other than (I think?) hv-time in that case, passthrough will take care of the rest) (further note: you'll have to figure out how to apply the os/smbios options from the libvirt section yourself if you are indeed using QEMU, since I was using libvirt when investigating a fix) Proxmox/PVE Make sure your operating system is set to "Windows 7" or higher in the "Options" tab of your VM. No other action should be required. (note: same deal as above, this may or may not be enough to get the game to work since the 26 AUG 2022 update broke things) Technical notes You may notice that some of this is very similar to the infamous "NVIDIA code 43 fix" from the past. Really the only difference here is that hiding the kvm interface (kvm=off or ) is not even required (but also doesn't hurt). If you have previously set up your VM using such a guide (e.g. https://passthroughpo.st/apply-error-43-workaround/), then VRC with EAC should be working out of the box for you. On a technical level, what the hyper-v vendor id does is setting leaf 0x40000000 of the guest's cpuid information to whatever is provided. The default here is "Microsoft HV", which EAC simply blacklists. Using hyper-v passthrough mode, this turns into "Linux KVM Hv", which still indicates a VM, but EAC is unfazed by it. Since this does not require changing the hypervisor flag, the OS kernel in the guest (Windows NT) will still recognize the environment as a VM and apply performance enhancing measures as such. This also means that the Task Manager in the guest will report running in a virtual machine. This does not matter for EAC in testing within a KVM environment. Very technical notes Here's a little win c++ program to demonstrate the effect of the changes: #include #include void print_leaf(int leaf) { int res[4]; __cpuid(res, leaf); std::cout << "leaf: 0x" << std::hex << leaf << std::endl; for (size_t i = 0; i < 4; i++) { std::cout << "res" << i << ": 0x" << std::hex << res[i] << " ("; for (size_t j = 0; j < 4; j++) { char part = (res[i] >> j * 8) & 0xff; std::cout << part; } std::cout << ")" << std::endl; } } int main() { // cf: // https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/feature-discovery // https://docs.microsoft.com/en-us/cpp/intrinsics/cpuid-cpuidex?view=msvc-170 std::cout << "manufacturer id:" << std::endl; print_leaf(0); // Manufacturer ID std::cout << "hyper-v id:" << std::endl; print_leaf(0x40000000); // Hypervisor CPUID Leaf Range return 0; } Output on an examaple machine using hv-passthrough: manufacturer id: leaf: 0x0 res0: 0x10 (► ) res1: 0x68747541 (Auth) res2: 0x444d4163 (cAMD) res3: 0x69746e65 (enti) hyper-v id: leaf: 0x40000000 res0: 0x40000005 (♣ @) res1: 0x756e694c (Linu) res2: 0x564b2078 (x KV) res3: 0x7648204d (M Hv) Updated 2 months ago ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Did this page help you? Yes No • Table of Contents • □ libvirt □ QEMU □ Proxmox/PVE □ Technical notes □ Very technical notes