mirror of
https://github.com/TotalFreedomMC/TF-ProjectKorra.git
synced 2025-02-11 03:30:10 +00:00
Fixed many errors with Ability, ComboAbility, MultiAbility, and PassiveAbility Managers
This commit is contained in:
parent
736998dd4a
commit
d44077f99b
23 changed files with 221 additions and 227 deletions
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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)) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 };
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
package com.projectkorra.projectkorra.ability.info;
|
||||
|
||||
public interface AvatarAbilityInfo extends AbilityInfo {
|
||||
|
||||
boolean requireAvatar();
|
||||
}
|
|
@ -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();
|
||||
}
|
|
@ -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();
|
||||
}
|
|
@ -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();
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
package com.projectkorra.projectkorra.ability.loader;
|
||||
|
||||
import com.projectkorra.projectkorra.element.Element;
|
||||
|
||||
public abstract class AbilityLoader {
|
||||
|
||||
public abstract Element getElement();
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
package com.projectkorra.projectkorra.ability.loader;
|
||||
|
||||
public abstract class AvatarAbilityLoader extends AbilityLoader {
|
||||
|
||||
public abstract boolean requireAvatar();
|
||||
}
|
|
@ -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();
|
||||
}
|
|
@ -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('.', '/');
|
|
@ -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>();
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue