《Armored Warfare》——一个说的过去的继承者

玩《Armored Warfare》(以下简称AW)也有一段时间了,从AW在内测的时候就在一直在官方主页和youtube上关注这个游戏,由于之前一直有不错的游戏玩,也没有花钱买内测资格(觉得这种设定挺傻的,不知道是不是国外的运营商跟着天朝的这一票学的,不学好净学坏)。之后记得10月左右的时候AW开始了公测,第一时间开始玩,中间又穿插着巫师3和辐射4,虽然是断断续续的玩,也没有像《War Thunder》那样一下子跳好几个版本似的断断续续。多少也算有些感慨吧。

AW是黑曜石工作室的作品。黑曜石开发了一系列rpg作品,传统的rpg作品有前些年的《无冬之夜2》系列,去年的《永恒之柱》,还有比较『奇葩』的rpg游戏《辐射:新维加斯》、《南方公园:真理之杖》等(《地牢围攻3》有些让人失望,归在等里好了)。之前虽然也做过《skyforge》这样的作品,可终归不是很流行。

后来我听说黑曜石竟然去做WoT-like了,心里一惊,赶紧上youtube看了个预告片,发现质量还不错,于是一直关注了下来。

是的,谈到这种慢节奏装甲战题材的射击游戏,坦克世界(《World of Tanks》,WoT)是个绕不开的坑。其虽然不是第一个吃螃蟹的人,也算得上是第一个把螃蟹做的能让大家吃得人。他就像别人家的孩子一样,所有的后来者都要和他比较一番,《War Thunder》如此、AW如此、甚至《红色管弦乐队2》都逃不过一劫。

上学的时候每周开班会,经常会有同学被要求介绍学习经验。我感觉游戏也是这样。有些经验比较容易照搬,比如MOBA游戏里的『锤子系』等技能(当然这种技能也不是只有MOBA里有,此处特指在MOBA中的应用),客观来讲,LOL从DotA里学了不少;当然有的经验照搬也是行不通的,CF里不卖火麒麟,卖点卡的话是肯定过不下去的,而CSGO里卖火麒麟的话估计玩家又要骂G胖了。

从这个角度来讲,我觉得黑曜石学的不错。AW无论从地图大小、地图类型、游戏模式都几乎是『照抄』WoT。

虽然是现代战争的背景,并没有让玩家像在红色管弦乐队2一样呆在车里看雷达射击。也没有走War Thunder那个无血条无点亮机制的老路。虽然WoT的这一套机制已经广受诟病许多年,不点亮就看不见,打观察塔掉血之类的槽点已经不再新鲜。然而事实就是事实,玩家再吐槽,依旧会乐此不疲的玩。

从这点来说,我认为黑曜石的选择是正确的,游戏就是游戏,不是艺术品,也不是战争模拟游戏。

网络游戏想赚钱,有一定的用户基数是必需的,其与《ARMA》系列、《闪点行动》系列的那一套『硬核』的游戏制作思路是完全矛盾的(即使是这样,《ARMA》和《闪点行动》最新作也都变得相对快餐化了)。在一个网络游戏当中,让玩家跑路半个小时,然后千辛万苦到了任务地点就立扑,这是无法想象的事情(也许60年代的魔兽世界是个例外?)。

AW因为慢节奏在线FPS的特质,注定就是一个快餐游戏。

玩家不可能花很多的时间学习复杂的游戏系统。反面例子就是《精英:危险》这种内容不多,系统还特别复杂的游戏,即使玩过了教学,刚上手的时候依旧不知道该怎么赚钱;而CF不得不说在这方面是个正面例子,首先有经典又流行的CS在前面做铺垫,其次系统简单到基本上不需要做铺垫,拿起枪就是干。AW类似于CF,前面有个谈不上经典但还算流行的WoT做铺垫,之后还有个说的过去的教学关。玩家是可以快速进入新手房玩个痛快的。

而游戏想有趣方法则很多了,内容充实是一方面,这种快餐网游想内容充实是比较困难了;而系统有趣则是另一方面。

从系统上说,AW是师承WoT,在WoT的基础上有些很小的改变。轮式车辆的引入、反坦克导弹的引入等特性的引入算是一些吧。

这导致AW也继承了WoT的许多问题。由于AW并没有中国公司代理,只好玩的北美服。美国玩家是个非常有趣的群体,他们游戏的心态好像和大陆玩家不太一样,不是特别认真。在这种情况下,WoT的一系列问题就被放大了,地图设计问题——玩家蹲的飞起(campers),出生点设置问题——一波流转一波蹲。

归根结底还是AW也好,WoT也好,匹配系统都太糟糕。不同水平的玩家被放到了一起,自然水平比较高的玩家嫌新手拖后腿,新手嫌压力大。这个道理已经在70年代之后的wow被验证了一次,相信接下来依旧会被一次又一次的验证。

当然,由于用了CryEngine,AW的画质还是十分感人的,场景的设置也很不错,天上飞机导弹不断,海里航母驱逐眼前。当然帧数也十分感人,i54590+非公970上次最高画质经常只有40帧左右,优化实在着急。

总的来说,如果你没玩过WoT,那么AW可以一玩;如果你WoT玩了有3000盘以上,就不要尝试这个游戏了,不会给你惊喜的。

MongoDB上手笔记2——新建用户并设置权限

上一篇说到了把MongoDB安装完毕,并设置了开机启动服务。接下来记录下怎么创建用户,并通过MongoDB的权限管理功能进行管理。

mongodb的用户权限管理的方式是分组的,不同的用户组有着不同的权限,对应的就是可以执行不同的命令。

形象地说就是警察用户组的只有抓捕的权力,医生用户组的只有开处方的权力等等。MongoDB的用户组的设置也秉承了这样的方法,在保证能正常使用的前提下,只给特定用户最少的权力。

首先,先启动mongod,此处使用配置文件的启动方法。

mongod --config E:/MongoDB/mongod.conf

然后连接mongodb。

mongo 127.0.0.1:27999
show dbs
use admin

这个时候可以看到成功的连接了进去,只有一个local的数据库。然后切换到admin数据库,准备创建用户。

MongoDB内置了许多类型的用户类型,大致分为了几类:

  • 单个数据库用户(Database User Roles)
  • 单个数据库管理员(Database Administration Roles)
  • 集群管理员(Cluster Administration Roles)
  • 备份恢复管理员(Backup and Restoration Roles)
  • 全部数据库的管理员(All-Database Roles)
  • 超级用户(Superuser Roles)

不同的用户类别下都有若干个用户类型,分别对应的这不同的权力。比如现在有一个数据库里记录着不同时间段的测量数据,我们想把特定时间段的测量数据读出来,然后在脚本里输出成csv文件,我们就需要一个read用户就够了,而不需要一个root用户(对应的就是上面说的『最少权力』的原则)。

回到正题,简单的举个例子,我们需要一个read用户用来读测量数据用来显示输出,一个readWrite用户用来写数据进入数据库,还有一个权力最大的用户来管理用户和数据库。然我就像建立一个公司一样,我们先任命一个boss,然后再由boss找员工(当然如果这个公司只有一个人的话,boss又要当老板,又要当苦力,那么在roles里面填多个role就可以了)。

db.createUser({user: "boss",pwd: "123456",roles:[{ role: "userAdminAnyDatabase", db: "admin" }]})

我们创建了一个叫boss的用户,他的角色是userAdminAnyDatabase,。从名字上也能看出来,userAdminAnyDatabase类型的用户可以管理所有数据库下的用户。(如果想在创建这个用户之前就开启权限管理,则需要在配置文件中开启localhost exception)

完成了用户管理员的创建之后就可以重新启动启用了权限管理的MongoDB了(此处在管理员权限的cmd中安装了mongoDB的服务)。

mongod --config E:/MongoDB/mongod.conf --auth --install

如果这个时候直接登陆的话,会发现有的命令是无法执行的,因为没有这个权限。比如最简单的显示所有的数据库都无法执行。

C:\Users\Juiceyang>mongo 127.0.0.1:27999/admin
MongoDB shell version: 3.0.6
connecting to: 127.0.0.1:27999/admin
> db
admin
> show dbs
2015-12-13T20:29:44.926+0800 E QUERY    Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases:
1.0 }",
        "code" : 13
}
    at Error (<anonymous>)
    at Mongo.getDBs (src/mongo/shell/mongo.js:47:15)
    at shellHelper.show (src/mongo/shell/utils.js:630:33)
    at shellHelper (src/mongo/shell/utils.js:524:36)
    at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47
> ^C
bye

而登录了之后,就获得了部分权限,比如可以看都有哪些数据库了。

C:\Users\Juiceyang>mongo 127.0.0.1:27999/admin -u boss -p 123456
MongoDB shell version: 3.0.6
connecting to: 127.0.0.1:27999/admin
> show dbs
admin  0.078GB
local  0.078GB

之后就可以开始创建其他的用户了,创建的方法和创建boss的方法一样。假设我们需要对logs数据库进行读写。

use logs
db.createUser({user: "reader",pwd: "123456",roles:[{ role: "read", db: "logs" }]})
db.createUser({user: "readwriter",pwd: "123456",roles:[{ role: "readWrite", db: "logs" }]})

之后尝试用reader用户往gen1集合写一次数据。

> db.gen1.insert({"time":1, "value":1});
WriteResult({
        "writeError" : {
                "code" : 13,
                "errmsg" : "not authorized on logs to execute command { insert:
\"gen1\", documents: [ { _id: ObjectId('566d691840d302a5c4e9cfc6'), time: 1.0, v
alue: 1.0 } ], ordered: true }"
        }
})

发现无法写入,原因是没有权限执行insert。

之后换readwriter尝试一次。

> db.auth("readwriter","123456")
1
> db.gen1.insert({"time":1, "value":1});
WriteResult({ "nInserted" : 1 })

发现成功写入了。

再换回reader,读一次数据。

> db.auth("reader","123456")
1
> db.gen1.find()
{ "_id" : ObjectId("566d696a40d302a5c4e9cfc7"), "time" : 1, "value" : 1 }

发现能够成功读数据。