中国虚拟军事网(VME)- 专注于武装突袭系列虚拟军事游戏

 找回密码
 加入VME

QQ登录

只需一步,快速开始

搜索
查看: 2536|回复: 14

[讨论] 飞行员资格验证

[复制链接]
发表于 2013-4-8 10:25:35 | 显示全部楼层 |阅读模式
我看见有个服务器设定,即使你选了飞行员,上飞机后也会验证是你是否有资格开飞机,没有就被踢出飞机。然后那个服务器还要考核飞行资格,考试通过的才给资格。这是怎么实现的?
我查看了他们的验证脚本,其中有关键的一个命令行:
MGO_fnc_Perm_VehChk =

{
       
    scopeName "MGO_fnc_Perm_VehChk";
       
    //player globalChat "debug1";
       
    if((player getVariable ["perm_air", 0]) == 0) then
       
    {
               
       //player globalChat "debug2";
               
       private ["_veh"];
               
       _veh = vehicle player;
    ………………

注意到player getVariable ["perm_air", 0]),这个perm_air参数是从哪儿定的呢?我想了很久没想明白:
如果是玩家的签名文件,那任何一个玩家给自己的签名上提供这个参数,那不就自己给自己飞行权限了么?所以肯定不是。如果是存在一个白名单,那这个白名单怎么写呢,如何让服务器运行时查找这个名单呢?

请各位大师帮忙想想
发表于 2013-4-8 15:29:58 | 显示全部楼层
我记得7cav是用数据库的……玩家要register,来几次都有记录……
 楼主| 发表于 2013-4-8 15:38:16 | 显示全部楼层
hiddenzone 发表于 2013-4-8 15:29
我记得7cav是用数据库的……玩家要register,来几次都有记录……

是嘛,数据库方面的东西有更多信息么,我就知道dayz的数据库
 楼主| 发表于 2013-4-8 15:41:12 | 显示全部楼层
我想了一个方法,把既存的脚本改了,让perm_air这个参数变成我写死的一个文本中的遍历值,这个文本我会写明哪个玩家的GUID对应哪个"perm_air“值,让这个脚本运行时读取这个文本,能行么?
发表于 2013-4-8 19:01:37 | 显示全部楼层

RE: 飞行员资格验证

cccbss 发表于 2013-4-8 15:38
是嘛,数据库方面的东西有更多信息么,我就知道dayz的数据库

记录用户的名字什么的……

我记得这个版有关于外接数据库的帖子。

可以确定的是,7cav的domi不能移植,它要求服务器连接。
 楼主| 发表于 2013-4-8 22:03:48 | 显示全部楼层
这是OP4的解决方法,和本帖主题的方案截然不同,关键就是下面这段:
_isadmin = isClass(configFile >> "CfgPatches" >> "op4_admin");

只要不是_isadmin就不能扮演那个角色,功能是相同的,但是 "CfgPatches" 是什么? "op4_admin"是 "CfgPatches" 下的一个文件么?它的内容什么样?
 楼主| 发表于 2013-4-9 07:47:33 来自手机 | 显示全部楼层
还是OP4的方法入手,不懂ArmA的编程语言,我只能猜了,因为通篇没有找到"CfgPatches"的定义和声明,因此我判断这是一个系统认定的文件夹,而且这个文件夹原本是和config有关的,且这个文件夹不在misson里,想来想去符合这个标准的最有可能的就是服务器根目录下的userconfig文件夹,但其下的op4_admin这个文件内容是什么呢?游戏名?USERID?GUID?格式怎么写呢?需要探索
发表于 2013-4-9 11:22:56 | 显示全部楼层
载入上下权限的数据库接口代码
  1. if (local player) then {
  2.   switch (getplayerUID player) do
  3.   {
  4.     case "10086" : {  //10086你的Profiles里面唯一识别号,也就是UID,位数不定
  5.       player setVariable ["perm_air", 1];
  6.       player setVariable ["perm_armour", 0];
  7.       player setVariable ["perm_wheeled", 0];
  8.       player setVariable ["vpn_network", "ChinaMobile"];
  9.       /*
  10.       此处加入载入外部数据文件代码,载入数据,设置权限
  11.       */
  12.     };
  13.     case "10010" : {
  14.       player setVariable ["perm_air", 0];
  15.       player setVariable ["perm_armour", 1];
  16.       player setVariable ["perm_wheeled", 0];
  17.       player setVariable ["vpn_network", "ChinaUnicom"];
  18.       /*
  19.       此处加入载入外部数据文件代码,载入数据,设置权限
  20.       */
  21.     };
  22.     case "10000" : {
  23.       player setVariable ["perm_air", 0];
  24.       player setVariable ["perm_armour", 0];
  25.       player setVariable ["perm_wheeled", 1];
  26.       player setVariable ["vpn_network", "ChinaTelecom"];
  27.       /*
  28.       此处加入载入外部数据文件代码,载入数据,设置权限
  29.       */
  30.     };
  31.     default : { //此前未加入过本服务器的玩家怎么办,分值或权限不够的玩家怎么办
  32.       player setVariable ["perm_air", 0];
  33.       player setVariable ["perm_armour", 0];
  34.       player setVariable ["perm_wheeled", 0];
  35.       player setVariable ["vpn_network", "ChinaDiaosi"];
  36.       /*
  37.       此处加入存入外部数据文件代码,存入UID及其数据,供下次载入
  38.       */
  39.     };
  40.   };
  41. };
复制代码
  1. _isadmin = isClass(configFile >> "CfgPatches" >> "op4_admin");
复制代码
这段是检验客户端是否有 op4_admin 这个插件,这个插件不是公开的,看上去只有这个服务器的管理人员才会下发,有这个插件的必然是这个服务器的管理人员,任务直接赋予他(们)超级权限,而这个插件不影响正常整体网络运算,事实上是个空的插件定义即可,不过要带上Key就是件不太可能的事情了。你自己做的Key可不通不过验证。
不过理论上有两种可能让你得到这个权限,
1.自己管服务器管理员要一个op4_admin.pbo连带他的Key
2.自己做个NB的MOD,让全世界的大部分ArmA3服务器都用,类似ACE啊CBA之类,然后自己顺带着弄个op4_admin的小插件,附上你的Key,恩,That's it.

顺带一下op4_admin.pbo


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入VME

x
 楼主| 发表于 2013-4-9 13:17:04 | 显示全部楼层
拜谢Fromz大,这些信息量太大了,我好好消化一下再请教!!!!太感动了!!!!!
 楼主| 发表于 2013-4-9 13:24:09 | 显示全部楼层
本帖最后由 cccbss 于 2013-4-9 13:28 编辑

Fromz大,您贴的第一段代码我理解为通过getplayerUID函数获得玩家UID,然后把凡是允许的UID都用case 10086 xxxx的对比顺序写下去,挨个校验对吧。这样一定能解决问题!不过这个方法是把判断的白名单写进了任务pbo中,凡是进过服务器的人都能获得这些白名单的UID了,而且每次添加新的准许名单都要重新编辑任务pbo文件,麻烦我倒不怕,只是UID被所有人看到是否有安全隐患呢?

我看清了是获得UID,不是GUID,那么UID公开没有安全隐患吧
发表于 2013-4-9 15:47:30 | 显示全部楼层
本帖最后由 fromz 于 2013-4-9 15:50 编辑

没有 任何 安全隐患
正式版本的UID是根据Key算出来的,是不可逆的
或Steam账号随机进行了分配

打个比方,你的Key是 10 75 20
你的UID通过一个算法,好比是 (10+75)*20 = 1700
通过1700这个UID,就算知道算法,也不能反编译出来你的Key,就算编出来了,也不一定是你的Key (如 03 65 25,按照算法,也是1700),更不一定是符合系统检验的Key(系统检验更是另外一种算法,这很好的解释了ArmA2的算号器无法算出正版Key是何原因)

UID的泄露,没有半分钱安全隐患

另外你误解了UID的使用方式,他不是直接写在sqf或者打包进pbo的,那样不可能成为数据库随不同任务全局载入,他肯定是存在于服务器的数据库中的,sqf只是做了读取,写入,更新数据库文件的操作,充当接口程序而已。

仔细看我的代码你就会明白。我那个代码就是个原理性的东西。
 楼主| 发表于 2013-4-9 16:20:38 | 显示全部楼层
本帖最后由 cccbss 于 2013-4-9 16:23 编辑

Fromz大,我有了一个严重的问题,我没有为arma搭过数据库,一次也没有,我完全不知道需要什么数据库软件、如何让arma 服务器识别我的数据库接口,麻烦您再费费神传授一下吧。


另外关于OP4的方案,我理解了,就是做一个这样的pbo文件即可,内容其实无所谓,把这个pbo文件发给我允许的人,他挂着这个pbo进服务器就具备了所谓的admin属性,对吧。您说的bikey问题就是如果服务器开了验证key,他们挂的pbo可能不被服务器认可。但我记得有根据pbo文件做bikey的工具,我不能为op4_admin.pbo这么做一个bikey么?
发表于 2013-4-11 00:04:51 | 显示全部楼层
今天任务中赶来救援的飞行员被打死,机上我长空和约翰都是选到特种部队小队,所以都没法开飞机撤离……
建议把飞行员验证改成进驾驶舱才验证……特种部队里出现几个会开直升机的也不是什么稀罕事……
 楼主| 发表于 2013-4-11 07:33:20 来自手机 | 显示全部楼层
这改动是容易,但长远看不确定是否影响游戏性和代入感
发表于 2013-7-18 13:53:55 | 显示全部楼层
顶一下
您需要登录后才可以回帖 登录 | 加入VME

本版积分规则

小黑屋|中国虚拟军事网

GMT+8, 2024-5-2 21:30

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表