Heroes Premium ⚔ Full Translations! BEST RPG PLUGIN EVER

MC Plugin Heroes Premium ⚔ Full Translations! BEST RPG PLUGIN EVER 1.10.4b
The best class, race and skill Minecraft RPG plugin for Minecraft servers

Fixes for 1.20.4 server oddities and some client crashes
This will fix Heroes to load when not using MM, apologies and thanks for the reports!
Optional percent based strength increaser
combat but fixes
various other quality of life improvements
Read the entire changelog

==-- | 1.10.2 PREMIUM | --==

This is a minor update to fix some further bugs and implements some community suggested features.

-- Supported Minecraft Versions --
1.13.X, 1.14.X, 1.15.X, 1.16.X, 1.17.X, 1.18.X, 1.19.X, 1.20.X

-- Changes --
  • Added a new feature which is intended to combat spawn-campers and general bad PvP behaviour. This feature is called 'death-bonus'. If a player is defeated a configurable amount of times, then they are given a special effect that boosts their speed and damage against all players that were involved in 'abusing' them. Similarly, the player also receives a reduced damage from the killers. The configuration is generated in config.yml but you can take a look here as well.
BUG FIXES!

  • Add SummonFamiliar to allow for Pets and MythicMob AI to be controlled by the player!

RAVINGAR @RAVINGAR
Pushed to branchdev
19 hours ago
[IMG]
RAVINGAR @RAVINGAR
Acceptedmerge request!147"Fixed an exception that occurred when attempting to modify a monster's damage..."
19 hours ago
[IMG]
RAVINGAR @RAVINGAR
Openedmerge request!147"Fixed an exception that occurred when attempting to modify a monster's damage..."
19 hours ago
[IMG]
RAVINGAR @RAVINGAR
Pushed to branch1.10_bug_fixes
6 days ago
[IMG]
RAVINGAR @RAVINGAR
Pushed new branch1.10_bug_fixes
# ==-- | **1.10 PREMIUM** | --==
This update is a MAJOR step forward for Heroes and the future of the plugin! A significant number of rewrites, optimisations and new features are present in this update as we finally jump to the new 1.10 mark. As always, please let us know if you encounter any issues with this new update.

**You MUST update all your skills for this latest version, otherwise the skills WILL NOT LOAD!**

**It is also recommended to backup your old damages.yml and then generate a new one! As there are new options configuration options available!**

## -- **Supported Minecraft Versions** --
1.13.X, 1.14.X, 1.15.X, 1.16.X, 1.17.X, 1.18.X, 1.19.X, 1.20.X

## -- **New Features** --
- damages.yml now contains the option `use-pvx-damage-multipliers`. Previously, this has always been true, where a class's pvp and pve modifiers are considered during damage calculations. If you do not use this feature then simply set it to false, which can minorly improve performance.
- damages.yml now contains the option `item-damage-priority`. This has 5 modes and controls what affects a Hero's dealt damage. Previously, the highest value of all classes (primary, secondary and race) was chosen. It is advised to select the option that best suits your needs, as if you only use a primary class for damage, then choose that since it significantly reduces the amount of calculations required therefore improving performance.

The available options are;
```

  • - highest (checks which value is the highest of the three classes)
  • - primary (only uses primary class, if no value exists use global damage, if no global damage exists, use vanilla)
  • - secondary (only uses secondary class, if no value exists use global damage, if no global damage exists, use vanilla)
  • - race (only uses race class, if no value exists use global damage, if no global damage exists, use vanilla)
  • - none (don't use class scaling, instead use global damage if it exists - and if it doesn't then use vanilla values.)

```
- A Hero's attributes are now available as variables through MythicMobs! This means using script skills, you can use per attribute increases for various skill variables. You can access a Hero's attribute using a format such as; `<caster.var.hero_strength>` or `<caster.var.hero_charisma>`
- Expansion for Placeholder API is now implemented directly into Heroes! So there is no need to use a separate expansion file!
- Added a new scriptable skill type for passives! This skill will essentially call a MythicMob skill when for when the passive is applied and for when it is removed. Since there are more than two types, a new option has been added to the configurations. **Please regenerate your script-skills.yml to see the new format and update your skills accordingly**

Example of a passive skill;
```
- name: FieryPresence
on-apply-mythic-skill-id: FieryPresence-Apply
on-remove-mythic-skill-id: FieryPresence-Remove
type: PASSIVE
skill-types: BUFFING,ABILITY_PROPERTY_FIRE
```
It's recommended that these Apply and Remove mythic skills should essentially apply and remove an Aura from Mythic Mobs. As this allows you to configure onTick skills, onApply and onRemove even further.
`requires-target` has now uses the 'type' option. Where if requires-target was true then use the new skill type `TARGETED`, or else if false, use `ACTIVE`

## -- **Changes and Optimisations** --
  • - Mitigation can no longer be configured per class, simply due to exponential increase in calculations that was required to do this.
  • - The enchantment mitigation values in damages.yml are now ONLY considered
  • - Summoned mobs should now have improved AI behaviour
  • - Experience boosts are no longer applied for players which are 'opped'. This does mean that even if a player is opped AND has permission for experience boosts, then they will receive no personal exp boosts regardless.

### **Damage Handler Rewrite**
The damage handling of Heroes has been completely rewritten! This was a major issue with Heroes, since the previous DamageEvent listener had become a bundle of spaghetti code spanning 11 years of history. This was clearly causing MANY issues such as bugs and huge performance losses.
As such, the old code has been completely discarded, with new code and API written to handle the many complex facets of Heroes damage. For example now, certain checks such as let's say for custom mitigation, are now made at startup rather than every single time a damage event is called - since not all users use custom mitigation.
For reference; on 1.9.30, a profiler run over 15 minutes (with only 2 players mind you) saw a contribution of over 100ms of CPU time. A similar test on 1.10 saw that number drop to less than 5ms, in some cases the time taken was so small that it didn't even show up on the profiler. This is a massive improvement and a huge undertaking to comprehensively scan and understand the mess that was the old spaghetti code and make something new that is optimised and efficient.
Additionally, damage seems to be handled more consistently and accurate with this rewrite. But this is extremely comprehensive, please let us know if you encounter any bugs!

### **SkillConfigManager Rewrite**
The SkillConfigManager has been rewritten to now cache values read from a skill configuration. In addition to other rewrites mentioned in the API section of this update document, **you can now specify ANY increase-per-attribute or per-level for ANY numeric skill setting on ANY skill**. For example, you can specify `damage-per-dexterity` or `duration-increase-per-intellect` on any skill setting. For example let's take a look at Kick. Previously, you could only increase the damage per strength as shown;
```
Kick:
damage: 5
damage-increase-per-strength: 1
duration: 2500
```
But now you can configure something such as this, where you can use any attribute and even `per-level` to have skills dynamically scale with a Hero's attributes.
```
Kick:
damage: 5
damage-per-intellect: 0.5
duration: 2500
duration-increase-per-charisma: 500
```
This change both allows for more customisation and also improves efficiency, reducing plugin latency.

With this change, you can now change the SkillSetting priority based on class and preference. In config.yml you can find this section.
```
classes:
# When getting the setting for a skill, here you can specify the priority type. The valid types are 'default', 'highest', or 'primary'
skill-setting-priority: HIGHEST
```
The available settings are;
**DEFAULT** -> Returns the first available skill setting in order of Primary, Secondary, Race, Global, Skills.yml. For example, if both a Hero's secondary class and race class have the skill setting for damage. Regardless of which is higher. The value from secondary will always be returned.

**HIGHEST** -> Returns the highest value for a skill setting based on each of a Hero's classes. For example if a Hero has the 'damage' setting equal to 8 for their primary, and 12 for their race. Then the 12 value is used. That 12 value is used even if a higher value of lets say 24 is specified in the skills.yml. In this mode only if neither the primary, secondary, race class, nor the global skill set have the skill setting specified is the skills.yml value used.

**PRIMARY** -> Only checks a player's Primary, Global and Skills.yml for a Skill Setting. Similar to default in that it will prefer primary over global. Where if neither primary and global has the setting set, then it will use the value from skills.yml.

### **Monster Handling Rewrite**
Monster objects are now initialised just as a monster spawns, rather than only as required. This reduces the required load on whatever execution is requesting a monster object, since they are almost always loaded anyway.
Removed outdated use of storing custom attributes in a monster's entity. This was contributing to significant server latency and served no real purpose anymore, hence it has been removed.

## -- **Bug Fixes** --
- Fixed major oversight regarding how armour and other mitigation is handled. Previously, the assumption was made that vanilla mitigation was not applied after all our handling; however I was wrong. What this meant is that when wearing armour, particularly with enchantments. The mitigation Heroes applied would be applied IN ADDITION to vanilla mitigation. This is why protection enchants were always so strong when using Heroes. Now, Heroes automatically adjusts for it's custom mitigation, ensuring that damage is dealt correctly.
- Side-effect of the above, is that custom enchant mitigation is now ONLY applied when custom mitigation is enabled! Additionally, the values read in damages.yml for protection is read as decimals, for example 0.04 will mean 4% per enchant level || if custom mitigation is disabled, then vanilla enchant mitigation values are applied.

  • - Fixed issue where skills would not heal in combat
  • - Effects which apply a 'no sprint debuff' now should work correctly. SlowEffect in particular and casting will now prevent a player from both sprinting and juping.
  • - Fixed issue with SkillBaseSphere which threw an exception.
  • - Fixed issue with SkillBaseMarkedTeleport which caused particles to not appear correctly
  • - Fixed bug where some skills would not broadcast their message and instead would spew a warning in console.
  • - Armour toughness is now considered correctly.
  • - Fixed bug where armour could be equipped under circumstances when it shouldn't.
  • - Removed old code that caused default health to be set incorrectly.
  • - Fixed a significant number of other miscellaneous bugs and issues

## -- **API Changes** --
- MythicMobs now have their own CharacterTemplate subclass called MythicMonster. This way, Heroes WILL NOT override a Mythic Mob's stats regardless of any configured values. Additionally, if a MythicMob is using a casting skill, a Hero's interrupt now actually applies to a MythicMob as well.
- SkillSetting is now an abstract class which stores static objects. A new interface `Setting<T>` now represents a SkillSetting that returns a specific variable of it's type parameter.
- All methods relating to `SkillConfigManager.getUseSetting()` have been deprecated, in favour of the method `SkillConfigManager.getCachedUseSetting()` which considers the type parameter of the SkillSetting
- A number of methods in CharacterDamageManager has been updated, removed or deprecated. If you wish to get the amount of damage a Hero will deal, it is recommended to use `getMeleeDamage(Hero, Material)` or `getProjectileDamage(Hero, ProjectileType)`. Keep in mind these values do not consider PvX multipliers, nor do they include bonus enchantment damage.
- HDamageListener is now completely deprecated and no longer used, instead the DamageHandler class is the main handler of damage.

The nexus repository has been updated. Please note that the repository URL has been updated, but as per usual, you can use the Heroes API with the following artifact;
```
<repository>
<id>heroes-repo</id>
<url>https://nexus.hc.to/content/repositories/pub_snapshots/</url>
</repository>

<dependency>
<groupId>com.herocraftonline.heroes</groupId>
<artifactId>Heroes</artifactId>
<version>1.10-SNAPSHOT</version>
<scope>provided</scope>
</dependency>

```

## -- **Developer Notes** --
Due to many massive rewrites, if any custom skills are used, they **need** to be recompiled against `1.10-SNAPSHOT` otherwise they will not load. This is because we changed the SkillSetting enum class to an interface. This change was made for optimisations, cleaner code and the possibility to cache values.

There exists now a number of preset SkillSetting implementations such as SkillSettingInt, SkillSettingString, SkillSettingDouble and so on. You can even create your own SkillSetting which may read a configuration for example, and then return a custom object for your use in a skill.

SkillSettings such as `damage-increase-per-dexterity`, `duration-per-level` etc, are now deprecated. This is since SkillSettingInt and SkillSettingDouble automatically consider all attribute increases and per level increases on every skill setting as mentioned. Therefore these deprecated SkillSettings, will always return 0. Hence its no longer necessary to include them in code.

For example, it is no longer necessary to use code such as this;
```
double damage = SkillConfigManager.getUseSetting(hero, this, SkillSetting.DAMAGE, 50, false);
final double damageIncrease = SkillConfigManager.getUseSetting(hero, this, SkillSetting.DAMAGE_INCREASE_PER_STRENGTH, 1.0, false);
damage += damageIncrease * hero.getAttributeValue(AttributeType.STRENGTH);
```

Now, this is the only code necessary to achieve the same effect;
```
double damage = SkillConfigManager.getCachedUseSetting(hero, this, SkillSetting.DAMAGE, 50.0)
```

**Please do not hesitate to let us know if you have any issues with the new changes or require assistance with the API**
*This update has been tested extensively but due to the comprehensive rewrites it possible there may be some things that we missed.*

Thank you for supporting Heroes throughout all these years!
-== | UPDATE 1.9.30 - Hotfix 1 | ==-- Fixed a few bugs that were introduced with the previous version, please use this version!

-- Bug Fixes -- - Citizens NPC Hero's will now load correctly - Fixed a number of thrown exceptions caused by changing the way that the .getHero() method works - Finally and properly fixed the Heroes scoreboard. Party members names will no longer duplicate when they die, among fixing a few other things. Basically scoreboards are now run on a central timer, and any request to update them is run synchronously with each other, therefore preventing duplication issues. (There may be some performance improvements to this as well)

--== | **UPDATE 1.9.30** | ==--
There have been MANY major changes and NEW features added to this version. Please let us know if you encounter any issues with this new update.

-- **Supported Minecraft Versions** --
1.13.X, 1.14.X, 1.15.X, 1.16.X, 1.17.X, 1.18.X, 1.19.X

-- **More Version Support** --
A little while ago we updated Heroes to Java 16, which was actually unnecessary. We have now reverted Heroes to be compiled on Java 8, what this means is that once again ALL versions from 1.13 and onwards are now supported by Heroes! Due to the overwhelming amount of changes to Heroes as well it is **REQUIRED** that you redownload ANY and ALL skill packs as previous versions of skills may cause major errors. More details on skill updates below.

-- **Full Translation Support** --
Attention all, drum roll please - Heroes now has **FULL TRANSLATION SUPPORT**. Pretty much every single message in Heroes is now translatable via a file created by the plugin called `translations.yml`! The only exceptions is that some commands are not translatable, the majority of the most used ones are! We will be finishing off the rest of the commands in future updates to come! This was a major undertaking, with the translation file featuring literally over 400 messages which used to be hard coded into Heroes, so understandably there may be some small typos or errors - please let us know if you come across any!

When **configuring** the translations. There are few little tricks you can do to further customize Heroes;
- For many translations, mainly those which are sent to the player as a message, if you configure the translation such that `some-translation: ''` (such that it's empty), this will mean that the message simply will not be sent! This means for example for those of you which don't use races or don't use secondary classes, you can simply set those options to an empty string and then those messages won't be sent. For example, see the below translations which are used mainly for the /hero info command.

*Default*
```
commands:
player-summary: '{level} {primary}&r, {level} {secondary}&r, {race}'
class-summary: '&aClass {primary}$mastered-primary$ &7| &aProfession {secondary}$mastered-secondary$'
race-summary: '&aRace &7- {race}'
```

*Modified*
```
commands:
player-summary: '{level} {primary}&r'
class-summary: '&aClass {primary}$mastered-primary$ &7'
race-summary: ''
```
As such, removing the messages for races and secondary classes will mean the message is not sent to the player.

- Another thing you may have noticed is the use of {level}. The curly brackets will tell Heroes to look for another translation in the same section as where it is used. In the above examples, the `player-summary` is in the `commands` section, using {level} will look for a translation with the path commands.level and will automatically fill it with that value. By default, it will fill it with 'Lv. &6$lvl$'. Additionally you can specify a translation from another section just by doing {section.message} for example.

- In many of the translations, we use placeholder values such as $lvl$, $1, $2 etc. In some instances those values will be replaced with levels, a Hero's name or whatever else in relation to the specific translation. If you don't wish to use these values you don't have to, however you can't add your own placeholders (unless it's through Placeholder API) to these messages.

- As you'd expect we support using chat colours as well, any character of & will be interpreted as a chat color so keep that in mind.

- If you want things to be formatted correctly, it's recommended to try keep the spaces in translations as what is written if you want things to be displayed properly.

-- **Optimizations** --
For many years, Heroes has relied on an external library/plugin called EffectLib, it WAS necessary in the past that this plugin was installed for many of Heroes skills to work. However, we have now shaded the library into Heroes itself so you will no longer require to install that plugin separately! Additionally, EffectLib's EffectManager USED to be created pretty much every time a skill was cast, this meant unnecessary memory overhead and was just incredibly inefficient. As such, NOW, Heroes has one EffectManager of which ALL skills have been updated to use. **This is another reason why it is REQUIRED that you update all of your skills from the available skill packs**.

--- **Miscellaneous** --
- Fixed bug in MMOItemHandler
- Added option for damage scaling where mobs will only be scaled if the player is higher than their level.
- **ALL COMMANDS** in Heroes now should have automatic tab completions. This was done somewhat automagically so it can be a little buggy, remember, if you ever get confused about a hero command just type the command with a question mark after it.
- A player's Hero is no longer unloaded twice when they quit the server
- Added an option to attributes to allow an initial allocation point amount when the player is at level 1.
- Made the majority of log messages such as ("Class does not have pvp-item-multiplier set") and alike as debug messages ONLY. Therefore, simply enable debug mode if you wish to see these messages. This has made the Heroes boot sequence a lot cleaner
:)

- Enabling debug mode on config.yml will no longer mute normal log messages
- Added a mana and stamina condition to be injected with MythicMobs
- Mobs are now able to hit themselves (this was causing issues with plugins such as MythicMobs)
- If an equipped item is broken, then it's armour value will not be considered during custom mitigation.
- Update the list of what is considered a transparent block for versions 1.16-1.19
- The MythicMob item roll option now has an optional default role setting.
- Fixed a major bug where skills did not heal in combat.
- Fixed a potentially major issue causing an infinite loop regarding party members leaving.
- Combat enter and leave messages have been moved to translations.yml. This should be done automagically.

-- **Developer Updates** --
- When using Heroes.getCharacterManager().getHero(), this has been changed so that it will NO LONGER load a Hero if the Hero is not loaded. This was to prevent weird issues where a Hero was loaded even after they were offline. If you attempt to getHero() when they are not loaded then an exception will be thrown. To avoid this, basically do NOT call getHero() from a PlayerJoinEvent pretty much ever, always run a delayed task or find another way to accomplish whatever it is you wish to do.
- The Messaging class which has been deprecated for a while now has been removed. If you're using this, just don't. Use ChatComponents if you really need.
- When using a Hero object, using .getHeroClass(), .getSecondaryClass(), or .getRaceClass() will now NEVER be null. This is how it's always been, but for some reason these methods were marked as Nullable
- For skill developers, if you wish to use the shaded effect lib you can use the protected static final variable called 'effectLib', or you can get an instance of the plugin and call .getEffectLibManager(). Please NEVER dispose of this manager as it is used by all skills and is not disposed of.
- The latest public repository available is now 1.9.30-RELEASE. Maven example is below;
```
<repository>
<id>heroes-repo</id>
<url>https://nexus.hc.to/content/repositories/pub_releases/</url>
</repository>

<dependency>
<groupId>com.herocraftonline.heroes</groupId>
<artifactId>Heroes</artifactId>
<version>1.9.30-RELEASE</version>
<scope>provided</scope>
</dependency>
```


-- **The Future of Heroes** --
Our next major plan for Heroes, as we have mentioned is to essentially rewrite the entire damage handler. Over the many years of Heroes life, this damage handler has been an intertwined mess of spaghetti code. The problem, is that damage events are called constantly, multiple times a second, and therefore because this code is incredibly inefficient - this is most likely the main cause of any 'lag' generated by Heroes. My goal is to rewrite it from the ground up, refactoring it so that various checks are only made if those options are enabled for example. This will improve both the efficiency and hopefully will fix the magnitude of bugs generated by the spaghetti code damage handler. I'm currently aware of issues regarding enchantment damage and protection, where both values tend to not scale correctly at all. For example, right now - apparently damage over time effects such as bleed stack with sharpness. To fix issues such as these will require the full damage rewrite.
By improving the damage handler you should expect a significant performance improve across the board.
--== | **UPDATE 1.9.30** | ==--
There have been MANY major changes and NEW features added to this version. Please let us know if you encounter any issues with this new update.

-- **Supported Minecraft Versions** --
1.13.X, 1.14.X, 1.15.X, 1.16.X, 1.17.X, 1.18.X, 1.19.X

-- **More Version Support** --
A little while ago we updated Heroes to Java 16, which was actually unnecessary. We have now reverted Heroes to be compiled on Java 8, what this means is that once again ALL versions from 1.13 and onwards are now supported by Heroes! Due to the overwhelming amount of changes to Heroes as well it is **REQUIRED** that you redownload ANY and ALL skill packs as previous versions of skills may cause major errors. More details on skill updates below.

-- **Full Translation Support** --
Attention all, drum roll please - Heroes now has **FULL TRANSLATION SUPPORT**. Pretty much every single message in Heroes is now translatable via a file created by the plugin called `translations.yml`! The only exceptions is that some commands are not translatable, the majority of the most used ones are! We will be finishing off the rest of the commands in future updates to come! This was a major undertaking, with the translation file featuring literally over 400 messages which used to be hard coded into Heroes, so understandably there may be some small typos or errors - please let us know if you come across any!

When **configuring** the translations. There are few little tricks you can do to further customize Heroes;
- For many translations, mainly those which are sent to the player as a message, if you configure the translation such that `some-translation: ''` (such that it's empty), this will mean that the message simply will not be sent! This means for example for those of you which don't use races or don't use secondary classes, you can simply set those options to an empty string and then those messages won't be sent. For example, see the below translations which are used mainly for the /hero info command.

*Default*
```
commands:
player-summary: '{level} {primary}&r, {level} {secondary}&r, {race}'
class-summary: '&aClass {primary}$mastered-primary$ &7| &aProfession {secondary}$mastered-secondary$'
race-summary: '&aRace &7- {race}'
```

*Modified*
```
commands:
player-summary: '{level} {primary}&r'
class-summary: '&aClass {primary}$mastered-primary$ &7'
race-summary: ''
```
As such, removing the messages for races and secondary classes will mean the message is not sent to the player.

- Another thing you may have noticed is the use of {level}. The curly brackets will tell Heroes to look for another translation in the same section as where it is used. In the above examples, the `player-summary` is in the `commands` section, using {level} will look for a translation with the path commands.level and will automatically fill it with that value. By default, it will fill it with 'Lv. &6$lvl$'. Additionally you can specify a translation from another section just by doing {section.message} for example.

- In many of the translations, we use placeholder values such as $lvl$, $1, $2 etc. In some instances those values will be replaced with levels, a Hero's name or whatever else in relation to the specific translation. If you don't wish to use these values you don't have to, however you can't add your own placeholders (unless it's through Placeholder API) to these messages.

- As you'd expect we support using chat colours as well, any character of & will be interpreted as a chat color so keep that in mind.

- If you want things to be formatted correctly, it's recommended to try keep the spaces in translations as what is written if you want things to be displayed properly.

-- **Optimizations** --
For many years, Heroes has relied on an external library/plugin called EffectLib, it WAS necessary in the past that this plugin was installed for many of Heroes skills to work. However, we have now shaded the library into Heroes itself so you will no longer require to install that plugin separately! Additionally, EffectLib's EffectManager USED to be created pretty much every time a skill was cast, this meant unnecessary memory overhead and was just incredibly inefficient. As such, NOW, Heroes has one EffectManager of which ALL skills have been updated to use. **This is another reason why it is REQUIRED that you update all of your skills from the available skill packs**.

--- **Miscellaneous** --
- Fixed bug in MMOItemHandler
- Added option for damage scaling where mobs will only be scaled if the player is higher than their level.
- **ALL COMMANDS** in Heroes now should have automatic tab completions. This was done somewhat automagically so it can be a little buggy, remember, if you ever get confused about a hero command just type the command with a question mark after it.
- A player's Hero is no longer unloaded twice when they quit the server
- Added an option to attributes to allow an initial allocation point amount when the player is at level 1.
- Made the majority of log messages such as ("Class does not have pvp-item-multiplier set") and alike as debug messages ONLY. Therefore, simply enable debug mode if you wish to see these messages. This has made the Heroes boot sequence a lot cleaner
:)

- Enabling debug mode on config.yml will no longer mute normal log messages
- Added a mana and stamina condition to be injected with MythicMobs
- Mobs are now able to hit themselves (this was causing issues with plugins such as MythicMobs)
- If an equipped item is broken, then it's armour value will not be considered during custom mitigation.
- Update the list of what is considered a transparent block for versions 1.16-1.19
- The MythicMob item roll option now has an optional default role setting.
- Fixed a major bug where skills did not heal in combat.
- Fixed a potentially major issue causing an infinite loop regarding party members leaving.
- Combat enter and leave messages have been moved to translations.yml. This should be done automagically.

-- **Developer Updates** --
- When using Heroes.getCharacterManager().getHero(), this has been changed so that it will NO LONGER load a Hero if the Hero is not loaded. This was to prevent weird issues where a Hero was loaded even after they were offline. If you attempt to getHero() when they are not loaded then an exception will be thrown. To avoid this, basically do NOT call getHero() from a PlayerJoinEvent pretty much ever, always run a delayed task or find another way to accomplish whatever it is you wish to do.
- The Messaging class which has been deprecated for a while now has been removed. If you're using this, just don't. Use ChatComponents if you really need.
- When using a Hero object, using .getHeroClass(), .getSecondaryClass(), or .getRaceClass() will now NEVER be null. This is how it's always been, but for some reason these methods were marked as Nullable
- For skill developers, if you wish to use the shaded effect lib you can use the protected static final variable called 'effectLib', or you can get an instance of the plugin and call .getEffectLibManager(). Please NEVER dispose of this manager as it is used by all skills and is not disposed of.
- The latest public repository available is now 1.9.30-RELEASE. Maven example is below;
```
<repository>
<id>heroes-repo</id>
<url>https://nexus.hc.to/content/repositories/pub_releases/</url>
</repository>

<dependency>
<groupId>com.herocraftonline.heroes</groupId>
<artifactId>Heroes</artifactId>
<version>1.9.30-RELEASE</version>
<scope>provided</scope>
</dependency>
```


-- **The Future of Heroes** --
Our next major plan for Heroes, as we have mentioned is to essentially rewrite the entire damage handler. Over the many years of Heroes life, this damage handler has been an intertwined mess of spaghetti code. The problem, is that damage events are called constantly, multiple times a second, and therefore because this code is incredibly inefficient - this is most likely the main cause of any 'lag' generated by Heroes. My goal is to rewrite it from the ground up, refactoring it so that various checks are only made if those options are enabled for example. This will improve both the efficiency and hopefully will fix the magnitude of bugs generated by the spaghetti code damage handler. I'm currently aware of issues regarding enchantment damage and protection, where both values tend to not scale correctly at all. For example, right now - apparently damage over time effects such as bleed stack with sharpness. To fix issues such as these will require the full damage rewrite.
By improving the damage handler you should expect a significant performance improve across the board.
Please test before going into production, things should function!
  • Mind Blown (+1)
Reactions: heraklessamaa
Top Bottom