mirror of
https://github.com/TotalFreedomMC/TF-ProjectKorra.git
synced 2025-02-10 19:23:52 +00:00
New MultiAbilityManager
This commit is contained in:
parent
b9db7a3d68
commit
ad148a7881
7 changed files with 233 additions and 26 deletions
|
@ -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();
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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) {
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue