|
5#

楼主 |
发表于 2020-11-29 11:52:47
|
只看该作者
几个问题
一、插件、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”。
二、存档尺寸
游戏支持录像回放,导致存档中回合数越多则存档会越大,要是不限回合那存档大小就没尽头。玩群2这种大地图剧本,玩个200回合存档就可能超过3M。这种大小对网络传输来说是有点大了,于是想过先gzip压缩再上传。要gzip另一目的是要降低存档对服务器硬盘要求,但当前实现的没进行gzip压缩。
- 将来的网页端应该能显示存档更多信息,像玩到多少回合了,地图尺寸是多少等等,而这些是没法作为玩家在上传存档时的附加信息,只能靠服务器去解析存档中数据。要解析数据,被gzip的必须要先被ungzip,而未gzip自然可省掉这步骤。
- 游戏会严格要求存档进行版本匹配,即一旦游戏发布了新版本,旧版本存档其实就已没意义。为此服务器可根据pre_kingdom_save表去删除旧版本存档,这样一来服务器中的存档数量其实是可以被控制在一定数目的。
当前实现是未压缩存档直接进行网络传输,服务器上存的也是未压缩过的。这种方式是是否可行,让运行一段时间看实际效果。
三、标准discuz插件
王国插件已符合discuz插件标准,不论是安装还是代码中使用,都要以着标准插件方式。像运行时,php代码/模板会遇到翻译语言问题,安装王国插件时会把包中语言内容写入pre_common_syscache表,php代码/模板尽可按标准去使用插件的语言翻译机制,而且应该按标准去做。
以王国插件为例简述下discuz插件
- 插件安装分两个步骤:安装、启用。
- 安装主要任务是从插件提供的discuz_plugin_kingdom.xml读取信息,然后写入pre_common_plugin表。pre_common_plugin存储插件概要信息,像插件名称(name)、标识(pluginid)、支持模块(modules),安装完后会把当中的是否启用字段(available)置为0。如果插件存在install.php的话,这php也会在安装过程被调用。
- 启用。一旦启用,pre_common_plugin中的available字段将被置为1。对启用过程来说,置下这字段只是个小工作,他的大动作是要追加pre_common_syscache表,用追加,是因为syscache表中字段已经有内容,此时只是在相关字段值中增加新增插件内容。举个例子,setting字段存储着插件支持何样钩子,在启用王国插件前,表中的setting字段已经存储了论坛已安装插件支持的钩子,此次启动王国插件是把该插件支持钩子追加进setting字段。pre_common_syscache正如表名所看到的,它存储了系统缓存信息,而缓存的一部分就是插件信息。比如setting字段是插件支持的钩子,这个字段是通过解析pre_common_plugin中的modules字段得到的,如果每次运行都去解析pre_common_plugin中的modules,然后得到钩子,那太费时间。除去setting,像pluginlanguage_template字段缓存着编写模板时插件支持的翻译文本。在php程序中,pre_common_plugin中字段在discuz->init时被读进$_G,像$_G['setting']对应setting字段。
- 要理解安装、启动,重点要理解1)modules是如何被形成setting字段;2)如何形成语言包相关字段(pluginlanguage_template等)。对setting,参考get_cachedata_setting_plugin()(<bbs>/source/function/cache/cache_setting.php),为加快理解可嵌入以下代码,然后zend studio进入该函数进行调试。
- @include_once libfile('cache/setting', 'function');
- list($data['plugins'], $data['pluginlinks'], $data['hookscript'], $data['hookscriptmobile'], $data['threadplugins'], $data['specialicon']) = get_cachedata_setting_plugin();
复制代码 对各语言字段,则可使用以下代码。- require_once libfile('function/plugin');
- require_once libfile('function/admincp');
- $file = DISCUZ_ROOT.'./source/plugin/discuz_plugin_kingdom.xml';
- $importtxt = @implode('', file($file));
- $pluginarray = getimportdata('Discuz! Plugin', 0, 1);
- if ($pluginarray) {
- updatepluginlanguage($pluginarray);
- }
复制代码 模板翻译总的来说是两条原则,1)对于不属于插件的key,一定会加载source/language/lang_template.php;2)对于属于插件的key,一律从discuz_plugin_kingdom.xml中的template中找(对应pre_common_syscache表中“cname”字段等于“pluginlanguage_template”中的data)。 - 安装过程需要插件提供两个名称有点特珠的文件:discuz_plugin_kingdom.xml、kingdom.class.php。插件支持何类型钩子来自discuz_plugin_kingdom.xml中module节,但支持的进一步信息则要来自kingdom.class.php,discuz启用时要根据后者提供的类名/类成员函数来确认该插件“最后”是否真存在钩子函数。举个例子,王国插件提供了截取显示形象的钩子函数,要discuz得到这个信息是根据两个地方:1)discuz_plugin_kingdom.xml写有个type=11的module,2)kingdom.class.php存在个类名是plugin_kingdom的类,并且实现了avatar成员函数。这两部分如何协同工作参考get_cachedata_setting_plugin()。
四、插件中的php如何调用discuz自带的css
discuz代码中样式表文件是放在<bbs>/data/cache,而且要使用这些样式表,如果不想修改discuz头模板文件(具体是<bbs>/template/default/common/header_common.htm),那你的php必须位在和data同级的那个目录,即<bbs>根下!原因:header_common.htm形成样式表语句是“<!--{csstemplate}-->”,模板机制解析这语句是调用“this->loadcsstemplate”,this指的是类“class template”,即调用template的成员函数loadccstemplate,而loadccstemplate在指定css文件时使用了固定的相对路径。- function loadcsstemplate(...) {
- $scriptcss = '<link rel="stylesheet" type="text/css" href="data/cache/style_{STYLEID}_common.css?{VERHASH}" />';
- ......
- }
复制代码 为让非根下php可调用这些css,修改以上 “href”值。- function loadcsstemplate(...) {
- $scriptcss = '<link rel="stylesheet" type="text/css" href="{$_G[setting][csspath]}data/cache/style_{STYLEID}_common.css?{VERHASH}" />';
- ......
- }
复制代码 对于非根下的php应该给$_G[setting][csspath]赋非空值,而这个值极可能就是类似“../../../”。
插件目录不可能是根目录,而又不想修改discuz代码,discuz解决方案:插件php只是个子php,它的头统一是根下的plugin.php。由于plugin.php位在根下,由它启动的一系列过程就可使用discuz自带的css,这自然包括了插件目录中的那些php。
五、把插件入口放在用户状态栏
王国插件安装后,插件入口是放在导航栏,若要在右上角状态栏增加入口,可执行以下步骤。
- 打开<bbs>/source/plugin/kingdom/kingdom.class.php,去掉对成员函数global_usernav_extra2的注释。保存。
- 如果不想入口出现在导航栏,打开<bbs>/source/plugin/kingdom/discuz_plugin_kingdom.xml,删掉type=1的那个module,并把后面module的id值减1。保存。
- 重新安装王国插件。
|
|