diff --git a/src/main/java/net/Indyuce/mmocore/api/MMOCoreAPI.java b/src/main/java/net/Indyuce/mmocore/api/MMOCoreAPI.java new file mode 100644 index 00000000..03fdfa92 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/api/MMOCoreAPI.java @@ -0,0 +1,116 @@ +package net.Indyuce.mmocore.api; + +import io.lumine.mythic.lib.api.player.EquipmentSlot; +import io.lumine.mythic.lib.player.PlayerMetadata; +import io.lumine.mythic.lib.skill.SimpleSkill; +import io.lumine.mythic.lib.skill.Skill; +import io.lumine.mythic.lib.skill.handler.SkillHandler; +import io.lumine.mythic.lib.skill.result.SkillResult; +import io.lumine.mythic.lib.skill.trigger.TriggerMetadata; +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.party.AbstractParty; +import net.Indyuce.mmocore.skill.CastableSkill; +import net.Indyuce.mmocore.skill.ClassSkill; +import net.Indyuce.mmocore.skill.RegisteredSkill; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; + +public class MMOCoreAPI { + private final JavaPlugin plugin; + + public MMOCoreAPI(JavaPlugin plugin) { + this.plugin = plugin; + } + + public PlayerData getPlayerData(OfflinePlayer player) { + return PlayerData.get(player.getUniqueId()); + } + + public boolean isInSameParty(Player player1, Player player2) { + AbstractParty party = MMOCore.plugin.partyModule.getParty(PlayerData.get(player1)); + return party != null && party.hasMember(player2); + } + + /** + * Forces a player to cast a skill. It has the effect of caching + * the player stats so when casting multiple skills at the same + * time, it's better to copy and paste the content of this method + * and cache the content of the caster and triggerMeta + * fields for better performance. + *

+ * Throws a NPE if no skill with such ID can be found + * + * @param playerData Player casting the skill + * @param skillId Name of skill being cast + * @param level Level of cast skill + * @return Skill result (if it's canceled) + */ + public SkillResult cast(PlayerData playerData, String skillId, int level) { + return cast(playerData, MMOCore.plugin.skillManager.getSkillOrThrow(skillId), level); + } + + /** + * Forces a player to cast a skill. It has the effect of caching + * the player stats so when casting multiple skills at the same + * time, it's better to copy and paste the content of this method + * and cache the content of the caster and triggerMeta + * fields for better performance. + * + * @param playerData Player casting the skill + * @param skill Skill being cast + * @return Skill result (if it's canceled) + */ + public SkillResult cast(PlayerData playerData, ClassSkill skill) { + PlayerMetadata casterMeta = playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND); + TriggerMetadata triggerMeta = new TriggerMetadata(casterMeta, null, null); + return new CastableSkill(skill, playerData.getSkillLevel(skill.getSkill())).cast(triggerMeta); + } + + /** + * Forces a player to cast a skill. It has the effect of caching + * the player stats so when casting multiple skills at the same + * time, it's better to copy and paste the content of this method + * and cache the content of the caster and triggerMeta + * fields for better performance. + *

+ * This method casts a skill with default modifier formulas. + * + * @param playerData Player casting the skill + * @param skill Skill being cast + * @param level Level of cast skill. This could be the returned value of + * playerData.getSkillLevel(skill) + * @return Skill result (if it's canceled) + */ + public SkillResult cast(PlayerData playerData, RegisteredSkill skill, int level) { + PlayerMetadata casterMeta = playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND); + TriggerMetadata triggerMeta = new TriggerMetadata(casterMeta, null, null); + return new CastableSkill(new ClassSkill(skill, 0), level).cast(triggerMeta); + } + + /** + * Forces a player to cast a skill. It has the effect of caching + * the player stats so when casting multiple skills at the same + * time, it's better to copy and paste the content of this method + * and cache the content of the caster and triggerMeta + * fields for better performance. + *

+ * Since the provided skill handler does NOT provide information about + * the skill modifiers, MMOCore tries to find a corresponding registered + * MMOCore skill in the MMOCore database. If it exists, it uses the + * modifiers from this skill, otherwise all modifiers are set to 0 + * + * @param playerData Player casting the skill + * @param skill Skill being cast + * @param level Level of cast skill + * @return Skill result (if it's canceled) + */ + public SkillResult cast(PlayerData playerData, SkillHandler skill, int level) { + PlayerMetadata casterMeta = playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND); + TriggerMetadata triggerMeta = new TriggerMetadata(casterMeta, null, null); + RegisteredSkill registered = MMOCore.plugin.skillManager.getSkill(skill.getId()); + Skill cast = registered == null ? new SimpleSkill(skill) : new CastableSkill(new ClassSkill(registered, 0), level); + return cast.cast(triggerMeta); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index 51db96c9..4d39884a 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -776,10 +776,6 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc skills.remove(skill); } - /** - * @deprecated use {@link PlayerClass#findSkill(RegisteredSkill)} instead - */ - @Deprecated public boolean hasSkillUnlocked(RegisteredSkill skill) { return getProfess().hasSkill(skill.getHandler().getId()) && hasSkillUnlocked(getProfess().getSkill(skill.getHandler().getId())); } diff --git a/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java b/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java index cba0fc0d..f5949003 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java @@ -6,15 +6,14 @@ import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigFile; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.skill.RegisteredSkill; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.*; import java.util.logging.Level; public class SkillManager implements MMOCoreManager { @@ -24,10 +23,16 @@ public class SkillManager implements MMOCoreManager { skills.put(skill.getHandler().getId().toUpperCase(), skill); } + @Nullable public RegisteredSkill getSkill(String id) { return skills.get(id.toUpperCase()); } + @NotNull + public RegisteredSkill getSkillOrThrow(String id) { + return Objects.requireNonNull(skills.get(id.toUpperCase()), "Could not find skill with ID '" + id + "'"); + } + public boolean hasSkill(String id) { return skills.containsKey(id.toUpperCase()); } diff --git a/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java b/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java index 3a799234..d4a70658 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java +++ b/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java @@ -64,12 +64,13 @@ public class ClassSkill implements CooldownObject { return maxSkillLevel; } - /* - * this method can only OVERRIDE default modifiers + /** + * This method can only override default modifiers and + * will throw an error when trying to define non existing modifiers */ public void addModifier(String modifier, LinearValue linear) { - if (modifiers.containsKey(modifier)) - modifiers.put(modifier, linear); + Validate.isTrue(modifiers.containsKey(modifier), "Could not find modifier '" + modifier + "'"); + modifiers.put(modifier, linear); } public double getModifier(String modifier, int level) { @@ -117,6 +118,7 @@ public class ClassSkill implements CooldownObject { return new PassiveSkill("MMOCorePassiveSkill", skill.getTrigger(), toCastable(caster), EquipmentSlot.OTHER, ModifierSource.OTHER); } + @Override public String getCooldownPath() { return "skill_" + skill.getHandler().getId(); }