THIS IS A FAN MADE PORT OF VM COMPUTERS BY Delta2Force
Transfers VM Computers to modern Minecraft version (1.20.1)
Original Mod
Check out the original VM Computers mod by Delta2Force:
https://www.curseforge.com/minecraft/mc-mods/vm-computers
Thanks to KuanogenMod for testing some of the versions!
If you have problems with this port, please submit them to my GitHub.

Join the vmcomputers Discord Server!
Donate to the original creator (Delta2Force)
Note: Only accepts Bitcoin and BitcoinCash
BTC: 3GubEkHV69gCkjWhRgRWYqWqyjcWW3gxFFBCH:
bitcoincash:qq6jttzlvgj68lvecnh75pt3znezj4vx6sysfvj3j5
Dependencies
- Minecraft 1.20.1
- VirtualBox 6.1
How to use
Ordering
- Craft an ordering tablet (as seen below)

- Wait until it detects a satellite (they appear quite often)

- The rest is (hopefully) self-explanatory
Creating a Hard Drive / Importing an ISO disk image
Virtual Hard Drives are created by pressing the use button (right-click) while holding an hard drive in your hand. It doesn't matter if it has been assigned to a disk image or not as it will always open the menu. You can either use an existing hard drive (located in .minecraft/vm_computers/vhds) or create a new one.
ISO images are CDs / DVDs but as files. They are stored at .minecraft/vm_computers/isos. Once you place them in the folder, you can select them in the PC case menu.
Building the computer
You will need the following items (which can be bought from the Ordering Tablet):
- PC Case,
- Motherboard,
- RAM,
- GPU, and
- Monitor
To insert a hard drive, you will need to create one by right-clicking with a hard drive in your hand.
It doesn't matter if it is already assigned to a disk image or not.
- Place down the case

- Press the use button (right-click) on the case

- (Optional) Select an ISO image from the list
- Open the case

Note: The buttons will be disabled if you do not have the item in your inventory. - The rest (hopefully) is self-explanatory
Using the computer
To turn on the computer, press the Power On button in the PC case menu. To interact with the computer, press the use button (right-click) on the monitor.
Note: Pressing Alt+F4 will close the game, not the window you are on in the virtual machine.
To stop interacting with the computer, press the keys mentioned in the top-right corner of the screen when interacting with the monitor.
Contributing
If you'd like to contribute to this project, please fork the master branch, make your changes and create a pull request to have the changes reviewed. If you plan to contribute larger changes, please create a issue to discuss the major changes that you were planning to make.
I don't like rules, but to keep consistency and readability of the code please follow these guidelines:
- Use lambda expressions when appropriate
- You'll find that it is faster to write
() -> {}, just saying :) - Try to follow the code style of the project
- Makes everyone's life so much easier when it comes to making changes and understanding the code
- Commit messages should describe the change well without being too short
- Where it says 'Update [insert file name here]' should be replaced with a short overview of what was changed. Use the optional extended description to explain the specific changes that were made.
- When making a pull request, make sure that you have made all of the changes you have wanted to before posting the pull request.
- It gets messy when you create a pull request and continue to make changes after the fact.
All Versions
+ Add Version- Fixed vmware autodetect being not accurate
- Fixed vmware autodetect being not accurate
## changes
- VMware backend instead of VirtualBox
- New 3-layered video pipeline for enhanced performance
## changes
- VMware backend instead of VirtualBox
- New 3-layered video pipeline for enhanced performance
# IF YOU ARE HAVING AN ISSUE LIKE PC NOT STARTING|SHUTTING DOWN, PLEASE TRY TO CLOSE MINECRAFT AND REBOOT YOUR SYSTEM BEFORE REPORTING THE ISSUE
## PORTED TO 1.21.1 NEOFORGE
# IF YOU ARE HAVING AN ISSUE LIKE PC NOT STARTING|SHUTTING DOWN, PLEASE TRY TO CLOSE MINECRAFT AND REBOOT YOUR SYSTEM BEFORE REPORTING THE ISSUE
## PORTED THE LATEST MOD VERSION THAT SUPPORTS LATEST VBOX TO FABRIC 1.21.1
##### that's all
1. Mouse not working inside of vm - fixed
2. Keyboard keys spamming/not responding - fixed (still weird behaviour in windows 98 setup)
3. Crashing on pcs without 3d acceleration support - fixed
## SMALL CHANGES
1. Changed support message so people wouldn't text the original mod creator (sorry i forgot about that in previous versions)
Fixed VirtualBox VM startup crash related to 3D acceleration
Details: Previously, the mod forcefully enabled GraphicsFeature_Acceleration3D during VM startup. If the host machine's hardware, graphics drivers, or the installed version of VirtualBox (e.g. 7.0+) did not support 3D acceleration with the current configuration, it would result in a VBOX_E_NOT_SUPPORTED error and cause the game to crash or the VM to fail to boot entirely.
Solution: Moved the --accelerate3d on argument to a silent modification command. Now, the mod will attempt to enable 3D acceleration, but will safely fallback and start the VM in software rendering mode if the host system does not support it, preventing crashes for users with incompatible setups or newer VirtualBox versions.
## [1.4.16-1.20.1-fabric] - 2026-05-09
### Security & Critical Bug Fixes
- Fixed UUID mismatch in multiplayer screen texture cleanup** (
ClientMod.java) S2C_STOP_SCREENandS2C_SCREENwere usingmcc.player.getUuid()forremove()instead ofpcOwner.- This caused screen textures from other players to **never be destroyed**, leading to a severe **memory leak** (
NativeImage,NativeImageBackedTexture,Identifier). - Also fixed a **double-close bug** where
vmScreenTextureNI.close()was called instead ofvmScreenTextureNIBT.close()inS2C_SCREEN.
- Fixed component loss when placing last PC case from stack** (
ItemPCCase.java,ItemPCCaseSidepanel.java) decrement(1)was called **before** reading NBT data. Whencount == 1, the stack becameEMPTYandgetNbt()returnednull, causing **permanent loss** of all PC components (motherboard, CPU, RAM, HDD, ISO).- Now NBT is saved to a local variable **before** decrementing.
- Fixed server crash on missing inventory item** (
MainMod.java) removeStck()threwRuntimeExceptionwhen an item was not found, crashing the **entire server**.- Replaced with logging via
LOGGER.error()and graceful return. - Also hardened against desync between
contains()check andremoveStck()execution.
- Fixed ClassCastException exploit in C2S_ORDER** (
MainMod.java) - No validation that
readItemStack().getItem()is actually anOrderableItem. A malicious client could send any item, causing a server crash. - Added
instanceof OrderableItemcheck with logging of invalid packets. - Same fix applied to
S2C_SYNC_ORDERhandler inClientMod.java.
- Fixed IllegalArgumentException in C2S_ADD_CPU / C2S_ADD_RAM** (
MainMod.java) - When
dividedByormbvalues did not match expected constants,lookingForremainednull, causingnew ItemStack(null)→ server crash. - Added
lookingFor != nullguard before creatingItemStack.
- Fixed HDD removal ignoring NBT** (
MainMod.java) removeStck()matched only byItemtype, not NBT. If a player had multiple HDDs with different VHD files, the **wrong disk** could be removed.- Enhanced
removeStck()to prefer **exact NBT match** before falling back to type-only match.
- Fixed VM always created with only 1 CPU** (
GuiPCEditing.java) Math.min(1, ...)in the "create new VM" branch always returned1, regardless of host CPU count or player settings. The "modify existing" branch already used correctMath.max(1, ...).- Fixed to
Math.max(1, ...)— VM now gets the correct number of CPUs.
- Fixed ConcurrentModificationException in ServerMixin** (
ServerMixin.java) MainMod.orders.remove()was called duringfor-eachiteration overHashMap.values(), guaranteeing a crash every time an order completed.- Implemented deferred removal: collect keys to remove in a list, then delete after the loop.
- Fixed NPE when sending packets to disconnected players** (
ServerMixin.java) playerManager.getPlayer()could returnnullif a player logged out. Calling.getWorld()orServerPlayNetworking.send(null, ...)caused NPE.- Added null checks before all
getPlayer()usages.
- Fixed deadlock in insertISO** (
GuiPCEditing.java) wait()withoutwhileloop and without timeout — ifnotify()was called beforewait(), the thread hung forever.- Replaced with
while (condition) { lock.wait(5000); }pattern using a sharedClientMod.VM_TURNING_ON_LOCK. - Also fixed the case where a new
GuiPCEditinginstance had a different monitor object than the onenotify()was called on.
- Fixed busy-wait burning 100% CPU in turnOffPC** (
GuiPCEditing.java) while(ClientMod.vmTurningOn) {}was an infinite spin-loop.- Replaced with
Thread.sleep(50)inside the loop. Also addedvolatiletovmTurningOnso the thread actually sees state changes.
- Fixed Timer thread leak in GuiFocus** (
GuiFocus.java) - A new
Timerwas created every timeGuiFocusopened, butcancel()was only called onNullPointerException(singleplayer). In multiplayer, timers leaked indefinitely. - Timer is now stored as a field and cancelled in
removed().
- Fixed NPE-based control flow in singleplayer** (
GuiFocus.java) getCurrentServerEntry().addressthrows NPE in singleplayer. The code usedcatch(NullPointerException)as control flow.- Replaced with explicit
== nullcheck.
- Fixed resource leak in VBoxManage** (
VBoxManage.java) BufferedReaderandInputStreamwere not closed infinally, leaking file descriptors on exceptions.- Wrapped in
try-with-resources.
- Fixed FileWriter not closed on exception** (
ClientMod.java) increaseVHDNum()opened aFileWriterwithouttry-with-resourcesorfinally. On any exception, the file handle leaked.- Wrapped in
try-with-resources.
- Fixed Unpooled.buffer() leaks across all packet handlers**
new PacketByteBuf(Unpooled.buffer())was used inClientMod.java,GuiPCEditing.java,ServerMixin.java, andPlayerManagerMixin.javainstead ofPacketByteBufs.create().- Replaced all instances with the proper Fabric API method.
- Fixed regex bug in hard drive selection** (
GuiCreateHarddrive.java) split(" | ")treated" | "as a regex (space OR space), effectively equivalent tosplit(" ").- Any VHD filename containing a space was broken. Replaced with
indexOf(" | ")+substring()for literal matching.
- Fixed iron ingot overpayment loss** (
EntityDeliveryChest.java) - When a player overpaid,
is.increment()was called on an already-emptyItemStack(afterdecrement()), causing the **excess ingots to be permanently lost**. - Fixed by saving the count before
decrement(), then creating a newItemStackfor the refund and usingplayer.getInventory().offerOrDrop().
- Fixed matrix stack imbalance on exception** (
HeldItemMixin.java) matrices.push()in HEAD andmatrices.pop()in TAIL were not atomic. An exception between them left the stack unbalanced.- Wrapped rendering in
try-finallyto guaranteematrices.pop().
- Fixed NBT key inconsistency** (
EntityPC.java,ItemPCCase.java,ItemPCCaseSidepanel.java) - Constructor used different NBT keys (
x64,MoboInstalled,GPUInstalled,RAMSlot0,VHDName,ISOName) thanreadCustomDataFromNbt/writeCustomDataToNbt(X64,MotherboardInstalled,GpuInstalled,GbRamSlot0,HardDriveFileName,IsoFileName). - This worked only because the two paths never crossed, but was a refactoring minefield.
- Unified all keys to match
writeCustomDataToNbtformat. Added **backward compatibility** in constructor to read both old and new keys.
### New Features
- Transition to VBoxManage CLI (VBox CLI)**
- Replaced the deprecated **VirtualBox JWS (Java Web Services) API** with a new
VBoxManage.javawrapper that calls theVBoxManagecommand-line tool directly. - The JWS API was **removed in VirtualBox 7.0+**, making the old mod completely incompatible with modern VirtualBox installations.
- All VM operations are now performed via CLI:
createVm,modifyVm,startVm,powerOffVmstorageAttach,addStorageController,removeStorageControllermountMedium,unmountMediumputScancodes,putMouseEventtakeScreenshotgetVmState,vmExists,discardSavedState- Added
executeSilent()for optional operations that may fail on newer VBox versions (e.g.,--accelerate2dvideoin VBox 7.x). - Added connection test (
testConnection()) and version detection (getVersion()).
- Support for VirtualBox 7.x and newer**
- VBox 7.0+ removed
vboxwebsrv(the SOAP web service). The mod now works with **any VirtualBox version** that providesVBoxManage. - Added parsing of
showvminfo --machinereadableoutput for medium attachment state, compatible with VBox 7.x output format. --accelerate2dvideois now handled silently (ignored if unsupported) instead of crashing.
### Performance Improvements
- Added
volatileto all cross-thread shared state** (ClientMod.java) vmTurnedOn,vmTurningOn,vmTurningOff,vmUpdateThread,vmTextureBytes,vmTextureBytesSize.- Prevents infinite busy-waits and race conditions between the render thread and VM update thread.
- Added
synchronizedto texture byte transfers** (VMRunnable.java+ClientMod.java) vmTextureBytes/vmTextureBytesSizewere updated in one thread and read in another without any synchronization, risking torn reads.- Added
VM_TEXTURE_LOCKwith propersynchronizedblocks on both write (VM thread) and read (render thread) sides.
- Added
synchronizedto tablet texture streaming** (TabletOS.java) byteArrayInputStreamwas written by the tablet renderer thread and read by the main render thread without synchronization.- Added
TEXTURE_SYNClock with local copy pattern.
- Throttled
isMediumEjected()polling** (GuiPCEditing.java) - Previously called
VBoxManage showvminfo**every frame (~60 times/second)**, spawning a new OS process each time. - Now checks **every 2 seconds**, reducing CPU and disk load by ~99%.
- Throttled tablet renderer** (
GameloopMixin.java) - Tablet renderer
while(true)loop had noThread.sleep(), pinning a CPU core at 100%. - Added
Thread.sleep(33)for ~30 FPS cap. - Also replaced silent
ConcurrentModificationExceptionswallowing with proper logging.
- Reduced S2C_SYNC_ORDER network spam** (
ServerMixin.java) - Order sync packet was sent **20 times/second per order** regardless of whether status changed.
- Now tracks
lastSyncedStatusand only sends the packet when the status actually changes.
### Architecture & Code Quality
- Proper use of
PacketByteBufs.create()throughout** - Eliminates manual buffer lifecycle management and potential leaks.
- Added SLF4J/Log4j logging** (
MainMod.java) - Replaced
RuntimeExceptionserver crashes withLOGGER.error()for inventory desync events.
- Backward compatibility for old NBT saves**
- Old PC cases placed in the world before this update will still load correctly thanks to dual-key reading in
EntityPCconstructor.
## [1.4.15-1.20.1-fabric] - 2026-04-08
### Added
- Ported the mod to Minecraft **1.20.1**.
- Full support for **Fabric Loader**.
- Updated to **Java 17**.
### Changed
- Updated all dependencies to be compatible with 1.20.1 (Fabric API, Yarn mappings).
- Refactored rendering logic to comply with modern Minecraft rendering standards.
- Updated entity interaction logic to ensure compatibility with 1.20.1.
- Integrated ShadowJar for better dependency management and to resolve class loading issues (e.g.,
CatalogManager).
### Fixed
- Fixed GUI rendering issues that were present during the porting process.
- Fixed an issue where the PC editing menu would not open when interacting with components.
- Resolved various runtime compatibility errors related to Java 17 and relocated libraries.
## Development Plans (Branches)
Three main development branches have been defined for the project:
1. **Deprecated**:
- Contains already released versions and versions that have become obsolete for any reason (critical bugs, etc.). Github current branches will/are marked as deprecated, please don't use them.
- Port of the original mod and its refinement as intended by the original author.
- Versions: **1.x.x**.
- Personal ideas, custom components, new devices, and expanded functionality.
- Versions: **2.x.x**.
This is a beta port of VM Computers for Forge 1.20.1.
### Working
- Initial setup and saved setup flow
- VirtualBox support
- VMware Workstation support
- VM screen rendering
- Keyboard and mouse input
- Config save/load via
setup.json
### Fixed in this beta
- VirtualBox JAXB/JAX-WS crash on Forge
vboxwebsrvstartup issues- setup flow resetting incorrectly
- missing config/path creation
- Connector/cache conflicts with old builds
- blank VM screen while VM was running
- VirtualBox session lock issues
- VMware startup with old
.vdidisks - missing keyboard input in VMware
- missing VMware setup text
### Known limitations
- VMware is still experimental
- VMware may create a separate
-vmware.vmdkfrom an existing.vdi - VirtualBox and VMware disks may not stay in sync in that case
- Tested mainly on Windows 11, Prism Launcher, and Forge 1.20.1
### Recommended
- Use VirtualBox for the most stable experience
- Use VMware as a beta/experimental backend for now
### Bug reports
Please include:
- latest log
- whether you used VirtualBox or VMware
- whether the disk was
.vdior.vmdk - whether it happened on first setup or a later restart
## Changelog:
1. VMware support
2. First steps to make mod work on linux/mac os