forked from teamnwah/openmw-tes3coop
Merge pull request #409 from TES3MP/0.6.3 while resolving conflicts
Conflicts: apps/openmw-mp/CMakeLists.txt apps/openmw-mp/Script/Functions/GUI.cpp apps/openmw-mp/Script/Functions/GUI.hpp apps/openmw-mp/Script/Functions/Items.hpp apps/openmw-mp/Script/Functions/Mechanics.cpp apps/openmw-mp/Script/Functions/Mechanics.hpp apps/openmw-mp/Script/Functions/Stats.cpp apps/openmw-mp/Script/Functions/Stats.hpp apps/openmw-mp/Script/ScriptFunctions.cpp apps/openmw-mp/Script/ScriptFunctions.hppsol2-server-rewrite
commit
e355dca4dd
@ -0,0 +1,84 @@
|
|||||||
|
#include "Shapeshift.hpp"
|
||||||
|
|
||||||
|
#include <components/openmw-mp/NetworkMessages.hpp>
|
||||||
|
#include <components/openmw-mp/Log.hpp>
|
||||||
|
|
||||||
|
#include <apps/openmw-mp/Script/ScriptFunctions.hpp>
|
||||||
|
#include <apps/openmw-mp/Networking.hpp>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
double ShapeshiftFunctions::GetScale(unsigned short pid) noexcept
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, 0.0f);
|
||||||
|
|
||||||
|
return player->scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ShapeshiftFunctions::IsWerewolf(unsigned short pid) noexcept
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, 0);
|
||||||
|
|
||||||
|
return player->isWerewolf;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *ShapeshiftFunctions::GetCreatureRefId(unsigned short pid) noexcept
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, 0);
|
||||||
|
|
||||||
|
return player->creatureRefId.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ShapeshiftFunctions::GetCreatureNameDisplayState(unsigned short pid) noexcept
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, 0);
|
||||||
|
|
||||||
|
return player->displayCreatureName;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShapeshiftFunctions::SetScale(unsigned short pid, double scale) noexcept
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, );
|
||||||
|
|
||||||
|
player->scale = scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShapeshiftFunctions::SetWerewolfState(unsigned short pid, bool isWerewolf) noexcept
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, );
|
||||||
|
|
||||||
|
player->isWerewolf = isWerewolf;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShapeshiftFunctions::SetCreatureRefId(unsigned short pid, const char *refId) noexcept
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, );
|
||||||
|
|
||||||
|
player->creatureRefId = refId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShapeshiftFunctions::SetCreatureNameDisplayState(unsigned short pid, bool displayState) noexcept
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, );
|
||||||
|
|
||||||
|
player->displayCreatureName = displayState;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShapeshiftFunctions::SendShapeshift(unsigned short pid)
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, );
|
||||||
|
|
||||||
|
mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_SHAPESHIFT)->setPlayer(player);
|
||||||
|
mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_SHAPESHIFT)->Send(false);
|
||||||
|
mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_SHAPESHIFT)->Send(true);
|
||||||
|
}
|
@ -0,0 +1,120 @@
|
|||||||
|
#ifndef OPENMW_SHAPESHIFTAPI_HPP
|
||||||
|
#define OPENMW_SHAPESHIFTAPI_HPP
|
||||||
|
|
||||||
|
#include "../Types.hpp"
|
||||||
|
|
||||||
|
#define SHAPESHIFTAPI \
|
||||||
|
{"GetScale", ShapeshiftFunctions::GetScale},\
|
||||||
|
{"IsWerewolf", ShapeshiftFunctions::IsWerewolf},\
|
||||||
|
{"GetCreatureRefId", ShapeshiftFunctions::GetCreatureRefId},\
|
||||||
|
{"GetCreatureNameDisplayState", ShapeshiftFunctions::GetCreatureNameDisplayState},\
|
||||||
|
\
|
||||||
|
{"SetScale", ShapeshiftFunctions::SetScale},\
|
||||||
|
{"SetWerewolfState", ShapeshiftFunctions::SetWerewolfState},\
|
||||||
|
{"SetCreatureRefId", ShapeshiftFunctions::SetCreatureRefId},\
|
||||||
|
{"SetCreatureNameDisplayState", ShapeshiftFunctions::SetCreatureNameDisplayState},\
|
||||||
|
\
|
||||||
|
{"SendShapeshift", ShapeshiftFunctions::SendShapeshift}
|
||||||
|
|
||||||
|
class ShapeshiftFunctions
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Get the scale of a player.
|
||||||
|
*
|
||||||
|
* \param pid The player ID.
|
||||||
|
* \return The scale.
|
||||||
|
*/
|
||||||
|
static double GetScale(unsigned short pid) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check whether a player is a werewolf.
|
||||||
|
*
|
||||||
|
* This is based on the last PlayerShapeshift packet received or sent for that player.
|
||||||
|
*
|
||||||
|
* \param pid The player ID.
|
||||||
|
* \return The werewolf state.
|
||||||
|
*/
|
||||||
|
static bool IsWerewolf(unsigned short pid) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Get the refId of the creature the player is disguised as.
|
||||||
|
*
|
||||||
|
* \param pid The player ID.
|
||||||
|
* \return The creature refId.
|
||||||
|
*/
|
||||||
|
static const char *GetCreatureRefId(unsigned short pid) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check whether a player's name is replaced by that of the creature they are
|
||||||
|
* disguised as when other players hover over them.
|
||||||
|
*
|
||||||
|
* This is based on the last PlayerShapeshift packet received or sent for that player.
|
||||||
|
*
|
||||||
|
* \param pid The player ID.
|
||||||
|
* \return The creature name display state.
|
||||||
|
*/
|
||||||
|
static bool GetCreatureNameDisplayState(unsigned short pid) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set the scale of a player.
|
||||||
|
*
|
||||||
|
* This changes the scale recorded for that player in the server memory, but
|
||||||
|
* does not by itself send a packet.
|
||||||
|
*
|
||||||
|
* \param pid The player ID.
|
||||||
|
* \param scale The new scale.
|
||||||
|
* \return void
|
||||||
|
*/
|
||||||
|
static void SetScale(unsigned short pid, double scale) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set the werewolf state of a player.
|
||||||
|
*
|
||||||
|
* This changes the werewolf state recorded for that player in the server memory, but
|
||||||
|
* does not by itself send a packet.
|
||||||
|
*
|
||||||
|
* \param pid The player ID.
|
||||||
|
* \param isWerewolf The new werewolf state.
|
||||||
|
* \return void
|
||||||
|
*/
|
||||||
|
static void SetWerewolfState(unsigned short pid, bool isWerewolf) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set the refId of the creature a player is disguised as.
|
||||||
|
*
|
||||||
|
* This changes the creature refId recorded for that player in the server memory, but
|
||||||
|
* does not by itself send a packet.
|
||||||
|
*
|
||||||
|
* \param pid The player ID.
|
||||||
|
* \param refId The creature refId.
|
||||||
|
* \param displaysCreatureName Whether the player's name appears as that of the creature
|
||||||
|
* when hovered over by others.
|
||||||
|
* \return void
|
||||||
|
*/
|
||||||
|
static void SetCreatureRefId(unsigned short pid, const char *refId) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set whether a player's name is replaced by that of the creature they are
|
||||||
|
* disguised as when other players hover over them.
|
||||||
|
*
|
||||||
|
* \param pid The player ID.
|
||||||
|
* \param displayState The creature name display state.
|
||||||
|
* \return void
|
||||||
|
*/
|
||||||
|
static void SetCreatureNameDisplayState(unsigned short pid, bool displayState) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Send a PlayerShapeshift packet about a player.
|
||||||
|
*
|
||||||
|
* This sends the packet to all players connected to the server. It is currently used
|
||||||
|
* only to communicate werewolf states.
|
||||||
|
*
|
||||||
|
* \param pid The player ID.
|
||||||
|
* \return void
|
||||||
|
*/
|
||||||
|
static void SendShapeshift(unsigned short pid);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //OPENMW_SHAPESHIFTAPI_HPP
|
@ -1,31 +0,0 @@
|
|||||||
set (MYGUI_RESOURCE_PLUGIN_SOURCES
|
|
||||||
plugin.hpp
|
|
||||||
plugin.cpp
|
|
||||||
plugin_export.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
set (MYGUI_RESOURCE_PLUGIN_LIBRARY
|
|
||||||
Plugin_MyGUI_OpenMW_Resources
|
|
||||||
)
|
|
||||||
|
|
||||||
add_definitions("-D_USRDLL -DMYGUI_BUILD_DLL")
|
|
||||||
|
|
||||||
add_library(${MYGUI_RESOURCE_PLUGIN_LIBRARY}
|
|
||||||
SHARED
|
|
||||||
${MYGUI_RESOURCE_PLUGIN_SOURCES}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
if(MSVC)
|
|
||||||
# from top-level CMakelists.txt:
|
|
||||||
# 4305 - Truncating value (double to float, for example)
|
|
||||||
set_target_properties(${MYGUI_RESOURCE_PLUGIN_LIBRARY} PROPERTIES COMPILE_FLAGS "/wd4305")
|
|
||||||
endif(MSVC)
|
|
||||||
endif(WIN32)
|
|
||||||
|
|
||||||
set_target_properties(${MYGUI_RESOURCE_PLUGIN_LIBRARY} PROPERTIES PREFIX "")
|
|
||||||
|
|
||||||
target_link_libraries(${MYGUI_RESOURCE_PLUGIN_LIBRARY}
|
|
||||||
${OGRE_LIBRARIES}
|
|
||||||
components
|
|
||||||
)
|
|
@ -1,183 +0,0 @@
|
|||||||
#include "plugin.hpp"
|
|
||||||
|
|
||||||
#include <MyGUI_LogManager.h>
|
|
||||||
#include <MyGUI_FactoryManager.h>
|
|
||||||
#include <MyGUI_ScrollBar.h>
|
|
||||||
#include <MyGUI_Gui.h>
|
|
||||||
#include <MyGUI_Window.h>
|
|
||||||
#include <MyGUI_LanguageManager.h>
|
|
||||||
|
|
||||||
#include <components/bsa/resources.hpp>
|
|
||||||
#include <components/files/configurationmanager.hpp>
|
|
||||||
#include <components/fontloader/fontloader.hpp>
|
|
||||||
|
|
||||||
#include <components/widgets/tags.hpp>
|
|
||||||
#include <components/widgets/widgets.hpp>
|
|
||||||
|
|
||||||
#include <OgreTextureManager.h>
|
|
||||||
#include <OgreHardwarePixelBuffer.h>
|
|
||||||
|
|
||||||
//FIXME: code duplication
|
|
||||||
namespace boost
|
|
||||||
{
|
|
||||||
struct FallbackMap {
|
|
||||||
std::map<std::string,std::string> mMap;
|
|
||||||
};
|
|
||||||
|
|
||||||
void validate(boost::any &v, std::vector<std::string> const &tokens, FallbackMap*, int)
|
|
||||||
{
|
|
||||||
if(v.empty())
|
|
||||||
{
|
|
||||||
v = boost::any(FallbackMap());
|
|
||||||
}
|
|
||||||
|
|
||||||
FallbackMap *map = boost::any_cast<FallbackMap>(&v);
|
|
||||||
|
|
||||||
for(std::vector<std::string>::const_iterator it=tokens.begin(); it != tokens.end(); ++it)
|
|
||||||
{
|
|
||||||
int sep = it->find(",");
|
|
||||||
if(sep < 1 || sep == (int)it->length()-1)
|
|
||||||
#if (BOOST_VERSION < 104200)
|
|
||||||
throw boost::program_options::validation_error("invalid value");
|
|
||||||
#else
|
|
||||||
throw boost::program_options::validation_error(boost::program_options::validation_error::invalid_option_value);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
std::string key(it->substr(0,sep));
|
|
||||||
std::string value(it->substr(sep+1));
|
|
||||||
|
|
||||||
if(map->mMap.find(key) == map->mMap.end())
|
|
||||||
{
|
|
||||||
map->mMap.insert(std::make_pair (key,value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace MyGUIPlugin
|
|
||||||
{
|
|
||||||
|
|
||||||
// Dummy - obsolete when using MyGUI git, because the ScrollBar there has autorepeat support added.
|
|
||||||
class MWScrollBar : public MyGUI::ScrollBar
|
|
||||||
{
|
|
||||||
MYGUI_RTTI_DERIVED(MWScrollBar)
|
|
||||||
};
|
|
||||||
|
|
||||||
const std::string& ResourcePlugin::getName() const
|
|
||||||
{
|
|
||||||
static const std::string name = "OpenMW resource plugin";
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourcePlugin::install()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
void ResourcePlugin::uninstall()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourcePlugin::registerResources()
|
|
||||||
{
|
|
||||||
boost::program_options::variables_map variables;
|
|
||||||
|
|
||||||
boost::program_options::options_description desc("Allowed options");
|
|
||||||
desc.add_options()
|
|
||||||
("data", boost::program_options::value<Files::PathContainer>()->default_value(Files::PathContainer(), "data")->multitoken()->composing())
|
|
||||||
("data-local", boost::program_options::value<std::string>()->default_value(""))
|
|
||||||
("fs-strict", boost::program_options::value<bool>()->implicit_value(true)->default_value(false))
|
|
||||||
("fallback-archive", boost::program_options::value<std::vector<std::string> >()->
|
|
||||||
default_value(std::vector<std::string>(), "fallback-archive")->multitoken())
|
|
||||||
("encoding", boost::program_options::value<std::string>()->default_value("win1252"))
|
|
||||||
("fallback", boost::program_options::value<boost::FallbackMap>()->default_value(boost::FallbackMap(), "")
|
|
||||||
->multitoken()->composing(), "fallback values");
|
|
||||||
|
|
||||||
boost::program_options::notify(variables);
|
|
||||||
|
|
||||||
Files::ConfigurationManager cfgManager;
|
|
||||||
cfgManager.readConfiguration(variables, desc);
|
|
||||||
|
|
||||||
std::vector<std::string> archives = variables["fallback-archive"].as<std::vector<std::string> >();
|
|
||||||
bool fsStrict = variables["fs-strict"].as<bool>();
|
|
||||||
|
|
||||||
Files::PathContainer dataDirs, dataLocal;
|
|
||||||
if (!variables["data"].empty()) {
|
|
||||||
dataDirs = Files::PathContainer(variables["data"].as<Files::PathContainer>());
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string local = variables["data-local"].as<std::string>();
|
|
||||||
if (!local.empty()) {
|
|
||||||
dataLocal.push_back(Files::PathContainer::value_type(local));
|
|
||||||
}
|
|
||||||
|
|
||||||
cfgManager.processPaths (dataDirs);
|
|
||||||
cfgManager.processPaths (dataLocal, true);
|
|
||||||
|
|
||||||
if (!dataLocal.empty())
|
|
||||||
dataDirs.insert (dataDirs.end(), dataLocal.begin(), dataLocal.end());
|
|
||||||
|
|
||||||
Files::Collections collections (dataDirs, !fsStrict);
|
|
||||||
|
|
||||||
Bsa::registerResources(collections, archives, true, fsStrict);
|
|
||||||
|
|
||||||
std::string encoding(variables["encoding"].as<std::string>());
|
|
||||||
std::cout << ToUTF8::encodingUsingMessage(encoding) << std::endl;
|
|
||||||
|
|
||||||
Gui::FontLoader loader(ToUTF8::calculateEncoding(encoding));
|
|
||||||
loader.loadAllFonts(false);
|
|
||||||
|
|
||||||
mFallbackMap = variables["fallback"].as<boost::FallbackMap>().mMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourcePlugin::registerWidgets()
|
|
||||||
{
|
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWScrollBar>("Widget");
|
|
||||||
|
|
||||||
Gui::registerAllWidgets();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourcePlugin::createTransparentBGTexture()
|
|
||||||
{
|
|
||||||
// This texture is manually created in OpenMW to be able to change its opacity at runtime in the options menu
|
|
||||||
Ogre::TexturePtr tex = Ogre::TextureManager::getSingleton().createManual(
|
|
||||||
"transparent.png",
|
|
||||||
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
|
|
||||||
Ogre::TEX_TYPE_2D,
|
|
||||||
1, 1,
|
|
||||||
0,
|
|
||||||
Ogre::PF_A8R8G8B8,
|
|
||||||
Ogre::TU_WRITE_ONLY);
|
|
||||||
std::vector<Ogre::uint32> buffer;
|
|
||||||
buffer.resize(1);
|
|
||||||
const float val = 0.7;
|
|
||||||
buffer[0] = (int(255*val) << 24) | (255 << 16) | (255 << 8) | 255;
|
|
||||||
memcpy(tex->getBuffer()->lock(Ogre::HardwareBuffer::HBL_DISCARD), &buffer[0], 1*4);
|
|
||||||
tex->getBuffer()->unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourcePlugin::initialize()
|
|
||||||
{
|
|
||||||
MYGUI_LOGGING("OpenMW_Resource_Plugin", Info, "initialize");
|
|
||||||
|
|
||||||
registerResources();
|
|
||||||
registerWidgets();
|
|
||||||
createTransparentBGTexture();
|
|
||||||
|
|
||||||
MyGUI::LanguageManager::getInstance().eventRequestTag = MyGUI::newDelegate(this, &ResourcePlugin::onRetrieveTag);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourcePlugin::shutdown()
|
|
||||||
{
|
|
||||||
/// \todo cleanup
|
|
||||||
|
|
||||||
MYGUI_LOGGING("OpenMW_Resource_Plugin", Info, "shutdown");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourcePlugin::onRetrieveTag(const MyGUI::UString& tag, MyGUI::UString& out)
|
|
||||||
{
|
|
||||||
if (!Gui::replaceTag(tag, out, mFallbackMap))
|
|
||||||
out = tag;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,52 +0,0 @@
|
|||||||
#ifndef OPENMW_MYGUI_RESOURCE_PLUGIN_H
|
|
||||||
#define OPENMW_MYGUI_RESOURCE_PLUGIN_H
|
|
||||||
|
|
||||||
#include <MyGUI_Plugin.h>
|
|
||||||
#include <MyGUI_UString.h>
|
|
||||||
|
|
||||||
namespace MyGUIPlugin
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MyGUI plugin used to register Morrowind resources, custom widgets used in OpenMW, and load Morrowind fonts.
|
|
||||||
* @paragraph The plugin isn't used in OpenMW itself, but it is useful with the standalone MyGUI tools. To use it,
|
|
||||||
* change EditorPlugin.xml in Media/Tools/LayoutEditor/EditorPlugin.xml and add an entry for this plugin.
|
|
||||||
*/
|
|
||||||
class ResourcePlugin : public MyGUI::IPlugin
|
|
||||||
{
|
|
||||||
/*! Get the name of the plugin.
|
|
||||||
@remarks An implementation must be supplied for this method to uniquely
|
|
||||||
identify the plugin
|
|
||||||
*/
|
|
||||||
virtual const std::string& getName() const;
|
|
||||||
|
|
||||||
/*! Perform the plugin initial installation sequence
|
|
||||||
*/
|
|
||||||
virtual void install();
|
|
||||||
|
|
||||||
/*! Perform any tasks the plugin needs to perform on full system
|
|
||||||
initialisation.
|
|
||||||
*/
|
|
||||||
virtual void initialize();
|
|
||||||
|
|
||||||
/*! Perform any tasks the plugin needs to perform when the system is shut down
|
|
||||||
*/
|
|
||||||
virtual void shutdown();
|
|
||||||
|
|
||||||
/*! Perform the final plugin uninstallation sequence
|
|
||||||
*/
|
|
||||||
virtual void uninstall();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void registerResources();
|
|
||||||
void registerWidgets();
|
|
||||||
void createTransparentBGTexture();
|
|
||||||
|
|
||||||
void onRetrieveTag(const MyGUI::UString& tag, MyGUI::UString& out);
|
|
||||||
|
|
||||||
std::map<std::string, std::string> mFallbackMap;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,17 +0,0 @@
|
|||||||
#include "plugin.hpp"
|
|
||||||
#include "MyGUI_PluginManager.h"
|
|
||||||
|
|
||||||
MyGUIPlugin::ResourcePlugin* plugin_item = nullptr;
|
|
||||||
|
|
||||||
extern "C" MYGUI_EXPORT_DLL void dllStartPlugin(void)
|
|
||||||
{
|
|
||||||
plugin_item = new MyGUIPlugin::ResourcePlugin();
|
|
||||||
MyGUI::PluginManager::getInstance().installPlugin(plugin_item);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" MYGUI_EXPORT_DLL void dllStopPlugin(void)
|
|
||||||
{
|
|
||||||
MyGUI::PluginManager::getInstance().uninstallPlugin(plugin_item);
|
|
||||||
delete plugin_item;
|
|
||||||
plugin_item = nullptr;
|
|
||||||
}
|
|
Loading…
Reference in New Issue