Doctacosa

minecraft

This blog

Its author

I've written before about my work on plugins, either to fix existing ones or create new modules entirely. Some of the new work happened to replace older options that stopped working or weren't reliable enough, while others have been designed to add some brand new functionality. While I had made a few available online already, I decided to go the full distance and release as much content as widely as possible!

There's now a main section on Interordi to link to the full set of plugins I've made available so far. This includes information and downloads on Spigot and Polymart, plus the full source code on GitHub. Five plugins are available now, with more being gradually prepared.

This might not mean much to most of you reading this, as you're players of the Creeper's Lab and don't need these files. Instead, these are for server owners, a group of people that I haven't been actively targeting until now. Since I'm already making the effort in developing these features, I thought I might as well use the opportunity to reach out to more people. This includes a new crowdfunding campaign, this time on GitHub Sponsors, which targets developers and server owners interested in supporting my work.

Now, this doesn't mean that this was a simple fire-and-forget thing. As I was telling someone else a few days ago, I tend to classify my code in three categories:

  1. The tools I create for myself only. These can be very unpolished, as I can easily work my way around their limitations or problems.
  2. Things that are shared among the staff members. While they can come with warnings about rough edges, something that's more intuitive is my goal.
  3. What gets published for everyone to see and use. This needs to be fully secured, as fool-proof as possible and with a solid production quality.

Moving anything forward from one level to another can be a significant effort, and often takes way longer than one would think. Most of the plugins that this post is about were in the second tier, although some were in the first; making sure that everything was easy to install and understand required some careful review work.

More in this direction will happen in the upcoming months. Do you have any thoughts on which of the tools I've mentioned over time that would be the most useful to other people? If so, please, I'd love to read about it!

#minecraft #plugins #projects

– Doctacosa

Recently, I reorganized the entire support system of the game servers as I described in this news post. The servers are now able to turn themselves off when empty, then wake back up whenever a player tries to access them. The main result is the empty ones no longer use any RAM or CPU, letting the other worlds have more resources to themselves.

The results were clear: we have had some instability for the past several weeks, including crashes every few days, and that cleared up pretty much instantly. I'm satisfied to see that it was all worth the effort!

This is something that I had been thinking about for a while and then spent most of the past month developing. The dedicated server was getting full, especially on RAM usage, causing instability. Plus, this meant that I couldn't run any more servers in parallel: bringing Seasonal and Tasmantis online for some weeks already increased the rate of issues, which is no fun for the player base, so something had to be done.

Sure, I could have opted to rent a dedicated server with higher specs, or outright get a second one, but I like to maximize what I have before getting more. Plus, this keeps the entire operation running at a lower budget, freeing money for other ventures.

Another feature that I introduced helps me keep the game servers up to date: whenever the servers wake up, they also pull the latest versions of the game itself, selected plugins and their configuration. If, say, Rodinia wakes up 10 times in a given day? That's 10 opportunities to update its files and get the latest improvements and corrections! Before, that was only possible when I did manual restarts, which could be as rare as once every few weeks.

This replaces the Python script that I mentioned back in 2017.

To summarize, this work had three main results: * An immediate, positive effect on game stability. * Easier server updates by fetching files on every wake up. * New opportunities for special projects by freeing resources.

I'm proud of the result. This required several weeks of development but will definitely pay off in the future!

#gamedev #projects #minecraft

– Doctacosa

Following up on my previous post, here are some more of the plugins I've developed over time.

IOServerMonitor

The newest on the batch! As you might guess from the name, this plugin is used to monitor the status of the game servers. Nothing of this is visible to the players; it runs quietly as it lets me keep an eye on valuable data like the last time a server was restarted, how many players are on or how fast it's currently running. Bonus, this one is available for download on Spigot!

IOTrails

IOTrails replaced the older SmokeTrails, which I had been maintaining for a while. This full rewrite allowed me to add new options, most notably in letting players choose a trail once and have it apply on all servers simultaneously. Before, the setting was applied per-server, causing people to often have the wrong one applied. Also available for download!

IOBattleStats

I already did a full write-up on this one nearly two years ago, but I feel like it's worth another mention as tracking all gameplay stats was a very big bite to take. Thankfully, this has been very reliable overall in the meantime, with little maintenance needed. I'm planning a release once I work out a few known issues.

UHC and Grindatron

Both rotating challenges within Kenorland, I developed custom solutions from the beginning to have all the flexibility I needed. These aren't set for public release, as the UHC one is probably underdeveloped compared to some existing options, while the Grindatron is a special feature that I'd like to keep as a Creeper's Lab exclusive.

While I don't have more to mention right now, I'm often considering the time cost of maintaining existing plugins vs finding new ones vs developing my own, so there might very well be a part 3 in due time!

#projects #plugins #minecraft

– Doctacosa

The latest major feature for the Creeper's Lab landed two days ago: full support for Bedrock players on all servers! This includes Windows 10 and mobile, plus consoles with some workarounds.

Then, new advertisements were posted last night to make people aware of this. The reception has been... interesting. Actual quotes:

  • “Impossible”
  • “That’s literally not how the game works”
  • “yea that's literally not possible”
  • “How is that possible”

There's some convincing to be done, but several others have tried it successfully already!

I take no credit for allowing Bedrock players to play on our Java servers, that goes to the talented team at Geyser. My efforts were focused on updating my code backend to properly support these new players, and I had plenty of challenges to face.

First and obvious, the whitelist. Java users get whitelisted by entering their player name on their forum profile, but Bedrock uses Xbox Live Gamertag accounts, with the identifier being a XUID instead of the usual Java UUID. Finding a way to fetch that information and properly update player accounts as they log in took some time. Behind the scenes, the flow is different, but from the players point of view it works the same.

Later came the player statistics. This might seem irrelevant, but player statistics are used for more than vanity purposes: they power a lot of systems, from the web profiles to the achievements, plus my internal activity tracking tools. This was relatively straightforward to do, only requiring time to adjust everything properly!

Finally, a key part was to allow players to be on both Java and Bedrock at the same time. Many people have both versions since the Windows 10 Edition used to be given away for free with Java Edition purchases, and it's reasonable to expect people to want to play on either account whenever. Until now, I had a strict 1:1 relationship between forum IDs and player UUIDs, and this couldn't be the case anymore. I've restructured data processing so that each person can have multiple player accounts attached to their names, solving this issue.

And here we are. The tech issues are mostly dealt with, now it's time to advertise and attract these new players that used to be out of reach!

#gamedev #projects #minecraft

– Doctacosa

Last month, I covered some of the Minecraft server plugins that I've taken over in order to make them work in newer game versions. Let's continue on that to cover some of the plugins that I've written myself, for various reasons. The four that I'm describing here have had their source code newly added to my GitHub profile, if any developers out there want to give them a look!

IOSync

Ironically, the newer one of the set replaces the first one I listed last month: InventorySQL. IOSync is responsible for synchronizing the inventory of players across all survival servers. While InventorySQL chooses a few things to synchronize, IOSync takes the opposite approach and synchronizes everything but a few selected details. Additionally, it works using the base game's data, making version updates much smoother overall! It's still young, but it has performed quite well so far.

IONotifier

Probably the simpler one, this reads the content of a file on the server and displays that text in-game. It's used to relay notifications, such as the hourly notices or the achievement rolls. Straightforward functionality, but since nothing I could find would work just the way I wanted, I rolled out my own.

IOLogger

Straight and to the point, this logs all of the chat and commands entered by the players. These logs have various uses, from tracking the daily activity of the servers to reviewing hacking attempts. This was the first plugin I wrote and made for a good starting point before jumping into more complex functionality.

IOTracker

This one tracks when players move in and out of the WorldGuard regions in the world and saves that information to a file for later use. It's a key part of the achievements system, being able to say who went where.

I've got more, but since I've placed all these online recently, I thought it made sense to start there. I'll continue in a later post at another time!

#plugins #projects #minecraft

– Doctacosa

Backups. Always important, and always neglected, right? Minecraft tends to be stable... most of the time, but it also runs into its problems: chunk corruption, unexpected crashes, large-scale griefing, or even the server disk filling out. As such, it's important to keep backups on a regular basis – they've been useful before, so not doing them isn't even an option.

For a while now, my main backup procedure consisted to having a copy of each separate world compressed and stored away, waiting to be used. If the file hasn't been fetched within a few days, it'd automatically get deleted. I'd make sure, once in a while, to download a copy of everything to my own computer as well. I used to keep several days worth of backups on the server at once, but as the worlds started using more disk space, I've had to scale this down quite a bit.

In the meantime, I've learned that my host has a free backup location available for each account. To prevent people from using this to simply extend their disk space, this backup spot is only available through FTP, so you need to connect to it explicitly to upload and download files. I decided to make use of this, and wrote a new Python script to automatically run on a regular basis.

The new process is simple:

  1. For each world: a) Get a copy of the world and compress it. b) Upload the compressed copy to the backup space. c) Delete the local archive.
  2. Backup the database the same way.

Should I ever need to fetch a file from storage, this simple command downloads it back into place:

python3 backup.py -d FILENAME

Moving the files to a different storage location has the big advantage of mitigating risks: if the main dedi's drive fails for some reason, I won't lose both the live games and their backups at the same time.

Another motivation for this improvement is the simple fact that the dedi's disk is starting to fill out. I've got 100 GB to work with, and between the Minecraft worlds, the Starbound universe and various web sections like the images gallery, it's starting to fill out nicely. Ideally, I'd have two servers or drives: one powered by a SSD to run the games, and one on mechanical drives to have a lot more storage. We're not quite there yet, though, and I need to work with what's available. Keeping the backups off location will help to save on disk space as well as make things better organized.

Got ideas on what I should write about in these game dev entries? Please comment with your suggestions!

#gamedev #projects #minecraft

– Doctacosa

As you've seen by now, the custom ranks feature has been put online thanks to the latest wave of improvements to the chat server. To allow this to take place, the messages are now generated by the chat server itself and sent pre-formatted to all Minecraft instances; these only need to display it through a /tellraw command. A side effect is that all public chat now needs to be relayed through said chat server: if it fails for any reason, including bugs and crashes, players in-game will no longer be able to view messages at all. Thankfully, the system has proven to be solid and reliable since it first came online, so I'm comfortable with this change.

Now, how does this works? That chat server maintains a direct connection to the MySQL database, so it's able to read the access level of each player (admin, op, helper, ...) along with their status (contributor, Patreon backer) and any custom titles set. It takes that information, the received message, and puts it all together for display.

There are still a few aspects that I want to add now that the foundation work is solid:

  • At this time, the chat sent from Discord and IRC only displays the [Discord] and [IRC] tags respectively. Why not go the extra step and have them display the actual rank of the chatter? We already have matching groups on Discord for all staff positions, so that could be reflected in-game. Likewise, authenticated IRC users could be identified based on their user status (aop, hop, etc.).

  • One thing I want to investigate is to allow people to /msg others cross-servers. I already overrode the standard chat and /me actions, so I believe that /msg is doable as well. This would make it more convenient to stay in touch with others while hopping around worlds and servers.

  • As a longer term target, possibly have death messages carried over to Discord and IRC. That would provide more context to the chatters; how many times has someone said something like “Why are you yelling? Oh, creeper got you. Nevermind!”? Carrying the cause of kicks could also help the staff identify people who might be using flight mods. And hey, if I can read and propagate death messages, why not replace them with some custom ones at the same time...? Maybe even get some community input on new messages to make things interesting! How does that sound?

#gamedev #projects #minecraft

– Doctacosa