New MultiAbilityManager

This commit is contained in:
jayoevans 2019-10-26 13:33:38 +10:00
parent b9db7a3d68
commit ad148a7881
7 changed files with 233 additions and 26 deletions

View file

@ -7,6 +7,9 @@ import java.util.List;
import java.util.Map;
import java.util.UUID;
import com.projectkorra.projectkorra.event.*;
import com.projectkorra.projectkorra.module.ModuleManager;
import com.projectkorra.projectkorra.player.BendingPlayerManager;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
@ -195,10 +198,6 @@ import com.projectkorra.projectkorra.earthbending.metal.MetalClips;
import com.projectkorra.projectkorra.earthbending.passive.DensityShift;
import com.projectkorra.projectkorra.earthbending.passive.EarthPassive;
import com.projectkorra.projectkorra.earthbending.passive.FerroControl;
import com.projectkorra.projectkorra.event.EntityBendingDeathEvent;
import com.projectkorra.projectkorra.event.HorizontalVelocityChangeEvent;
import com.projectkorra.projectkorra.event.PlayerChangeElementEvent;
import com.projectkorra.projectkorra.event.PlayerJumpEvent;
import com.projectkorra.projectkorra.firebending.Blaze;
import com.projectkorra.projectkorra.firebending.BlazeArc;
import com.projectkorra.projectkorra.firebending.BlazeRing;
@ -1615,6 +1614,28 @@ public class PKListener implements Listener {
}
}
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
Player player = event.getPlayer();
if (event.getHand() != EquipmentSlot.HAND) {
return;
}
if (event.getAction() != Action.LEFT_CLICK_BLOCK && event.getAction() != Action.LEFT_CLICK_AIR) {
return;
}
if (event.getAction() == Action.LEFT_CLICK_BLOCK && event.isCancelled()) {
return;
}
com.projectkorra.projectkorra.player.BendingPlayer bendingPlayer = ModuleManager.getModule(BendingPlayerManager.class).getBendingPlayer(player);
PlayerSwingEvent playerSwingEvent = new PlayerSwingEvent(player, bendingPlayer, bendingPlayer.getBoundAbility());
ProjectKorra.plugin.getServer().getPluginManager().callEvent(playerSwingEvent);
}
@EventHandler(priority = EventPriority.NORMAL)
public void onPlayerSwing(final PlayerInteractEvent event) {
final Player player = event.getPlayer();

View file

@ -4,7 +4,6 @@ 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.MultiAbilityManager;
import com.projectkorra.projectkorra.configuration.ConfigManager;
import com.projectkorra.projectkorra.configuration.configs.abilities.AbilityConfig;
import com.projectkorra.projectkorra.element.Element;
@ -17,6 +16,8 @@ import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.ParameterizedType;
import java.text.SimpleDateFormat;
import java.util.*;
@ -24,7 +25,8 @@ import java.util.stream.Collectors;
public class AbilityManager extends Module {
private final ComboManager comboManager;
private final ComboAbilityManager comboAbilityManager;
private final MultiAbilityManager multiAbilityManager;
private final Set<Ability> abilitySet = new HashSet<>();
private final Map<UUID, Map<Class<? extends Ability>, LinkedList<Ability>>> abilityMap = new HashMap<>();
@ -32,7 +34,8 @@ public class AbilityManager extends Module {
public AbilityManager() {
super("Ability");
this.comboManager = ModuleManager.getModule(ComboManager.class);
this.comboAbilityManager = ModuleManager.getModule(ComboAbilityManager.class);
this.multiAbilityManager = ModuleManager.getModule(MultiAbilityManager.class);
runTimer(() -> {
for (Ability ability : abilitySet) {
@ -137,7 +140,7 @@ public class AbilityManager extends Module {
return;
}
this.comboManager.registerAbility(abilityClass, abilityData, comboAbilityLoader);
this.comboAbilityManager.registerAbility(abilityClass, abilityData, comboAbilityLoader);
// ComboManager.getComboAbilities().put(abilityName, new ComboManager.ComboAbilityInfo(abilityName, comboAbilityLoader.getCombination(), ));
// ComboManager.getDescriptions().put(abilityName, abilityConfig.Description);
@ -147,7 +150,9 @@ public class AbilityManager extends Module {
if (abilityLoader instanceof MultiAbilityLoader) {
MultiAbilityLoader multiAbilityLoader = (MultiAbilityLoader) abilityLoader;
MultiAbilityManager.multiAbilityList.add(new MultiAbilityManager.MultiAbilityInfo(abilityName, multiAbilityLoader.getMultiAbilities()));
this.multiAbilityManager.registerAbility(abilityClass, abilityData, multiAbilityLoader);
// MultiAbilityManager.multiAbilityList.add(new MultiAbilityManager.MultiAbilityInfo(abilityName, multiAbilityLoader.getMultiAbilities()));
}
if (abilityLoader instanceof PassiveAbilityLoader) {
@ -159,6 +164,18 @@ public class AbilityManager extends Module {
}
}
public <T extends Ability> T createAbility(Player player, Class<T> abilityClass) {
try {
Constructor<T> constructor = abilityClass.getDeclaredConstructor(Player.class);
return constructor.newInstance(player);
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
public void startAbility(Ability ability) {
if (ability.isStarted()) {
return;
@ -238,7 +255,7 @@ public class AbilityManager extends Module {
}
public List<Ability> getAbilities(Element element) {
this.abilitySet.stream()
return this.abilitySet.stream()
.filter(ability ->
{
if (ability.getElement().equals(element)) {

View file

@ -23,19 +23,21 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
public class ComboManager extends Module {
public class ComboAbilityManager extends Module {
private final BendingPlayerManager bendingPlayerManager;
private final AbilityManager abilityManager;
private final Map<UUID, LinkedList<Combination>> recentlyUsed = new HashMap<>();
private final List<ComboAbilityInfo> comboAbilities = new ArrayList<>();
private final long combinationMax = 8;
private ComboManager() {
private ComboAbilityManager() {
super("Combo Ability");
this.bendingPlayerManager = ModuleManager.getModule(BendingPlayerManager.class);
this.abilityManager = ModuleManager.getModule(AbilityManager.class);
this.comboAbilities.clear();
}
@ -69,16 +71,7 @@ public class ComboManager extends Module {
return;
}
try {
Class<? extends Ability> abilityClass = comboAbilityInfo.abilityClass;
Constructor<? extends Ability> constructor = abilityClass.getDeclaredConstructor(Player.class);
Ability ability = constructor.newInstance(player);
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
this.abilityManager.createAbility(player, comboAbilityInfo.abilityClass);
}
private ComboAbilityInfo getComboAbiblity(LinkedList<Combination> recentlyUsed) {

View file

@ -0,0 +1,135 @@
package com.projectkorra.projectkorra.ability;
import com.projectkorra.projectkorra.ability.api.PlayerBindAbilityEvent;
import com.projectkorra.projectkorra.ability.loader.MultiAbilityLoader;
import com.projectkorra.projectkorra.event.AbilityEndEvent;
import com.projectkorra.projectkorra.event.PlayerSwingEvent;
import com.projectkorra.projectkorra.module.Module;
import com.projectkorra.projectkorra.module.ModuleManager;
import com.projectkorra.projectkorra.player.BendingPlayer;
import com.projectkorra.projectkorra.player.BendingPlayerManager;
import org.bukkit.ChatColor;
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;
public class MultiAbilityManager extends Module {
private final BendingPlayerManager bendingPlayerManager;
private final AbilityManager abilityManager;
private final Map<String, MultiAbility> abilities = new HashMap<>();
private final Map<UUID, Class<? extends Ability>> playerMultiAbility = new HashMap<>();
private final Map<UUID, List<String>> playerAbilities = new HashMap<>();
private MultiAbilityManager() {
super("Multi Ability");
this.bendingPlayerManager = ModuleManager.getModule(BendingPlayerManager.class);
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());
// TODO Exception handling for multi abilities with missing AbilityData annotations
MultiAbility multiAbility = new MultiAbility(abilityClass, abilityData.name(), abilities);
this.abilities.put(abilityData.name(), multiAbility);
}
@EventHandler
public void onSwing(PlayerSwingEvent event) {
Player player = event.getPlayer();
BendingPlayer bendingPlayer = event.getBendingPlayer();
String abilityName = event.getAbilityName();
MultiAbility multiAbility = this.abilities.get(abilityName);
if (multiAbility == null) {
return;
}
this.playerMultiAbility.put(player.getUniqueId(), multiAbility.abilityClass);
this.playerAbilities.put(player.getUniqueId(), bendingPlayer.getAbilities());
Ability ability = this.abilityManager.createAbility(player, multiAbility.abilityClass);
String[] abilities = multiAbility.abilities.stream()
.filter(name -> player.hasPermission("bending.ability." + multiAbility.abilityName + "." + name))
.toArray(String[]::new);
bendingPlayer.setAbilities(abilities);
player.getInventory().setHeldItemSlot(0);
}
@EventHandler
public void onAbilityEnd(AbilityEndEvent event) {
Ability ability = event.getAbility();
Player player = ability.getPlayer();
BendingPlayer bendingPlayer = this.bendingPlayerManager.getBendingPlayer(player);
Class<? extends Ability> multiAbility = this.playerMultiAbility.get(player.getUniqueId());
if (multiAbility == null || !ability.getClass().equals(multiAbility)) {
return;
}
this.playerMultiAbility.remove(player.getUniqueId());
List<String> abilities = this.playerAbilities.remove(player.getUniqueId());
bendingPlayer.setAbilities(abilities.toArray(new String[0]));
}
@EventHandler
public void onSlotChange(PlayerItemHeldEvent event) {
Player player = event.getPlayer();
BendingPlayer bendingPlayer = this.bendingPlayerManager.getBendingPlayer(player);
if (!this.playerAbilities.containsKey(player.getUniqueId())) {
return;
}
int abilities = bendingPlayer.getAbilities().size();
if (event.getNewSlot() < abilities) {
return;
}
event.setCancelled(true);
}
@EventHandler
public void onPlayerBindAbility(PlayerBindAbilityEvent event) {
if (!this.playerAbilities.containsKey(event.getPlayer().getUniqueId())) {
return;
}
event.setCancelled(true);
event.setCancelMessage(ChatColor.RED + "You can't edit your binds right now!");
}
public class MultiAbility {
private final Class<? extends Ability> abilityClass;
private final String abilityName;
private final List<String> abilities;
MultiAbility(Class<? extends Ability> abilityClass, String abilityName, List<String> abilities) {
this.abilityClass = abilityClass;
this.abilityName = abilityName;
this.abilities = abilities;
}
}
}

View file

@ -1,6 +1,6 @@
package com.projectkorra.projectkorra.ability.loader;
import com.projectkorra.projectkorra.ability.ComboManager;
import com.projectkorra.projectkorra.ability.ComboAbilityManager;
import java.util.LinkedList;
@ -11,5 +11,5 @@ public abstract class ComboAbilityLoader extends AbilityLoader {
*
* @return A {@link LinkedList} containing the combo's steps.
*/
public abstract LinkedList<ComboManager.Combination> getCombination();
public abstract LinkedList<ComboAbilityManager.Combination> getCombination();
}

View file

@ -1,8 +1,11 @@
package com.projectkorra.projectkorra.ability.loader;
import com.projectkorra.projectkorra.ability.util.MultiAbilityManager;
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 {
@ -14,5 +17,5 @@ public abstract class MultiAbilityLoader extends AbilityLoader {
*
* @return a list of sub MultiAbilities
*/
public abstract ArrayList<MultiAbilityManager.MultiAbilityInfoSub> getMultiAbilities();
public abstract List<Class<? extends Ability>> getAbilities();
}

View file

@ -0,0 +1,38 @@
package com.projectkorra.projectkorra.event;
import com.projectkorra.projectkorra.player.BendingPlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
public class PlayerSwingEvent extends PlayerEvent {
private static final HandlerList HANDLER_LIST = new HandlerList();
private final BendingPlayer bendingPlayer;
private final String abilityName;
public PlayerSwingEvent(Player player, BendingPlayer bendingPlayer, String abilityName) {
super(player);
this.bendingPlayer = bendingPlayer;
this.abilityName = abilityName;
}
public BendingPlayer getBendingPlayer() {
return this.bendingPlayer;
}
public String getAbilityName() {
return this.abilityName;
}
@Override
public HandlerList getHandlers() {
return HANDLER_LIST;
}
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
}