mirror of
https://github.com/TotalFreedomMC/TF-ProjectKorra.git
synced 2025-02-11 03:30:10 +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.Map;
|
||||||
import java.util.UUID;
|
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.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.GameMode;
|
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.DensityShift;
|
||||||
import com.projectkorra.projectkorra.earthbending.passive.EarthPassive;
|
import com.projectkorra.projectkorra.earthbending.passive.EarthPassive;
|
||||||
import com.projectkorra.projectkorra.earthbending.passive.FerroControl;
|
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.Blaze;
|
||||||
import com.projectkorra.projectkorra.firebending.BlazeArc;
|
import com.projectkorra.projectkorra.firebending.BlazeArc;
|
||||||
import com.projectkorra.projectkorra.firebending.BlazeRing;
|
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)
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
public void onPlayerSwing(final PlayerInteractEvent event) {
|
public void onPlayerSwing(final PlayerInteractEvent event) {
|
||||||
final Player player = event.getPlayer();
|
final Player player = event.getPlayer();
|
||||||
|
|
|
@ -4,7 +4,6 @@ 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.loader.*;
|
||||||
import com.projectkorra.projectkorra.ability.util.MultiAbilityManager;
|
|
||||||
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;
|
||||||
|
@ -17,6 +16,8 @@ import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.ParameterizedType;
|
import java.lang.reflect.ParameterizedType;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
@ -24,7 +25,8 @@ import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class AbilityManager extends Module {
|
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 Set<Ability> abilitySet = new HashSet<>();
|
||||||
private final Map<UUID, Map<Class<? extends Ability>, LinkedList<Ability>>> abilityMap = new HashMap<>();
|
private final Map<UUID, Map<Class<? extends Ability>, LinkedList<Ability>>> abilityMap = new HashMap<>();
|
||||||
|
@ -32,7 +34,8 @@ public class AbilityManager extends Module {
|
||||||
public AbilityManager() {
|
public AbilityManager() {
|
||||||
super("Ability");
|
super("Ability");
|
||||||
|
|
||||||
this.comboManager = ModuleManager.getModule(ComboManager.class);
|
this.comboAbilityManager = ModuleManager.getModule(ComboAbilityManager.class);
|
||||||
|
this.multiAbilityManager = ModuleManager.getModule(MultiAbilityManager.class);
|
||||||
|
|
||||||
runTimer(() -> {
|
runTimer(() -> {
|
||||||
for (Ability ability : abilitySet) {
|
for (Ability ability : abilitySet) {
|
||||||
|
@ -137,7 +140,7 @@ public class AbilityManager extends Module {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.comboManager.registerAbility(abilityClass, abilityData, comboAbilityLoader);
|
this.comboAbilityManager.registerAbility(abilityClass, abilityData, comboAbilityLoader);
|
||||||
|
|
||||||
// ComboManager.getComboAbilities().put(abilityName, new ComboManager.ComboAbilityInfo(abilityName, comboAbilityLoader.getCombination(), ));
|
// ComboManager.getComboAbilities().put(abilityName, new ComboManager.ComboAbilityInfo(abilityName, comboAbilityLoader.getCombination(), ));
|
||||||
// ComboManager.getDescriptions().put(abilityName, abilityConfig.Description);
|
// ComboManager.getDescriptions().put(abilityName, abilityConfig.Description);
|
||||||
|
@ -147,7 +150,9 @@ public class AbilityManager extends Module {
|
||||||
if (abilityLoader instanceof MultiAbilityLoader) {
|
if (abilityLoader instanceof MultiAbilityLoader) {
|
||||||
MultiAbilityLoader multiAbilityLoader = (MultiAbilityLoader) abilityLoader;
|
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) {
|
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) {
|
public void startAbility(Ability ability) {
|
||||||
if (ability.isStarted()) {
|
if (ability.isStarted()) {
|
||||||
return;
|
return;
|
||||||
|
@ -238,7 +255,7 @@ public class AbilityManager extends Module {
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Ability> getAbilities(Element element) {
|
public List<Ability> getAbilities(Element element) {
|
||||||
this.abilitySet.stream()
|
return this.abilitySet.stream()
|
||||||
.filter(ability ->
|
.filter(ability ->
|
||||||
{
|
{
|
||||||
if (ability.getElement().equals(element)) {
|
if (ability.getElement().equals(element)) {
|
||||||
|
|
|
@ -23,19 +23,21 @@ import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class ComboManager extends Module {
|
public class ComboAbilityManager extends Module {
|
||||||
|
|
||||||
private final BendingPlayerManager bendingPlayerManager;
|
private final BendingPlayerManager bendingPlayerManager;
|
||||||
|
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> comboAbilities = new ArrayList<>();
|
private final List<ComboAbilityInfo> comboAbilities = new ArrayList<>();
|
||||||
|
|
||||||
private final long combinationMax = 8;
|
private final long combinationMax = 8;
|
||||||
|
|
||||||
private ComboManager() {
|
private ComboAbilityManager() {
|
||||||
super("Combo Ability");
|
super("Combo Ability");
|
||||||
|
|
||||||
this.bendingPlayerManager = ModuleManager.getModule(BendingPlayerManager.class);
|
this.bendingPlayerManager = ModuleManager.getModule(BendingPlayerManager.class);
|
||||||
|
this.abilityManager = ModuleManager.getModule(AbilityManager.class);
|
||||||
|
|
||||||
this.comboAbilities.clear();
|
this.comboAbilities.clear();
|
||||||
}
|
}
|
||||||
|
@ -69,16 +71,7 @@ public class ComboManager extends Module {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
this.abilityManager.createAbility(player, comboAbilityInfo.abilityClass);
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private ComboAbilityInfo getComboAbiblity(LinkedList<Combination> recentlyUsed) {
|
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;
|
package com.projectkorra.projectkorra.ability.loader;
|
||||||
|
|
||||||
import com.projectkorra.projectkorra.ability.ComboManager;
|
import com.projectkorra.projectkorra.ability.ComboAbilityManager;
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
@ -11,5 +11,5 @@ public abstract class ComboAbilityLoader extends AbilityLoader {
|
||||||
*
|
*
|
||||||
* @return A {@link LinkedList} containing the combo's steps.
|
* @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;
|
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.ArrayList;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public abstract class MultiAbilityLoader extends AbilityLoader {
|
public abstract class MultiAbilityLoader extends AbilityLoader {
|
||||||
|
|
||||||
|
@ -14,5 +17,5 @@ public abstract class MultiAbilityLoader extends AbilityLoader {
|
||||||
*
|
*
|
||||||
* @return a list of sub MultiAbilities
|
* @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