Musing on a bundler for old Roblox projects

tech roblox oldroblox devops · note · · 1400 words

I’ve been thinking about if it’d be worth it to make a tool that can make it easier to distribute versions of my games for both the Novetus and Only Retro Roblox Here launchers. Specifically, this tool would manage the game’s assets - the images, music, and other media.

I’m musing. Pondering, even. And when I say that, I mean like this.

The meme image of the werewolf sitting and thinking

Edits are at the bottom of the post

Assets, basically

In official Roblox, both modern and old, your assets would be hosted on Roblox’s servers by uploading them and getting through their moderation.

This has also worked in the past, both for playing existing games in launchers/revivals and even making new games.

However, Roblox has changed how and if assets can be received over recent years:

ORRH(I think?) and Novetus snapshot versions feature a web proxy that can intercept Roblox asset requests from old clients and pull them from these modern endpoints, but these issues still apply. Also, it’s not on Novetus stable 1.3, and more importantly, why deal with Roblox’s website and moderation?? The web proxies aren’t designed for this use case, they’re basically a way to fix assets for old games.

Local assets

So, host assets locally. This is supported, intended for pulling assets from the content directory, but you have the ability to go up a directory (using ..).

Novetus provides a folder called shareddata designed for this. For my new game, Blox Party, I created a new folder called “bloxparty” and put all my image and audio assets in there. Then, I can use it in game with, for example, rbxasset://../../../shareddata/bloxparty/music.mp3 as the URL.

As for ORRH, there is an easier way to distribute and use local assets in your games, called asset packs. I haven’t looked into it much, but it basically lets you override certain Roblox asset IDs with the web proxy. So when the web proxy intercepts the request, instead of pulling it from Roblox’s servers, it uses the local copy stored in your asset pack. Example: https://roblox.com/asset?id=12345 would correspond to 12345.png, or 12345.wav, or 12345.mesh, etc. in your asset pack’s folder. (File extension doesn’t matter, only the filename corresponding to the ID)

ORRH asset packs also contain metadata (AssetPack.json) for the name, description, author, and version of the pack, as well as what clients it should apply to. Also,

This is great and all, but here’s why I want to automate it:

A bundler tool

IDK if bundler is the right word, but yeah. A program, probably a CLI. This is what it would do, I think.

I make a folder wherever I want that has the game and an assets subfolder. This should also be used as the Git repository.

The program would have a few features:

I can make this

This isn’t a request for someone out there to make it, I can make it. I just wanted to note my ideas down and make a plan, but out in the open.

I’ll definitely be writing it in C#, because I like C# and want to use it more, lol.

It will be a terminal app, because that’s all I need, but I suppose a GUI could be made later.

It could also have a native MacOS and Linux version (although these Roblox versions are Windows-exclusive, you can run them on Wine). Even the GUI can be cross-platform.

This is surely over-engineered, but it’s fun and that’s what matters!

8/12 update

Fixed typos, I rushed this post out before I had to leave for work lol. So it was basically just an infodump (it still is… just with less typos)

Also, I got some advice after sharing this to the Client Search Discord about how I should go about generating the numeric filenames for ORRH. (Thanks, Lanausse!)

With that in mind, a smarter approach to generating IDs rather than just being totally random numbers is to base it off the file data - get a hash of the file and convert it to an integer, this would likely be out of the unused range, but maybe a simple modulo operation could fix that??

Doing this would mean your assets keep the same IDs between builds, I don’t know how beneficial that really is, but there you go. Maybe I’ll implement it anyways if it’s easy.


  1. You can convert meshes to the supported versions by using the mesh converter tool in the Novetus SDK. I don’t know if there are any alternatives. ↩︎

  2. Minifying the XML and Lua is something I’ve thought about for a while, and it would make for an interesting blog post seeing how much space is saved. But there isn’t an off-the-shelf C# library for this, so I’d have to port it from the JS libraries or something lol. It’s just regex (at least for the XML minifier), will it really be that hard? (famous last words) ↩︎

  3. ORRH and Novetus snapshots support compressed maps by decompressing them on the fly. Novetus built-in maps use bz2, while ORRH uses gzip. I haven’t tested if they support the vice-versa format. ↩︎

  4. ORRH asset packs mainly exist to provide assets where the web proxy can’t: music, as well as models for games that insert those (e.g. Catalog Heaven). This is why you have to use fake roblox.com asset links and numeric filenames; it wasn’t really designed for original games. (Correct me if I’m wrong on that) ↩︎