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.BendingPlayer;
import com.projectkorra.projectkorra.Manager; 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.Collision;
import com.projectkorra.projectkorra.ability.util.CollisionManager; import com.projectkorra.projectkorra.ability.util.CollisionManager;
import com.projectkorra.projectkorra.attribute.Attribute; 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.attribute.AttributePriority;
import com.projectkorra.projectkorra.configuration.ConfigManager; import com.projectkorra.projectkorra.configuration.ConfigManager;
import com.projectkorra.projectkorra.configuration.configs.abilities.AbilityConfig; 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.AbilityEndEvent;
import com.projectkorra.projectkorra.event.AbilityStartEvent; import com.projectkorra.projectkorra.event.AbilityStartEvent;
import com.projectkorra.projectkorra.module.ModuleManager; import com.projectkorra.projectkorra.module.ModuleManager;
@ -44,7 +44,7 @@ import java.util.jar.JarFile;
* @see #registerAddonAbilities(String) * @see #registerAddonAbilities(String)
* @see #registerPluginAbilities(JavaPlugin, 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 double DEFAULT_COLLISION_RADIUS = 0.3;
private static final Map<Class<? extends Ability>, Map<String, Field>> ATTRIBUTE_FIELDS = new HashMap<>(); 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 String getName();
public abstract Element getElement();
public abstract Location getLocation(); public abstract Location getLocation();
public static double getDefaultCollisionRadius() { 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 co.aikar.timings.lib.MCTiming;
import com.projectkorra.projectkorra.ProjectKorra; import com.projectkorra.projectkorra.ProjectKorra;
import com.projectkorra.projectkorra.ability.api.PassiveAbility; import com.projectkorra.projectkorra.ability.api.PassiveAbility;
import com.projectkorra.projectkorra.ability.loader.*; import com.projectkorra.projectkorra.ability.info.*;
import com.projectkorra.projectkorra.ability.util.AbilityRegistery; import com.projectkorra.projectkorra.ability.util.AbilityRegistry;
import com.projectkorra.projectkorra.ability.util.AddonAbilityRegistery; import com.projectkorra.projectkorra.ability.util.AddonAbilityRegistry;
import com.projectkorra.projectkorra.configuration.ConfigManager; import com.projectkorra.projectkorra.configuration.ConfigManager;
import com.projectkorra.projectkorra.configuration.configs.abilities.AbilityConfig; import com.projectkorra.projectkorra.configuration.configs.abilities.AbilityConfig;
import com.projectkorra.projectkorra.element.Element; import com.projectkorra.projectkorra.element.Element;
@ -123,17 +123,16 @@ public class AbilityManager extends Module {
* @see #getAbility(String) * @see #getAbility(String)
*/ */
public void registerPluginAbilities(String packageBase) { public void registerPluginAbilities(String packageBase) {
AbilityRegistery<Ability> abilityRegistery = new AbilityRegistery<>(getPlugin(), packageBase); AbilityRegistry<Ability> abilityRegistry = new AbilityRegistry<>(getPlugin(), packageBase);
List<Class<Ability>> loadedAbilities = abilityRegistery.load(Ability.class, Ability.class); List<Class<Ability>> loadedAbilities = abilityRegistry.load(Ability.class, Ability.class);
String entry = getPlugin().getName() + "::" + packageBase; String entry = getPlugin().getName() + "::" + packageBase;
this.addonPlugins.add(entry); this.addonPlugins.add(entry);
for (Class<Ability> abilityClass : loadedAbilities) { for (Class<Ability> abilityClass : loadedAbilities) {
AbilityData abilityData = getAbilityData(abilityClass); AbilityInfo abilityInfo = getAbilityInfo(abilityClass);
AbilityLoader abilityLoader = getAbilityLoader(abilityData);
registerAbility(abilityClass, abilityData, abilityLoader); registerAbility(abilityClass, abilityInfo);
} }
} }
@ -153,25 +152,24 @@ public class AbilityManager extends Module {
return; 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); List<Class<Ability>> loadedAbilities = abilityRegistery.load(Ability.class, Ability.class);
for (Class<Ability> abilityClass : loadedAbilities) { for (Class<Ability> abilityClass : loadedAbilities) {
AbilityData abilityData = getAbilityData(abilityClass); AbilityInfo abilityInfo = getAbilityInfo(abilityClass);
AbilityLoader abilityLoader = getAbilityLoader(abilityData);
if (!(abilityLoader instanceof AddonAbilityLoader)) { if (!(abilityInfo instanceof AddonAbilityInfo)) {
throw new AbilityException(abilityClass.getName() + " must have an AddonAbilityLoader"); 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); AbilityConfig abilityConfig = getAbilityConfig(abilityClass);
String abilityName = abilityData.name(); String abilityName = abilityInfo.getName();
if (abilityName == null) { if (abilityName == null) {
throw new AbilityException("Ability " + abilityClass.getName() + " has no name"); throw new AbilityException("Ability " + abilityClass.getName() + " has no name");
@ -182,62 +180,51 @@ public class AbilityManager extends Module {
return; return;
} }
if (abilityLoader instanceof AddonAbilityLoader) { if (abilityInfo instanceof AddonAbilityInfo) {
((AddonAbilityLoader) abilityLoader).load(); ((AddonAbilityInfo) abilityInfo).load();
} }
if (abilityLoader instanceof ComboAbilityLoader) { if (abilityInfo instanceof ComboAbilityInfo) {
ComboAbilityLoader comboAbilityLoader = (ComboAbilityLoader) abilityLoader; 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"); getPlugin().getLogger().info(abilityName + " has no combination");
return; return;
} }
this.comboAbilityManager.registerAbility(abilityClass, abilityData, comboAbilityLoader); this.comboAbilityManager.registerAbility(abilityClass, comboAbilityInfo);
return; return;
} }
if (abilityLoader instanceof MultiAbilityLoader) { if (abilityInfo instanceof MultiAbilityInfo) {
MultiAbilityLoader multiAbilityLoader = (MultiAbilityLoader) abilityLoader; MultiAbilityInfo multiAbilityInfo = (MultiAbilityInfo) abilityInfo;
this.multiAbilityManager.registerAbility(abilityClass, abilityData, multiAbilityLoader); this.multiAbilityManager.registerAbility(abilityClass, multiAbilityInfo);
return; return;
} }
if (abilityLoader instanceof PassiveAbilityLoader) { if (abilityInfo instanceof PassiveAbilityInfo) {
PassiveAbilityLoader passiveAbilityLoader = (PassiveAbilityLoader) abilityLoader; PassiveAbilityInfo passiveAbilityInfo = (PassiveAbilityInfo) abilityInfo;
// TODO Set Hidden Ability // TODO Set Hidden Ability
this.passiveAbilityManager.registerAbility(abilityClass, passiveAbilityLoader); this.passiveAbilityManager.registerAbility(abilityClass, passiveAbilityInfo);
return; return;
} }
AbilityInfo abilityInfo = new AbilityInfo(abilityClass, abilityData, abilityLoader, abilityConfig); this.abilities.put(abilityInfo.getName(), abilityInfo);
this.abilities.put(abilityData.name(), abilityInfo);
} }
private AbilityData getAbilityData(Class<? extends Ability> abilityClass) throws AbilityException { protected AbilityInfo getAbilityInfo(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 {
try { try {
return abilityData.abilityLoader().newInstance(); return ((Class<? extends AbilityInfo>) ((ParameterizedType) abilityClass.getGenericSuperclass()).getActualTypeArguments()[0]).newInstance();
} catch (InstantiationException | IllegalAccessException e) { } catch (Exception e) {
throw new AbilityException(e); throw new AbilityException(e);
} }
} }
private AbilityConfig getAbilityConfig(Class<? extends Ability> abilityClass) throws AbilityException { private AbilityConfig getAbilityConfig(Class<? extends Ability> abilityClass) throws AbilityException {
try { 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) { } catch (Exception e) {
throw new AbilityException(e); throw new AbilityException(e);
} }
@ -339,8 +326,8 @@ public class AbilityManager extends Module {
return new ArrayList<>(this.abilities.values()); return new ArrayList<>(this.abilities.values());
} }
public List<Ability> getAbilities(Element element) { public List<AbilityInfo> getAbilities(Element element) {
return this.playerAbilitySet.stream() return this.abilities.values().stream()
.filter(ability -> .filter(ability ->
{ {
if (ability.getElement().equals(element)) { if (ability.getElement().equals(element)) {

View file

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

View file

@ -1,7 +1,8 @@
package com.projectkorra.projectkorra.ability; package com.projectkorra.projectkorra.ability;
import com.projectkorra.projectkorra.ability.api.PlayerBindAbilityEvent; 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.AbilityEndEvent;
import com.projectkorra.projectkorra.event.PlayerSwingEvent; import com.projectkorra.projectkorra.event.PlayerSwingEvent;
import com.projectkorra.projectkorra.module.Module; import com.projectkorra.projectkorra.module.Module;
@ -13,11 +14,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerItemHeldEvent; import org.bukkit.event.player.PlayerItemHeldEvent;
import java.util.HashMap; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
public class MultiAbilityManager extends Module { public class MultiAbilityManager extends Module {
@ -25,6 +22,7 @@ public class MultiAbilityManager extends Module {
private final AbilityManager abilityManager; private final AbilityManager abilityManager;
private final Map<String, MultiAbility> abilities = new HashMap<>(); 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, Class<? extends Ability>> playerMultiAbility = new HashMap<>();
private final Map<UUID, List<String>> playerAbilities = 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); this.abilityManager = ModuleManager.getModule(AbilityManager.class);
} }
public void registerAbility(Class<? extends Ability> abilityClass, AbilityData abilityData, MultiAbilityLoader multiAbilityLoader) { public void registerAbility(Class<? extends Ability> abilityClass, MultiAbilityInfo multiAbilityInfo) {
List<String> abilities = multiAbilityLoader.getAbilities().stream() List<Class<? extends Ability>> abilities = multiAbilityInfo.getAbilities();
.map(ability -> ability.getDeclaredAnnotation(AbilityData.class))
.map(AbilityData::name)
.collect(Collectors.toList());
// 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 @EventHandler
@ -74,6 +76,20 @@ public class MultiAbilityManager extends Module {
player.getInventory().setHeldItemSlot(0); 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 @EventHandler
public void onAbilityEnd(AbilityEndEvent event) { public void onAbilityEnd(AbilityEndEvent event) {
Ability ability = event.getAbility(); Ability ability = event.getAbility();
@ -124,9 +140,9 @@ public class MultiAbilityManager extends Module {
public class MultiAbility { public class MultiAbility {
private final Class<? extends Ability> abilityClass; private final Class<? extends Ability> abilityClass;
private final String abilityName; 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.abilityClass = abilityClass;
this.abilityName = abilityName; this.abilityName = abilityName;
this.abilities = abilities; this.abilities = abilities;

View file

@ -1,6 +1,6 @@
package com.projectkorra.projectkorra.ability; 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.Element;
import com.projectkorra.projectkorra.element.SubElement; import com.projectkorra.projectkorra.element.SubElement;
import com.projectkorra.projectkorra.module.Module; import com.projectkorra.projectkorra.module.Module;
@ -19,7 +19,7 @@ public class PassiveAbilityManager extends Module {
private final BendingPlayerManager bendingPlayerManager; private final BendingPlayerManager bendingPlayerManager;
private final AbilityManager abilityManager; 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() { private PassiveAbilityManager() {
super("Passive Ability"); super("Passive Ability");
@ -28,12 +28,12 @@ public class PassiveAbilityManager extends Module {
this.abilityManager = ModuleManager.getModule(AbilityManager.class); this.abilityManager = ModuleManager.getModule(AbilityManager.class);
} }
public void registerAbility(Class<? extends Ability> abilityClass, PassiveAbilityLoader passiveAbilityLoader) { public void registerAbility(Class<? extends Ability> abilityClass, PassiveAbilityInfo passiveAbilityInfo) {
this.abilities.put(abilityClass, passiveAbilityLoader); this.abilities.put(abilityClass, passiveAbilityInfo);
} }
public void registerPassives(Player player) { public void registerPassives(Player player) {
this.abilities.forEach((abilityClass, passiveAbilityLoader) -> { this.abilities.forEach((abilityClass, passiveAbilityInfo) -> {
if (!canUsePassive(player, abilityClass)) { if (!canUsePassive(player, abilityClass)) {
return; return;
} }
@ -42,7 +42,7 @@ public class PassiveAbilityManager extends Module {
return; return;
} }
if (!passiveAbilityLoader.isInstantiable()) { if (!passiveAbilityInfo.isInstantiable()) {
return; return;
} }
@ -53,13 +53,13 @@ public class PassiveAbilityManager extends Module {
public boolean canUsePassive(Player player, Class<? extends Ability> abilityClass) { public boolean canUsePassive(Player player, Class<? extends Ability> abilityClass) {
BendingPlayer bendingPlayer = this.bendingPlayerManager.getBendingPlayer(player); 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; return false;
} }
Element element = passiveAbilityLoader.getElement(); Element element = passiveAbilityInfo.getElement();
if (element instanceof SubElement) { if (element instanceof SubElement) {
element = ((SubElement) element).getParent(); element = ((SubElement) element).getParent();
@ -80,7 +80,7 @@ public class PassiveAbilityManager extends Module {
return true; return true;
} }
public PassiveAbilityLoader getPassiveAbility(Class<? extends Ability> abilityClass) { public PassiveAbilityInfo getPassiveAbility(Class<? extends Ability> abilityClass) {
return this.abilities.get(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.ArrayList;
import java.util.List; import java.util.List;
import com.projectkorra.projectkorra.ability.info.AbilityInfo;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.projectkorra.projectkorra.Element;
import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.GeneralMethods;
import com.projectkorra.projectkorra.ability.util.Collision; import com.projectkorra.projectkorra.ability.util.Collision;
import com.projectkorra.projectkorra.airbending.AirSpout; 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.configuration.configs.properties.AirPropertiesConfig;
import com.projectkorra.projectkorra.util.ParticleEffect; 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) { public AirAbility(final C config, final Player player) {
super(config, player); super(config, player);
@ -34,11 +34,6 @@ public abstract class AirAbility<C extends AbilityConfig> extends ElementalAbili
return false; return false;
} }
@Override
public Element getElement() {
return Element.AIR;
}
@Override @Override
public void handleCollision(final Collision collision) { public void handleCollision(final Collision collision) {
super.handleCollision(collision); super.handleCollision(collision);

View file

@ -1,12 +1,12 @@
package com.projectkorra.projectkorra.ability.api; package com.projectkorra.projectkorra.ability.api;
import java.util.Arrays; import com.projectkorra.projectkorra.GeneralMethods;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Stream;
import com.projectkorra.projectkorra.ability.Ability; 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.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.World.Environment; import org.bukkit.World.Environment;
@ -16,18 +16,18 @@ import org.bukkit.block.data.Waterlogged;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import com.projectkorra.projectkorra.GeneralMethods; import java.util.Arrays;
import com.projectkorra.projectkorra.configuration.ConfigManager; import java.util.HashSet;
import com.projectkorra.projectkorra.configuration.configs.abilities.AbilityConfig; import java.util.List;
import com.projectkorra.projectkorra.configuration.configs.properties.EarthPropertiesConfig; import java.util.Set;
import com.projectkorra.projectkorra.configuration.configs.properties.WaterPropertiesConfig; import java.util.stream.Stream;
/** /**
* ElementalAbility is used to hold methods that should be accessible by every * 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 * Air, Water, Earth, Fire, Chi, or AvatarAbility. This class is mainly used to
* keep CoreAbility from becoming too cluttered. * 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[] 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[] 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 }; 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.element.Element;
import com.projectkorra.projectkorra.player.BendingPlayer; import com.projectkorra.projectkorra.player.BendingPlayer;
import java.lang.annotation.ElementType; public interface AbilityInfo {
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface AbilityData {
/** /**
* The name of the ability is used for commands such as <b>/bending * 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 * @return Returns the name of the ability
*/ */
String name(); String getName();
/** Element getElement();
* @return The class used to register this ability.
*/
Class<? extends AbilityLoader> abilityLoader();
/** /**
* @return true if this is a hidden ability. * @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 * @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. * @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; 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 * Called when the ability is loaded by PK. This is where the developer
* registers Listeners and Permissions. * registers Listeners and Permissions.
*/ */
public abstract void load(); void load();
/** /**
* Called whenever ProjectKorra stops and the ability is unloaded. This * 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 * Any CoreAbility instances do not need to be cleaned up by stop method, as
* they will be cleaned up by {@link AbilityManager#removeAll()}. * 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 com.projectkorra.projectkorra.ability.ComboAbilityManager;
import java.util.LinkedList; import java.util.LinkedList;
public abstract class ComboAbilityLoader extends AbilityLoader { public interface ComboAbilityInfo extends AbilityInfo {
/** /**
* Returns the list of abilities which constitute the combo. * Returns the list of abilities which constitute the combo.
* *
* @return A {@link LinkedList} containing the combo's steps. * @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, * 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 * @return false if this passive should always be on
*/ */
public abstract boolean isInstantiable(); boolean isInstantiable();
/** /**
* This is used if the passive should progress * This is used if the passive should progress
* *
* @return false if progress() shouldn't be called; * @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.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
public class AbilityRegistery<T> { public class AbilityRegistry<T> {
private final Plugin plugin; private final Plugin plugin;
private ClassLoader loader; private ClassLoader loader;
private JarFile jar; private JarFile jar;
private String path; private String path;
public AbilityRegistery(final JavaPlugin plugin, final String packageBase) { public AbilityRegistry(final JavaPlugin plugin, final String packageBase) {
this.plugin = plugin; this.plugin = plugin;
this.loader = plugin.getClass().getClassLoader(); this.loader = plugin.getClass().getClassLoader();
this.path = packageBase.replace('.', '/'); this.path = packageBase.replace('.', '/');

View file

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

View file

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