From ad148a7881f26c37bbe068feb48ebad6d6579f32 Mon Sep 17 00:00:00 2001 From: jayoevans Date: Sat, 26 Oct 2019 13:33:38 +1000 Subject: [PATCH] New MultiAbilityManager --- .../projectkorra/projectkorra/PKListener.java | 29 +++- .../projectkorra/ability/AbilityManager.java | 29 +++- ...oManager.java => ComboAbilityManager.java} | 17 +-- .../ability/MultiAbilityManager.java | 135 ++++++++++++++++++ .../ability/loader/ComboAbilityLoader.java | 4 +- .../ability/loader/MultiAbilityLoader.java | 7 +- .../projectkorra/event/PlayerSwingEvent.java | 38 +++++ 7 files changed, 233 insertions(+), 26 deletions(-) rename src/com/projectkorra/projectkorra/ability/{ComboManager.java => ComboAbilityManager.java} (93%) create mode 100644 src/com/projectkorra/projectkorra/ability/MultiAbilityManager.java create mode 100644 src/com/projectkorra/projectkorra/event/PlayerSwingEvent.java diff --git a/src/com/projectkorra/projectkorra/PKListener.java b/src/com/projectkorra/projectkorra/PKListener.java index a328d6ba..01d2a961 100644 --- a/src/com/projectkorra/projectkorra/PKListener.java +++ b/src/com/projectkorra/projectkorra/PKListener.java @@ -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(); diff --git a/src/com/projectkorra/projectkorra/ability/AbilityManager.java b/src/com/projectkorra/projectkorra/ability/AbilityManager.java index 59450586..027b28b6 100644 --- a/src/com/projectkorra/projectkorra/ability/AbilityManager.java +++ b/src/com/projectkorra/projectkorra/ability/AbilityManager.java @@ -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 abilitySet = new HashSet<>(); private final Map, LinkedList>> 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 createAbility(Player player, Class abilityClass) { + try { + Constructor 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 getAbilities(Element element) { - this.abilitySet.stream() + return this.abilitySet.stream() .filter(ability -> { if (ability.getElement().equals(element)) { diff --git a/src/com/projectkorra/projectkorra/ability/ComboManager.java b/src/com/projectkorra/projectkorra/ability/ComboAbilityManager.java similarity index 93% rename from src/com/projectkorra/projectkorra/ability/ComboManager.java rename to src/com/projectkorra/projectkorra/ability/ComboAbilityManager.java index 186e55c0..df8aba6c 100644 --- a/src/com/projectkorra/projectkorra/ability/ComboManager.java +++ b/src/com/projectkorra/projectkorra/ability/ComboAbilityManager.java @@ -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> recentlyUsed = new HashMap<>(); private final List 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 abilityClass = comboAbilityInfo.abilityClass; - Constructor 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 recentlyUsed) { diff --git a/src/com/projectkorra/projectkorra/ability/MultiAbilityManager.java b/src/com/projectkorra/projectkorra/ability/MultiAbilityManager.java new file mode 100644 index 00000000..e7d5d5a5 --- /dev/null +++ b/src/com/projectkorra/projectkorra/ability/MultiAbilityManager.java @@ -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 abilities = new HashMap<>(); + + private final Map> playerMultiAbility = new HashMap<>(); + private final Map> playerAbilities = new HashMap<>(); + + private MultiAbilityManager() { + super("Multi Ability"); + + this.bendingPlayerManager = ModuleManager.getModule(BendingPlayerManager.class); + this.abilityManager = ModuleManager.getModule(AbilityManager.class); + } + + public void registerAbility(Class abilityClass, AbilityData abilityData, MultiAbilityLoader multiAbilityLoader) { + List 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 multiAbility = this.playerMultiAbility.get(player.getUniqueId()); + + if (multiAbility == null || !ability.getClass().equals(multiAbility)) { + return; + } + + this.playerMultiAbility.remove(player.getUniqueId()); + List 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 abilityClass; + private final String abilityName; + private final List abilities; + + MultiAbility(Class abilityClass, String abilityName, List abilities) { + this.abilityClass = abilityClass; + this.abilityName = abilityName; + this.abilities = abilities; + } + } +} diff --git a/src/com/projectkorra/projectkorra/ability/loader/ComboAbilityLoader.java b/src/com/projectkorra/projectkorra/ability/loader/ComboAbilityLoader.java index 9ada3858..beccd938 100644 --- a/src/com/projectkorra/projectkorra/ability/loader/ComboAbilityLoader.java +++ b/src/com/projectkorra/projectkorra/ability/loader/ComboAbilityLoader.java @@ -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 getCombination(); + public abstract LinkedList getCombination(); } diff --git a/src/com/projectkorra/projectkorra/ability/loader/MultiAbilityLoader.java b/src/com/projectkorra/projectkorra/ability/loader/MultiAbilityLoader.java index 0dc54aa9..efcf3e66 100644 --- a/src/com/projectkorra/projectkorra/ability/loader/MultiAbilityLoader.java +++ b/src/com/projectkorra/projectkorra/ability/loader/MultiAbilityLoader.java @@ -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 getMultiAbilities(); + public abstract List> getAbilities(); } diff --git a/src/com/projectkorra/projectkorra/event/PlayerSwingEvent.java b/src/com/projectkorra/projectkorra/event/PlayerSwingEvent.java new file mode 100644 index 00000000..d23001e4 --- /dev/null +++ b/src/com/projectkorra/projectkorra/event/PlayerSwingEvent.java @@ -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; + } +}