A Much, Much Needed Update

Greeting fellow members:

Looking back at my past posts, I’ve realized that I haven’t communicated much for quite a while. Frankly, I was shocked myself that I had been so remiss. I can’t believe it has been two-plus months. I had every intention of popping my head out of the proverbial rabbit hole we fell into in order to post a quick update here and then, but some new bug or issue would pop up and pull me right back under up until a point where it was just better to remain quiet until we were confident that we had achieved our objectives. I realize that the rumor mill has been working overtime, all I can do now on behalf of all of us is to let you in on some of the details and to say I’m sorry and beg for forgiveness.

Yep, it was a big ol’ rabbit hole we fell into‚Ķ it started out so innocently. Hey, let’s rip out that old ailing iConomy plugin and replace it with something that will provide features that we so desperately need! I can’t help but let out a wry chuckle reading that we were going to try to do that in two days. Two days turned into two weeks, which turned into two months. We should have just gone fishing [1].

The short story is that we wound up rewriting all our support libraries and most of our plugins to make them clean, lean, and mean (well, more functional). It was inevitable that something like this needed to be done sooner or later. Years of updates, patches, and quick fixes were really starting to make our code look ugly. Given the amount of effort required, there would have never been a “good time” to do this. ¬†iConomy was just the tip of a much larger iceberg, but unlike the ill-fated Titanic, we didn’t sink when we hit it. However, we did shrieked like little girls when we realized the impact of what needed to be done.

At first we tried finding a suitable replacement for iConomy. Sadly, none of the other econ plugins had features that we wanted. Anything that was close to our needs seemed to be equally outdated and antiquated as iConomy. Then again, “close” wasn’t close enough unless you were talking about horseshoes and hand grenades. Furthermore, coming off the bad experience we had with payment services at the beginning of year, we weren’t willing to compromise by using hacks and manual procedures.

Needless to say, we wrote our own economy plugin – Bank. It is not just a run-of-the-mill econ plugin that withdraws and deposits money between player accounts, but a real accounting system. Don’t worry, you won’t have to take a crash course in Bookkeeping or Accounting to use it. Matter of fact, from your perspective, it pretty much works the same as iConomy. However, given that underneath it all lies a general ledger system, there is so, so much more that we can do and have wanted for a long time.

Bank handles all in-game currencies. Obviously, that means good ol’ Shillings since it’s our primary currency. XPVault is no longer a separate plugin. Instead, XP is treated as another currency and is managed by the Bank. XPVault commands can still be used but will also suggest using Bank’s equivalent commands. And yes, you will also be able to transfer XP between players.

Lastly, we added Tokens as a third currency. Tokens will be paid out as additional rewards for voting, events, etc. and can be transferred between players. Our plan for Tokens is to allow players to purchase items, temporary upgrades, effects, pets, and other non-Minecraft features. How exactly Tokens will work has yet to be determined and will have to wait until we’ve had some time to rest after the upgrade. Tokens cannot be purchased from VC or automatically converted from/to XP or Shillings. Then again, there is nothing to stop players from making arrangements to exchange one for the other, but that is totally up to them.

Bank’s general ledger will allow us to provide you with much more detailed information about your fiscal activity. Every activity, whether it is payments between players, maintenance fees, store purchases, GP claim block purchases, voting rewards, and so on will be tracked. Furthermore, Bank does fund accounting, meaning that it can track activity and general reports for different types of cost objectives. For example, we could add a module to allow cities to have their own bank, pay its own expenses and collect its own income (e.g. rent, tax, etc.). However, that’s getting ahead of it bit too much right now. We have walk before we can run.

In-game reports will be limited to a Quick History Report for a specific currency. Say you noticed an unusual change in your Shillings balance. The report will show you all debits and credits to that account for the week or month and what initiated them (e.g. payment from player, buy/sell at a store, GP claim block purchases, etc.)

More reports and capabilities to organize your fiscal objectives will be developed and offered through a web-based interface rather than through the limited capabilities of the Minecraft GUI. Furthermore, reports are very database intensive and there is no need to waste valuable Minecraft CPU cycles generating them. The web-based interface is still on the drawing board.

Bank is Vault compliant, meaning that other third-party plugins that process payments (e.g. GriefPrevention) can add/withdraw Shillings. The information gather from them is limited to what they add and withdraw; however, our own plugins such as Tally (voting plugin) and Shoppe will provide far more details. Just to tease shop owners, wouldn’t it be nice to pull sales reports on what is selling and what is not?

Lastly, but most important, Bank can process sponsor payments directly. We developed a simple API that can be tailored to handle different payment systems. Rather than having to rely on a third-party intermediary plugins to handle external events (e.g. PayPal transactions, online store purchases, etc.) we can write our own interface that works directly with the external system.

We were pretty happy when we finished Bank. Finally, we had a real accounting plugin that could track what we wanted to track. Unfortunately, it also required use to take a serious look at our support library. Over the years, we have amassed a fairly large library of support functions and features that are shared by many of our plugins and also help with development and testing. Initially it was a thing of beauty, but over time it had turned into an aged, hamstrung, bundle of code as update patches and patches on patches were applied. The code was littered with “when we have some time TODOs” to remind us that work was required.

Once we looked at what changes needed to be applied for Minecraft 1.9 we realized that we had to put it out of its misery. Indeed, we had falling into a very, very deep rabbit hole. Initially, we thought to just apply patches and call it a day, leaving a refactoring and redesign for a later date because a redesign would affect all of our plugins. We tried running the old and newer routines in parallel, but Bukkit plugins are not OSGi-compliant and we quickly ran into class loading issues and namespace conflicts. That’s when we really hit the iceberg. Once we were done shrieking, we had to decide whether to just limp along or do it right. Having just successfully completed a “right thing” with Bank, we decided on the redesign rather than lying to ourselves that we would do it sometime later.

One and a half months was more than we expected, but that is what it took. It was a frightful time. There were times when it looked like the redesign was going to take much, much longer. Panicked we thought to halt and go back to limping along. Fortunately, when I was ready to throw in the towel, Mudwog knocked sense into me; I returned the favor when he had such notions; and when we both were there, we hit my uncle’s pub and had him ply us with drinks and knock some sense back into both of us.

Once more, I have to apologize to our members. Rather than keeping everyone in the dark, I should have posted something. However, I had reservations of posting any news on the forums. I knew that in my plight to make members happy, that I could have easily been swayed to accepting a short-term solution rather than doing it right. That’s how the support library got into its current state. Instead, now I intentionally didn’t post any news. As I said before, all I can do is ask for forgiveness.

For the better part of this month, we have been updating and refactoring ALL our plugins to work with the new support library. I estimate we weeded out about 15% out of a total 40,000 lines of code across plugins that were different versions of duplicated codes. We added a ton of unit test support to helps us debug and validate plugin operations in our development environment. All our plugins are now part of our continuous integration (Jenkins) and quality assurance (SonarQube) framework. Granted, final tests always involve installing plugins on a server, but the increased unit test code coverage, CI, and QA has greatly minimized the number of round-trips required. We will all be better for it in the future.

Most of our plugin rewrites, didn’t do anything to change them from your perspective. They will continue to function as they have in the past. It’s just that they are now more robust, better designed, and integrate better as part of a larger system. We have refactored OpenBlocks making it easier add new blocks that can be rotated with the Wrench. The XP bug in XPVault (now part of Bank) that would let a nefarious player build up XP has been fixed and we will appropriately adjust XP balances, at a minimum, that exploited the bug.

Tally, which is the successor to JcVaultListener for receiving server votes tracks every single vote, allowing us to generate statistics (e.g. Top Weekly Voters, etc.) and even generate additional rewards based on them. We have added TapeMeasure, a utility plugin, to provide a common region selection feature. Many plugins have their own region selection capabilities (e.g. Residence, GriefPrevention, WorldEdit, JcShops, etc.). We know that several future plugins will also have similar needs. Rather than writing yet another region selection routine, we’ve created a simple, but functional common region selection tool. Initially, this will be used by Shoppe for marking store regions. However, it also provides geometric information such as volume, areas, and length that can be used as a construction aid. We have plans to expand its features to include additional construction aids, but more about that at a later time.

Mudwog is currently working on a rewrite of JcChat, mainly to refactor it to our new support library, make it UUID compatible, and clean up old code. However, he is also adding capabilities that will eventually provide the means to chat across different servers, regardless of what type of Minecraft variant it is.

I am in the middle of implementing Shoppe, the successor to JcShops. As some of you may know, JcShops was our version of the old LocalShop plugin, which we have been maintaining after LocalShop’s author stopped updates. Despite LocalShop’s development having been picked up by another developer, its core code is just too bad to even consider breathing new life into it.

Shoppe is a new plugin designed from the ground up, that will provide the same or similar features and more. Initially, we will have to sacrifice support for shop buy/sell signs, but the fact that it will support any type of item, potions, enchantments and whatever else Mojang adds in in the future, should more than make up for it. There are many more features on the wish list that we have collected from members that we plan on adding (including a sign-type capability); but as I said earlier, we have walk before we can run.

Shoppe has a more natural way of browsing and searching for items and no longer requires item terms to be in any specific order. It will attempt to make the best match possible. If it cannot, it will show what matches it found so that a player can provide more details. Searching for items with enchants is now possible. For example, entering sword looting will find all swords with a looting enchantment. diamond sword looting, dai swo loo, or loo swo dia will also find a diamond sword with looting. The same goes for enchanted books and all potions. There is more, but I’ll hold off until we are ready to release.

Over the next two weeks, we will be releasing our updates and remaining plugins to the test server. We hope that our members will help shake out any remaining bugs. I will be traveling for business in the first part of June and hope that we can start plans for a full update of Arda after the 14th of the month having everything in place before our 5-year anniversary on June 22.

Some members have been asking about stipends. We are still paying out stipends, but it’s been a manual process. LWK has been good enough to handle requests when members ask trusting them as to what stipends have been paid or not. The manner in which stipends are paid is the most I am embarrassed about and there is no one to blame but me. Please, let LWK know if you are strapped for Shillings. I will reconcile whatever stipends are paid and what is still owed once we get all our plugins released onto Arda. The 20% bonus is still in effective.


[1] If you can get a copy of “The Night the Bear Ate Goombaw” by Patrick F. McManus, read the story titled “Sequences” to understand why fishing would have been a better alternative

Comments are closed.