diff --git a/src/main/java/net/Indyuce/mmocore/MMOCore.java b/src/main/java/net/Indyuce/mmocore/MMOCore.java index 0bcdeb1c..5e5c987c 100644 --- a/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -48,6 +48,10 @@ import net.Indyuce.mmocore.party.PartyModule; import net.Indyuce.mmocore.party.PartyModuleType; import net.Indyuce.mmocore.party.provided.MMOCorePartyModule; import net.Indyuce.mmocore.skill.cast.SkillCastingMode; +import net.Indyuce.mmocore.skill.custom.mechanic.ExperienceMechanic; +import net.Indyuce.mmocore.skill.custom.mechanic.ManaMechanic; +import net.Indyuce.mmocore.skill.custom.mechanic.StaminaMechanic; +import net.Indyuce.mmocore.skill.custom.mechanic.StelliumMechanic; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -117,6 +121,12 @@ public class MMOCore extends LuminePlugin { MythicLib.plugin.getEntities().registerRestriction(new MMOCoreTargetRestriction()); MythicLib.plugin.getModifiers().registerModifierType("attribute", configObject -> new AttributeModifier(configObject)); + // Skill creation + MythicLib.plugin.getSkills().registerMechanic("mana", config -> new ManaMechanic(config)); + MythicLib.plugin.getSkills().registerMechanic("stamina", config -> new StaminaMechanic(config)); + MythicLib.plugin.getSkills().registerMechanic("stellium", config -> new StelliumMechanic(config)); + MythicLib.plugin.getSkills().registerMechanic("experience", config -> new ExperienceMechanic(config)); + // Register extra objective, drop items... if (Bukkit.getPluginManager().getPlugin("WorldGuard") != null) loadManager.registerLoader(new WorldGuardMMOLoader()); diff --git a/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/ExperienceMechanic.java b/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/ExperienceMechanic.java new file mode 100644 index 00000000..61ae176e --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/ExperienceMechanic.java @@ -0,0 +1,46 @@ +package net.Indyuce.mmocore.skill.custom.mechanic; + +import io.lumine.mythic.lib.skill.SkillMetadata; +import io.lumine.mythic.lib.skill.custom.mechanic.type.TargetMechanic; +import io.lumine.mythic.lib.util.DoubleFormula; +import io.lumine.mythic.lib.util.configobject.ConfigObject; +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.experience.EXPSource; +import net.Indyuce.mmocore.experience.SimpleExperienceObject; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; +import org.apache.commons.lang.Validate; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +public class ExperienceMechanic extends TargetMechanic { + @NotNull + private final DoubleFormula amount; + @NotNull + private final EXPSource source; + @NotNull + private final ExperienceDispenser dispenser; + + public ExperienceMechanic(ConfigObject config) { + super(config); + + config.validateKeys("amount"); + amount = config.getDoubleFormula("amount"); + + if (config.contains("profession")) { + String id = config.getString("profession").toLowerCase().replace("_", "-"); + Validate.isTrue(MMOCore.plugin.professionManager.has(id), "Could not find profession"); + dispenser = MMOCore.plugin.professionManager.get(id); + } else + dispenser = new SimpleExperienceObject(); + source = config.contains("source") ? EXPSource.valueOf(config.getString("source").toUpperCase()) : EXPSource.QUEST; + } + + @Override + public void cast(SkillMetadata meta, Entity target) { + Validate.isTrue(target instanceof Player, "Target is not a player"); + PlayerData targetData = PlayerData.get(target.getUniqueId()); + dispenser.giveExperience(targetData, amount.evaluate(meta), null, source); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/ManaMechanic.java b/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/ManaMechanic.java index ebd6e8b6..49f93831 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/ManaMechanic.java +++ b/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/ManaMechanic.java @@ -13,6 +13,7 @@ import org.bukkit.entity.Player; public class ManaMechanic extends TargetMechanic { private final DoubleFormula amount; + private final Operation operation; private final PlayerResourceUpdateEvent.UpdateReason reason; public ManaMechanic(ConfigObject config) { @@ -22,12 +23,18 @@ public class ManaMechanic extends TargetMechanic { amount = new DoubleFormula(config.getString("amount")); reason = PlayerResourceUpdateEvent.UpdateReason.valueOf(UtilityMethods.enumName(config.getString("reason", "CUSTOM"))); + operation = config.contains("operation") ? Operation.valueOf(config.getString("operation").toUpperCase()) : Operation.GIVE; } @Override public void cast(SkillMetadata meta, Entity target) { Validate.isTrue(target instanceof Player, "Target is not a player"); PlayerData targetData = PlayerData.get(target.getUniqueId()); - targetData.giveMana(amount.evaluate(meta), reason); + if (operation == Operation.GIVE) + targetData.giveMana(amount.evaluate(meta), reason); + else if (operation == Operation.SET) + targetData.setMana(amount.evaluate(meta)); + else if (operation == Operation.TAKE) + targetData.giveMana(-amount.evaluate(meta), reason); } } diff --git a/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/Operation.java b/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/Operation.java new file mode 100644 index 00000000..ea05f52c --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/Operation.java @@ -0,0 +1,7 @@ +package net.Indyuce.mmocore.skill.custom.mechanic; + +public enum Operation { + GIVE, + SET, + TAKE +} \ No newline at end of file diff --git a/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/StaminaMechanic.java b/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/StaminaMechanic.java index 3d6e4bd8..88f28384 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/StaminaMechanic.java +++ b/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/StaminaMechanic.java @@ -13,6 +13,7 @@ import org.bukkit.entity.Player; public class StaminaMechanic extends TargetMechanic { private final DoubleFormula amount; + private final Operation operation; private final PlayerResourceUpdateEvent.UpdateReason reason; public StaminaMechanic(ConfigObject config) { @@ -22,12 +23,18 @@ public class StaminaMechanic extends TargetMechanic { amount = new DoubleFormula(config.getString("amount")); reason = PlayerResourceUpdateEvent.UpdateReason.valueOf(UtilityMethods.enumName(config.getString("reason", "CUSTOM"))); + operation = config.contains("operation") ? Operation.valueOf(config.getString("operation").toUpperCase()) : Operation.GIVE; } @Override public void cast(SkillMetadata meta, Entity target) { Validate.isTrue(target instanceof Player, "Target is not a player"); PlayerData targetData = PlayerData.get(target.getUniqueId()); - targetData.giveStamina(amount.evaluate(meta), reason); + if (operation == Operation.GIVE) + targetData.giveStamina(amount.evaluate(meta), reason); + else if (operation == Operation.SET) + targetData.setStamina(amount.evaluate(meta)); + else if (operation == Operation.TAKE) + targetData.giveStamina(-amount.evaluate(meta), reason); } } diff --git a/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/StelliumMechanic.java b/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/StelliumMechanic.java index 92ecb179..e104bbcb 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/StelliumMechanic.java +++ b/src/main/java/net/Indyuce/mmocore/skill/custom/mechanic/StelliumMechanic.java @@ -13,6 +13,7 @@ import org.bukkit.entity.Player; public class StelliumMechanic extends TargetMechanic { private final DoubleFormula amount; + private final Operation operation; private final PlayerResourceUpdateEvent.UpdateReason reason; public StelliumMechanic(ConfigObject config) { @@ -22,12 +23,18 @@ public class StelliumMechanic extends TargetMechanic { amount = new DoubleFormula(config.getString("amount")); reason = PlayerResourceUpdateEvent.UpdateReason.valueOf(UtilityMethods.enumName(config.getString("reason", "CUSTOM"))); + operation = config.contains("operation") ? Operation.valueOf(config.getString("operation").toUpperCase()) : Operation.GIVE; } @Override public void cast(SkillMetadata meta, Entity target) { Validate.isTrue(target instanceof Player, "Target is not a player"); PlayerData targetData = PlayerData.get(target.getUniqueId()); - targetData.giveStellium(amount.evaluate(meta), reason); + if (operation == Operation.GIVE) + targetData.giveStellium(amount.evaluate(meta), reason); + else if (operation == Operation.SET) + targetData.setStellium(amount.evaluate(meta)); + else if (operation == Operation.TAKE) + targetData.giveStellium(-amount.evaluate(meta), reason); } }