For performance
- I don't think BigDecimal is required here. You can use basic math to round/setScale a number to have 2 decimal places if necessary.
- ExpressionBuilder has variables. Instead of replacing the strings directly and always creating a new ExpressionBuilder, you can use its variable system.
- That PlayerMoveEvent for mob name display range is hurting me. World#getNearbyEntities will select the chunks based on the range and will loop through every entity in those chunks. Any other solution would be better I think. Like storing the mobs for every chunk in a Map and based on player from/to positions and range, only get those mobs. Now you are not checking for a million cows when a player just farming or a million random dropped entites. I'm not sure how taxing getNearbyEntities is, but I have my worries when it comes to calling it every player move, which, well, happens kind of frequently. Maybe I'm just overreacting and this would never reach to a point where it becomes a performance issue, I don't know, it needs testing for sure.
Gameplay
- Why do you exclude bosses from leveling? I think it would be fun. If you max out your skills, a zombie shouldn't be harder than a wither boss.
- It would be great, if these AuraSkills loot pools could support items from external plugins. Either via first party support or/and through the AuraSkills API. Not just for mobs, but for the other things as well, I think the API solution is preferable, since many plugins already add or may add support for AuraSkills, and circular dependency loading is really not a good thing to have, it is such a pain.
If you like any of these ideas and you need any help, I'm able to help in most of these when I got some free time. If you don't want/need help, I can also just write addon plugins for the loot tables using the API (if you update it) to add support some third party plugin items.