public boolean loadCustomListeners() {
        killstreakListeners.clear();
        victoryListeners.clear();
        boolean errors = false;
        File listenerDir = new File(OITG.instance.getDataFolder() + File.separator + "listeners");
        listenerDir.mkdirs();
        ClassLoader cl;
        try {
            cl = new URLClassLoader(new URL[] {listenerDir.toURI().toURL()}, KillstreakListener.class.getClassLoader());
        } catch (MalformedURLException e) {
            OITG.instance.logSevere("Error while loading custom listeners: failed to resolve URL for class loader.");
            return false;
        }
        for (File file : listenerDir.listFiles()) {
            if (!file.getName().endsWith(".class"))
                continue;
            String fileName = file.getName().substring(0, file.getName().lastIndexOf("."));
            @SuppressWarnings("rawtypes")
            Class clazz = null;
            try {
                clazz = cl.loadClass(fileName);
            } catch (ClassNotFoundException e) {
                errors = true;
                OITG.instance.logWarning("Failed to load custom listener \"" + fileName + "\".");
                e.printStackTrace();
                continue;
            }
            Object listener;
            try {
                listener = clazz.newInstance();
            } catch (InstantiationException e) {
                OITG.instance.logWarning("Failed to load custom listener \"" + fileName + "\".");
                e.printStackTrace();
                continue;
            } catch (IllegalAccessException e) {
                errors = true;
                OITG.instance.logWarning("Failed to load custom listener \"" + fileName + "\".");
                e.printStackTrace();
                continue;
            }
            if (listener instanceof KillstreakListener) {
                killstreakListeners.add((KillstreakListener) listener);
                OITG.instance.logInfo("Loaded killstreak listener: " + listener.getClass().getName());
                continue;
            }
            if (listener instanceof VictoryListener) {
                victoryListeners.add((VictoryListener) listener);
                OITG.instance.logInfo("Loaded victory listener: " + listener.getClass().getName());
                continue;
            }
            OITG.instance.logWarning("Failed to load custom listener \"" + fileName + "\" - class does not " +
                    "implement KillstreakListener or VictoryListener.");
            errors = true;
        }
        return !errors;
    }