插件为什么用不了吧插件放进Interface在游戏插件管理里没有呢

TAG标签: >
> 游戏插件以及ID设置及备份
游戏插件以及ID设置及备份
发布时间:08-03-08 23:51
作者:嘉存心中
[复制链接]
关于WOW插件,的问题,最近好几个人都在问怎么搞。
2006初,我最先使用的是一个整合插件DD魔兽小强,还真挺强,功能非常强大,甚至过了头,我一直使用这个到什么时候我都忘记了,反正我开始认识插件和 interface文件夹有关系和我发现魔兽世界插件中文站后,我开始学会挑选插件,我把...\interface\addons\&&& 里的插件文件一个一个试,在小强里把我想要的留下,摒弃了很多对我来说没有多大用途的插件,然后在网上搜索一些自己想要的搞进去。
后来我发现小强每次更新都把我不要的都更新下来,所以最后我还是没有要它,自己下ACE函数库,自己挑选插件,再加上我在大学的时候常有去网吧的习惯,由于要解决流动性的问题,我又着手研究ID设置的问题,经过很长的一段时间的摸索,我又我终于基本掌握了插件和用户设置的来龙去脉。虽然不是很专业,但是拿来分享一下,希望对大家有帮助。
首先打开游戏目录
游戏插件的存放目录是&\World of Warcraft\Interface\AddOns\
里面有的一个文件夹一个插件,有些是几个文件夹组成一个插件,因为都是英文的,刚开始对插件英文名不熟悉的人很难分清楚的(其实我也不清楚,所以我会把我放进去的插件在Addons文件夹旁边建一个文件夹用我能辨认的方法备份存放)。用散装插件有个不好的地方,就是没有像整合插件那样整体更新,散装的插件要自己到网上搜索更新。
好,现在说下ID设置,文件夹是&\World of Warcraft\WTF\
WTF下面有个Config.wtf那是界面缩放、效果等各项设置的存放文件。
打开Account文件夹,可以看到在本机器上上过的各个帐号,包括SF的号。
随便打开一个
下面有两个文件夹,一个是SavedVariables,保存的变量信息,里面的文件的名字都是和插件名字相关的,位于ID低下第一层,估计是多个号公用的,没有动它的需求没有动过^_^
macros-local.txt是通用宏,其他的几个文件自己网上搜索下,我只知道ID的按键设置和某个文件有关,我没有搞过,个人认为也没有必要动。
打开服务器文件夹,你会发现你ID在该服务器的角色都在里面,随便打开一个那些.bak、.wtf、.lua游戏生成我们先不用管,addons.txt是插件开启情况,disabled是已关enabled已开,不管他,登陆前都可以设置,不需要手改。注意,这里也有个SavedVariables文件夹,名字和上面的一样,对了,这就是本角色的变量数据,主要是插件,知道就行了。
下面讲下实战:
插件添加和应用不多说了,网上下了后把有乱七八糟文件的上一层文件夹扔到addons下就可以了。引申到常去网吧的朋友的使用了,常常不在同一太机器上上WOW的或者WOW所在盘经常还原的,你可以在下插件后,把addons打包成.RAR文件,放到你邮箱里,太大的分包打,怎么分就不多说了,下次要用直接邮箱下就可以,不需要老是下了后又要安装又要更新,当然大更新还是要更新下的,更新好的重新发邮箱^_^
想用别人的插件也可以直接从别人电脑把他的Addons拷贝走放自己电脑对应位置。
ID设置,不是老是在不同机器上设置同一个ID的,使用上面的办法网上备份WTF文件夹。有更改自己再备份。这里不多说了。
下面说说特别的,当ADDONS里面的文件都是一样的,怎么界面不一样,或者同一个ID下不同角色的界面都不一样,还要慢慢设置,也或者在使用同样插件的情况下想直接把别人的界面拷贝过来,怎么办?
使用别人的设置的,可以把&\World of Warcraft\WTF\Account\下你要使用的人的ID文件夹改成你自己要用的ID,然后把ID文件夹下面的服务器文件夹名字改成你ID所在的服务器,然后把服务器下你要使用别人哪个角色的设置的把该角色的文件夹名字改成你自己的角色名字,最后把ID文件夹(当然是改成你ID的)放到你自己的&\World of Warcraft\WTF\Account\下。
其实上面的方法比较笨,蛋网上很多教你使用别人设置的都是这样教的,这里我教一个新方法,大家应该还记得&\World of Warcraft\WTF\Account\ID\服务器\角色\SavedVariables文件夹,其实只要插件一样,把该文件夹下的文件拷贝到相应的文件夹下覆盖原来的就可以实现拷贝设置,我几个角色间的设置都是这样搞的^_^
小弟所学有限,很多报错啊,乱七八糟的还没有搞清楚,知道上面一点点,和大家分享下。
啊,玩过SF的朋友再上GF会有个头疼的问题,就是物品属性,这个问题呢,解决的办法是把&\World of Warcraft\Cache\下的文件删掉,再登陆游戏。
我再有发现再和大家分享,祝大家游戏愉快!!
大家看了要顶啊,上面的可是偶辛辛苦苦原创的哦!
《蓝龙之梦》
【嘉存心中】
点击您支持的评价印象,支持的越多,评价的印象越靠前
*网友评论仅代表其个人看法,并不表明本站同意其观点及描述。
Copyright © 2002- 版权所有 52PK网1.为什么需要插件化系统
  &编程就是构建一个一个自己的小积木, 然后用自己的小积木搭建大系统&。
  但是程序还是会比积木要复杂, 我们的系统必须要保证小积木能搭建出大的系统(必须能被组合),有必须能使各个积木之间的耦合降低到最小。
  传统的程序结构中也是有模块的划分,但是主要有如下几个缺点:
    a: c++二进制兼容
    b: 模块对外暴露的东西过多,使调用者要关心的东西过多
    c: 封装的模块只是作为功能的实现者封装,而不是接口的提供者
    d: 可替换性和可扩展性差
  而插件式的系统架构就是为了解决这样的问题。插件化设计的优点?插件化设计就是为了解决这些问题的,所以以上的缺点就是咱的优点
2.插件化系统的原理
  指导性原则:&面向接口编程而不是实现编程&
  其接口的定义为interface, 其实转换一下的意思是面向纯虚类编程,当然也可以包装成面向服务和组件编程。
  如我可以这样定义一个接口(interface)
interfacecptf IRole{
  virtual cptf ::ulong getHealth() = 0;
  virtual cptf ::ulong getHurt() = 0;
  virtual wstring getName() = 0;
  插件的目标就是实现IRole, 业务层的目标就是调用IRole, 业务层不知道IRole具体是如何实现的,而实现者也不用关心业务层是如何调用的。
3.插件化系统的目标
  1). 使用者能通过规范,开发自己的插件,实用已有的插件,插件又能控制对外暴露的内容。
  2). 运行时候能动态安装、启动、停在、卸载
  3). 每一个插件提供一个或多个服务,其他插件是根据接口来获取服务提供者
4. 一个插件化系统应该是怎么构成的
  OSGI,Java中影响力最大的插件化系统就是OSGI标准
  OSGI的定义:The dynamic module system for java
  借鉴osgi对插件系统的定义,我认为一个典型的插件系统应该有如下几个方面构成:
  &基础库+微内核+系统插件+应用插件&
  其中微内核 负责如下功能:
    1、 负责插件的加载,检测,初始化。
    2、 负责服务的注册。
    3、 负责服务的调用。
    4、 服务的管理。
5. 一个简单场景的随想
  比如设计下如下的游戏场景:一个RPG游戏, 玩家控制一个英雄,在场景中有不同的怪物,而且随着游戏的更新,  英雄等级的提升又会有不同的怪物出现, 这里就想把怪物设计为插件。  首先工程是这样的布局的
首先要在做的是定义接口, 这里我需要一个英雄的接口,有需要一个怪物的接口。
interfacecptf IHero : public cptf ::core:: IDispatch
, public IRole {
cptf ::ulong attack() = 0;
interfacecptf IOgre : public cptf ::core:: IDispatch
, public IRole {
然后作为插件我需要实现一个Hero, 和多个Ogre
class Hero : public ServiceCoClass&Hero &
, public ObjectRoot &SingleThreadModel&
, public cptf ::core:: IDispatchImpl&IHero &{
class Wolf : public ServiceCoClass&Wolf &
, public ObjectRoot&SingleThreadModel &
, public cptf::core ::IDispatchImpl& IOgre&
class Tiger : public ServiceCoClass&Tiger &
, public ObjectRoot&SingleThreadModel &
, public cptf::core ::IDispatchImpl& IOgre& 
最后,在主工程用我要用到这些插件
void BattleMannager ::run()
hero_ = static_cast&IHero *&(serviceContainer_. getService(Hero_CSID , IHero_IID));
if (!hero_ )return;
printHero(hero_ );
list&IService *& services = serviceContainer_ .getServices( IOgre_IID);
list&IOgre *& ogres = CastUtils::parentsToChildren &IService, IOgre&(services );
for_each(ogres .begin(), ogres.end (), bind(&BattleMannager ::printOgre, _1));
services = serviceContainer_ .getServices( IHumanOgre_IID);
list&IHumanOgre *& hummanOgres = CastUtils::parentsToChildren &IService, IHumanOgre&(services );
for_each(hummanOgres .begin(), hummanOgres.end (), bind(&BattleMannager ::printHumanOgre, _1));
  以上, 因为逻辑层和插件实现层都已经好了, 整个流程也已经跑通,但是还是的疑问:服务是怎么加载的?
6. 如何进行插件的加载以及服务的注册
& & 借鉴OSGI, 我这里把系统设计为bundle+service的组合。 bundle是service的容器,service是功能的具体实现者。
  在windows下,bundle用dll来表示。
& &&那bundle在windwos下加载就很简单了LoadLibrary Api就行了& &
& & 但是再c++中dll的接口还必须要考虑的一个问题就是c++的二进制兼容性:现在没有标准的 C++ ABI。这意味着,不同编译器(甚至同一编译器的不同版本)会编译出不同的目标文件和库。这个问题导致的最显而易见的问题就是,不同编译器会使用不同的名称改写算法。这样对插件的接口来说是致命的。当然我们可以用c api来作为接口,但是这样势必会对整体的设计产生影响,而且作为一个装B的c++程序员,我们怎么能容忍要借用低级语言的特性来实现我们的功能呢。当然幸亏还有另外一种方式,那就是虚表。当然不是所有的c++编译器对虚表的实现也是不一样的(好吧~~),但是至少主流(多主流~~不能确定)的编译器虚表都是在对象的第一个位置。好吧,现在决定用虚表来对插件接口的实现了,所以我们就可以用这样的方式来计算具体实现类的地址了
CPTF_PACKING 8
#define cptf_offsetofclass (base, derived) \
(( cptf::ulong )(static_cast& base*&((derived *)CPTF_PACKING))- CPTF_PACKING)
  &哇,好神奇的代码, 这个是为什么呢。 这个就需要对c++内存对象模型需要深入得了解了,可能需要拜读&c++内存对象模型&,这里篇幅有限这里就不解释了。但是如果有看官想要问&你为什么这么天才能想出这样的写法?&,虽然我很想说我很天才,但是其实正是情况是我参考的atl中的源码,而且整个插件加载过程我都是山寨了atl中的相关代码的。&
& & 但是还是有一个问题, 在GameMain中,认识的是IHero, 根本不知道有个Hero的实现,所有可能有这样的代码IHero* hero = New Hero() 这样动作。那我们要如何进行这样的new动作。 当然我们说Hero是在Role dll中的, 在dll被加载的时候可以new Hero, 然后把hero对象的地址放到某个堆中,标志让GameMain使用。作为一个转换的伪设计人员, 我也是认为这样会有性能问题的, 我不仅要做到加载, 还要做到懒加载。& & 那如何做到懒加载呢?& & 感谢微软,在vc++中有机制帮我们做到,在其他的编译器中也会有其他的实现,但是这里我们只做了vc++中的实现。& & 首先声明一个自己的段,段名可以叫cptf:
#pragma section ("CPTF$__a", read, shared )
#pragma section ("CPTF$__z", read, shared )
#pragma section ("CPTF$__m", read, shared )
  然后在编译的时候,把具体实现的类的Create函数地址放到这个段中
#define CPTF_OBJECT_ENTRY_AUTO (class) \
  __declspec(selectany ) AutoObjectEntry __objMap_##class = {class::clsid (), class:: creatorClass_::createInstance }; \
  extern "C" __declspec( allocate("CPTF$__m" )) __declspec(selectany ) AutoObjectEntry* const __pobjMap_ ##class = &__objMap_ ##class; \
  CPTF_OBJECT_ENTRY_PRAGMA(class )
 最后在加载的时候,变量这个段,如果csid命中,则调用Create方法
inline bool cptfModuleGetClassObject( const CptfServiceEntities * cpfgModel
, const cptf::IID & csid
, const cptf::IID & iid
, void** rtnObj)
bool rtn (false);
assert(cpfgModel );
for (AutoObjectEntry ** entity = cpfgModel-&autoObjMapFirst_
entity != cpfgModel -&autoObjMapLast_; ++entity)
AutoObjectEntry* obj = *
if (obj == NULL) continue;
if (obj -&crateFunc != NULL && csid == obj-& iid){
= obj -&crateFunc( iid, rtnObj );
  总结下流程:    1. GameMian使用的是IHero,     2. Hero是IHero的实现者,在编译的规程中,把Create Hero的方法编译到固定段中    3. GameMian进行new的时候其实调用的是Dll固定段中的函数地址    4. 利用 上面的cptf_offsetofclass 宏实现对IHero的
7. 服务的管理
  每一个服务都需要一个id来标志它, 这里就用guid, 命名为IID---interface id  每一个服务的实现者也必须要有id来标志, 这也是一个guid, 命名为csid  我们把服务和服务实现者的管理信息用配置文件管理起来,services.xml, 对Hero的定义
&bundle&Role.dll&/bundle&
&csid&-7c2a-11e3-8c28-bc305bacf447&/csid&
&description&hero&/description&
&name&Hero&/name&
&serviceId&99f9dd8f-7c1a-11e3-9f9d-bc305bacf447&/serviceId&
&serviceName&IHero&/serviceName&
&/service&
  当然一个插件的管理器也是必须的, 管理Service的注册,缓存,析构、获取,查询等。这里用ServiceContainer实现
8. 基于插件的架构
& &&基于插件系统的架构:
& & &主要分三部分: 1. 使用其对象模型的主系统或主应用程序
& & & & & & & & & & & & &2. 插件管理器
& & & & & & & & & & & & &3. 插件
& & 所有的插件但是从IService, 是参考Com中IUnkown
interfacecptf IService{
cptf ::ulong addRef() = 0;
virtual cptf ::ulong release() = 0;
virtual bool queryInterface( const cptf ::IID& iid, void**rntObj ) = 0;
  其实插件的内核并不复杂,复杂的是对插件接口的定义和封装,如何根据不同的业务场景抽象出不同的interface。
&  本文不是很水的理论,所有的理论都是经过代码验证的。&
& & &本文涉及到的代码在我的github上,
& & &工程的目标是建立一个跨平台的c++插件开发框架, 现在的是一个能成功在vc++下运行demo的插件化framework
& & &用了boost和stl,如果要深入了解core中的代码,还需要对模板有了解, 水深请勿轻易尝试
& & &当然有的看官会对core中的代码非常熟悉,那可能你发现了, 我是山寨atl实现的
8. 今后改进的方向
& & &1. service如何释放, 还在考虑是用野指针还是智能指针还是垃圾回收机制
& & &2. 错误处理
& & &3. 跨平台和跨编译器
阅读(...) 评论()再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
威锋网7月10日消锋网7月10日消息,《植物大战僵尸2》 如今...
威锋网7月10日消息,《植物大...
近日,开发商 Esquilax Games ..
说到方块游戏,相信有很多朋友应该还会记得 Gavina Games 早...
威锋网7月10日消息,《植物大...
近日,开发商 Esquilax Games ..
说到方块游戏,相信有很多朋友应该还会记得 Gavina Games 早...
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
您需要通过验证再能继续浏览 3秒后开始验证
威锋旗下产品
Hi~我是威威!
 粤公网安备 11号
新三板上市公司威锋科技(836555)
增值电信业务经营许可证:
Powered by Discuz!

我要回帖

更多关于 插件为什么用不了 的文章

 

随机推荐