Merge remote-tracking branch 'origin/master'

This commit is contained in:
Momshroom 2024-05-21 02:05:22 -05:00
commit 5386817faf
267 changed files with 5745 additions and 4136 deletions

View File

@ -1,6 +1,112 @@
Version 2.2.007 Version 2.2.013
Fixed bug where Green Thumb did not replant if seed was in the off hand Modified the RNG for dropping non-ore blocks from Blast Mining to yield about 50% of what was destroyed
(API) Deprecated com.gmail.nossr50.mcMMO.getPlaceStore
(API) Added com.gmail.nossr50.mcMMO.getUserBlockTracker
(API) Added com.gmail.nossr50.mcMMO.getChunkManager
(API) Added new methods to com.gmail.nossr50.util.blockmeta.UserBlockTracker for easier readability
(API) Deprecated the old poorly named methods in UserBlockTracker
(Codebase) Cleaned up and organized unit tests relating to UserBlockTracker
NOTES:
Not planning to delete the deprecated methods in UserBlockTracker anytime soon, as nothing has really changed other than the names
Version 2.2.012
Fixed a bug where Daze would cause an exception in older game versions (1.20.4 and older)
Version 2.2.011
Fixed bug where some potions on older versions (1.20.4 and older) were not brewable (night vision extended, etc)
Improved logging for Alchemy potion look up (see notes)
NOTES:
Added detailed logging when multiple configured potions match an ItemStack.
This will help identify issues with potion configuration.
Version 2.2.010
Fixed being unable to load REGEN potion type on new versions of Paper/Spigot 1.20.6
Fixed some potions not gaining XP when brewed (Level 2 potions, etc)
BrewingStands will now remember who owns them, this persists across restarts (see notes)
Fixed rare NPE in mcMMO events when player data was unable to be retrieved
Fixed a NPE that could happen when damaging armor with Axes
Fixed a bug where Alchemy brewing would be cancelled if the player died
(API) Added getMcMMOPlayer() to McMMOPlayerSkillEvent
(API) Added new ctor McMMOPlayerSkillEvent(@NotNull McMMOPlayer mmoPlayer, @NotNull PrimarySkillType primarySkillType)
(API) Deprecated ctor McMMOPlayerSkillEvent(org.bukkit.entity.Player, com.gmail.nossr50.datatypes.skills.PrimarySkillType)
(API) Added ctor McMMOPlayerAbilityEvent(com.gmail.nossr50.datatypes.player.McMMOPlayer, com.gmail.nossr50.datatypes.skills.PrimarySkillType)
(API) Deprecated ctor McMMOPlayerAbilityEvent(org.bukkit.entity.Player, com.gmail.nossr50.datatypes.skills.PrimarySkillType)
(API) Deprecated ctor McMMOPlayerAbilityActivateEvent(org.bukkit.entity.Player, com.gmail.nossr50.datatypes.skills.PrimarySkillType)
(API) Added ctor McMMOPlayerAbilityActivateEvent(com.gmail.nossr50.datatypes.player.McMMOPlayer, com.gmail.nossr50.datatypes.skills.PrimarySkillType)
(API) Deprecated ctor McMMOPlayerCatalysisEvent(org.bukkit.entity.Player, double)
(API) Added ctor McMMOPlayerCatalysisEvent(com.gmail.nossr50.datatypes.player.McMMOPlayer, double)
(API) Deprecated util method EventUtils.callPlayerAbilityActivateEvent(org.bukkit.entity.Player, com.gmail.nossr50.datatypes.skills.PrimarySkillType)
(API) Added util method EventUtils.callPlayerAbilityActivateEvent(com.gmail.nossr50.datatypes.player.McMMOPlayer, com.gmail.nossr50.datatypes.skills.PrimarySkillType)
(API) Deprecated ctor McMMOPlayerFishingEvent(org.bukkit.entity.Player)
(API) Added ctor McMMOPlayerFishingEvent(com.gmail.nossr50.datatypes.player.McMMOPlayer)
(API) Deprecated ctor McMMOPlayerFishingTreasureEvent.McMMOPlayerFishingTreasureEvent(org.bukkit.entity.Player, org.bukkit.inventory.ItemStack, int)
(API) Added ctor McMMOPlayerFishingTreasureEvent.McMMOPlayerFishingTreasureEvent(com.gmail.nossr50.datatypes.player.McMMOPlayer, org.bukkit.inventory.ItemStack, int)
(API) Deprecated ctor McMMOPlayerMagicHunterEvent(org.bukkit.entity.Player, org.bukkit.inventory.ItemStack, int, java.util.Map<org.bukkit.enchantments.Enchantment,java.lang.Integer>)
(API) Added ctor McMMOPlayerMagicHunterEvent(com.gmail.nossr50.datatypes.player.McMMOPlayer, org.bukkit.inventory.ItemStack, int, java.util.Map<org.bukkit.enchantments.Enchantment,java.lang.Integer>)
(API) Deprecated ctor McMMOPlayerAbilityDeactivateEvent(org.bukkit.entity.Player, com.gmail.nossr50.datatypes.skills.PrimarySkillType)
(API) Added ctor McMMOPlayerAbilityDeactivateEvent(com.gmail.nossr50.datatypes.player.McMMOPlayer, com.gmail.nossr50.datatypes.skills.PrimarySkillType)
(API) Deprecated util method EventUtils.callAbilityDeactivateEvent(org.bukkit.entity.Player, com.gmail.nossr50.datatypes.skills.SuperAbilityType)
(API) Added util method EventUtils.callAbilityDeactivateEvent(com.gmail.nossr50.datatypes.player.McMMOPlayer, com.gmail.nossr50.datatypes.skills.SuperAbilityType)
(API) Deprecated util EventUtils.callSubSkillEvent(org.bukkit.entity.Player, com.gmail.nossr50.datatypes.skills.SubSkillType)
(API) Added util EventUtils.callSubSkillEvent(com.gmail.nossr50.datatypes.player.McMMOPlayer, com.gmail.nossr50.datatypes.skills.SubSkillType)
(API) Deprecated ctor SubSkillEvent(org.bukkit.entity.Player, com.gmail.nossr50.datatypes.skills.SubSkillType)
(API) Added ctor SubSkillEvent(com.gmail.nossr50.datatypes.player.McMMOPlayer, com.gmail.nossr50.datatypes.skills.SubSkillType)
(API) Deprecated ctor SubSkillEvent(org.bukkit.entity.Player, com.gmail.nossr50.datatypes.skills.SubSkillType, double)
(API) Added ctor SubSkillEvent(com.gmail.nossr50.datatypes.player.McMMOPlayer, com.gmail.nossr50.datatypes.skills.SubSkillType, double)
(API) Deprecated ctor SubSkillEvent(org.bukkit.entity.Player, com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill)
(API) Added ctor SubSkillEvent(com.gmail.nossr50.datatypes.player.McMMOPlayer, com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill)
(API) Deprecated ctor AlchemyBrewCheckTask(org.bukkit.entity.Player, org.bukkit.block.BrewingStand)
(API) Added ctor AlchemyBrewCheckTask(org.bukkit.block.BrewingStand)
NOTES:
You can now use hoppers and brewing stands and not have to worry about having to re-interact with the brewing stand over and over again
Ownership of a brewing stand is whoever last interacted with it, this persists across restarts
This is not an exhaustive list of API changes in this update, but most of the important ones should be documented here.
Version 2.2.009
Fixed a bug that prevented mcMMO from loading on MC versions older than 1.20.6
Dramatically increased the base XP for Alchemy again (see notes)
NOTES:
Alchemy leveling still felt too slow, so I've increased it again. You can either delete experience.yml to get the new values or adjust them manually.
If you haven't updated mcMMO since 2.2.006 or older you don't need to do anything to get these new values.
The new default values are...
Potion_Brewing:
Stage_1: 666
Stage_2: 1111
Stage_3: 1750
Stage_4: 2250
Version 2.2.008
Fixed alchemy potions not upgrading correctly (This will only affect new potions made, see notes)
Fixed a bug where alchemy potions had italicized names
Fixed a bug where messages were not being sent to the action bar in 1.20.6
(SQL) Fixed bug that broke /mccooldowns and /archery in some circumstances
Fixed some exceptions that could happen with parties disabled (thanks IAISI)
NOTES:
mcMMO-exclusive Potions (haste, etc) made on version 2.2.007 of mcMMO will not upgrade correctly, you'll just have to make new ones. Sorry for the inconvenience.
Alchemy potions will now be brewed as type "Mundane" behind the scenes, this used to be Uncraftable/Water. This led to some issues. So I've changed it to be Mundane.
Version 2.2.007
Compatibility with the 1.20.5 / 1.20.6 MC Update
Fixed bug where Alchemy was not brewing certain potions (haste, etc)
Tree Feller no longer restricts how many saplings can drop
Tree Feller now drops leaves 25% of the time (up from 10%)
Alchemy XP has been DRAMATICALLY increased, it was extremely grindy by default
Alchemy experience values in experience.yml are now found under 'Experience_Values.Alchemy.Potion_Brewing'
Fixed bug where the probability of success of Graceful Roll was not being calculated correctly
Fixed bug where Green Thumb did not replant if seed was in the off hand
Added armadillo to combat experience in experience.yml
NOTES:
While fixing various Alchemy bugs, I noticed Alchemy leveled SUPER slow, I have increased it dramatically. Feel free to change it back by modifying the new values in experience.yml
I did my best to keep mcMMO compatible with older versions of Minecraft for this update.
This update to MC was quite large, with breaking changes to a lot of code relating to Alchemy, and some other things.
I expect there to be bugs, please report them on GitHub or Discord, but preferably GitHub.
I will be working on fixing these bugs as they come in, so please be patient.
Version 2.2.006 Version 2.2.006
Added new config custom_item_support.yml Added new config custom_item_support.yml
Added support for hex color codes in the locale file, uses the format &#RRGGBB (see notes) Added support for hex color codes in the locale file, uses the format &#RRGGBB (see notes)

121
pom.xml
View File

@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.gmail.nossr50.mcMMO</groupId> <groupId>com.gmail.nossr50.mcMMO</groupId>
<artifactId>mcMMO</artifactId> <artifactId>mcMMO</artifactId>
<version>2.2.007-SNAPSHOT</version> <version>2.2.013-SNAPSHOT</version>
<name>mcMMO</name> <name>mcMMO</name>
<url>https://github.com/mcMMO-Dev/mcMMO</url> <url>https://github.com/mcMMO-Dev/mcMMO</url>
<scm> <scm>
@ -75,16 +75,17 @@
<plugins> <plugins>
<plugin> <plugin>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M7</version> <version>3.2.5</version>
<configuration> <configuration>
<junitArtifactName>org.junit.jupiter:junit-jupiter</junitArtifactName> <junitArtifactName>org.junit.jupiter:junit-jupiter</junitArtifactName>
<trimStackTrace>false</trimStackTrace> <trimStackTrace>false</trimStackTrace>
<excludedGroups>skip</excludedGroups>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
<artifactId>maven-failsafe-plugin</artifactId> <artifactId>maven-failsafe-plugin</artifactId>
<version>3.0.0-M7</version> <version>3.2.5</version>
<configuration> <configuration>
<junitArtifactName>org.junit.jupiter:junit-jupiter</junitArtifactName> <junitArtifactName>org.junit.jupiter:junit-jupiter</junitArtifactName>
@ -95,12 +96,12 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId> <artifactId>maven-release-plugin</artifactId>
<version>3.0.0-M6</version> <version>3.0.1</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version> <version>3.13.0</version>
<configuration> <configuration>
<release>17</release> <release>17</release>
<compilerArgs> <compilerArgs>
@ -112,6 +113,7 @@
</plugin> </plugin>
<plugin> <plugin>
<artifactId>maven-assembly-plugin</artifactId> <artifactId>maven-assembly-plugin</artifactId>
<version>3.7.1</version>
<configuration> <configuration>
<descriptors> <descriptors>
<descriptor>src/main/assembly/package.xml</descriptor> <descriptor>src/main/assembly/package.xml</descriptor>
@ -130,7 +132,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId> <artifactId>maven-shade-plugin</artifactId>
<version>3.3.0</version> <version>3.5.3</version>
<configuration> <configuration>
<artifactSet> <artifactSet>
<includes> <includes>
@ -140,23 +142,22 @@
<include>org.bstats:bstats-base</include> <include>org.bstats:bstats-base</include>
<include>org.bstats:bstats-bukkit</include> <include>org.bstats:bstats-bukkit</include>
<include>net.kyori:adventure-api</include> <include>net.kyori:adventure-api</include>
<include>net.kyori:adventure-text-serializer-gson</include>
<include>net.kyori:adventure-platform-bukkit</include>
<include>net.kyori:adventure-platform-api</include>
<include>net.kyori:adventure-platform-viaversion</include>
<include>net.kyori:adventure-platform-facet</include>
<include>net.kyori:adventure-nbt</include>
<include>net.kyori:adventure-key</include> <include>net.kyori:adventure-key</include>
<include>net.kyori:adventure-nbt</include>
<include>net.kyori:adventure-platform-api</include>
<include>net.kyori:adventure-platform-bukkit</include>
<include>net.kyori:adventure-platform-facet</include>
<include>net.kyori:adventure-platform-viaversion</include>
<include>net.kyori:adventure-text-serializer-bungeecord</include>
<include>net.kyori:adventure-text-serializer-gson</include>
<include>net.kyori:adventure-text-serializer-gson-legacy-impl</include>
<include>net.kyori:adventure-text-serializer-json</include>
<include>net.kyori:adventure-text-serializer-json-legacy-impl</include>
<include>net.kyori:adventure-text-serializer-legacy</include>
<include>net.kyori:examination-api</include> <include>net.kyori:examination-api</include>
<include>net.kyori:examination-string</include> <include>net.kyori:examination-string</include>
<include>net.kyori:adventure-text-serializer-legacy</include>
<include>net.kyori:adventure-text-serializer-gson</include>
<include>net.kyori:adventure-text-serializer-json</include>
<include>net.kyori:adventure-text-serializer-bungeecord</include>
<include>net.kyori:adventure-text-serializer-craftbukkit</include>
<include>net.kyori:adventure-text-serializer-gson-legacy-impl</include>
<include>net.kyori:adventure-text-serializer-json-legacy-impl</include>
<include>net.kyori:option</include> <include>net.kyori:option</include>
<include>net.kyori:adventure-text-serializer-craftbukkit</include>
<include>co.aikar:acf-bukkit</include> <include>co.aikar:acf-bukkit</include>
<include>com.tcoded:FoliaLib</include> <include>com.tcoded:FoliaLib</include>
</includes> </includes>
@ -222,6 +223,11 @@
</pluginRepositories> </pluginRepositories>
<repositories> <repositories>
<!-- Protocol Lib Repository -->
<repository>
<id>dmulloy2-repo</id>
<url>https://repo.dmulloy2.net/repository/public/</url>
</repository>
<repository> <repository>
<id>spigot-repo</id> <id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url> <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
@ -254,8 +260,11 @@
<id>devmart-other</id> <id>devmart-other</id>
<url>https://nexuslite.gcnt.net/repos/other/</url> <url>https://nexuslite.gcnt.net/repos/other/</url>
</repository> </repository>
<!-- ... --> <!-- MockBukkit -->
<!-- ... --> <repository>
<id>papermc</id>
<url>https://repo.papermc.io/repository/maven-public/</url>
</repository>
</repositories> </repositories>
<dependencies> <dependencies>
<!-- https://mvnrepository.com/artifact/com.h2database/h2 --> <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
@ -265,6 +274,12 @@
<version>3.25.3</version> <version>3.25.3</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>com.comphenix.protocol</groupId>
<artifactId>ProtocolLib</artifactId>
<version>LATEST</version>
<scope>compile</scope>
</dependency>
<dependency> <dependency>
<groupId>com.h2database</groupId> <groupId>com.h2database</groupId>
<artifactId>h2</artifactId> <artifactId>h2</artifactId>
@ -290,57 +305,57 @@
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-text-serializer-gson</artifactId> <artifactId>adventure-text-serializer-gson</artifactId>
<version>4.15.0</version> <version>4.17.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-text-serializer-gson-legacy-impl</artifactId> <artifactId>adventure-text-serializer-gson-legacy-impl</artifactId>
<version>4.15.0</version> <version>4.17.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-text-serializer-json</artifactId> <artifactId>adventure-text-serializer-json</artifactId>
<version>4.15.0</version> <version>4.17.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-text-serializer-json-legacy-impl</artifactId> <artifactId>adventure-text-serializer-json-legacy-impl</artifactId>
<version>4.15.0</version> <version>4.17.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-api</artifactId> <artifactId>adventure-api</artifactId>
<version>4.15.0</version> <version>4.17.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-nbt</artifactId> <artifactId>adventure-nbt</artifactId>
<version>4.15.0</version> <version>4.17.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-key</artifactId> <artifactId>adventure-key</artifactId>
<version>4.15.0</version> <version>4.17.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-platform-api</artifactId> <artifactId>adventure-platform-api</artifactId>
<version>4.3.2</version> <version>4.3.3-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-platform-bukkit</artifactId> <artifactId>adventure-platform-bukkit</artifactId>
<version>4.3.2</version> <version>LATEST</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-platform-facet</artifactId> <artifactId>adventure-platform-facet</artifactId>
<version>4.3.2</version> <version>4.3.3-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-platform-viaversion</artifactId> <artifactId>adventure-platform-viaversion</artifactId>
<version>4.3.2</version> <version>4.3.3-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
@ -350,18 +365,18 @@
<dependency> <dependency>
<groupId>org.apache.maven.scm</groupId> <groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-gitexe</artifactId> <artifactId>maven-scm-provider-gitexe</artifactId>
<version>2.0.0-M1</version> <version>2.1.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.bstats</groupId> <groupId>org.bstats</groupId>
<artifactId>bstats-bukkit</artifactId> <artifactId>bstats-bukkit</artifactId>
<version>3.0.0</version> <version>3.0.2</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId> <artifactId>spigot-api</artifactId>
<version>1.20.4-R0.1-SNAPSHOT</version> <version>1.20.6-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
@ -397,36 +412,36 @@
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId> <artifactId>junit-jupiter</artifactId>
<version>5.9.0</version> <version>5.11.0-M2</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.mockito</groupId> <groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId> <artifactId>mockito-core</artifactId>
<version>4.6.1</version> <version>5.12.0</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.mockito</groupId> <groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId> <artifactId>mockito-inline</artifactId>
<version>4.6.1</version> <version>5.2.0</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.tomcat</groupId> <groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId> <artifactId>tomcat-jdbc</artifactId>
<version>10.1.0-M17</version> <version>10.1.24</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.jetbrains</groupId> <groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId> <artifactId>annotations</artifactId>
<version>23.0.0</version> <version>24.1.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.google.guava</groupId> <groupId>com.google.guava</groupId>
<artifactId>guava</artifactId> <artifactId>guava</artifactId>
<version>32.1.1-jre</version> <!-- At this time Spigot is including 29.0 Guava classes that we are using --> <version>33.2.0-jre</version> <!-- At this time Spigot is including 29.0 Guava classes that we are using -->
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
@ -435,5 +450,29 @@
<version>0.3.1</version> <version>0.3.1</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<!-- <dependency>-->
<!-- <groupId>org.apache.logging.log4j</groupId>-->
<!-- <artifactId>log4j-core</artifactId>-->
<!-- <version>2.22.1</version> &lt;!&ndash; Make sure this version matches the other log4j dependencies &ndash;&gt;-->
<!-- <scope>test</scope>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.logging.log4j</groupId>-->
<!-- <artifactId>log4j-api</artifactId>-->
<!-- <version>2.22.1</version>-->
<!-- <scope>test</scope>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.logging.log4j</groupId>-->
<!-- <artifactId>log4j-slf4j-impl</artifactId>-->
<!-- <version>2.22.1</version>-->
<!-- <scope>test</scope>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.github.seeseemelk</groupId>-->
<!-- <artifactId>MockBukkit-v1.19</artifactId>-->
<!-- <version>LATEST</version>-->
<!-- <scope>test</scope>-->
<!-- </dependency>-->
</dependencies> </dependencies>
</project> </project>

View File

@ -1143,14 +1143,10 @@ public final class ExperienceAPI {
* @param blockStates the blocks to reward XP for * @param blockStates the blocks to reward XP for
* @param mcMMOPlayer the target player * @param mcMMOPlayer the target player
*/ */
public static void addXpFromBlocks(ArrayList<BlockState> blockStates, McMMOPlayer mcMMOPlayer) public static void addXpFromBlocks(ArrayList<BlockState> blockStates, McMMOPlayer mcMMOPlayer) {
{ for(BlockState bs : blockStates) {
for(BlockState bs : blockStates) for(PrimarySkillType skillType : PrimarySkillType.values()) {
{ if (ExperienceConfig.getInstance().getXp(skillType, bs.getType()) > 0) {
for(PrimarySkillType skillType : PrimarySkillType.values())
{
if(ExperienceConfig.getInstance().getXp(skillType, bs.getType()) > 0)
{
mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, bs.getType()), XPGainReason.PVE, XPGainSource.SELF); mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, bs.getType()), XPGainReason.PVE, XPGainSource.SELF);
} }
} }
@ -1163,12 +1159,9 @@ public final class ExperienceAPI {
* @param mcMMOPlayer the target player * @param mcMMOPlayer the target player
* @param skillType target primary skill * @param skillType target primary skill
*/ */
public static void addXpFromBlocksBySkill(ArrayList<BlockState> blockStates, McMMOPlayer mcMMOPlayer, PrimarySkillType skillType) public static void addXpFromBlocksBySkill(ArrayList<BlockState> blockStates, McMMOPlayer mcMMOPlayer, PrimarySkillType skillType) {
{ for(BlockState bs : blockStates) {
for(BlockState bs : blockStates) if (ExperienceConfig.getInstance().getXp(skillType, bs.getType()) > 0) {
{
if(ExperienceConfig.getInstance().getXp(skillType, bs.getType()) > 0)
{
mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, bs.getType()), XPGainReason.PVE, XPGainSource.SELF); mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, bs.getType()), XPGainReason.PVE, XPGainSource.SELF);
} }
} }
@ -1179,12 +1172,9 @@ public final class ExperienceAPI {
* @param blockState The target blockstate * @param blockState The target blockstate
* @param mcMMOPlayer The target player * @param mcMMOPlayer The target player
*/ */
public static void addXpFromBlock(BlockState blockState, McMMOPlayer mcMMOPlayer) public static void addXpFromBlock(BlockState blockState, McMMOPlayer mcMMOPlayer) {
{ for(PrimarySkillType skillType : PrimarySkillType.values()) {
for(PrimarySkillType skillType : PrimarySkillType.values()) if (ExperienceConfig.getInstance().getXp(skillType, blockState.getType()) > 0) {
{
if(ExperienceConfig.getInstance().getXp(skillType, blockState.getType()) > 0)
{
mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, blockState.getType()), XPGainReason.PVE, XPGainSource.SELF); mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, blockState.getType()), XPGainReason.PVE, XPGainSource.SELF);
} }
} }
@ -1196,10 +1186,8 @@ public final class ExperienceAPI {
* @param mcMMOPlayer The target player * @param mcMMOPlayer The target player
* @param skillType target primary skill * @param skillType target primary skill
*/ */
public static void addXpFromBlockBySkill(BlockState blockState, McMMOPlayer mcMMOPlayer, PrimarySkillType skillType) public static void addXpFromBlockBySkill(BlockState blockState, McMMOPlayer mcMMOPlayer, PrimarySkillType skillType) {
{ if (ExperienceConfig.getInstance().getXp(skillType, blockState.getType()) > 0) {
if(ExperienceConfig.getInstance().getXp(skillType, blockState.getType()) > 0)
{
mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, blockState.getType()), XPGainReason.PVE, XPGainSource.SELF); mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, blockState.getType()), XPGainReason.PVE, XPGainSource.SELF);
} }
} }

View File

@ -109,8 +109,7 @@ public final class PartyAPI {
if (party == null) { if (party == null) {
party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName); party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName);
} else { } else {
if(mcMMO.p.getPartyManager().isPartyFull(player, party)) if (mcMMO.p.getPartyManager().isPartyFull(player, party)) {
{
NotificationManager.sendPlayerInformation(player, NotificationType.PARTY_MESSAGE, "Commands.Party.PartyFull", party.toString()); NotificationManager.sendPlayerInformation(player, NotificationType.PARTY_MESSAGE, "Commands.Party.PartyFull", party.toString());
return; return;
} }
@ -124,8 +123,7 @@ public final class PartyAPI {
* 0 or less for no size limit * 0 or less for no size limit
* @return the max party size on this server * @return the max party size on this server
*/ */
public static int getMaxPartySize() public static int getMaxPartySize() {
{
return mcMMO.p.getGeneralConfig().getPartyMaxSize(); return mcMMO.p.getGeneralConfig().getPartyMaxSize();
} }

View File

@ -200,14 +200,11 @@ public class McImportCommand implements CommandExecutor {
String skillName = "UNIDENTIFIED"; String skillName = "UNIDENTIFIED";
if (materialName.contains("ORE")) { if (materialName.contains("ORE")) {
skillName = "Mining"; skillName = "Mining";
} } else if (materialName.contains("LOG") || materialName.contains("LEAVES")) {
else if (materialName.contains("LOG") || materialName.contains("LEAVES")) {
skillName = "Woodcutting"; skillName = "Woodcutting";
} } else if (materialName.contains("GRASS") || materialName.contains("SHORT_GRASS") || materialName.contains("FLOWER") || materialName.contains("CROP")) {
else if (materialName.contains("GRASS") || materialName.contains("SHORT_GRASS") || materialName.contains("FLOWER") || materialName.contains("CROP")) {
skillName = "Herbalism"; skillName = "Herbalism";
} } else if (materialName.contains("DIRT") || materialName.contains("SAND")) {
else if (materialName.contains("DIRT") || materialName.contains("SAND")) {
skillName = "Excavation"; skillName = "Excavation";
} }
@ -222,8 +219,7 @@ public class McImportCommand implements CommandExecutor {
if (skillName.equals("Mining")) { if (skillName.equals("Mining")) {
skillContents.add(" " + " " + "Smelting_XP_Gain: 9"); skillContents.add(" " + " " + "Smelting_XP_Gain: 9");
} } else if (skillName.equals("Woodcutting")) {
else if (skillName.equals("Woodcutting")) {
skillContents.add(" " + " " + "Is_Log: " + materialName.contains("LOG")); skillContents.add(" " + " " + "Is_Log: " + materialName.contains("LOG"));
} }
} }
@ -239,20 +235,15 @@ public class McImportCommand implements CommandExecutor {
String toolType = "UNIDENTIFIED"; String toolType = "UNIDENTIFIED";
if (materialName.contains("PICKAXE")) { if (materialName.contains("PICKAXE")) {
toolType = "Pickaxes"; toolType = "Pickaxes";
} } else if (materialName.contains("AXE")) {
else if (materialName.contains("AXE")) {
toolType = "Axes"; toolType = "Axes";
} } else if (materialName.contains("BOW")) {
else if (materialName.contains("BOW")) {
toolType = "Bows"; toolType = "Bows";
} } else if (materialName.contains("HOE")) {
else if (materialName.contains("HOE")) {
toolType = "Hoes"; toolType = "Hoes";
} } else if (materialName.contains("SHOVEL") || materialName.contains("SPADE")) {
else if (materialName.contains("SHOVEL") || materialName.contains("SPADE")) {
toolType = "Shovels"; toolType = "Shovels";
} } else if (materialName.contains("SWORD")) {
else if (materialName.contains("SWORD")) {
toolType = "Swords"; toolType = "Swords";
} }
@ -279,14 +270,11 @@ public class McImportCommand implements CommandExecutor {
String toolType = "UNIDENTIFIED"; String toolType = "UNIDENTIFIED";
if (materialName.contains("BOOT") || materialName.contains("SHOE")) { if (materialName.contains("BOOT") || materialName.contains("SHOE")) {
toolType = "Boots"; toolType = "Boots";
} } else if (materialName.contains("CHESTPLATE") || materialName.contains("CHEST")) {
else if (materialName.contains("CHESTPLATE") || materialName.contains("CHEST")) {
toolType = "Chestplates"; toolType = "Chestplates";
} } else if (materialName.contains("HELM") || materialName.contains("HAT")) {
else if (materialName.contains("HELM") || materialName.contains("HAT")) {
toolType = "Helmets"; toolType = "Helmets";
} } else if (materialName.contains("LEGGINGS") || materialName.contains("LEGS") || materialName.contains("PANTS")) {
else if (materialName.contains("LEGGINGS") || materialName.contains("LEGS") || materialName.contains("PANTS")) {
toolType = "Leggings"; toolType = "Leggings";
} }

View File

@ -37,16 +37,14 @@ public class XprateCommand implements TabExecutor {
if (mcMMO.p.isXPEventEnabled()) { if (mcMMO.p.isXPEventEnabled()) {
if(mcMMO.p.getAdvancedConfig().useTitlesForXPEvent()) if (mcMMO.p.getAdvancedConfig().useTitlesForXPEvent()) {
{
NotificationManager.broadcastTitle(mcMMO.p.getServer(), NotificationManager.broadcastTitle(mcMMO.p.getServer(),
LocaleLoader.getString("Commands.Event.Stop"), LocaleLoader.getString("Commands.Event.Stop"),
LocaleLoader.getString("Commands.Event.Stop.Subtitle"), LocaleLoader.getString("Commands.Event.Stop.Subtitle"),
10, 10*20, 20); 10, 10*20, 20);
} }
if(mcMMO.p.getGeneralConfig().broadcastEventMessages()) if (mcMMO.p.getGeneralConfig().broadcastEventMessages()) {
{
mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.Stop")); mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.Stop"));
mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.Stop.Subtitle")); mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.Stop.Subtitle"));
} }
@ -72,34 +70,29 @@ public class XprateCommand implements TabExecutor {
if (CommandUtils.shouldDisableToggle(args[1])) { if (CommandUtils.shouldDisableToggle(args[1])) {
mcMMO.p.setXPEventEnabled(false); mcMMO.p.setXPEventEnabled(false);
} } else if (CommandUtils.shouldEnableToggle(args[1])) {
else if (CommandUtils.shouldEnableToggle(args[1])) {
mcMMO.p.setXPEventEnabled(true); mcMMO.p.setXPEventEnabled(true);
} } else {
else {
return false; return false;
} }
int newXpRate = Integer.parseInt(args[0]); int newXpRate = Integer.parseInt(args[0]);
if(newXpRate < 0) if (newXpRate < 0) {
{
sender.sendMessage(ChatColor.RED+LocaleLoader.getString("Commands.NegativeNumberWarn")); sender.sendMessage(ChatColor.RED+LocaleLoader.getString("Commands.NegativeNumberWarn"));
return true; return true;
} }
ExperienceConfig.getInstance().setExperienceGainsGlobalMultiplier(newXpRate); ExperienceConfig.getInstance().setExperienceGainsGlobalMultiplier(newXpRate);
if(mcMMO.p.getAdvancedConfig().useTitlesForXPEvent()) if (mcMMO.p.getAdvancedConfig().useTitlesForXPEvent()) {
{
NotificationManager.broadcastTitle(mcMMO.p.getServer(), NotificationManager.broadcastTitle(mcMMO.p.getServer(),
LocaleLoader.getString("Commands.Event.Start"), LocaleLoader.getString("Commands.Event.Start"),
LocaleLoader.getString("Commands.Event.XP", newXpRate), LocaleLoader.getString("Commands.Event.XP", newXpRate),
10, 10*20, 20); 10, 10*20, 20);
} }
if(mcMMO.p.getGeneralConfig().broadcastEventMessages()) if (mcMMO.p.getGeneralConfig().broadcastEventMessages()) {
{
mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.Start")); mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.Start"));
mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.XP", newXpRate)); mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.XP", newXpRate));
} }

View File

@ -30,8 +30,7 @@ public class AddxpCommand extends ExperienceCommand {
return; return;
UserManager.getPlayer(player).applyXpGain(skill, value, XPGainReason.COMMAND, XPGainSource.COMMAND); UserManager.getPlayer(player).applyXpGain(skill, value, XPGainReason.COMMAND, XPGainSource.COMMAND);
} } else {
else {
profile.addXp(skill, value); profile.addXp(skill, value);
profile.scheduleAsyncSave(); profile.scheduleAsyncSave();
} }

View File

@ -49,15 +49,13 @@ public abstract class ExperienceCommand implements TabExecutor {
skill = null; skill = null;
} }
if (skill != null && SkillTools.isChildSkill(skill)) if (skill != null && SkillTools.isChildSkill(skill)) {
{
sender.sendMessage(LocaleLoader.getString("Commands.Skill.ChildSkill")); sender.sendMessage(LocaleLoader.getString("Commands.Skill.ChildSkill"));
return true; return true;
} }
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(sender.getName()) == null) if (UserManager.getPlayer(sender.getName()) == null) {
{
sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return true; return true;
} }
@ -82,8 +80,7 @@ public abstract class ExperienceCommand implements TabExecutor {
skill = null; skill = null;
} }
if (skill != null && SkillTools.isChildSkill(skill)) if (skill != null && SkillTools.isChildSkill(skill)) {
{
sender.sendMessage(LocaleLoader.getString("Commands.Skill.ChildSkill")); sender.sendMessage(LocaleLoader.getString("Commands.Skill.ChildSkill"));
return true; return true;
} }
@ -110,8 +107,7 @@ public abstract class ExperienceCommand implements TabExecutor {
} }
editValues(null, profile, skill, value, isSilent(args)); editValues(null, profile, skill, value, isSilent(args));
} } else {
else {
editValues(mcMMOPlayer.getPlayer(), mcMMOPlayer.getProfile(), skill, value, isSilent(args)); editValues(mcMMOPlayer.getPlayer(), mcMMOPlayer.getProfile(), skill, value, isSilent(args));
} }
@ -159,8 +155,7 @@ public abstract class ExperienceCommand implements TabExecutor {
protected static void handleSenderMessage(CommandSender sender, String playerName, PrimarySkillType skill) { protected static void handleSenderMessage(CommandSender sender, String playerName, PrimarySkillType skill) {
if (skill == null) { if (skill == null) {
sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.2", playerName)); sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.2", playerName));
} } else {
else {
sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", mcMMO.p.getSkillTools().getLocalizedSkillName(skill), playerName)); sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", mcMMO.p.getSkillTools().getLocalizedSkillName(skill), playerName));
} }
} }
@ -174,8 +169,7 @@ public abstract class ExperienceCommand implements TabExecutor {
if (player != null) { if (player != null) {
handlePlayerMessageAll(player, value, isSilent); handlePlayerMessageAll(player, value, isSilent);
} }
} } else {
else {
handleCommand(player, profile, skill, value); handleCommand(player, profile, skill, value);
if (player != null) { if (player != null) {

View File

@ -48,8 +48,7 @@ public class SkillresetCommand implements TabExecutor {
if (args[0].equalsIgnoreCase("all")) { if (args[0].equalsIgnoreCase("all")) {
skill = null; skill = null;
} } else {
else {
skill = mcMMO.p.getSkillTools().matchSkill(args[0]); skill = mcMMO.p.getSkillTools().matchSkill(args[0]);
} }
@ -68,8 +67,7 @@ public class SkillresetCommand implements TabExecutor {
if (args[1].equalsIgnoreCase("all")) { if (args[1].equalsIgnoreCase("all")) {
skill = null; skill = null;
} } else {
else {
skill = mcMMO.p.getSkillTools().matchSkill(args[1]); skill = mcMMO.p.getSkillTools().matchSkill(args[1]);
} }
@ -93,8 +91,7 @@ public class SkillresetCommand implements TabExecutor {
} }
editValues(null, profile, skill); editValues(null, profile, skill);
} } else {
else {
editValues(mcMMOPlayer.getPlayer(), mcMMOPlayer.getProfile(), skill); editValues(mcMMOPlayer.getPlayer(), mcMMOPlayer.getProfile(), skill);
} }
@ -156,8 +153,7 @@ public class SkillresetCommand implements TabExecutor {
protected static void handleSenderMessage(CommandSender sender, String playerName, PrimarySkillType skill) { protected static void handleSenderMessage(CommandSender sender, String playerName, PrimarySkillType skill) {
if (skill == null) { if (skill == null) {
sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.2", playerName)); sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.2", playerName));
} } else {
else {
sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", mcMMO.p.getSkillTools().getLocalizedSkillName(skill), playerName)); sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", mcMMO.p.getSkillTools().getLocalizedSkillName(skill), playerName));
} }
} }
@ -171,8 +167,7 @@ public class SkillresetCommand implements TabExecutor {
if (player != null) { if (player != null) {
handlePlayerMessageAll(player); handlePlayerMessageAll(player);
} }
} } else {
else {
handleCommand(player, profile, skill); handleCommand(player, profile, skill);
if (player != null) { if (player != null) {

View File

@ -12,8 +12,7 @@ import org.jetbrains.annotations.NotNull;
public class PartyChangePasswordCommand implements CommandExecutor { public class PartyChangePasswordCommand implements CommandExecutor {
@Override @Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if(UserManager.getPlayer((Player) sender) == null) if (UserManager.getPlayer((Player) sender) == null) {
{
sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return true; return true;
} }

View File

@ -90,8 +90,7 @@ public class PartyCommand implements TabExecutor {
} }
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
if(mcMMOPlayer == null) if (mcMMOPlayer == null) {
{
player.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); player.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return true; return true;
} }
@ -207,8 +206,7 @@ public class PartyCommand implements TabExecutor {
final McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); final McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
//Not Loaded //Not Loaded
if(mcMMOPlayer == null) if (mcMMOPlayer == null) {
{
sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return ImmutableList.of(); return ImmutableList.of();
} }

View File

@ -19,8 +19,7 @@ public class PartyCreateCommand implements CommandExecutor {
Player player = (Player) sender; Player player = (Player) sender;
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
player.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); player.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return true; return true;
} }

View File

@ -23,8 +23,7 @@ public class PartyInfoCommand implements CommandExecutor {
switch (args.length) { switch (args.length) {
case 0: case 0:
case 1: case 1:
if(UserManager.getPlayer((Player) sender) == null) if (UserManager.getPlayer((Player) sender) == null) {
{
sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return true; return true;
} }
@ -70,8 +69,7 @@ public class PartyInfoCommand implements CommandExecutor {
if (isUnlockedFeature(party, partyFeature)) { if (isUnlockedFeature(party, partyFeature)) {
unlockedPartyFeatures.add(partyFeature.getLocaleString()); unlockedPartyFeatures.add(partyFeature.getLocaleString());
} } else {
else {
lockedPartyFeatures.add(partyFeature.getFeatureLockedLocaleString()); lockedPartyFeatures.add(partyFeature.getFeatureLockedLocaleString());
} }
} }

View File

@ -20,8 +20,7 @@ import java.util.Locale;
public class PartyItemShareCommand implements CommandExecutor { public class PartyItemShareCommand implements CommandExecutor {
@Override @Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if(UserManager.getPlayer((Player) sender) == null) if (UserManager.getPlayer((Player) sender) == null) {
{
sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return true; return true;
} }
@ -50,11 +49,9 @@ public class PartyItemShareCommand implements CommandExecutor {
if (CommandUtils.shouldEnableToggle(args[2])) { if (CommandUtils.shouldEnableToggle(args[2])) {
toggle = true; toggle = true;
} } else if (CommandUtils.shouldDisableToggle(args[2])) {
else if (CommandUtils.shouldDisableToggle(args[2])) {
toggle = false; toggle = false;
} } else {
else {
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "itemshare", "<loot | mining | herbalism | woodcutting | misc> <true | false>")); sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "itemshare", "<loot | mining | herbalism | woodcutting | misc> <true | false>"));
return true; return true;
} }

View File

@ -34,8 +34,7 @@ public class PartyJoinCommand implements CommandExecutor {
Player player = (Player) sender; Player player = (Player) sender;
if(UserManager.getPlayer((Player) sender) == null) if (UserManager.getPlayer((Player) sender) == null) {
{
sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return true; return true;
} }
@ -62,8 +61,7 @@ public class PartyJoinCommand implements CommandExecutor {
return true; return true;
} }
if(mcMMO.p.getPartyManager().isPartyFull(player, targetParty)) if (mcMMO.p.getPartyManager().isPartyFull(player, targetParty)) {
{
player.sendMessage(LocaleLoader.getString("Commands.Party.PartyFull", targetParty.toString())); player.sendMessage(LocaleLoader.getString("Commands.Party.PartyFull", targetParty.toString()));
return true; return true;
} }

View File

@ -18,8 +18,7 @@ public class PartyLockCommand implements CommandExecutor {
case 1: case 1:
if (args[0].equalsIgnoreCase("lock")) { if (args[0].equalsIgnoreCase("lock")) {
togglePartyLock(sender, true); togglePartyLock(sender, true);
} } else if (args[0].equalsIgnoreCase("unlock")) {
else if (args[0].equalsIgnoreCase("unlock")) {
togglePartyLock(sender, false); togglePartyLock(sender, false);
} }
@ -33,11 +32,9 @@ public class PartyLockCommand implements CommandExecutor {
if (CommandUtils.shouldEnableToggle(args[1])) { if (CommandUtils.shouldEnableToggle(args[1])) {
togglePartyLock(sender, true); togglePartyLock(sender, true);
} } else if (CommandUtils.shouldDisableToggle(args[1])) {
else if (CommandUtils.shouldDisableToggle(args[1])) {
togglePartyLock(sender, false); togglePartyLock(sender, false);
} } else {
else {
sendUsageStrings(sender); sendUsageStrings(sender);
} }
@ -55,8 +52,7 @@ public class PartyLockCommand implements CommandExecutor {
} }
private void togglePartyLock(CommandSender sender, boolean lock) { private void togglePartyLock(CommandSender sender, boolean lock) {
if(UserManager.getPlayer((Player) sender) == null) if (UserManager.getPlayer((Player) sender) == null) {
{
sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return; return;
} }

View File

@ -30,20 +30,15 @@ public enum PartySubcommandType {
if (commandName.equalsIgnoreCase("?")) { if (commandName.equalsIgnoreCase("?")) {
return HELP; return HELP;
} } else if (commandName.equalsIgnoreCase("q") || commandName.equalsIgnoreCase("leave")) {
else if (commandName.equalsIgnoreCase("q") || commandName.equalsIgnoreCase("leave")) {
return QUIT; return QUIT;
} } else if (commandName.equalsIgnoreCase("leader")) {
else if (commandName.equalsIgnoreCase("leader")) {
return OWNER; return OWNER;
} } else if (commandName.equalsIgnoreCase("xpshare") || commandName.equalsIgnoreCase("shareexp") || commandName.equalsIgnoreCase("sharexp")) {
else if (commandName.equalsIgnoreCase("xpshare") || commandName.equalsIgnoreCase("shareexp") || commandName.equalsIgnoreCase("sharexp")) {
return XPSHARE; return XPSHARE;
} } else if (commandName.equalsIgnoreCase("shareitem") || commandName.equalsIgnoreCase("shareitems")) {
else if (commandName.equalsIgnoreCase("shareitem") || commandName.equalsIgnoreCase("shareitems")) {
return ITEMSHARE; return ITEMSHARE;
} } else if (commandName.equalsIgnoreCase("ally")) {
else if (commandName.equalsIgnoreCase("ally")) {
return ALLIANCE; return ALLIANCE;
} }

View File

@ -17,8 +17,7 @@ import org.jetbrains.annotations.NotNull;
public class PartyXpShareCommand implements CommandExecutor { public class PartyXpShareCommand implements CommandExecutor {
@Override @Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if(UserManager.getPlayer((Player) sender) == null) if (UserManager.getPlayer((Player) sender) == null) {
{
sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return true; return true;
} }

View File

@ -37,8 +37,7 @@ public class PartyAllianceCommand implements TabExecutor {
return true; return true;
} }
if(UserManager.getPlayer((Player) sender) == null) if (UserManager.getPlayer((Player) sender) == null) {
{
sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return true; return true;
} }

View File

@ -21,8 +21,7 @@ public class PtpAcceptAnyCommand implements CommandExecutor {
if (ptpRecord.isConfirmRequired()) { if (ptpRecord.isConfirmRequired()) {
sender.sendMessage(LocaleLoader.getString("Commands.ptp.AcceptAny.Disabled")); sender.sendMessage(LocaleLoader.getString("Commands.ptp.AcceptAny.Disabled"));
} } else {
else {
sender.sendMessage(LocaleLoader.getString("Commands.ptp.AcceptAny.Enabled")); sender.sendMessage(LocaleLoader.getString("Commands.ptp.AcceptAny.Enabled"));
} }

View File

@ -21,8 +21,7 @@ public class PtpAcceptCommand implements CommandExecutor {
return true; return true;
} }
if(UserManager.getPlayer((Player) sender) == null) if (UserManager.getPlayer((Player) sender) == null) {
{
sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return true; return true;
} }
@ -56,8 +55,7 @@ public class PtpAcceptCommand implements CommandExecutor {
if (!Permissions.partyTeleportWorld(target, targetWorld)) { if (!Permissions.partyTeleportWorld(target, targetWorld)) {
target.sendMessage(LocaleLoader.getString("Commands.ptp.NoWorldPermissions", targetWorld.getName())); target.sendMessage(LocaleLoader.getString("Commands.ptp.NoWorldPermissions", targetWorld.getName()));
return true; return true;
} } else if (targetWorld != playerWorld && !Permissions.partyTeleportWorld(target, playerWorld)) {
else if (targetWorld != playerWorld && !Permissions.partyTeleportWorld(target, playerWorld)) {
target.sendMessage(LocaleLoader.getString("Commands.ptp.NoWorldPermissions", playerWorld.getName())); target.sendMessage(LocaleLoader.getString("Commands.ptp.NoWorldPermissions", playerWorld.getName()));
return true; return true;
} }

View File

@ -45,8 +45,7 @@ public class PtpCommand implements TabExecutor {
Player player = (Player) sender; Player player = (Player) sender;
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return true; return true;
} }
@ -59,8 +58,7 @@ public class PtpCommand implements TabExecutor {
return true; return true;
} }
if(UserManager.getPlayer((Player) sender) == null) if (UserManager.getPlayer((Player) sender) == null) {
{
sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return true; return true;
} }
@ -171,8 +169,7 @@ public class PtpCommand implements TabExecutor {
if (!Permissions.partyTeleportWorld(target, targetWorld)) { if (!Permissions.partyTeleportWorld(target, targetWorld)) {
player.sendMessage(LocaleLoader.getString("Commands.ptp.NoWorldPermissions", targetWorld.getName())); player.sendMessage(LocaleLoader.getString("Commands.ptp.NoWorldPermissions", targetWorld.getName()));
return; return;
} } else if (targetWorld != playerWorld && !Permissions.partyTeleportWorld(player, targetWorld)) {
else if (targetWorld != playerWorld && !Permissions.partyTeleportWorld(player, targetWorld)) {
player.sendMessage(LocaleLoader.getString("Commands.ptp.NoWorldPermissions", targetWorld.getName())); player.sendMessage(LocaleLoader.getString("Commands.ptp.NoWorldPermissions", targetWorld.getName()));
return; return;
} }
@ -228,14 +225,12 @@ public class PtpCommand implements TabExecutor {
} }
protected static void handleTeleportWarmup(Player teleportingPlayer, Player targetPlayer) { protected static void handleTeleportWarmup(Player teleportingPlayer, Player targetPlayer) {
if(UserManager.getPlayer(targetPlayer) == null) if (UserManager.getPlayer(targetPlayer) == null) {
{
targetPlayer.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); targetPlayer.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return; return;
} }
if(UserManager.getPlayer(teleportingPlayer) == null) if (UserManager.getPlayer(teleportingPlayer) == null) {
{
teleportingPlayer.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); teleportingPlayer.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return; return;
} }
@ -250,8 +245,7 @@ public class PtpCommand implements TabExecutor {
if (warmup > 0) { if (warmup > 0) {
teleportingPlayer.sendMessage(LocaleLoader.getString("Teleport.Commencing", warmup)); teleportingPlayer.sendMessage(LocaleLoader.getString("Teleport.Commencing", warmup));
mcMMO.p.getFoliaLib().getImpl().runAtEntityLater(teleportingPlayer, new TeleportationWarmup(mcMMOPlayer, mcMMOTarget), 20 * warmup); mcMMO.p.getFoliaLib().getImpl().runAtEntityLater(teleportingPlayer, new TeleportationWarmup(mcMMOPlayer, mcMMOTarget), 20 * warmup);
} } else {
else {
EventUtils.handlePartyTeleportEvent(teleportingPlayer, targetPlayer); EventUtils.handlePartyTeleportEvent(teleportingPlayer, targetPlayer);
} }
} }

View File

@ -21,8 +21,7 @@ public class PtpToggleCommand implements CommandExecutor {
if (ptpRecord.isEnabled()) { if (ptpRecord.isEnabled()) {
sender.sendMessage(LocaleLoader.getString("Commands.ptp.Disabled")); sender.sendMessage(LocaleLoader.getString("Commands.ptp.Disabled"));
} } else {
else {
sender.sendMessage(LocaleLoader.getString("Commands.ptp.Enabled")); sender.sendMessage(LocaleLoader.getString("Commands.ptp.Enabled"));
} }

View File

@ -3,7 +3,7 @@ package com.gmail.nossr50.commands.player;
import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.runnables.commands.McrankCommandAsyncTask; import com.gmail.nossr50.runnables.commands.McRankCommandAsyncTask;
import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.MetadataConstants;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.commands.CommandUtils;
@ -85,8 +85,7 @@ public class McrankCommand implements TabExecutor {
if (sender instanceof Player) { if (sender instanceof Player) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(sender.getName()); McMMOPlayer mcMMOPlayer = UserManager.getPlayer(sender.getName());
if(mcMMOPlayer == null) if (mcMMOPlayer == null) {
{
sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return; return;
} }
@ -111,7 +110,7 @@ public class McrankCommand implements TabExecutor {
boolean useBoard = mcMMO.p.getGeneralConfig().getScoreboardsEnabled() && (sender instanceof Player) && (mcMMO.p.getGeneralConfig().getRankUseBoard()); boolean useBoard = mcMMO.p.getGeneralConfig().getScoreboardsEnabled() && (sender instanceof Player) && (mcMMO.p.getGeneralConfig().getRankUseBoard());
boolean useChat = !useBoard || mcMMO.p.getGeneralConfig().getRankUseChat(); boolean useChat = !useBoard || mcMMO.p.getGeneralConfig().getRankUseChat();
mcMMO.p.getFoliaLib().getImpl().runAsync(new McrankCommandAsyncTask(playerName, sender, useBoard, useChat)); mcMMO.p.getFoliaLib().getImpl().runAsync(new McRankCommandAsyncTask(playerName, sender, useBoard, useChat));
} }
private long getCDSeconds(McMMOPlayer mcMMOPlayer, long cooldownMillis) { private long getCDSeconds(McMMOPlayer mcMMOPlayer, long cooldownMillis) {

View File

@ -4,7 +4,7 @@ import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.runnables.commands.MctopCommandAsyncTask; import com.gmail.nossr50.runnables.commands.McTopCommandAsyncTask;
import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.MetadataConstants;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.commands.CommandUtils;
@ -115,7 +115,7 @@ public class MctopCommand implements TabExecutor {
boolean useBoard = (sender instanceof Player) && (mcMMO.p.getGeneralConfig().getTopUseBoard()); boolean useBoard = (sender instanceof Player) && (mcMMO.p.getGeneralConfig().getTopUseBoard());
boolean useChat = !useBoard || mcMMO.p.getGeneralConfig().getTopUseChat(); boolean useChat = !useBoard || mcMMO.p.getGeneralConfig().getTopUseChat();
mcMMO.p.getFoliaLib().getImpl().runAsync(new MctopCommandAsyncTask(page, skill, sender, useBoard, useChat)); mcMMO.p.getFoliaLib().getImpl().runAsync(new McTopCommandAsyncTask(page, skill, sender, useBoard, useChat));
} }
private PrimarySkillType extractSkill(CommandSender sender, String skillName) { private PrimarySkillType extractSkill(CommandSender sender, String skillName) {

View File

@ -29,7 +29,7 @@ public class AcrobaticsCommand extends SkillCommand {
protected void dataCalculations(Player player, float skillValue) { protected void dataCalculations(Player player, float skillValue) {
// ACROBATICS_DODGE // ACROBATICS_DODGE
if (canDodge) { if (canDodge) {
String[] dodgeStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.ACROBATICS_DODGE); final String[] dodgeStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.ACROBATICS_DODGE);
dodgeChance = dodgeStrings[0]; dodgeChance = dodgeStrings[0];
dodgeChanceLucky = dodgeStrings[1]; dodgeChanceLucky = dodgeStrings[1];
} }
@ -54,9 +54,8 @@ public class AcrobaticsCommand extends SkillCommand {
AbstractSubSkill abstractSubSkill = InteractionManager.getAbstractByName("Roll"); AbstractSubSkill abstractSubSkill = InteractionManager.getAbstractByName("Roll");
if(abstractSubSkill != null) if (abstractSubSkill != null) {
{ String[] rollStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.ACROBATICS_ROLL);
String[] rollStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.ACROBATICS_ROLL);
messages.add(getStatMessage(SubSkillType.ACROBATICS_ROLL, rollStrings[0]) messages.add(getStatMessage(SubSkillType.ACROBATICS_ROLL, rollStrings[0])
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", rollStrings[1]) : "")); + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", rollStrings[1]) : ""));

View File

@ -5,7 +5,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.alchemy.AlchemyManager; import com.gmail.nossr50.skills.alchemy.AlchemyManager;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
import com.gmail.nossr50.util.text.TextComponentFactory; import com.gmail.nossr50.util.text.TextComponentFactory;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -30,14 +29,7 @@ public class AlchemyCommand extends SkillCommand {
} }
protected String[] calculateAbilityDisplayValues(Player player) { protected String[] calculateAbilityDisplayValues(Player player) {
//TODO: Needed? AlchemyManager alchemyManager = mmoPlayer.getAlchemyManager();
if(UserManager.getPlayer(player) == null)
{
player.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return new String[] {"DATA NOT LOADED", "DATA NOT LOADED"};
}
AlchemyManager alchemyManager = UserManager.getPlayer(player).getAlchemyManager();
String[] displayValues = new String[2]; String[] displayValues = new String[2];
boolean isLucky = Permissions.lucky(player, PrimarySkillType.ALCHEMY); boolean isLucky = Permissions.lucky(player, PrimarySkillType.ALCHEMY);
@ -59,7 +51,7 @@ public class AlchemyCommand extends SkillCommand {
// ALCHEMY_CONCOCTIONS // ALCHEMY_CONCOCTIONS
if (canConcoctions) { if (canConcoctions) {
AlchemyManager alchemyManager = UserManager.getPlayer(player).getAlchemyManager(); AlchemyManager alchemyManager = mmoPlayer.getAlchemyManager();
tier = alchemyManager.getTier(); tier = alchemyManager.getTier();
ingredientCount = alchemyManager.getIngredients().size(); ingredientCount = alchemyManager.getIngredients().size();
ingredientList = alchemyManager.getIngredientList(); ingredientList = alchemyManager.getIngredientList();

View File

@ -33,14 +33,14 @@ public class ArcheryCommand extends SkillCommand {
protected void dataCalculations(Player player, float skillValue) { protected void dataCalculations(Player player, float skillValue) {
// ARCHERY_ARROW_RETRIEVAL // ARCHERY_ARROW_RETRIEVAL
if (canRetrieve) { if (canRetrieve) {
String[] retrieveStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.ARCHERY_ARROW_RETRIEVAL); String[] retrieveStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.ARCHERY_ARROW_RETRIEVAL);
retrieveChance = retrieveStrings[0]; retrieveChance = retrieveStrings[0];
retrieveChanceLucky = retrieveStrings[1]; retrieveChanceLucky = retrieveStrings[1];
} }
// ARCHERY_DAZE // ARCHERY_DAZE
if (canDaze) { if (canDaze) {
String[] dazeStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.ARCHERY_DAZE); String[] dazeStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.ARCHERY_DAZE);
dazeChance = dazeStrings[0]; dazeChance = dazeStrings[0];
dazeChanceLucky = dazeStrings[1]; dazeChanceLucky = dazeStrings[1];
} }

View File

@ -5,7 +5,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.axes.Axes; import com.gmail.nossr50.skills.axes.Axes;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.random.ProbabilityUtil; import com.gmail.nossr50.util.random.ProbabilityUtil;
import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.CombatUtils;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
@ -38,7 +37,7 @@ public class AxesCommand extends SkillCommand {
protected void dataCalculations(Player player, float skillValue) { protected void dataCalculations(Player player, float skillValue) {
// ARMOR IMPACT // ARMOR IMPACT
if (canImpact) { if (canImpact) {
impactDamage = UserManager.getPlayer(player).getAxesManager().getImpactDurabilityDamage(); impactDamage = mmoPlayer.getAxesManager().getImpactDurabilityDamage();
} }
// AXE MASTERY // AXE MASTERY
@ -48,7 +47,7 @@ public class AxesCommand extends SkillCommand {
// CRITICAL HIT // CRITICAL HIT
if (canCritical) { if (canCritical) {
String[] criticalHitStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.AXES_CRITICAL_STRIKES); String[] criticalHitStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.AXES_CRITICAL_STRIKES);
critChance = criticalHitStrings[0]; critChance = criticalHitStrings[0];
critChanceLucky = criticalHitStrings[1]; critChanceLucky = criticalHitStrings[1];
} }

View File

@ -1,9 +1,7 @@
package com.gmail.nossr50.commands.skills; package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.CombatUtils;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
import com.gmail.nossr50.util.text.TextComponentFactory; import com.gmail.nossr50.util.text.TextComponentFactory;
@ -42,7 +40,6 @@ public class CrossbowsCommand extends SkillCommand {
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<>(); List<String> messages = new ArrayList<>();
McMMOPlayer mmoPlayer = UserManager.getPlayer(player);
if (mmoPlayer == null) { if (mmoPlayer == null) {
return messages; return messages;
} }

View File

@ -5,7 +5,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.excavation.ExcavationManager; import com.gmail.nossr50.skills.excavation.ExcavationManager;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
import com.gmail.nossr50.util.text.TextComponentFactory; import com.gmail.nossr50.util.text.TextComponentFactory;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -45,7 +44,7 @@ public class ExcavationCommand extends SkillCommand {
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<>(); List<String> messages = new ArrayList<>();
ExcavationManager excavationManager = UserManager.getPlayer(player).getExcavationManager(); ExcavationManager excavationManager = mmoPlayer.getExcavationManager();
if (canGigaDrill) { if (canGigaDrill) {
messages.add(getStatMessage(SubSkillType.EXCAVATION_GIGA_DRILL_BREAKER, gigaDrillBreakerLength) messages.add(getStatMessage(SubSkillType.EXCAVATION_GIGA_DRILL_BREAKER, gigaDrillBreakerLength)

View File

@ -8,7 +8,6 @@ import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.skills.fishing.FishingManager; import com.gmail.nossr50.skills.fishing.FishingManager;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.random.Probability; import com.gmail.nossr50.util.random.Probability;
import com.gmail.nossr50.util.random.ProbabilityUtil; import com.gmail.nossr50.util.random.ProbabilityUtil;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
@ -50,7 +49,7 @@ public class FishingCommand extends SkillCommand {
@Override @Override
protected void dataCalculations(Player player, float skillValue) { protected void dataCalculations(Player player, float skillValue) {
FishingManager fishingManager = UserManager.getPlayer(player).getFishingManager(); FishingManager fishingManager = mmoPlayer.getFishingManager();
// TREASURE HUNTER // TREASURE HUNTER
if (canTreasureHunt) { if (canTreasureHunt) {

View File

@ -49,13 +49,13 @@ public class HerbalismCommand extends SkillCommand {
// DOUBLE DROPS // DOUBLE DROPS
if (canDoubleDrop) { if (canDoubleDrop) {
String[] doubleDropStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.HERBALISM_DOUBLE_DROPS); String[] doubleDropStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.HERBALISM_DOUBLE_DROPS);
doubleDropChance = doubleDropStrings[0]; doubleDropChance = doubleDropStrings[0];
doubleDropChanceLucky = doubleDropStrings[1]; doubleDropChanceLucky = doubleDropStrings[1];
} }
if (canTripleDrop) { if (canTripleDrop) {
String[] tripleDropStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.HERBALISM_VERDANT_BOUNTY); String[] tripleDropStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.HERBALISM_VERDANT_BOUNTY);
tripleDropChance = tripleDropStrings[0]; tripleDropChance = tripleDropStrings[0];
tripleDropChanceLucky = tripleDropStrings[1]; tripleDropChanceLucky = tripleDropStrings[1];
} }
@ -76,21 +76,21 @@ public class HerbalismCommand extends SkillCommand {
if (canGreenThumbBlocks || canGreenThumbPlants) { if (canGreenThumbBlocks || canGreenThumbPlants) {
greenThumbStage = RankUtils.getRank(player, SubSkillType.HERBALISM_GREEN_THUMB); greenThumbStage = RankUtils.getRank(player, SubSkillType.HERBALISM_GREEN_THUMB);
String[] greenThumbStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.HERBALISM_GREEN_THUMB); String[] greenThumbStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.HERBALISM_GREEN_THUMB);
greenThumbChance = greenThumbStrings[0]; greenThumbChance = greenThumbStrings[0];
greenThumbChanceLucky = greenThumbStrings[1]; greenThumbChanceLucky = greenThumbStrings[1];
} }
// HYLIAN LUCK // HYLIAN LUCK
if (hasHylianLuck) { if (hasHylianLuck) {
String[] hylianLuckStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.HERBALISM_HYLIAN_LUCK); String[] hylianLuckStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.HERBALISM_HYLIAN_LUCK);
hylianLuckChance = hylianLuckStrings[0]; hylianLuckChance = hylianLuckStrings[0];
hylianLuckChanceLucky = hylianLuckStrings[1]; hylianLuckChanceLucky = hylianLuckStrings[1];
} }
// SHROOM THUMB // SHROOM THUMB
if (canShroomThumb) { if (canShroomThumb) {
String[] shroomThumbStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.HERBALISM_SHROOM_THUMB); String[] shroomThumbStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.HERBALISM_SHROOM_THUMB);
shroomThumbChance = shroomThumbStrings[0]; shroomThumbChance = shroomThumbStrings[0];
shroomThumbChanceLucky = shroomThumbStrings[1]; shroomThumbChanceLucky = shroomThumbStrings[1];
} }

View File

@ -0,0 +1,52 @@
//package com.gmail.nossr50.commands.skills;
//
//import com.gmail.nossr50.datatypes.player.McMMOPlayer;
//import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
//import com.gmail.nossr50.util.player.UserManager;
//import com.gmail.nossr50.util.skills.CombatUtils;
//import com.gmail.nossr50.util.skills.SkillUtils;
//import com.gmail.nossr50.util.text.TextComponentFactory;
//import net.kyori.adventure.text.Component;
//import org.bukkit.ChatColor;
//import org.bukkit.entity.Player;
//
//import java.util.ArrayList;
//import java.util.List;
//
//import static com.gmail.nossr50.datatypes.skills.SubSkillType.MACES_MACES_LIMIT_BREAK;
//
//public class MacesCommand extends SkillCommand {
//
// public MacesCommand() {
// super(PrimarySkillType.MACES);
// }
//
// @Override
// protected void dataCalculations(Player player, float skillValue) {}
//
// @Override
// protected void permissionsCheck(Player player) {}
//
// @Override
// protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
// List<String> messages = new ArrayList<>();
//
// if (SkillUtils.canUseSubskill(player, MACES_MACES_LIMIT_BREAK)) {
// messages.add(getStatMessage(MACES_MACES_LIMIT_BREAK,
// String.valueOf(CombatUtils.getLimitBreakDamageAgainstQuality(player, MACES_MACES_LIMIT_BREAK, 1000))));
// }
//
// messages.add(ChatColor.GRAY + "The Maces skill is a work in progress and is still being developed," +
// " feedback would be appreciated in the mcMMO discord server.");
// return messages;
// }
//
// @Override
// protected List<Component> getTextComponents(Player player) {
// List<Component> textComponents = new ArrayList<>();
//
// TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.MACES);
//
// return textComponents;
// }
//}

View File

@ -5,7 +5,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.mining.MiningManager; import com.gmail.nossr50.skills.mining.MiningManager;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.random.ProbabilityUtil; import com.gmail.nossr50.util.random.ProbabilityUtil;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
import com.gmail.nossr50.util.text.TextComponentFactory; import com.gmail.nossr50.util.text.TextComponentFactory;
@ -45,7 +44,7 @@ public class MiningCommand extends SkillCommand {
protected void dataCalculations(Player player, float skillValue) { protected void dataCalculations(Player player, float skillValue) {
// BLAST MINING // BLAST MINING
if (canBlast || canDemoExpert || canBiggerBombs) { if (canBlast || canDemoExpert || canBiggerBombs) {
MiningManager miningManager = UserManager.getPlayer(player).getMiningManager(); MiningManager miningManager = mmoPlayer.getMiningManager();
blastMiningRank = miningManager.getBlastMiningTier(); blastMiningRank = miningManager.getBlastMiningTier();
bonusTNTDrops = miningManager.getDropMultiplier(); bonusTNTDrops = miningManager.getDropMultiplier();
@ -57,14 +56,14 @@ public class MiningCommand extends SkillCommand {
// Mastery TRIPLE DROPS // Mastery TRIPLE DROPS
if (canTripleDrop) { if (canTripleDrop) {
String[] masteryTripleDropStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.MINING_MOTHER_LODE); String[] masteryTripleDropStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.MINING_MOTHER_LODE);
tripleDropChance = masteryTripleDropStrings[0]; tripleDropChance = masteryTripleDropStrings[0];
tripleDropChanceLucky = masteryTripleDropStrings[1]; tripleDropChanceLucky = masteryTripleDropStrings[1];
} }
// DOUBLE DROPS // DOUBLE DROPS
if (canDoubleDrop) { if (canDoubleDrop) {
String[] doubleDropStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.MINING_DOUBLE_DROPS); String[] doubleDropStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.MINING_DOUBLE_DROPS);
doubleDropChance = doubleDropStrings[0]; doubleDropChance = doubleDropStrings[0];
doubleDropChanceLucky = doubleDropStrings[1]; doubleDropChanceLucky = doubleDropStrings[1];
} }

View File

@ -26,15 +26,12 @@ public class MmoInfoCommand implements TabExecutor {
/* /*
* Only allow players to use this command * Only allow players to use this command
*/ */
if(commandSender instanceof Player player) if (commandSender instanceof Player player) {
{
if (args == null || args.length < 1 || args[0] == null || args[0].isEmpty()) if (args == null || args.length < 1 || args[0] == null || args[0].isEmpty())
return false; return false;
if(Permissions.mmoinfo(player)) if (Permissions.mmoinfo(player)) {
{ if (args[0].equalsIgnoreCase( "???")) {
if(args[0].equalsIgnoreCase( "???"))
{
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.Header")); player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.Header"));
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.SubSkillHeader", "???")); player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.SubSkillHeader", "???"));
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.DetailsHeader")); player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.DetailsHeader"));
@ -57,8 +54,7 @@ public class MmoInfoCommand implements TabExecutor {
} }
public SubSkillType matchSubSkill(String name) { public SubSkillType matchSubSkill(String name) {
for(SubSkillType subSkillType : SubSkillType.values()) for(SubSkillType subSkillType : SubSkillType.values()) {
{
if (subSkillType.getNiceNameNoSpaces(subSkillType).equalsIgnoreCase(name) if (subSkillType.getNiceNameNoSpaces(subSkillType).equalsIgnoreCase(name)
|| subSkillType.name().equalsIgnoreCase(name)) || subSkillType.name().equalsIgnoreCase(name))
return subSkillType; return subSkillType;
@ -74,8 +70,7 @@ public class MmoInfoCommand implements TabExecutor {
return ImmutableList.of(); return ImmutableList.of();
} }
private void displayInfo(Player player, SubSkillType subSkillType) private void displayInfo(Player player, SubSkillType subSkillType) {
{
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.Header")); player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.Header"));
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.SubSkillHeader", subSkillType.getLocaleName())); player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.SubSkillHeader", subSkillType.getLocaleName()));
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.DetailsHeader")); player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.DetailsHeader"));

View File

@ -10,7 +10,6 @@ import com.gmail.nossr50.skills.repair.Repair;
import com.gmail.nossr50.skills.repair.RepairManager; import com.gmail.nossr50.skills.repair.RepairManager;
import com.gmail.nossr50.skills.repair.repairables.Repairable; import com.gmail.nossr50.skills.repair.repairables.Repairable;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.random.ProbabilityUtil; import com.gmail.nossr50.util.random.ProbabilityUtil;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
import com.gmail.nossr50.util.text.TextComponentFactory; import com.gmail.nossr50.util.text.TextComponentFactory;
@ -68,7 +67,7 @@ public class RepairCommand extends SkillCommand {
// SUPER REPAIR // SUPER REPAIR
if (canSuperRepair) { if (canSuperRepair) {
String[] superRepairStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.REPAIR_SUPER_REPAIR); String[] superRepairStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.REPAIR_SUPER_REPAIR);
superRepairChance = superRepairStrings[0]; superRepairChance = superRepairStrings[0];
superRepairChanceLucky = superRepairStrings[1]; superRepairChanceLucky = superRepairStrings[1];
} }
@ -94,7 +93,7 @@ public class RepairCommand extends SkillCommand {
List<String> messages = new ArrayList<>(); List<String> messages = new ArrayList<>();
if (canArcaneForge) { if (canArcaneForge) {
RepairManager repairManager = UserManager.getPlayer(player).getRepairManager(); RepairManager repairManager = mmoPlayer.getRepairManager();
messages.add(getStatMessage(false, true, messages.add(getStatMessage(false, true,
SubSkillType.REPAIR_ARCANE_FORGING, SubSkillType.REPAIR_ARCANE_FORGING,

View File

@ -6,7 +6,6 @@ import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.salvage.Salvage; import com.gmail.nossr50.skills.salvage.Salvage;
import com.gmail.nossr50.skills.salvage.SalvageManager; import com.gmail.nossr50.skills.salvage.SalvageManager;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
import com.gmail.nossr50.util.text.TextComponentFactory; import com.gmail.nossr50.util.text.TextComponentFactory;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -38,7 +37,7 @@ public class SalvageCommand extends SkillCommand {
@Override @Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<>(); List<String> messages = new ArrayList<>();
SalvageManager salvageManager = UserManager.getPlayer(player).getSalvageManager(); SalvageManager salvageManager = mmoPlayer.getSalvageManager();
if (canScrapCollector) { if (canScrapCollector) {
messages.add(getStatMessage(false, true, messages.add(getStatMessage(false, true,

View File

@ -34,6 +34,7 @@ public abstract class SkillCommand implements TabExecutor {
protected DecimalFormat percent = new DecimalFormat("##0.00%"); protected DecimalFormat percent = new DecimalFormat("##0.00%");
protected DecimalFormat decimal = new DecimalFormat("##0.00"); protected DecimalFormat decimal = new DecimalFormat("##0.00");
protected McMMOPlayer mmoPlayer;
private final CommandExecutor skillGuideCommand; private final CommandExecutor skillGuideCommand;
@ -53,9 +54,9 @@ public abstract class SkillCommand implements TabExecutor {
} }
Player player = (Player) sender; Player player = (Player) sender;
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); mmoPlayer = UserManager.getPlayer(player);
if (mcMMOPlayer == null) { if (mmoPlayer == null) {
sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
return true; return true;
} }
@ -63,7 +64,7 @@ public abstract class SkillCommand implements TabExecutor {
if (args.length == 0) { if (args.length == 0) {
boolean isLucky = Permissions.lucky(player, skill); boolean isLucky = Permissions.lucky(player, skill);
boolean hasEndurance = PerksUtils.handleActivationPerks(player, 0, 0) != 0; boolean hasEndurance = PerksUtils.handleActivationPerks(player, 0, 0) != 0;
float skillValue = mcMMOPlayer.getSkillLevel(skill); float skillValue = mmoPlayer.getSkillLevel(skill);
//Send the players a few blank lines to make finding the top of the skill command easier //Send the players a few blank lines to make finding the top of the skill command easier
if (mcMMO.p.getAdvancedConfig().doesSkillCommandSendBlankLines()) if (mcMMO.p.getAdvancedConfig().doesSkillCommandSendBlankLines())
@ -75,7 +76,7 @@ public abstract class SkillCommand implements TabExecutor {
dataCalculations(player, skillValue); dataCalculations(player, skillValue);
sendSkillCommandHeader(mcMMO.p.getSkillTools().getLocalizedSkillName(skill), sendSkillCommandHeader(mcMMO.p.getSkillTools().getLocalizedSkillName(skill),
player, mcMMOPlayer, (int) skillValue); player, mmoPlayer, (int) skillValue);
//Make JSON text components //Make JSON text components
List<Component> subskillTextComponents = getTextComponents(player); List<Component> subskillTextComponents = getTextComponents(player);
@ -87,8 +88,7 @@ public abstract class SkillCommand implements TabExecutor {
TextComponentFactory.sendPlayerSubSkillList(player, subskillTextComponents); TextComponentFactory.sendPlayerSubSkillList(player, subskillTextComponents);
/*for(TextComponent tc : subskillTextComponents) /*for(TextComponent tc : subskillTextComponents) {
{
player.spigot().sendMessage(new TextComponent[]{tc, new TextComponent(": TESTING")}); player.spigot().sendMessage(new TextComponent[]{tc, new TextComponent(": TESTING")});
}*/ }*/
@ -148,8 +148,7 @@ public abstract class SkillCommand implements TabExecutor {
// send header // send header
player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", skillName)); player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", skillName));
if(!SkillTools.isChildSkill(skill)) if (!SkillTools.isChildSkill(skill)) {
{
/* /*
* NON-CHILD SKILLS * NON-CHILD SKILLS
*/ */
@ -174,10 +173,8 @@ public abstract class SkillCommand implements TabExecutor {
StringBuilder parentMessage = new StringBuilder(); StringBuilder parentMessage = new StringBuilder();
for(int i = 0; i < parentList.size(); i++) for(int i = 0; i < parentList.size(); i++) {
{ if (i+1 < parentList.size()) {
if(i+1 < parentList.size())
{
parentMessage.append(LocaleLoader.getString("Effects.Child.ParentList", mcMMO.p.getSkillTools().getLocalizedSkillName(parentList.get(i)), mcMMOPlayer.getSkillLevel(parentList.get(i)))); parentMessage.append(LocaleLoader.getString("Effects.Child.ParentList", mcMMO.p.getSkillTools().getLocalizedSkillName(parentList.get(i)), mcMMOPlayer.getSkillLevel(parentList.get(i))));
parentMessage.append(ChatColor.GRAY).append(", "); parentMessage.append(ChatColor.GRAY).append(", ");
} else { } else {
@ -236,11 +233,9 @@ public abstract class SkillCommand implements TabExecutor {
int length; int length;
if(abilityLengthCap <= 0) if (abilityLengthCap <= 0) {
{
length = 2 + (int) (skillValue / abilityLengthVar); length = 2 + (int) (skillValue / abilityLengthVar);
} } else {
else {
length = 2 + (int) (Math.min(abilityLengthCap, skillValue) / abilityLengthVar); length = 2 + (int) (Math.min(abilityLengthCap, skillValue) / abilityLengthVar);
} }
@ -253,20 +248,17 @@ public abstract class SkillCommand implements TabExecutor {
return new String[] { String.valueOf(length), String.valueOf(enduranceLength) }; return new String[] { String.valueOf(length), String.valueOf(enduranceLength) };
} }
protected String getStatMessage(SubSkillType subSkillType, String... vars) protected String getStatMessage(SubSkillType subSkillType, String... vars) {
{
return getStatMessage(false, false, subSkillType, vars); return getStatMessage(false, false, subSkillType, vars);
} }
protected String getStatMessage(boolean isExtra, boolean isCustom, SubSkillType subSkillType, String... vars) protected String getStatMessage(boolean isExtra, boolean isCustom, SubSkillType subSkillType, String... vars) {
{
String templateKey = isCustom ? "Ability.Generic.Template.Custom" : "Ability.Generic.Template"; String templateKey = isCustom ? "Ability.Generic.Template.Custom" : "Ability.Generic.Template";
String statDescriptionKey = !isExtra ? subSkillType.getLocaleKeyStatDescription() : subSkillType.getLocaleKeyStatExtraDescription(); String statDescriptionKey = !isExtra ? subSkillType.getLocaleKeyStatDescription() : subSkillType.getLocaleKeyStatExtraDescription();
if (isCustom) if (isCustom)
return LocaleLoader.getString(templateKey, LocaleLoader.getString(statDescriptionKey, vars)); return LocaleLoader.getString(templateKey, LocaleLoader.getString(statDescriptionKey, vars));
else else {
{
String[] mergedList = NotificationManager.addItemToFirstPositionOfArray(LocaleLoader.getString(statDescriptionKey), vars); String[] mergedList = NotificationManager.addItemToFirstPositionOfArray(LocaleLoader.getString(statDescriptionKey), vars);
return LocaleLoader.getString(templateKey, mergedList); return LocaleLoader.getString(templateKey, mergedList);
} }

View File

@ -77,8 +77,7 @@ public class SkillGuideCommand implements CommandExecutor {
while (allStrings.size() < 9) { while (allStrings.size() < 9) {
if (pageIndexStart + allStrings.size() > guide.size()) { if (pageIndexStart + allStrings.size() > guide.size()) {
allStrings.add(""); allStrings.add("");
} } else {
else {
allStrings.add(guide.get(pageIndexStart + (allStrings.size() - 1))); allStrings.add(guide.get(pageIndexStart + (allStrings.size() - 1)));
} }
} }

View File

@ -4,7 +4,6 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.random.ProbabilityUtil; import com.gmail.nossr50.util.random.ProbabilityUtil;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
import com.gmail.nossr50.util.text.TextComponentFactory; import com.gmail.nossr50.util.text.TextComponentFactory;
@ -34,7 +33,7 @@ public class SmeltingCommand extends SkillCommand {
protected void dataCalculations(Player player, float skillValue) { protected void dataCalculations(Player player, float skillValue) {
// FUEL EFFICIENCY // FUEL EFFICIENCY
if (canFuelEfficiency) { if (canFuelEfficiency) {
burnTimeModifier = String.valueOf(UserManager.getPlayer(player).getSmeltingManager().getFuelEfficiencyMultiplier()); burnTimeModifier = String.valueOf(mmoPlayer.getSmeltingManager().getFuelEfficiencyMultiplier());
} }
// FLUX MINING // FLUX MINING
@ -46,7 +45,7 @@ public class SmeltingCommand extends SkillCommand {
// SECOND SMELT // SECOND SMELT
if (canSecondSmelt) { if (canSecondSmelt) {
String[] secondSmeltStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.SMELTING_SECOND_SMELT); String[] secondSmeltStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.SMELTING_SECOND_SMELT);
str_secondSmeltChance = secondSmeltStrings[0]; str_secondSmeltChance = secondSmeltStrings[0];
str_secondSmeltChanceLucky = secondSmeltStrings[1]; str_secondSmeltChanceLucky = secondSmeltStrings[1];
} }
@ -81,7 +80,7 @@ public class SmeltingCommand extends SkillCommand {
if (canUnderstandTheArt) { if (canUnderstandTheArt) {
messages.add(getStatMessage(false, true, SubSkillType.SMELTING_UNDERSTANDING_THE_ART, messages.add(getStatMessage(false, true, SubSkillType.SMELTING_UNDERSTANDING_THE_ART,
String.valueOf(UserManager.getPlayer(player).getSmeltingManager().getVanillaXpMultiplier()))); String.valueOf(mmoPlayer.getSmeltingManager().getVanillaXpMultiplier())));
} }
return messages; return messages;

View File

@ -5,7 +5,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.random.ProbabilityUtil; import com.gmail.nossr50.util.random.ProbabilityUtil;
import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.CombatUtils;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
@ -39,7 +38,7 @@ public class SwordsCommand extends SkillCommand {
protected void dataCalculations(Player player, float skillValue) { protected void dataCalculations(Player player, float skillValue) {
// SWORDS_COUNTER_ATTACK // SWORDS_COUNTER_ATTACK
if (canCounter) { if (canCounter) {
String[] counterStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.SWORDS_COUNTER_ATTACK); String[] counterStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.SWORDS_COUNTER_ATTACK);
counterChance = counterStrings[0]; counterChance = counterStrings[0];
counterChanceLucky = counterStrings[1]; counterChanceLucky = counterStrings[1];
} }
@ -102,10 +101,9 @@ public class SwordsCommand extends SkillCommand {
+ (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", serratedStrikesLengthEndurance) : "")); + (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", serratedStrikesLengthEndurance) : ""));
} }
if(SkillUtils.canUseSubskill(player, SubSkillType.SWORDS_STAB)) if (SkillUtils.canUseSubskill(player, SubSkillType.SWORDS_STAB)) {
{
messages.add(getStatMessage(SubSkillType.SWORDS_STAB, messages.add(getStatMessage(SubSkillType.SWORDS_STAB,
String.valueOf(UserManager.getPlayer(player).getSwordsManager().getStabDamage()))); String.valueOf(mmoPlayer.getSwordsManager().getStabDamage())));
} }
if (SkillUtils.canUseSubskill(player, SubSkillType.SWORDS_SWORDS_LIMIT_BREAK)) { if (SkillUtils.canUseSubskill(player, SubSkillType.SWORDS_SWORDS_LIMIT_BREAK)) {

View File

@ -35,7 +35,7 @@ public class TamingCommand extends SkillCommand {
@Override @Override
protected void dataCalculations(Player player, float skillValue) { protected void dataCalculations(Player player, float skillValue) {
if (canGore) { if (canGore) {
String[] goreStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.TAMING_GORE); String[] goreStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.TAMING_GORE);
goreChance = goreStrings[0]; goreChance = goreStrings[0];
goreChanceLucky = goreStrings[1]; goreChanceLucky = goreStrings[1];
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.commands.skills; package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.CombatUtils;
import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.skills.SkillUtils;
import com.gmail.nossr50.util.text.TextComponentFactory; import com.gmail.nossr50.util.text.TextComponentFactory;
@ -32,10 +30,6 @@ public class TridentsCommand extends SkillCommand {
@Override @Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<>(); List<String> messages = new ArrayList<>();
McMMOPlayer mmoPlayer = UserManager.getPlayer(player);
if (mmoPlayer == null) {
return messages;
}
if (SkillUtils.canUseSubskill(player, TRIDENTS_TRIDENTS_LIMIT_BREAK)) { if (SkillUtils.canUseSubskill(player, TRIDENTS_TRIDENTS_LIMIT_BREAK)) {
messages.add(getStatMessage(TRIDENTS_TRIDENTS_LIMIT_BREAK, messages.add(getStatMessage(TRIDENTS_TRIDENTS_LIMIT_BREAK,

View File

@ -4,7 +4,6 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.random.ProbabilityUtil; import com.gmail.nossr50.util.random.ProbabilityUtil;
import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.CombatUtils;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
@ -40,7 +39,7 @@ public class UnarmedCommand extends SkillCommand {
protected void dataCalculations(Player player, float skillValue) { protected void dataCalculations(Player player, float skillValue) {
// UNARMED_ARROW_DEFLECT // UNARMED_ARROW_DEFLECT
if (canDeflect) { if (canDeflect) {
String[] deflectStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.UNARMED_ARROW_DEFLECT); String[] deflectStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.UNARMED_ARROW_DEFLECT);
deflectChance = deflectStrings[0]; deflectChance = deflectStrings[0];
deflectChanceLucky = deflectStrings[1]; deflectChanceLucky = deflectStrings[1];
} }
@ -54,19 +53,19 @@ public class UnarmedCommand extends SkillCommand {
// UNARMED_DISARM // UNARMED_DISARM
if (canDisarm) { if (canDisarm) {
String[] disarmStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.UNARMED_DISARM); String[] disarmStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.UNARMED_DISARM);
disarmChance = disarmStrings[0]; disarmChance = disarmStrings[0];
disarmChanceLucky = disarmStrings[1]; disarmChanceLucky = disarmStrings[1];
} }
// IRON ARM // IRON ARM
if (canIronArm) { if (canIronArm) {
ironArmBonus = UserManager.getPlayer(player).getUnarmedManager().getSteelArmStyleDamage(); ironArmBonus = mmoPlayer.getUnarmedManager().getSteelArmStyleDamage();
} }
// IRON GRIP // IRON GRIP
if (canIronGrip) { if (canIronGrip) {
String[] ironGripStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.UNARMED_IRON_GRIP); String[] ironGripStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.UNARMED_IRON_GRIP);
ironGripChance = ironGripStrings[0]; ironGripChance = ironGripStrings[0];
ironGripChanceLucky = ironGripStrings[1]; ironGripChanceLucky = ironGripStrings[1];
} }

View File

@ -41,7 +41,7 @@ public class WoodcuttingCommand extends SkillCommand {
//Clean Cuts //Clean Cuts
if (canTripleDrop) { if (canTripleDrop) {
String[] tripleDropStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.WOODCUTTING_CLEAN_CUTS); String[] tripleDropStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.WOODCUTTING_CLEAN_CUTS);
tripleDropChance = tripleDropStrings[0]; tripleDropChance = tripleDropStrings[0];
tripleDropChanceLucky = tripleDropStrings[1]; tripleDropChanceLucky = tripleDropStrings[1];
} }
@ -55,7 +55,7 @@ public class WoodcuttingCommand extends SkillCommand {
} }
private void setDoubleDropClassicChanceStrings(Player player) { private void setDoubleDropClassicChanceStrings(Player player) {
String[] doubleDropStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.WOODCUTTING_HARVEST_LUMBER); String[] doubleDropStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.WOODCUTTING_HARVEST_LUMBER);
doubleDropChance = doubleDropStrings[0]; doubleDropChance = doubleDropStrings[0];
doubleDropChanceLucky = doubleDropStrings[1]; doubleDropChanceLucky = doubleDropStrings[1];
} }

View File

@ -504,8 +504,7 @@ public class AdvancedConfig extends BukkitConfig {
*/ */
/*public ChatColor getJSONStatHoverElementColor(StatType statType, boolean isPrefix) /*public ChatColor getJSONStatHoverElementColor(StatType statType, boolean isPrefix) {
{
String keyAddress = isPrefix ? "Prefix" : "Value"; String keyAddress = isPrefix ? "Prefix" : "Value";
String keyLocation = "Style.JSON.Hover.Details." + StringUtils.getCapitalized(statType.toString()) +"."+keyAddress+".Color"; String keyLocation = "Style.JSON.Hover.Details." + StringUtils.getCapitalized(statType.toString()) +"."+keyAddress+".Color";
@ -517,50 +516,41 @@ public class AdvancedConfig extends BukkitConfig {
* *
* @return the ChatColor for this element * @return the ChatColor for this element
*/ */
/*public ChatColor getJSONStatHoverDetailsColor() /*public ChatColor getJSONStatHoverDetailsColor() {
{
String keyLocation = "Style.JSON.Hover.Details.Header.Color"; String keyLocation = "Style.JSON.Hover.Details.Header.Color";
return getChatColorFromKey(keyLocation); return getChatColorFromKey(keyLocation);
} }
public boolean isJSONDetailsHeaderBold() public boolean isJSONDetailsHeaderBold() {
{
return config.getBoolean("Style.JSON.Hover.Details.Header.Bold"); return config.getBoolean("Style.JSON.Hover.Details.Header.Bold");
} }
public boolean isJSONDetailsHeaderItalic() public boolean isJSONDetailsHeaderItalic() {
{
return config.getBoolean("Style.JSON.Hover.Details.Header.Italics"); return config.getBoolean("Style.JSON.Hover.Details.Header.Italics");
} }
public boolean isJSONDetailsHeaderUnderlined() public boolean isJSONDetailsHeaderUnderlined() {
{
return config.getBoolean("Style.JSON.Hover.Details.Header.Underlined"); return config.getBoolean("Style.JSON.Hover.Details.Header.Underlined");
} }
public ChatColor getJSONStatHoverDescriptionColor() public ChatColor getJSONStatHoverDescriptionColor() {
{
String keyLocation = "Style.JSON.Hover.Details.Description.Color"; String keyLocation = "Style.JSON.Hover.Details.Description.Color";
return getChatColorFromKey(keyLocation); return getChatColorFromKey(keyLocation);
} }
public boolean isJSONDetailsDescriptionBold() public boolean isJSONDetailsDescriptionBold() {
{
return config.getBoolean("Style.JSON.Hover.Details.Description.Bold"); return config.getBoolean("Style.JSON.Hover.Details.Description.Bold");
} }
public boolean isJSONDetailsDescriptionItalic() public boolean isJSONDetailsDescriptionItalic() {
{
return config.getBoolean("Style.JSON.Hover.Details.Description.Italics"); return config.getBoolean("Style.JSON.Hover.Details.Description.Italics");
} }
public boolean isJSONDetailsDescriptionUnderlined() public boolean isJSONDetailsDescriptionUnderlined() {
{
return config.getBoolean("Style.JSON.Hover.Details.Description.Underlined"); return config.getBoolean("Style.JSON.Hover.Details.Description.Underlined");
} }
public ChatColor getJSONActionBarColor(NotificationType notificationType) public ChatColor getJSONActionBarColor(NotificationType notificationType) {
{
return getChatColor(config.getString("Style.JSON.Notification."+notificationType.toString()+".Color")); return getChatColor(config.getString("Style.JSON.Notification."+notificationType.toString()+".Color"));
}*/ }*/
private ChatColor getChatColorFromKey(String keyLocation) { private ChatColor getChatColorFromKey(String keyLocation) {
@ -580,22 +570,19 @@ public class AdvancedConfig extends BukkitConfig {
return ChatColor.WHITE; return ChatColor.WHITE;
} }
/*public boolean isJSONStatHoverElementBold(StatType statType, boolean isPrefix) /*public boolean isJSONStatHoverElementBold(StatType statType, boolean isPrefix) {
{
String keyAddress = isPrefix ? "Prefix" : "Value"; String keyAddress = isPrefix ? "Prefix" : "Value";
String keyLocation = "Style.JSON.Hover.Details." + StringUtils.getCapitalized(statType.toString()) +"."+keyAddress+".Bold"; String keyLocation = "Style.JSON.Hover.Details." + StringUtils.getCapitalized(statType.toString()) +"."+keyAddress+".Bold";
return config.getBoolean(keyLocation); return config.getBoolean(keyLocation);
} }
public boolean isJSONStatHoverElementItalic(StatType statType, boolean isPrefix) public boolean isJSONStatHoverElementItalic(StatType statType, boolean isPrefix) {
{
String keyAddress = isPrefix ? "Prefix" : "Value"; String keyAddress = isPrefix ? "Prefix" : "Value";
String keyLocation = "Style.JSON.Hover.Details." + StringUtils.getCapitalized(statType.toString()) +"."+keyAddress+".Italics"; String keyLocation = "Style.JSON.Hover.Details." + StringUtils.getCapitalized(statType.toString()) +"."+keyAddress+".Italics";
return config.getBoolean(keyLocation); return config.getBoolean(keyLocation);
} }
public boolean isJSONStatHoverElementUnderlined(StatType statType, boolean isPrefix) public boolean isJSONStatHoverElementUnderlined(StatType statType, boolean isPrefix) {
{
String keyAddress = isPrefix ? "Prefix" : "Value"; String keyAddress = isPrefix ? "Prefix" : "Value";
String keyLocation = "Style.JSON.Hover.Details." + StringUtils.getCapitalized(statType.toString()) +"."+keyAddress+".Underline"; String keyLocation = "Style.JSON.Hover.Details." + StringUtils.getCapitalized(statType.toString()) +"."+keyAddress+".Underline";
return config.getBoolean(keyLocation); return config.getBoolean(keyLocation);

View File

@ -4,31 +4,40 @@ import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.LogUtils; import com.gmail.nossr50.util.LogUtils;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.VisibleForTesting;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
@Deprecated @Deprecated
public abstract class LegacyConfigLoader { public abstract class LegacyConfigLoader {
protected final File configFile; protected final @NotNull File configFile;
protected final @NotNull File dataFolder; protected final @NotNull File dataFolder;
protected String fileName; protected @NotNull String fileName;
protected YamlConfiguration config; protected YamlConfiguration config;
public LegacyConfigLoader(String relativePath, String fileName, @NotNull File dataFolder) { public LegacyConfigLoader(@NotNull String relativePath, @NotNull String fileName, @NotNull File dataFolder) {
this.fileName = fileName; this.fileName = fileName;
this.dataFolder = dataFolder; this.dataFolder = dataFolder;
configFile = new File(dataFolder, relativePath + File.separator + fileName); configFile = new File(dataFolder, relativePath + File.separator + fileName);
loadFile(); loadFile();
} }
public LegacyConfigLoader(String fileName, @NotNull File dataFolder) { public LegacyConfigLoader(@NotNull String fileName, @NotNull File dataFolder) {
this.fileName = fileName; this.fileName = fileName;
this.dataFolder = dataFolder; this.dataFolder = dataFolder;
configFile = new File(dataFolder, fileName); configFile = new File(dataFolder, fileName);
loadFile(); loadFile();
} }
@VisibleForTesting
public LegacyConfigLoader(@NotNull File file) {
this.fileName = file.getName();
this.dataFolder = file.getParentFile();
configFile = new File(dataFolder, fileName);
loadFile();
}
@Deprecated @Deprecated
public LegacyConfigLoader(String relativePath, String fileName) { public LegacyConfigLoader(String relativePath, String fileName) {
this.fileName = fileName; this.fileName = fileName;

View File

@ -467,7 +467,7 @@ public class ExperienceConfig extends BukkitConfig {
/* Alchemy */ /* Alchemy */
public double getPotionXP(PotionStage stage) { public double getPotionXP(PotionStage stage) {
return config.getDouble("Experience_Values.Alchemy.Potion_Stage_" + stage.toNumerical(), 10D); return config.getDouble("Experience_Values.Alchemy.Potion_Brewing.Stage_" + stage.toNumerical(), 10D);
} }
/* Archery */ /* Archery */

View File

@ -3,7 +3,6 @@ package com.gmail.nossr50.config.mods;
import com.gmail.nossr50.config.LegacyConfigLoader; import com.gmail.nossr50.config.LegacyConfigLoader;
import com.gmail.nossr50.datatypes.mods.CustomEntity; import com.gmail.nossr50.datatypes.mods.CustomEntity;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import org.apache.commons.lang.ClassUtils;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -30,7 +29,7 @@ public class CustomEntityLegacyConfig extends LegacyConfigLoader {
String className = config.getString(entityName + ".Class", ""); String className = config.getString(entityName + ".Class", "");
try { try {
clazz = ClassUtils.getClass(className); clazz = Class.forName(className);
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
mcMMO.p.getLogger().warning("Invalid class (" + className + ") detected for " + entityName + "."); mcMMO.p.getLogger().warning("Invalid class (" + className + ") detected for " + entityName + ".");
mcMMO.p.getLogger().warning("This custom entity may not function properly."); mcMMO.p.getLogger().warning("This custom entity may not function properly.");

View File

@ -3,21 +3,29 @@ package com.gmail.nossr50.config.skills.alchemy;
import com.gmail.nossr50.config.LegacyConfigLoader; import com.gmail.nossr50.config.LegacyConfigLoader;
import com.gmail.nossr50.datatypes.skills.alchemy.AlchemyPotion; import com.gmail.nossr50.datatypes.skills.alchemy.AlchemyPotion;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.LogUtils; import com.gmail.nossr50.util.ItemUtils;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Color; import org.bukkit.Color;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.*; import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionType;
import org.jetbrains.annotations.VisibleForTesting;
import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import static com.gmail.nossr50.util.ItemUtils.setItemName;
import static com.gmail.nossr50.util.PotionUtil.*;
public class PotionConfig extends LegacyConfigLoader { public class PotionConfig extends LegacyConfigLoader {
private static PotionConfig instance;
private final List<ItemStack> concoctionsIngredientsTierOne = new ArrayList<>(); private final List<ItemStack> concoctionsIngredientsTierOne = new ArrayList<>();
private final List<ItemStack> concoctionsIngredientsTierTwo = new ArrayList<>(); private final List<ItemStack> concoctionsIngredientsTierTwo = new ArrayList<>();
@ -28,30 +36,34 @@ public class PotionConfig extends LegacyConfigLoader {
private final List<ItemStack> concoctionsIngredientsTierSeven = new ArrayList<>(); private final List<ItemStack> concoctionsIngredientsTierSeven = new ArrayList<>();
private final List<ItemStack> concoctionsIngredientsTierEight = new ArrayList<>(); private final List<ItemStack> concoctionsIngredientsTierEight = new ArrayList<>();
private final Map<String, AlchemyPotion> potionMap = new HashMap<>(); /**
* Map of potion names to AlchemyPotion objects.
*/
private final Map<String, AlchemyPotion> alchemyPotions = new HashMap<>();
private PotionConfig() { public PotionConfig() {
super("potions.yml"); super("potions.yml");
loadKeys();
} }
public static PotionConfig getInstance() { @VisibleForTesting
if (instance == null) { PotionConfig(File file) {
instance = new PotionConfig(); super(file);
}
return instance;
} }
@Override @Override
protected void loadKeys() { protected void loadKeys() {
}
public void loadPotions() {
loadConcoctions(); loadConcoctions();
loadPotionMap(); loadPotionMap();
} }
private void loadConcoctions() { @VisibleForTesting
ConfigurationSection concoctionSection = config.getConfigurationSection("Concoctions"); void loadConcoctions() {
final ConfigurationSection concoctionSection = config.getConfigurationSection("Concoctions");
// Load the ingredients for each tier
loadConcoctionsTier(concoctionsIngredientsTierOne, concoctionSection.getStringList("Tier_One_Ingredients")); loadConcoctionsTier(concoctionsIngredientsTierOne, concoctionSection.getStringList("Tier_One_Ingredients"));
loadConcoctionsTier(concoctionsIngredientsTierTwo, concoctionSection.getStringList("Tier_Two_Ingredients")); loadConcoctionsTier(concoctionsIngredientsTierTwo, concoctionSection.getStringList("Tier_Two_Ingredients"));
loadConcoctionsTier(concoctionsIngredientsTierThree, concoctionSection.getStringList("Tier_Three_Ingredients")); loadConcoctionsTier(concoctionsIngredientsTierThree, concoctionSection.getStringList("Tier_Three_Ingredients"));
@ -71,7 +83,7 @@ public class PotionConfig extends LegacyConfigLoader {
} }
private void loadConcoctionsTier(List<ItemStack> ingredientList, List<String> ingredientStrings) { private void loadConcoctionsTier(List<ItemStack> ingredientList, List<String> ingredientStrings) {
if (ingredientStrings != null && ingredientStrings.size() > 0) { if (ingredientStrings != null && !ingredientStrings.isEmpty()) {
for (String ingredientString : ingredientStrings) { for (String ingredientString : ingredientStrings) {
ItemStack ingredient = loadIngredient(ingredientString); ItemStack ingredient = loadIngredient(ingredientString);
@ -85,23 +97,24 @@ public class PotionConfig extends LegacyConfigLoader {
/** /**
* Find the Potions configuration section and load all defined potions. * Find the Potions configuration section and load all defined potions.
*/ */
private void loadPotionMap() { int loadPotionMap() {
ConfigurationSection potionSection = config.getConfigurationSection("Potions"); ConfigurationSection potionSection = config.getConfigurationSection("Potions");
int pass = 0; int potionsLoaded = 0;
int fail = 0; int failures = 0;
for (String potionName : potionSection.getKeys(false)) { for (String potionName : potionSection.getKeys(false)) {
AlchemyPotion potion = loadPotion(potionSection.getConfigurationSection(potionName)); AlchemyPotion potion = loadPotion(potionSection.getConfigurationSection(potionName));
if (potion != null) { if (potion != null) {
potionMap.put(potionName, potion); alchemyPotions.put(potionName, potion);
pass++; potionsLoaded++;
} else { } else {
fail++; failures++;
} }
} }
LogUtils.debug(mcMMO.p.getLogger(), "Loaded " + pass + " Alchemy potions, skipped " + fail + "."); mcMMO.p.getLogger().info("Loaded " + potionsLoaded + " Alchemy potions, skipped " + failures + ".");
return potionsLoaded;
} }
/** /**
@ -114,37 +127,70 @@ public class PotionConfig extends LegacyConfigLoader {
*/ */
private AlchemyPotion loadPotion(ConfigurationSection potion_section) { private AlchemyPotion loadPotion(ConfigurationSection potion_section) {
try { try {
final String key = potion_section.getName();
final ConfigurationSection potionData = potion_section.getConfigurationSection("PotionData");
boolean extended = false;
boolean upgraded = false;
String name = potion_section.getString("Name"); if (potionData != null) {
if (name != null) { extended = potionData.getBoolean("Extended", false);
name = ChatColor.translateAlternateColorCodes('&', name); upgraded = potionData.getBoolean("Upgraded", false);
} }
PotionData data; Material material;
if (!potion_section.contains("PotionData")) { // Backwards config compatability final String materialString = potion_section.getString("Material", null);
short dataValue = Short.parseShort(potion_section.getName()); if (materialString != null) {
Potion potion = Potion.fromDamage(dataValue); material = ItemUtils.exhaustiveMaterialLookup(materialString);
data = new PotionData(potion.getType(), potion.hasExtendedDuration(), potion.getLevel() == 2); if (material == null) {
mcMMO.p.getLogger().warning("PotionConfig: Failed to parse material for potion " + key + ": " + materialString);
mcMMO.p.getLogger().warning("PotionConfig: Defaulting to POTION");
material = Material.POTION;
}
} else { } else {
ConfigurationSection potionData = potion_section.getConfigurationSection("PotionData"); mcMMO.p.getLogger().warning("PotionConfig: Missing Material config entry for potion " + key + "," +
data = new PotionData(PotionType.valueOf(potionData.getString("PotionType", "WATER")), potionData.getBoolean("Extended", false), potionData.getBoolean("Upgraded", false)); " from configuration section: " + potion_section + ", defaulting to POTION");
material = Material.POTION;
} }
Material material = Material.POTION; final ItemStack itemStack = new ItemStack(material, 1);
String mat = potion_section.getString("Material", null); final PotionMeta potionMeta = (PotionMeta) itemStack.getItemMeta();
if (mat != null) {
material = Material.valueOf(mat); if (potionMeta == null) {
mcMMO.p.getLogger().severe("PotionConfig: Failed to get PotionMeta for " + key + ", from configuration section:" +
" " + potion_section);
return null;
} }
List<String> lore = new ArrayList<>(); // extended and upgraded seem to be mutually exclusive
if (extended && upgraded) {
mcMMO.p.getLogger().warning("Potion " + key + " has both Extended and Upgraded set to true," +
" defaulting to Extended.");
upgraded = false;
}
String potionTypeStr = potionData.getString("PotionType", null);
if (potionTypeStr == null) {
mcMMO.p.getLogger().severe("PotionConfig: Missing PotionType for " + key + ", from configuration section:" +
" " + potion_section);
return null;
}
// This works via side effects
// TODO: Redesign later, side effects are stupid
if(!setPotionType(potionMeta, potionTypeStr, upgraded, extended)) {
mcMMO.p.getLogger().severe("PotionConfig: Failed to set parameters of potion for " + key + ": " + potionTypeStr);
return null;
}
final List<String> lore = new ArrayList<>();
if (potion_section.contains("Lore")) { if (potion_section.contains("Lore")) {
for (String line : potion_section.getStringList("Lore")) { for (String line : potion_section.getStringList("Lore")) {
lore.add(ChatColor.translateAlternateColorCodes('&', line)); lore.add(ChatColor.translateAlternateColorCodes('&', line));
} }
} }
potionMeta.setLore(lore);
List<PotionEffect> effects = new ArrayList<>();
if (potion_section.contains("Effects")) { if (potion_section.contains("Effects")) {
for (String effect : potion_section.getStringList("Effects")) { for (String effect : potion_section.getStringList("Effects")) {
String[] parts = effect.split(" "); String[] parts = effect.split(" ");
@ -154,9 +200,9 @@ public class PotionConfig extends LegacyConfigLoader {
int duration = parts.length > 2 ? Integer.parseInt(parts[2]) : 0; int duration = parts.length > 2 ? Integer.parseInt(parts[2]) : 0;
if (type != null) { if (type != null) {
effects.add(new PotionEffect(type, duration, amplifier)); potionMeta.addCustomEffect(new PotionEffect(type, duration, amplifier), true);
} else { } else {
mcMMO.p.getLogger().warning("Failed to parse effect for potion " + name + ": " + effect); mcMMO.p.getLogger().severe("PotionConfig: Failed to parse effect for potion " + key + ": " + effect);
} }
} }
} }
@ -165,25 +211,59 @@ public class PotionConfig extends LegacyConfigLoader {
if (potion_section.contains("Color")) { if (potion_section.contains("Color")) {
color = Color.fromRGB(potion_section.getInt("Color")); color = Color.fromRGB(potion_section.getInt("Color"));
} else { } else {
color = this.generateColor(effects); color = this.generateColor(potionMeta.getCustomEffects());
} }
potionMeta.setColor(color);
Map<ItemStack, String> children = new HashMap<>(); final Map<ItemStack, String> children = new HashMap<>();
if (potion_section.contains("Children")) { if (potion_section.contains("Children")) {
for (String child : potion_section.getConfigurationSection("Children").getKeys(false)) { for (String child : potion_section.getConfigurationSection("Children").getKeys(false)) {
ItemStack ingredient = loadIngredient(child); ItemStack ingredient = loadIngredient(child);
if (ingredient != null) { if (ingredient != null) {
children.put(ingredient, potion_section.getConfigurationSection("Children").getString(child)); children.put(ingredient, potion_section.getConfigurationSection("Children").getString(child));
} else { } else {
mcMMO.p.getLogger().warning("Failed to parse child for potion " + name + ": " + child); mcMMO.p.getLogger().severe("PotionConfig: Failed to parse child for potion " + key + ": " + child);
} }
} }
} }
// Set the name of the potion
setPotionDisplayName(potion_section, potionMeta);
// TODO: Might not need to .setItemMeta
itemStack.setItemMeta(potionMeta);
return new AlchemyPotion(potion_section.getName(), itemStack, children);
} catch (Exception e) {
mcMMO.p.getLogger().warning("PotionConfig: Failed to load Alchemy potion: " + potion_section.getName());
e.printStackTrace();
return null;
}
}
return new AlchemyPotion(material, data, name, lore, effects, color, children); private boolean setPotionType(PotionMeta potionMeta, String potionTypeStr, boolean upgraded, boolean extended) {
} catch (Exception e) { final PotionType potionType = matchPotionType(potionTypeStr, upgraded, extended);
mcMMO.p.getLogger().warning("Failed to load Alchemy potion: " + potion_section.getName());
return null; if (potionType == null) {
mcMMO.p.getLogger().severe("PotionConfig: Failed to parse potion type for: " + potionTypeStr);
return false;
}
// set base
setBasePotionType(potionMeta, potionType, extended, upgraded);
// Legacy only
setUpgradedAndExtendedProperties(potionType, potionMeta, upgraded, extended);
return true;
}
private void setPotionDisplayName(ConfigurationSection section, PotionMeta potionMeta) {
// If a potion doesn't have any custom effects, there is no reason to override the vanilla name
if (potionMeta.getCustomEffects().isEmpty()) {
return;
}
final String configuredName = section.getString("Name", null);
if (configuredName != null) {
setItemName(potionMeta, configuredName);
} }
} }
@ -210,43 +290,63 @@ public class PotionConfig extends LegacyConfigLoader {
return null; return null;
} }
/**
* Get the ingredients for the given tier.
* @param tier Tier to get ingredients for.
* @return List of ingredients for the given tier.
*/
public List<ItemStack> getIngredients(int tier) { public List<ItemStack> getIngredients(int tier) {
switch (tier) { return switch (tier) {
case 8: case 8 -> concoctionsIngredientsTierEight;
return concoctionsIngredientsTierEight; case 7 -> concoctionsIngredientsTierSeven;
case 7: case 6 -> concoctionsIngredientsTierSix;
return concoctionsIngredientsTierSeven; case 5 -> concoctionsIngredientsTierFive;
case 6: case 4 -> concoctionsIngredientsTierFour;
return concoctionsIngredientsTierSix; case 3 -> concoctionsIngredientsTierThree;
case 5: case 2 -> concoctionsIngredientsTierTwo;
return concoctionsIngredientsTierFive; default -> concoctionsIngredientsTierOne;
case 4: };
return concoctionsIngredientsTierFour;
case 3:
return concoctionsIngredientsTierThree;
case 2:
return concoctionsIngredientsTierTwo;
case 1:
default:
return concoctionsIngredientsTierOne;
}
} }
/**
* Check if the given ItemStack is a valid potion.
* @param item ItemStack to be checked.
* @return True if the given ItemStack is a valid potion, false otherwise.
*/
public boolean isValidPotion(ItemStack item) { public boolean isValidPotion(ItemStack item) {
return getPotion(item) != null; return getPotion(item) != null;
} }
/**
* Get the AlchemyPotion that corresponds to the given name.
* @param name Name of the potion to be checked.
* @return AlchemyPotion that corresponds to the given name.
*/
public AlchemyPotion getPotion(String name) { public AlchemyPotion getPotion(String name) {
return potionMap.get(name); return alchemyPotions.get(name);
} }
/**
* Get the AlchemyPotion that corresponds to the given ItemStack.
*
* @param item ItemStack to be checked.
*
* @return AlchemyPotion that corresponds to the given ItemStack.
*/
public AlchemyPotion getPotion(ItemStack item) { public AlchemyPotion getPotion(ItemStack item) {
for (AlchemyPotion potion : potionMap.values()) { final List<AlchemyPotion> potionList = alchemyPotions.values()
if (potion.isSimilar(item)) { .stream()
return potion; .filter(potion -> potion.isSimilarPotion(item))
.toList();
if(potionList.size() > 1) {
mcMMO.p.getLogger().severe("Multiple potions defined in config have matched this potion, for mcMMO to behave" +
" properly there should only be one match found.");
mcMMO.p.getLogger().severe("Potion ItemStack:" + item.toString());
mcMMO.p.getLogger().severe("Alchemy Potions from config matching this item: "
+ potionList.stream().map(AlchemyPotion::toString).collect(Collectors.joining(", ")));
} }
}
return null; return potionList.isEmpty() ? null : potionList.get(0);
} }
public Color generateColor(List<PotionEffect> effects) { public Color generateColor(List<PotionEffect> effects) {
@ -278,5 +378,4 @@ public class PotionConfig extends LegacyConfigLoader {
} }
return Color.fromRGB(red / colors.size(), green / colors.size(), blue / colors.size()); return Color.fromRGB(red / colors.size(), green / colors.size(), blue / colors.size());
} }
} }

View File

@ -5,6 +5,7 @@ import com.gmail.nossr50.datatypes.treasure.*;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.EnchantmentUtils; import com.gmail.nossr50.util.EnchantmentUtils;
import com.gmail.nossr50.util.LogUtils; import com.gmail.nossr50.util.LogUtils;
import com.gmail.nossr50.util.PotionUtil;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
@ -13,12 +14,13 @@ import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.PotionData;
import org.bukkit.potion.PotionType; import org.bukkit.potion.PotionType;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.*; import java.util.*;
import static com.gmail.nossr50.util.PotionUtil.matchPotionType;
public class FishingTreasureConfig extends BukkitConfig { public class FishingTreasureConfig extends BukkitConfig {
public static final String FILENAME = "fishing_treasures.yml"; public static final String FILENAME = "fishing_treasures.yml";
@ -204,30 +206,40 @@ public class FishingTreasureConfig extends BukkitConfig {
} }
if (materialName.contains("POTION")) { if (materialName.contains("POTION")) {
// Update for 1.20.5
Material mat = Material.matchMaterial(materialName); Material mat = Material.matchMaterial(materialName);
if (mat == null) { if (mat == null) {
reason.add("Potion format for " + FILENAME + " has changed"); reason.add("Potion format for " + FILENAME + " has changed");
continue;
} else { } else {
item = new ItemStack(mat, amount, data); item = new ItemStack(mat, amount, data);
PotionMeta itemMeta = (PotionMeta) item.getItemMeta(); PotionMeta potionMeta = (PotionMeta) item.getItemMeta();
if (itemMeta == null) { if (potionMeta == null) {
mcMMO.p.getLogger().severe("Item meta when adding potion to fishing treasure was null, contact the mcMMO devs!"); mcMMO.p.getLogger().severe("FishingConfig: Item meta when adding potion to fishing treasure was null," +
" contact the mcMMO devs!");
reason.add("FishingConfig: Item meta when adding potion to fishing treasure was null");
continue; continue;
} }
PotionType potionType = null; String potionTypeStr;
try { potionTypeStr = config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER");
potionType = PotionType.valueOf(config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER"));
} catch (IllegalArgumentException ex) {
reason.add("Invalid Potion_Type: " + config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER"));
}
boolean extended = config.getBoolean(type + "." + treasureName + ".PotionData.Extended", false); boolean extended = config.getBoolean(type + "." + treasureName + ".PotionData.Extended", false);
boolean upgraded = config.getBoolean(type + "." + treasureName + ".PotionData.Upgraded", false); boolean upgraded = config.getBoolean(type + "." + treasureName + ".PotionData.Upgraded", false);
itemMeta.setBasePotionData(new PotionData(potionType, extended, upgraded)); final PotionType potionType = matchPotionType(potionTypeStr, extended, upgraded);
if (potionType == null) {
reason.add("FishingConfig: Could not derive potion type from: " + potionTypeStr +", " + extended + ", " + upgraded);
continue;
}
// Set the base potion type
// NOTE: Upgraded/Extended are ignored in 1.20.5 and later
PotionUtil.setBasePotionType(potionMeta, potionType, upgraded, extended);
if (customName != null) { if (customName != null) {
itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', customName)); potionMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', customName));
} }
if (config.contains(type + "." + treasureName + ".Lore")) { if (config.contains(type + "." + treasureName + ".Lore")) {
@ -235,9 +247,9 @@ public class FishingTreasureConfig extends BukkitConfig {
for (String s : config.getStringList(type + "." + treasureName + ".Lore")) { for (String s : config.getStringList(type + "." + treasureName + ".Lore")) {
lore.add(ChatColor.translateAlternateColorCodes('&', s)); lore.add(ChatColor.translateAlternateColorCodes('&', s));
} }
itemMeta.setLore(lore); potionMeta.setLore(lore);
} }
item.setItemMeta(itemMeta); item.setItemMeta(potionMeta);
} }
} else if (material == Material.ENCHANTED_BOOK) { } else if (material == Material.ENCHANTED_BOOK) {
//If any whitelisted enchants exist we use whitelist-based matching //If any whitelisted enchants exist we use whitelist-based matching
@ -355,7 +367,8 @@ public class FishingTreasureConfig extends BukkitConfig {
Enchantment enchantment = EnchantmentUtils.getByName(enchantmentName); Enchantment enchantment = EnchantmentUtils.getByName(enchantmentName);
if (enchantment == null) { if (enchantment == null) {
mcMMO.p.getLogger().warning("Skipping invalid enchantment in " + FILENAME + ": " + enchantmentName); mcMMO.p.getLogger().info("Skipping invalid enchantment in '" + FILENAME + "', named:"
+ enchantmentName);
continue; continue;
} }

View File

@ -6,6 +6,7 @@ import com.gmail.nossr50.datatypes.treasure.HylianTreasure;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.BlockUtils; import com.gmail.nossr50.util.BlockUtils;
import com.gmail.nossr50.util.LogUtils; import com.gmail.nossr50.util.LogUtils;
import com.gmail.nossr50.util.PotionUtil;
import com.gmail.nossr50.util.text.StringUtils; import com.gmail.nossr50.util.text.StringUtils;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
@ -14,7 +15,6 @@ import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.PotionData;
import org.bukkit.potion.PotionType; import org.bukkit.potion.PotionType;
import java.io.IOException; import java.io.IOException;
@ -165,22 +165,33 @@ public class TreasureConfig extends BukkitConfig {
Material mat = Material.matchMaterial(materialName); Material mat = Material.matchMaterial(materialName);
if (mat == null) { if (mat == null) {
reason.add("Potion format for " + FILENAME + " has changed"); reason.add("Potion format for " + FILENAME + " has changed");
continue;
} else { } else {
item = new ItemStack(mat, amount, data); item = new ItemStack(mat, amount, data);
PotionMeta itemMeta = (PotionMeta) item.getItemMeta(); PotionMeta potionMeta = (PotionMeta) item.getItemMeta();
if (potionMeta == null) {
PotionType potionType = null; mcMMO.p.getLogger().severe("Item meta when adding potion to treasure was null, contact the mcMMO devs!");
try { reason.add("Item meta when adding potion to treasure was null, contact the mcMMO devs!");
potionType = PotionType.valueOf(config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER")); continue;
} catch (IllegalArgumentException ex) {
reason.add("Invalid Potion_Type: " + config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER"));
} }
String potionTypeStr;
potionTypeStr = config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER");
boolean extended = config.getBoolean(type + "." + treasureName + ".PotionData.Extended", false); boolean extended = config.getBoolean(type + "." + treasureName + ".PotionData.Extended", false);
boolean upgraded = config.getBoolean(type + "." + treasureName + ".PotionData.Upgraded", false); boolean upgraded = config.getBoolean(type + "." + treasureName + ".PotionData.Upgraded", false);
itemMeta.setBasePotionData(new PotionData(potionType, extended, upgraded)); PotionType potionType = PotionUtil.matchPotionType(potionTypeStr, extended, upgraded);
if (potionType == null) {
reason.add("Could not derive potion type from: " + potionTypeStr +", " + extended + ", " + upgraded);
continue;
}
// Set the base potion type
// NOTE: extended/upgraded are ignored in 1.20.5 and later
PotionUtil.setBasePotionType(potionMeta, potionType, extended, upgraded);
if (config.contains(type + "." + treasureName + ".Custom_Name")) { if (config.contains(type + "." + treasureName + ".Custom_Name")) {
itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', config.getString(type + "." + treasureName + ".Custom_Name"))); potionMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', config.getString(type + "." + treasureName + ".Custom_Name")));
} }
if (config.contains(type + "." + treasureName + ".Lore")) { if (config.contains(type + "." + treasureName + ".Lore")) {
@ -188,9 +199,9 @@ public class TreasureConfig extends BukkitConfig {
for (String s : config.getStringList(type + "." + treasureName + ".Lore")) { for (String s : config.getStringList(type + "." + treasureName + ".Lore")) {
lore.add(ChatColor.translateAlternateColorCodes('&', s)); lore.add(ChatColor.translateAlternateColorCodes('&', s));
} }
itemMeta.setLore(lore); potionMeta.setLore(lore);
} }
item.setItemMeta(itemMeta); item.setItemMeta(potionMeta);
} }
} else if (material != null) { } else if (material != null) {
item = new ItemStack(material, amount, data); item = new ItemStack(material, amount, data);

View File

@ -253,68 +253,26 @@ public class FlatFileDataProcessor {
} }
public static @NotNull ExpectedType getExpectedValueType(int dataIndex) throws IndexOutOfBoundsException { public static @NotNull ExpectedType getExpectedValueType(int dataIndex) throws IndexOutOfBoundsException {
switch(dataIndex) { return switch (dataIndex) {
case USERNAME_INDEX: case USERNAME_INDEX -> ExpectedType.STRING; //Assumption: Used to be for something, no longer used
return ExpectedType.STRING; //Assumption: Used to be for something, no longer used
case 2: //Assumption: Used to be for something, no longer used //Assumption: Used to be used for something, no longer used
case 3: //Assumption: Used to be for something, no longer used //Assumption: Used to be used for something, no longer used
case 23: //Assumption: Used to be used for something, no longer used case 2, 3, 23, 33, HEALTHBAR, LEGACY_LAST_LOGIN -> ExpectedType.IGNORED;
case 33: //Assumption: Used to be used for something, no longer used case SKILLS_MINING, SKILLS_REPAIR, SKILLS_UNARMED, SKILLS_HERBALISM, SKILLS_EXCAVATION, SKILLS_ARCHERY,
case HEALTHBAR: SKILLS_SWORDS, SKILLS_AXES, SKILLS_WOODCUTTING, SKILLS_ACROBATICS, SKILLS_TAMING, SKILLS_FISHING,
case LEGACY_LAST_LOGIN: SKILLS_ALCHEMY, SKILLS_CROSSBOWS, SKILLS_TRIDENTS, SKILLS_MACES, COOLDOWN_BERSERK,
return ExpectedType.IGNORED; COOLDOWN_GIGA_DRILL_BREAKER, COOLDOWN_TREE_FELLER, COOLDOWN_GREEN_TERRA, COOLDOWN_SERRATED_STRIKES,
case SKILLS_MINING: COOLDOWN_SKULL_SPLITTER, COOLDOWN_SUPER_BREAKER, COOLDOWN_BLAST_MINING, SCOREBOARD_TIPS,
case SKILLS_REPAIR: COOLDOWN_CHIMAERA_WING, COOLDOWN_SUPER_SHOTGUN, COOLDOWN_TRIDENTS, COOLDOWN_ARCHERY, COOLDOWN_MACES ->
case SKILLS_UNARMED: ExpectedType.INTEGER;
case SKILLS_HERBALISM: case EXP_MINING, EXP_WOODCUTTING, EXP_REPAIR, EXP_UNARMED, EXP_HERBALISM, EXP_EXCAVATION, EXP_ARCHERY,
case SKILLS_EXCAVATION: EXP_SWORDS, EXP_AXES, EXP_ACROBATICS, EXP_TAMING, EXP_FISHING, EXP_ALCHEMY, EXP_CROSSBOWS,
case SKILLS_ARCHERY: EXP_TRIDENTS, EXP_MACES -> ExpectedType.FLOAT;
case SKILLS_SWORDS: case UUID_INDEX -> ExpectedType.UUID;
case SKILLS_AXES: case OVERHAUL_LAST_LOGIN -> ExpectedType.LONG;
case SKILLS_WOODCUTTING: default -> throw new IndexOutOfBoundsException();
case SKILLS_ACROBATICS: };
case SKILLS_TAMING:
case SKILLS_FISHING:
case SKILLS_ALCHEMY:
case SKILLS_CROSSBOWS:
case SKILLS_TRIDENTS:
case COOLDOWN_BERSERK:
case COOLDOWN_GIGA_DRILL_BREAKER:
case COOLDOWN_TREE_FELLER:
case COOLDOWN_GREEN_TERRA:
case COOLDOWN_SERRATED_STRIKES:
case COOLDOWN_SKULL_SPLITTER:
case COOLDOWN_SUPER_BREAKER:
case COOLDOWN_BLAST_MINING:
case SCOREBOARD_TIPS:
case COOLDOWN_CHIMAERA_WING:
case COOLDOWN_SUPER_SHOTGUN:
case COOLDOWN_TRIDENTS:
case COOLDOWN_ARCHERY:
return ExpectedType.INTEGER;
case EXP_MINING:
case EXP_WOODCUTTING:
case EXP_REPAIR:
case EXP_UNARMED:
case EXP_HERBALISM:
case EXP_EXCAVATION:
case EXP_ARCHERY:
case EXP_SWORDS:
case EXP_AXES:
case EXP_ACROBATICS:
case EXP_TAMING:
case EXP_FISHING:
case EXP_ALCHEMY:
case EXP_CROSSBOWS:
case EXP_TRIDENTS:
return ExpectedType.FLOAT;
case UUID_INDEX:
return ExpectedType.UUID;
case OVERHAUL_LAST_LOGIN:
return ExpectedType.LONG;
}
throw new IndexOutOfBoundsException();
} }
public @NotNull List<FlatFileDataContainer> getFlatFileDataContainers() { public @NotNull List<FlatFileDataContainer> getFlatFileDataContainers() {
@ -342,7 +300,7 @@ public class FlatFileDataProcessor {
//We add a trailing : as it is needed for some reason (is it?) //We add a trailing : as it is needed for some reason (is it?)
//TODO: Is the trailing ":" actually necessary? //TODO: Is the trailing ":" actually necessary?
String fromSplit = org.apache.commons.lang.StringUtils.join(splitData, ":") + ":"; String fromSplit = org.apache.commons.lang3.StringUtils.join(splitData, ":") + ":";
stringBuilder.append(fromSplit).append("\r\n"); stringBuilder.append(fromSplit).append("\r\n");
} }

View File

@ -87,8 +87,11 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
public static final int COOLDOWN_SUPER_SHOTGUN = 49; public static final int COOLDOWN_SUPER_SHOTGUN = 49;
public static final int COOLDOWN_TRIDENTS = 50; public static final int COOLDOWN_TRIDENTS = 50;
public static final int COOLDOWN_ARCHERY = 51; public static final int COOLDOWN_ARCHERY = 51;
public static final int EXP_MACES = 52;
public static final int SKILLS_MACES = 53;
public static final int COOLDOWN_MACES = 54;
//Update this everytime new data is added //Update this everytime new data is added
public static final int DATA_ENTRY_COUNT = COOLDOWN_ARCHERY + 1; public static final int DATA_ENTRY_COUNT = COOLDOWN_MACES + 1;
FlatFileDatabaseManager(@NotNull File usersFile, @NotNull Logger logger, long purgeTime, int startingLevel, boolean testing) { FlatFileDatabaseManager(@NotNull File usersFile, @NotNull Logger logger, long purgeTime, int startingLevel, boolean testing) {
this.usersFile = usersFile; this.usersFile = usersFile;
@ -149,8 +152,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
// If they're still around, rewrite them to the file. // If they're still around, rewrite them to the file.
if (!powerless) { if (!powerless) {
writer.append(line).append("\r\n"); writer.append(line).append("\r\n");
} } else {
else {
purgedUsers++; purgedUsers++;
} }
} }
@ -231,7 +233,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
if (rewrite) { if (rewrite) {
// Rewrite their data with a valid time // Rewrite their data with a valid time
character[OVERHAUL_LAST_LOGIN] = Long.toString(lastPlayed); character[OVERHAUL_LAST_LOGIN] = Long.toString(lastPlayed);
String newLine = org.apache.commons.lang.StringUtils.join(character, ":"); String newLine = org.apache.commons.lang3.StringUtils.join(character, ":");
writer.append(newLine).append("\r\n"); writer.append(newLine).append("\r\n");
} else { } else {
writer.append(line).append("\r\n"); writer.append(line).append("\r\n");
@ -478,6 +480,18 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.CROSSBOWS))).append(":"); appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.CROSSBOWS))).append(":");
appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.TRIDENTS))).append(":"); appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.TRIDENTS))).append(":");
appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.TRIDENTS))).append(":"); appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.TRIDENTS))).append(":");
// public static final int COOLDOWN_SUPER_SHOTGUN = 49;
appendable.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.SUPER_SHOTGUN))).append(":");
// public static final int COOLDOWN_TRIDENTS = 50;
appendable.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.TRIDENTS_SUPER_ABILITY))).append(":");
// public static final int COOLDOWN_ARCHERY = 51;
appendable.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.EXPLOSIVE_SHOT))).append(":");
// public static final int EXP_MACES = 52;
appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.MACES))).append(":");
// public static final int SKILLS_MACES = 53;
appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.MACES))).append(":");
// public static final int COOLDOWN_MACES = 54;
appendable.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.MACES_SUPER_ABILITY))).append(":");
appendable.append("\r\n"); appendable.append("\r\n");
} }
@ -890,7 +904,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
} }
character[UUID_INDEX] = fetchedUUIDs.remove(character[USERNAME_INDEX]).toString(); character[UUID_INDEX] = fetchedUUIDs.remove(character[USERNAME_INDEX]).toString();
line = org.apache.commons.lang.StringUtils.join(character, ":") + ":"; line = org.apache.commons.lang3.StringUtils.join(character, ":") + ":";
} }
i++; i++;
@ -987,6 +1001,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
List<PlayerStat> alchemy = new ArrayList<>(); List<PlayerStat> alchemy = new ArrayList<>();
List<PlayerStat> crossbows = new ArrayList<>(); List<PlayerStat> crossbows = new ArrayList<>();
List<PlayerStat> tridents = new ArrayList<>(); List<PlayerStat> tridents = new ArrayList<>();
List<PlayerStat> maces = new ArrayList<>();
BufferedReader in = null; BufferedReader in = null;
String playerName = null; String playerName = null;
@ -1022,6 +1037,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
powerLevel += putStat(woodcutting, playerName, skills.get(PrimarySkillType.WOODCUTTING)); powerLevel += putStat(woodcutting, playerName, skills.get(PrimarySkillType.WOODCUTTING));
powerLevel += putStat(crossbows, playerName, skills.get(PrimarySkillType.CROSSBOWS)); powerLevel += putStat(crossbows, playerName, skills.get(PrimarySkillType.CROSSBOWS));
powerLevel += putStat(tridents, playerName, skills.get(PrimarySkillType.TRIDENTS)); powerLevel += putStat(tridents, playerName, skills.get(PrimarySkillType.TRIDENTS));
powerLevel += putStat(maces, playerName, skills.get(PrimarySkillType.MACES));
putStat(powerLevels, playerName, powerLevel); putStat(powerLevels, playerName, powerLevel);
} }
@ -1059,6 +1075,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
alchemy.sort(c); alchemy.sort(c);
crossbows.sort(c); crossbows.sort(c);
tridents.sort(c); tridents.sort(c);
maces.sort(c);
powerLevels.sort(c); powerLevels.sort(c);
playerStatHash.put(PrimarySkillType.MINING, mining); playerStatHash.put(PrimarySkillType.MINING, mining);
@ -1076,6 +1093,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
playerStatHash.put(PrimarySkillType.ALCHEMY, alchemy); playerStatHash.put(PrimarySkillType.ALCHEMY, alchemy);
playerStatHash.put(PrimarySkillType.CROSSBOWS, crossbows); playerStatHash.put(PrimarySkillType.CROSSBOWS, crossbows);
playerStatHash.put(PrimarySkillType.TRIDENTS, tridents); playerStatHash.put(PrimarySkillType.TRIDENTS, tridents);
playerStatHash.put(PrimarySkillType.MACES, maces);
return LeaderboardStatus.UPDATED; return LeaderboardStatus.UPDATED;
} }
@ -1239,6 +1257,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.ALCHEMY, EXP_ALCHEMY, username); tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.ALCHEMY, EXP_ALCHEMY, username);
tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.CROSSBOWS, EXP_CROSSBOWS, username); tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.CROSSBOWS, EXP_CROSSBOWS, username);
tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.TRIDENTS, EXP_TRIDENTS, username); tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.TRIDENTS, EXP_TRIDENTS, username);
tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.MACES, EXP_MACES, username);
// Taming - Unused // Taming - Unused
tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.SUPER_BREAKER, COOLDOWN_SUPER_BREAKER, username); tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.SUPER_BREAKER, COOLDOWN_SUPER_BREAKER, username);
@ -1254,6 +1273,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.BLAST_MINING, COOLDOWN_BLAST_MINING, username); tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.BLAST_MINING, COOLDOWN_BLAST_MINING, username);
tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.SUPER_SHOTGUN, COOLDOWN_SUPER_SHOTGUN, username); tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.SUPER_SHOTGUN, COOLDOWN_SUPER_SHOTGUN, username);
tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.TRIDENTS_SUPER_ABILITY, COOLDOWN_TRIDENTS, username); tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.TRIDENTS_SUPER_ABILITY, COOLDOWN_TRIDENTS, username);
tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.MACES_SUPER_ABILITY, COOLDOWN_MACES, username);
UUID uuid; UUID uuid;
try { try {
@ -1343,6 +1363,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager {
tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.ALCHEMY, SKILLS_ALCHEMY, username); tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.ALCHEMY, SKILLS_ALCHEMY, username);
tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.CROSSBOWS, SKILLS_CROSSBOWS, username); tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.CROSSBOWS, SKILLS_CROSSBOWS, username);
tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.TRIDENTS, SKILLS_TRIDENTS, username); tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.TRIDENTS, SKILLS_TRIDENTS, username);
tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.MACES, SKILLS_MACES, username);
return skills; return skills;
} }

View File

@ -169,7 +169,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
+ "taming = 0 AND mining = 0 AND woodcutting = 0 AND repair = 0 " + "taming = 0 AND mining = 0 AND woodcutting = 0 AND repair = 0 "
+ "AND unarmed = 0 AND herbalism = 0 AND excavation = 0 AND " + "AND unarmed = 0 AND herbalism = 0 AND excavation = 0 AND "
+ "archery = 0 AND swords = 0 AND axes = 0 AND acrobatics = 0 " + "archery = 0 AND swords = 0 AND axes = 0 AND acrobatics = 0 "
+ "AND fishing = 0 AND alchemy = 0 AND crossbows = 0 AND tridents = 0;"); + "AND fishing = 0 AND alchemy = 0 AND crossbows = 0 AND tridents = 0 AND maces = 0;");
statement.executeUpdate("DELETE FROM `" + tablePrefix + "experience` WHERE NOT EXISTS (SELECT * FROM `" + tablePrefix + "skills` `s` WHERE `" + tablePrefix + "experience`.`user_id` = `s`.`user_id`)"); statement.executeUpdate("DELETE FROM `" + tablePrefix + "experience` WHERE NOT EXISTS (SELECT * FROM `" + tablePrefix + "skills` `s` WHERE `" + tablePrefix + "experience`.`user_id` = `s`.`user_id`)");
statement.executeUpdate("DELETE FROM `" + tablePrefix + "huds` WHERE NOT EXISTS (SELECT * FROM `" + tablePrefix + "skills` `s` WHERE `" + tablePrefix + "huds`.`user_id` = `s`.`user_id`)"); statement.executeUpdate("DELETE FROM `" + tablePrefix + "huds` WHERE NOT EXISTS (SELECT * FROM `" + tablePrefix + "skills` `s` WHERE `" + tablePrefix + "huds`.`user_id` = `s`.`user_id`)");
@ -291,7 +291,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
+ " taming = ?, mining = ?, repair = ?, woodcutting = ?" + " taming = ?, mining = ?, repair = ?, woodcutting = ?"
+ ", unarmed = ?, herbalism = ?, excavation = ?" + ", unarmed = ?, herbalism = ?, excavation = ?"
+ ", archery = ?, swords = ?, axes = ?, acrobatics = ?" + ", archery = ?, swords = ?, axes = ?, acrobatics = ?"
+ ", fishing = ?, alchemy = ?, crossbows = ?, tridents = ?, total = ? WHERE user_id = ?"); + ", fishing = ?, alchemy = ?, crossbows = ?, tridents = ?, maces = ?, total = ? WHERE user_id = ?");
statement.setInt(1, profile.getSkillLevel(PrimarySkillType.TAMING)); statement.setInt(1, profile.getSkillLevel(PrimarySkillType.TAMING));
statement.setInt(2, profile.getSkillLevel(PrimarySkillType.MINING)); statement.setInt(2, profile.getSkillLevel(PrimarySkillType.MINING));
statement.setInt(3, profile.getSkillLevel(PrimarySkillType.REPAIR)); statement.setInt(3, profile.getSkillLevel(PrimarySkillType.REPAIR));
@ -307,11 +307,12 @@ public final class SQLDatabaseManager implements DatabaseManager {
statement.setInt(13, profile.getSkillLevel(PrimarySkillType.ALCHEMY)); statement.setInt(13, profile.getSkillLevel(PrimarySkillType.ALCHEMY));
statement.setInt(14, profile.getSkillLevel(PrimarySkillType.CROSSBOWS)); statement.setInt(14, profile.getSkillLevel(PrimarySkillType.CROSSBOWS));
statement.setInt(15, profile.getSkillLevel(PrimarySkillType.TRIDENTS)); statement.setInt(15, profile.getSkillLevel(PrimarySkillType.TRIDENTS));
statement.setInt(16, profile.getSkillLevel(PrimarySkillType.MACES));
int total = 0; int total = 0;
for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS)
total += profile.getSkillLevel(primarySkillType); total += profile.getSkillLevel(primarySkillType);
statement.setInt(16, total); statement.setInt(17, total);
statement.setInt(17, id); statement.setInt(18, id);
success &= (statement.executeUpdate() != 0); success &= (statement.executeUpdate() != 0);
statement.close(); statement.close();
if (!success) { if (!success) {
@ -323,7 +324,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
+ " taming = ?, mining = ?, repair = ?, woodcutting = ?" + " taming = ?, mining = ?, repair = ?, woodcutting = ?"
+ ", unarmed = ?, herbalism = ?, excavation = ?" + ", unarmed = ?, herbalism = ?, excavation = ?"
+ ", archery = ?, swords = ?, axes = ?, acrobatics = ?" + ", archery = ?, swords = ?, axes = ?, acrobatics = ?"
+ ", fishing = ?, alchemy = ?, crossbows = ?, tridents = ? WHERE user_id = ?"); + ", fishing = ?, alchemy = ?, crossbows = ?, tridents = ?, maces = ? WHERE user_id = ?");
statement.setInt(1, profile.getSkillXpLevel(PrimarySkillType.TAMING)); statement.setInt(1, profile.getSkillXpLevel(PrimarySkillType.TAMING));
statement.setInt(2, profile.getSkillXpLevel(PrimarySkillType.MINING)); statement.setInt(2, profile.getSkillXpLevel(PrimarySkillType.MINING));
statement.setInt(3, profile.getSkillXpLevel(PrimarySkillType.REPAIR)); statement.setInt(3, profile.getSkillXpLevel(PrimarySkillType.REPAIR));
@ -339,7 +340,8 @@ public final class SQLDatabaseManager implements DatabaseManager {
statement.setInt(13, profile.getSkillXpLevel(PrimarySkillType.ALCHEMY)); statement.setInt(13, profile.getSkillXpLevel(PrimarySkillType.ALCHEMY));
statement.setInt(14, profile.getSkillXpLevel(PrimarySkillType.CROSSBOWS)); statement.setInt(14, profile.getSkillXpLevel(PrimarySkillType.CROSSBOWS));
statement.setInt(15, profile.getSkillXpLevel(PrimarySkillType.TRIDENTS)); statement.setInt(15, profile.getSkillXpLevel(PrimarySkillType.TRIDENTS));
statement.setInt(16, id); statement.setInt(16, profile.getSkillXpLevel(PrimarySkillType.MACES));
statement.setInt(17, id);
success &= (statement.executeUpdate() != 0); success &= (statement.executeUpdate() != 0);
statement.close(); statement.close();
if (!success) { if (!success) {
@ -350,7 +352,8 @@ public final class SQLDatabaseManager implements DatabaseManager {
statement = connection.prepareStatement("UPDATE " + tablePrefix + "cooldowns SET " statement = connection.prepareStatement("UPDATE " + tablePrefix + "cooldowns SET "
+ " mining = ?, woodcutting = ?, unarmed = ?" + " mining = ?, woodcutting = ?, unarmed = ?"
+ ", herbalism = ?, excavation = ?, swords = ?" + ", herbalism = ?, excavation = ?, swords = ?"
+ ", axes = ?, blast_mining = ?, chimaera_wing = ?, crossbows = ?, tridents = ? WHERE user_id = ?"); + ", axes = ?, blast_mining = ?, chimaera_wing = ?, crossbows = ?"
+ ", tridents = ?, maces = ? WHERE user_id = ?");
statement.setLong(1, profile.getAbilityDATS(SuperAbilityType.SUPER_BREAKER)); statement.setLong(1, profile.getAbilityDATS(SuperAbilityType.SUPER_BREAKER));
statement.setLong(2, profile.getAbilityDATS(SuperAbilityType.TREE_FELLER)); statement.setLong(2, profile.getAbilityDATS(SuperAbilityType.TREE_FELLER));
statement.setLong(3, profile.getAbilityDATS(SuperAbilityType.BERSERK)); statement.setLong(3, profile.getAbilityDATS(SuperAbilityType.BERSERK));
@ -362,7 +365,8 @@ public final class SQLDatabaseManager implements DatabaseManager {
statement.setLong(9, profile.getUniqueData(UniqueDataType.CHIMAERA_WING_DATS)); statement.setLong(9, profile.getUniqueData(UniqueDataType.CHIMAERA_WING_DATS));
statement.setLong(10, profile.getAbilityDATS(SuperAbilityType.SUPER_SHOTGUN)); statement.setLong(10, profile.getAbilityDATS(SuperAbilityType.SUPER_SHOTGUN));
statement.setLong(11, profile.getAbilityDATS(SuperAbilityType.TRIDENTS_SUPER_ABILITY)); statement.setLong(11, profile.getAbilityDATS(SuperAbilityType.TRIDENTS_SUPER_ABILITY));
statement.setInt(12, id); statement.setLong(12, profile.getAbilityDATS(SuperAbilityType.MACES_SUPER_ABILITY));
statement.setInt(13, id);
success = (statement.executeUpdate() != 0); success = (statement.executeUpdate() != 0);
statement.close(); statement.close();
if (!success) { if (!success) {
@ -648,9 +652,9 @@ public final class SQLDatabaseManager implements DatabaseManager {
statement = connection.prepareStatement( statement = connection.prepareStatement(
"SELECT " + "SELECT " +
"s.taming, s.mining, s.repair, s.woodcutting, s.unarmed, s.herbalism, s.excavation, s.archery, s.swords, s.axes, s.acrobatics, s.fishing, s.alchemy, s.crossbows, s.tridents, " + "s.taming, s.mining, s.repair, s.woodcutting, s.unarmed, s.herbalism, s.excavation, s.archery, s.swords, s.axes, s.acrobatics, s.fishing, s.alchemy, s.crossbows, s.tridents, s.maces, " +
"e.taming, e.mining, e.repair, e.woodcutting, e.unarmed, e.herbalism, e.excavation, e.archery, e.swords, e.axes, e.acrobatics, e.fishing, e.alchemy, e.crossbows, e.tridents, " + "e.taming, e.mining, e.repair, e.woodcutting, e.unarmed, e.herbalism, e.excavation, e.archery, e.swords, e.axes, e.acrobatics, e.fishing, e.alchemy, e.crossbows, e.tridents, e.maces, " +
"c.taming, c.mining, c.repair, c.woodcutting, c.unarmed, c.herbalism, c.excavation, c.archery, c.swords, c.axes, c.acrobatics, c.blast_mining, c.chimaera_wing, c.crossbows, c.tridents, " + "c.taming, c.mining, c.repair, c.woodcutting, c.unarmed, c.herbalism, c.excavation, c.archery, c.swords, c.axes, c.acrobatics, c.blast_mining, c.chimaera_wing, c.crossbows, c.tridents, c.maces, " +
"h.mobhealthbar, h.scoreboardtips, u.uuid, u.`user` " "h.mobhealthbar, h.scoreboardtips, u.uuid, u.`user` "
+ "FROM " + tablePrefix + "users u " + "FROM " + tablePrefix + "users u "
+ "JOIN " + tablePrefix + "skills s ON (u.id = s.user_id) " + "JOIN " + tablePrefix + "skills s ON (u.id = s.user_id) "
@ -922,6 +926,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
+ "`chimaera_wing` int(32) unsigned NOT NULL DEFAULT '0'," + "`chimaera_wing` int(32) unsigned NOT NULL DEFAULT '0',"
+ "`crossbows` int(32) unsigned NOT NULL DEFAULT '0'," + "`crossbows` int(32) unsigned NOT NULL DEFAULT '0',"
+ "`tridents` int(32) unsigned NOT NULL DEFAULT '0'," + "`tridents` int(32) unsigned NOT NULL DEFAULT '0',"
+ "`maces` int(32) unsigned NOT NULL DEFAULT '0',"
+ "PRIMARY KEY (`user_id`)) " + "PRIMARY KEY (`user_id`)) "
+ "DEFAULT CHARSET=" + CHARSET_SQL + ";"); + "DEFAULT CHARSET=" + CHARSET_SQL + ";");
tryClose(createStatement); tryClose(createStatement);
@ -950,6 +955,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
+ "`alchemy` int(10) unsigned NOT NULL DEFAULT "+startingLevel+"," + "`alchemy` int(10) unsigned NOT NULL DEFAULT "+startingLevel+","
+ "`crossbows` int(10) unsigned NOT NULL DEFAULT "+startingLevel+"," + "`crossbows` int(10) unsigned NOT NULL DEFAULT "+startingLevel+","
+ "`tridents` int(10) unsigned NOT NULL DEFAULT "+startingLevel+"," + "`tridents` int(10) unsigned NOT NULL DEFAULT "+startingLevel+","
+ "`maces` int(10) unsigned NOT NULL DEFAULT "+startingLevel+","
+ "`total` int(10) unsigned NOT NULL DEFAULT "+totalLevel+"," + "`total` int(10) unsigned NOT NULL DEFAULT "+totalLevel+","
+ "PRIMARY KEY (`user_id`)) " + "PRIMARY KEY (`user_id`)) "
+ "DEFAULT CHARSET=" + CHARSET_SQL + ";"); + "DEFAULT CHARSET=" + CHARSET_SQL + ";");
@ -1017,20 +1023,24 @@ public final class SQLDatabaseManager implements DatabaseManager {
tryClose(connection); tryClose(connection);
} }
String skills = "skills"; final String skills = "skills";
String crossbows = "crossbows"; final String crossbows = "crossbows";
String tridents = "tridents"; final String tridents = "tridents";
String experience = "experience"; final String maces = "maces";
String cooldowns = "cooldowns"; final String experience = "experience";
final String cooldowns = "cooldowns";
updateStructure(skills, crossbows, String.valueOf(32)); updateStructure(skills, crossbows, String.valueOf(32));
updateStructure(skills, tridents, String.valueOf(32)); updateStructure(skills, tridents, String.valueOf(32));
updateStructure(skills, maces, String.valueOf(32));
updateStructure(experience, crossbows, String.valueOf(10)); updateStructure(experience, crossbows, String.valueOf(10));
updateStructure(experience, tridents, String.valueOf(10)); updateStructure(experience, tridents, String.valueOf(10));
updateStructure(experience, maces, String.valueOf(10));
updateStructure(cooldowns, crossbows, String.valueOf(10)); updateStructure(cooldowns, crossbows, String.valueOf(10));
updateStructure(cooldowns, tridents, String.valueOf(10)); updateStructure(cooldowns, tridents, String.valueOf(10));
updateStructure(cooldowns, maces, String.valueOf(10));
} }
private void updateStructure(String tableName, String columnName, String columnSize) { private void updateStructure(String tableName, String columnName, String columnSize) {
@ -1213,15 +1223,14 @@ public final class SQLDatabaseManager implements DatabaseManager {
Map<PrimarySkillType, Float> skillsXp = new EnumMap<>(PrimarySkillType.class); // Skill & XP Map<PrimarySkillType, Float> skillsXp = new EnumMap<>(PrimarySkillType.class); // Skill & XP
Map<SuperAbilityType, Integer> skillsDATS = new EnumMap<>(SuperAbilityType.class); // Ability & Cooldown Map<SuperAbilityType, Integer> skillsDATS = new EnumMap<>(SuperAbilityType.class); // Ability & Cooldown
Map<UniqueDataType, Integer> uniqueData = new EnumMap<>(UniqueDataType.class); //Chimaera wing cooldown and other misc info Map<UniqueDataType, Integer> uniqueData = new EnumMap<>(UniqueDataType.class); //Chimaera wing cooldown and other misc info
MobHealthbarType mobHealthbarType;
UUID uuid; UUID uuid;
int scoreboardTipsShown; int scoreboardTipsShown;
final int OFFSET_SKILLS = 0; // TODO update these numbers when the query final int OFFSET_SKILLS = 0; // TODO update these numbers when the query
// changes (a new skill is added) // changes (a new skill is added)
final int OFFSET_XP = 15; final int OFFSET_XP = 16;
final int OFFSET_DATS = 28; final int OFFSET_DATS = 29;
final int OFFSET_OTHER = 41; final int OFFSET_OTHER = 42;
skills.put(PrimarySkillType.TAMING, result.getInt(OFFSET_SKILLS + 1)); skills.put(PrimarySkillType.TAMING, result.getInt(OFFSET_SKILLS + 1));
skills.put(PrimarySkillType.MINING, result.getInt(OFFSET_SKILLS + 2)); skills.put(PrimarySkillType.MINING, result.getInt(OFFSET_SKILLS + 2));
@ -1238,6 +1247,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
skills.put(PrimarySkillType.ALCHEMY, result.getInt(OFFSET_SKILLS + 13)); skills.put(PrimarySkillType.ALCHEMY, result.getInt(OFFSET_SKILLS + 13));
skills.put(PrimarySkillType.CROSSBOWS, result.getInt(OFFSET_SKILLS + 14)); skills.put(PrimarySkillType.CROSSBOWS, result.getInt(OFFSET_SKILLS + 14));
skills.put(PrimarySkillType.TRIDENTS, result.getInt(OFFSET_SKILLS + 15)); skills.put(PrimarySkillType.TRIDENTS, result.getInt(OFFSET_SKILLS + 15));
skills.put(PrimarySkillType.MACES, result.getInt(OFFSET_SKILLS + 16));
skillsXp.put(PrimarySkillType.TAMING, result.getFloat(OFFSET_XP + 1)); skillsXp.put(PrimarySkillType.TAMING, result.getFloat(OFFSET_XP + 1));
skillsXp.put(PrimarySkillType.MINING, result.getFloat(OFFSET_XP + 2)); skillsXp.put(PrimarySkillType.MINING, result.getFloat(OFFSET_XP + 2));
@ -1254,6 +1264,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
skillsXp.put(PrimarySkillType.ALCHEMY, result.getFloat(OFFSET_XP + 13)); skillsXp.put(PrimarySkillType.ALCHEMY, result.getFloat(OFFSET_XP + 13));
skillsXp.put(PrimarySkillType.CROSSBOWS, result.getFloat(OFFSET_XP + 14)); skillsXp.put(PrimarySkillType.CROSSBOWS, result.getFloat(OFFSET_XP + 14));
skillsXp.put(PrimarySkillType.TRIDENTS, result.getFloat(OFFSET_XP + 15)); skillsXp.put(PrimarySkillType.TRIDENTS, result.getFloat(OFFSET_XP + 15));
skillsXp.put(PrimarySkillType.MACES, result.getFloat(OFFSET_XP + 16));
// Taming - Unused - result.getInt(OFFSET_DATS + 1) // Taming - Unused - result.getInt(OFFSET_DATS + 1)
skillsDATS.put(SuperAbilityType.SUPER_BREAKER, result.getInt(OFFSET_DATS + 2)); skillsDATS.put(SuperAbilityType.SUPER_BREAKER, result.getInt(OFFSET_DATS + 2));
@ -1262,6 +1273,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
skillsDATS.put(SuperAbilityType.BERSERK, result.getInt(OFFSET_DATS + 5)); skillsDATS.put(SuperAbilityType.BERSERK, result.getInt(OFFSET_DATS + 5));
skillsDATS.put(SuperAbilityType.GREEN_TERRA, result.getInt(OFFSET_DATS + 6)); skillsDATS.put(SuperAbilityType.GREEN_TERRA, result.getInt(OFFSET_DATS + 6));
skillsDATS.put(SuperAbilityType.GIGA_DRILL_BREAKER, result.getInt(OFFSET_DATS + 7)); skillsDATS.put(SuperAbilityType.GIGA_DRILL_BREAKER, result.getInt(OFFSET_DATS + 7));
skillsDATS.put(SuperAbilityType.EXPLOSIVE_SHOT, result.getInt(OFFSET_DATS + 8));
// Archery - Unused - result.getInt(OFFSET_DATS + 8) // Archery - Unused - result.getInt(OFFSET_DATS + 8)
skillsDATS.put(SuperAbilityType.SERRATED_STRIKES, result.getInt(OFFSET_DATS + 9)); skillsDATS.put(SuperAbilityType.SERRATED_STRIKES, result.getInt(OFFSET_DATS + 9));
skillsDATS.put(SuperAbilityType.SKULL_SPLITTER, result.getInt(OFFSET_DATS + 10)); skillsDATS.put(SuperAbilityType.SKULL_SPLITTER, result.getInt(OFFSET_DATS + 10));
@ -1270,6 +1282,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
uniqueData.put(UniqueDataType.CHIMAERA_WING_DATS, result.getInt(OFFSET_DATS + 13)); uniqueData.put(UniqueDataType.CHIMAERA_WING_DATS, result.getInt(OFFSET_DATS + 13));
skillsDATS.put(SuperAbilityType.SUPER_SHOTGUN, result.getInt(OFFSET_DATS + 14)); skillsDATS.put(SuperAbilityType.SUPER_SHOTGUN, result.getInt(OFFSET_DATS + 14));
skillsDATS.put(SuperAbilityType.TRIDENTS_SUPER_ABILITY, result.getInt(OFFSET_DATS + 15)); skillsDATS.put(SuperAbilityType.TRIDENTS_SUPER_ABILITY, result.getInt(OFFSET_DATS + 15));
skillsDATS.put(SuperAbilityType.MACES_SUPER_ABILITY, result.getInt(OFFSET_DATS + 16));
try { try {
scoreboardTipsShown = result.getInt(OFFSET_OTHER + 2); scoreboardTipsShown = result.getInt(OFFSET_OTHER + 2);

View File

@ -56,67 +56,29 @@ public class FlatFileDataUtil {
* @return the "zero" initialized data corresponding to the index * @return the "zero" initialized data corresponding to the index
*/ */
public static @NotNull String getZeroInitialisedData(int index, int startingLevel) throws IndexOutOfBoundsException { public static @NotNull String getZeroInitialisedData(int index, int startingLevel) throws IndexOutOfBoundsException {
switch(index) { //TODO: Add UUID recovery? Might not even be worth it.
case USERNAME_INDEX: return switch (index) {
return LEGACY_INVALID_OLD_USERNAME; //We'll keep using this value for legacy compatibility reasons (not sure if needed but don't care) case USERNAME_INDEX ->
case 2: //Assumption: Used to be for something, no longer used LEGACY_INVALID_OLD_USERNAME; //We'll keep using this value for legacy compatibility reasons (not sure if needed but don't care)
case 3: //Assumption: Used to be for something, no longer used //Assumption: Used to be for something, no longer used
case 23: //Assumption: Used to be used for something, no longer used //Assumption: Used to be for something, no longer used
case 33: //Assumption: Used to be used for something, no longer used //Assumption: Used to be used for something, no longer used
case LEGACY_LAST_LOGIN: //Assumption: Used to be used for something, no longer used
case HEALTHBAR: case 2, 3, 23, 33, LEGACY_LAST_LOGIN, HEALTHBAR -> "IGNORED";
return "IGNORED"; case SKILLS_MINING, SKILLS_REPAIR, SKILLS_UNARMED, SKILLS_HERBALISM, SKILLS_EXCAVATION, SKILLS_ARCHERY,
case SKILLS_MINING: SKILLS_SWORDS, SKILLS_AXES, SKILLS_WOODCUTTING, SKILLS_ACROBATICS, SKILLS_TAMING, SKILLS_FISHING,
case SKILLS_REPAIR: SKILLS_ALCHEMY, SKILLS_CROSSBOWS, SKILLS_TRIDENTS, SKILLS_MACES -> String.valueOf(startingLevel);
case SKILLS_UNARMED: case OVERHAUL_LAST_LOGIN -> String.valueOf(-1L);
case SKILLS_HERBALISM: case COOLDOWN_BERSERK, COOLDOWN_GIGA_DRILL_BREAKER, COOLDOWN_TREE_FELLER, COOLDOWN_GREEN_TERRA,
case SKILLS_EXCAVATION: COOLDOWN_SERRATED_STRIKES, COOLDOWN_SKULL_SPLITTER, COOLDOWN_SUPER_BREAKER, COOLDOWN_BLAST_MINING,
case SKILLS_ARCHERY: COOLDOWN_SUPER_SHOTGUN, COOLDOWN_TRIDENTS, COOLDOWN_ARCHERY, COOLDOWN_MACES, SCOREBOARD_TIPS, COOLDOWN_CHIMAERA_WING,
case SKILLS_SWORDS: EXP_MINING, EXP_WOODCUTTING, EXP_REPAIR, EXP_UNARMED, EXP_HERBALISM, EXP_EXCAVATION, EXP_ARCHERY,
case SKILLS_AXES: EXP_SWORDS, EXP_AXES, EXP_ACROBATICS, EXP_TAMING, EXP_FISHING, EXP_ALCHEMY, EXP_CROSSBOWS,
case SKILLS_WOODCUTTING: EXP_TRIDENTS, EXP_MACES -> "0";
case SKILLS_ACROBATICS: case UUID_INDEX ->
case SKILLS_TAMING:
case SKILLS_FISHING:
case SKILLS_ALCHEMY:
case SKILLS_CROSSBOWS:
case SKILLS_TRIDENTS:
return String.valueOf(startingLevel);
case OVERHAUL_LAST_LOGIN:
return String.valueOf(-1L);
case COOLDOWN_BERSERK:
case COOLDOWN_GIGA_DRILL_BREAKER:
case COOLDOWN_TREE_FELLER:
case COOLDOWN_GREEN_TERRA:
case COOLDOWN_SERRATED_STRIKES:
case COOLDOWN_SKULL_SPLITTER:
case COOLDOWN_SUPER_BREAKER:
case COOLDOWN_BLAST_MINING:
case COOLDOWN_SUPER_SHOTGUN:
case COOLDOWN_TRIDENTS:
case COOLDOWN_ARCHERY:
case SCOREBOARD_TIPS:
case COOLDOWN_CHIMAERA_WING:
case EXP_MINING:
case EXP_WOODCUTTING:
case EXP_REPAIR:
case EXP_UNARMED:
case EXP_HERBALISM:
case EXP_EXCAVATION:
case EXP_ARCHERY:
case EXP_SWORDS:
case EXP_AXES:
case EXP_ACROBATICS:
case EXP_TAMING:
case EXP_FISHING:
case EXP_ALCHEMY:
case EXP_CROSSBOWS:
case EXP_TRIDENTS:
return "0";
case UUID_INDEX:
throw new IndexOutOfBoundsException(); //TODO: Add UUID recovery? Might not even be worth it. throw new IndexOutOfBoundsException(); //TODO: Add UUID recovery? Might not even be worth it.
} default -> throw new IndexOutOfBoundsException();
};
throw new IndexOutOfBoundsException();
} }
} }

View File

@ -14,8 +14,7 @@ public enum DatabaseType {
if (typeName.equalsIgnoreCase("file")) { if (typeName.equalsIgnoreCase("file")) {
return FLATFILE; return FLATFILE;
} } else if (typeName.equalsIgnoreCase("mysql")) {
else if (typeName.equalsIgnoreCase("mysql")) {
return SQL; return SQL;
} }

View File

@ -33,8 +33,7 @@ public class SkillXpGain implements Delayed {
public int compareTo(SkillXpGain other) { public int compareTo(SkillXpGain other) {
if (this.expiryTime < other.expiryTime) { if (this.expiryTime < other.expiryTime) {
return -1; return -1;
} } else if (this.expiryTime > other.expiryTime) {
else if (this.expiryTime > other.expiryTime) {
return 1; return 1;
} }
return 0; return 0;

View File

@ -8,10 +8,8 @@ public class McMMOUrl {
public static final String urlSpigot = "https://spigot.mcmmo.org"; public static final String urlSpigot = "https://spigot.mcmmo.org";
public static final String urlTranslate = "https://translate.mcmmo.org/"; public static final String urlTranslate = "https://translate.mcmmo.org/";
public static String getUrl(McMMOWebLinks webLinks) public static String getUrl(McMMOWebLinks webLinks) {
{ switch(webLinks) {
switch(webLinks)
{
case WIKI: case WIKI:
return urlWiki; return urlWiki;
case PATREON: case PATREON:

View File

@ -11,20 +11,16 @@ public enum McMMOWebLinks {
HELP_TRANSLATE, HELP_TRANSLATE,
WIKI; WIKI;
public String getUrl() public String getUrl() {
{
return McMMOUrl.getUrl(this); return McMMOUrl.getUrl(this);
} }
public String getNiceTitle() public String getNiceTitle() {
{
return StringUtils.getCapitalized(toString()); return StringUtils.getCapitalized(toString());
} }
public String getLocaleDescription() public String getLocaleDescription() {
{ switch (this) {
switch (this)
{
case WEBSITE: case WEBSITE:
return LocaleLoader.getString( "JSON.URL.Website"); return LocaleLoader.getString( "JSON.URL.Website");
case DISCORD: case DISCORD:

View File

@ -8,8 +8,7 @@ import org.bukkit.metadata.FixedMetadataValue;
*/ */
public class OldName extends FixedMetadataValue { public class OldName extends FixedMetadataValue {
public OldName(String oldName, mcMMO plugin) public OldName(String oldName, mcMMO plugin) {
{
super(plugin, oldName); super(plugin, oldName);
} }

View File

@ -15,17 +15,13 @@ public enum ItemShareType {
public static ItemShareType getShareType(ItemStack itemStack) { public static ItemShareType getShareType(ItemStack itemStack) {
if (ItemUtils.isMobDrop(itemStack)) { if (ItemUtils.isMobDrop(itemStack)) {
return LOOT; return LOOT;
} } else if (ItemUtils.isMiningDrop(itemStack)) {
else if (ItemUtils.isMiningDrop(itemStack)) {
return MINING; return MINING;
} } else if (ItemUtils.isHerbalismDrop(itemStack)) {
else if (ItemUtils.isHerbalismDrop(itemStack)) {
return HERBALISM; return HERBALISM;
} } else if (ItemUtils.isWoodcuttingDrop(itemStack)) {
else if (ItemUtils.isWoodcuttingDrop(itemStack)) {
return WOODCUTTING; return WOODCUTTING;
} } else if (ItemUtils.isMiscDrop(itemStack)) {
else if (ItemUtils.isMiscDrop(itemStack)) {
return MISC; return MISC;
} }

View File

@ -85,12 +85,10 @@ public class Party {
return onlineMembers; return onlineMembers;
} }
public List<Player> getVisibleMembers(Player player) public List<Player> getVisibleMembers(Player player) {
{
ArrayList<Player> visibleMembers = new ArrayList<>(); ArrayList<Player> visibleMembers = new ArrayList<>();
for(Player p : onlineMembers) for(Player p : onlineMembers) {
{
if (player.canSee(p)) if (player.canSee(p))
visibleMembers.add(p); visibleMembers.add(p);
} }

View File

@ -14,8 +14,7 @@ public enum ShareMode {
catch (IllegalArgumentException ex) { catch (IllegalArgumentException ex) {
if (string.equalsIgnoreCase("even")) { if (string.equalsIgnoreCase("even")) {
return EQUAL; return EQUAL;
} } else if (CommandUtils.shouldDisableToggle(string)) {
else if (CommandUtils.shouldDisableToggle(string)) {
return NONE; return NONE;
} }

View File

@ -32,6 +32,7 @@ import com.gmail.nossr50.skills.crossbows.CrossbowsManager;
import com.gmail.nossr50.skills.excavation.ExcavationManager; import com.gmail.nossr50.skills.excavation.ExcavationManager;
import com.gmail.nossr50.skills.fishing.FishingManager; import com.gmail.nossr50.skills.fishing.FishingManager;
import com.gmail.nossr50.skills.herbalism.HerbalismManager; import com.gmail.nossr50.skills.herbalism.HerbalismManager;
import com.gmail.nossr50.skills.maces.MacesManager;
import com.gmail.nossr50.skills.mining.MiningManager; import com.gmail.nossr50.skills.mining.MiningManager;
import com.gmail.nossr50.skills.repair.RepairManager; import com.gmail.nossr50.skills.repair.RepairManager;
import com.gmail.nossr50.skills.salvage.SalvageManager; import com.gmail.nossr50.skills.salvage.SalvageManager;
@ -71,6 +72,9 @@ import java.util.EnumMap;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import static com.gmail.nossr50.util.EventUtils.callPlayerAbilityActivateEvent;
import static java.util.Objects.requireNonNull;
public class McMMOPlayer implements Identified { public class McMMOPlayer implements Identified {
private final @NotNull Identity identity; private final @NotNull Identity identity;
@ -119,6 +123,8 @@ public class McMMOPlayer implements Identified {
private PrimarySkillType lastSkillShownScoreboard = PrimarySkillType.values()[0]; private PrimarySkillType lastSkillShownScoreboard = PrimarySkillType.values()[0];
public McMMOPlayer(Player player, PlayerProfile profile) { public McMMOPlayer(Player player, PlayerProfile profile) {
requireNonNull(player, "player cannot be null");
requireNonNull(profile, "profile cannot be null");
this.playerName = player.getName(); this.playerName = player.getName();
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
identity = Identity.identity(uuid); identity = Identity.identity(uuid);
@ -220,6 +226,9 @@ public class McMMOPlayer implements Identified {
case WOODCUTTING: case WOODCUTTING:
skillManagers.put(primarySkillType, new WoodcuttingManager(this)); skillManagers.put(primarySkillType, new WoodcuttingManager(this));
break; break;
case MACES:
skillManagers.put(primarySkillType, new MacesManager(this));
break;
default: default:
throw new InvalidSkillException("The skill named has no manager! Contact the devs!"); throw new InvalidSkillException("The skill named has no manager! Contact the devs!");
} }
@ -241,8 +250,7 @@ public class McMMOPlayer implements Identified {
this.lastSkillShownScoreboard = primarySkillType; this.lastSkillShownScoreboard = primarySkillType;
} }
public void processPostXpEvent(PrimarySkillType primarySkillType, Plugin plugin, XPGainSource xpGainSource) public void processPostXpEvent(PrimarySkillType primarySkillType, Plugin plugin, XPGainSource xpGainSource) {
{
//Check if they've reached the power level cap just now //Check if they've reached the power level cap just now
if (hasReachedPowerLevelCap()) { if (hasReachedPowerLevelCap()) {
NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.PowerLevel", String.valueOf(mcMMO.p.getGeneralConfig().getPowerLevelCap())); NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.PowerLevel", String.valueOf(mcMMO.p.getGeneralConfig().getPowerLevelCap()));
@ -263,19 +271,16 @@ public class McMMOPlayer implements Identified {
updateXPBar(primarySkillType, plugin); updateXPBar(primarySkillType, plugin);
} }
public void processUnlockNotifications(mcMMO plugin, PrimarySkillType primarySkillType, int skillLevel) public void processUnlockNotifications(mcMMO plugin, PrimarySkillType primarySkillType, int skillLevel) {
{
RankUtils.executeSkillUnlockNotifications(plugin, this, primarySkillType, skillLevel); RankUtils.executeSkillUnlockNotifications(plugin, this, primarySkillType, skillLevel);
} }
public void updateXPBar(PrimarySkillType primarySkillType, Plugin plugin) public void updateXPBar(PrimarySkillType primarySkillType, Plugin plugin) {
{
//XP BAR UPDATES //XP BAR UPDATES
experienceBarManager.updateExperienceBar(primarySkillType, plugin); experienceBarManager.updateExperienceBar(primarySkillType, plugin);
} }
public double getProgressInCurrentSkillLevel(PrimarySkillType primarySkillType) public double getProgressInCurrentSkillLevel(PrimarySkillType primarySkillType) {
{
if (SkillTools.isChildSkill(primarySkillType)) { if (SkillTools.isChildSkill(primarySkillType)) {
return 1.0D; return 1.0D;
} }
@ -313,6 +318,10 @@ public class McMMOPlayer implements Identified {
return (TridentsManager) skillManagers.get(PrimarySkillType.TRIDENTS); return (TridentsManager) skillManagers.get(PrimarySkillType.TRIDENTS);
} }
public MacesManager getMacesManager() {
return (MacesManager) skillManagers.get(PrimarySkillType.MACES);
}
public ExcavationManager getExcavationManager() { public ExcavationManager getExcavationManager() {
return (ExcavationManager) skillManagers.get(PrimarySkillType.EXCAVATION); return (ExcavationManager) skillManagers.get(PrimarySkillType.EXCAVATION);
} }
@ -739,11 +748,11 @@ public class McMMOPlayer implements Identified {
* Players & Profiles * Players & Profiles
*/ */
public Player getPlayer() { public @NotNull Player getPlayer() {
return player; return player;
} }
public PlayerProfile getProfile() { public @NotNull PlayerProfile getProfile() {
return profile; return profile;
} }
@ -893,8 +902,7 @@ public class McMMOPlayer implements Identified {
//TODO: This is hacky and temporary solution until skills are move to the new system //TODO: This is hacky and temporary solution until skills are move to the new system
//Potential problems with this include skills with two super abilities (ie mining) //Potential problems with this include skills with two super abilities (ie mining)
if(!RankUtils.hasUnlockedSubskill(player, subSkillType)) if (!RankUtils.hasUnlockedSubskill(player, subSkillType)) {
{
int diff = RankUtils.getSuperAbilityUnlockRequirement(superAbilityType) - getSkillLevel(primarySkillType); int diff = RankUtils.getSuperAbilityUnlockRequirement(superAbilityType) - getSkillLevel(primarySkillType);
//Inform the player they are not yet skilled enough //Inform the player they are not yet skilled enough
@ -917,7 +925,7 @@ public class McMMOPlayer implements Identified {
return; return;
} }
if (EventUtils.callPlayerAbilityActivateEvent(player, primarySkillType).isCancelled()) { if (callPlayerAbilityActivateEvent(this, primarySkillType).isCancelled()) {
return; return;
} }
@ -928,8 +936,7 @@ public class McMMOPlayer implements Identified {
int ticks; int ticks;
//Ability cap of 0 or below means no cap //Ability cap of 0 or below means no cap
if(abilityLengthCap > 0) if (abilityLengthCap > 0) {
{
ticks = PerksUtils.handleActivationPerks(player, 2 + (Math.min(abilityLengthCap, getSkillLevel(primarySkillType)) / abilityLengthVar), superAbilityType.getMaxLength()); ticks = PerksUtils.handleActivationPerks(player, 2 + (Math.min(abilityLengthCap, getSkillLevel(primarySkillType)) / abilityLengthVar), superAbilityType.getMaxLength());
} else { } else {
ticks = PerksUtils.handleActivationPerks(player, 2 + (getSkillLevel(primarySkillType) / abilityLengthVar), superAbilityType.getMaxLength()); ticks = PerksUtils.handleActivationPerks(player, 2 + (getSkillLevel(primarySkillType) / abilityLengthVar), superAbilityType.getMaxLength());

View File

@ -135,8 +135,7 @@ public class PlayerProfile {
+ " resulted in failure. "+saveAttempts+" have been made so far."); + " resulted in failure. "+saveAttempts+" have been made so far.");
} }
if(saveAttempts < 10) if (saveAttempts < 10) {
{
saveAttempts++; saveAttempts++;
//Back out of async saving if we detect a server shutdown, this is not always going to be caught //Back out of async saving if we detect a server shutdown, this is not always going to be caught
@ -372,8 +371,7 @@ public class PlayerProfile {
for (PrimarySkillType parentSkill : parentSkills) { for (PrimarySkillType parentSkill : parentSkills) {
skillsXp.put(parentSkill, skillsXp.get(parentSkill) + dividedXP); skillsXp.put(parentSkill, skillsXp.get(parentSkill) + dividedXP);
} }
} } else {
else {
skillsXp.put(skill, skillsXp.get(skill) + xp); skillsXp.put(skill, skillsXp.get(skill) + xp);
} }
} }

View File

@ -9,11 +9,9 @@ public enum ModConfigType {
public static ModConfigType getModConfigType(String materialName) { public static ModConfigType getModConfigType(String materialName) {
if (materialName.contains("HELM") || (materialName.contains("CHEST") && !materialName.contains("CHESTNUT")) || materialName.contains("LEGS") || materialName.contains("LEGGINGS") || materialName.contains("BOOT")) { if (materialName.contains("HELM") || (materialName.contains("CHEST") && !materialName.contains("CHESTNUT")) || materialName.contains("LEGS") || materialName.contains("LEGGINGS") || materialName.contains("BOOT")) {
return ARMOR; return ARMOR;
} } else if (materialName.contains("PICKAXE") || materialName.contains("AXE") || (materialName.contains("BOW") && !materialName.contains("BOWL")) || materialName.contains("HOE") || materialName.contains("SHOVEL") || materialName.contains("SWORD")) {
else if (materialName.contains("PICKAXE") || materialName.contains("AXE") || (materialName.contains("BOW") && !materialName.contains("BOWL")) || materialName.contains("HOE") || materialName.contains("SHOVEL") || materialName.contains("SWORD")) {
return TOOLS; return TOOLS;
} } else if (materialName.contains("LOG") || materialName.contains("LEAVES") || materialName.contains("FLOWER") || materialName.contains("PLANT") || materialName.contains("CROP") || materialName.contains("ORE") || materialName.contains("DIRT") || materialName.contains("SAND") || materialName.contains("GRASS")) {
else if (materialName.contains("LOG") || materialName.contains("LEAVES") || materialName.contains("FLOWER") || materialName.contains("PLANT") || materialName.contains("CROP") || materialName.contains("ORE") || materialName.contains("DIRT") || materialName.contains("SAND") || materialName.contains("GRASS")) {
return BLOCKS; return BLOCKS;
} }

View File

@ -20,6 +20,7 @@ public enum PrimarySkillType {
EXCAVATION, EXCAVATION,
FISHING, FISHING,
HERBALISM, HERBALISM,
MACES,
MINING, MINING,
REPAIR, REPAIR,
SALVAGE, SALVAGE,

View File

@ -57,6 +57,9 @@ public enum SubSkillType {
HERBALISM_HYLIAN_LUCK, HERBALISM_HYLIAN_LUCK,
HERBALISM_SHROOM_THUMB, HERBALISM_SHROOM_THUMB,
/* Maces */
MACES_MACES_LIMIT_BREAK(10),
/* Mining */ /* Mining */
MINING_BIGGER_BOMBS(1), MINING_BIGGER_BOMBS(1),
MINING_BLAST_MINING(8), MINING_BLAST_MINING(8),
@ -125,18 +128,15 @@ public enum SubSkillType {
* If our SubSkillType has more than 1 rank define it * If our SubSkillType has more than 1 rank define it
* @param numRanks The number of ranks our SubSkillType has * @param numRanks The number of ranks our SubSkillType has
*/ */
SubSkillType(int numRanks) SubSkillType(int numRanks) {
{
this.numRanks = numRanks; this.numRanks = numRanks;
} }
SubSkillType() SubSkillType() {
{
this.numRanks = 0; this.numRanks = 0;
} }
public int getNumRanks() public int getNumRanks() {
{
return numRanks; return numRanks;
} }
@ -167,8 +167,7 @@ public enum SubSkillType {
* Get the string representation of the permission node for this subskill * Get the string representation of the permission node for this subskill
* @return the permission node for this subskill * @return the permission node for this subskill
*/ */
public String getPermissionNodeAddress() public String getPermissionNodeAddress() {
{
//TODO: This could be optimized //TODO: This could be optimized
return "mcmmo.ability." + getParentSkill().toString().toLowerCase(Locale.ENGLISH) + "." + getConfigName(toString()).toLowerCase(Locale.ENGLISH); return "mcmmo.ability." + getParentSkill().toString().toLowerCase(Locale.ENGLISH) + "." + getConfigName(toString()).toLowerCase(Locale.ENGLISH);
} }
@ -198,12 +197,10 @@ public enum SubSkillType {
* Split the string up so we can capitalize each part * Split the string up so we can capitalize each part
*/ */
String subskillNameWithoutPrefix = subSkillName.substring(subStringIndex); String subskillNameWithoutPrefix = subSkillName.substring(subStringIndex);
if(subskillNameWithoutPrefix.contains("_")) if (subskillNameWithoutPrefix.contains("_")) {
{
String[] splitStrings = subskillNameWithoutPrefix.split("_"); String[] splitStrings = subskillNameWithoutPrefix.split("_");
for(String string : splitStrings) for(String string : splitStrings) {
{
endResult.append(StringUtils.getCapitalized(string)); endResult.append(StringUtils.getCapitalized(string));
} }
} else { } else {
@ -225,8 +222,7 @@ public enum SubSkillType {
* Returns the name of the parent skill from the Locale file * Returns the name of the parent skill from the Locale file
* @return The parent skill as defined in the locale * @return The parent skill as defined in the locale
*/ */
public String getParentNiceNameLocale() public String getParentNiceNameLocale() {
{
return LocaleLoader.getString(StringUtils.getCapitalized(getParentSkill().toString())+".SkillName"); return LocaleLoader.getString(StringUtils.getCapitalized(getParentSkill().toString())+".SkillName");
} }
@ -235,8 +231,7 @@ public enum SubSkillType {
* @param subSkillType target subskill * @param subSkillType target subskill
* @return the "nice" name without spaces * @return the "nice" name without spaces
*/ */
public String getNiceNameNoSpaces(SubSkillType subSkillType) public String getNiceNameNoSpaces(SubSkillType subSkillType) {
{
return getConfigName(subSkillType.toString()); return getConfigName(subSkillType.toString());
} }
@ -260,18 +255,15 @@ public enum SubSkillType {
return subStringIndex; return subStringIndex;
} }
public String getLocaleKeyRoot() public String getLocaleKeyRoot() {
{
return StringUtils.getCapitalized(getParentSkill().toString())+".SubSkill."+getConfigName(toString()); return StringUtils.getCapitalized(getParentSkill().toString())+".SubSkill."+getConfigName(toString());
} }
public String getLocaleName() public String getLocaleName() {
{
return getFromLocaleSubAddress(".Name"); return getFromLocaleSubAddress(".Name");
} }
public String getLocaleDescription() public String getLocaleDescription() {
{
return getFromLocaleSubAddress(".Description"); return getFromLocaleSubAddress(".Description");
} }
@ -281,13 +273,11 @@ public enum SubSkillType {
public String getLocaleStatExtraDescription() { return getFromLocaleSubAddress(".Stat.Extra"); } public String getLocaleStatExtraDescription() { return getFromLocaleSubAddress(".Stat.Extra"); }
public String getLocaleKeyStatExtraDescription() { return getLocaleKeyFromSubAddress(".Stat.Extra"); } public String getLocaleKeyStatExtraDescription() { return getLocaleKeyFromSubAddress(".Stat.Extra"); }
public String getLocaleStat(String... vars) public String getLocaleStat(String... vars) {
{
return LocaleLoader.getString("Ability.Generic.Template", (Object[]) vars); return LocaleLoader.getString("Ability.Generic.Template", (Object[]) vars);
} }
public String getCustomLocaleStat(String... vars) public String getCustomLocaleStat(String... vars) {
{
return LocaleLoader.getString("Ability.Generic.Template.Custom", (Object[]) vars); return LocaleLoader.getString("Ability.Generic.Template.Custom", (Object[]) vars);
} }
@ -295,8 +285,7 @@ public enum SubSkillType {
return LocaleLoader.getString(getLocaleKeyRoot() + s); return LocaleLoader.getString(getLocaleKeyRoot() + s);
} }
private String getLocaleKeyFromSubAddress(String s) private String getLocaleKeyFromSubAddress(String s) {
{
return getLocaleKeyRoot() + s; return getLocaleKeyRoot() + s;
} }
} }

View File

@ -72,19 +72,26 @@ public enum SuperAbilityType {
"Swords.Skills.SS.Other.Off", "Swords.Skills.SS.Other.Off",
"Swords.SubSkill.SerratedStrikes.Name"), "Swords.SubSkill.SerratedStrikes.Name"),
SUPER_SHOTGUN( SUPER_SHOTGUN(
null, "Placeholder",
null, "Placeholder",
"Crossbows.Skills.SSG.Other.On", "Placeholder",
"Crossbows.Skills.SSG.Refresh", "Placeholder",
null, "Placeholder",
"Crossbows.SubSkill.SuperShotgun.Name"), "Placeholder"),
TRIDENTS_SUPER_ABILITY( TRIDENTS_SUPER_ABILITY(
"Tridents.Skills.TA.On", "Placeholder",
"Tridents.Skills.TA.Off", "Placeholder",
"Tridents.Skills.TA.Other.On", "Placeholder",
"Tridents.Skills.TA.Refresh", "Placeholder",
"Tridents.Skills.TA.Other.Off", "Placeholder",
"Tridents.SubSkill.TridentAbility.Name"), "Placeholder"),
MACES_SUPER_ABILITY(
"Placeholder",
"Placeholder",
"Placeholder",
"Placeholder",
"Placeholder",
"Placeholder"),
/** /**
* Has cooldown - but has to share a skill with Super Breaker, so needs special treatment * Has cooldown - but has to share a skill with Super Breaker, so needs special treatment
@ -199,16 +206,15 @@ public enum SuperAbilityType {
public boolean getPermissions(Player player) { public boolean getPermissions(Player player) {
return switch (this) { return switch (this) {
case BERSERK -> Permissions.berserk(player); case BERSERK -> Permissions.berserk(player);
case EXPLOSIVE_SHOT -> Permissions.explosiveShot(player);
case BLAST_MINING -> Permissions.remoteDetonation(player); case BLAST_MINING -> Permissions.remoteDetonation(player);
case GIGA_DRILL_BREAKER -> Permissions.gigaDrillBreaker(player); case GIGA_DRILL_BREAKER -> Permissions.gigaDrillBreaker(player);
case GREEN_TERRA -> Permissions.greenTerra(player); case GREEN_TERRA -> Permissions.greenTerra(player);
case SERRATED_STRIKES -> Permissions.serratedStrikes(player); case SERRATED_STRIKES -> Permissions.serratedStrikes(player);
case SKULL_SPLITTER -> Permissions.skullSplitter(player); case SKULL_SPLITTER -> Permissions.skullSplitter(player);
case SUPER_BREAKER -> Permissions.superBreaker(player); case SUPER_BREAKER -> Permissions.superBreaker(player);
case SUPER_SHOTGUN -> Permissions.superShotgun(player);
case TREE_FELLER -> Permissions.treeFeller(player); case TREE_FELLER -> Permissions.treeFeller(player);
case TRIDENTS_SUPER_ABILITY -> Permissions.tridentsSuper(player); // TODO: once implemented, return permissions for the following abilities
case EXPLOSIVE_SHOT, TRIDENTS_SUPER_ABILITY, SUPER_SHOTGUN, MACES_SUPER_ABILITY -> false;
}; };
} }

View File

@ -13,7 +13,8 @@ public enum ToolType {
SWORD("Swords.Ability.Lower", "Swords.Ability.Ready"), SWORD("Swords.Ability.Lower", "Swords.Ability.Ready"),
CROSSBOW("Crossbows.Ability.Lower", "Crossbows.Ability.Ready"), CROSSBOW("Crossbows.Ability.Lower", "Crossbows.Ability.Ready"),
BOW("Archery.Ability.Lower", "Archery.Ability.Ready"), BOW("Archery.Ability.Lower", "Archery.Ability.Ready"),
TRIDENTS("Tridents.Ability.Lower", "Tridents.Ability.Ready"); TRIDENTS("Tridents.Ability.Lower", "Tridents.Ability.Ready"),
MACES("Maces.Ability.Lower", "Maces.Ability.Ready");
private final String lowerTool; private final String lowerTool;
private final String raiseTool; private final String raiseTool;
@ -45,6 +46,8 @@ public enum ToolType {
return ItemUtils.isCrossbow(itemStack); return ItemUtils.isCrossbow(itemStack);
case TRIDENTS: case TRIDENTS:
return ItemUtils.isTrident(itemStack); return ItemUtils.isTrident(itemStack);
case MACES:
return ItemUtils.isMace(itemStack);
case FISTS: case FISTS:
return itemStack.getType() == Material.AIR; return itemStack.getType() == Material.AIR;

View File

@ -1,167 +1,149 @@
package com.gmail.nossr50.datatypes.skills.alchemy; package com.gmail.nossr50.datatypes.skills.alchemy;
import com.gmail.nossr50.config.skills.alchemy.PotionConfig; import com.gmail.nossr50.mcMMO;
import org.bukkit.Color; import com.gmail.nossr50.util.PotionUtil;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.Potion; import org.jetbrains.annotations.NotNull;
import org.bukkit.potion.PotionData; import org.jetbrains.annotations.Nullable;
import org.bukkit.potion.PotionEffect;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import static com.gmail.nossr50.util.PotionUtil.samePotionType;
import static java.util.Objects.requireNonNull;
public class AlchemyPotion { public class AlchemyPotion {
private final Material material; private final @NotNull String potionConfigName;
private PotionData data; private final @NotNull ItemStack potionItemStack;
private String name; private final @NotNull Map<ItemStack, String> alchemyPotionChildren;
private List<String> lore;
private List<PotionEffect> effects;
private Color color;
private Map<ItemStack, String> children;
public AlchemyPotion(Material material, PotionData data, String name, List<String> lore, List<PotionEffect> effects, Color color, Map<ItemStack, String> children) { public AlchemyPotion(@NotNull String potionConfigName, @NotNull ItemStack potionItemStack,
this.material = material; @NotNull Map<ItemStack, String> alchemyPotionChildren) {
this.data = data; this.potionConfigName = requireNonNull(potionConfigName, "potionConfigName cannot be null");
this.lore = lore; this.potionItemStack = requireNonNull(potionItemStack, "potionItemStack cannot be null");
this.name = name; this.alchemyPotionChildren = requireNonNull(alchemyPotionChildren, "alchemyPotionChildren cannot be null");
this.effects = effects;
this.children = children;
this.color = color;
} }
public String toString() { public @NotNull ItemStack toItemStack(int amount) {
return "AlchemyPotion{" + data + ", " + name + ", Effects[" + effects.size() + "], Children[" + children.size() + "]}"; final ItemStack clone = potionItemStack.clone();
clone.setAmount(Math.max(1, amount));
return clone;
} }
public ItemStack toItemStack(int amount) { public @NotNull Map<ItemStack, String> getAlchemyPotionChildren() {
ItemStack potion = new ItemStack(material, amount); return alchemyPotionChildren;
PotionMeta meta = (PotionMeta) potion.getItemMeta();
meta.setBasePotionData(data);
if (this.getName() != null) {
meta.setDisplayName(this.getName());
} }
if (this.getLore() != null && !this.getLore().isEmpty()) { public @Nullable AlchemyPotion getChild(@NotNull ItemStack ingredient) {
meta.setLore(this.getLore()); if (!alchemyPotionChildren.isEmpty()) {
} for (Entry<ItemStack, String> child : alchemyPotionChildren.entrySet()) {
if (!this.getEffects().isEmpty()) {
for (PotionEffect effect : this.getEffects()) {
meta.addCustomEffect(effect, true);
}
}
if (this.getColor() != null) {
meta.setColor(this.getColor());
}
potion.setItemMeta(meta);
return potion;
}
public Material getMaterial() {
return material;
}
public Potion toPotion(int amount) {
return Potion.fromItemStack(this.toItemStack(amount));
}
public PotionData getData() {
return data;
}
public void setData(PotionData data) {
this.data = data;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getLore() {
return lore;
}
public void setLore(List<String> lore) {
this.lore = lore;
}
public List<PotionEffect> getEffects() {
return effects;
}
public void setEffects(List<PotionEffect> effects) {
this.effects = effects;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public Map<ItemStack, String> getChildren() {
return children;
}
public void setChildren(Map<ItemStack, String> children) {
this.children = children;
}
public AlchemyPotion getChild(ItemStack ingredient) {
if (!children.isEmpty()) {
for (Entry<ItemStack, String> child : children.entrySet()) {
if (ingredient.isSimilar(child.getKey())) { if (ingredient.isSimilar(child.getKey())) {
return PotionConfig.getInstance().getPotion(child.getValue()); return mcMMO.p.getPotionConfig().getPotion(child.getValue());
} }
} }
} }
return null; return null;
} }
public boolean isSimilar(ItemStack item) { public boolean isSimilarPotion(@NotNull ItemStack otherPotion) {
if (item.getType() != material) { requireNonNull(otherPotion, "otherPotion cannot be null");
if (otherPotion.getType() != potionItemStack.getType()) {
return false; return false;
} }
if (!item.hasItemMeta()) {
// no potion meta, no match
if (!otherPotion.hasItemMeta()) {
return false; return false;
} }
PotionMeta meta = (PotionMeta) item.getItemMeta();
PotionData that = meta.getBasePotionData(); /*
if (data.getType() != that.getType()) { * Compare custom effects on both potions.
*/
final PotionMeta otherPotionMeta = (PotionMeta) otherPotion.getItemMeta();
// compare custom effects on both potions, this has to be done in two traversals
// comparing thisPotionMeta -> otherPotionMeta and otherPotionMeta -> thisPotionMeta
if (hasDifferingCustomEffects(getAlchemyPotionMeta(), otherPotionMeta)
|| hasDifferingCustomEffects(otherPotionMeta, getAlchemyPotionMeta())) {
return false; return false;
} }
if (data.isExtended() != that.isExtended()) {
if (!samePotionType(getAlchemyPotionMeta(), otherPotionMeta)) {
return false; return false;
} }
if (data.isUpgraded() != that.isUpgraded()) {
// Legacy only comparison, compare PotionData
if (!PotionUtil.isPotionDataEqual(getAlchemyPotionMeta(), otherPotionMeta)) {
return false; return false;
} }
for (PotionEffect effect : effects) {
if (!meta.hasCustomEffect(effect.getType())) { /*
* If one potion has lore and the other does not, then they are not the same potion.
* If both have lore, compare the lore.
* If neither have lore, they may be the same potion.
*/
if (!otherPotionMeta.hasLore() && getAlchemyPotionMeta().hasLore()
|| !getAlchemyPotionMeta().hasLore() && otherPotionMeta.hasLore()) {
return false; return false;
} }
return !otherPotionMeta.hasLore() || !getAlchemyPotionMeta().hasLore()
|| otherPotionMeta.getLore().equals(getAlchemyPotionMeta().getLore());
}
private boolean hasDifferingCustomEffects(PotionMeta potionMeta, PotionMeta otherPotionMeta) {
for (int i = 0; i < potionMeta.getCustomEffects().size(); i++) {
var effect = potionMeta.getCustomEffects().get(i);
// One has an effect the other does not, they are not the same potion
if (!otherPotionMeta.hasCustomEffect(effect.getType())) {
return true;
}
var otherEffect = otherPotionMeta.getCustomEffects().get(i);
// Amplifier or duration are not equal, they are not the same potion
if (effect.getAmplifier() != otherEffect.getAmplifier()
|| effect.getDuration() != otherEffect.getDuration()) {
return true;
}
} }
if (!meta.hasLore() && !lore.isEmpty()) {
return false; return false;
} }
if (!(lore.isEmpty() && !meta.hasLore()) && !meta.getLore().equals(lore)) {
return false; public PotionMeta getAlchemyPotionMeta() {
return (PotionMeta) potionItemStack.getItemMeta();
} }
if (!meta.hasDisplayName() && name != null) {
return false; public boolean isSplash() {
return potionItemStack.getType() == Material.SPLASH_POTION;
} }
return (name == null && !meta.hasDisplayName()) || meta.getDisplayName().equals(name);
public boolean isLingering() {
return potionItemStack.getType() == Material.LINGERING_POTION;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AlchemyPotion that = (AlchemyPotion) o;
return Objects.equals(potionConfigName, that.potionConfigName) && Objects.equals(potionItemStack, that.potionItemStack) && Objects.equals(alchemyPotionChildren, that.alchemyPotionChildren);
}
@Override
public int hashCode() {
return Objects.hash(potionConfigName, potionItemStack, alchemyPotionChildren);
}
@Override
public String toString() {
return "AlchemyPotion{" +
"potionConfigName='" + potionConfigName + '\'' +
", potionItemStack=" + potionItemStack +
", alchemyPotionChildren=" + alchemyPotionChildren +
'}';
} }
} }

View File

@ -1,11 +1,10 @@
package com.gmail.nossr50.datatypes.skills.alchemy; package com.gmail.nossr50.datatypes.skills.alchemy;
import org.bukkit.Material; import com.gmail.nossr50.util.PotionUtil;
import org.bukkit.potion.PotionData; import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionType;
import java.util.List; import static com.gmail.nossr50.util.PotionUtil.*;
public enum PotionStage { public enum PotionStage {
FIVE(5), FIVE(5),
@ -35,35 +34,36 @@ public enum PotionStage {
} }
public static PotionStage getPotionStage(AlchemyPotion input, AlchemyPotion output) { public static PotionStage getPotionStage(AlchemyPotion input, AlchemyPotion output) {
PotionStage potionStage = getPotionStage(output); PotionStage outputPotionStage = getPotionStage(output);
if (!isWaterBottle(input) && getPotionStage(input) == potionStage) { PotionStage inputPotionStage = getPotionStage(input);
potionStage = PotionStage.FIVE; if (!isWaterBottle(input) && inputPotionStage == outputPotionStage) {
outputPotionStage = PotionStage.FIVE;
} }
return potionStage; return outputPotionStage;
} }
private static boolean isWaterBottle(AlchemyPotion input) { private static boolean isWaterBottle(AlchemyPotion alchemyPotion) {
return input.getData().getType() == PotionType.WATER; return isPotionTypeWater(alchemyPotion.getAlchemyPotionMeta());
} }
public static PotionStage getPotionStage(AlchemyPotion alchemyPotion) { public static PotionStage getPotionStage(AlchemyPotion alchemyPotion) {
PotionData data = alchemyPotion.getData(); final PotionMeta potionMeta = alchemyPotion.getAlchemyPotionMeta();
List<PotionEffect> effects = alchemyPotion.getEffects();
int stage = 1; int stage = 1;
// Check if potion has an effect of any sort // Check if potion has an effect of any sort
if (data.getType().getEffectType() != null || !effects.isEmpty()) { if (!potionMeta.getCustomEffects().isEmpty()
|| PotionUtil.hasBasePotionEffects(potionMeta)) {
stage++; stage++;
} }
// Check if potion has a glowstone dust amplifier // Check if potion has a glowstone dust amplifier
// Else check if the potion has a custom effect with an amplifier added by mcMMO // Else check if the potion has a custom effect with an amplifier added by mcMMO
if (data.isUpgraded()) { if (isStrong(potionMeta)) {
stage++; stage++;
} else if(!effects.isEmpty()) { } else if (!potionMeta.getCustomEffects().isEmpty()) {
for (PotionEffect effect : effects){ for (PotionEffect effect : potionMeta.getCustomEffects()){
if (effect.getAmplifier() > 0){ if (effect.getAmplifier() > 0){
stage++; stage++;
break; break;
@ -72,12 +72,12 @@ public enum PotionStage {
} }
// Check if potion has a redstone dust amplifier // Check if potion has a redstone dust amplifier
if (data.isExtended()) { if (isLong(potionMeta)) {
stage++; stage++;
} }
// Check if potion has a gunpowder amplifier // Check if potion has a gunpowder amplifier
if (alchemyPotion.getMaterial() == Material.SPLASH_POTION || alchemyPotion.getMaterial() == Material.LINGERING_POTION) { if (alchemyPotion.isSplash() || alchemyPotion.isLingering()) {
stage++; stage++;
} }

View File

@ -1,6 +1,7 @@
package com.gmail.nossr50.datatypes.skills.subskills; package com.gmail.nossr50.datatypes.skills.subskills;
import com.gmail.nossr50.config.CoreSkillsConfig; import com.gmail.nossr50.config.CoreSkillsConfig;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.datatypes.skills.subskills.interfaces.Interaction; import com.gmail.nossr50.datatypes.skills.subskills.interfaces.Interaction;
import com.gmail.nossr50.datatypes.skills.subskills.interfaces.Rank; import com.gmail.nossr50.datatypes.skills.subskills.interfaces.Rank;
@ -17,8 +18,7 @@ public abstract class AbstractSubSkill implements SubSkill, Interaction, Rank, S
protected String configKeyPrimary; protected String configKeyPrimary;
protected SubSkillType subSkillType; protected SubSkillType subSkillType;
public AbstractSubSkill(String configKeySubSkill, String configKeyPrimary, SubSkillType subSkillType) public AbstractSubSkill(String configKeySubSkill, String configKeyPrimary, SubSkillType subSkillType) {
{
this.configKeySubSkill = configKeySubSkill; this.configKeySubSkill = configKeySubSkill;
this.configKeyPrimary = configKeyPrimary; this.configKeyPrimary = configKeyPrimary;
this.subSkillType = subSkillType; this.subSkillType = subSkillType;
@ -48,13 +48,13 @@ public abstract class AbstractSubSkill implements SubSkill, Interaction, Rank, S
/** /**
* Prints detailed info about this subskill to the player * Prints detailed info about this subskill to the player
* *
* @param player the target player * @param mmoPlayer the target player
*/ */
@Override @Override
public void printInfo(Player player) { public void printInfo(McMMOPlayer mmoPlayer) {
/* DEFAULT SETTINGS PRINT THE BARE MINIMUM */ /* DEFAULT SETTINGS PRINT THE BARE MINIMUM */
//TextComponentFactory.sendPlayerUrlHeader(player); final Player player = mmoPlayer.getPlayer();
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.Header")); player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.Header"));
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.SubSkillHeader", getConfigKeyName())); player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.SubSkillHeader", getConfigKeyName()));
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.DetailsHeader")); player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.DetailsHeader"));

View File

@ -4,7 +4,6 @@ import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.experience.XPGainReason;
import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.interactions.NotificationType;
import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.locale.LocaleLoader;
@ -13,7 +12,6 @@ import com.gmail.nossr50.util.EventUtils;
import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.NotificationManager;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.random.Probability; import com.gmail.nossr50.util.random.Probability;
import com.gmail.nossr50.util.random.ProbabilityUtil; import com.gmail.nossr50.util.random.ProbabilityUtil;
import com.gmail.nossr50.util.skills.PerksUtils; import com.gmail.nossr50.util.skills.PerksUtils;
@ -26,7 +24,6 @@ import net.kyori.adventure.text.TextComponent;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.SoundCategory; import org.bukkit.SoundCategory;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -68,25 +65,25 @@ public class Roll extends AcrobaticsSubSkill {
return false; return false;
if (entityDamageEvent.getCause() == EntityDamageEvent.DamageCause.FALL) {//Grab the player if (entityDamageEvent.getCause() == EntityDamageEvent.DamageCause.FALL) {//Grab the player
McMMOPlayer mcMMOPlayer = EventUtils.getMcMMOPlayer(entityDamageEvent.getEntity()); McMMOPlayer mmoPlayer = EventUtils.getMcMMOPlayer(entityDamageEvent.getEntity());
if (mcMMOPlayer == null) if (mmoPlayer == null)
return false; return false;
/* /*
* Check for success * Check for success
*/ */
Player player = (Player) ((EntityDamageEvent) event).getEntity();
if (canRoll(player)) { if (canRoll(mmoPlayer)) {
entityDamageEvent.setDamage(rollCheck(player, mcMMOPlayer, entityDamageEvent.getFinalDamage())); entityDamageEvent.setDamage(rollCheck(mmoPlayer, entityDamageEvent.getFinalDamage()));
if (entityDamageEvent.getFinalDamage() == 0) { if (entityDamageEvent.getFinalDamage() == 0) {
entityDamageEvent.setCancelled(true); entityDamageEvent.setCancelled(true);
return true; return true;
} }
} else if(mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.ACROBATICS)) { } else if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(mmoPlayer.getPlayer(), PrimarySkillType.ACROBATICS)) {
//Give XP Anyways //Give XP Anyways
SkillUtils.applyXpGain(mcMMOPlayer, getPrimarySkill(), calculateRollXP(player, ((EntityDamageEvent) event).getFinalDamage(), false), XPGainReason.PVE); SkillUtils.applyXpGain(mmoPlayer, getPrimarySkill(), calculateRollXP(mmoPlayer, ((EntityDamageEvent) event).getFinalDamage(), false), XPGainReason.PVE);
} }
} }
@ -118,26 +115,25 @@ public class Roll extends AcrobaticsSubSkill {
* Adds detailed stats specific to this skill * Adds detailed stats specific to this skill
* *
* @param componentBuilder target component builder * @param componentBuilder target component builder
* @param player target player * @param mmoPlayer target player
*/ */
@Override @Override
public void addStats(TextComponent.Builder componentBuilder, Player player) { public void addStats(TextComponent.Builder componentBuilder, McMMOPlayer mmoPlayer) {
String rollChance, rollChanceLucky, gracefulRollChance, gracefulRollChanceLucky; String rollChance, rollChanceLucky, gracefulRollChance, gracefulRollChanceLucky;
/* Values related to the player */ /* Values related to the player */
PlayerProfile playerProfile = UserManager.getPlayer(player).getProfile(); float skillValue = mmoPlayer.getSkillLevel(getPrimarySkill());
float skillValue = playerProfile.getSkillLevel(getPrimarySkill()); boolean isLucky = Permissions.lucky(mmoPlayer.getPlayer(), getPrimarySkill());
boolean isLucky = Permissions.lucky(player, getPrimarySkill());
String[] rollStrings = ProbabilityUtil.getRNGDisplayValues(player, SubSkillType.ACROBATICS_ROLL); String[] rollStrings = ProbabilityUtil.getRNGDisplayValues(mmoPlayer, SubSkillType.ACROBATICS_ROLL);
rollChance = rollStrings[0]; rollChance = rollStrings[0];
rollChanceLucky = rollStrings[1]; rollChanceLucky = rollStrings[1];
/* /*
* Graceful is double the odds of a normal roll * Graceful is double the odds of a normal roll
*/ */
Probability probability = getRollProbability(player); Probability probability = getRollProbability(mmoPlayer);
Probability gracefulProbability = Probability.ofPercent(probability.getValue() * 2); Probability gracefulProbability = Probability.ofValue(probability.getValue() * 2);
String[] gracefulRollStrings = ProbabilityUtil.getRNGDisplayValues(gracefulProbability); String[] gracefulRollStrings = ProbabilityUtil.getRNGDisplayValues(gracefulProbability);
gracefulRollChance = gracefulRollStrings[0]; gracefulRollChance = gracefulRollStrings[0];
gracefulRollChanceLucky = gracefulRollStrings[1]; gracefulRollChanceLucky = gracefulRollStrings[1];
@ -160,8 +156,7 @@ public class Roll extends AcrobaticsSubSkill {
//Advanced //Advanced
//Lucky Notice //Lucky Notice
if(isLucky) if (isLucky) {
{
componentBuilder.append(Component.text(LocaleLoader.getString("JSON.JWrapper.Perks.Header"))); componentBuilder.append(Component.text(LocaleLoader.getString("JSON.JWrapper.Perks.Header")));
componentBuilder.append(Component.newline()); componentBuilder.append(Component.newline());
componentBuilder.append(Component.text(LocaleLoader.getString("JSON.JWrapper.Perks.Lucky", "33"))); componentBuilder.append(Component.text(LocaleLoader.getString("JSON.JWrapper.Perks.Lucky", "33")));
@ -170,8 +165,8 @@ public class Roll extends AcrobaticsSubSkill {
} }
@NotNull @NotNull
private Probability getRollProbability(Player player) { private Probability getRollProbability(McMMOPlayer mmoPlayer) {
return ProbabilityUtil.getSubSkillProbability(SubSkillType.ACROBATICS_ROLL, player); return ProbabilityUtil.getSubSkillProbability(SubSkillType.ACROBATICS_ROLL, mmoPlayer);
} }
@Override @Override
@ -189,8 +184,9 @@ public class Roll extends AcrobaticsSubSkill {
return true; return true;
} }
private boolean canRoll(Player player) { private boolean canRoll(McMMOPlayer mmoPlayer) {
return RankUtils.hasUnlockedSubskill(player, SubSkillType.ACROBATICS_ROLL) && Permissions.isSubSkillEnabled(player, SubSkillType.ACROBATICS_ROLL); return RankUtils.hasUnlockedSubskill(mmoPlayer.getPlayer(), SubSkillType.ACROBATICS_ROLL)
&& Permissions.isSubSkillEnabled(mmoPlayer.getPlayer(), SubSkillType.ACROBATICS_ROLL);
} }
/** /**
@ -200,43 +196,41 @@ public class Roll extends AcrobaticsSubSkill {
* @return the modified event damage if the ability was successful, the original event damage otherwise * @return the modified event damage if the ability was successful, the original event damage otherwise
*/ */
@VisibleForTesting @VisibleForTesting
public double rollCheck(Player player, McMMOPlayer mcMMOPlayer, double damage) { public double rollCheck(McMMOPlayer mmoPlayer, double damage) {
int skillLevel = mmoPlayer.getSkillLevel(getPrimarySkill());
int skillLevel = mcMMOPlayer.getSkillLevel(getPrimarySkill()); if (mmoPlayer.getPlayer().isSneaking()) {
return gracefulRollCheck(mmoPlayer, damage, skillLevel);
if (player.isSneaking()) {
return gracefulRollCheck(player, mcMMOPlayer, damage, skillLevel);
} }
double modifiedDamage = calculateModifiedRollDamage(damage, mcMMO.p.getAdvancedConfig().getRollDamageThreshold()); double modifiedDamage = calculateModifiedRollDamage(damage, mcMMO.p.getAdvancedConfig().getRollDamageThreshold());
if (!isFatal(player, modifiedDamage) if (!isFatal(mmoPlayer, modifiedDamage)
&& ProbabilityUtil.isSkillRNGSuccessful(SubSkillType.ACROBATICS_ROLL, player)) { && ProbabilityUtil.isSkillRNGSuccessful(SubSkillType.ACROBATICS_ROLL, mmoPlayer)) {
NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Acrobatics.Roll.Text"); NotificationManager.sendPlayerInformation(mmoPlayer.getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Acrobatics.Roll.Text");
SoundManager.sendCategorizedSound(player, player.getLocation(), SoundType.ROLL_ACTIVATED, SoundCategory.PLAYERS); SoundManager.sendCategorizedSound(mmoPlayer.getPlayer(), mmoPlayer.getPlayer().getLocation(), SoundType.ROLL_ACTIVATED, SoundCategory.PLAYERS);
//player.sendMessage(LocaleLoader.getString("Acrobatics.Roll.Text")); //mmoPlayer.getPlayer().sendMessage(LocaleLoader.getString("Acrobatics.Roll.Text"));
//if (!SkillUtils.cooldownExpired((long) mcMMOPlayer.getTeleportATS(), Config.getInstance().getXPAfterTeleportCooldown())) { //if (!SkillUtils.cooldownExpired((long) mcMMOmmoPlayer.getPlayer().getTeleportATS(), Config.getInstance().getXPAfterTeleportCooldown())) {
if(!isExploiting(player) && mcMMOPlayer.getAcrobaticsManager().canGainRollXP()) if (!isExploiting(mmoPlayer) && mmoPlayer.getAcrobaticsManager().canGainRollXP())
SkillUtils.applyXpGain(mcMMOPlayer, getPrimarySkill(), calculateRollXP(player, damage, true), XPGainReason.PVE); SkillUtils.applyXpGain(mmoPlayer, getPrimarySkill(), calculateRollXP(mmoPlayer, damage, true), XPGainReason.PVE);
//} //}
addFallLocation(player); addFallLocation(mmoPlayer);
return modifiedDamage; return modifiedDamage;
} } else if (!isFatal(mmoPlayer, damage)) {
else if (!isFatal(player, damage)) { //if (!SkillUtils.cooldownExpired((long) mmoPlayer.getTeleportATS(), Config.getInstance().getXPAfterTeleportCooldown())) {
//if (!SkillUtils.cooldownExpired((long) mcMMOPlayer.getTeleportATS(), Config.getInstance().getXPAfterTeleportCooldown())) { if (!isExploiting(mmoPlayer) && mmoPlayer.getAcrobaticsManager().canGainRollXP())
if(!isExploiting(player) && mcMMOPlayer.getAcrobaticsManager().canGainRollXP()) SkillUtils.applyXpGain(mmoPlayer, getPrimarySkill(), calculateRollXP(mmoPlayer, damage, false), XPGainReason.PVE);
SkillUtils.applyXpGain(mcMMOPlayer, getPrimarySkill(), calculateRollXP(player, damage, false), XPGainReason.PVE);
//} //}
} }
addFallLocation(player); addFallLocation(mmoPlayer);
return damage; return damage;
} }
private int getActivationChance(McMMOPlayer mcMMOPlayer) { private int getActivationChance(McMMOPlayer mmoPlayer) {
return PerksUtils.handleLuckyPerks(mcMMOPlayer.getPlayer(), getPrimarySkill()); return PerksUtils.handleLuckyPerks(mmoPlayer, getPrimarySkill());
} }
/** /**
@ -245,37 +239,35 @@ public class Roll extends AcrobaticsSubSkill {
* @param damage The amount of damage initially dealt by the event * @param damage The amount of damage initially dealt by the event
* @return the modified event damage if the ability was successful, the original event damage otherwise * @return the modified event damage if the ability was successful, the original event damage otherwise
*/ */
private double gracefulRollCheck(Player player, McMMOPlayer mcMMOPlayer, double damage, int skillLevel) { private double gracefulRollCheck(McMMOPlayer mmoPlayer, double damage, int skillLevel) {
double modifiedDamage = calculateModifiedRollDamage(damage, mcMMO.p.getAdvancedConfig().getRollDamageThreshold() * 2); double modifiedDamage = calculateModifiedRollDamage(damage, mcMMO.p.getAdvancedConfig().getRollDamageThreshold() * 2);
Probability gracefulProbability = getGracefulProbability(player); final Probability gracefulProbability = getGracefulProbability(mmoPlayer);
if (!isFatal(player, modifiedDamage) if (!isFatal(mmoPlayer, modifiedDamage)
//TODO: Graceful isn't sending out an event //TODO: Graceful isn't sending out an event
&& ProbabilityUtil.isStaticSkillRNGSuccessful(PrimarySkillType.ACROBATICS, player, gracefulProbability)) && ProbabilityUtil.isStaticSkillRNGSuccessful(PrimarySkillType.ACROBATICS, mmoPlayer, gracefulProbability)) {
{ NotificationManager.sendPlayerInformation(mmoPlayer.getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Acrobatics.Ability.Proc");
NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Acrobatics.Ability.Proc"); SoundManager.sendCategorizedSound(mmoPlayer.getPlayer(), mmoPlayer.getPlayer().getLocation(), SoundType.ROLL_ACTIVATED, SoundCategory.PLAYERS,0.5F);
SoundManager.sendCategorizedSound(player, player.getLocation(), SoundType.ROLL_ACTIVATED, SoundCategory.PLAYERS,0.5F); if (!isExploiting(mmoPlayer) && mmoPlayer.getAcrobaticsManager().canGainRollXP())
if(!isExploiting(player) && mcMMOPlayer.getAcrobaticsManager().canGainRollXP()) SkillUtils.applyXpGain(mmoPlayer, getPrimarySkill(), calculateRollXP(mmoPlayer, damage, true), XPGainReason.PVE);
SkillUtils.applyXpGain(mcMMOPlayer, getPrimarySkill(), calculateRollXP(player, damage, true), XPGainReason.PVE);
addFallLocation(player); addFallLocation(mmoPlayer);
return modifiedDamage; return modifiedDamage;
} } else if (!isFatal(mmoPlayer, damage)) {
else if (!isFatal(player, damage)) { if (!isExploiting(mmoPlayer) && mmoPlayer.getAcrobaticsManager().canGainRollXP())
if(!isExploiting(player) && mcMMOPlayer.getAcrobaticsManager().canGainRollXP()) SkillUtils.applyXpGain(mmoPlayer, getPrimarySkill(), calculateRollXP(mmoPlayer, damage, false), XPGainReason.PVE);
SkillUtils.applyXpGain(mcMMOPlayer, getPrimarySkill(), calculateRollXP(player, damage, false), XPGainReason.PVE);
addFallLocation(player); addFallLocation(mmoPlayer);
} }
return damage; return damage;
} }
@NotNull @NotNull
public static Probability getGracefulProbability(Player player) { public static Probability getGracefulProbability(McMMOPlayer mmoPlayer) {
double gracefulOdds = ProbabilityUtil.getSubSkillProbability(SubSkillType.ACROBATICS_ROLL, player).getValue() * 2; double gracefulOdds = ProbabilityUtil.getSubSkillProbability(SubSkillType.ACROBATICS_ROLL, mmoPlayer).getValue() * 2;
return Probability.ofPercent(gracefulOdds); return Probability.ofValue(gracefulOdds);
} }
/** /**
@ -284,24 +276,21 @@ public class Roll extends AcrobaticsSubSkill {
* *
* @return true if exploits are detected, false otherwise * @return true if exploits are detected, false otherwise
*/ */
private boolean isExploiting(Player player) { private boolean isExploiting(McMMOPlayer mmoPlayer) {
if (!ExperienceConfig.getInstance().isAcrobaticsExploitingPrevented()) { if (!ExperienceConfig.getInstance().isAcrobaticsExploitingPrevented()) {
return false; return false;
} }
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); if (ItemUtils.hasItemInEitherHand(mmoPlayer.getPlayer(), Material.ENDER_PEARL) || mmoPlayer.getPlayer().isInsideVehicle()) {
if (mmoPlayer.isDebugMode()) {
if (ItemUtils.hasItemInEitherHand(player, Material.ENDER_PEARL) || player.isInsideVehicle()) { mmoPlayer.getPlayer().sendMessage("Acrobatics XP Prevented: Ender Pearl or Inside Vehicle");
if(mcMMOPlayer.isDebugMode()) {
mcMMOPlayer.getPlayer().sendMessage("Acrobatics XP Prevented: Ender Pearl or Inside Vehicle");
} }
return true; return true;
} }
if(UserManager.getPlayer(player).getAcrobaticsManager().hasFallenInLocationBefore(getBlockLocation(player))) if (mmoPlayer.getAcrobaticsManager().hasFallenInLocationBefore(getBlockLocation(mmoPlayer))) {
{ if (mmoPlayer.isDebugMode()) {
if(mcMMOPlayer.isDebugMode()) { mmoPlayer.getPlayer().sendMessage("Acrobatics XP Prevented: Fallen in location before");
mcMMOPlayer.getPlayer().sendMessage("Acrobatics XP Prevented: Fallen in location before");
} }
return true; return true;
@ -310,14 +299,14 @@ public class Roll extends AcrobaticsSubSkill {
return false; //NOT EXPLOITING return false; //NOT EXPLOITING
} }
private float calculateRollXP(Player player, double damage, boolean isRoll) { private float calculateRollXP(McMMOPlayer mmoPlayer, double damage, boolean isRoll) {
//Clamp Damage to account for insane DRs //Clamp Damage to account for insane DRs
damage = Math.min(20, damage); damage = Math.min(20, damage);
ItemStack boots = player.getInventory().getBoots(); ItemStack boots = mmoPlayer.getPlayer().getInventory().getBoots();
float xp = (float) (damage * (isRoll ? ExperienceConfig.getInstance().getRollXPModifier() : ExperienceConfig.getInstance().getFallXPModifier())); float xp = (float) (damage * (isRoll ? ExperienceConfig.getInstance().getRollXPModifier() : ExperienceConfig.getInstance().getFallXPModifier()));
if (boots != null && boots.containsEnchantment(Enchantment.PROTECTION_FALL)) { if (boots != null && boots.containsEnchantment(mcMMO.p.getEnchantmentMapper().getFeatherFalling())) {
xp *= ExperienceConfig.getInstance().getFeatherFallXPModifier(); xp *= ExperienceConfig.getInstance().getFeatherFallXPModifier();
} }
@ -328,8 +317,8 @@ public class Roll extends AcrobaticsSubSkill {
return Math.max(damage - damageThreshold, 0.0); return Math.max(damage - damageThreshold, 0.0);
} }
private boolean isFatal(Player player, double damage) { private boolean isFatal(McMMOPlayer mmoPlayer, double damage) {
return player.getHealth() - damage <= 0; return mmoPlayer.getPlayer().getHealth() - damage <= 0;
} }
/** /**
@ -345,103 +334,50 @@ public class Roll extends AcrobaticsSubSkill {
/** /**
* Prints detailed info about this subskill to the player * Prints detailed info about this subskill to the player
* *
* @param player the target player * @param mmoPlayer the target player
*/ */
@Override @Override
public void printInfo(Player player) { public void printInfo(McMMOPlayer mmoPlayer) {
//Header //Header
super.printInfo(player); super.printInfo(mmoPlayer);
//Start the description string. //Start the description string.
//player.sendMessage(getDescription()); //player.sendMessage(getDescription());
//Player stats //Player stats
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.Stats", mmoPlayer.getPlayer().sendMessage(LocaleLoader.getString("Commands.MmoInfo.Stats",
LocaleLoader.getString("Acrobatics.SubSkill.Roll.Stats", getStats(player)))); LocaleLoader.getString("Acrobatics.SubSkill.Roll.Stats", getStats(mmoPlayer))));
//Mechanics //Mechanics
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.Mechanics")); mmoPlayer.getPlayer().sendMessage(LocaleLoader.getString("Commands.MmoInfo.Mechanics"));
player.sendMessage(getMechanics()); mmoPlayer.getPlayer().sendMessage(getMechanics());
} }
/**
* Returns a collection of strings about how a skill works
* Used in the MMO Info command
*
* @return
*/
@Override @Override
public String getMechanics() { public String getMechanics() {
//Vars passed to locale
//0 = chance to roll at half max level
//1 = chance to roll with grace at half max level
//2 = level where maximum bonus is reached
//3 = additive chance to succeed per level
//4 = damage threshold when rolling
//5 = damage threshold when rolling with grace
//6 = half of level where maximum bonus is reached
/*
Roll:
# ChanceMax: Maximum chance of rolling when on <MaxBonusLevel> or higher
# MaxBonusLevel: On this level or higher, the roll chance will not go higher than <ChanceMax>
# DamageThreshold: The max damage a player can negate with a roll
ChanceMax: 100.0
MaxBonusLevel: 100
DamageThreshold: 7.0
*/
return "Under Construction: This will work in a future update."; return "Under Construction: This will work in a future update.";
//
// double rollChanceHalfMax, graceChanceHalfMax, damageThreshold, chancePerLevel;
//
// //Chance to roll at half max skill
// RandomChanceSkill rollHalfMaxSkill = new RandomChanceSkill(null, subSkillType);
// int halfMaxSkillValue = mcMMO.p.getAdvancedConfig().getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL)/2;
// rollHalfMaxSkill.setSkillLevel(halfMaxSkillValue);
//
// //Chance to graceful roll at full skill
// RandomChanceSkill rollGraceHalfMaxSkill = new RandomChanceSkill(null, subSkillType);
// rollGraceHalfMaxSkill.setSkillLevel(halfMaxSkillValue * 2); //Double the effective odds
//
// //Chance to roll per level
// RandomChanceSkill rollOneSkillLevel = new RandomChanceSkill(null, subSkillType);
// rollGraceHalfMaxSkill.setSkillLevel(1); //Level 1 skill
//
// //Chance Stat Calculations
// rollChanceHalfMax = RandomChanceUtil.getRandomChanceExecutionChance(rollHalfMaxSkill);
// graceChanceHalfMax = RandomChanceUtil.getRandomChanceExecutionChance(rollGraceHalfMaxSkill);
// damageThreshold = mcMMO.p.getAdvancedConfig().getRollDamageThreshold();
//
// chancePerLevel = RandomChanceUtil.getRandomChanceExecutionChance(rollOneSkillLevel);
//
// double maxLevel = mcMMO.p.getAdvancedConfig().getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL);
//
// return LocaleLoader.getString("Acrobatics.SubSkill.Roll.Mechanics", rollChanceHalfMax, graceChanceHalfMax, maxLevel, chancePerLevel, damageThreshold, damageThreshold * 2,halfMaxSkillValue);
} }
/** /**
* Get an array of various stats for a player * Get an array of various stats for a player
* *
* @param player target player * @param mmoPlayer target player
* @return stat array for target player for this skill * @return stat array for target player for this skill
*/ */
@Override @Override
public Double[] getStats(Player player) public Double[] getStats(McMMOPlayer mmoPlayer) {
{ double playerChanceRoll = ProbabilityUtil.getSubSkillProbability(subSkillType, mmoPlayer).getValue();
double playerChanceRoll = ProbabilityUtil.getSubSkillProbability(subSkillType, player).getValue();
double playerChanceGrace = playerChanceRoll * 2; double playerChanceGrace = playerChanceRoll * 2;
double gracefulOdds = ProbabilityUtil.getSubSkillProbability(subSkillType, player).getValue() * 2; double gracefulOdds = ProbabilityUtil.getSubSkillProbability(subSkillType, mmoPlayer).getValue() * 2;
return new Double[]{ playerChanceRoll, playerChanceGrace }; return new Double[]{ playerChanceRoll, playerChanceGrace };
} }
public void addFallLocation(@NotNull Player player) public void addFallLocation(@NotNull McMMOPlayer mmoPlayer) {
{ mmoPlayer.getAcrobaticsManager().addLocationToFallMap(getBlockLocation(mmoPlayer));
UserManager.getPlayer(player).getAcrobaticsManager().addLocationToFallMap(getBlockLocation(player));
} }
public @NotNull Location getBlockLocation(@NotNull Player player) public @NotNull Location getBlockLocation(@NotNull McMMOPlayer mmoPlayer) {
{ return mmoPlayer.getPlayer().getLocation().getBlock().getLocation();
return player.getLocation().getBlock().getLocation();
} }
} }

View File

@ -1,5 +1,6 @@
package com.gmail.nossr50.datatypes.skills.subskills.interfaces; package com.gmail.nossr50.datatypes.skills.subskills.interfaces;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.interfaces.Skill; import com.gmail.nossr50.datatypes.skills.interfaces.Skill;
import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TextComponent;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -19,10 +20,10 @@ public interface SubSkill extends Skill {
/** /**
* Get an array of various stats for a player * Get an array of various stats for a player
* @param player target player * @param mmoPlayer target player
* @return stat array for target player for this skill * @return stat array for target player for this skill
*/ */
Double[] getStats(Player player); Double[] getStats(McMMOPlayer mmoPlayer);
/** /**
* Checks if a player has permission to use this skill * Checks if a player has permission to use this skill
@ -59,9 +60,9 @@ public interface SubSkill extends Skill {
/** /**
* Adds detailed stats specific to this skill * Adds detailed stats specific to this skill
* @param componentBuilder target component builder * @param componentBuilder target component builder
* @param player owner of this skill * @param mmoPlayer owner of this skill
*/ */
void addStats(TextComponent.Builder componentBuilder, Player player); void addStats(TextComponent.Builder componentBuilder, McMMOPlayer mmoPlayer);
/** /**
* Whether this subskill is enabled * Whether this subskill is enabled
@ -71,7 +72,7 @@ public interface SubSkill extends Skill {
/** /**
* Prints detailed info about this subskill to the player * Prints detailed info about this subskill to the player
* @param player the target player * @param mmoPlayer the target player
*/ */
void printInfo(Player player); void printInfo(McMMOPlayer mmoPlayer);
} }

View File

@ -18,8 +18,7 @@ abstract public class McMMOScoreboardEvent extends Event {
private final ScoreboardEventReason scoreboardEventReason; private final ScoreboardEventReason scoreboardEventReason;
public McMMOScoreboardEvent(Scoreboard targetBoard, Scoreboard currentBoard, Player targetPlayer, ScoreboardEventReason scoreboardEventReason) public McMMOScoreboardEvent(Scoreboard targetBoard, Scoreboard currentBoard, Player targetPlayer, ScoreboardEventReason scoreboardEventReason) {
{
this.scoreboardEventReason = scoreboardEventReason; this.scoreboardEventReason = scoreboardEventReason;
this.targetBoard = targetBoard; this.targetBoard = targetBoard;
this.currentBoard = currentBoard; this.currentBoard = currentBoard;

View File

@ -1,5 +1,6 @@
package com.gmail.nossr50.events.skills; package com.gmail.nossr50.events.skills;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -7,19 +8,35 @@ import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent; import org.bukkit.event.player.PlayerEvent;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static java.util.Objects.requireNonNull;
/** /**
* Generic event for mcMMO skill handling. * Generic event for mcMMO skill handling.
*/ */
public abstract class McMMOPlayerSkillEvent extends PlayerEvent { public abstract class McMMOPlayerSkillEvent extends PlayerEvent {
protected @NotNull PrimarySkillType skill; protected @NotNull PrimarySkillType skill;
protected int skillLevel; protected int skillLevel;
protected McMMOPlayer mmoPlayer;
@Deprecated(forRemoval = true, since = "2.2.010")
protected McMMOPlayerSkillEvent(@NotNull Player player, @NotNull PrimarySkillType skill) { protected McMMOPlayerSkillEvent(@NotNull Player player, @NotNull PrimarySkillType skill) {
super(player); super(player);
McMMOPlayer mmoPlayer = UserManager.getPlayer(player);
requireNonNull(mmoPlayer, "Player not found in UserManager," +
"contact the dev and tell them to use the constructor for" +
" McMMOPlayerSkillEvent(McMMOPlayer, PrimarySkillType) instead");
this.skill = skill; this.skill = skill;
this.skillLevel = UserManager.getPlayer(player).getSkillLevel(skill); this.skillLevel = UserManager.getPlayer(player).getSkillLevel(skill);
} }
protected McMMOPlayerSkillEvent(@NotNull McMMOPlayer mmoPlayer, @NotNull PrimarySkillType primarySkillType) {
super(mmoPlayer.getPlayer());
requireNonNull(mmoPlayer, "mmoPlayer cannot be null");
requireNonNull(primarySkillType, "primarySkillType cannot be null");
this.skill = primarySkillType;
this.skillLevel = mmoPlayer.getSkillLevel(primarySkillType);
}
/** /**
* @return The skill involved in this event * @return The skill involved in this event
*/ */
@ -37,6 +54,15 @@ public abstract class McMMOPlayerSkillEvent extends PlayerEvent {
/** Rest of file is required boilerplate for custom events **/ /** Rest of file is required boilerplate for custom events **/
private static final HandlerList handlers = new HandlerList(); private static final HandlerList handlers = new HandlerList();
/**
* Returns the {@link McMMOPlayer} associated with this event.
*
* @return The {@link McMMOPlayer} associated with this event.
*/
public @NotNull McMMOPlayer getMcMMOPlayer() {
return mmoPlayer;
}
@Override @Override
public @NotNull HandlerList getHandlers() { public @NotNull HandlerList getHandlers() {
return handlers; return handlers;

View File

@ -1,14 +1,24 @@
package com.gmail.nossr50.events.skills.abilities; package com.gmail.nossr50.events.skills.abilities;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import java.util.Objects;
public class McMMOPlayerAbilityActivateEvent extends McMMOPlayerAbilityEvent implements Cancellable { public class McMMOPlayerAbilityActivateEvent extends McMMOPlayerAbilityEvent implements Cancellable {
private boolean cancelled; private boolean cancelled;
@Deprecated(forRemoval = true, since = "2.2.010")
public McMMOPlayerAbilityActivateEvent(Player player, PrimarySkillType skill) { public McMMOPlayerAbilityActivateEvent(Player player, PrimarySkillType skill) {
super(player, skill); super(Objects.requireNonNull(UserManager.getPlayer(player)), skill);
cancelled = false;
}
public McMMOPlayerAbilityActivateEvent(McMMOPlayer mmoPlayer, PrimarySkillType skill) {
super(mmoPlayer, skill);
cancelled = false; cancelled = false;
} }

View File

@ -1,10 +1,20 @@
package com.gmail.nossr50.events.skills.abilities; package com.gmail.nossr50.events.skills.abilities;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import static java.util.Objects.requireNonNull;
public class McMMOPlayerAbilityDeactivateEvent extends McMMOPlayerAbilityEvent { public class McMMOPlayerAbilityDeactivateEvent extends McMMOPlayerAbilityEvent {
public McMMOPlayerAbilityDeactivateEvent(Player player, PrimarySkillType skill) { @Deprecated(forRemoval = true, since = "2.2.010")
super(player, skill); public McMMOPlayerAbilityDeactivateEvent(@NotNull Player player, @NotNull PrimarySkillType skill) {
this(requireNonNull(UserManager.getPlayer(player)), skill);
}
public McMMOPlayerAbilityDeactivateEvent(@NotNull McMMOPlayer mmoPlayer, @NotNull PrimarySkillType skill) {
super(mmoPlayer, skill);
} }
} }

View File

@ -1,16 +1,38 @@
package com.gmail.nossr50.events.skills.abilities; package com.gmail.nossr50.events.skills.abilities;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.datatypes.skills.SuperAbilityType; import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent; import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.Objects;
public class McMMOPlayerAbilityEvent extends McMMOPlayerSkillEvent { public class McMMOPlayerAbilityEvent extends McMMOPlayerSkillEvent {
private final SuperAbilityType ability; private final SuperAbilityType ability;
/**
* Create a new McMMOPlayerAbilityEvent.
*
* @param player The player involved in this event
* @param skill The skill involved in this event
* @deprecated Use {@link #McMMOPlayerAbilityEvent(McMMOPlayer, PrimarySkillType)} instead
*/
@Deprecated(forRemoval = true, since = "2.2.010")
protected McMMOPlayerAbilityEvent(Player player, PrimarySkillType skill) { protected McMMOPlayerAbilityEvent(Player player, PrimarySkillType skill) {
super(player, skill); super(Objects.requireNonNull(UserManager.getPlayer(player)), skill);
ability = mcMMO.p.getSkillTools().getSuperAbility(skill);
}
/**
* Create a new McMMOPlayerAbilityEvent.
* @param mmoPlayer The McMMOPlayer involved in this event
* @param skill The skill involved in this event
*/
protected McMMOPlayerAbilityEvent(McMMOPlayer mmoPlayer, PrimarySkillType skill) {
super(mmoPlayer, skill);
ability = mcMMO.p.getSkillTools().getSuperAbility(skill); ability = mcMMO.p.getSkillTools().getSuperAbility(skill);
} }

View File

@ -1,24 +1,36 @@
package com.gmail.nossr50.events.skills.alchemy; package com.gmail.nossr50.events.skills.alchemy;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent; import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockState; import org.bukkit.block.BlockState;
import org.bukkit.block.BrewingStand; import org.bukkit.block.BrewingStand;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.jetbrains.annotations.NotNull;
import static java.util.Objects.requireNonNull;
public class McMMOPlayerBrewEvent extends McMMOPlayerSkillEvent implements Cancellable { public class McMMOPlayerBrewEvent extends McMMOPlayerSkillEvent implements Cancellable {
private final BlockState brewingStand; private final BlockState brewingStand;
private boolean cancelled; private boolean cancelled;
@Deprecated(forRemoval = true, since = "2.2.010")
public McMMOPlayerBrewEvent(Player player, BlockState brewingStand) { public McMMOPlayerBrewEvent(Player player, BlockState brewingStand) {
super(player, PrimarySkillType.ALCHEMY); super(requireNonNull(UserManager.getPlayer(player)), PrimarySkillType.ALCHEMY);
this.brewingStand = brewingStand; this.brewingStand = brewingStand;
cancelled = false; cancelled = false;
} }
public McMMOPlayerBrewEvent(@NotNull McMMOPlayer mmoPlayer, @NotNull BlockState brewingStand) {
super(mmoPlayer, PrimarySkillType.ALCHEMY);
this.brewingStand = requireNonNull(brewingStand);
cancelled = false;
}
public boolean isCancelled() { public boolean isCancelled() {
return cancelled; return cancelled;
} }

View File

@ -1,17 +1,28 @@
package com.gmail.nossr50.events.skills.alchemy; package com.gmail.nossr50.events.skills.alchemy;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent; import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import static java.util.Objects.requireNonNull;
public class McMMOPlayerCatalysisEvent extends McMMOPlayerSkillEvent implements Cancellable { public class McMMOPlayerCatalysisEvent extends McMMOPlayerSkillEvent implements Cancellable {
private double speed; private double speed;
private boolean cancelled; private boolean cancelled;
@Deprecated(forRemoval = true, since = "2.2.010")
public McMMOPlayerCatalysisEvent(Player player, double speed) { public McMMOPlayerCatalysisEvent(Player player, double speed) {
super(player, PrimarySkillType.ALCHEMY); super(requireNonNull(UserManager.getPlayer(player)), PrimarySkillType.ALCHEMY);
this.speed = speed;
cancelled = false;
}
public McMMOPlayerCatalysisEvent(McMMOPlayer mmoPlayer, double speed) {
super(mmoPlayer, PrimarySkillType.ALCHEMY);
this.speed = speed; this.speed = speed;
cancelled = false; cancelled = false;
} }

View File

@ -1,15 +1,23 @@
package com.gmail.nossr50.events.skills.fishing; package com.gmail.nossr50.events.skills.fishing;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent; import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
public class McMMOPlayerFishingEvent extends McMMOPlayerSkillEvent implements Cancellable { public class McMMOPlayerFishingEvent extends McMMOPlayerSkillEvent implements Cancellable {
private boolean cancelled; private boolean cancelled;
@Deprecated(forRemoval = true, since = "2.2.010")
protected McMMOPlayerFishingEvent(Player player) { protected McMMOPlayerFishingEvent(Player player) {
super(player, PrimarySkillType.FISHING); super(UserManager.getPlayer(player), PrimarySkillType.FISHING);
cancelled = false;
}
protected McMMOPlayerFishingEvent(McMMOPlayer mmoPlayer) {
super(mmoPlayer, PrimarySkillType.FISHING);
cancelled = false; cancelled = false;
} }

View File

@ -1,23 +1,34 @@
package com.gmail.nossr50.events.skills.fishing; package com.gmail.nossr50.events.skills.fishing;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static java.util.Objects.requireNonNull;
public class McMMOPlayerFishingTreasureEvent extends McMMOPlayerFishingEvent { public class McMMOPlayerFishingTreasureEvent extends McMMOPlayerFishingEvent {
private ItemStack treasure; private ItemStack treasure;
private int xp; private int xp;
@Deprecated(forRemoval = true, since = "2.2.010")
public McMMOPlayerFishingTreasureEvent(Player player, ItemStack treasure, int xp) { public McMMOPlayerFishingTreasureEvent(Player player, ItemStack treasure, int xp) {
super(player); this(requireNonNull(UserManager.getPlayer(player)), treasure, xp);
}
public McMMOPlayerFishingTreasureEvent(@NotNull McMMOPlayer mmoPlayer, @Nullable ItemStack treasure, int xp) {
super(mmoPlayer);
this.treasure = treasure; this.treasure = treasure;
this.xp = xp; this.xp = xp;
} }
public ItemStack getTreasure() { public @Nullable ItemStack getTreasure() {
return treasure; return treasure;
} }
public void setTreasure(ItemStack item) { public void setTreasure(@Nullable ItemStack item) {
this.treasure = item; this.treasure = item;
} }

View File

@ -1,20 +1,32 @@
package com.gmail.nossr50.events.skills.fishing; package com.gmail.nossr50.events.skills.fishing;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class McMMOPlayerMagicHunterEvent extends McMMOPlayerFishingTreasureEvent { import static java.util.Objects.requireNonNull;
private final Map<Enchantment, Integer> enchants;
public McMMOPlayerMagicHunterEvent(Player player, ItemStack treasure, int xp, Map<Enchantment, Integer> enchants) { public class McMMOPlayerMagicHunterEvent extends McMMOPlayerFishingTreasureEvent {
super(player, treasure, xp); private final Map<Enchantment, Integer> enchants = new HashMap<>();
this.enchants = enchants;
@Deprecated(forRemoval = true, since = "2.2.010")
public McMMOPlayerMagicHunterEvent(@NotNull Player player, @NotNull ItemStack treasure, int xp, @NotNull Map<Enchantment, Integer> enchants) {
this(requireNonNull(UserManager.getPlayer(player)), treasure, xp, enchants);
} }
public Map<Enchantment, Integer> getEnchantments() { public McMMOPlayerMagicHunterEvent(@NotNull McMMOPlayer mmoPlayer, @NotNull ItemStack treasure, int xp, @NotNull Map<Enchantment, Integer> enchants) {
super(mmoPlayer, treasure, xp);
requireNonNull(enchants, "enchants cannot be null");
this.enchants.putAll(enchants);
}
public @NotNull Map<Enchantment, Integer> getEnchantments() {
return enchants; return enchants;
} }
} }

View File

@ -1,11 +1,16 @@
package com.gmail.nossr50.events.skills.secondaryabilities; package com.gmail.nossr50.events.skills.secondaryabilities;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill;
import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent; import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.jetbrains.annotations.NotNull;
import static java.util.Objects.requireNonNull;
public class SubSkillEvent extends McMMOPlayerSkillEvent implements Cancellable { public class SubSkillEvent extends McMMOPlayerSkillEvent implements Cancellable {
private SubSkillType subSkillType; private SubSkillType subSkillType;
@ -16,9 +21,20 @@ public class SubSkillEvent extends McMMOPlayerSkillEvent implements Cancellable
* Only skills using the old system will fire this event * Only skills using the old system will fire this event
* @param player target player * @param player target player
* @param subSkillType target subskill * @param subSkillType target subskill
* @deprecated Use {@link #SubSkillEvent(McMMOPlayer, SubSkillType)} instead
*/ */
public SubSkillEvent(Player player, SubSkillType subSkillType) { @Deprecated(forRemoval = true, since = "2.2.010")
super(player, mcMMO.p.getSkillTools().getPrimarySkillBySubSkill(subSkillType)); public SubSkillEvent(@NotNull Player player, @NotNull SubSkillType subSkillType) {
this(requireNonNull(UserManager.getPlayer(player)), subSkillType);
}
/**
* Only skills using the old system will fire this event
* @param mmoPlayer target player
* @param subSkillType target subskill
*/
public SubSkillEvent(@NotNull McMMOPlayer mmoPlayer, @NotNull SubSkillType subSkillType) {
super(mmoPlayer, mcMMO.p.getSkillTools().getPrimarySkillBySubSkill(subSkillType));
this.subSkillType = subSkillType; this.subSkillType = subSkillType;
} }
@ -28,15 +44,30 @@ public class SubSkillEvent extends McMMOPlayerSkillEvent implements Cancellable
* @param subSkillType target subskill * @param subSkillType target subskill
* @param resultModifier a value multiplied against the final result of the dice roll, typically between 0-1.0 * @param resultModifier a value multiplied against the final result of the dice roll, typically between 0-1.0
*/ */
public SubSkillEvent(Player player, SubSkillType subSkillType, double resultModifier) { @Deprecated(forRemoval = true, since = "2.2.010")
public SubSkillEvent(@NotNull Player player, @NotNull SubSkillType subSkillType, double resultModifier) {
this(requireNonNull(UserManager.getPlayer(player)), subSkillType, resultModifier);
}
/**
* Only skills using the old system will fire this event
* @param player target player
* @param subSkillType target subskill
* @param resultModifier a value multiplied against the final result of the dice roll, typically between 0-1.0
*/
public SubSkillEvent(@NotNull McMMOPlayer player, @NotNull SubSkillType subSkillType, double resultModifier) {
super(player, mcMMO.p.getSkillTools().getPrimarySkillBySubSkill(subSkillType)); super(player, mcMMO.p.getSkillTools().getPrimarySkillBySubSkill(subSkillType));
this.subSkillType = subSkillType; this.subSkillType = requireNonNull(subSkillType, "subSkillType cannot be null");
this.resultModifier = resultModifier; this.resultModifier = resultModifier;
} }
public SubSkillEvent(Player player, AbstractSubSkill abstractSubSkill) @Deprecated(forRemoval = true, since = "2.2.010")
{ public SubSkillEvent(@NotNull Player player, @NotNull AbstractSubSkill abstractSubSkill) {
super(player, abstractSubSkill.getPrimarySkill()); this(requireNonNull(UserManager.getPlayer(player)), abstractSubSkill);
}
public SubSkillEvent(@NotNull McMMOPlayer mmoPlayer, @NotNull AbstractSubSkill abstractSubSkill) {
super(mmoPlayer, abstractSubSkill.getPrimarySkill());
} }
public double getResultModifier() { public double getResultModifier() {

View File

@ -47,8 +47,7 @@ public class BlockListener implements Listener {
} }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
public void onBlockDropItemEvent(BlockDropItemEvent event) public void onBlockDropItemEvent(BlockDropItemEvent event) {
{
//Make sure we clean up metadata on these blocks //Make sure we clean up metadata on these blocks
if (event.isCancelled()) { if (event.isCancelled()) {
if (event.getBlock().hasMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS)) if (event.getBlock().hasMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS))
@ -84,8 +83,7 @@ public class BlockListener implements Listener {
//If there are more than one block in the item list we can't really trust it and will back out of rewarding bonus drops //If there are more than one block in the item list we can't really trust it and will back out of rewarding bonus drops
if (blockCount <= 1) { if (blockCount <= 1) {
for(Item item : event.getItems()) for(Item item : event.getItems()) {
{
ItemStack is = new ItemStack(item.getItemStack()); ItemStack is = new ItemStack(item.getItemStack());
if (is.getAmount() <= 0) if (is.getAmount() <= 0)
@ -186,8 +184,7 @@ public class BlockListener implements Listener {
* @param event The event to watch * @param event The event to watch
*/ */
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityBlockFormEvent(EntityBlockFormEvent event) public void onEntityBlockFormEvent(EntityBlockFormEvent event) {
{
/* WORLD BLACKLIST CHECK */ /* WORLD BLACKLIST CHECK */
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return; return;
@ -207,8 +204,7 @@ public class BlockListener implements Listener {
* Does not monitor stuff like a falling block replacing a liquid * Does not monitor stuff like a falling block replacing a liquid
*/ */
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockFormEvent(BlockFormEvent event) public void onBlockFormEvent(BlockFormEvent event) {
{
World world = event.getBlock().getWorld(); World world = event.getBlock().getWorld();
/* WORLD BLACKLIST CHECK */ /* WORLD BLACKLIST CHECK */
@ -266,8 +262,7 @@ public class BlockListener implements Listener {
if (blockState.getType() == Repair.anvilMaterial && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.REPAIR)) { if (blockState.getType() == Repair.anvilMaterial && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.REPAIR)) {
mcMMOPlayer.getRepairManager().placedAnvilCheck(); mcMMOPlayer.getRepairManager().placedAnvilCheck();
} } else if (blockState.getType() == Salvage.anvilMaterial && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.SALVAGE)) {
else if (blockState.getType() == Salvage.anvilMaterial && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.SALVAGE)) {
mcMMOPlayer.getSalvageManager().placedAnvilCheck(); mcMMOPlayer.getSalvageManager().placedAnvilCheck();
} }
} }
@ -310,7 +305,7 @@ public class BlockListener implements Listener {
// Minecraft is dumb, the events still throw when a plant "grows" higher than the max block height. Even though no new block is created // Minecraft is dumb, the events still throw when a plant "grows" higher than the max block height. Even though no new block is created
if (BlockUtils.isWithinWorldBounds(block)) { if (BlockUtils.isWithinWorldBounds(block)) {
mcMMO.getPlaceStore().setFalse(block); mcMMO.getUserBlockTracker().setEligible(block);
} }
} }
@ -334,8 +329,7 @@ public class BlockListener implements Listener {
} }
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer())) { if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer())) {
BlockUtils.cleanupBlockMetadata(block); BlockUtils.cleanupBlockMetadata(block);
return; return;
@ -400,19 +394,18 @@ public class BlockListener implements Listener {
else if (BlockUtils.affectedBySuperBreaker(blockState) else if (BlockUtils.affectedBySuperBreaker(blockState)
&& (ItemUtils.isPickaxe(heldItem) || ItemUtils.isHoe(heldItem)) && (ItemUtils.isPickaxe(heldItem) || ItemUtils.isHoe(heldItem))
&& mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.MINING) && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.MINING)
&& !mcMMO.getPlaceStore().isTrue(blockState)) { && !mcMMO.getUserBlockTracker().isIneligible(blockState)) {
MiningManager miningManager = mcMMOPlayer.getMiningManager(); MiningManager miningManager = mcMMOPlayer.getMiningManager();
miningManager.miningBlockCheck(blockState); miningManager.miningBlockCheck(blockState);
} }
/* WOOD CUTTING */ /* WOOD CUTTING */
else if (BlockUtils.hasWoodcuttingXP(blockState) && ItemUtils.isAxe(heldItem) else if (BlockUtils.hasWoodcuttingXP(blockState) && ItemUtils.isAxe(heldItem)
&& mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.WOODCUTTING) && !mcMMO.getPlaceStore().isTrue(blockState)) { && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.WOODCUTTING) && !mcMMO.getUserBlockTracker().isIneligible(blockState)) {
WoodcuttingManager woodcuttingManager = mcMMOPlayer.getWoodcuttingManager(); WoodcuttingManager woodcuttingManager = mcMMOPlayer.getWoodcuttingManager();
if (woodcuttingManager.canUseTreeFeller(heldItem)) { if (woodcuttingManager.canUseTreeFeller(heldItem)) {
woodcuttingManager.processTreeFeller(blockState); woodcuttingManager.processTreeFeller(blockState);
} } else {
else {
//Check for XP //Check for XP
woodcuttingManager.processWoodcuttingBlockXP(blockState); woodcuttingManager.processWoodcuttingBlockXP(blockState);
@ -422,7 +415,10 @@ public class BlockListener implements Listener {
} }
/* EXCAVATION */ /* EXCAVATION */
else if (BlockUtils.affectedByGigaDrillBreaker(blockState) && ItemUtils.isShovel(heldItem) && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.EXCAVATION) && !mcMMO.getPlaceStore().isTrue(blockState)) { else if (BlockUtils.affectedByGigaDrillBreaker(blockState)
&& ItemUtils.isShovel(heldItem)
&& mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.EXCAVATION)
&& !mcMMO.getUserBlockTracker().isIneligible(blockState)) {
ExcavationManager excavationManager = mcMMOPlayer.getExcavationManager(); ExcavationManager excavationManager = mcMMOPlayer.getExcavationManager();
excavationManager.excavationBlockCheck(blockState); excavationManager.excavationBlockCheck(blockState);
@ -450,8 +446,7 @@ public class BlockListener implements Listener {
return; return;
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer())) if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
return; return;
} }
@ -463,8 +458,7 @@ public class BlockListener implements Listener {
} }
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
@ -478,8 +472,7 @@ public class BlockListener implements Listener {
if (herbalismManager.processHylianLuck(blockState)) { if (herbalismManager.processHylianLuck(blockState)) {
blockState.update(true); blockState.update(true);
event.setCancelled(true); event.setCancelled(true);
} } else if (blockState.getType() == Material.FLOWER_POT) {
else if (blockState.getType() == Material.FLOWER_POT) {
blockState.setType(Material.AIR); blockState.setType(Material.AIR);
blockState.update(true); blockState.update(true);
event.setCancelled(true); event.setCancelled(true);
@ -513,8 +506,7 @@ public class BlockListener implements Listener {
return; return;
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer())) if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
return; return;
} }
@ -529,8 +521,7 @@ public class BlockListener implements Listener {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
//Profile not loaded //Profile not loaded
if(mcMMOPlayer == null) if (mcMMOPlayer == null) {
{
return; return;
} }
@ -544,17 +535,13 @@ public class BlockListener implements Listener {
if (mcMMOPlayer.getToolPreparationMode(ToolType.HOE) && ItemUtils.isHoe(heldItem) && (BlockUtils.affectedByGreenTerra(blockState) || BlockUtils.canMakeMossy(blockState)) && Permissions.greenTerra(player)) { if (mcMMOPlayer.getToolPreparationMode(ToolType.HOE) && ItemUtils.isHoe(heldItem) && (BlockUtils.affectedByGreenTerra(blockState) || BlockUtils.canMakeMossy(blockState)) && Permissions.greenTerra(player)) {
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.HERBALISM); mcMMOPlayer.checkAbilityActivation(PrimarySkillType.HERBALISM);
} } else if (mcMMOPlayer.getToolPreparationMode(ToolType.AXE) && ItemUtils.isAxe(heldItem) && BlockUtils.hasWoodcuttingXP(blockState) && Permissions.treeFeller(player)) {
else if (mcMMOPlayer.getToolPreparationMode(ToolType.AXE) && ItemUtils.isAxe(heldItem) && BlockUtils.hasWoodcuttingXP(blockState) && Permissions.treeFeller(player)) {
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.WOODCUTTING); mcMMOPlayer.checkAbilityActivation(PrimarySkillType.WOODCUTTING);
} } else if (mcMMOPlayer.getToolPreparationMode(ToolType.PICKAXE) && ItemUtils.isPickaxe(heldItem) && BlockUtils.affectedBySuperBreaker(blockState) && Permissions.superBreaker(player)) {
else if (mcMMOPlayer.getToolPreparationMode(ToolType.PICKAXE) && ItemUtils.isPickaxe(heldItem) && BlockUtils.affectedBySuperBreaker(blockState) && Permissions.superBreaker(player)) {
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.MINING); mcMMOPlayer.checkAbilityActivation(PrimarySkillType.MINING);
} } else if (mcMMOPlayer.getToolPreparationMode(ToolType.SHOVEL) && ItemUtils.isShovel(heldItem) && BlockUtils.affectedByGigaDrillBreaker(blockState) && Permissions.gigaDrillBreaker(player)) {
else if (mcMMOPlayer.getToolPreparationMode(ToolType.SHOVEL) && ItemUtils.isShovel(heldItem) && BlockUtils.affectedByGigaDrillBreaker(blockState) && Permissions.gigaDrillBreaker(player)) {
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.EXCAVATION); mcMMOPlayer.checkAbilityActivation(PrimarySkillType.EXCAVATION);
} } else if (mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && heldItem.getType() == Material.AIR && (BlockUtils.affectedByGigaDrillBreaker(blockState)
else if (mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && heldItem.getType() == Material.AIR && (BlockUtils.affectedByGigaDrillBreaker(blockState)
|| mcMMO.getMaterialMapStore().isGlass(blockState.getType()) || mcMMO.getMaterialMapStore().isGlass(blockState.getType())
|| blockState.getType() == Material.SNOW || blockState.getType() == Material.SNOW
|| BlockUtils.affectedByBlockCracker(blockState) && Permissions.berserk(player))) { || BlockUtils.affectedByBlockCracker(blockState) && Permissions.berserk(player))) {
@ -596,8 +583,7 @@ public class BlockListener implements Listener {
return; return;
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer())) if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
return; return;
} }
@ -615,8 +601,7 @@ public class BlockListener implements Listener {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
@ -633,14 +618,12 @@ public class BlockListener implements Listener {
if (mcMMOPlayer.getHerbalismManager().processGreenTerraBlockConversion(blockState)) { if (mcMMOPlayer.getHerbalismManager().processGreenTerraBlockConversion(blockState)) {
blockState.update(true); blockState.update(true);
} }
} } else if (mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK) && (heldItem.getType() == Material.AIR || mcMMO.p.getGeneralConfig().getUnarmedItemsAsUnarmed())) {
else if (mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK) && (heldItem.getType() == Material.AIR || mcMMO.p.getGeneralConfig().getUnarmedItemsAsUnarmed())) {
if (mcMMOPlayer.getUnarmedManager().canUseBlockCracker() && BlockUtils.affectedByBlockCracker(blockState)) { if (mcMMOPlayer.getUnarmedManager().canUseBlockCracker() && BlockUtils.affectedByBlockCracker(blockState)) {
if (EventUtils.simulateBlockBreak(block, player) && mcMMOPlayer.getUnarmedManager().blockCrackerCheck(blockState)) { if (EventUtils.simulateBlockBreak(block, player) && mcMMOPlayer.getUnarmedManager().blockCrackerCheck(blockState)) {
blockState.update(); blockState.update();
} }
} } else if (!event.getInstaBreak() && SuperAbilityType.BERSERK.blockCheck(blockState) && EventUtils.simulateBlockBreak(block, player)) {
else if (!event.getInstaBreak() && SuperAbilityType.BERSERK.blockCheck(blockState) && EventUtils.simulateBlockBreak(block, player)) {
event.setInstaBreak(true); event.setInstaBreak(true);
if (blockState.getType().getKey().getKey().contains("glass")) { if (blockState.getType().getKey().getKey().contains("glass")) {
@ -649,8 +632,7 @@ public class BlockListener implements Listener {
SoundManager.sendSound(player, block.getLocation(), SoundType.POP); SoundManager.sendSound(player, block.getLocation(), SoundType.POP);
} }
} }
} } else if (mcMMOPlayer.getWoodcuttingManager().canUseLeafBlower(heldItem) && BlockUtils.isNonWoodPartOfTree(blockState) && EventUtils.simulateBlockBreak(block, player)) {
else if (mcMMOPlayer.getWoodcuttingManager().canUseLeafBlower(heldItem) && BlockUtils.isNonWoodPartOfTree(blockState) && EventUtils.simulateBlockBreak(block, player)) {
event.setInstaBreak(true); event.setInstaBreak(true);
SoundManager.sendSound(player, block.getLocation(), SoundType.POP); SoundManager.sendSound(player, block.getLocation(), SoundType.POP);
} }
@ -662,8 +644,7 @@ public class BlockListener implements Listener {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
@ -680,23 +661,19 @@ public class BlockListener implements Listener {
//TODO: Convert into locale strings //TODO: Convert into locale strings
private void debugStickDump(Player player, BlockState blockState) { private void debugStickDump(Player player, BlockState blockState) {
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
if(UserManager.getPlayer(player).isDebugMode()) if (UserManager.getPlayer(player).isDebugMode()) {
{ if (mcMMO.getUserBlockTracker().isIneligible(blockState))
if(mcMMO.getPlaceStore().isTrue(blockState))
player.sendMessage("[mcMMO DEBUG] This block is not natural and does not reward treasures/XP"); player.sendMessage("[mcMMO DEBUG] This block is not natural and does not reward treasures/XP");
else else {
{
player.sendMessage("[mcMMO DEBUG] This block is considered natural by mcMMO"); player.sendMessage("[mcMMO DEBUG] This block is considered natural by mcMMO");
UserManager.getPlayer(player).getExcavationManager().printExcavationDebug(player, blockState); UserManager.getPlayer(player).getExcavationManager().printExcavationDebug(player, blockState);
} }
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (WorldGuardManager.getInstance().hasMainFlag(player)) if (WorldGuardManager.getInstance().hasMainFlag(player))
player.sendMessage("[mcMMO DEBUG] World Guard main flag is permitted for this player in this region"); player.sendMessage("[mcMMO DEBUG] World Guard main flag is permitted for this player in this region");
else else
@ -708,19 +685,16 @@ public class BlockListener implements Listener {
player.sendMessage("[mcMMO DEBUG] World Guard xp flag is not permitted for this player in this region"); player.sendMessage("[mcMMO DEBUG] World Guard xp flag is not permitted for this player in this region");
} }
if(blockState instanceof Furnace furnace) if (blockState instanceof Furnace || blockState instanceof BrewingStand) {
{ if (ContainerMetadataUtils.isContainerOwned(blockState)) {
if(mcMMO.getSmeltingTracker().isFurnaceOwned(furnace)) player.sendMessage("[mcMMO DEBUG] This container has a registered owner");
{ final OfflinePlayer furnacePlayer = ContainerMetadataUtils.getContainerOwner(blockState);
player.sendMessage("[mcMMO DEBUG] This furnace has a registered owner"); if (furnacePlayer != null) {
OfflinePlayer furnacePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); player.sendMessage("[mcMMO DEBUG] This container is owned by player "+furnacePlayer.getName());
if(furnacePlayer != null)
{
player.sendMessage("[mcMMO DEBUG] This furnace is owned by player "+furnacePlayer.getName());
} }
} }
else else
player.sendMessage("[mcMMO DEBUG] This furnace does not have a registered owner"); player.sendMessage("[mcMMO DEBUG] This container does not have a registered owner");
} }
if (ExperienceConfig.getInstance().isExperienceBarsEnabled()) if (ExperienceConfig.getInstance().isExperienceBarsEnabled())

View File

@ -12,7 +12,8 @@ public class ChunkListener implements Listener {
@EventHandler(ignoreCancelled = true) @EventHandler(ignoreCancelled = true)
public void onChunkUnload(ChunkUnloadEvent event) { public void onChunkUnload(ChunkUnloadEvent event) {
List<LivingEntity> matchingEntities = mcMMO.getTransientEntityTracker().getAllTransientEntitiesInChunk(event.getChunk()); List<LivingEntity> matchingEntities
= mcMMO.getTransientEntityTracker().getAllTransientEntitiesInChunk(event.getChunk());
for(LivingEntity livingEntity : matchingEntities) { for(LivingEntity livingEntity : matchingEntities) {
mcMMO.getTransientEntityTracker().removeSummon(livingEntity, null, false); mcMMO.getTransientEntityTracker().removeSummon(livingEntity, null, false);
} }

View File

@ -8,7 +8,6 @@ import com.gmail.nossr50.datatypes.skills.subskills.interfaces.InteractType;
import com.gmail.nossr50.events.fake.FakeEntityTameEvent; import com.gmail.nossr50.events.fake.FakeEntityTameEvent;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.metadata.MobMetaFlagType; import com.gmail.nossr50.metadata.MobMetaFlagType;
import com.gmail.nossr50.metadata.MobMetadataService;
import com.gmail.nossr50.runnables.TravelingBlockMetaCleanup; import com.gmail.nossr50.runnables.TravelingBlockMetaCleanup;
import com.gmail.nossr50.skills.archery.Archery; import com.gmail.nossr50.skills.archery.Archery;
import com.gmail.nossr50.skills.crossbows.Crossbows; import com.gmail.nossr50.skills.crossbows.Crossbows;
@ -45,11 +44,11 @@ import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import org.bukkit.projectiles.ProjectileSource; import org.bukkit.projectiles.ProjectileSource;
import org.jetbrains.annotations.NotNull;
import static com.gmail.nossr50.util.MobMetadataUtils.*;
public class EntityListener implements Listener { public class EntityListener implements Listener {
private final mcMMO pluginRef; private final mcMMO pluginRef;
private final @NotNull MobMetadataService mobMetadataService;
/** /**
* We can use this {@link NamespacedKey} for {@link Enchantment} comparisons to * We can use this {@link NamespacedKey} for {@link Enchantment} comparisons to
@ -59,7 +58,6 @@ public class EntityListener implements Listener {
public EntityListener(final mcMMO pluginRef) { public EntityListener(final mcMMO pluginRef) {
this.pluginRef = pluginRef; this.pluginRef = pluginRef;
mobMetadataService = mcMMO.getMetadataService().getMobMetadataService();
} }
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
@ -67,10 +65,10 @@ public class EntityListener implements Listener {
if (event.getEntity() instanceof LivingEntity livingEntity) { if (event.getEntity() instanceof LivingEntity livingEntity) {
//Transfer metadata keys from mob-spawned mobs to new mobs //Transfer metadata keys from mob-spawned mobs to new mobs
if(mobMetadataService.hasMobFlags(livingEntity)) { if (hasMobFlags(livingEntity)) {
for(Entity entity : event.getTransformedEntities()) { for(Entity entity : event.getTransformedEntities()) {
if (entity instanceof LivingEntity transformedEntity) { if (entity instanceof LivingEntity transformedEntity) {
mobMetadataService.addMobFlags(livingEntity, transformedEntity); addMobFlags(livingEntity, transformedEntity);
} }
} }
} }
@ -83,18 +81,16 @@ public class EntityListener implements Listener {
return; return;
//It's rare but targets can be null sometimes //It's rare but targets can be null sometimes
if(event.getTarget() == null) if (event.getTarget() == null) {
{
return; return;
} }
//Prevent entities from giving XP if they target endermite //Prevent entities from giving XP if they target endermite
if(event.getTarget() instanceof Endermite) if (event.getTarget() instanceof Endermite) {
{
if (event.getEntity() instanceof Enderman enderman) { if (event.getEntity() instanceof Enderman enderman) {
if(!mobMetadataService.hasMobFlag(MobMetaFlagType.EXPLOITED_ENDERMEN, enderman)) { if (!hasMobFlag(MobMetaFlagType.EXPLOITED_ENDERMEN, enderman)) {
mobMetadataService.flagMetadata(MobMetaFlagType.EXPLOITED_ENDERMEN, enderman); flagMetadata(MobMetaFlagType.EXPLOITED_ENDERMEN, enderman);
} }
} }
} }
@ -106,8 +102,7 @@ public class EntityListener implements Listener {
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
return; return;
if(event.getEntity() instanceof Player player) if (event.getEntity() instanceof Player player) {
{
Entity projectile = event.getProjectile(); Entity projectile = event.getProjectile();
//Should be noted that there are API changes regarding Arrow from 1.13.2 to current versions of the game //Should be noted that there are API changes regarding Arrow from 1.13.2 to current versions of the game
@ -120,7 +115,7 @@ public class EntityListener implements Listener {
if (bow == null) if (bow == null)
return; return;
if (bow.containsEnchantment(Enchantment.ARROW_INFINITE)) { if (bow.containsEnchantment(mcMMO.p.getEnchantmentMapper().getInfinity())) {
projectile.setMetadata(MetadataConstants.METADATA_KEY_INF_ARROW, MetadataConstants.MCMMO_METADATA_VALUE); projectile.setMetadata(MetadataConstants.METADATA_KEY_INF_ARROW, MetadataConstants.MCMMO_METADATA_VALUE);
} }
@ -139,8 +134,7 @@ public class EntityListener implements Listener {
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
return; return;
if(event.getEntity().getShooter() instanceof Player player) if (event.getEntity().getShooter() instanceof Player player) {
{
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) { if (WorldGuardUtils.isWorldGuardLoaded()) {
@ -168,7 +162,7 @@ public class EntityListener implements Listener {
return; return;
} }
if (ProbabilityUtil.isSkillRNGSuccessful(SubSkillType.ARCHERY_ARROW_RETRIEVAL, player)) { if (ProbabilityUtil.isSkillRNGSuccessful(SubSkillType.ARCHERY_ARROW_RETRIEVAL, UserManager.getPlayer(player))) {
arrow.setMetadata(MetadataConstants.METADATA_KEY_TRACKED_ARROW, MetadataConstants.MCMMO_METADATA_VALUE); arrow.setMetadata(MetadataConstants.METADATA_KEY_TRACKED_ARROW, MetadataConstants.MCMMO_METADATA_VALUE);
} }
} }
@ -208,23 +202,21 @@ public class EntityListener implements Listener {
if (entity instanceof FallingBlock || entity instanceof Enderman) { if (entity instanceof FallingBlock || entity instanceof Enderman) {
boolean isTracked = entity.hasMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK); boolean isTracked = entity.hasMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK);
if (mcMMO.getPlaceStore().isTrue(block) && !isTracked) { if (mcMMO.getUserBlockTracker().isIneligible(block) && !isTracked) {
mcMMO.getPlaceStore().setFalse(block); mcMMO.getUserBlockTracker().setEligible(block);
entity.setMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK, MetadataConstants.MCMMO_METADATA_VALUE); entity.setMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK, MetadataConstants.MCMMO_METADATA_VALUE);
TravelingBlockMetaCleanup metaCleanupTask = new TravelingBlockMetaCleanup(entity, pluginRef); TravelingBlockMetaCleanup metaCleanupTask = new TravelingBlockMetaCleanup(entity, pluginRef);
mcMMO.p.getFoliaLib().getImpl().runAtEntityTimer(entity, metaCleanupTask, 20, 20*60); //6000 ticks is 5 minutes mcMMO.p.getFoliaLib().getImpl().runAtEntityTimer(entity, metaCleanupTask, 20, 20*60); //6000 ticks is 5 minutes
} } else if (isTracked) {
else if (isTracked) {
BlockUtils.setUnnaturalBlock(block); BlockUtils.setUnnaturalBlock(block);
entity.removeMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK, pluginRef); entity.removeMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK, pluginRef);
} }
} else if ((block.getType() == Material.REDSTONE_ORE || block.getType().getKey().getKey().equalsIgnoreCase("deepslate_redstone_ore"))) { } else if ((block.getType() == Material.REDSTONE_ORE || block.getType().getKey().getKey().equalsIgnoreCase("deepslate_redstone_ore"))) {
//Redstone ore fire this event and should be ignored //Redstone ore fire this event and should be ignored
} } else {
else { if (mcMMO.getUserBlockTracker().isIneligible(block)) {
if (mcMMO.getPlaceStore().isTrue(block)) { mcMMO.getUserBlockTracker().setEligible(block);
mcMMO.getPlaceStore().setFalse(block);
} }
} }
} }
@ -267,8 +259,7 @@ public class EntityListener implements Listener {
Entity defender = event.getEntity(); Entity defender = event.getEntity();
Entity attacker = event.getDamager(); Entity attacker = event.getDamager();
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (attacker instanceof Player) { if (attacker instanceof Player) {
if (!WorldGuardManager.getInstance().hasMainFlag((Player) attacker)) { if (!WorldGuardManager.getInstance().hasMainFlag((Player) attacker)) {
@ -326,8 +317,7 @@ public class EntityListener implements Listener {
if (animalTamer != null && ((OfflinePlayer) animalTamer).isOnline()) { if (animalTamer != null && ((OfflinePlayer) animalTamer).isOnline()) {
attacker = (Entity) animalTamer; attacker = (Entity) animalTamer;
} }
} } else if (attacker instanceof TNTPrimed && defender instanceof Player) {
else if (attacker instanceof TNTPrimed && defender instanceof Player) {
if (BlastMining.processBlastMiningExplosion(event, (TNTPrimed) attacker, (Player) defender)) { if (BlastMining.processBlastMiningExplosion(event, (TNTPrimed) attacker, (Player) defender)) {
return; return;
} }
@ -498,11 +488,9 @@ public class EntityListener implements Listener {
event.getEntity().removeMetadata(MetadataConstants.METADATA_KEY_EXPLOSION_FROM_RUPTURE, mcMMO.p); event.getEntity().removeMetadata(MetadataConstants.METADATA_KEY_EXPLOSION_FROM_RUPTURE, mcMMO.p);
} }
if(event.getEntity() instanceof Player player) if (event.getEntity() instanceof Player player) {
{
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
@ -578,11 +566,9 @@ public class EntityListener implements Listener {
else if (livingEntity instanceof Tameable pet) { else if (livingEntity instanceof Tameable pet) {
AnimalTamer owner = pet.getOwner(); AnimalTamer owner = pet.getOwner();
if(owner instanceof Player player) if (owner instanceof Player player) {
{
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
@ -593,8 +579,7 @@ public class EntityListener implements Listener {
Wolf wolf = (Wolf) pet; Wolf wolf = (Wolf) pet;
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
@ -730,11 +715,11 @@ public class EntityListener implements Listener {
} }
private void trackSpawnedAndPassengers(LivingEntity livingEntity, MobMetaFlagType mobMetaFlagType) { private void trackSpawnedAndPassengers(LivingEntity livingEntity, MobMetaFlagType mobMetaFlagType) {
mobMetadataService.flagMetadata(mobMetaFlagType, livingEntity); flagMetadata(mobMetaFlagType, livingEntity);
for(Entity passenger : livingEntity.getPassengers()) { for(Entity passenger : livingEntity.getPassengers()) {
if (passenger != null) { if (passenger != null) {
mobMetadataService.flagMetadata(mobMetaFlagType, livingEntity); flagMetadata(mobMetaFlagType, livingEntity);
} }
} }
} }
@ -742,7 +727,7 @@ public class EntityListener implements Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onEntityBreed(EntityBreedEvent event) { public void onEntityBreed(EntityBreedEvent event) {
if (ExperienceConfig.getInstance().isCOTWBreedingPrevented()) { if (ExperienceConfig.getInstance().isCOTWBreedingPrevented()) {
if(mobMetadataService.hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, event.getFather()) || mobMetadataService.hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, event.getMother())) { if (hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, event.getFather()) || hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, event.getMother())) {
event.setCancelled(true); event.setCancelled(true);
Animals mom = (Animals) event.getMother(); Animals mom = (Animals) event.getMother();
Animals father = (Animals) event.getFather(); Animals father = (Animals) event.getFather();
@ -786,14 +771,12 @@ public class EntityListener implements Listener {
} }
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
@ -832,15 +815,13 @@ public class EntityListener implements Listener {
} }
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
@ -871,14 +852,12 @@ public class EntityListener implements Listener {
} }
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
@ -995,8 +974,7 @@ public class EntityListener implements Listener {
Player player = (Player) event.getOwner(); Player player = (Player) event.getOwner();
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
@ -1005,16 +983,15 @@ public class EntityListener implements Listener {
if (!UserManager.hasPlayerDataKey(player) if (!UserManager.hasPlayerDataKey(player)
|| (ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(livingEntity)) || (ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(livingEntity))
|| mobMetadataService.hasMobFlag(MobMetaFlagType.EGG_MOB, livingEntity) || hasMobFlag(MobMetaFlagType.EGG_MOB, livingEntity)
|| mobMetadataService.hasMobFlag(MobMetaFlagType.MOB_SPAWNER_MOB, livingEntity)) { || hasMobFlag(MobMetaFlagType.MOB_SPAWNER_MOB, livingEntity)) {
return; return;
} }
mobMetadataService.flagMetadata(MobMetaFlagType.PLAYER_TAMED_MOB, livingEntity); flagMetadata(MobMetaFlagType.PLAYER_TAMED_MOB, livingEntity);
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
@ -1041,8 +1018,7 @@ public class EntityListener implements Listener {
} }
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }

View File

@ -33,8 +33,7 @@ public class InteractionManager {
* Registers subskills with the Interaction registration * Registers subskills with the Interaction registration
* @param abstractSubSkill the target subskill to register * @param abstractSubSkill the target subskill to register
*/ */
public static void registerSubSkill(AbstractSubSkill abstractSubSkill) public static void registerSubSkill(AbstractSubSkill abstractSubSkill) {
{
//Store a unique copy of each subskill //Store a unique copy of each subskill
if (!subSkillList.contains(abstractSubSkill)) if (!subSkillList.contains(abstractSubSkill))
subSkillList.add(abstractSubSkill); subSkillList.add(abstractSubSkill);
@ -62,8 +61,7 @@ public class InteractionManager {
* @param name name of subskill, not case sensitive * @param name name of subskill, not case sensitive
* @return null if the subskill is not registered * @return null if the subskill is not registered
*/ */
public static AbstractSubSkill getAbstractByName(String name) public static AbstractSubSkill getAbstractByName(String name) {
{
return subSkillNameMap.get(name.toLowerCase(Locale.ENGLISH)); return subSkillNameMap.get(name.toLowerCase(Locale.ENGLISH));
} }
@ -73,13 +71,11 @@ public class InteractionManager {
* @param plugin instance of mcMMO plugin * @param plugin instance of mcMMO plugin
* @param curInteractType the associated interaction type * @param curInteractType the associated interaction type
*/ */
public static void processEvent(Event event, mcMMO plugin, InteractType curInteractType) public static void processEvent(Event event, mcMMO plugin, InteractType curInteractType) {
{
if (interactRegister.get(curInteractType) == null) if (interactRegister.get(curInteractType) == null)
return; return;
for(Interaction interaction : interactRegister.get(curInteractType)) for(Interaction interaction : interactRegister.get(curInteractType)) {
{
interaction.doInteraction(event, plugin); interaction.doInteraction(event, plugin);
} }
} }
@ -89,18 +85,15 @@ public class InteractionManager {
* Interactions are extensions of abstract classes that represent modifying behaviours in Minecraft through events * Interactions are extensions of abstract classes that represent modifying behaviours in Minecraft through events
* @return the unique collection of all registered Interaction classes * @return the unique collection of all registered Interaction classes
*/ */
public static ArrayList<AbstractSubSkill> getSubSkillList() public static ArrayList<AbstractSubSkill> getSubSkillList() {
{
return subSkillList; return subSkillList;
} }
public static boolean hasSubSkill(String name) public static boolean hasSubSkill(String name) {
{
return getAbstractByName(name) != null; return getAbstractByName(name) != null;
} }
public static boolean hasSubSkill(SubSkillType subSkillType) public static boolean hasSubSkill(SubSkillType subSkillType) {
{
return hasSubSkill(subSkillType.getNiceNameNoSpaces(subSkillType)); return hasSubSkill(subSkillType.getNiceNameNoSpaces(subSkillType));
} }

View File

@ -9,6 +9,7 @@ import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask; import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask;
import com.gmail.nossr50.skills.alchemy.Alchemy; import com.gmail.nossr50.skills.alchemy.Alchemy;
import com.gmail.nossr50.skills.alchemy.AlchemyPotionBrewer; import com.gmail.nossr50.skills.alchemy.AlchemyPotionBrewer;
import com.gmail.nossr50.util.ContainerMetadataUtils;
import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.MetadataConstants;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
@ -53,7 +54,7 @@ public class InventoryListener implements Listener {
} }
Furnace furnace = (Furnace) furnaceState; Furnace furnace = (Furnace) furnaceState;
OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); OfflinePlayer offlinePlayer = ContainerMetadataUtils.getContainerOwner(furnace);
Player player; Player player;
if (offlinePlayer != null && offlinePlayer.isOnline() && offlinePlayer instanceof Player) { if (offlinePlayer != null && offlinePlayer.isOnline() && offlinePlayer instanceof Player) {
@ -99,7 +100,7 @@ public class InventoryListener implements Listener {
} }
if (blockState instanceof Furnace furnace) { if (blockState instanceof Furnace furnace) {
OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); OfflinePlayer offlinePlayer = ContainerMetadataUtils.getContainerOwner(furnace);
if (offlinePlayer != null) { if (offlinePlayer != null) {
@ -130,8 +131,7 @@ public class InventoryListener implements Listener {
if (furnaceBlock instanceof Furnace) { if (furnaceBlock instanceof Furnace) {
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
@ -141,8 +141,7 @@ public class InventoryListener implements Listener {
} }
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
@ -165,16 +164,16 @@ public class InventoryListener implements Listener {
Inventory inventory = event.getInventory(); Inventory inventory = event.getInventory();
Player player = ((Player) event.getWhoClicked()).getPlayer(); Player player = ((Player) event.getWhoClicked()).getPlayer();
McMMOPlayer mmoPlayer = UserManager.getPlayer(player);
if(event.getInventory() instanceof FurnaceInventory) if (event.getInventory() instanceof FurnaceInventory furnaceInventory) {
{
Furnace furnace = mcMMO.getSmeltingTracker().getFurnaceFromInventory(event.getInventory());
if (furnace != null)
{
//Switch owners //Switch owners
mcMMO.getSmeltingTracker().processFurnaceOwnership(furnace, player); ContainerMetadataUtils.processContainerOwnership(furnaceInventory.getHolder(), player);
} }
if (event.getInventory() instanceof BrewerInventory brewerInventory) {
// switch owners
ContainerMetadataUtils.processContainerOwnership(brewerInventory.getHolder(), player);
} }
if (!(inventory instanceof BrewerInventory)) { if (!(inventory instanceof BrewerInventory)) {
@ -189,22 +188,27 @@ public class InventoryListener implements Listener {
HumanEntity whoClicked = event.getWhoClicked(); HumanEntity whoClicked = event.getWhoClicked();
if (!UserManager.hasPlayerDataKey(event.getWhoClicked()) || !Permissions.isSubSkillEnabled(whoClicked, SubSkillType.ALCHEMY_CONCOCTIONS)) { if (mmoPlayer == null || !Permissions.isSubSkillEnabled(whoClicked, SubSkillType.ALCHEMY_CONCOCTIONS)) {
return; return;
} }
// TODO: Investigate why this WG check is all the way down here?
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
ItemStack clicked = event.getCurrentItem(); final ItemStack clicked = event.getCurrentItem();
ItemStack cursor = event.getCursor(); final ItemStack cursor = event.getCursor();
if ((clicked != null && (clicked.getType() == Material.POTION || clicked.getType() == Material.SPLASH_POTION || clicked.getType() == Material.LINGERING_POTION)) || (cursor != null && (cursor.getType() == Material.POTION || cursor.getType() == Material.SPLASH_POTION || cursor.getType() == Material.LINGERING_POTION))) { if ((clicked != null && (clicked.getType() == Material.POTION
AlchemyPotionBrewer.scheduleCheck(player, stand); || clicked.getType() == Material.SPLASH_POTION
|| clicked.getType() == Material.LINGERING_POTION))
|| (cursor != null && (cursor.getType() == Material.POTION
|| cursor.getType() == Material.SPLASH_POTION
|| cursor.getType() == Material.LINGERING_POTION))) {
AlchemyPotionBrewer.scheduleCheck(stand);
return; return;
} }
@ -214,11 +218,11 @@ public class InventoryListener implements Listener {
if (click.isShiftClick()) { if (click.isShiftClick()) {
switch (slot) { switch (slot) {
case FUEL: case FUEL:
AlchemyPotionBrewer.scheduleCheck(player, stand); AlchemyPotionBrewer.scheduleCheck(stand);
return; return;
case CONTAINER: case CONTAINER:
case QUICKBAR: case QUICKBAR:
if (!AlchemyPotionBrewer.isValidIngredient(player, clicked)) { if (!AlchemyPotionBrewer.isValidIngredientByPlayer(player, clicked)) {
return; return;
} }
@ -228,24 +232,22 @@ public class InventoryListener implements Listener {
event.setCancelled(true); event.setCancelled(true);
AlchemyPotionBrewer.scheduleUpdate(inventory); AlchemyPotionBrewer.scheduleUpdate(inventory);
AlchemyPotionBrewer.scheduleCheck(player, stand); AlchemyPotionBrewer.scheduleCheck(stand);
return; return;
default: default:
} }
} } else if (slot == InventoryType.SlotType.FUEL) {
else if (slot == InventoryType.SlotType.FUEL) {
boolean emptyClicked = AlchemyPotionBrewer.isEmpty(clicked); boolean emptyClicked = AlchemyPotionBrewer.isEmpty(clicked);
if (AlchemyPotionBrewer.isEmpty(cursor)) { if (AlchemyPotionBrewer.isEmpty(cursor)) {
if (emptyClicked && click == ClickType.NUMBER_KEY) { if (emptyClicked && click == ClickType.NUMBER_KEY) {
AlchemyPotionBrewer.scheduleCheck(player, stand); AlchemyPotionBrewer.scheduleCheck(stand);
return; return;
} }
AlchemyPotionBrewer.scheduleCheck(player, stand); AlchemyPotionBrewer.scheduleCheck(stand);
} } else if (emptyClicked) {
else if (emptyClicked) { if (AlchemyPotionBrewer.isValidIngredientByPlayer(player, cursor)) {
if (AlchemyPotionBrewer.isValidIngredient(player, cursor)) {
int amount = cursor.getAmount(); int amount = cursor.getAmount();
if (click == ClickType.LEFT || (click == ClickType.RIGHT && amount == 1)) { if (click == ClickType.LEFT || (click == ClickType.RIGHT && amount == 1)) {
@ -254,9 +256,8 @@ public class InventoryListener implements Listener {
event.setCursor(null); event.setCursor(null);
AlchemyPotionBrewer.scheduleUpdate(inventory); AlchemyPotionBrewer.scheduleUpdate(inventory);
AlchemyPotionBrewer.scheduleCheck(player, stand); AlchemyPotionBrewer.scheduleCheck(stand);
} } else if (click == ClickType.RIGHT) {
else if (click == ClickType.RIGHT) {
event.setCancelled(true); event.setCancelled(true);
ItemStack one = cursor.clone(); ItemStack one = cursor.clone();
@ -269,7 +270,7 @@ public class InventoryListener implements Listener {
event.setCursor(rest); event.setCursor(rest);
AlchemyPotionBrewer.scheduleUpdate(inventory); AlchemyPotionBrewer.scheduleUpdate(inventory);
AlchemyPotionBrewer.scheduleCheck(player, stand); AlchemyPotionBrewer.scheduleCheck(stand);
} }
} }
} }
@ -316,15 +317,14 @@ public class InventoryListener implements Listener {
Player player = (Player) whoClicked; Player player = (Player) whoClicked;
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
if (AlchemyPotionBrewer.isValidIngredient(player, cursor)) { if (AlchemyPotionBrewer.isValidIngredientByPlayer(player, cursor)) {
// Not handled: dragging custom ingredients over ingredient slot (does not trigger any event) // Not handled: dragging custom ingredients over ingredient slot (does not trigger any event)
AlchemyPotionBrewer.scheduleCheck(player, (BrewingStand) holder); AlchemyPotionBrewer.scheduleCheck((BrewingStand) holder);
return; return;
} }
@ -335,14 +335,14 @@ public class InventoryListener implements Listener {
// Apparently sometimes vanilla brewing beats our task listener to the actual brew. We handle this by cancelling the vanilla event and finishing our brew ourselves. // Apparently sometimes vanilla brewing beats our task listener to the actual brew. We handle this by cancelling the vanilla event and finishing our brew ourselves.
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onBrew(BrewEvent event) public void onBrew(BrewEvent event) {
{
/* WORLD BLACKLIST CHECK */ /* WORLD BLACKLIST CHECK */
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return; return;
if (event instanceof FakeBrewEvent) if (event instanceof FakeBrewEvent)
return; return;
Location location = event.getBlock().getLocation(); Location location = event.getBlock().getLocation();
if (Alchemy.brewingStandMap.containsKey(location)) { if (Alchemy.brewingStandMap.containsKey(location)) {
Alchemy.brewingStandMap.get(location).finishImmediately(); Alchemy.brewingStandMap.get(location).finishImmediately();
@ -350,6 +350,16 @@ public class InventoryListener implements Listener {
} }
} }
// @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
// public void onBrewStart(BrewingStartEvent event) {
// /* WORLD BLACKLIST CHECK */
// if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
// return;
//
// if (event instanceof FakeEvent)
// return;
// }
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) {
/* WORLD BLACKLIST CHECK */ /* WORLD BLACKLIST CHECK */
@ -358,17 +368,15 @@ public class InventoryListener implements Listener {
if (WorldBlacklist.isWorldBlacklisted(event.getSource().getLocation().getWorld())) if (WorldBlacklist.isWorldBlacklisted(event.getSource().getLocation().getWorld()))
return; return;
Inventory inventory = event.getDestination(); final Inventory inventory = event.getDestination();
if (!(inventory instanceof BrewerInventory)) { if (!(inventory instanceof BrewerInventory)) {
return; return;
} }
InventoryHolder holder = inventory.getHolder(); final InventoryHolder holder = inventory.getHolder();
if (!(holder instanceof BrewingStand)) { if (holder instanceof BrewingStand brewingStand) {
return;
}
ItemStack item = event.getItem(); ItemStack item = event.getItem();
@ -381,9 +389,20 @@ public class InventoryListener implements Listener {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
int ingredientLevel = 1;
if (mcMMO.p.getGeneralConfig().getEnabledForHoppers() && AlchemyPotionBrewer.isValidIngredient(null, item)) { OfflinePlayer offlinePlayer = ContainerMetadataUtils.getContainerOwner(brewingStand);
AlchemyPotionBrewer.scheduleCheck(null, (BrewingStand) holder); if (offlinePlayer != null && offlinePlayer.isOnline()) {
McMMOPlayer mmoPlayer = UserManager.getPlayer(offlinePlayer.getPlayer());
if (mmoPlayer != null) {
ingredientLevel = mmoPlayer.getAlchemyManager().getTier();
}
}
if (mcMMO.p.getGeneralConfig().getEnabledForHoppers()
&& AlchemyPotionBrewer.isValidIngredientByLevel(ingredientLevel, item)) {
AlchemyPotionBrewer.scheduleCheck(brewingStand);
}
} }
} }
@ -433,8 +452,7 @@ public class InventoryListener implements Listener {
Player player = (Player) whoClicked; Player player = (Player) whoClicked;
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }

View File

@ -87,8 +87,7 @@ public class PlayerListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
@ -98,8 +97,7 @@ public class PlayerListener implements Listener {
} }
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
@ -183,8 +181,7 @@ public class PlayerListener implements Listener {
Player killer = killedPlayer.getKiller(); Player killer = killedPlayer.getKiller();
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(killedPlayer)) if (!WorldGuardManager.getInstance().hasMainFlag(killedPlayer))
return; return;
} }
@ -227,8 +224,7 @@ public class PlayerListener implements Listener {
} }
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
@ -254,8 +250,7 @@ public class PlayerListener implements Listener {
return; return;
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer())) if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
return; return;
} }
@ -287,8 +282,7 @@ public class PlayerListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
@ -298,8 +292,7 @@ public class PlayerListener implements Listener {
} }
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
@ -373,8 +366,7 @@ public class PlayerListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
@ -384,8 +376,7 @@ public class PlayerListener implements Listener {
} }
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
@ -393,20 +384,16 @@ public class PlayerListener implements Listener {
FishingManager fishingManager = UserManager.getPlayer(player).getFishingManager(); FishingManager fishingManager = UserManager.getPlayer(player).getFishingManager();
//Track the hook //Track the hook
if(ExperienceConfig.getInstance().isFishingExploitingPrevented()) if (ExperienceConfig.getInstance().isFishingExploitingPrevented()) {
{ if (event.getHook().getMetadata(MetadataConstants.METADATA_KEY_FISH_HOOK_REF).size() == 0) {
if(event.getHook().getMetadata(MetadataConstants.METADATA_KEY_FISH_HOOK_REF).size() == 0)
{
fishingManager.setFishHookReference(event.getHook()); fishingManager.setFishHookReference(event.getHook());
} }
//Spam Fishing //Spam Fishing
if(event.getState() == PlayerFishEvent.State.CAUGHT_FISH && fishingManager.isFishingTooOften()) if (event.getState() == PlayerFishEvent.State.CAUGHT_FISH && fishingManager.isFishingTooOften()) {
{
event.setExpToDrop(0); event.setExpToDrop(0);
if(caught instanceof Item caughtItem) if (caught instanceof Item caughtItem) {
{
caughtItem.remove(); caughtItem.remove();
} }
@ -489,12 +476,10 @@ public class PlayerListener implements Listener {
return; return;
} }
if(event.getEntity() instanceof Player player) if (event.getEntity() instanceof Player player) {
{
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
@ -618,8 +603,7 @@ public class PlayerListener implements Listener {
} }
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
@ -640,8 +624,7 @@ public class PlayerListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
@ -665,8 +648,7 @@ public class PlayerListener implements Listener {
} }
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
@ -715,8 +697,7 @@ public class PlayerListener implements Listener {
else if (miningManager.canDetonate()) { else if (miningManager.canDetonate()) {
if (type == Material.TNT) { if (type == Material.TNT) {
event.setCancelled(true); // Don't detonate the TNT if they're too close event.setCancelled(true); // Don't detonate the TNT if they're too close
} } else {
else {
miningManager.remoteDetonation(); miningManager.remoteDetonation();
} }
} }
@ -770,19 +751,19 @@ public class PlayerListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
/* WORLD GUARD MAIN FLAG CHECK */ /* WORLD GUARD MAIN FLAG CHECK */
if(WorldGuardUtils.isWorldGuardLoaded()) if (WorldGuardUtils.isWorldGuardLoaded()) {
{
if (!WorldGuardManager.getInstance().hasMainFlag(player)) if (!WorldGuardManager.getInstance().hasMainFlag(player))
return; return;
} }
if (event.getHand() != EquipmentSlot.HAND || !UserManager.hasPlayerDataKey(player) || player.getGameMode() == GameMode.CREATIVE) { if (event.getHand() != EquipmentSlot.HAND
|| !UserManager.hasPlayerDataKey(player)
|| player.getGameMode() == GameMode.CREATIVE) {
return; return;
} }
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(player) == null) if (UserManager.getPlayer(player) == null) {
{
return; return;
} }
@ -793,13 +774,10 @@ public class PlayerListener implements Listener {
ItemStack heldItem = player.getInventory().getItemInMainHand(); ItemStack heldItem = player.getInventory().getItemInMainHand();
//Spam Fishing Detection //Spam Fishing Detection
if(event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_AIR) if (event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_AIR) {
{
if (ExperienceConfig.getInstance().isFishingExploitingPrevented() if (ExperienceConfig.getInstance().isFishingExploitingPrevented()
&& (heldItem.getType() == Material.FISHING_ROD || player.getInventory().getItemInOffHand().getType() == Material.FISHING_ROD)) && (heldItem.getType() == Material.FISHING_ROD || player.getInventory().getItemInOffHand().getType() == Material.FISHING_ROD)) {
{ if (player.isInsideVehicle() && (player.getVehicle() instanceof Minecart || player.getVehicle() instanceof PoweredMinecart)) {
if(player.isInsideVehicle() && (player.getVehicle() instanceof Minecart || player.getVehicle() instanceof PoweredMinecart))
{
player.getVehicle().eject(); player.getVehicle().eject();
} }
@ -852,7 +830,7 @@ public class PlayerListener implements Listener {
case "NETHER_WART_BLOCK": case "NETHER_WART_BLOCK":
case "POTATO": case "POTATO":
case "MANGROVE_PROPAGULE": case "MANGROVE_PROPAGULE":
mcMMO.getPlaceStore().setFalse(blockState); mcMMO.getUserBlockTracker().setEligible(blockState);
break; break;
} }
} }
@ -924,11 +902,9 @@ public class PlayerListener implements Listener {
if (type == mcMMO.p.getGeneralConfig().getTamingCOTWMaterial(CallOfTheWildType.WOLF.getConfigEntityTypeEntry())) { if (type == mcMMO.p.getGeneralConfig().getTamingCOTWMaterial(CallOfTheWildType.WOLF.getConfigEntityTypeEntry())) {
tamingManager.summonWolf(); tamingManager.summonWolf();
} } else if (type == mcMMO.p.getGeneralConfig().getTamingCOTWMaterial(CallOfTheWildType.CAT.getConfigEntityTypeEntry())) {
else if (type == mcMMO.p.getGeneralConfig().getTamingCOTWMaterial(CallOfTheWildType.CAT.getConfigEntityTypeEntry())) {
tamingManager.summonOcelot(); tamingManager.summonOcelot();
} } else if (type == mcMMO.p.getGeneralConfig().getTamingCOTWMaterial(CallOfTheWildType.HORSE.getConfigEntityTypeEntry())) {
else if (type == mcMMO.p.getGeneralConfig().getTamingCOTWMaterial(CallOfTheWildType.HORSE.getConfigEntityTypeEntry())) {
tamingManager.summonHorse(); tamingManager.summonHorse();
} }
@ -1028,8 +1004,7 @@ public class PlayerListener implements Listener {
if (event.getHand() == EquipmentSlot.OFF_HAND) { if (event.getHand() == EquipmentSlot.OFF_HAND) {
itemInHand = event.getPlayer().getInventory().getItemInOffHand(); itemInHand = event.getPlayer().getInventory().getItemInOffHand();
} } else {
else {
itemInHand = event.getPlayer().getInventory().getItemInMainHand(); itemInHand = event.getPlayer().getInventory().getItemInMainHand();
} }

View File

@ -24,8 +24,7 @@ public class SelfListener implements Listener {
//Used in task scheduling and other things //Used in task scheduling and other things
private final mcMMO plugin; private final mcMMO plugin;
public SelfListener(mcMMO plugin) public SelfListener(mcMMO plugin) {
{
this.plugin = plugin; this.plugin = plugin;
} }
@ -42,8 +41,7 @@ public class SelfListener implements Listener {
if (player.isOnline()) { if (player.isOnline()) {
//Players can gain multiple levels especially during xprate events //Players can gain multiple levels especially during xprate events
for(int i = 0; i < event.getLevelsGained(); i++) for(int i = 0; i < event.getLevelsGained(); i++) {
{
int previousLevelGained = event.getSkillLevel() - i; int previousLevelGained = event.getSkillLevel() - i;
//Send player skill unlock notifications //Send player skill unlock notifications
UserManager.getPlayer(player).processUnlockNotifications(plugin, event.getSkill(), previousLevelGained); UserManager.getPlayer(player).processUnlockNotifications(plugin, event.getSkill(), previousLevelGained);
@ -96,12 +94,9 @@ public class SelfListener implements Listener {
if (event.getXpGainReason() == XPGainReason.PVE || if (event.getXpGainReason() == XPGainReason.PVE ||
event.getXpGainReason() == XPGainReason.PVP || event.getXpGainReason() == XPGainReason.PVP ||
event.getXpGainReason() == XPGainReason.SHARED_PVE || event.getXpGainReason() == XPGainReason.SHARED_PVE ||
event.getXpGainReason() == XPGainReason.SHARED_PVP) event.getXpGainReason() == XPGainReason.SHARED_PVP) {
{ if (WorldGuardUtils.isWorldGuardLoaded()) {
if(WorldGuardUtils.isWorldGuardLoaded()) if (!WorldGuardManager.getInstance().hasXPFlag(player)) {
{
if(!WorldGuardManager.getInstance().hasXPFlag(player))
{
event.setRawXpGained(0); event.setRawXpGained(0);
event.setCancelled(true); event.setCancelled(true);
@ -112,19 +107,16 @@ public class SelfListener implements Listener {
} }
} }
if (event.getXpGainReason() == XPGainReason.COMMAND) if (event.getXpGainReason() == XPGainReason.COMMAND) {
{
return; return;
} }
if(ExperienceConfig.getInstance().isEarlyGameBoostEnabled()) if (ExperienceConfig.getInstance().isEarlyGameBoostEnabled()) {
{
int earlyGameBonusXP = 0; int earlyGameBonusXP = 0;
//Give some bonus XP for low levels //Give some bonus XP for low levels
if(PlayerLevelUtils.qualifiesForEarlyGameBoost(mcMMOPlayer, primarySkillType)) if (PlayerLevelUtils.qualifiesForEarlyGameBoost(mcMMOPlayer, primarySkillType)) {
{
earlyGameBonusXP += (mcMMOPlayer.getXpToLevel(primarySkillType) * 0.05); earlyGameBonusXP += (mcMMOPlayer.getXpToLevel(primarySkillType) * 0.05);
event.setRawXpGained(event.getRawXpGained() + earlyGameBonusXP); event.setRawXpGained(event.getRawXpGained() + earlyGameBonusXP);
} }
@ -167,12 +159,10 @@ public class SelfListener implements Listener {
* Make sure players get a guaranteed minimum of XP * Make sure players get a guaranteed minimum of XP
*/ */
//If there is no guaranteed minimum proceed, otherwise only proceed if newValue would be higher than our guaranteed minimum //If there is no guaranteed minimum proceed, otherwise only proceed if newValue would be higher than our guaranteed minimum
if(guaranteedMinimum <= 0 || newValue > guaranteedMinimum) if (guaranteedMinimum <= 0 || newValue > guaranteedMinimum) {
{
if (newValue > 0) { if (newValue > 0) {
event.setRawXpGained(newValue); event.setRawXpGained(newValue);
} } else {
else {
event.setCancelled(true); event.setCancelled(true);
} }
} else { } else {

View File

@ -32,7 +32,7 @@ public class WorldListener implements Listener {
// Using 50 ms later as I do not know of a way to run one tick later (safely) // Using 50 ms later as I do not know of a way to run one tick later (safely)
plugin.getFoliaLib().getImpl().runLater(() -> { plugin.getFoliaLib().getImpl().runLater(() -> {
for (BlockState blockState : event.getBlocks()) { for (BlockState blockState : event.getBlocks()) {
mcMMO.getPlaceStore().setFalse(blockState); mcMMO.getUserBlockTracker().setEligible(blockState);
} }
}, 1); }, 1);
} }
@ -48,7 +48,7 @@ public class WorldListener implements Listener {
if (WorldBlacklist.isWorldBlacklisted(event.getWorld())) if (WorldBlacklist.isWorldBlacklisted(event.getWorld()))
return; return;
mcMMO.getPlaceStore().unloadWorld(event.getWorld()); mcMMO.getChunkManager().unloadWorld(event.getWorld());
} }
/** /**
@ -64,6 +64,6 @@ public class WorldListener implements Listener {
Chunk chunk = event.getChunk(); Chunk chunk = event.getChunk();
mcMMO.getPlaceStore().chunkUnloaded(chunk.getX(), chunk.getZ(), event.getWorld()); mcMMO.getChunkManager().chunkUnloaded(chunk.getX(), chunk.getZ(), event.getWorld());
} }
} }

View File

@ -19,7 +19,6 @@ import com.gmail.nossr50.database.DatabaseManagerFactory;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.datatypes.skills.subskills.acrobatics.Roll; import com.gmail.nossr50.datatypes.skills.subskills.acrobatics.Roll;
import com.gmail.nossr50.listeners.*; import com.gmail.nossr50.listeners.*;
import com.gmail.nossr50.metadata.MetadataService;
import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.party.PartyManager;
import com.gmail.nossr50.placeholders.PapiExpansion; import com.gmail.nossr50.placeholders.PapiExpansion;
import com.gmail.nossr50.runnables.SaveTimerTask; import com.gmail.nossr50.runnables.SaveTimerTask;
@ -40,6 +39,7 @@ import com.gmail.nossr50.skills.salvage.salvageables.SimpleSalvageableManager;
import com.gmail.nossr50.util.*; import com.gmail.nossr50.util.*;
import com.gmail.nossr50.util.blockmeta.ChunkManager; import com.gmail.nossr50.util.blockmeta.ChunkManager;
import com.gmail.nossr50.util.blockmeta.ChunkManagerFactory; import com.gmail.nossr50.util.blockmeta.ChunkManagerFactory;
import com.gmail.nossr50.util.blockmeta.UserBlockTracker;
import com.gmail.nossr50.util.commands.CommandRegistrationManager; import com.gmail.nossr50.util.commands.CommandRegistrationManager;
import com.gmail.nossr50.util.compat.CompatibilityManager; import com.gmail.nossr50.util.compat.CompatibilityManager;
import com.gmail.nossr50.util.experience.FormulaManager; import com.gmail.nossr50.util.experience.FormulaManager;
@ -50,7 +50,6 @@ import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.scoreboards.ScoreboardManager; import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
import com.gmail.nossr50.util.skills.SkillTools; import com.gmail.nossr50.util.skills.SkillTools;
import com.gmail.nossr50.util.skills.SmeltingTracker;
import com.gmail.nossr50.util.upgrade.UpgradeManager; import com.gmail.nossr50.util.upgrade.UpgradeManager;
import com.gmail.nossr50.worldguard.WorldGuardManager; import com.gmail.nossr50.worldguard.WorldGuardManager;
import com.tcoded.folialib.FoliaLib; import com.tcoded.folialib.FoliaLib;
@ -78,12 +77,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class mcMMO extends JavaPlugin { public class mcMMO extends JavaPlugin {
/* Managers & Services */ /* Managers & Services */
private static PlatformManager platformManager; private static PlatformManager platformManager;
private static MetadataService metadataService; private static ChunkManager chunkManager;
private static ChunkManager placeStore;
private static RepairableManager repairableManager; private static RepairableManager repairableManager;
private static SalvageableManager salvageableManager; private static SalvageableManager salvageableManager;
private static ModManager modManager; private static ModManager modManager;
@ -92,7 +88,6 @@ public class mcMMO extends JavaPlugin {
private static UpgradeManager upgradeManager; private static UpgradeManager upgradeManager;
private static MaterialMapStore materialMapStore; private static MaterialMapStore materialMapStore;
private static PlayerLevelUtils playerLevelUtils; private static PlayerLevelUtils playerLevelUtils;
private static SmeltingTracker smeltingTracker;
private static TransientMetadataTools transientMetadataTools; private static TransientMetadataTools transientMetadataTools;
private static ChatManager chatManager; private static ChatManager chatManager;
private static CommandManager commandManager; //ACF private static CommandManager commandManager; //ACF
@ -140,28 +135,20 @@ public class mcMMO extends JavaPlugin {
private GeneralConfig generalConfig; private GeneralConfig generalConfig;
private AdvancedConfig advancedConfig; private AdvancedConfig advancedConfig;
private PartyConfig partyConfig; private PartyConfig partyConfig;
private PotionConfig potionConfig;
private CustomItemSupportConfig customItemSupportConfig; private CustomItemSupportConfig customItemSupportConfig;
private EnchantmentMapper enchantmentMapper;
private AttributeMapper attributeMapper;
private FoliaLib foliaLib; private FoliaLib foliaLib;
private PartyManager partyManager; private PartyManager partyManager;
// private RepairConfig repairConfig;
// private SalvageConfig salvageConfig;
// private PersistentDataConfig persistentDataConfig;
// private ChatConfig chatConfig;
// private CoreSkillsConfig coreSkillsConfig;
// private RankConfig rankConfig;
// private TreasureConfig treasureConfig;
// private FishingTreasureConfig fishingTreasureConfig;
// private SoundConfig soundConfig;
public mcMMO() { public mcMMO() {
p = this; p = this;
} }
protected mcMMO(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) protected mcMMO(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) {
{
super(loader, description, dataFolder, file); super(loader, description, dataFolder, file);
} }
@ -194,9 +181,6 @@ public class mcMMO extends JavaPlugin {
//Platform Manager //Platform Manager
platformManager = new PlatformManager(); platformManager = new PlatformManager();
//metadata service
metadataService = new MetadataService(this);
MetadataConstants.MCMMO_METADATA_VALUE = new FixedMetadataValue(this, true); MetadataConstants.MCMMO_METADATA_VALUE = new FixedMetadataValue(this, true);
PluginManager pluginManager = getServer().getPluginManager(); PluginManager pluginManager = getServer().getPluginManager();
@ -209,6 +193,9 @@ public class mcMMO extends JavaPlugin {
// Init Material Maps // Init Material Maps
materialMapStore = new MaterialMapStore(); materialMapStore = new MaterialMapStore();
// Init compatibility mappers
enchantmentMapper = new EnchantmentMapper(this);
attributeMapper = new AttributeMapper(this);
loadConfigFiles(); loadConfigFiles();
@ -241,8 +228,7 @@ public class mcMMO extends JavaPlugin {
//Check for the newer API and tell them what to do if its missing //Check for the newer API and tell them what to do if its missing
checkForOutdatedAPI(); checkForOutdatedAPI();
if(serverAPIOutdated) if (serverAPIOutdated) {
{
foliaLib foliaLib
.getImpl() .getImpl()
.runTimer( .runTimer(
@ -250,8 +236,7 @@ public class mcMMO extends JavaPlugin {
20, 20*60*30 20, 20*60*30
); );
if(platformManager.getServerSoftware() == ServerSoftwareType.CRAFT_BUKKIT) if (platformManager.getServerSoftware() == ServerSoftwareType.CRAFT_BUKKIT) {
{
foliaLib foliaLib
.getImpl() .getImpl()
.runTimer( .runTimer(
@ -280,7 +265,7 @@ public class mcMMO extends JavaPlugin {
scheduleTasks(); scheduleTasks();
CommandRegistrationManager.registerCommands(); CommandRegistrationManager.registerCommands();
placeStore = ChunkManagerFactory.getChunkManager(); // Get our ChunkletManager chunkManager = ChunkManagerFactory.getChunkManager(); // Get our ChunkletManager
if (generalConfig.getPTPCommandWorldPermissions()) { if (generalConfig.getPTPCommandWorldPermissions()) {
Permissions.generateWorldTeleportPermissions(); Permissions.generateWorldTeleportPermissions();
@ -307,8 +292,7 @@ public class mcMMO extends JavaPlugin {
if (!(t instanceof ExceptionInInitializerError)) { if (!(t instanceof ExceptionInInitializerError)) {
t.printStackTrace(); t.printStackTrace();
} } else {
else {
getLogger().info("Please do not replace the mcMMO jar while the server is running."); getLogger().info("Please do not replace the mcMMO jar while the server is running.");
} }
@ -324,9 +308,6 @@ public class mcMMO extends JavaPlugin {
//Init the blacklist //Init the blacklist
worldBlacklist = new WorldBlacklist(this); worldBlacklist = new WorldBlacklist(this);
//Init smelting tracker
smeltingTracker = new SmeltingTracker();
//Set up Adventure's audiences //Set up Adventure's audiences
audiences = BukkitAudiences.create(this); audiences = BukkitAudiences.create(this);
@ -365,11 +346,13 @@ public class mcMMO extends JavaPlugin {
} }
@Override @Override
public void onLoad() public void onLoad() {
{
if (getServer().getPluginManager().getPlugin("WorldGuard") != null) { if (getServer().getPluginManager().getPlugin("WorldGuard") != null) {
WorldGuardManager.getInstance().registerFlags(); WorldGuardManager.getInstance().registerFlags();
} }
// ProtocolLib
// protocolLibManager = new ProtocolLibManager(this);
} }
/** /**
@ -393,7 +376,7 @@ public class mcMMO extends JavaPlugin {
ScoreboardManager.teardownAll(); ScoreboardManager.teardownAll();
formulaManager.saveFormula(); formulaManager.saveFormula();
placeStore.closeAll(); chunkManager.closeAll();
} }
catch (Exception e) { catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -456,8 +439,30 @@ public class mcMMO extends JavaPlugin {
return formulaManager; return formulaManager;
} }
/**
* Get the {@link UserBlockTracker}.
* @return the {@link UserBlockTracker}
*/
public static UserBlockTracker getUserBlockTracker() {
return chunkManager;
}
/**
* Get the chunk manager.
* @return the chunk manager
*/
public static ChunkManager getChunkManager() {
return chunkManager;
}
/**
* Get the chunk manager.
* @deprecated Use {@link #getChunkManager()} or {@link #getUserBlockTracker()} instead.
* @return the chunk manager
*/
@Deprecated(since = "2.2.013", forRemoval = true)
public static ChunkManager getPlaceStore() { public static ChunkManager getPlaceStore() {
return placeStore; return chunkManager;
} }
public static RepairableManager getRepairableManager() { public static RepairableManager getRepairableManager() {
@ -484,10 +489,6 @@ public class mcMMO extends JavaPlugin {
return platformManager.getCompatibilityManager(); return platformManager.getCompatibilityManager();
} }
public static MetadataService getMetadataService() {
return metadataService;
}
@Deprecated @Deprecated
public static void setDatabaseManager(DatabaseManager databaseManager) { public static void setDatabaseManager(DatabaseManager databaseManager) {
mcMMO.databaseManager = databaseManager; mcMMO.databaseManager = databaseManager;
@ -567,7 +568,11 @@ public class mcMMO extends JavaPlugin {
FishingTreasureConfig.getInstance(); FishingTreasureConfig.getInstance();
HiddenConfig.getInstance(); HiddenConfig.getInstance();
mcMMO.p.getAdvancedConfig(); mcMMO.p.getAdvancedConfig();
PotionConfig.getInstance();
// init potion config
potionConfig = new PotionConfig();
potionConfig.loadPotions();
CoreSkillsConfig.getInstance(); CoreSkillsConfig.getInstance();
SoundConfig.getInstance(); SoundConfig.getInstance();
RankConfig.getInstance(); RankConfig.getInstance();
@ -628,8 +633,7 @@ public class mcMMO extends JavaPlugin {
InteractionManager.initMaps(); //Init maps InteractionManager.initMaps(); //Init maps
if(CoreSkillsConfig.getInstance().isPrimarySkillEnabled(PrimarySkillType.ACROBATICS)) if (CoreSkillsConfig.getInstance().isPrimarySkillEnabled(PrimarySkillType.ACROBATICS)) {
{
LogUtils.debug(mcMMO.p.getLogger(), "Enabling Acrobatics Skills"); LogUtils.debug(mcMMO.p.getLogger(), "Enabling Acrobatics Skills");
//TODO: Should do this differently //TODO: Should do this differently
@ -664,8 +668,7 @@ public class mcMMO extends JavaPlugin {
if (purgeIntervalTicks == 0) { if (purgeIntervalTicks == 0) {
getFoliaLib().getImpl().runLaterAsync(new UserPurgeTask(), 2 * Misc.TICK_CONVERSION_FACTOR); // Start 2 seconds after startup. getFoliaLib().getImpl().runLaterAsync(new UserPurgeTask(), 2 * Misc.TICK_CONVERSION_FACTOR); // Start 2 seconds after startup.
} } else if (purgeIntervalTicks > 0) {
else if (purgeIntervalTicks > 0) {
getFoliaLib().getImpl().runTimerAsync(new UserPurgeTask(), purgeIntervalTicks, purgeIntervalTicks); getFoliaLib().getImpl().runTimerAsync(new UserPurgeTask(), purgeIntervalTicks, purgeIntervalTicks);
} }
@ -688,8 +691,7 @@ public class mcMMO extends JavaPlugin {
getFoliaLib().getImpl().runTimer(new ClearRegisteredXPGainTask(), 60, 60); getFoliaLib().getImpl().runTimer(new ClearRegisteredXPGainTask(), 60, 60);
} }
if(mcMMO.p.getAdvancedConfig().allowPlayerTips()) if (mcMMO.p.getAdvancedConfig().allowPlayerTips()) {
{
getFoliaLib().getImpl().runTimer(new NotifySquelchReminderTask(), 60, ((20 * 60) * 60)); getFoliaLib().getImpl().runTimer(new NotifySquelchReminderTask(), 60, ((20 * 60) * 60));
} }
} }
@ -739,10 +741,6 @@ public class mcMMO extends JavaPlugin {
return platformManager; return platformManager;
} }
public static SmeltingTracker getSmeltingTracker() {
return smeltingTracker;
}
public static BukkitAudiences getAudiences() { public static BukkitAudiences getAudiences() {
return audiences; return audiences;
} }
@ -812,7 +810,23 @@ public class mcMMO extends JavaPlugin {
return customItemSupportConfig; return customItemSupportConfig;
} }
public PotionConfig getPotionConfig() {
return potionConfig;
}
public EnchantmentMapper getEnchantmentMapper() {
return enchantmentMapper;
}
public AttributeMapper getAttributeMapper() {
return attributeMapper;
}
public @NotNull FoliaLib getFoliaLib() { public @NotNull FoliaLib getFoliaLib() {
return foliaLib; return foliaLib;
} }
// public ProtocolLibManager getProtocolLibManager() {
// return protocolLibManager;
// }
} }

View File

@ -1,49 +0,0 @@
package com.gmail.nossr50.metadata;
import com.gmail.nossr50.mcMMO;
import org.bukkit.block.Furnace;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataHolder;
import org.bukkit.persistence.PersistentDataType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
import static com.gmail.nossr50.metadata.MetadataService.NSK_FURNACE_UUID_LEAST_SIG;
import static com.gmail.nossr50.metadata.MetadataService.NSK_FURNACE_UUID_MOST_SIG;
public class BlockMetadataService {
private final @NotNull mcMMO pluginRef;
public BlockMetadataService(@NotNull mcMMO pluginRef) {
this.pluginRef = pluginRef;
}
public @Nullable UUID getFurnaceOwner(@NotNull Furnace furnace) {
//Get container from entity
PersistentDataContainer dataContainer = ((PersistentDataHolder) furnace).getPersistentDataContainer();
//Too lazy to make a custom data type for this stuff
Long mostSigBits = dataContainer.get(NSK_FURNACE_UUID_MOST_SIG, PersistentDataType.LONG);
Long leastSigBits = dataContainer.get(NSK_FURNACE_UUID_LEAST_SIG, PersistentDataType.LONG);
if (mostSigBits != null && leastSigBits != null) {
return new UUID(mostSigBits, leastSigBits);
} else {
return null;
}
}
public void setFurnaceOwner(@NotNull Furnace furnace, @NotNull UUID uuid) {
PersistentDataContainer dataContainer = ((PersistentDataHolder) furnace).getPersistentDataContainer();
dataContainer.set(NSK_FURNACE_UUID_MOST_SIG, PersistentDataType.LONG, uuid.getMostSignificantBits());
dataContainer.set(NSK_FURNACE_UUID_LEAST_SIG, PersistentDataType.LONG, uuid.getLeastSignificantBits());
furnace.update();
}
}

View File

@ -1,71 +0,0 @@
package com.gmail.nossr50.metadata;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.MetadataConstants;
import org.bukkit.NamespacedKey;
import org.jetbrains.annotations.NotNull;
public class MetadataService {
private final @NotNull mcMMO pluginRef;
protected static final @NotNull NamespacedKey NSK_SUPER_ABILITY_BOOSTED_ITEM;
protected static final @NotNull NamespacedKey NSK_MOB_SPAWNER_MOB;
protected static final @NotNull NamespacedKey NSK_EGG_MOB;
protected static final @NotNull NamespacedKey NSK_NETHER_GATE_MOB;
protected static final @NotNull NamespacedKey NSK_COTW_SUMMONED_MOB;
protected static final @NotNull NamespacedKey NSK_PLAYER_BRED_MOB;
protected static final @NotNull NamespacedKey NSK_PLAYER_TAMED_MOB;
protected static final @NotNull NamespacedKey NSK_VILLAGER_TRADE_ORIGIN_ITEM;
protected static final @NotNull NamespacedKey NSK_EXPLOITED_ENDERMEN;
protected static final @NotNull NamespacedKey NSK_FURNACE_UUID_MOST_SIG;
protected static final @NotNull NamespacedKey NSK_FURNACE_UUID_LEAST_SIG;
static {
NSK_SUPER_ABILITY_BOOSTED_ITEM = getNamespacedKey(MetadataConstants.METADATA_KEY_SUPER_ABILITY_BOOSTED_ITEM);
NSK_MOB_SPAWNER_MOB = getNamespacedKey(MetadataConstants.METADATA_KEY_MOB_SPAWNER_MOB);
NSK_EGG_MOB = getNamespacedKey(MetadataConstants.METADATA_KEY_EGG_MOB);
NSK_NETHER_GATE_MOB = getNamespacedKey(MetadataConstants.METADATA_KEY_NETHER_PORTAL_MOB);
NSK_COTW_SUMMONED_MOB = getNamespacedKey(MetadataConstants.METADATA_KEY_COTW_SUMMONED_MOB);
NSK_PLAYER_BRED_MOB = getNamespacedKey(MetadataConstants.METADATA_KEY_PLAYER_BRED_MOB);
NSK_PLAYER_TAMED_MOB = getNamespacedKey(MetadataConstants.METADATA_KEY_PLAYER_TAMED_MOB);
NSK_VILLAGER_TRADE_ORIGIN_ITEM = getNamespacedKey(MetadataConstants.METADATA_KEY_VILLAGER_TRADE_ORIGIN_ITEM);
NSK_EXPLOITED_ENDERMEN = getNamespacedKey(MetadataConstants.METADATA_KEY_EXPLOITED_ENDERMEN);
NSK_FURNACE_UUID_MOST_SIG = getNamespacedKey(MetadataConstants.METADATA_KEY_FURNACE_UUID_MOST_SIG);
NSK_FURNACE_UUID_LEAST_SIG = getNamespacedKey(MetadataConstants.METADATA_KEY_FURNACE_UUID_LEAST_SIG);
}
private final @NotNull ItemMetadataService itemMetadataService;
private final @NotNull MobMetadataService mobMetadataService;
private final @NotNull BlockMetadataService blockMetadataService;
public MetadataService(@NotNull mcMMO pluginRef) {
this.pluginRef = pluginRef;
blockMetadataService = new BlockMetadataService(pluginRef);
mobMetadataService = new MobMetadataService(pluginRef);
itemMetadataService = new ItemMetadataService(pluginRef);
}
/**
* Helper method to simplify generating namespaced keys
*
* @param key the {@link String} value of the key
*
* @return the generated {@link NamespacedKey}
*/
public static @NotNull NamespacedKey getNamespacedKey(@NotNull String key) {
return new NamespacedKey(mcMMO.p, key);
}
public @NotNull ItemMetadataService getItemMetadataService() {
return itemMetadataService;
}
public @NotNull MobMetadataService getMobMetadataService() {
return mobMetadataService;
}
public @NotNull BlockMetadataService getBlockMetadataService() {
return blockMetadataService;
}
}

View File

@ -51,8 +51,7 @@ public final class ShareHandler {
for (Player member : nearMembers) { for (Player member : nearMembers) {
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(member) == null) if (UserManager.getPlayer(member) == null) {
{
continue; continue;
} }
@ -115,8 +114,7 @@ public final class ShareHandler {
McMMOPlayer mcMMOMember = UserManager.getPlayer(member); McMMOPlayer mcMMOMember = UserManager.getPlayer(member);
//Profile not loaded //Profile not loaded
if(UserManager.getPlayer(member) == null) if (UserManager.getPlayer(member) == null) {
{
continue; continue;
} }
@ -161,11 +159,9 @@ public final class ShareHandler {
public static XPGainReason getSharedXpGainReason(XPGainReason xpGainReason) { public static XPGainReason getSharedXpGainReason(XPGainReason xpGainReason) {
if (xpGainReason == XPGainReason.PVE) { if (xpGainReason == XPGainReason.PVE) {
return XPGainReason.SHARED_PVE; return XPGainReason.SHARED_PVE;
} } else if (xpGainReason == XPGainReason.PVP) {
else if (xpGainReason == XPGainReason.PVP) {
return XPGainReason.SHARED_PVP; return XPGainReason.SHARED_PVP;
} } else {
else {
return xpGainReason; return xpGainReason;
} }
} }

Some files were not shown because too many files have changed in this diff Show More