一、安装
下载王国插件安装包(140731)下载,解压缩。
把王国插件安装包上传到论坛源码的“plugin”目录下。让论坛源码看去是以下结构。

以创建者账号登录后台,“应用”。
——如果已安装过旧版本插件,选择“更新”。
——如果是全新安装,选择“安装插件”:“王国战争 14.7.31”;并启用插件。注:全新安装时一定会删除表格,然后重新创建新的;为避免误删,不要随便全新安装。

安装结束。进入论坛首页,安装成功的的话就可在导航栏看到“王国战争”项,进入后台可更改导航栏顺序。对于想把入口放在右上角状态栏,参考五楼的“把插件入口放在用户状态栏”。
二、内部细节
表格
王国插件会建立以下表格
名称 | 描述 |
<pre_>kingdom_hero | 武将数值。五维、特技、战法、兵科适性等 |
<pre_>kingdom_save | 玩家存档。存档编号(sid)、上传人编号(uid)、存档名(name)、上传时间(uploadtime)、版本(version)、批注(remark) |
注:
所有表格都是建立在discuz数据库。所以当玩家是把discuz和ucenter分装在两个数据库时,这些表是位在discuz数据库。<pre_>是在安装discuz时的discuz数据库中表前缀。
一旦存在,在论坛后台“数据库”可以看到这些表格。
[attach]1148[/attach]
会涉及到以下表格
名称 | 所属数据库 | 描述 | |
<pre_>common_syscache | discuz | 做为插件,它一定得把一些信息写入这个表格,像三种翻译 | install.php为按装插件会修改它 |
<pre_>common_member | discuz | 要由它验证“uid”指定的账号是否有效 | 只读 |
<uc_>members | ucenter | 要由它验证“账号/密码”对指定的账号是否有效 | 只读 |
管理插件私有表格
建立。安装步骤一中运行install.php时建立所有表格。
插入新记录
[list]
[*]pre_kingdom_hero:“王国战争”插件检测到当前进入的uid不在该表格,会向它插入一条新记录。
[*]pre_kingdom_save:游戏玩家向服务器上传了一个存档,会向它插入一条新记录。
[/list]
修改。游戏端会上传武将数据,从而修改pre_kingdom_hero。
备份。备份discuz数据库会连着备份这些表格
删除。暂时未做删表格部分,到时会有的。
文件
王国插件会涉及到两种文件:源码和数据。
源码文件
源码文件集中存放在<bbs>/source/plugin/kingdom目录。它在安装时被复制向该目录。在不断运行过程中,这些个文件不会有变动。
数据文件
插件在运行时会产生数据,数据集中放在<bbs>/data/plugindata/kingdom目录。

avatar子目录存放图像。像半身像、头像。王国插件存放图像和ucenter一样根据uid进行分类,目录结构和ucenter保持一致。
save子目录存放存档。
三、命令集
客户端有两种:浏览器(IE等)和王国战争游戏。
客户端访问服务器都是通过HTTP协议。即使是要操作数据库的命令,客户端也是把命令发去服务器,服务器根据命令操作数据库。操作结果也是由数据库先交给服务器,服务器再把结果传给客户端。
服务器和客户端接口只一个文件:kingdom.inc.php,它处理/分发所有命令。但在调用上kingdom.inc.php是被论坛根下的plugin.php调起的,外面访问指向的该是plugin.php,而访问的是kingdom插件,plugin.php应是plugin.php?id=kingdom:kingdom。
客户端请求时可使用GET或POST,请求头部分必须存在“Host”、“Connection”字段。
字段 | 存在 | 描述 |
Host | 必须 | 服务器域名,像[url]www.freeors.com[/url] |
Connection | 必须 | Keep-Alive |
Content-Length | 有内容时必须 | 内容数据字节数 |
命令数据分散在请求的两个地方,1)访问URL,用于存放命令id、此次访问的用户编号或账号/密码对;2)HTTP协议的内容区,按命令不同有不同数据。
只要是字符串,进入或出来插件的一律是UTF-8格式。像账号、密码、存档名必须UTF-8。
命令
标识 | 功能 | 使用场合 | 参数 | 参数(内容) |
index | 显示服务器主页 | 在论坛访问属于游戏的空间 | plugin.php?id=kingdom:kingdom&do=index&uid=2,可省略do=index | 不需要 |
synchero | 同步新武将数据 | 游戏端用它来下载两种头像 | plugin.php?id=kingdom:kingdom&do=synchero&username=1&password=2 | leadership=98&charm=72,leadership等是pre_kingdom_hero表格中的字段名 |
uploadsave | 上传存档 | 游戏端用它来上传一个存档 | plugin.php?id=kingdom:kingdom&do=uploadsave&username=1&password=2 | 8字节版本号、8字节存档名字节数,存档名,存档数据 |
downloadsave | 下载存档 | 游戏端用它来下载一个存档 | plugin.php?id=kingdom:kingdom&do=downloadsave&username=1&password=2 | 8字节存档名字节数、存档名,存档数据 |
listsave | 特定于账号的存档列表 | 游戏端用它来知道可下载哪些存档 | plugin.php?id=kingdom:kingdom&do=listsave&username=1&password=2 | 存档编号,上传人账号,存档名,上传时间,存档版本&(以同样格式表示下一存档) |
四、几个问题
4.1 插件、ucenter中图像
discuz自带的是每账号三图像(small、middle、big),王国插件是每账号两图像(small、middle),不过要是插件由middle复制出big,理论上说由插件就可以替掉discuz的自带图像。理论上是如此,实际却得考虑几个问题。
- 插件要求的图像是png,discuz要求的图像扩展名是jpg,而且这个jpg是被硬写进代码。
- 插件middle图像要求扣掉背景,一些用户可能希望论坛图像有背景。
- 插件代码是钩注在discuz,无法影响ucenter。
当前实现方式是插件给提供个选项,由用户选择是使用王国战争设定形象还是discuz自带形象。在图像存储上,插件、ucenter中图像互不干扰,但它们在保存图像时有着一致的目录结构。针对9位的uid组织成三级目录,最高三位是一级目录,次二位是二级目录,次次二位是三级目录。举个例子,对uid=13154,它的目录结构是“avatar/000/01/31/54_avatar_small.png”。
4.2 存档尺寸
游戏支持录像回放,导致存档中回合数越多则存档会越大,要是不限回合那存档大小就没尽头。玩群2这种大地图剧本,玩个200回合存档就可能超过3M。这种大小对网络传输来说是有点大了,于是想过先gzip压缩再上传。要gzip另一目的是要降低存档对服务器硬盘要求,但当前实现的没进行gzip压缩。
- 将来的网页端应该能显示存档更多信息,像玩到多少回合了,地图尺寸是多少等等,而这些是没法作为玩家在上传存档时的附加信息,只能靠服务器去解析存档中数据。要解析数据,被gzip的必须要先被ungzip,而未gzip自然可省掉这步骤。
- 游戏会严格要求存档进行版本匹配,即一旦游戏发布了新版本,旧版本存档其实就已没意义。为此服务器可根据pre_kingdom_save表去删除旧版本存档,这样一来服务器中的存档数量其实是可以被控制在一定数目的。
当前实现是未压缩存档直接进行网络传输,服务器上存的也是未压缩过的。这种方式是是否可行,让运行一段时间看实际效果。
4.3 其它
从13.11.28升级上来的话,pre_kingdom_pass表的coin、score、type、hash字段类型改为无符号型。
coin tinyint(3) unsigned NOT... score tinyint(3) unsigned NOT... type tinyint(1) unsigned NOT... hash mediumint(8) unsigned NOT...
何时删除pre_kingdom_siege中的过时记录?
有玩家执行“查看通关记录”(listsiege)时。不管是谁,它就会删除所有玩家30天前的记录。
何时删除pre_kingdom_pass中的过时记录?
有玩家执行“查看过关记录”(listpass)时。不管是谁,它就会删除所有玩家30天前的记录。
何时删除pre_kingdom_board中的无效过关记录?
pre_kingdom_board有一部分是过关排名,一旦它对应的过关记录被删除,它就变得无效了。
有玩家执行“查看过关排名”(listboard:pass)时。不管是谁,它就会删除排名榜中无效记录。
注:上传过关记录(uploadpass)时不会删除无效记录。过关记录插入排名榜过程不会涉及到相关具体记录,它只是根据pre_kingdom_board中的积分值就可计算了,出现无效时不立即删除的确可能会造成有些本该进到排名中的不能立即进入,但希望会有玩家立即“查看过关排名”,进而删除无效记录,保证排名榜的正确性。