It all started as a bit of a “joke” FedEx project. A few of us play Minecraft together on a multi-player server and, after some customary FedEx pizza and beer, decided that a Minecraft mod for creating and resolving JIRA issues would be a shoe-in for a crowd-pleasing FedEx winner. Given that, if taken in proportion, the size of a Minecraft world is roughly equivalent to eight times the surface of the Earth, we all agreed it’s pretty easy to lose track of all the great ideas you get while playing. What better way to keep track of all the things you want to build in Minecraft than turning them into JIRA issues? I promptly threw away all the work I had done so far, and spent the rest of the night in the Atlassian office learning how to write Minecraft plugins and hacking up a very simple integration. I briefly considered the comfy-looking couch downstairs near the support team (it even has a blanket and a pillow on it), but I threw in the towel at around 2:00AM and caught a taxi home! The Minecraft project made into the FedEx XVIII finals, but Confluence’s brilliant new feature, “AutoConvert“, took first place honours in the end. From there, the JIRA team approached me to turn my FedEx entry into a video we could use to promote the upcoming JIRA 5 launch. That turned out pretty well, too. So, here’s a quick run-down of how it all came together from the technical side. Building in Bukkit I used the Bukkit Minecraft Server to build the JIRA plugin. Bukkit is a community-powered project to build a stable, mod-able Minecraft server over the top of the official multi-player server daemon. Bukkit has a nicely-structured API for building plugins, and if, like me, you’re familiar with Atlassian plugins (Java + Maven), you’ll feel right at home. At its core, the Bukkit API allows you to register commands for users to invoke via the in-game chat panel (eg. “/jiraIssues” to list all unresolved JIRA issues). There’s also an event-driven system that allows plugins to listen for certain events that occur within the in-game world and take action. For example, the JIRA plugin needs to be informed whenever a new sign is crafted and placed within the in-game world and, if the sign contains the text “{jira}”, trigger a new JIRA issue to be created. The skeleton code for this is really straight-forward: 1234567891011121314151617package au.id.jaysee.minecraft; import org.bukkit.event.block.BlockListener; public class McJiraBlockListener extends BlockListener { @Override public void onSignChange(SignChangeEvent event) { super.onSignChange(event); if (event.getLine(0).equalsIgnoreCase("{jira}") { // TODO: Create new JIRA issue. } } } Like most computer games, Minecraft has an internal, endless loop that calculates the current state of the game world and then draws the three-dimensional world on the screen. The loop executes over and over, [...]