版本问题
mangos目前有三个分支,分别对应wow的不同版本:
使用不同分支时,要求客户端的版本号一致,否则无法登录。详见http://getmangos.com/
因为只是研究目的,没必要用最新的版本,所以我选择用原版,即mangos-zero。
客户端安装
由于官方已经升级到资料片大灾变,所以只能自己找早期的安装程序和patch。悲剧的是原版的mac安装程序是PowerPC格式的,而从MacOS10.7(Lion)开始就不支持这种安装程序了。好在wow的Windows版和Mac是基本共通的,所以可以在Windows上安装好,再拷贝到Mac上打patch。
要注意一下安装好的Windows版是没有MacOS可执行程序的,而Mac版的patch缺需要这个文件。解决办法很简单,下载一个MPQ提取程序,比如MPQ Editor。用它打开文件World of Warcraft/Data/base.mpq,把里面的World of Warcraft.app提取出来,放到根目录World of Warcraft/下即可。
接下来就可以打patch了。Windows版安装好的版本号是1.0.1。还需要两个patch:
第二个找了我好久,链接在此,注意要注册账户才能下载。
如果需要其他patch可以去这些网站:
http://www.bastionofstormwind.com/content/view/33/34/
http://www.ausgamers.com/files/browsegame/html/3/218
http://www.fileplanet.com/100462/0/section/Patches
服务端安装
mangos-zero包含三个部分:引擎代码,脚本代码,数据库数据。都是通过git管理的,其中脚本代码不是必需的,所以先不装。此外还需要预先安装以下软件:
当然还有XCode的UNIX Development Support。
1.引擎安装
git clone https://github.com/mangos-zero/server.git ~/mangos-zero
由于使用cmake,安装很方便。进入目录后依次执行:
mkdir build; cd build; cmake ..; make; make install
cmake那一步可以添加参数-DDEBUG=1,开启debug模式。
make过程中可能会出错,提示UINT64的定义冲突:
/mangos-zero/src/framework/Platform/Define.h:113: error: conflicting declaration ‘typedef ACE_UINT64 uint64’
加个宏条件判断即可:
diff --git a/src/framework/Platform/Define.h b/src/framework/Platform/Define.h
index d3f85c6..5b53069 100644
--- a/src/framework/Platform/Define.h
+++ b/src/framework/Platform/Define.h
@@ -109,7 +109,11 @@ typedef ACE_INT64 int64;
typedef ACE_INT32 int32;
typedef ACE_INT16 int16;
typedef ACE_INT8 int8;
+// Mac OS X hack against uint64 redefine
+#ifndef _UINT64
typedef ACE_UINT64 uint64;
+#define _UINT64
+#endif
typedef ACE_UINT32 uint32;
typedef ACE_UINT16 uint16;
typedef ACE_UINT8 uint8;
--
默认的安装路径是../mangos-server。
2.提取地图和dbc数据
引擎需要客户端中的地图和dbc数据,mangos-zero自带了提取工具ad。首先编译:
cd ~/mangos-zero/contrib/extractor
cmake -G "Unix Makefiles" -DCMAKE_OSX_ARCHITECTURES=i386
make -j3
然后执行,指定输入和输出路径:
./ad -i /Applications/World\ of\ Warcraft/ -o ~/mangos-server/bin/
3.MySQL配置
安装时把安装包里的MySQL.prefPane和MySQLStartupItem.pkg也装上,以后就可以在System Preferences里方便的控制了。
让shell可以执行mysql:
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> ~/.bash_profile
source ~/.bash_profile
用root账户登陆mysql,这时是没有密码的,安全起见要设置一下:
mysql -u root
mysql>UPDATE mysql.user SET Password = PASSWORD('oranges') WHERE User = 'root';
mysql>FLUSH PRIVILEGES;
mysql>EXIT;
再次登陆,删除test数据库:
mysql -u root -p
mysql>DROP DATABASE IF EXISTS `test`;
删除可能会失败,是因为MySQL5.5会尝试删除数据库所在目录,但是该目录下有非数据库文件。解决办法是在shell下直接删除该文件:
rm /usr/local/mysql/data/test/.empy
然后再执行删除数据库指令。
关闭匿名访问:
mysql>DELETE FROM mysql.user WHERE User = '';
4.初始化数据库数据
首先下载mangos-zero对应的数据:
git clone https://github.com/mangos-zero/database.git ~/mangos-zero-db
然后在MySQL里新建用户mangos以及相应的数据库。mangos自带了一个脚本:mangos-zero/sql/create_sql.sql。但是不能直接用,因为默认的数据库名与mangos-zero的数据(上面下载的那个)不一致。数据库名必需换成:
mangos -> zp_world
characters -> zp_characters
realmd -> zp_realm
改好后就可以执行了:
mysql -u root -poranges < ~/mangos-zero/sql/create_mysql.sql
然后在mangos-zero-db/mysql_info里修改数据库账号和密码,再执行脚本(zp_script部分先注释掉):
cd ~/mangos-zero-db
./mysql_import
5.配置文件
首先复制一份默认配置:
cp ~/mangos-server/etc/realmd.conf.dist ~/mangos-server/etc/realmd.conf
cp ~/mangos-server/etc/mangosd.conf.dist ~/mangos-server/etc/mangosd.conf
然后将数据库名称,此外因为没有用vmap,所以要关闭vmap的相关选项:
diff mangosd.conf mangosd.conf.dist
65,67c65,67
< LoginDatabaseInfo = "127.0.0.1;3306;mangos;mangos;zp_realm"
< WorldDatabaseInfo = "127.0.0.1;3306;mangos;mangos;zp_world"
< CharacterDatabaseInfo = "127.0.0.1;3306;mangos;mangos;zp_characters"
---
> LoginDatabaseInfo = "127.0.0.1;3306;mangos;mangos;realmd"
> WorldDatabaseInfo = "127.0.0.1;3306;mangos;mangos;mangos"
> CharacterDatabaseInfo = "127.0.0.1;3306;mangos;mangos;characters"
206,207c206,207
< vmap.enableLOS = 0
< vmap.enableHeight = 0
---
> vmap.enableLOS = 1
> vmap.enableHeight = 1
diff realmd.conf realmd.conf.dist
110c110
< LoginDatabaseInfo = "127.0.0.1;3306;mangos;mangos;zp_realm"
---
> LoginDatabaseInfo = "127.0.0.1;3306;mangos;mangos;realmd"
6.启动服务器
cd ~/mangos-server/bin
./mangosd
./realmd
mangosd可能会报错,提示找不到libsqlclient,更新一下动态库链接即可:
sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib mangosd
用指令otool -L mangosd可以查看当前动态库链接。
mangosd可能会报错,提示用户mangos对zp_world没有CREATE TEMPORARY TABLES的权限。加上即可:
GRANT CREATE TEMPORARY TABLES ON `zp_world`.* TO 'mangos'@'localhost';
mangos可能会报错,提示:
Assertion failed: (STRINGIZE(_ok == 0) && 0), function setPriority, file /Users/smallka/Projects/mangos-zero/src/shared/Threading.cpp, line 232.
/Users/smallka/Projects/mangos-zero/src/shared/Threading.cpp:232: Error: Assertion in setPriority failed: _ok == 0Abort trap: 6
查看代码是ACE_Thread::setprio函数返回错误,暂时不知道原因。要么去掉debug模式,要么注释掉这行先。
7.新建游戏账户
mangosd其实是个交互环境,直接输入指令:
mangos>account create smallka smallka
8.客户端登陆
编辑World of Warcraft/realmlist.wtf:
set realmlist 127.0.0.1
登陆后卡在"logging in to game server"是因为没有设置好gs的ip地址:
mysql -u mangos -pmangos
mysql>use zp_realm;
mysql>UPDATE realmlist SET address="127.0.0.1" WHERE id=1;
TODO
Mac版客户端的角色缺了头部贴图,@$$%$%#@%
参考资料
http://getmangos.com/wiki/Compile_MaNGOS_On_Mac_OS_X
http://www.jeremymeile.ch/jeremymeile.ch/Get_MaNGOS.html
http://getmangos.com/community/topic/8512/the-big-faq-thread/