跳到正文
文档
本页内容

运行和扩展公共服务器

开源SDK中已有哪些可用于Bullet Hero公共服务器的部分,以及哪些尚未确定:协议、API、审核工具

警告

目前还没有服务器代码,也没有协议。下面是服务器将要运行的那部分SDK,它已经可以工作。这里没有服务器本身的端点、消息格式或API,因为它们还不存在

SDK在服务器上运行

SDK是游戏的开放数据模型:模型、JSON和二进制序列化、校验规则、生成器。Unity编译的同一份源码也能构建为一个普通的netstandard2.1库,其中不含引擎。服务器或工具可以引用它:

dotnet build -c Release BH.SDK.csproj
dotnet pack  -c Release BH.SDK.csproj

包名为BulletHero.SDK。代码位于github.com/bullet-hero/sdk,采用MIT许可证

SDK版本通常与游戏版本一致,目前还不承诺API稳定。更多:版本与迁移

客户端和服务器对同样的模型运行同样的检查。编辑器认为已就绪的关卡,在服务器上同样就绪。不存在需要保持同步的第二套规则

ValidateForPublish

一次调用就能回答“这个关卡能否在这里发布”:

ValidationFacade.ValidateForPublish(meta, profile, level, now, payload)

它一次执行三轮检查:

  1. 针对关卡及其元数据的声明式规则
  2. 针对关卡的图检查
  3. 服务自己在PublishProfile中设定的条件

关卡本身可以不传。metadata.json是单独的文件,这样目录可以在不打开任何关卡的情况下评估成千上万个关卡。这一轮开销很小的检查覆盖了大部分策略

但有两项检查需要level.json:完全没有记录的资源,以及资源的获取方式。只针对元数据的报告干净,意思是“已读取的内容中没有问题”。在检查关卡文件之前,IsReady始终为false

payload携带测得的大小:每个资源、level.json、metadata.json以及整个关卡。没有它,就无法检查配置中的大小限制

检查过程中不会修复任何东西,这是有意为之。内容在发出途中被悄悄修改,是服务最不希望发生的事。更多:校验

三种结论

分组含义服务器的处理
Error服务拒绝拒绝上传(HasErrors)
Warning可以发布,但需要有人查看将关卡放入审核队列(NeedsManualReview)
Advice已记录不做处理

客户端在上传开始前就会因同样的错误阻止上传。你的服务器会拒绝的关卡,很少能真正送到它那里

你自己的PublishProfile

服务的策略是一个文件,即一个序列化的SDK模型。更严格或更宽松的服务器只是换一个文件,而不是分叉代码

留在玩家设备上的关卡不做任何检查。配置只在关卡被提交给某个服务的那一刻才起作用。作者如何为这一刻准备关卡:发布准备

预设:

预设键适用于
CreateOpen()local设备上的关卡,没有任何要求
CreateStandard()standard公共服务器,策略见用户关卡许可政策
CreateStrict()strict商店版,不允许直接URL,每个资源都要有哈希

主要字段:

字段决定什么
AllowedLicenses接受哪些常见许可证,为空则全部接受
AllowedUriTypes资源可以如何获取,为空则全部允许
AllowUnknownLicense资源是否可以不说明其使用条件
AllowPermissionInstead权利人的许可能否替代被拒绝的许可证(总是送去审核)
RequireResourceMeta、RequireResourceUrl、RequireAttribution每条资源记录必须包含什么
RequireAgeRating、RequireLevelAuthors、RequireHashes关卡必须声明什么
MaxResourceBytes、MaxDataFileBytes、MaxTotalBytes大小限制,0表示不限
Sources、UnknownSourceTrust可信网站名单,以及不在名单中的网站如何评级

两个公共预设:

standardstrict
资源使用直接URL允许禁止
每个资源都有署名不要求要求
每条记录都有内容哈希不要求要求
单个资源上限64 MB32 MB
level.json或metadata.json上限32 MB16 MB
关卡上限256 MB128 MB
不在名单中的网站RequiresLicenseCheckRequiresResourceCheck

所有预设和字段:发布配置

为什么standard中没有GPL

standard中有意不包含GPL系列许可证。通过App Store再分发GPL作品会与Apple的条款冲突。允许这类许可证的目录,以后就无法提供给iOS

须知

SDK自带的可信网站名单只是一个起点。网站会更改条款,因此每个运营者都应在自己的配置中覆盖它。任何东西都不能假定某个特定网站在名单中

审核

官方服务器计划在检查之上增加的内容。公共服务器很可能也需要这些:

  • 审核队列。由Warning类问题填充
  • 举报和封禁关卡与用户。Google Play和App Store的规则要求,凡是展示给其他人的内容都必须具备这两项
  • 按哈希下架。资源记录可以以sha256:<hex>的形式携带其文件的内容哈希。投诉会指明一部作品,有了哈希,就能通过查找而不是凭名称猜测找到所有带有它的关卡。编辑器在导入资源时会记录哈希
  • 服务条款。它们涵盖许可证不涵盖的内容:作者声明自己拥有权利、运营者删除关卡的权利、在列表中展示关卡名称和封面的权利

Steam创意工坊的运作方式不同。文件由Valve托管。开发者只能在发布后对其评级,并决定游戏加载哪些内容

归档格式

关卡是一个装有文件的文件夹,归档包让它便于携带。SDK能读写的格式:

格式读取写入说明
.tar.gz是是默认格式
.zip是是可以用AES-256逐项加密
.tar.gz.gpg、.zip.gpg是是用口令保护的OpenPGP消息,是.tar.gz唯一能用的保护方式
level.json.gpg是是单个受保护的关卡文件
.7z否否能够识别,以便按名称明确拒绝

格式根据文件的开头字节判断,从不根据扩展名。文件名是任何人都能修改的部分

tar -xzf、gpg -d和任何zip解压工具都能打开所有可写入的格式。解包关卡不需要游戏。更多:归档包与保护

尚未确定的事

  • 游戏与服务器之间的协议,以及OWS和NOWS是否使用同一个协议
  • 服务器API:上传、目录、搜索、账号
  • 如何让游戏指向某个社区服务器
  • 服务器本身如何扩展,用什么语言
  • 在服务器上一起游玩:传输、权威方、关卡同步和大厅

关于一起游玩,只确定了一件事:玩家的化身如何根据网络消息出现和消失

向任何服务发布关卡的功能,最早也要在gv 1.0.0之后的更新中才会推出。检查所依赖的数据必须在关卡发布前就记录在关卡中

关卡许可证与任何服务器

关卡默认以CC BY-NC授权,作者可以在关卡元数据中选择其他许可证。分享关卡的许可由作者直接授予每一位接收者。因此任何服务器,无论官方还是社区,都不得以商业方式托管CC BY-NC关卡

服务器即使采用不同许可证下的不同代码,也不会改变内容的任何权利。面向作者的完整规则:用户关卡许可政策