본문으로 건너뛰기
문서
이 페이지의 내용

공개 서버와 그 확장

공개 서버를 위한 오픈 SDK가 이미 있습니다: 클라이언트 빌드와 같은 모델과 검사를 Unity 없이 씁니다. 프로토콜, 서버 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

한 번의 호출로 "이 레벨을 여기에 게시할 수 있는가"라는 질문에 답합니다:

new 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스토어 빌드, 직접 링크 금지, 모든 리소스에 해시

주요 필드:

필드결정하는 것
AllowedLicenses어떤 일반 라이선스를 받아들일지, 빈 목록이면 모두 받아들임
AllowedUriTypes리소스를 어떤 방식으로 가져올 수 있는지, 빈 목록이면 모든 방식을 허용
AllowUnknownLicense리소스가 자기 조건에 대해 아무것도 밝히지 않아도 되는지
AllowPermissionInstead거부된 라이선스를 권리자의 허락으로 대신할 수 있는지 (항상 검토로 보냄)
RequireResourceMeta, RequireResourceUrl, RequireAttribution각 리소스의 기록에 무엇이 있어야 하는지
RequireAgeRating, RequireLevelAuthors, RequireHashes레벨이 무엇을 선언해야 하는지
MaxResourceBytes, MaxDataFileBytes, MaxTotalBytes크기 제한, 0이면 제한 없음
Sources, UnknownSourceTrust신뢰하는 사이트 목록, 그리고 목록에 없는 사이트를 어떻게 평가할지

두 공개 프리셋:

standardstrict
리소스 직접 링크허용금지
모든 리소스에 저작자 표시필요 없음필수
모든 기록에 콘텐츠 해시필요 없음필수
가장 큰 리소스64 MB32 MB
가장 큰 level.json 또는 metadata.json32 MB16 MB
가장 큰 레벨256 MB128 MB
목록에 없는 사이트RequiresLicenseCheckRequiresResourceCheck

모든 프리셋과 필드 - 게시 프로필

standard에 GPL이 없는 이유

GPL 계열 라이선스는 일부러 standard 프리셋에서 뺐습니다. App Store로 배포되는 GPL 저작물은 Apple의 약관과 충돌합니다. 이런 라이선스를 허용한 카탈로그는 나중에 iOS용으로 내놓을 수 없게 됩니다

참고

SDK와 함께 제공되는 신뢰 사이트 목록은 출발점일 뿐입니다. 사이트는 약관을 바꾸므로, 서버 운영자는 각자 자기 프로필에서 이 목록을 재정의해야 합니다. 어떤 것도 특정 사이트가 목록에 있다는 점에 기대서는 안 됩니다

모더레이션

공식 서버가 검사 위에 더할 계획인 것들입니다. 공개 서버에도 아마 필요할 것입니다:

  • 모더레이션 대기열. Warning 그룹의 문제가 이 대기열을 채웁니다
  • 신고와 차단은 레벨과 사용자 모두에 적용됩니다. Google Play 규칙과 App Store 규칙은 다른 사람이 보는 모든 콘텐츠에 이 두 가지를 모두 요구합니다
  • 해시로 삭제. 리소스 기록에는 파일의 콘텐츠 해시를 sha256:<hex> 형식으로 저장할 수 있습니다. 신고는 저작물을 지목하며, 해시가 있으면 그 저작물이 들어간 모든 레벨을 제목으로 짐작하지 않고 검색으로 찾을 수 있습니다. 에디터는 리소스를 가져올 때 해시를 기록합니다
  • 이용 약관. 라이선스가 다루지 않는 것을 다룹니다: 권리를 가지고 있다는 제작자의 진술, 레벨을 삭제할 수 있는 서버 운영자의 권리, 목록에 레벨 제목과 커버를 표시할 권리

Steam 창작마당은 다르게 동작합니다. 파일은 Valve 쪽에 저장되며, Bullet Hero 쪽에는 모더레이션 대기열이 없습니다. 게임은 업로드 전에 레벨이나 컬렉션을 검사하며, 오류가 있으면 업로드를 막습니다 - 게시. 게시 후에는 게임이 그중 무엇을 내려받을지만 정합니다

아카이브 형식

레벨은 파일 폴더이며, 아카이브로 묶으면 옮기기 쉬워집니다. SDK가 읽고 쓰는 형식:

형식읽기쓰기비고
.tar.gz예예기본값
.zip예예항목별로 AES-256 암호화 가능
.tar.gz.gpg, .zip.gpg예예비밀번호로 보호되는 OpenPGP 메시지, .tar.gz에 쓸 수 있는 유일한 보호 방식
level.json.gpg예예보호된 레벨 파일 하나
.7z아니요아니요명확한 이름으로 거부하기 위해 감지만 함

형식은 확장자가 아니라 파일의 첫 바이트로 판별합니다. 파일에서 누구나 바꿀 수 있는 부분은 이름뿐입니다

tar -xzf, gpg -d, 그리고 아무 zip 압축 프로그램으로 SDK가 쓰는 모든 형식을 열 수 있습니다. 레벨 압축을 풀 때 게임은 필요 없습니다. 자세히 - 아카이브와 보호

정해지지 않은 것

  • 게임과 서버 사이의 프로토콜, 그리고 그 프로토콜이 OWS, NOWS 양쪽에서 같을지
  • 서버 API: 업로드, 카탈로그, 검색, 계정
  • 게임에 커뮤니티 서버를 지정하는 방법
  • 서버 자체를 어떻게, 어떤 언어로 확장할지
  • 서버에서 함께 플레이하기: 전송, 권한, 레벨 동기화, 로비

함께 플레이하기에 대해 정리된 것은 하나뿐입니다: 네트워크 메시지에 따라 플레이어의 아바타가 나타나고 사라지는 방식

어떤 서비스로든 레벨을 게시하는 기능은 gv 1.0.0 다음 업데이트보다 일찍 나오지 않습니다. 검사가 기대는 데이터는 레벨이 게시되기 전에 레벨에 들어가 있어야 합니다

레벨 라이선스와 모든 서버

기본적으로 레벨은 CC BY-NC(으)로 배포되며, 제작자는 레벨 메타데이터에서 다른 라이선스를 고를 수 있습니다. 레벨을 공유할 허락은 제작자에게서 각 수령자에게 직접 갑니다. 그래서 공식이든 커뮤니티든 어떤 서버도 CC BY-NC 레벨을 상업적으로 호스팅할 수 없습니다

다른 라이선스를 가진 다른 코드로 서버를 돌려도 콘텐츠에 대한 권리는 달라지지 않습니다. 제작자를 위한 전체 규칙 - 사용자 레벨 라이선스 정책