package be.isach.ultracosmetics.version; import be.isach.ultracosmetics.cosmetics.pets.IPlayerFollower; import be.isach.ultracosmetics.cosmetics.pets.Pet; import be.isach.ultracosmetics.util.ReflectionUtils; import be.isach.ultracosmetics.util.ServerVersion; import org.bukkit.entity.Player; import java.lang.reflect.Constructor; public class VersionManager { private final String PACKAGE = "be.isach.ultracosmetics"; private IModule module; private ServerVersion serverVersion; private IEntityUtil entityUtil; private IActionBar actionBarUtil; private IItemGlower itemGlower; private IFireworkFactory fireworkFactory; private IMounts mounts; private IPets pets; private IMorphs morphs; private Constructor<? extends IPlayerFollower> playerFollowerConstructor; private Constructor<? extends AAnvilGUI> anvilGUIConstructor; private IPathfinderUtil pathfinderUtil; public VersionManager(ServerVersion serverVersion) { this.serverVersion = serverVersion; } @SuppressWarnings("unchecked") public void load() throws ReflectiveOperationException { module = loadModule("Module"); entityUtil = loadModule("EntityUtil"); actionBarUtil = loadModule("ActionBar"); itemGlower = loadModule("ItemGlower"); pathfinderUtil = loadModule("PathfinderUtil"); fireworkFactory = loadModule("FireworkFactory"); mounts = loadModule("Mounts"); pets = loadModule("Pets"); morphs = loadModule("Morphs"); anvilGUIConstructor = (Constructor<AAnvilGUI>) ReflectionUtils.getConstructor(Class.forName(PACKAGE + "." + serverVersion + ".AnvilGUI") , Player.class , AAnvilGUI.AnvilClickEventHandler.class); anvilGUIConstructor.setAccessible(true); playerFollowerConstructor = (Constructor<? extends IPlayerFollower>) ReflectionUtils.getConstructor(Class.forName(PACKAGE + "." + serverVersion + ".pets.PlayerFollower") , Pet.class , Player.class); playerFollowerConstructor.setAccessible(true); } @SuppressWarnings("unchecked") private <T> T loadModule(String name) throws ReflectiveOperationException{ return (T) ReflectionUtils .instantiateObject(Class.forName(PACKAGE + "." + serverVersion + "." + name)); } public IEntityUtil getEntityUtil() { return entityUtil; } public IActionBar getActionBarUtil() { return actionBarUtil; } public IItemGlower getItemGlower() { return itemGlower; } public IFireworkFactory getFireworkFactory() { return fireworkFactory; } public IMounts getMounts() { return mounts; } public AAnvilGUI newAnvilGUI(Player player, AAnvilGUI.AnvilClickEventHandler handler){ try { return anvilGUIConstructor.newInstance(player , handler); } catch (ReflectiveOperationException e) { e.printStackTrace(); return null; } } public IPlayerFollower newPlayerFollower(Pet pet , Player player){ try { return playerFollowerConstructor.newInstance(pet , player); } catch (ReflectiveOperationException e) { e.printStackTrace(); return null; } } public IPathfinderUtil getPathfinderUtil() { return pathfinderUtil; } public IPets getPets() { return pets; } public IMorphs getMorphs() { return morphs; } public IModule getModule() { return module; } }