Some notes on modding Minecraft

I’m very new to Minecraft, only having started playing in university. It’s a fun game: and a very moddable game. I’ve spent a lot of time setting up mods locally and setting up a server of my own, and figured I’d better write down what I have done. Since I’m new to the game, vanilla Minecraft still holds a large amount of that initial magic - the mods (and plugins) I run reflect this, not making any particularly sweeping changes to the game or gameplay.

On the client

Right now, I use Fabric for mod loading. It bills itself as a lighter weight / higher quality / more put-together / more straightforward modding toolchain than Forge: which seems broadly true. With Fabric comes a bevy of associated extensions: the Fabric API for other mods, ModMenu for mod loading, Sodium + Lithium + Phosphor for various performance improvements, Iris for shader support. Far and away the mod I use the most (and really, the only one that changes the gameplay) is JourneyMap: Minecraft is practically unplayable for me without it (I am bad at navigation). The shader pack I usually use is Sildur’s Vibrant Shaders on Medium: which my poor little laptop’s integrated graphics absolutely cannot handle. But I’ll take the occasional minute-long dip to 5FPS during the garbage collection cycle for really pretty water…

Previously I used OptiFine + Forge, but started looking for alternatives as development lagged quite behind upstream Minecraft’s release schedule: and different mods often didn’t interact well, plus I like shiny new things. My Forge plugins mostly corresponded to what I run now: Fabric + Fabric API + ModMenu -> Forge, Sodium + Lithium + Phosphor + Iris -> OptiFine, JourneyMap -> JourneyMap.

On the server

I came into possession of a pair of old corporate mini-PCs a while back, and took some time early January to set them up as personal servers. Setting up the servers was quite straightforward: Arch Linux’s archinstall ships with a server configuration that sets up Cockpit and Portainer for you. All else I really had to do was set up firewalls (through Cockpit) and configure a reverse proxy (HAProxy, which is incredibly intuitive and straightforward to configure). Exposing the server to the internet was a nightmare and took probably a dozen hours, several calls to my telco, and punching holes through three (3) firewalls on my modem. But that’s neither here nor there: this section is about my Minecraft server, not my fundamental lack of networking knowledge.

The server I’m running is PaperMC: a Bukkit/Spigot descendant that aims for high performance and fast development. I went with it over the official Minecraft server because I foresaw wanting to add mods/plugins, and because going with a community-developed server seemed like generally a good thing to do. I went with it over other unofficial servers as it seemed more cohesive than and somewhat of a successor to Spigot, and all other active server implementations lagged significantly behind major releases (aside from Purpur: but is that it?). Much later, I learned that Paper doesn’t support server-side mods: I still don’t quite know what this (doesn’t) entail, as it supports “plugins”: which are apparently distinct. (more on these later.)

Installation and configuration of PaperMC promised to be straightforward: and it was! I just installed it from the AUR, enabled papermc.service and papermc-backup.service, punched a hole in my firewall, tweaked a few things in /srv/papermc/server.properties, and was good to go. Quite quickly, I got the itch to set up something fancy: and so got BlueMap up and running at mc.toki.la. The documentation is excellent, and installation as a plugin was straightforward as a result. I only had to add two lines to my HAProxy config.

As I was setting this server up to be a casual server for me and my friends, I also wanted to set up some simple warp / teleportation system: which proved a little bit harder. I needed some kind of permissions system so that people couldn’t create warps willy-nilly, which I thought would be easy, as I only wanted to distinguish between operators and regular players: but every plugin I could find seemed to depend on an elaborate permissions API. This might be a limitation I’m unaware of, perhaps operator lists aren’t exposed by the Bukkit/Spigot/Paper plugin system. Anyway - after failing to set up marylieh’s SimplePerms, I went with the overengineered (not that that’s necessarily a bad thing. but man, is it overengineered, and they know it) LuckPerms. The actual warping plugin I used was marylieh’s SimpleWarp.

I later set up SimpleVoiceChat for proximity voice chat, GeyserMC for Bedrock support, Towny and BlueMap-Towny for griefing protection, and replaced SimpleWarp replaced with AdvancedPortals for better immersion into the server. SimpleVoiceChat and Geyser both use UDP: and as my reverse proxy didn’t support it, I had to set up an additional reverse proxy alongside it (this was, however, surprisingly straightforward).

In the future, I’m considering setting up a cracked login so that some friends who don’t want to create a Microsoft account can play. I’m not sure how this would interact with Geyser, however: and I know that it will mess up inventories and skins. I’d also like to learn how to write plugins (and mods) of my own: probably by looking into marylieh’s plugins and contributing any fixes I can. They seem quite good and compact.

client-side, server-side, mods, plugins, toolchains, oh my!

The state of Minecraft modding is confusing! A bevy of active, inactive, deprecated, and abandoned projects float around, many of which are slightly or very incompatible with each other. This section is an attempt for me lay things out straight and have a reference for when I inevitably forget the state of a project. Do note: I’m only dealing with Java edition here.

client side mods

The default Minecraft installation does not support mods. So, the end user needs to install a mod loader. Mod loaders, aside from well, loading mods, also typically provide an API / toolchain for the mods themselves: and so as this is a gargantuan task, there are relatively few mod loaders, and mods usually are written for one and only one mod loader.

There are six known mod loaders, but really only two (Forge and Fabric/Quilt):

As for other related terms:

There are also alternative launchers, like MultiMC -> PolyMC -> Prism Launcher, ATLauncher, GDLauncher, Ferium, Theseus, Feed the Beast, etc. I don’t use these.

server side mods (and plugins)

First: there is a distinction between server-side mods and server-side plugins. Server-side plugins follow an API that extends existing features of Minecraft, while server-side mods directly patch the server itself to add entirely new features. Some server-side plugins + mods may require corresponding client-side mods, while others may not.

The Bukkit API and its descendents (Spigot, Paper, Purpur) are far and away the most widely used plugin system. Sponge (on top of Vanilla or alongside Forge) and Cuberite are alternatives.

Forge and Fabric/Quilt, in addition to being client-side mod toolchains, also provide server-side mod toolchains. These are separate and incompatible, just like their client-side counterparts. Fabric is notably incompatible with Spigot, and Paper is notably incompatible with both: although Cardboard exists, which promises support for the Bukkit API on Fabric-modded servers.

finding mods

The de-facto hub for finding mods for a good long while was CurseForge. They’ve made a number of hostile changes, however: and so Modrinth has risen to be the new standard. All of the mods I use sans Sildur’s Shaders can be found on it. While a corporate entity is behind it, they develop in the open (and with Rust! owo) and seem to work with the community at large.

server implementations

A number of unofficial server implementations are available to choose from. Taken primarily from the Spigot wiki: