Fixed many errors with Ability, ComboAbility, MultiAbility, and PassiveAbility Managers

This commit is contained in:
jayoevans 2019-10-28 20:54:33 +10:00
parent 736998dd4a
commit d44077f99b
23 changed files with 221 additions and 227 deletions

View file

@ -2,6 +2,7 @@ package com.projectkorra.projectkorra.ability;
import com.projectkorra.projectkorra.BendingPlayer;
import com.projectkorra.projectkorra.Manager;
import com.projectkorra.projectkorra.ability.info.AbilityInfo;
import com.projectkorra.projectkorra.ability.util.Collision;
import com.projectkorra.projectkorra.ability.util.CollisionManager;
import com.projectkorra.projectkorra.attribute.Attribute;
@ -9,7 +10,6 @@ import com.projectkorra.projectkorra.attribute.AttributeModifier;
import com.projectkorra.projectkorra.attribute.AttributePriority;
import com.projectkorra.projectkorra.configuration.ConfigManager;
import com.projectkorra.projectkorra.configuration.configs.abilities.AbilityConfig;
import com.projectkorra.projectkorra.element.Element;
import com.projectkorra.projectkorra.event.AbilityEndEvent;
import com.projectkorra.projectkorra.event.AbilityStartEvent;
import com.projectkorra.projectkorra.module.ModuleManager;
@ -44,7 +44,7 @@ import java.util.jar.JarFile;
* @see #registerAddonAbilities(String)
* @see #registerPluginAbilities(JavaPlugin, String)
*/
public abstract class Ability<Config extends AbilityConfig> {
public abstract class Ability<Info extends AbilityInfo, Config extends AbilityConfig> {
private static final double DEFAULT_COLLISION_RADIUS = 0.3;
private static final Map<Class<? extends Ability>, Map<String, Field>> ATTRIBUTE_FIELDS = new HashMap<>();
@ -487,8 +487,6 @@ public abstract class Ability<Config extends AbilityConfig> {
public abstract String getName();
public abstract Element getElement();
public abstract Location getLocation();
public static double getDefaultCollisionRadius() {

View file

@ -1,32 +0,0 @@
package com.projectkorra.projectkorra.ability;
import com.projectkorra.projectkorra.ability.loader.AbilityLoader;
import com.projectkorra.projectkorra.configuration.configs.abilities.AbilityConfig;
import com.projectkorra.projectkorra.element.Element;
public class AbilityInfo {
private final Class<? extends Ability> abilityClass;
private final AbilityData abilityData;
private final AbilityLoader abilityLoader;
private final AbilityConfig abilityConfig;
public AbilityInfo(Class<? extends Ability> abilityClass, AbilityData abilityData, AbilityLoader abilityLoader, AbilityConfig abilityConfig) {
this.abilityClass = abilityClass;
this.abilityData = abilityData;
this.abilityLoader = abilityLoader;
this.abilityConfig = abilityConfig;
}
public String getName() {
return this.abilityData.name();
}
public Element getElement() {
return this.abilityLoader.getElement();
}
public AbilityLoader getLoader() {
return this.abilityLoader;
}
}

View file

@ -3,9 +3,9 @@ package com.projectkorra.projectkorra.ability;
import co.aikar.timings.lib.MCTiming;
import com.projectkorra.projectkorra.ProjectKorra;
import com.projectkorra.projectkorra.ability.api.PassiveAbility;
import com.projectkorra.projectkorra.ability.loader.*;
import com.projectkorra.projectkorra.ability.util.AbilityRegistery;
import com.projectkorra.projectkorra.ability.util.AddonAbilityRegistery;
import com.projectkorra.projectkorra.ability.info.*;
import com.projectkorra.projectkorra.ability.util.AbilityRegistry;
import com.projectkorra.projectkorra.ability.util.AddonAbilityRegistry;
import com.projectkorra.projectkorra.configuration.ConfigManager;
import com.projectkorra.projectkorra.configuration.configs.abilities.AbilityConfig;
import com.projectkorra.projectkorra.element.Element;
@ -123,17 +123,16 @@ public class AbilityManager extends Module {
* @see #getAbility(String)
*/
public void registerPluginAbilities(String packageBase) {
AbilityRegistery<Ability> abilityRegistery = new AbilityRegistery<>(getPlugin(), packageBase);
List<Class<Ability>> loadedAbilities = abilityRegistery.load(Ability.class, Ability.class);
AbilityRegistry<Ability> abilityRegistry = new AbilityRegistry<>(getPlugin(), packageBase);
List<Class<Ability>> loadedAbilities = abilityRegistry.load(Ability.class, Ability.class);
String entry = getPlugin().getName() + "::" + packageBase;
this.addonPlugins.add(entry);
for (Class<Ability> abilityClass : loadedAbilities) {
AbilityData abilityData = getAbilityData(abilityClass);
AbilityLoader abilityLoader = getAbilityLoader(abilityData);
AbilityInfo abilityInfo = getAbilityInfo(abilityClass);
registerAbility(abilityClass, abilityData, abilityLoader);
registerAbility(abilityClass, abilityInfo);
}
}
@ -153,25 +152,24 @@ public class AbilityManager extends Module {
return;
}
AddonAbilityRegistery<Ability> abilityRegistery = new AddonAbilityRegistery<>(getPlugin(), file);
AddonAbilityRegistry<Ability> abilityRegistery = new AddonAbilityRegistry<>(getPlugin(), file);
List<Class<Ability>> loadedAbilities = abilityRegistery.load(Ability.class, Ability.class);
for (Class<Ability> abilityClass : loadedAbilities) {
AbilityData abilityData = getAbilityData(abilityClass);
AbilityLoader abilityLoader = getAbilityLoader(abilityData);
AbilityInfo abilityInfo = getAbilityInfo(abilityClass);
if (!(abilityLoader instanceof AddonAbilityLoader)) {
throw new AbilityException(abilityClass.getName() + " must have an AddonAbilityLoader");
if (!(abilityInfo instanceof AddonAbilityInfo)) {
throw new AbilityException(abilityClass.getName() + " must have an AddonAbilityInfo");
}
registerAbility(abilityClass, abilityData, abilityLoader);
registerAbility(abilityClass, abilityInfo);
}
}
private <T extends Ability> void registerAbility(Class<T> abilityClass, AbilityData abilityData, AbilityLoader abilityLoader) throws AbilityException {
private <T extends Ability> void registerAbility(Class<T> abilityClass, AbilityInfo abilityInfo) throws AbilityException {
AbilityConfig abilityConfig = getAbilityConfig(abilityClass);
String abilityName = abilityData.name();
String abilityName = abilityInfo.getName();
if (abilityName == null) {
throw new AbilityException("Ability " + abilityClass.getName() + " has no name");
@ -182,62 +180,51 @@ public class AbilityManager extends Module {
return;
}
if (abilityLoader instanceof AddonAbilityLoader) {
((AddonAbilityLoader) abilityLoader).load();
if (abilityInfo instanceof AddonAbilityInfo) {
((AddonAbilityInfo) abilityInfo).load();
}
if (abilityLoader instanceof ComboAbilityLoader) {
ComboAbilityLoader comboAbilityLoader = (ComboAbilityLoader) abilityLoader;
if (abilityInfo instanceof ComboAbilityInfo) {
ComboAbilityInfo comboAbilityInfo = (ComboAbilityInfo) abilityInfo;
if (comboAbilityLoader.getCombination() == null || comboAbilityLoader.getCombination().size() < 2) {
if (comboAbilityInfo.getCombination() == null || comboAbilityInfo.getCombination().size() < 2) {
getPlugin().getLogger().info(abilityName + " has no combination");
return;
}
this.comboAbilityManager.registerAbility(abilityClass, abilityData, comboAbilityLoader);
this.comboAbilityManager.registerAbility(abilityClass, comboAbilityInfo);
return;
}
if (abilityLoader instanceof MultiAbilityLoader) {
MultiAbilityLoader multiAbilityLoader = (MultiAbilityLoader) abilityLoader;
if (abilityInfo instanceof MultiAbilityInfo) {
MultiAbilityInfo multiAbilityInfo = (MultiAbilityInfo) abilityInfo;
this.multiAbilityManager.registerAbility(abilityClass, abilityData, multiAbilityLoader);
this.multiAbilityManager.registerAbility(abilityClass, multiAbilityInfo);
return;
}
if (abilityLoader instanceof PassiveAbilityLoader) {
PassiveAbilityLoader passiveAbilityLoader = (PassiveAbilityLoader) abilityLoader;
if (abilityInfo instanceof PassiveAbilityInfo) {
PassiveAbilityInfo passiveAbilityInfo = (PassiveAbilityInfo) abilityInfo;
// TODO Set Hidden Ability
this.passiveAbilityManager.registerAbility(abilityClass, passiveAbilityLoader);
this.passiveAbilityManager.registerAbility(abilityClass, passiveAbilityInfo);
return;
}
AbilityInfo abilityInfo = new AbilityInfo(abilityClass, abilityData, abilityLoader, abilityConfig);
this.abilities.put(abilityData.name(), abilityInfo);
this.abilities.put(abilityInfo.getName(), abilityInfo);
}
private AbilityData getAbilityData(Class<? extends Ability> abilityClass) throws AbilityException {
AbilityData abilityData = abilityClass.getDeclaredAnnotation(AbilityData.class);
if (abilityData == null) {
throw new AbilityException("Ability " + abilityClass.getName() + " has missing AbilityData annotation");
}
return abilityData;
}
private AbilityLoader getAbilityLoader(AbilityData abilityData) throws AbilityException {
protected AbilityInfo getAbilityInfo(Class<? extends Ability> abilityClass) throws AbilityException {
try {
return abilityData.abilityLoader().newInstance();
} catch (InstantiationException | IllegalAccessException e) {
return ((Class<? extends AbilityInfo>) ((ParameterizedType) abilityClass.getGenericSuperclass()).getActualTypeArguments()[0]).newInstance();
} catch (Exception e) {
throw new AbilityException(e);
}
}
private AbilityConfig getAbilityConfig(Class<? extends Ability> abilityClass) throws AbilityException {
try {
return ConfigManager.getConfig(((Class<? extends AbilityConfig>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]));
return ConfigManager.getConfig(((Class<? extends AbilityConfig>) ((ParameterizedType) abilityClass.getGenericSuperclass()).getActualTypeArguments()[1]));
} catch (Exception e) {
throw new AbilityException(e);
}
@ -339,8 +326,8 @@ public class AbilityManager extends Module {
return new ArrayList<>(this.abilities.values());
}
public List<Ability> getAbilities(Element element) {
return this.playerAbilitySet.stream()
public List<AbilityInfo> getAbilities(Element element) {
return this.abilities.values().stream()
.filter(ability ->
{
if (ability.getElement().equals(element)) {

View file

@ -1,6 +1,6 @@
package com.projectkorra.projectkorra.ability;
import com.projectkorra.projectkorra.ability.loader.ComboAbilityLoader;
import com.projectkorra.projectkorra.ability.info.ComboAbilityInfo;
import com.projectkorra.projectkorra.module.Module;
import com.projectkorra.projectkorra.module.ModuleManager;
import com.projectkorra.projectkorra.player.BendingPlayer;
@ -27,7 +27,7 @@ public class ComboAbilityManager extends Module {
private final AbilityManager abilityManager;
private final Map<UUID, LinkedList<Combination>> recentlyUsed = new HashMap<>();
private final List<ComboAbilityInfo> abilities = new ArrayList<>();
private final List<ComboAbility> abilities = new ArrayList<>();
private final long combinationMax = 8;
@ -40,10 +40,10 @@ public class ComboAbilityManager extends Module {
this.abilities.clear();
}
public void registerAbility(Class<? extends Ability> abilityClass, AbilityData abilityData, ComboAbilityLoader comboAbilityLoader) {
ComboAbilityInfo comboAbilityInfo = new ComboAbilityInfo(abilityClass, abilityData.name(), comboAbilityLoader.getCombination());
public void registerAbility(Class<? extends Ability> abilityClass, ComboAbilityInfo comboAbilityInfo) {
ComboAbility comboAbility = new ComboAbility(abilityClass, comboAbilityInfo.getName(), comboAbilityInfo.getCombination());
this.abilities.add(comboAbilityInfo);
this.abilities.add(comboAbility);
}
private void processComboAbility(Player player, ClickType clickType) {
@ -59,31 +59,29 @@ public class ComboAbilityManager extends Module {
recentlyUsed.removeLast();
}
ComboAbilityInfo comboAbilityInfo = getComboAbiblity(recentlyUsed);
ComboAbility comboAbility = getComboAbility(recentlyUsed);
if (comboAbilityInfo == null) {
if (comboAbility == null) {
return;
}
if (!player.hasPermission("bending.ability." + comboAbilityInfo.abilityName)) {
if (!player.hasPermission("bending.ability." + comboAbility.abilityName)) {
return;
}
this.abilityManager.createAbility(player, comboAbilityInfo.abilityClass);
this.abilityManager.createAbility(player, comboAbility.abilityClass);
}
private ComboAbilityInfo getComboAbiblity(LinkedList<Combination> recentlyUsed) {
for (ComboAbilityInfo comboAbilityInfo : this.abilities) {
LinkedList<Combination> abilityCombinations = comboAbilityInfo.combinations;
int comboSize = abilityCombinations.size();
private ComboAbility getComboAbility(LinkedList<Combination> recentlyUsed) {
for (ComboAbility comboAbility : this.abilities) {
int comboSize = comboAbility.combinations.size();
if (recentlyUsed.size() < comboSize) {
continue;
}
if (recentlyUsed.subList(0, comboSize).equals(abilityCombinations)) {
return comboAbilityInfo;
if (recentlyUsed.subList(0, comboSize).equals(comboAbility.combinations)) {
return comboAbility;
}
}
@ -199,16 +197,15 @@ public class ComboAbilityManager extends Module {
}
}
private class ComboAbilityInfo {
private class ComboAbility {
private final Class<? extends Ability> abilityClass;
private final String abilityName;
private final LinkedList<Combination> combinations;
private final List<Combination> combinations;
ComboAbilityInfo(Class<? extends Ability> abilityClass, String abilityName, LinkedList<Combination> combinations) {
ComboAbility(Class<? extends Ability> abilityClass, String abilityName, List<Combination> combinations) {
this.abilityClass = abilityClass;
this.abilityName = abilityName;
this.combinations = combinations;
}
}
}

View file

@ -1,7 +1,8 @@
package com.projectkorra.projectkorra.ability;
import com.projectkorra.projectkorra.ability.api.PlayerBindAbilityEvent;
import com.projectkorra.projectkorra.ability.loader.MultiAbilityLoader;
import com.projectkorra.projectkorra.ability.info.AbilityInfo;
import com.projectkorra.projectkorra.ability.info.MultiAbilityInfo;
import com.projectkorra.projectkorra.event.AbilityEndEvent;
import com.projectkorra.projectkorra.event.PlayerSwingEvent;
import com.projectkorra.projectkorra.module.Module;
@ -13,11 +14,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerItemHeldEvent;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.*;
public class MultiAbilityManager extends Module {
@ -25,6 +22,7 @@ public class MultiAbilityManager extends Module {
private final AbilityManager abilityManager;
private final Map<String, MultiAbility> abilities = new HashMap<>();
private final Map<String, Class<? extends Ability>> multiAbilities = new HashMap<>();
private final Map<UUID, Class<? extends Ability>> playerMultiAbility = new HashMap<>();
private final Map<UUID, List<String>> playerAbilities = new HashMap<>();
@ -36,17 +34,21 @@ public class MultiAbilityManager extends Module {
this.abilityManager = ModuleManager.getModule(AbilityManager.class);
}
public void registerAbility(Class<? extends Ability> abilityClass, AbilityData abilityData, MultiAbilityLoader multiAbilityLoader) {
List<String> abilities = multiAbilityLoader.getAbilities().stream()
.map(ability -> ability.getDeclaredAnnotation(AbilityData.class))
.map(AbilityData::name)
.collect(Collectors.toList());
public void registerAbility(Class<? extends Ability> abilityClass, MultiAbilityInfo multiAbilityInfo) {
List<Class<? extends Ability>> abilities = multiAbilityInfo.getAbilities();
// TODO Exception handling for multi abilities with missing AbilityData annotations
Map<String, Class<? extends Ability>> abilitiesByName = new HashMap<>();
MultiAbility multiAbility = new MultiAbility(abilityClass, abilityData.name(), abilities);
for (Class<? extends Ability> ability : abilities) {
AbilityInfo info = this.abilityManager.getAbilityInfo(ability);
this.abilities.put(abilityData.name(), multiAbility);
abilitiesByName.put(info.getName(), ability);
}
MultiAbility multiAbility = new MultiAbility(abilityClass, multiAbilityInfo.getName(), abilitiesByName.keySet());
this.abilities.put(multiAbilityInfo.getName(), multiAbility);
this.multiAbilities.putAll(abilitiesByName);
}
@EventHandler
@ -74,6 +76,20 @@ public class MultiAbilityManager extends Module {
player.getInventory().setHeldItemSlot(0);
}
@EventHandler
public void onMultiAbilitySwing(PlayerSwingEvent event) {
Player player = event.getPlayer();
String abilityName = event.getAbilityName();
Class<? extends Ability> abilityClass = this.multiAbilities.get(abilityName);
if (abilityClass == null) {
return;
}
Ability ability = this.abilityManager.createAbility(player, abilityClass);
}
@EventHandler
public void onAbilityEnd(AbilityEndEvent event) {
Ability ability = event.getAbility();
@ -124,9 +140,9 @@ public class MultiAbilityManager extends Module {
public class MultiAbility {
private final Class<? extends Ability> abilityClass;
private final String abilityName;
private final List<String> abilities;
private final Set<String> abilities;
MultiAbility(Class<? extends Ability> abilityClass, String abilityName, List<String> abilities) {
MultiAbility(Class<? extends Ability> abilityClass, String abilityName, Set<String> abilities) {
this.abilityClass = abilityClass;
this.abilityName = abilityName;
this.abilities = abilities;

View file

@ -1,6 +1,6 @@
package com.projectkorra.projectkorra.ability;
import com.projectkorra.projectkorra.ability.loader.PassiveAbilityLoader;
import com.projectkorra.projectkorra.ability.info.PassiveAbilityInfo;
import com.projectkorra.projectkorra.element.Element;
import com.projectkorra.projectkorra.element.SubElement;
import com.projectkorra.projectkorra.module.Module;
@ -19,7 +19,7 @@ public class PassiveAbilityManager extends Module {
private final BendingPlayerManager bendingPlayerManager;
private final AbilityManager abilityManager;
private final Map<Class<? extends Ability>, PassiveAbilityLoader> abilities = new HashMap<>();
private final Map<Class<? extends Ability>, PassiveAbilityInfo> abilities = new HashMap<>();
private PassiveAbilityManager() {
super("Passive Ability");
@ -28,12 +28,12 @@ public class PassiveAbilityManager extends Module {
this.abilityManager = ModuleManager.getModule(AbilityManager.class);
}
public void registerAbility(Class<? extends Ability> abilityClass, PassiveAbilityLoader passiveAbilityLoader) {
this.abilities.put(abilityClass, passiveAbilityLoader);
public void registerAbility(Class<? extends Ability> abilityClass, PassiveAbilityInfo passiveAbilityInfo) {
this.abilities.put(abilityClass, passiveAbilityInfo);
}
public void registerPassives(Player player) {
this.abilities.forEach((abilityClass, passiveAbilityLoader) -> {
this.abilities.forEach((abilityClass, passiveAbilityInfo) -> {
if (!canUsePassive(player, abilityClass)) {
return;
}
@ -42,7 +42,7 @@ public class PassiveAbilityManager extends Module {
return;
}
if (!passiveAbilityLoader.isInstantiable()) {
if (!passiveAbilityInfo.isInstantiable()) {
return;
}
@ -53,13 +53,13 @@ public class PassiveAbilityManager extends Module {
public boolean canUsePassive(Player player, Class<? extends Ability> abilityClass) {
BendingPlayer bendingPlayer = this.bendingPlayerManager.getBendingPlayer(player);
PassiveAbilityLoader passiveAbilityLoader = this.abilities.get(abilityClass);
PassiveAbilityInfo passiveAbilityInfo = this.abilities.get(abilityClass);
if (passiveAbilityLoader == null) {
if (passiveAbilityInfo == null) {
return false;
}
Element element = passiveAbilityLoader.getElement();
Element element = passiveAbilityInfo.getElement();
if (element instanceof SubElement) {
element = ((SubElement) element).getParent();
@ -80,7 +80,7 @@ public class PassiveAbilityManager extends Module {
return true;
}
public PassiveAbilityLoader getPassiveAbility(Class<? extends Ability> abilityClass) {
public PassiveAbilityInfo getPassiveAbility(Class<? extends Ability> abilityClass) {
return this.abilities.get(abilityClass);
}

View file

@ -3,12 +3,12 @@ package com.projectkorra.projectkorra.ability.api;
import java.util.ArrayList;
import java.util.List;
import com.projectkorra.projectkorra.ability.info.AbilityInfo;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import com.projectkorra.projectkorra.Element;
import com.projectkorra.projectkorra.GeneralMethods;
import com.projectkorra.projectkorra.ability.util.Collision;
import com.projectkorra.projectkorra.airbending.AirSpout;
@ -18,7 +18,7 @@ import com.projectkorra.projectkorra.configuration.configs.abilities.AbilityConf
import com.projectkorra.projectkorra.configuration.configs.properties.AirPropertiesConfig;
import com.projectkorra.projectkorra.util.ParticleEffect;
public abstract class AirAbility<C extends AbilityConfig> extends ElementalAbility<C> {
public abstract class AirAbility<Info extends AbilityInfo, C extends AbilityConfig> extends ElementalAbility<Info, C> {
public AirAbility(final C config, final Player player) {
super(config, player);
@ -34,11 +34,6 @@ public abstract class AirAbility<C extends AbilityConfig> extends ElementalAbili
return false;
}
@Override
public Element getElement() {
return Element.AIR;
}
@Override
public void handleCollision(final Collision collision) {
super.handleCollision(collision);

View file

@ -1,12 +1,12 @@
package com.projectkorra.projectkorra.ability.api;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Stream;
import com.projectkorra.projectkorra.GeneralMethods;
import com.projectkorra.projectkorra.ability.Ability;
import com.projectkorra.projectkorra.ability.info.AbilityInfo;
import com.projectkorra.projectkorra.configuration.ConfigManager;
import com.projectkorra.projectkorra.configuration.configs.abilities.AbilityConfig;
import com.projectkorra.projectkorra.configuration.configs.properties.EarthPropertiesConfig;
import com.projectkorra.projectkorra.configuration.configs.properties.WaterPropertiesConfig;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.World.Environment;
@ -16,18 +16,18 @@ import org.bukkit.block.data.Waterlogged;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffectType;
import com.projectkorra.projectkorra.GeneralMethods;
import com.projectkorra.projectkorra.configuration.ConfigManager;
import com.projectkorra.projectkorra.configuration.configs.abilities.AbilityConfig;
import com.projectkorra.projectkorra.configuration.configs.properties.EarthPropertiesConfig;
import com.projectkorra.projectkorra.configuration.configs.properties.WaterPropertiesConfig;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Stream;
/**
* ElementalAbility is used to hold methods that should be accessible by every
* Air, Water, Earth, Fire, Chi, or AvatarAbility. This class is mainly used to
* keep CoreAbility from becoming too cluttered.
*/
public abstract class ElementalAbility<C extends AbilityConfig> extends Ability<C> {
public abstract class ElementalAbility<Info extends AbilityInfo, C extends AbilityConfig> extends Ability<Info, C> {
private static final PotionEffectType[] POSITIVE_EFFECTS = { PotionEffectType.ABSORPTION, PotionEffectType.DAMAGE_RESISTANCE, PotionEffectType.FAST_DIGGING, PotionEffectType.FIRE_RESISTANCE, PotionEffectType.HEAL, PotionEffectType.HEALTH_BOOST, PotionEffectType.INCREASE_DAMAGE, PotionEffectType.JUMP, PotionEffectType.NIGHT_VISION, PotionEffectType.REGENERATION, PotionEffectType.SATURATION, PotionEffectType.SPEED, PotionEffectType.WATER_BREATHING };
private static final PotionEffectType[] NEUTRAL_EFFECTS = { PotionEffectType.INVISIBILITY };
private static final PotionEffectType[] NEGATIVE_EFFECTS = { PotionEffectType.POISON, PotionEffectType.BLINDNESS, PotionEffectType.CONFUSION, PotionEffectType.HARM, PotionEffectType.HUNGER, PotionEffectType.SLOW, PotionEffectType.SLOW_DIGGING, PotionEffectType.WEAKNESS, PotionEffectType.WITHER };

View file

@ -1,17 +1,10 @@
package com.projectkorra.projectkorra.ability;
package com.projectkorra.projectkorra.ability.info;
import com.projectkorra.projectkorra.ability.loader.AbilityLoader;
import com.projectkorra.projectkorra.ability.Ability;
import com.projectkorra.projectkorra.element.Element;
import com.projectkorra.projectkorra.player.BendingPlayer;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface AbilityData {
public interface AbilityInfo {
/**
* The name of the ability is used for commands such as <b>/bending
@ -25,25 +18,28 @@ public @interface AbilityData {
*
* @return Returns the name of the ability
*/
String name();
String getName();
/**
* @return The class used to register this ability.
*/
Class<? extends AbilityLoader> abilityLoader();
Element getElement();
/**
* @return true if this is a hidden ability.
*/
boolean hidden() default false;
default boolean isHidden() {
return false;
}
/**
* @return the name of the author of this AddonAbility
*/
String author() default "ProjectKorra";
default String getAuthor() {
return "ProjectKorra";
}
/**
* @return The version of the ability as a String.
*/
String version() default "1.0";
default String getVersion() {
return "1.0";
}
}

View file

@ -1,14 +1,14 @@
package com.projectkorra.projectkorra.ability.loader;
package com.projectkorra.projectkorra.ability.info;
import com.projectkorra.projectkorra.ability.AbilityManager;
public abstract class AddonAbilityLoader extends AbilityLoader {
public interface AddonAbilityInfo extends AbilityInfo {
/**
* Called when the ability is loaded by PK. This is where the developer
* registers Listeners and Permissions.
*/
public abstract void load();
void load();
/**
* Called whenever ProjectKorra stops and the ability is unloaded. This
@ -16,5 +16,5 @@ public abstract class AddonAbilityLoader extends AbilityLoader {
* Any CoreAbility instances do not need to be cleaned up by stop method, as
* they will be cleaned up by {@link AbilityManager#removeAll()}.
*/
public abstract void stop();
void stop();
}

View file

@ -0,0 +1,6 @@
package com.projectkorra.projectkorra.ability.info;
public interface AvatarAbilityInfo extends AbilityInfo {
boolean requireAvatar();
}

View file

@ -1,15 +1,15 @@
package com.projectkorra.projectkorra.ability.loader;
package com.projectkorra.projectkorra.ability.info;
import com.projectkorra.projectkorra.ability.ComboAbilityManager;
import java.util.LinkedList;
public abstract class ComboAbilityLoader extends AbilityLoader {
public interface ComboAbilityInfo extends AbilityInfo {
/**
* Returns the list of abilities which constitute the combo.
*
* @return A {@link LinkedList} containing the combo's steps.
*/
public abstract LinkedList<ComboAbilityManager.Combination> getCombination();
LinkedList<ComboAbilityManager.Combination> getCombination();
}

View file

@ -0,0 +1,18 @@
package com.projectkorra.projectkorra.ability.info;
import com.projectkorra.projectkorra.ability.Ability;
import java.util.List;
public interface MultiAbilityInfo extends AbilityInfo {
/**
* Returns the sub abilities of a MultiAbility. For example:
* <p>
* {@code new
* MultiAbilitySub("SubAbility", Element.LIGHTNING);}
*
* @return a list of sub MultiAbilities
*/
List<Class<? extends Ability>> getAbilities();
}

View file

@ -1,6 +1,6 @@
package com.projectkorra.projectkorra.ability.loader;
package com.projectkorra.projectkorra.ability.info;
public abstract class PassiveAbilityLoader extends AbilityLoader {
public interface PassiveAbilityInfo extends AbilityInfo {
/**
* This is a check to see if the passive requires some form of activation,
@ -9,13 +9,12 @@ public abstract class PassiveAbilityLoader extends AbilityLoader {
*
* @return false if this passive should always be on
*/
public abstract boolean isInstantiable();
boolean isInstantiable();
/**
* This is used if the passive should progress
*
* @return false if progress() shouldn't be called;
*/
public abstract boolean isProgressable();
boolean isProgressable();
}

View file

@ -1,8 +0,0 @@
package com.projectkorra.projectkorra.ability.loader;
import com.projectkorra.projectkorra.element.Element;
public abstract class AbilityLoader {
public abstract Element getElement();
}

View file

@ -1,6 +0,0 @@
package com.projectkorra.projectkorra.ability.loader;
public abstract class AvatarAbilityLoader extends AbilityLoader {
public abstract boolean requireAvatar();
}

View file

@ -1,21 +0,0 @@
package com.projectkorra.projectkorra.ability.loader;
import com.projectkorra.projectkorra.ability.Ability;
import com.projectkorra.projectkorra.ability.MultiAbilityManager;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public abstract class MultiAbilityLoader extends AbilityLoader {
/**
* Returns the sub abilities of a MultiAbility. For example:
* <p>
* {@code new
* MultiAbilitySub("SubAbility", Element.LIGHTNING);}
*
* @return a list of sub MultiAbilities
*/
public abstract List<Class<? extends Ability>> getAbilities();
}

View file

@ -16,14 +16,14 @@ import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class AbilityRegistery<T> {
public class AbilityRegistry<T> {
private final Plugin plugin;
private ClassLoader loader;
private JarFile jar;
private String path;
public AbilityRegistery(final JavaPlugin plugin, final String packageBase) {
public AbilityRegistry(final JavaPlugin plugin, final String packageBase) {
this.plugin = plugin;
this.loader = plugin.getClass().getClassLoader();
this.path = packageBase.replace('.', '/');

View file

@ -17,14 +17,14 @@ import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.logging.Level;
public class AddonAbilityRegistery<T> {
public class AddonAbilityRegistry<T> {
private final Plugin plugin;
private final File directory;
private final ArrayList<File> files;
private ClassLoader loader;
public AddonAbilityRegistery(final Plugin plugin, final File directory) {
public AddonAbilityRegistry(final Plugin plugin, final File directory) {
this.plugin = plugin;
this.directory = directory;
this.files = new ArrayList<File>();

View file

@ -1,14 +1,13 @@
package com.projectkorra.projectkorra.airbending.passive;
import com.projectkorra.projectkorra.ability.api.AirAbility;
import com.projectkorra.projectkorra.airbending.util.AirPassiveAbilityInfo;
import com.projectkorra.projectkorra.configuration.ConfigManager;
import com.projectkorra.projectkorra.configuration.configs.abilities.air.AirSaturationConfig;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import com.projectkorra.projectkorra.ability.api.AirAbility;
import com.projectkorra.projectkorra.ability.api.PassiveAbility;
import com.projectkorra.projectkorra.configuration.ConfigManager;
import com.projectkorra.projectkorra.configuration.configs.abilities.air.AirSaturationConfig;
public class AirSaturation extends AirAbility<AirSaturationConfig> implements PassiveAbility {
public class AirSaturation extends AirAbility<AirSaturationInfo, AirSaturationConfig> {
public AirSaturation(final AirSaturationConfig config, final Player player) {
super(config, player);
}
@ -45,6 +44,19 @@ public class AirSaturation extends AirAbility<AirSaturationConfig> implements Pa
return this.player.getLocation();
}
@Override
public Class<AirSaturationConfig> getConfigType() {
return AirSaturationConfig.class;
}
}
class AirSaturationInfo extends AirPassiveAbilityInfo {
@Override
public String getName() {
return "AirSaturation";
}
@Override
public boolean isInstantiable() {
return false;
@ -54,9 +66,4 @@ public class AirSaturation extends AirAbility<AirSaturationConfig> implements Pa
public boolean isProgressable() {
return false;
}
@Override
public Class<AirSaturationConfig> getConfigType() {
return AirSaturationConfig.class;
}
}

View file

@ -0,0 +1,14 @@
package com.projectkorra.projectkorra.airbending.util;
import com.projectkorra.projectkorra.ability.info.AbilityInfo;
import com.projectkorra.projectkorra.element.Element;
import com.projectkorra.projectkorra.element.ElementManager;
import com.projectkorra.projectkorra.module.ModuleManager;
public abstract class AirAbilityInfo extends AbilityInfo {
@Override
public Element getElement() {
return ModuleManager.getModule(ElementManager.class).getAir();
}
}

View file

@ -0,0 +1,14 @@
package com.projectkorra.projectkorra.airbending.util;
import com.projectkorra.projectkorra.ability.info.AddonAbilityInfo;
import com.projectkorra.projectkorra.element.Element;
import com.projectkorra.projectkorra.element.ElementManager;
import com.projectkorra.projectkorra.module.ModuleManager;
public abstract class AirAddonAbilityInfo implements AddonAbilityInfo {
@Override
public Element getElement() {
return ModuleManager.getModule(ElementManager.class).getAir();
}
}

View file

@ -0,0 +1,14 @@
package com.projectkorra.projectkorra.airbending.util;
import com.projectkorra.projectkorra.ability.info.PassiveAbilityInfo;
import com.projectkorra.projectkorra.element.Element;
import com.projectkorra.projectkorra.element.ElementManager;
import com.projectkorra.projectkorra.module.ModuleManager;
public abstract class AirPassiveAbilityInfo implements PassiveAbilityInfo {
@Override
public Element getElement() {
return ModuleManager.getModule(ElementManager.class).getAir();
}
}