support for mm skill handlers

This commit is contained in:
Indyuce 2021-12-30 14:41:52 +01:00
parent 392eaceaaf
commit 987208c194
108 changed files with 1779 additions and 254 deletions

View File

@ -141,7 +141,7 @@
<dependency>
<groupId>io.lumine</groupId>
<artifactId>MythicLib-dist</artifactId>
<version>1.3</version>
<version>1.3-R5</version>
<scope>provided</scope>
</dependency>

View File

@ -61,24 +61,8 @@ import net.Indyuce.mmoitems.listener.EquipListener;
import net.Indyuce.mmoitems.listener.ItemListener;
import net.Indyuce.mmoitems.listener.ItemUse;
import net.Indyuce.mmoitems.listener.PlayerListener;
import net.Indyuce.mmoitems.manager.AbilityManager;
import net.Indyuce.mmoitems.manager.BlockManager;
import net.Indyuce.mmoitems.manager.ConfigManager;
import net.Indyuce.mmoitems.manager.CraftingManager;
import net.Indyuce.mmoitems.manager.DropTableManager;
import net.Indyuce.mmoitems.manager.EntityManager;
import net.Indyuce.mmoitems.manager.ItemManager;
import net.Indyuce.mmoitems.manager.LayoutManager;
import net.Indyuce.mmoitems.manager.LoreFormatManager;
import net.Indyuce.mmoitems.manager.PluginUpdateManager;
import net.Indyuce.mmoitems.manager.RecipeManager;
import net.Indyuce.mmoitems.manager.SetManager;
import net.Indyuce.mmoitems.manager.StatManager;
import net.Indyuce.mmoitems.manager.TemplateManager;
import net.Indyuce.mmoitems.manager.TierManager;
import net.Indyuce.mmoitems.manager.TypeManager;
import net.Indyuce.mmoitems.manager.UpgradeManager;
import net.Indyuce.mmoitems.manager.WorldGenManager;
import net.Indyuce.mmoitems.manager.*;
import net.Indyuce.mmoitems.skill.Shulker_Missile;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@ -108,6 +92,7 @@ public class MMOItems extends LuminePlugin {
private final LoreFormatManager formatManager = new LoreFormatManager();
private final TemplateManager templateManager = new TemplateManager();
private final AbilityManager abilityManager = new AbilityManager();
private final SkillManager skillManager = new SkillManager();
private final EntityManager entityManager = new EntityManager();
private final RecipeManager recipeManager = new RecipeManager();
private final LayoutManager layoutManager = new LayoutManager();
@ -164,6 +149,9 @@ public class MMOItems extends LuminePlugin {
typeManager.reload();
templateManager.preloadTemplates();
// Register MMOItems-specific skills
MythicLib.plugin.getSkills().registerSkillHandler(new Shulker_Missile());
if (Bukkit.getPluginManager().getPlugin("MMOCore") != null) new MMOCoreMMOLoader();
if (Bukkit.getPluginManager().getPlugin("mcMMO") != null)
@ -184,7 +172,7 @@ public class MMOItems extends LuminePlugin {
new MMOItemsMetrics();
RecipeBrowserGUI.registerNativeRecipes();
abilityManager.loadPluginAbilities();
skillManager.reload();
configManager = new ConfigManager();
final int configVersion = getConfig().contains("config-version", true) ? getConfig().getInt("config-version") : -1;
@ -489,10 +477,15 @@ public class MMOItems extends LuminePlugin {
return dropTableManager;
}
@Deprecated
public AbilityManager getAbilities() {
return abilityManager;
}
public SkillManager getSkills() {
return skillManager;
}
public BlockManager getCustomBlocks() {
return blockManager;
}

View File

@ -2,14 +2,27 @@ package net.Indyuce.mmoitems.ability;
import io.lumine.mythic.lib.damage.AttackMetadata;
import io.lumine.mythic.lib.player.cooldown.CooldownObject;
import io.lumine.mythic.lib.skill.SkillMetadata;
import io.lumine.mythic.lib.skill.handler.SkillHandler;
import io.lumine.mythic.lib.skill.trigger.TriggerType;
import net.Indyuce.mmoitems.skill.RegisteredSkill;
import net.Indyuce.mmoitems.stat.data.AbilityData;
import org.apache.commons.lang.Validate;
import org.bukkit.entity.LivingEntity;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Set;
public abstract class Ability<T extends AbilityMetadata> implements CooldownObject {
/**
* @deprecated Abilities were moved over to MythicLib.
* Abilities are being replaced by {@link io.lumine.mythic.lib.skill.handler.SkillHandler}
*/
@Deprecated
public abstract class Ability<T extends AbilityMetadata> extends SkillHandler<T> implements CooldownObject {
private final String name, id;
private final Map<String, Double> modifiers = new HashMap<>();
@ -48,6 +61,26 @@ public abstract class Ability<T extends AbilityMetadata> implements CooldownObje
return modifiers.keySet();
}
@NotNull
@Override
public T getResult(SkillMetadata meta) {
// Corresponding registered skill
RegisteredSkill registeredSkill = new RegisteredSkill(this);
// Corresponding ability data
AbilityData abilityData = new AbilityData(registeredSkill, TriggerType.API);
for (String mod : modifiers.keySet())
abilityData.setModifier(mod, meta.getModifier(mod));
return canBeCast(meta.getAttack(), meta.hasTargetEntity() && meta.getTargetEntityOrNull() instanceof LivingEntity ? (LivingEntity) meta.getTargetEntityOrNull() : null, abilityData);
}
@Override
public void whenCast(T t, SkillMetadata skillMetadata) {
whenCast(skillMetadata.getAttack(), t);
}
public void addModifier(String modifier, double defaultValue) {
modifiers.put(modifier, defaultValue);
}

View File

@ -1,8 +1,15 @@
package net.Indyuce.mmoitems.ability;
import io.lumine.mythic.lib.skill.SkillMetadata;
import io.lumine.mythic.lib.skill.result.SkillResult;
import net.Indyuce.mmoitems.stat.data.AbilityData;
public abstract class AbilityMetadata {
/**
* @deprecated Abilities were moved over to MythicLib.
* AbilityMetadata from MMOItems are now {@link io.lumine.mythic.lib.skill.result.SkillResult}
*/
@Deprecated
public abstract class AbilityMetadata implements SkillResult {
private final AbilityData ability;
public AbilityMetadata(AbilityData ability) {
@ -28,4 +35,9 @@ public abstract class AbilityMetadata {
* at an entity..)
*/
public abstract boolean isSuccessful();
@Override
public boolean isSuccessful(SkillMetadata skillMetadata) {
return isSuccessful();
}
}

View File

@ -0,0 +1,36 @@
package net.Indyuce.mmoitems.ability;
import io.lumine.mythic.lib.damage.AttackMetadata;
import io.lumine.mythic.lib.skill.SkillMetadata;
import io.lumine.mythic.lib.skill.custom.variable.VariableList;
import io.lumine.mythic.lib.skill.custom.variable.VariableScope;
import net.Indyuce.mmoitems.ability.metadata.BackwardsCompatibleAbilityMetadata;
import net.Indyuce.mmoitems.skill.RegisteredSkill;
import net.Indyuce.mmoitems.stat.data.AbilityData;
import org.bukkit.entity.LivingEntity;
import org.jetbrains.annotations.Nullable;
@Deprecated
public class BackwardsCompatibleAbility extends Ability<BackwardsCompatibleAbilityMetadata> {
private final RegisteredSkill registeredSkill;
public BackwardsCompatibleAbility(RegisteredSkill registeredSkill) {
super(registeredSkill.getHandler().getId(), registeredSkill.getName());
this.registeredSkill = registeredSkill;
}
@Nullable
@Override
public BackwardsCompatibleAbilityMetadata canBeCast(AttackMetadata attack, LivingEntity target, AbilityData ability) {
SkillMetadata skillMeta = new SkillMetadata(ability, attack.getStats(), new VariableList(VariableScope.SKILL), attack, attack.getPlayer().getLocation(), null, target);
return new BackwardsCompatibleAbilityMetadata(skillMeta, registeredSkill.getHandler().getResult(skillMeta), ability);
}
@Override
public void whenCast(AttackMetadata attack, BackwardsCompatibleAbilityMetadata ability) {
registeredSkill.getHandler().whenCast(ability.getResult(), ability.getMetadata());
}
}

View File

@ -2,10 +2,14 @@ package net.Indyuce.mmoitems.ability;
import io.lumine.mythic.lib.damage.AttackMetadata;
import net.Indyuce.mmoitems.ability.metadata.FriendlyTargetAbilityMetadata;
import io.lumine.mythic.lib.damage.AttackMetadata;
import net.Indyuce.mmoitems.stat.data.AbilityData;
import org.bukkit.entity.LivingEntity;
/**
* @deprecated Abilities were moved over to MythicLib.
* Abilities are being replaced by {@link io.lumine.mythic.lib.skill.handler.SkillHandler}
*/
@Deprecated
public abstract class FriendlyTargetAbility extends Ability<FriendlyTargetAbilityMetadata> {
public FriendlyTargetAbility() {
super();
@ -18,6 +22,4 @@ public abstract class FriendlyTargetAbility extends Ability<FriendlyTargetAbilit
public FriendlyTargetAbilityMetadata canBeCast(AttackMetadata attack, LivingEntity target, AbilityData ability) {
return new FriendlyTargetAbilityMetadata(ability, attack.getPlayer(), target);
}
public abstract void whenCast(AttackMetadata attack, FriendlyTargetAbilityMetadata ability);
}

View File

@ -5,6 +5,11 @@ import net.Indyuce.mmoitems.ability.metadata.ItemAbilityMetadata;
import net.Indyuce.mmoitems.stat.data.AbilityData;
import org.bukkit.entity.LivingEntity;
/**
* @deprecated Abilities were moved over to MythicLib.
* Abilities are being replaced by {@link io.lumine.mythic.lib.skill.handler.SkillHandler}
*/
@Deprecated
public abstract class ItemAbility extends Ability<ItemAbilityMetadata> {
public ItemAbility() {
super();

View File

@ -5,6 +5,11 @@ import net.Indyuce.mmoitems.ability.metadata.LocationAbilityMetadata;
import net.Indyuce.mmoitems.stat.data.AbilityData;
import org.bukkit.entity.LivingEntity;
/**
* @deprecated Abilities were moved over to MythicLib.
* Abilities are being replaced by {@link io.lumine.mythic.lib.skill.handler.SkillHandler}
*/
@Deprecated
public abstract class LocationAbility extends Ability<LocationAbilityMetadata> {
public LocationAbility() {
super();

View File

@ -5,6 +5,11 @@ import net.Indyuce.mmoitems.ability.metadata.SimpleAbilityMetadata;
import net.Indyuce.mmoitems.stat.data.AbilityData;
import org.bukkit.entity.LivingEntity;
/**
* @deprecated Abilities were moved over to MythicLib.
* Abilities are being replaced by {@link io.lumine.mythic.lib.skill.handler.SkillHandler}
*/
@Deprecated
public abstract class SimpleAbility extends Ability<SimpleAbilityMetadata> {
public SimpleAbility() {
super();

View File

@ -1,10 +1,15 @@
package net.Indyuce.mmoitems.ability;
import net.Indyuce.mmoitems.ability.metadata.TargetAbilityMetadata;
import io.lumine.mythic.lib.damage.AttackMetadata;
import net.Indyuce.mmoitems.ability.metadata.TargetAbilityMetadata;
import net.Indyuce.mmoitems.stat.data.AbilityData;
import org.bukkit.entity.LivingEntity;
/**
* @deprecated Abilities were moved over to MythicLib.
* Abilities are being replaced by {@link io.lumine.mythic.lib.skill.handler.SkillHandler}
*/
@Deprecated
public abstract class TargetAbility extends Ability<TargetAbilityMetadata> {
public TargetAbility() {
super();

View File

@ -9,7 +9,11 @@ import org.bukkit.entity.LivingEntity;
/**
* Ability that requires a direction to be cast. For
* instance, a projectile like {@link Firebolt}
*
* @deprecated Abilities were moved over to MythicLib.
* Abilities are being replaced by {@link io.lumine.mythic.lib.skill.handler.SkillHandler}
*/
@Deprecated
public abstract class VectorAbility extends Ability<VectorAbilityMetadata> {
public VectorAbility() {
super();

View File

@ -0,0 +1,32 @@
package net.Indyuce.mmoitems.ability.metadata;
import io.lumine.mythic.lib.skill.SkillMetadata;
import io.lumine.mythic.lib.skill.result.SkillResult;
import net.Indyuce.mmoitems.ability.AbilityMetadata;
import net.Indyuce.mmoitems.stat.data.AbilityData;
@Deprecated
public class BackwardsCompatibleAbilityMetadata extends AbilityMetadata {
private final SkillMetadata skillMeta;
private final SkillResult result;
public BackwardsCompatibleAbilityMetadata(SkillMetadata skillMeta, SkillResult result, AbilityData abilityData) {
super(abilityData);
this.skillMeta = skillMeta;
this.result = result;
}
@Override
public boolean isSuccessful() {
return result.isSuccessful(skillMeta);
}
public SkillMetadata getMetadata() {
return skillMeta;
}
public SkillResult getResult() {
return result;
}
}

View File

@ -8,6 +8,11 @@ import net.Indyuce.mmoitems.stat.data.AbilityData;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
/**
* @deprecated Abilities were moved over to MythicLib.
* AbilityMetadata from MMOItems are now {@link io.lumine.mythic.lib.skill.result.SkillResult}
*/
@Deprecated
public class FriendlyTargetAbilityMetadata extends AbilityMetadata {
private final LivingEntity target;

View File

@ -9,7 +9,11 @@ import org.bukkit.inventory.ItemStack;
* Item that requires to throw the item in hand.
* This takes as input the player's main hand item and
* also takes the direction where he's looking
*
* @deprecated Abilities were moved over to MythicLib.
* AbilityMetadata from MMOItems are now {@link io.lumine.mythic.lib.skill.result.SkillResult}
*/
@Deprecated
public class ItemAbilityMetadata extends VectorAbilityMetadata {
private final ItemStack item;

View File

@ -11,7 +11,11 @@ import org.bukkit.entity.Player;
/**
* Ability that requires a target location, for
* instance {@link Minor_Explosion}
*
* @deprecated Abilities were moved over to MythicLib.
* AbilityMetadata from MMOItems are now {@link io.lumine.mythic.lib.skill.result.SkillResult}
*/
@Deprecated
public class LocationAbilityMetadata extends AbilityMetadata {
private final Location target;

View File

@ -3,6 +3,11 @@ package net.Indyuce.mmoitems.ability.metadata;
import net.Indyuce.mmoitems.ability.AbilityMetadata;
import net.Indyuce.mmoitems.stat.data.AbilityData;
/**
* @deprecated Abilities were moved over to MythicLib.
* AbilityMetadata from MMOItems are now {@link io.lumine.mythic.lib.skill.result.SkillResult}
*/
@Deprecated
public class SimpleAbilityMetadata extends AbilityMetadata {
private final boolean successful;

View File

@ -8,6 +8,11 @@ import net.Indyuce.mmoitems.stat.data.AbilityData;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
/**
* @deprecated Abilities were moved over to MythicLib.
* AbilityMetadata from MMOItems are now {@link io.lumine.mythic.lib.skill.result.SkillResult}
*/
@Deprecated
public class TargetAbilityMetadata extends AbilityMetadata {
private final LivingEntity target;

View File

@ -6,6 +6,11 @@ import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
/**
* @deprecated Abilities were moved over to MythicLib.
* AbilityMetadata from MMOItems are now {@link io.lumine.mythic.lib.skill.result.SkillResult}
*/
@Deprecated
public class VectorAbilityMetadata extends AbilityMetadata {
private final Vector target;

View File

@ -14,6 +14,7 @@ import net.Indyuce.mmoitems.api.item.ItemReference;
public class ConfigFile {
private final Plugin plugin;
private final String path, name;
private final boolean exists;
private final FileConfiguration config;
@ -34,13 +35,19 @@ public class ConfigFile {
this.path = path;
this.name = name;
config = YamlConfiguration.loadConfiguration(new File(plugin.getDataFolder() + path, name + ".yml"));
File file = new File(plugin.getDataFolder() + path, name + ".yml");
exists = file.exists();
config = YamlConfiguration.loadConfiguration(file);
}
public FileConfiguration getConfig() {
return config;
}
public boolean exists() {
return exists;
}
public void save() {
try {
config.save(new File(plugin.getDataFolder() + path, name + ".yml"));

View File

@ -1,5 +1,6 @@
package net.Indyuce.mmoitems.api;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.player.EquipmentSlot;
import io.lumine.mythic.lib.api.player.MMOPlayerData;
import io.lumine.mythic.lib.damage.AttackMetadata;
@ -9,6 +10,7 @@ import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.ability.Ability;
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.api.player.RPGPlayer;
import net.Indyuce.mmoitems.skill.RegisteredSkill;
import net.Indyuce.mmoitems.stat.data.AbilityData;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
@ -39,6 +41,7 @@ public class MMOItemsAPI {
*
* @param ability Ability to register
*/
@Deprecated
public void registerAbility(Ability ability) {
MMOItems.plugin.getAbilities().registerAbility(ability);
}
@ -46,8 +49,8 @@ public class MMOItemsAPI {
/**
* @return Ability with the specified identifier like FIREBOLT
*/
public Ability getAbilityById(String id) {
return Objects.requireNonNull(MMOItems.plugin.getAbilities().getAbility(id), "Could not find ability with ID '" + id + "'");
public RegisteredSkill getAbilityById(String id) {
return Objects.requireNonNull(MMOItems.plugin.getSkills().getSkill(id), "Could not find skill with ID '" + id + "'");
}
public PlayerData getPlayerData(Player player) {
@ -83,6 +86,7 @@ public class MMOItemsAPI {
* This parameter is useless for trigger types like RIGHT_CLICK or SNEAK which aren't
* based on entity attacks; in that case the attackMeta will have an empty DamageMetadata
*/
@Deprecated
public AttackMetadata castAbility(Player player, String abilityName, Map<String, Double> modifiers, @NotNull LivingEntity target, AttackMetadata attackMeta) {
// Setup ability
@ -104,6 +108,7 @@ public class MMOItemsAPI {
* This parameter is useless for trigger types like RIGHT_CLICK or SNEAK which aren't
* based on entity attacks; in that case the attackMeta will have an empty DamageMetadata
*/
@Deprecated
public AttackMetadata castAbility(PlayerData playerData, AbilityData ability, @NotNull LivingEntity target, AttackMetadata attackMeta) {
playerData.cast(attackMeta, target, ability);
return attackMeta;

View File

@ -6,6 +6,7 @@ import org.bukkit.event.HandlerList;
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.stat.data.AbilityData;
@Deprecated
public class AbilityUseEvent extends PlayerDataEvent {
private static final HandlerList handlers = new HandlerList();

View File

@ -2,7 +2,7 @@ package net.Indyuce.mmoitems.api.interaction.weapon.untargeted.staff;
import io.lumine.mythic.lib.api.item.NBTItem;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.ability.list.vector.Shulker_Missile;
import net.Indyuce.mmoitems.skill.Shulker_Missile;
import net.Indyuce.mmoitems.api.ItemAttackMetadata;
import org.bukkit.Sound;
import org.bukkit.entity.EntityType;

View File

@ -7,15 +7,14 @@ import io.lumine.mythic.lib.api.player.MMOPlayerData;
import io.lumine.mythic.lib.api.stat.modifier.ModifierSource;
import io.lumine.mythic.lib.damage.AttackMetadata;
import io.lumine.mythic.lib.skill.trigger.PassiveSkill;
import io.lumine.mythic.lib.skill.trigger.TriggerMetadata;
import net.Indyuce.mmoitems.ItemStats;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.ability.AbilityMetadata;
import net.Indyuce.mmoitems.api.ConfigFile;
import net.Indyuce.mmoitems.api.ItemSet;
import net.Indyuce.mmoitems.api.ItemSet.SetBonuses;
import net.Indyuce.mmoitems.api.Type;
import net.Indyuce.mmoitems.api.crafting.CraftingStatus;
import net.Indyuce.mmoitems.api.event.AbilityUseEvent;
import net.Indyuce.mmoitems.api.event.RefreshInventoryEvent;
import net.Indyuce.mmoitems.api.item.ItemReference;
import net.Indyuce.mmoitems.api.item.mmoitem.VolatileMMOItem;
@ -362,42 +361,7 @@ public class PlayerData {
*/
@Deprecated
public void cast(AttackMetadata attack, LivingEntity target, AbilityData ability) {
/*
* Apply simple conditions including mana and stamina cost, permission
* and cooldown checks
*/
if (!rpgPlayer.canCast(ability))
return;
/*
* Apply extra conditions which depend on the ability the player is
* casting
*/
AbilityMetadata abilityMetadata = ability.getAbility().canBeCast(attack, target, ability);
if (!abilityMetadata.isSuccessful())
return;
AbilityUseEvent event = new AbilityUseEvent(this, ability, target);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled())
return;
/*
* The player can cast the ability, and it was successfully cast on its
* target, removes resources needed from the player
*/
/*
* Finally cast the ability; BUG FIX: cooldown MUST be applied BEFORE
* the ability is cast otherwise instantaneously damaging abilities like
* Sparkle can trigger deadly crash loops
*/
ability.getAbility().whenCast(attack, abilityMetadata);
ability.cast(new TriggerMetadata(attack, target));
}
public boolean isOnCooldown(CooldownType type) {

View File

@ -142,8 +142,8 @@ public abstract class RPGPlayer {
@Deprecated
public boolean canCast(AbilityData data) {
if (playerData.getMMOPlayerData().getCooldownMap().isOnCooldown(data.getAbility())) {
CooldownInfo info = playerData.getMMOPlayerData().getCooldownMap().getInfo(data.getAbility());
if (playerData.getMMOPlayerData().getCooldownMap().isOnCooldown(data)) {
CooldownInfo info = playerData.getMMOPlayerData().getCooldownMap().getInfo(data);
if (!data.getTriggerType().isSilent()) {
StringBuilder progressBar = new StringBuilder(ChatColor.YELLOW + "");
double progress = (double) (info.getInitialCooldown() - info.getRemaining()) / info.getInitialCooldown() * 10;
@ -157,7 +157,7 @@ public abstract class RPGPlayer {
}
if (MMOItems.plugin.getConfig().getBoolean("permissions.abilities")
&& !player.hasPermission("mmoitems.ability." + data.getAbility().getLowerCaseID())
&& !player.hasPermission("mmoitems.ability." + data.getAbility().getHandler().getLowerCaseId())
&& !player.hasPermission("mmoitems.bypass.ability"))
return false;

View File

@ -8,8 +8,8 @@ import io.lumine.mythic.lib.damage.DamageMetadata;
import io.lumine.mythic.lib.skill.trigger.TriggerMetadata;
import io.lumine.mythic.lib.skill.trigger.TriggerType;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.ability.Ability;
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.skill.RegisteredSkill;
import net.Indyuce.mmoitems.stat.data.AbilityData;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@ -21,15 +21,14 @@ public class AbilityCommandTreeNode extends CommandTreeNode {
super(parent, "ability");
addParameter(new Parameter("<ability>",
(explorer, list) -> MMOItems.plugin.getAbilities().getAll().forEach(ability -> list.add(ability.getID()))));
(explorer, list) -> MMOItems.plugin.getSkills().getAll().forEach(ability -> list.add(ability.getHandler().getId()))));
addParameter(Parameter.PLAYER_OPTIONAL);
// three modifiers but more can be used
for (int j = 0; j < 3; j++) {
for (int j = 0; j < 10; j++) {
addParameter(new Parameter("<modifier>", (explorer, list) -> {
try {
Ability ability = MMOItems.plugin.getAbilities().getAbility(explorer.getArguments()[1].toUpperCase().replace("-", "_"));
list.addAll(ability.getModifiers());
RegisteredSkill ability = MMOItems.plugin.getSkills().getSkillOrThrow(explorer.getArguments()[1].toUpperCase().replace("-", "_"));
list.addAll(ability.getHandler().getModifiers());
} catch (Exception ignored) {
}
}));
@ -56,13 +55,13 @@ public class AbilityCommandTreeNode extends CommandTreeNode {
// ability
String key = args[1].toUpperCase().replace("-", "_");
if (!MMOItems.plugin.getAbilities().hasAbility(key)) {
if (!MMOItems.plugin.getSkills().hasSkill(key)) {
sender.sendMessage(MMOItems.plugin.getPrefix() + ChatColor.RED + "Couldn't find ability " + key + ".");
return CommandResult.FAILURE;
}
// modifiers
AbilityData ability = new AbilityData(MMOItems.plugin.getAbilities().getAbility(key), TriggerType.RIGHT_CLICK);
AbilityData ability = new AbilityData(MMOItems.plugin.getSkills().getSkill(key), TriggerType.RIGHT_CLICK);
for (int j = 3; j < args.length - 1; j += 2) {
String name = args[j];
String value = args[j + 1];

View File

@ -1,10 +1,10 @@
package net.Indyuce.mmoitems.command.mmoitems.list;
import net.Indyuce.mmoitems.skill.RegisteredSkill;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.ability.Ability;
import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode;
public class AbilityCommandTreeNode extends CommandTreeNode {
@ -19,10 +19,10 @@ public class AbilityCommandTreeNode extends CommandTreeNode {
sender.sendMessage(ChatColor.WHITE + "Here are all the abilities you can bind to items.");
sender.sendMessage(ChatColor.WHITE + "The values inside brackets are " + ChatColor.UNDERLINE + "modifiers" + ChatColor.WHITE
+ " which allow you to change the ability values (cooldown, damage...)");
for (Ability a : MMOItems.plugin.getAbilities().getAll()) {
String modFormat = ChatColor.GRAY + String.join(ChatColor.WHITE + ", " + ChatColor.GRAY, a.getModifiers());
for (RegisteredSkill ability : MMOItems.plugin.getSkills().getAll()) {
String modFormat = ChatColor.GRAY + String.join(ChatColor.WHITE + ", " + ChatColor.GRAY, ability.getHandler().getModifiers());
modFormat = ChatColor.WHITE + "(" + modFormat + ChatColor.WHITE + ")";
sender.sendMessage("* " + ChatColor.LIGHT_PURPLE + a.getName() + " " + modFormat);
sender.sendMessage("* " + ChatColor.LIGHT_PURPLE + ability.getName() + " " + modFormat);
}
return CommandResult.SUCCESS;
}

View File

@ -9,6 +9,7 @@ import net.Indyuce.mmoitems.comp.mythicmobs.stat.FactionDamage;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import java.util.*;
@ -28,19 +29,15 @@ public class MythicMobsCompatibility implements Listener {
Bukkit.getPluginManager().registerEvents(this, MMOItems.plugin);
}
@EventHandler
/**
* MythicLib skill handlers are reloaded on priority {@link EventPriority#NORMAL}
* MMOCore and MMOItems use HIGH or HIGHEST
*/
@EventHandler(priority = EventPriority.HIGH)
public void a(MythicReloadedEvent event) {
// Update skills
MMOItems.plugin.getAbilities().getAll().stream().filter(ability -> ability instanceof MythicMobsAbility).map(ability -> (MythicMobsAbility) ability).forEach(ability -> {
try {
Optional<io.lumine.xikage.mythicmobs.skills.Skill> opt = MythicMobs.inst().getSkillManager().getSkill(ability.getInternalName());
Validate.isTrue(opt.isPresent(), "Could not find MM skill with name '" + ability.getInternalName() + "'");
ability.setSkill(opt.get());
} catch (IllegalArgumentException exception) {
MMOItems.plugin.getLogger().log(Level.WARNING, "Could not reload custom MM ability '" + ability.getID() + "': " + exception.getMessage());
}
});
MMOItems.plugin.getSkills().reload();
}
private Set<String> getFactions() {

View File

@ -1,5 +1,6 @@
package net.Indyuce.mmoitems.gui.edition;
import io.lumine.mythic.lib.skill.handler.SkillHandler;
import io.lumine.mythic.lib.skill.trigger.TriggerType;
import net.Indyuce.mmoitems.ItemStats;
import net.Indyuce.mmoitems.MMOItems;
@ -12,6 +13,7 @@ import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.item.ItemTag;
import io.lumine.mythic.lib.api.util.AltChar;
import io.lumine.mythic.lib.version.VersionMaterial;
import net.Indyuce.mmoitems.skill.RegisteredSkill;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
@ -30,7 +32,7 @@ import java.util.List;
public class AbilityEdition extends EditionInventory {
private final String configKey;
private Ability<?> ability;
private RegisteredSkill ability;
private static final DecimalFormat modifierFormat = new DecimalFormat("0.###");
private static final int[] slots = { 23, 24, 25, 32, 33, 34, 41, 42, 43 };
@ -48,7 +50,7 @@ public class AbilityEdition extends EditionInventory {
String configString = getEditedSection().getString("ability." + configKey + ".type");
String format = configString == null ? "" : configString.toUpperCase().replace(" ", "_").replace("-", "_").replaceAll("[^A-Z_]", "");
ability = MMOItems.plugin.getAbilities().hasAbility(format) ? MMOItems.plugin.getAbilities().getAbility(format) : null;
ability = MMOItems.plugin.getSkills().hasSkill(format) ? MMOItems.plugin.getSkills().getSkill(format) : null;
ItemStack abilityItem = new ItemStack(Material.BLAZE_POWDER);
ItemMeta abilityItemMeta = abilityItem.getItemMeta();
@ -90,7 +92,7 @@ public class AbilityEdition extends EditionInventory {
if (ability != null) {
ConfigurationSection section = getEditedSection().getConfigurationSection("ability." + configKey);
for (String modifier : ability.getModifiers()) {
for (String modifier : ((SkillHandler<?>) ability.getHandler()).getModifiers()) {
ItemStack modifierItem = VersionMaterial.GRAY_DYE.toItem();
ItemMeta modifierItemMeta = modifierItem.getItemMeta();
modifierItemMeta.setDisplayName(ChatColor.GREEN + MMOUtils.caseOnWords(modifier.toLowerCase().replace("-", " ")));
@ -102,12 +104,12 @@ public class AbilityEdition extends EditionInventory {
try {
modifierItemLore.add(ChatColor.GRAY + "Current Value: " + ChatColor.GOLD
+ (section.contains(modifier) ? new NumericStatFormula(section.get(modifier)).toString()
: modifierFormat.format(ability.getDefaultValue(modifier))));
: modifierFormat.format(ability.getDefaultModifier(modifier))));
} catch (IllegalArgumentException exception) {
modifierItemLore.add(ChatColor.GRAY + "Could not read value. Using default");
}
modifierItemLore.add(ChatColor.GRAY + "Default Value: " + ChatColor.GOLD + modifierFormat.format(ability.getDefaultValue(modifier)));
modifierItemLore.add(ChatColor.GRAY + "Default Value: " + ChatColor.GOLD + modifierFormat.format(ability.getDefaultModifier(modifier)));
modifierItemLore.add("");
modifierItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to change this value.");
modifierItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to reset.");

View File

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.List;
import io.lumine.mythic.lib.skill.trigger.TriggerType;
import net.Indyuce.mmoitems.skill.RegisteredSkill;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
@ -39,9 +40,9 @@ public class AbilityListEdition extends EditionInventory {
if (getEditedSection().contains("ability"))
for (String key : getEditedSection().getConfigurationSection("ability").getKeys(false)) {
String abilityFormat = getEditedSection().getString("ability." + key + ".type");
Ability ability = abilityFormat != null
&& MMOItems.plugin.getAbilities().hasAbility(abilityFormat = abilityFormat.toUpperCase().replace(" ", "_").replace("-", "_"))
? MMOItems.plugin.getAbilities().getAbility(abilityFormat)
RegisteredSkill ability = abilityFormat != null
&& MMOItems.plugin.getSkills().hasSkill(abilityFormat = abilityFormat.toUpperCase().replace(" ", "_").replace("-", "_"))
? MMOItems.plugin.getSkills().getSkill(abilityFormat)
: null;
TriggerType castMode = TriggerType.safeValueOf(getEditedSection().getString("ability." + key + ".mode"));
@ -58,7 +59,7 @@ public class AbilityListEdition extends EditionInventory {
boolean check = false;
if (ability != null)
for (String modifier : getEditedSection().getConfigurationSection("ability." + key).getKeys(false))
if (!modifier.equals("type") && !modifier.equals("mode") && ability.getModifiers().contains(modifier))
if (!modifier.equals("type") && !modifier.equals("mode") && ability.getHandler().getModifiers().contains(modifier))
try {
abilityItemLore.add(
ChatColor.GRAY + "* " + MMOUtils.caseOnWords(modifier.toLowerCase().replace("-", " ")) + ": " + ChatColor.GOLD

View File

@ -1,17 +1,25 @@
package net.Indyuce.mmoitems.listener;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.event.skill.PlayerCastSkillEvent;
import io.lumine.mythic.lib.api.item.NBTItem;
import io.lumine.mythic.lib.api.player.EquipmentSlot;
import io.lumine.mythic.lib.skill.trigger.TriggerType;
import io.lumine.mythic.utils.Schedulers;
import io.lumine.mythic.utils.events.extra.ArmorEquipEvent;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.MMOUtils;
import net.Indyuce.mmoitems.api.SoulboundInfo;
import net.Indyuce.mmoitems.api.Type;
import net.Indyuce.mmoitems.api.event.AbilityUseEvent;
import net.Indyuce.mmoitems.api.interaction.util.InteractItem;
import net.Indyuce.mmoitems.api.interaction.weapon.Weapon;
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.skill.RegisteredSkill;
import net.Indyuce.mmoitems.stat.data.AbilityData;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Trident;
import org.bukkit.event.EventHandler;
@ -168,4 +176,34 @@ public class PlayerListener implements Listener {
public void registerInventoryUpdates2(PlayerItemHeldEvent event) {
PlayerData.get(event.getPlayer()).getInventory().scheduleUpdate();
}
@Deprecated
@EventHandler
public void registerOldEvent(PlayerCastSkillEvent event) {
// Find caster
PlayerData playerData = PlayerData.get(event.getPlayer().getUniqueId());
// Create registered skill
RegisteredSkill registeredSkill = new RegisteredSkill(event.getCast().getHandler(), event.getCast().getHandler().getId());
for (Object obj : event.getCast().getHandler().getModifiers()) {
String mod = obj.toString();
registeredSkill.setDefaultValue(mod, event.getMetadata().getModifier(mod));
registeredSkill.setName(mod, MMOUtils.caseOnWords(mod.toLowerCase().replace("-", " ").replace("_", " ")));
}
// Create ability data
AbilityData abilityData = new AbilityData(registeredSkill, TriggerType.API);
for (Object obj : event.getCast().getHandler().getModifiers()) {
String mod = obj.toString();
abilityData.setModifier(mod, event.getMetadata().getModifier(mod));
}
// Find ability target
LivingEntity target = event.getMetadata().hasTargetEntity() && event.getMetadata().getTargetEntityOrNull() instanceof LivingEntity ?
(LivingEntity) event.getMetadata().getTargetEntityOrNull() : null;
// Call event for compatibility
Bukkit.getPluginManager().callEvent(new AbilityUseEvent(playerData, abilityData, target));
}
}

View File

@ -1,110 +1,56 @@
package net.Indyuce.mmoitems.manager;
import io.lumine.mythic.lib.MythicLib;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.ability.Ability;
import net.Indyuce.mmoitems.comp.mythicmobs.skill.MythicMobsAbility;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.Listener;
import net.Indyuce.mmoitems.ability.BackwardsCompatibleAbility;
import net.Indyuce.mmoitems.skill.RegisteredSkill;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.logging.Level;
import java.util.Collection;
import java.util.stream.Collectors;
@SuppressWarnings("unused")
@Deprecated
public class AbilityManager {
private final Map<String, Ability> abilities = new HashMap<>();
public Ability getAbility(String id) {
return new BackwardsCompatibleAbility(MMOItems.plugin.getSkills().getSkillOrThrow(id));
}
private boolean registration = true;
public boolean hasAbility(String id) {
return MMOItems.plugin.getSkills().hasSkill(id);
}
public Ability getAbility(String id) {
return abilities.get(id);
}
/**
* @return Collection of all active abilities
*/
public Collection<Ability> getAll() {
return MMOItems.plugin.getSkills().getAll().stream().map(skill -> new BackwardsCompatibleAbility(skill)).collect(Collectors.toSet());
}
public boolean hasAbility(String id) {
return abilities.containsKey(id);
}
/**
* Add multiple abilities at the same time
* but for multiple abilities.
*
* @param abilities - Refer to {@link #registerAbility(Ability ability)}
*/
public void registerAbilities(Ability... abilities) {
for (Ability ability : abilities)
registerAbility(ability);
}
/**
* @return Collection of all active abilities
*/
public Collection<Ability> getAll() {
return abilities.values();
}
/**
* Add multiple abilities at the same time
* but for multiple abilities.
*
* @param abilities - Refer to {@link #registerAbility(Ability ability)}
*/
public void registerAbilities(Ability... abilities) {
for (Ability ability : abilities)
registerAbility(ability);
}
/**
* Registers an ability in MMOItems. This must be called before MMOItems enables,
* therefore either using a loadbefore of MMOItems and while the plugin enables,
* or using a dependency and usign #onLoad().
* <p>
* This method does NOT register listeners.
* <p>
* Throws an IAE if anything goes wrong.
*
* @param ability Ability to register
*/
public void registerAbility(Ability ability) {
Validate.isTrue(registration, "Ability registration is disabled");
Validate.isTrue(!hasAbility(ability.getID()), "An ability is already registered with the same ID");
// Add to all ability list
abilities.put(ability.getID(), ability);
}
public void loadPluginAbilities() {
// Load MMOItems default abilities
try {
JarFile file = new JarFile(MMOItems.plugin.getJarFile());
for (Enumeration<JarEntry> enu = file.entries(); enu.hasMoreElements(); ) {
String name = enu.nextElement().getName().replace("/", ".");
if (!name.contains("$") && name.endsWith(".class") && name.startsWith("net.Indyuce.mmoitems.ability.list.")) {
Ability ability = (Ability) Class.forName(name.substring(0, name.length() - 6)).newInstance();
registerAbility(ability);
if (ability instanceof Listener)
Bukkit.getPluginManager().registerEvents((Listener) ability, MMOItems.plugin);
}
}
file.close();
} catch (IOException | InstantiationException | IllegalAccessException | ClassNotFoundException exception) {
exception.printStackTrace();
}
File mythicMobs = new File(MMOItems.plugin.getDataFolder() + "/dynamic/mythic-mobs-abilities");
if (!mythicMobs.exists() && !mythicMobs.mkdirs())
MMOItems.plugin.getLogger().warning("Failed DIR generation!");
// Load MythicMobs addon skills
if (Bukkit.getPluginManager().getPlugin("MythicMobs") != null)
loadMythicMobsAbilities(mythicMobs);
// Finally disable ability registration
registration = false;
}
private void loadMythicMobsAbilities(File file) {
if (file.isDirectory())
Arrays.asList(file.listFiles()).forEach(subfile -> loadMythicMobsAbilities(subfile));
else
try {
registerAbility(new MythicMobsAbility(file.getName().substring(0, file.getName().length() - 4), YamlConfiguration.loadConfiguration(file)));
} catch (IllegalArgumentException exception) {
MMOItems.plugin.getLogger().log(Level.WARNING, "Could not load ability from '" + file.getName() + "': " + exception.getMessage());
}
}
/**
* Registers an ability in MMOItems. This must be called before MMOItems enables,
* therefore either using a loadbefore of MMOItems and while the plugin enables,
* or using a dependency and usign #onLoad().
* <p>
* This method does NOT register listeners.
* <p>
* Throws an IAE if anything goes wrong.
*
* @param ability Ability to register
*/
public void registerAbility(Ability ability) {
MythicLib.plugin.getSkills().registerSkillHandler(ability);
MMOItems.plugin.getSkills().registerSkill(new RegisteredSkill(ability));
}
}

View File

@ -2,6 +2,7 @@ package net.Indyuce.mmoitems.manager;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.util.AltChar;
import io.lumine.mythic.lib.skill.handler.SkillHandler;
import io.lumine.mythic.lib.skill.trigger.TriggerType;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.MMOUtils;
@ -13,6 +14,7 @@ import net.Indyuce.mmoitems.api.item.util.ConfigItem;
import net.Indyuce.mmoitems.api.item.util.ConfigItems;
import net.Indyuce.mmoitems.api.util.NumericStatFormula;
import net.Indyuce.mmoitems.api.util.message.Message;
import net.Indyuce.mmoitems.skill.RegisteredSkill;
import net.Indyuce.mmoitems.stat.GemUpgradeScaling;
import net.Indyuce.mmoitems.stat.LuteAttackEffectStat.LuteAttackEffect;
import net.Indyuce.mmoitems.stat.StaffSpiritStat.StaffSpirit;
@ -50,7 +52,6 @@ public class ConfigManager implements Reloadable {
private static final String[] fileNames = {"abilities", "messages", "potion-effects", "stats", "items", "attack-effects"};
private static final String[] languages = {"french", "chinese", "spanish", "russian", "polish"};
// try to setup non existing languages
public ConfigManager() {
mkdir("layouts");
@ -78,6 +79,7 @@ public class ConfigManager implements Reloadable {
} else MMOItems.plugin.getLogger().log(Level.WARNING, "Could not create directory!");
}
// Setup non existing language files
for (String language : languages) {
File languageFolder = new File(MMOItems.plugin.getDataFolder() + "/language/" + language);
if (!languageFolder.exists())
@ -127,12 +129,12 @@ public class ConfigManager implements Reloadable {
messages.save();
ConfigFile abilities = new ConfigFile("/language", "abilities");
for (Ability<?> ability : MMOItems.plugin.getAbilities().getAll()) {
String path = ability.getLowerCaseID();
for (RegisteredSkill ability : MMOItems.plugin.getSkills().getAll()) {
String path = ability.getHandler().getLowerCaseId();
if (!abilities.getConfig().getKeys(true).contains("ability." + path))
abilities.getConfig().set("ability." + path, ability.getName());
for (String modifier : ability.getModifiers())
for (String modifier : ((SkillHandler<?>) ability.getHandler()).getModifiers())
if (!abilities.getConfig().getKeys(true).contains("modifier." + modifier))
abilities.getConfig().set("modifier." + modifier, MMOUtils.caseOnWords(modifier.replace("-", " ")));
}
@ -248,6 +250,7 @@ public class ConfigManager implements Reloadable {
return MythicLib.plugin.parseColors(found == null ? "<MessageNotFound:" + path + ">" : found);
}
@Deprecated
public String getAbilityName(Ability ability) {
String configName = abilities.getConfig().getString("ability." + ability.getLowerCaseID());
return configName != null ? configName : ability.getName();
@ -257,6 +260,7 @@ public class ConfigManager implements Reloadable {
return abilities.getConfig().getString("cast-mode." + mode.getLowerCaseId());
}
@Deprecated
public String getModifierName(String path) {
return abilities.getConfig().getString("modifier." + path);
}

View File

@ -0,0 +1,85 @@
package net.Indyuce.mmoitems.manager;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.skill.handler.SkillHandler;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.MMOUtils;
import net.Indyuce.mmoitems.api.ConfigFile;
import net.Indyuce.mmoitems.skill.RegisteredSkill;
import org.apache.commons.lang.Validate;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.logging.Level;
@SuppressWarnings("unused")
public class SkillManager {
private final Map<String, RegisteredSkill> skills = new HashMap<>();
public RegisteredSkill getSkill(String id) {
return skills.get(id);
}
public RegisteredSkill getSkillOrThrow(String id) {
return Objects.requireNonNull(skills.get(id), "Could not find skill with ID '" + id + "'");
}
public void registerSkill(RegisteredSkill skill) {
Validate.notNull(skill);
this.skills.put(skill.getHandler().getId(), skill);
}
public boolean hasSkill(String id) {
return skills.containsKey(id);
}
/**
* @return Collection of all registered skills. It has the same number
* of elements as MythicLib's skill handler registry.
*/
public Collection<RegisteredSkill> getAll() {
return skills.values();
}
public void reload() {
// Check for default files
File skillFolder = new File(MMOItems.plugin.getDataFolder() + "/skill");
if (!skillFolder.exists())
try {
skillFolder.mkdir();
for (SkillHandler handler : MythicLib.plugin.getSkills().getHandlers()) {
InputStream res = MMOItems.plugin.getResource("default/skill/" + handler.getLowerCaseId() + ".yml");
if (res != null)
Files.copy(res, new File(MMOItems.plugin.getDataFolder() + "/skill/" + handler.getLowerCaseId() + ".yml").getAbsoluteFile().toPath());
}
} catch (IOException exception) {
MMOItems.plugin.getLogger().log(Level.WARNING, "Could not save default ability configs: " + exception.getMessage());
}
for (SkillHandler handler : MythicLib.plugin.getSkills().getHandlers()) {
// Check if config file exists
ConfigFile config = new ConfigFile("/skill", handler.getLowerCaseId());
if (!config.exists()) {
config.getConfig().set("name", MMOUtils.caseOnWords(handler.getId().replace("_", " ").replace("-", " ").toLowerCase()));
for (Object mod : handler.getModifiers()) {
config.getConfig().set("modifier." + mod + ".name", MMOUtils.caseOnWords(mod.toString().replace("-", " ").toLowerCase()));
config.getConfig().set("modifier." + mod + ".default-value", 0);
}
config.save();
}
RegisteredSkill skill = new RegisteredSkill(handler, config.getConfig());
this.skills.put(handler.getId(), skill);
}
}
}

View File

@ -0,0 +1,74 @@
package net.Indyuce.mmoitems.skill;
import io.lumine.mythic.lib.skill.handler.SkillHandler;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.MMOUtils;
import net.Indyuce.mmoitems.ability.Ability;
import org.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class RegisteredSkill {
private final SkillHandler<?> handler;
private final String name;
private final Map<String, String> modifierNames = new HashMap<>();
private final Map<String, Double> modifierDefaultValues = new HashMap<>();
public RegisteredSkill(SkillHandler<?> handler, ConfigurationSection config) {
this.handler = handler;
this.name = Objects.requireNonNull(config.getString("name"), "Could not fill skill name");
for (Object obj : handler.getModifiers()) {
String mod = obj.toString();
modifierNames.put(mod, Objects.requireNonNull(config.getString("modifier." + mod + ".name"), "Could not find translation for modifier '" + mod + "'"));
modifierDefaultValues.put(mod, config.getDouble("modifier." + mod + ".default-value"));
}
}
@Deprecated
public RegisteredSkill(Ability ability) {
this.handler = ability;
this.name = MMOItems.plugin.getLanguage().getAbilityName(ability);
for (String mod : handler.getModifiers()) {
modifierDefaultValues.put(mod, ability.getDefaultValue(mod));
modifierNames.put(mod, MMOUtils.caseOnWords(mod.toLowerCase().replace("_", " ").replace("-", " ")));
}
}
@Deprecated
public RegisteredSkill(SkillHandler handler, String name) {
this.handler = handler;
this.name = name;
}
public SkillHandler getHandler() {
return handler;
}
public String getName() {
return name;
}
@Deprecated
public void setDefaultValue(String modifier, double value) {
modifierDefaultValues.put(modifier, value);
}
@Deprecated
public void setName(String modifier, String name) {
modifierNames.put(modifier, name);
}
@Nullable
public String getModifierName(String modifier) {
return modifierNames.get(modifier);
}
public double getDefaultModifier(String modifier) {
return modifierDefaultValues.get(modifier);
}
}

View File

@ -1,14 +1,14 @@
package net.Indyuce.mmoitems.ability.list.vector;
package net.Indyuce.mmoitems.skill;
import io.lumine.mythic.lib.api.item.NBTItem;
import io.lumine.mythic.lib.comp.target.InteractionType;
import io.lumine.mythic.lib.damage.DamageMetadata;
import io.lumine.mythic.lib.damage.DamageType;
import io.lumine.mythic.lib.skill.SkillMetadata;
import io.lumine.mythic.lib.skill.handler.SkillHandler;
import io.lumine.mythic.lib.skill.result.def.VectorSkillResult;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.MMOUtils;
import net.Indyuce.mmoitems.ability.VectorAbility;
import net.Indyuce.mmoitems.ability.metadata.VectorAbilityMetadata;
import io.lumine.mythic.lib.damage.AttackMetadata;
import net.Indyuce.mmoitems.api.ItemAttackMetadata;
import net.Indyuce.mmoitems.api.interaction.projectile.EntityData;
import org.bukkit.Color;
@ -17,6 +17,7 @@ import org.bukkit.Particle;
import org.bukkit.Sound;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.ShulkerBullet;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@ -28,21 +29,23 @@ import org.bukkit.util.Vector;
import javax.annotation.Nullable;
public class Shulker_Missile extends VectorAbility implements Listener {
public class Shulker_Missile extends SkillHandler<VectorSkillResult> implements Listener {
public Shulker_Missile() {
super();
addModifier("cooldown", 12);
addModifier("damage", 5);
addModifier("effect-duration", 5);
addModifier("duration", 5);
addModifier("mana", 0);
addModifier("stamina", 0);
registerModifiers("damage", "effect-duration", "duration");
}
@Override
public void whenCast(AttackMetadata attack, VectorAbilityMetadata ability) {
double duration = ability.getModifier("duration");
public VectorSkillResult getResult(SkillMetadata meta) {
return new VectorSkillResult(meta);
}
@Override
public void whenCast(VectorSkillResult result, SkillMetadata skillMeta) {
double duration = skillMeta.getModifier("duration");
Player caster = skillMeta.getCaster().getPlayer();
new BukkitRunnable() {
double n = 0;
@ -53,14 +56,14 @@ public class Shulker_Missile extends VectorAbility implements Listener {
return;
}
Vector vec = ability.getTarget();
attack.getPlayer().getWorld().playSound(attack.getPlayer().getLocation(), Sound.ENTITY_WITHER_SHOOT, 2, 2);
ShulkerBullet shulkerBullet = (ShulkerBullet) attack.getPlayer().getWorld().spawnEntity(attack.getPlayer().getLocation().add(0, 1, 0),
Vector vec = result.getTarget();
caster.getWorld().playSound(caster.getLocation(), Sound.ENTITY_WITHER_SHOOT, 2, 2);
ShulkerBullet shulkerBullet = (ShulkerBullet) caster.getWorld().spawnEntity(caster.getLocation().add(0, 1, 0),
EntityType.SHULKER_BULLET);
shulkerBullet.setShooter(attack.getPlayer());
shulkerBullet.setShooter(caster);
ItemAttackMetadata attackMeta = new ItemAttackMetadata(new DamageMetadata(ability.getModifier("damage"), DamageType.SKILL, DamageType.MAGIC, DamageType.PROJECTILE), attack.getStats());
MMOItems.plugin.getEntities().registerCustomEntity(shulkerBullet, new ShulkerMissileEntityData(attackMeta, ability.getModifier("effect-duration")));
ItemAttackMetadata attackMeta = new ItemAttackMetadata(new DamageMetadata(skillMeta.getModifier("damage"), DamageType.SKILL, DamageType.MAGIC, DamageType.PROJECTILE), skillMeta.getStats());
MMOItems.plugin.getEntities().registerCustomEntity(shulkerBullet, new ShulkerMissileEntityData(attackMeta, skillMeta.getModifier("effect-duration")));
new BukkitRunnable() {
double ti = 0;

View File

@ -8,6 +8,7 @@ import java.util.Optional;
import com.google.gson.*;
import io.lumine.mythic.lib.api.item.SupportedNBTTagValues;
import io.lumine.mythic.lib.skill.trigger.TriggerType;
import net.Indyuce.mmoitems.skill.RegisteredSkill;
import org.apache.commons.lang.Validate;
import org.bukkit.ChatColor;
import org.bukkit.Material;
@ -16,7 +17,6 @@ import org.bukkit.event.inventory.InventoryClickEvent;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.MMOUtils;
import net.Indyuce.mmoitems.ability.Ability;
import net.Indyuce.mmoitems.api.item.build.ItemStackBuilder;
import net.Indyuce.mmoitems.api.item.mmoitem.ReadMMOItem;
import net.Indyuce.mmoitems.api.util.NumericStatFormula;
@ -65,13 +65,12 @@ public class Abilities extends ItemStat {
String modifierFormat = ItemStat.translate("ability-modifier"), abilityFormat = ItemStat.translate("ability-format");
((AbilityListData) data).getAbilities().forEach(ability -> {
abilityLore.add(abilityFormat.replace("#c", MMOItems.plugin.getLanguage().getCastingModeName(ability.getTriggerType())).replace("#a",
MMOItems.plugin.getLanguage().getAbilityName(ability.getAbility())));
abilityLore.add(abilityFormat.replace("#c", MMOItems.plugin.getLanguage().getCastingModeName(ability.getTriggerType())).replace("#a", ability.getAbility().getName()));
for (String modifier : ability.getModifiers()) {
item.getLore().registerPlaceholder("ability_" + ability.getAbility().getID().toLowerCase() + "_" + modifier,
item.getLore().registerPlaceholder("ability_" + ability.getAbility().getHandler().getId().toLowerCase() + "_" + modifier,
this.modifierFormat.format(ability.getModifier(modifier)));
abilityLore.add(modifierFormat.replace("#m", MMOItems.plugin.getLanguage().getModifierName(modifier)).replace("#v",
abilityLore.add(modifierFormat.replace("#m", ability.getAbility().getModifierName(modifier)).replace("#v",
this.modifierFormat.format(ability.getModifier(modifier))));
}
@ -116,9 +115,9 @@ public class Abilities extends ItemStat {
String format = message.toUpperCase().replace("-", "_").replace(" ", "_").replaceAll("[^A-Z_]", "");
if (edited.equals("ability")) {
Validate.isTrue(MMOItems.plugin.getAbilities().hasAbility(format),
Validate.isTrue(MMOItems.plugin.getSkills().hasSkill(format),
"format is not a valid ability! You may check the ability list using /mi list ability.");
Ability ability = MMOItems.plugin.getAbilities().getAbility(format);
RegisteredSkill ability = MMOItems.plugin.getSkills().getSkill(format);
inv.getEditedSection().set("ability." + configKey, null);
inv.getEditedSection().set("ability." + configKey + ".type", format);

View File

@ -1,26 +1,23 @@
package net.Indyuce.mmoitems.stat.data;
import com.google.gson.JsonObject;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.player.cooldown.CooldownInfo;
import io.lumine.mythic.lib.skill.Skill;
import io.lumine.mythic.lib.skill.SkillMetadata;
import io.lumine.mythic.lib.skill.handler.SkillHandler;
import io.lumine.mythic.lib.skill.trigger.TriggerMetadata;
import io.lumine.mythic.lib.skill.trigger.TriggerType;
import net.Indyuce.mmoitems.ItemStats;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.MMOUtils;
import net.Indyuce.mmoitems.ability.Ability;
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.api.player.RPGPlayer;
import net.Indyuce.mmoitems.api.util.message.Message;
import net.Indyuce.mmoitems.skill.RegisteredSkill;
import org.apache.commons.lang.Validate;
import org.bukkit.ChatColor;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.text.DecimalFormat;
import java.util.HashMap;
@ -29,12 +26,12 @@ import java.util.Objects;
import java.util.Set;
public class AbilityData extends Skill {
private final Ability ability;
private final RegisteredSkill ability;
private final TriggerType triggerType;
private final Map<String, Double> modifiers = new HashMap<>();
public AbilityData(JsonObject object) {
ability = MMOItems.plugin.getAbilities().getAbility(object.get("Id").getAsString());
ability = MMOItems.plugin.getSkills().getSkill(object.get("Id").getAsString());
triggerType = MMOUtils.backwardsCompatibleTriggerType(object.get("CastMode").getAsString());
JsonObject modifiers = object.getAsJsonObject("Modifiers");
@ -45,23 +42,23 @@ public class AbilityData extends Skill {
Validate.isTrue(config.contains("type") && config.contains("mode"), "Ability is missing type or mode");
String abilityFormat = config.getString("type").toUpperCase().replace("-", "_").replace(" ", "_");
Validate.isTrue(MMOItems.plugin.getAbilities().hasAbility(abilityFormat), "Could not find ability called '" + abilityFormat + "'");
ability = MMOItems.plugin.getAbilities().getAbility(abilityFormat);
Validate.isTrue(MMOItems.plugin.getSkills().hasSkill(abilityFormat), "Could not find ability called '" + abilityFormat + "'");
ability = MMOItems.plugin.getSkills().getSkill(abilityFormat);
String modeFormat = config.getString("mode").toUpperCase().replace("-", "_").replace(" ", "_");
triggerType = MMOUtils.backwardsCompatibleTriggerType(modeFormat);
for (String key : config.getKeys(false))
if (!key.equalsIgnoreCase("mode") && !key.equalsIgnoreCase("type") && ability.getModifiers().contains(key))
if (!key.equalsIgnoreCase("mode") && !key.equalsIgnoreCase("type") && ability.getHandler().getModifiers().contains(key))
modifiers.put(key, config.getDouble(key));
}
public AbilityData(Ability ability, TriggerType triggerType) {
public AbilityData(RegisteredSkill ability, TriggerType triggerType) {
this.ability = ability;
this.triggerType = triggerType;
}
public Ability getAbility() {
public RegisteredSkill getAbility() {
return ability;
}
@ -107,7 +104,7 @@ public class AbilityData extends Skill {
// Check for permission
if (MMOItems.plugin.getConfig().getBoolean("permissions.abilities")
&& !player.hasPermission("mmoitems.ability." + getHandler().getId().toLowerCase().replace("_", "-"))
&& !player.hasPermission("mmoitems.ability." + getHandler().getLowerCaseId())
&& !player.hasPermission("mmoitems.bypass.ability"))
return false;
@ -147,18 +144,17 @@ public class AbilityData extends Skill {
@Override
public SkillHandler getHandler() {
// TODO
return null;
return ability.getHandler();
}
@Override
public double getModifier(String path) {
return modifiers.getOrDefault(path, ability.getDefaultValue(path));
return modifiers.getOrDefault(path, ability.getDefaultModifier(path));
}
public JsonObject toJson() {
JsonObject object = new JsonObject();
object.addProperty("Id", ability.getID());
object.addProperty("Id", ability.getHandler().getId());
object.addProperty("CastMode", triggerType.name());
JsonObject modifiers = new JsonObject();

View File

@ -6,17 +6,17 @@ import java.util.Set;
import io.lumine.mythic.lib.skill.trigger.TriggerType;
import net.Indyuce.mmoitems.MMOUtils;
import net.Indyuce.mmoitems.skill.RegisteredSkill;
import org.apache.commons.lang.Validate;
import org.bukkit.configuration.ConfigurationSection;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.ability.Ability;
import net.Indyuce.mmoitems.api.item.build.MMOItemBuilder;
import net.Indyuce.mmoitems.api.util.NumericStatFormula;
import net.Indyuce.mmoitems.stat.data.AbilityData;
public class RandomAbilityData {
private final Ability ability;
private final RegisteredSkill ability;
private final TriggerType triggerType;
private final Map<String, NumericStatFormula> modifiers = new HashMap<>();
@ -24,23 +24,23 @@ public class RandomAbilityData {
Validate.isTrue(config.contains("type") && config.contains("mode"), "Ability is missing type or mode");
String abilityFormat = config.getString("type").toUpperCase().replace("-", "_").replace(" ", "_");
Validate.isTrue(MMOItems.plugin.getAbilities().hasAbility(abilityFormat), "Could not find ability called '" + abilityFormat + "'");
ability = MMOItems.plugin.getAbilities().getAbility(abilityFormat);
Validate.isTrue(MMOItems.plugin.getSkills().hasSkill(abilityFormat), "Could not find ability called '" + abilityFormat + "'");
ability = MMOItems.plugin.getSkills().getSkill(abilityFormat);
String modeFormat = config.getString("mode").toUpperCase().replace("-", "_").replace(" ", "_");
triggerType = MMOUtils.backwardsCompatibleTriggerType(modeFormat);
for (String key : config.getKeys(false))
if (!key.equalsIgnoreCase("mode") && !key.equalsIgnoreCase("type") && ability.getModifiers().contains(key))
if (!key.equalsIgnoreCase("mode") && !key.equalsIgnoreCase("type") && ability.getHandler().getModifiers().contains(key))
modifiers.put(key, new NumericStatFormula(config.get(key)));
}
public RandomAbilityData(Ability ability, TriggerType triggerType) {
public RandomAbilityData(RegisteredSkill ability, TriggerType triggerType) {
this.ability = ability;
this.triggerType = triggerType;
}
public Ability getAbility() {
public RegisteredSkill getAbility() {
return ability;
}

View File

@ -0,0 +1,20 @@
name: Arcane Hail
modifier:
duration:
name: Duration
default-value: 4.0
damage:
name: Damage
default-value: 3.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
radius:
name: Radius
default-value: 3.0

View File

@ -0,0 +1,23 @@
name: Arcane Rift
modifier:
duration:
name: Duration
default-value: 1.5
damage:
name: Damage
default-value: 5.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
amplifier:
name: Amplifier
default-value: 2.0
speed:
name: Speed
default-value: 1.0

View File

@ -0,0 +1,17 @@
name: Black Hole
modifier:
duration:
name: Duration
default-value: 2.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 35.0
radius:
name: Radius
default-value: 2.0

View File

@ -0,0 +1,14 @@
name: Blind
modifier:
duration:
name: Duration
default-value: 5.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 9.0

View File

@ -0,0 +1,14 @@
name: Blink
modifier:
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
range:
name: Range
default-value: 8.0

View File

@ -0,0 +1,23 @@
name: Blizzard
modifier:
duration:
name: Duration
default-value: 2.5
damage:
name: Damage
default-value: 2.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
inaccuracy:
name: Inaccuracy
default-value: 10.0
force:
name: Force
default-value: 1.0

View File

@ -0,0 +1,14 @@
name: Bloodbath
modifier:
amount:
name: Amount
default-value: 2.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 8.0

View File

@ -0,0 +1,23 @@
name: Bouncy Fireball
modifier:
damage:
name: Damage
default-value: 5.0
ignite:
name: Ignite
default-value: 40.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 20.0
radius:
name: Radius
default-value: 4.0
speed:
name: Speed
default-value: 1.0

View File

@ -0,0 +1,20 @@
name: Bunny Mode
modifier:
duration:
name: Duration
default-value: 20.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 50.0
jump-force:
name: Jump Force
default-value: 1.0
speed:
name: Speed
default-value: 1.0

View File

@ -0,0 +1,14 @@
name: Burn
modifier:
duration:
name: Duration
default-value: 3.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 8.0

View File

@ -0,0 +1,17 @@
name: Burning Hands
modifier:
duration:
name: Duration
default-value: 3.0
damage:
name: Damage
default-value: 2.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0

View File

@ -0,0 +1,23 @@
name: Chicken Wraith
modifier:
duration:
name: Duration
default-value: 2.5
damage:
name: Damage
default-value: 2.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
inaccuracy:
name: Inaccuracy
default-value: 10.0
force:
name: Force
default-value: 1.0

View File

@ -0,0 +1,20 @@
name: Circular Slash
modifier:
damage:
name: Damage
default-value: 6.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
knockback:
name: Knockback
default-value: 1.0
radius:
name: Radius
default-value: 3.0

View File

@ -0,0 +1,11 @@
name: Confuse
modifier:
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 7.0

View File

@ -0,0 +1,17 @@
name: Contamination
modifier:
duration:
name: Duration
default-value: 8.0
damage:
name: Damage
default-value: 2.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0

View File

@ -0,0 +1,20 @@
name: Corrosion
modifier:
duration:
name: Duration
default-value: 4.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
amplifier:
name: Amplifier
default-value: 1.0
radius:
name: Radius
default-value: 5.0

View File

@ -0,0 +1,20 @@
name: Corrupt
modifier:
duration:
name: Duration
default-value: 4.0
damage:
name: Damage
default-value: 8.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
amplifier:
name: Amplifier
default-value: 1.0

View File

@ -0,0 +1,17 @@
name: Corrupted Fangs
modifier:
damage:
name: Damage
default-value: 5.0
mana:
name: Mana
default-value: 0.0
fangs:
name: Fangs
default-value: 6.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 12.0

View File

@ -0,0 +1,17 @@
name: Cursed Beam
modifier:
duration:
name: Duration
default-value: 5.0
damage:
name: Damage
default-value: 8.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0

View File

@ -0,0 +1,20 @@
name: Death Mark
modifier:
duration:
name: Duration
default-value: 3.0
damage:
name: Damage
default-value: 5.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 7.0
amplifier:
name: Amplifier
default-value: 1.0

View File

@ -0,0 +1,20 @@
name: Earthquake
modifier:
duration:
name: Duration
default-value: 2.0
damage:
name: Damage
default-value: 3.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
amplifier:
name: Amplifier
default-value: 1.0

View File

@ -0,0 +1,23 @@
name: Explosive Turkey
modifier:
duration:
name: Duration
default-value: 4.0
damage:
name: Damage
default-value: 6.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
knockback:
name: Knockback
default-value: 1.0
radius:
name: Radius
default-value: 4.0

View File

@ -0,0 +1,20 @@
name: Fire Meteor
modifier:
damage:
name: Damage
default-value: 6.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
knockback:
name: Knockback
default-value: 1.0
radius:
name: Radius
default-value: 4.0

View File

@ -0,0 +1,17 @@
name: Firebolt
modifier:
damage:
name: Damage
default-value: 6.0
ignite:
name: Ignite
default-value: 3.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0

View File

@ -0,0 +1,20 @@
name: Firefly
modifier:
duration:
name: Duration
default-value: 2.5
damage:
name: Damage
default-value: 6.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
knockback:
name: Knockback
default-value: 1.0

View File

@ -0,0 +1,20 @@
name: Freeze
modifier:
duration:
name: Duration
default-value: 4.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
amplifier:
name: Amplifier
default-value: 2.0
radius:
name: Radius
default-value: 5.0

View File

@ -0,0 +1,23 @@
name: Freezing Curse
modifier:
duration:
name: Duration
default-value: 3.0
damage:
name: Damage
default-value: 3.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 7.0
amplifier:
name: Amplifier
default-value: 1.0
radius:
name: Radius
default-value: 3.0

View File

@ -0,0 +1,20 @@
name: Frog Mode
modifier:
duration:
name: Duration
default-value: 20.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 50.0
jump-force:
name: Jump Force
default-value: 1.0
speed:
name: Speed
default-value: 1.0

View File

@ -0,0 +1,20 @@
name: Frozen Aura
modifier:
duration:
name: Duration
default-value: 6.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
amplifier:
name: Amplifier
default-value: 1.0
radius:
name: Radius
default-value: 10.0

View File

@ -0,0 +1,17 @@
name: Grand Heal
modifier:
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
heal:
name: Heal
default-value: 5.0
cooldown:
name: Cooldown
default-value: 15.0
radius:
name: Radius
default-value: 5.0

View File

@ -0,0 +1,14 @@
name: Heal
modifier:
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
heal:
name: Heal
default-value: 4.0
cooldown:
name: Cooldown
default-value: 10.0

View File

@ -0,0 +1,17 @@
name: Heavy Charge
modifier:
damage:
name: Damage
default-value: 6.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
knockback:
name: Knockback
default-value: 1.0

View File

@ -0,0 +1,11 @@
name: Hoearthquake
modifier:
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0

View File

@ -0,0 +1,17 @@
name: Holy Missile
modifier:
duration:
name: Duration
default-value: 4.0
damage:
name: Damage
default-value: 6.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0

View File

@ -0,0 +1,20 @@
name: Ice Crystal
modifier:
duration:
name: Duration
default-value: 3.0
damage:
name: Damage
default-value: 6.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
amplifier:
name: Amplifier
default-value: 1.0

View File

@ -0,0 +1,20 @@
name: Ignite
modifier:
duration:
name: Duration
default-value: 80.0
mana:
name: Mana
default-value: 0.0
max-ignite:
name: Max Ignite
default-value: 200.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
radius:
name: Radius
default-value: 5.0

View File

@ -0,0 +1,23 @@
name: Item Bomb
modifier:
damage:
name: Damage
default-value: 7.0
mana:
name: Mana
default-value: 0.0
slow-duration:
name: Slow Duration
default-value: 4.0
slow-amplifier:
name: Slow Amplifier
default-value: 1.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 15.0
radius:
name: Radius
default-value: 6.0

View File

@ -0,0 +1,17 @@
name: Item Throw
modifier:
damage:
name: Damage
default-value: 6.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
force:
name: Force
default-value: 1.0

View File

@ -0,0 +1,14 @@
name: Leap
modifier:
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
force:
name: Force
default-value: 1.0

View File

@ -0,0 +1,20 @@
name: Life Ender
modifier:
damage:
name: Damage
default-value: 5.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
knockback:
name: Knockback
default-value: 1.0
radius:
name: Radius
default-value: 4.0

View File

@ -0,0 +1,17 @@
name: Light Dash
modifier:
damage:
name: Damage
default-value: 3.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
length:
name: Length
default-value: 1.0

View File

@ -0,0 +1,17 @@
name: Lightning Beam
modifier:
damage:
name: Damage
default-value: 8.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
radius:
name: Radius
default-value: 5.0

View File

@ -0,0 +1,14 @@
name: Magical Path
modifier:
duration:
name: Duration
default-value: 3.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 15.0

View File

@ -0,0 +1,20 @@
name: Magical Shield
modifier:
duration:
name: Duration
default-value: 5.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 35.0
power:
name: Power
default-value: 40.0
radius:
name: Radius
default-value: 5.0

View File

@ -0,0 +1,17 @@
name: Magma Fissure
modifier:
ignite:
name: Ignite
default-value: 4.0
damage:
name: Damage
default-value: 4.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0

View File

@ -0,0 +1,20 @@
name: Minor Explosion
modifier:
damage:
name: Damage
default-value: 6.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
knockback:
name: Knockback
default-value: 1.0
radius:
name: Radius
default-value: 5.0

View File

@ -0,0 +1,17 @@
name: Overload
modifier:
damage:
name: Damage
default-value: 6.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
radius:
name: Radius
default-value: 6.0

View File

@ -0,0 +1,17 @@
name: Poison
modifier:
duration:
name: Duration
default-value: 4.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
amplifier:
name: Amplifier
default-value: 1.0

View File

@ -0,0 +1,20 @@
name: Present Throw
modifier:
damage:
name: Damage
default-value: 6.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
force:
name: Force
default-value: 1.0
radius:
name: Radius
default-value: 4.0

View File

@ -0,0 +1,17 @@
name: Regen Ally
modifier:
duration:
name: Duration
default-value: 3.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
heal:
name: Heal
default-value: 7.0
cooldown:
name: Cooldown
default-value: 10.0

View File

@ -0,0 +1,17 @@
name: Shadow Veil
modifier:
duration:
name: Duration
default-value: 5.0
deception:
name: Deception
default-value: 1.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 35.0

View File

@ -0,0 +1,14 @@
name: Shock
modifier:
duration:
name: Duration
default-value: 2.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 8.0

View File

@ -0,0 +1,17 @@
name: Shockwave
modifier:
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 7.5
length:
name: Length
default-value: 5.0
knock-up:
name: Knock Up
default-value: 1.0

View File

@ -0,0 +1,20 @@
name: Shulker Missile
modifier:
duration:
name: Duration
default-value: 5.0
damage:
name: Damage
default-value: 5.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 12.0
effect-duration:
name: Effect Duration
default-value: 5.0

View File

@ -0,0 +1,17 @@
name: Sky Smash
modifier:
damage:
name: Damage
default-value: 3.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
knock-up:
name: Knock Up
default-value: 1.0

View File

@ -0,0 +1,17 @@
name: Slow
modifier:
duration:
name: Duration
default-value: 3.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 5.0
amplifier:
name: Amplifier
default-value: 1.0

View File

@ -0,0 +1,14 @@
name: Smite
modifier:
damage:
name: Damage
default-value: 8.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0

View File

@ -0,0 +1,20 @@
name: Snowman Turret
modifier:
duration:
name: Duration
default-value: 6.0
damage:
name: Damage
default-value: 2.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 35.0
radius:
name: Radius
default-value: 20.0

View File

@ -0,0 +1,20 @@
name: Sparkle
modifier:
damage:
name: Damage
default-value: 4.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0
limit:
name: Limit
default-value: 5.0
radius:
name: Radius
default-value: 6.0

View File

@ -0,0 +1,14 @@
name: Starfall
modifier:
damage:
name: Damage
default-value: 3.5
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 8.0

View File

@ -0,0 +1,14 @@
name: Stun
modifier:
duration:
name: Duration
default-value: 2.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 10.0

View File

@ -0,0 +1,17 @@
name: Swiftness
modifier:
duration:
name: Duration
default-value: 4.0
mana:
name: Mana
default-value: 0.0
stamina:
name: Stamina
default-value: 0.0
cooldown:
name: Cooldown
default-value: 15.0
amplifier:
name: Amplifier
default-value: 1.0

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