Network Levelling
qbb84 / March 2023 (3114 Words, 18 Minutes)
This is a technical post regarding Network Levelling, and the tools I used to design a rigorous plugin for Minecraft networks.
The Design
I find it quite important to start any large project with some form of design documentation so that there’s a centralized, and highly specialized location of ideas, and sharing the documentation with others developers (if you work on a team).
If I have some form of control with design then I tend to go with mind maps for clarity. This is the approach I used within contract positions, and during freelance development.
Below will contain the features, followed by an example design documentation.
Linear Levelling Progression
- The required XP increases linearly with the player’s level.
- Example: 2500, 5000, 7500, etc.
- Customizable: Base increase of 3500*n.
Exponential Levelling Progression
- The required XP increases exponentially with the player’s level.
- Common in MMOS/RPGs like WoW.
Polynomial Levelling Progression
- The required XP increases according to a power of the player’s level.
- Similar to games like FFXIV, POE, Diablo 3, Skyrim, Oblivion.
Boosters
- Boosters are implemented to enhance XP gain for players.
- Customizable: Boost percentages, duration, etc.
Discord Integreation
- Discord integration for level updates by proxy.
Notifiers for Best Player Experience
- includes notifiers to enhance the overall player experience.
Psychology Utilization
- Utilizes researched psychological principles to optimize player engagement.
Customization
- The system allows for easy customization of XP progression via config.
Now the features are transparent, I spent time creating a design doc.
It’s important to encapsulate all the features, as well as any additional ideas you can think of, let yourself be creative. Here’s an image of the documentation:
The Map Anatomy
At first glance it may be difficult to understand the map, so I’ll break it down:
- The whole system of network levelling is a child of an abstract network statistic class for the server, since levelling should be tracked, this also means we’ll be able to easily manipulate other statistics, especially with boosters.
/**
* This class represents a network statistic.
*/
public abstract class NetworkStatistic {
protected static final List<String> availableStats = new ArrayList<>();
protected int value;
protected String name;
protected String type;
protected UUID player;
}
- Most of the features we discussed earlier are then a child of network levelling or listen in some way to network levelling.
public class Booster<T extends NetworkStatistic> {
private final String boosterName;
private final UUID playerUUID;
private final T statistic;
}
Notice how I didn’t use a raw type of NetworkStatistic, this was peril not to do. Having a generic type of NetworkStatistic allow us to instantiate boosting for different types of network statistics, which also helps to be proactive for any future additions of network statistics, and this was the basis for how I started the project.
Player Psychology
It’s important to me that the systems I create, are as fun, intuitive, and enjoyable as possible for players. I think of players as customers, and so understanding your target audience is very important.
Here are the steps I took to create an engaging system:
- Horizontal progression over vertical (unlock new abilities, rather than making players more powerful; make them feel special)
- Visual progression system with available tracking will give small amounts of dopamine
- Rewards for levelling give an incentive to keep investment
- Purchasing boosters can offer great benefits to players of the server to achieve rewards faster (increasing ROI)
Discord Integration
This was simply achieved through a HTTPS connection to the url of a discord channel. All the functionality to post was customizable for admins (thumbnails, footers, content, titles, rgb support, and more).
URL url = new URL(this.url);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
Conclusion
- Be ready to make vast changes; concepts aren’t final.
- Over the years creation has become more trivial, but creating something that’s meaningful requires a lot more dedication.
- Research, and then research some more
You can find a link to my repository, containing fully documented code of a basic implementation, similar to how I’ve incorporated network levelling for servers in the past View Repo