一直以来,总会有三三两两的玩家对自己的名字、种族甚至是人物形象不是很满意。
我们知道服务器上GM是有命令可以协助玩家进行改名、自定义人物形象或者是更换种族及阵营的。
我们在游戏中使用GM账号敲入命令:
.character
然后回车,即可看到当前核心所有支持的角色命令清单。
筛选后发现:
.character rename //对选中用户执行改名
.character changefaction //对选中用户执行切换阵营
.character customize //对选中用户执行重新捏脸(就是重设人物形象)
.character changerace //对选中角色执行修改种族
.character changeaccount //对选中角色执行修改所属账号
然后在本地测试服上逐条测试上述五条命令,其中比较特殊的当属修改所属账户。它需要指定新绑定的账号才可以成功运行。不过,该条命令的用途是非常受欢迎的。
因为很多DK玩家或者一个账户有多个满级角色的玩家会非常希望多开,这时候允许将角色转移至不同的账户,就显得非常重要(有市场)了。
既然核心支持这么多命令来协助玩家进行改名等操作。那我们完全可以设计几张卡片,添加至网站后台中,允许玩家自助修改。
毕竟,作为服务器管理者,我们都很忙。哪有空随时上线帮助别人改名呢?
经过策划,我们给网站添加了一些卡片,玩家通过一些积分(或者赞助)兑换来获得卡片。
![](https://blogs.woria.cn/wp-content/uploads/2022/07/图片-1024x310.png)
然后,当玩家获得该卡片之后,我们原来的兑换体系是通过兑换码,在游戏中与NPC互动进行福利兑换。
之前的体系是基于Eluna开发的。每一个兑换码都绑定了对应的角色。在游戏内找到NPC输入兑换码,然后执行Eluna脚本进行福利兑现。
![](https://blogs.woria.cn/wp-content/uploads/2022/07/图片-1.png)
我记得Eluna中是允许执行GM命令的,关键函数是RunCommand。
![](https://blogs.woria.cn/wp-content/uploads/2022/07/图片-2.png)
然而,做了详细的部署和编写Eluna之后,发现进入了死胡同。
首先是不同的核心,对于Eluna执行GM命令似乎兼容并不好,总是引起核心报错。
看来通过Eluna进行gm命令的执行是会遇到大问题的。
难道,我们就不可以把这些策划来的小卡片成功的实现吗?
灵光一闪:我们想到其他的途径,那就是Soap。
我们可以通过Soap执行GM命令。TC和AZ对Soap的支持都非常的好,而且权限也非常的大。
总而言之Soap肯定比Eluna靠谱。
先检查worldserver.conf是否开启Soap模块。
![](https://blogs.woria.cn/wp-content/uploads/2022/07/图片-3.png)
通过上图可以看到,我们是开启Soap模块的,绑定ip是0.0.0.0(全监听),端口:7878。
我们通过http协议访问服务器上的7878端口,获得如下反馈:
![](https://blogs.woria.cn/wp-content/uploads/2022/07/图片-4.png)
这说明服务端的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也相当的友好。我们逐条测试了前文中选定的几个命令。运行良好,无错误。而且,惊奇的发现。只要服务端正常运行,无论执行用户是否在线都可以完美运行。这真是太棒了!
接下来我们对网站进行一些补充收尾,在用户选择指定角色之后,可以生成一张空白的卡片。
![](https://blogs.woria.cn/wp-content/uploads/2022/07/图片-5-1024x449.png)
所有卡片都必须指定角色才可以生成。
![](https://blogs.woria.cn/wp-content/uploads/2022/07/图片-6-1024x239.png)
用户通过积分兑换或者慷慨赞赏就可以激活使用卡片。
除了角色分离卡之外,其他的卡片处理相对简单:
当卡片激活之后,我们允许用户自助点击“立即使用”,而角色分离卡因为需要指定转入的账号。所以,我们还需要为他增加一个按钮,设置转入账户。
![](https://blogs.woria.cn/wp-content/uploads/2022/07/图片-7-1024x250.png)
这个操作我们需要在后端进行严谨的逻辑判断:
1、是否支付/是否已使用
2、设置账户是否存在。
为了良好的用户体验,都需要设置正确的界面提示。
其实,我们这里偷了个懒,只验证账户是否存在。严格意义上来说,我们需要用户输入账号及密码,确实匹配才可以设置成功。
当用户设置需要转入的账号之后,就可以正确使用该卡了。
当后台收到使用卡片的指令,我们依据卡片的类型,生成指定的命令。假设这次需要执行的是修改账号命令,我们根据用户预设的转入账户及绑定角色,生成命令,并通过soap执行。获得soap的友好提醒之后反馈给用户,代码如下:
![](https://blogs.woria.cn/wp-content/uploads/2022/07/图片-8-1024x676.png)
注意到,当卡片被使用之后,我们要更新数据库中卡片的使用状态,并插入时间戳,执行日志。
留存日志的目的是为了出现异常之后,允许GM介入协助用户完成卡片的使用,也方便我们追踪问题。
经过测试,运行良好。从有想法,到设计,最后去实现。整个过程如上文陈述。
如有疑问,欢迎批评指正。
最后补充一点。切换阵营和种族之后,本身的声望及任务体系发生了改变。
经玩家测试后,我们发现声望会自动做对应的切换。但是任务体系不行。
联盟和部落的任务体系是完全不同的,或许一切任务都需要重新开始。
留待扩展:后来与服务器上玩家做了交流。更多的人希望自己的角色是人类,但可以有血精灵的外观…..
我很无语至极哦!不过,这依然是有办法实现的。
我们通过幻化物品的原理,对人物形象进行修改即可。
我们可以设计一个“画皮礼包”。允许在不修改任何游戏数据的情况下,选择自己喜欢的种族外观。
当然,实现起来可能稍显复杂。涉及到补丁、模型、数据库等等多项综合修改。
以后有时间的话可以尝试做一下。
最后,感谢您的阅读。