从设计到实现:为你的魔兽模拟服添加自助改名及换阵营功能。

一直以来,总会有三三两两的玩家对自己的名字、种族甚至是人物形象不是很满意。

我们知道服务器上GM是有命令可以协助玩家进行改名、自定义人物形象或者是更换种族及阵营的。

我们在游戏中使用GM账号敲入命令:

.character

然后回车,即可看到当前核心所有支持的角色命令清单。

筛选后发现:

.character rename //对选中用户执行改名

.character changefaction //对选中用户执行切换阵营

.character customize //对选中用户执行重新捏脸(就是重设人物形象)

.character changerace //对选中角色执行修改种族

.character changeaccount //对选中角色执行修改所属账号

然后在本地测试服上逐条测试上述五条命令,其中比较特殊的当属修改所属账户。它需要指定新绑定的账号才可以成功运行。不过,该条命令的用途是非常受欢迎的。

因为很多DK玩家或者一个账户有多个满级角色的玩家会非常希望多开,这时候允许将角色转移至不同的账户,就显得非常重要(有市场)了。

既然核心支持这么多命令来协助玩家进行改名等操作。那我们完全可以设计几张卡片,添加至网站后台中,允许玩家自助修改。

毕竟,作为服务器管理者,我们都很忙。哪有空随时上线帮助别人改名呢?

经过策划,我们给网站添加了一些卡片,玩家通过一些积分(或者赞助)兑换来获得卡片。

然后,当玩家获得该卡片之后,我们原来的兑换体系是通过兑换码,在游戏中与NPC互动进行福利兑换。

之前的体系是基于Eluna开发的。每一个兑换码都绑定了对应的角色。在游戏内找到NPC输入兑换码,然后执行Eluna脚本进行福利兑现。

我记得Eluna中是允许执行GM命令的,关键函数是RunCommand。

然而,做了详细的部署和编写Eluna之后,发现进入了死胡同。

首先是不同的核心,对于Eluna执行GM命令似乎兼容并不好,总是引起核心报错。

看来通过Eluna进行gm命令的执行是会遇到大问题的。

难道,我们就不可以把这些策划来的小卡片成功的实现吗?

灵光一闪:我们想到其他的途径,那就是Soap。

我们可以通过Soap执行GM命令。TC和AZ对Soap的支持都非常的好,而且权限也非常的大。

总而言之Soap肯定比Eluna靠谱。

先检查worldserver.conf是否开启Soap模块。

通过上图可以看到,我们是开启Soap模块的,绑定ip是0.0.0.0(全监听),端口:7878。

我们通过http协议访问服务器上的7878端口,获得如下反馈:

这说明服务端的Soap是正常运行的。下面我们编写代码进行Soap的连接和执行命令操作:

public function soapdoc($do_command='',$config=NULL)
    {
        if(empty($config)){
            $config = $this->gplus->table('site_config')->get()->getRowArray();
        }
        try {
            $conn = new \SoapClient(NULL, array(
                'location' => $config['soap_location'],
                'uri' => $config['soap_uri'],
                'style' => $config['soap_style'],
                'login' => $config['soap_login'],
                'password' => $config['soap_password']
            ));
            try {
                $rs = $conn->executeCommand(new \SoapParam($do_command, 'command'));
                unset($conn);
                return array('code'=>1,'msg'=>(string)@$rs);
            } catch (\Exception $e) {
                return array('code'=>-1,'msg'=>(string)@$e->faultstring);
            }
        } catch (Exception $e) {
            return array('code'=>0,'msg'=>'未能链接soap!');
        }
    }

上面代码是php,其他版本的请自行解决。

我们通过数据存放Soap的链接地址及登陆账户尝试连接Soap服务。

注意:TC的链接字符串如下:

location:http://127.0.0.1:7878/

uri:urn:TC

style:SOAP_RPC

账户及密码使用你的GM账号密码即可,建议是level为3的超级GM账户。

执行代码之后$conn正常链接,然后返回的$rs也相当的友好。我们逐条测试了前文中选定的几个命令。运行良好,无错误。而且,惊奇的发现。只要服务端正常运行,无论执行用户是否在线都可以完美运行。这真是太棒了!

接下来我们对网站进行一些补充收尾,在用户选择指定角色之后,可以生成一张空白的卡片。

所有卡片都必须指定角色才可以生成。

用户通过积分兑换或者慷慨赞赏就可以激活使用卡片。

除了角色分离卡之外,其他的卡片处理相对简单:

当卡片激活之后,我们允许用户自助点击“立即使用”,而角色分离卡因为需要指定转入的账号。所以,我们还需要为他增加一个按钮,设置转入账户。

这个操作我们需要在后端进行严谨的逻辑判断:

1、是否支付/是否已使用

2、设置账户是否存在。

为了良好的用户体验,都需要设置正确的界面提示。

其实,我们这里偷了个懒,只验证账户是否存在。严格意义上来说,我们需要用户输入账号及密码,确实匹配才可以设置成功。

当用户设置需要转入的账号之后,就可以正确使用该卡了。

当后台收到使用卡片的指令,我们依据卡片的类型,生成指定的命令。假设这次需要执行的是修改账号命令,我们根据用户预设的转入账户及绑定角色,生成命令,并通过soap执行。获得soap的友好提醒之后反馈给用户,代码如下:

注意到,当卡片被使用之后,我们要更新数据库中卡片的使用状态,并插入时间戳,执行日志。

留存日志的目的是为了出现异常之后,允许GM介入协助用户完成卡片的使用,也方便我们追踪问题。

经过测试,运行良好。从有想法,到设计,最后去实现。整个过程如上文陈述。

如有疑问,欢迎批评指正。

最后补充一点。切换阵营和种族之后,本身的声望及任务体系发生了改变。

经玩家测试后,我们发现声望会自动做对应的切换。但是任务体系不行。

联盟和部落的任务体系是完全不同的,或许一切任务都需要重新开始。

留待扩展:后来与服务器上玩家做了交流。更多的人希望自己的角色是人类,但可以有血精灵的外观…..

我很无语至极哦!不过,这依然是有办法实现的。

我们通过幻化物品的原理,对人物形象进行修改即可。

我们可以设计一个“画皮礼包”。允许在不修改任何游戏数据的情况下,选择自己喜欢的种族外观。

当然,实现起来可能稍显复杂。涉及到补丁、模型、数据库等等多项综合修改。

以后有时间的话可以尝试做一下。

最后,感谢您的阅读。