Added stdinstance plugin and a ton of plugin stuff.

This commit is contained in:
Andrew
2013-02-20 08:32:26 -06:00
parent 6e5017e48b
commit f71479ec33
17 changed files with 614 additions and 7 deletions

View File

@ -44,6 +44,61 @@ InstanceList *Instance::instList()
return NULL;
}
QString Instance::minecraftDir() const
{
QFileInfo mcDir(PathCombine(rootDir(), "minecraft"));
QFileInfo dotMCDir(PathCombine(rootDir(), ".minecraft"));
if (dotMCDir.exists() && !mcDir.exists())
{
return dotMCDir.path();
}
else
{
return mcDir.path();
}
}
QString Instance::binDir() const
{
return PathCombine(minecraftDir(), "bin");
}
QString Instance::savesDir() const
{
return PathCombine(minecraftDir(), "saves");
}
QString Instance::mlModsDir() const
{
return PathCombine(minecraftDir(), "mods");
}
QString Instance::coreModsDir() const
{
return PathCombine(minecraftDir(), "coremods");
}
QString Instance::resourceDir() const
{
return PathCombine(minecraftDir(), "resources");
}
QString Instance::screenshotsDir() const
{
return PathCombine(minecraftDir(), "screenshots");
}
QString Instance::texturePacksDir() const
{
return PathCombine(minecraftDir(), "texturepacks");
}
QString Instance::mcJar() const
{
return PathCombine(binDir(), "minecraft.jar");
}
QVariant Instance::getField(const QString &name, QVariant defVal) const
{
return config.get(name, defVal);

View File

@ -214,6 +214,51 @@ public:
{ setField("lastLaunchTime", val); }
////// Directories //////
//! Gets the path to the instance's minecraft folder.
QString minecraftDir() const;
/*!
* \brief Gets the path to the instance's instance mods folder.
* This is the folder where the jar mods are kept.
*/
QString instModsDir() const;
//! Gets the path to the instance's bin folder.
QString binDir() const;
//! Gets the path to the instance's saves folder.
QString savesDir() const;
//! Gets the path to the instance's mods folder. (.minecraft/mods)
QString mlModsDir() const;
//! Gets the path to the instance's coremods folder.
QString coreModsDir() const;
//! Gets the path to the instance's resources folder.
QString resourceDir() const;
//! Gets the path to the instance's screenshots folder.
QString screenshotsDir() const;
//! Gets the path to the instance's texture packs folder.
QString texturePacksDir() const;
////// Files //////
//! Gets the path to the instance's minecraft.jar
QString mcJar() const;
//! Gets the path to the instance's mcbackup.jar.
QString mcBackup() const;
//! Gets the path to the instance's config file.
QString configFile() const;
//! Gets the path to the instance's modlist file.
QString modListFile() const;
////// Settings //////
//// Java Settings ////

View File

@ -37,9 +37,7 @@ public:
friend class InstanceLoader;
/*!
* \brief Gets the ID for this instance type.
* By default this is the name of the Instance class that this type
* creates, but this can be changed by overriding this function.
* \brief Gets the ID for this instance type.
* The type ID should be unique as it is used to identify the type
* of instances when they are loaded.
* Changing this value at runtime results in undefined behavior.

View File

@ -0,0 +1,41 @@
/* Copyright 2013 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef INSTANCETYPEPLUGIN_H
#define INSTANCETYPEPLUGIN_H
#include <QList>
#include "data/inst/instancetype.h"
/*!
* \brief Interface for plugins that want to provide custom instance types.
*/
class InstanceTypePlugin
{
public:
/*!
* \brief Gets a QList containing the instance types that this plugin provides.
* These instance types are then registered with the InstanceLoader.
* The InstanceType objects should \e not be deleted by the plugin. Once they
* are registered, they belong to the InstanceLoader.
* \return A QList containing this plugin's instance types.
*/
virtual QList<InstanceType *> getInstanceTypes() = 0;
};
Q_DECLARE_INTERFACE(InstanceTypePlugin, "net.forkk.MultiMC.InstanceTypePlugin/0.1")
#endif // INSTANCETYPEPLUGIN_H

View File

@ -0,0 +1,96 @@
/* Copyright 2013 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "pluginmanager.h"
#include <QDir>
#include <QDirIterator>
#include <QFileInfo>
#include <QtPlugin>
#include "data/plugin/instancetypeplugin.h"
PluginManager PluginManager::manager;
PluginManager::PluginManager() :
QObject(NULL)
{
}
bool PluginManager::loadPlugins(QString pluginDir)
{
m_plugins.clear();
QDir dir(pluginDir);
QDirIterator iter(dir);
while (iter.hasNext())
{
QFileInfo pluginFile(dir.absoluteFilePath(iter.next()));
if (pluginFile.exists() && pluginFile.isFile())
{
QPluginLoader pluginLoader(pluginFile.absoluteFilePath());
pluginLoader.load();
QObject *plugin = pluginLoader.instance();
if (plugin)
{
qDebug(QString("Loaded plugin %1.").
arg(pluginFile.baseName()).toUtf8());
m_plugins.push_back(plugin);
}
else
{
qWarning(QString("Error loading plugin %1. Not a valid plugin.").
arg(pluginFile.baseName()).toUtf8());
}
}
}
return true;
}
bool PluginManager::initInstanceTypes()
{
for (int i = 0; i < m_plugins.count(); i++)
{
InstanceTypePlugin *plugin = qobject_cast<InstanceTypePlugin *>(m_plugins[i]);
if (plugin)
{
QList<InstanceType *> instanceTypes = plugin->getInstanceTypes();
for (int i = 0; i < instanceTypes.count(); i++)
{
InstanceLoader::InstTypeError error =
InstanceLoader::loader.registerInstanceType(instanceTypes[i]);
switch (error)
{
case InstanceLoader::TypeIDExists:
qWarning(QString("Instance type %1 already registered.").
arg(instanceTypes[i]->typeID()).toUtf8());
}
}
}
}
return true;
}
QObject *PluginManager::getPlugin(int index)
{
return m_plugins[index];
}

View File

@ -0,0 +1,71 @@
/* Copyright 2013 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef PLUGINMANAGER_H
#define PLUGINMANAGER_H
#include <QObject>
#include <QList>
#include <QPluginLoader>
/*!
* \brief This class is a singleton that manages loading plugins.
*/
class PluginManager : public QObject
{
Q_OBJECT
public:
/*!
* \brief Gets the plugin manager instance.
*/
static PluginManager &get() { return manager; }
/*!
* \brief Loads plugins from the given directory.
* This function does \e not initialize the plugins. It simply loads their
* classes. Use the init functions to initialize the various plugin types.
* \param The directory to load plugins from.
* \return True if successful. False on failure.
*/
bool loadPlugins(QString pluginDir);
/*!
* \brief Initializes the instance type plugins.
* \return True if successful. False on failure.
*/
bool initInstanceTypes();
/*!
* \brief Checks how many plugins are loaded.
* \return The number of plugins.
*/
int count() { return m_plugins.count(); }
/*!
* \brief Gets the plugin at the given index.
* \param index The index of the plugin to get.
* \return The plugin at the given index.
*/
QObject *getPlugin(int index);
private:
PluginManager();
QList<QObject *> m_plugins;
static PluginManager manager;
};
#endif // PLUGINMANAGER_H