7Days To Die サーバーの建て方

こちらの記事はa16の情報です。
最終更新日: 2017/7/3

これら一式を担うサーバソフトを公開しています。そちらもご検討ください。

目次


はじめに

まず、サーバーを建てるための前提スキルとして
  1. 自分で解決できる能力
  2. 使用しているOSを問題なく使える
  3. ネットワークに関する最低限の知識
が必要であるということを把握しておいてください。
また、PC初心者を対象とした記事ではないため基礎的内容の細かい説明は省きます。
わからない部分は各自でお調べください。

また、筆者はWindowsユーザーであるためWindowsの構築方法以外は把握しておりません。
ご了承ください。

Youtube動画版解説

Youtubeにて実演動画をアップロードしておきました。

https://www.youtube.com/watch?v=ZdkkKwwan1M

サーバーの種類

まず、7dtdサーバーには2通り、細かく分けて3通りあります。
  1. ゲーム内からサーバーを建てるサーバー
  2. ゲームクライアントを独立させたサーバー
  3. 完全サーバー専用の独立サーバー
まず1つ目が様々なゲームでも用いられている「ゲーム内からサーバーを建てるサーバー」です。
これは普通にプレイするだけでサーバーが開けられるというものですごく簡単です。
ただし、デメリットもあるため注意が必要です。(後述)
次に「独立させたサーバー」です。
一般的にサーバーといえばこの方法を用います。 独立しているため安定性が高く、やり方によればカスタマイズも可能です。 ただし、こちらにもデメリットがあります。(後述)

さらに詳しく見てみましょう。
  • ゲーム内サーバー
  • 非常に簡単にマルチプレイができる方法です。
    設定も簡単に行えることからスキルがなくてもサーバー構築することができます。

    ただし、ゲーム自体をサーバーとするためエラーなどによる強制終了で、データのロールバックや破損が起こる可能性があります。
    また、ホストが抜けるとサーバーも終了します。
  • ゲームを独立させたサーバー
  • こちらはゲーム内サーバーと違い、独立したサーバーで、Dedicated Serverといいます。
    ゲームとは別で動作するため、ホストが抜けようがエラー落ちしようが終了することはありません。

    ただし、ゲームをするマシンと同一のマシンで行う場合はマシンスペックに注意が必要です。
    ゲームとサーバーを2つ動かすことになるのでメモリの大消費などが懸念されます。
    完全独立サーバーとの違いはゲームクライアントを使用する点です。
  • 完全独立サーバー
  • こちらも上のサーバーと同じです。
    違うところとしては完全サーバー専用であり、Server Fixes(Modのようなもの)の使用も可能です。
    なお、こちらは64bit OS専用となります。
今回は一番下の「完全独立サーバー」を使用した解説を行います。
なお、ゲームを独立させたサーバーも全く同じです。

下準備

まずDedicatedサーバーのインストールを行います。
Steamのツールより7 Days to Die Dedicated Serverのインストールを行ってください。

下準備はこれで完了です。
ただし、こちらのサーバーは64bit OS専用であるため32bit OSの場合はこの手順を飛ばしてゲームクライアントにて同様の動作を行ってください。
どちらでも動きます。

ポート開放・転送設定

サーバーに付き物なのがこのポート開放・転送設定です。
こちらをしなければローカルネットワーク外からの接続はできません。

こちらの項目ではポート開放以外詳細なやり方は載せません。
ルーターによって方法が変わるため、載せることができません。

やり方は知ってるけれど、プロトコルがわからない方は以下を参考に。
TCP 26900
UDP 26901, 26902 (不必要?)
しかし、UDP26901, 26902の開放はしなくても接続できるんですよね。
こちらのポート開放の必要性が確認できていません。
繋がらない場合はUDPポートのほうも開放・転送設定をしておいてください。


ポート開放はファイアウォールで行います。
ファイアウォールを開き、詳細設定を開いてください。


受信の規則に7 Days to Dieの規則が無ければ「新しい規則」で規則の追加を行います


「プログラム」を選択して次へ。


「このプログラムのパス」に7daystodie.exeのパスを。


「接続を許可する」


こちらは任意ですが、プライベートでいいでしょう。


あとは適当に名前を付けてOK。
ただ、これでいけるかどうかまだ確認ができていないので、できなかった場合はお問い合わせください。

サーバー設定

続いてサーバー設定を行います。
先程インストールした7 Days to Die Dedicated Serverの保存されている場所を開けてください。
serverconfig.xmlをテキストエディタなどで開き、以下の設定を行います。

記述内容についてですが、xmlで記述されています。
<property name="XXX" value="YYY" />
こうあるとすれば、YYYを書き換えることで設定の変更ができます。
XXXはプロパティ名です。

ゲームシステム関係
プロパティ名 説明
ServerPort 数値
(範囲の詳細はポート番号の種類を参照)
待機するポート番号(def: 26900)
ServerIsPublic true/false ConnectToServerのサーバー一覧に表示するかしないか。trueだと表示されます。(def: true)
ServerName 文字列
(1バイト文字以外はおそらく使用不可)
サーバー名。サーバーリストに表示される名前です。
ServerPassword 文字列
(1バイト文字以外はおそらく使用不可)
サーバーのパスワード。設定すると接続の際にパスワード認証が行われます。
ServerMaxPlayerCount 数値 サーバーに接続できる最大人数(def: 8)
ServerReservedSlots 数値 a16より追加
特権を割り当てることができるプレイヤーの予約数です。MaxPlayerCountには含まれないようです。
原文: Out of the MaxPlayerCount this many slots can only be used by players with a specific permission level
ServerReservedSlotsPermission 数値 a16より追加
ServerReservedSlotsの予約済みスロットを使用するために必要な権限レベル。
原文: Required permission level to use reserved slots above
ServerAdminSlots 数値 a16より追加
管理者専用予約スロット数。管理者は参加者数がMaxPlayerCountに達していても参加することが可能です。
原文: This many admins can still join even if the server has reached MaxPlayerCount
ServerAdminSlotsPermission 数値 a16より追加
ServerAdminSlotsの予約済みスロットを使用するために必要な権限レベル。
原文: Required permission level to use the admin slots above
ServerDescription サーバーの説明文
ServerWebsiteURL 文字列
(1バイト文字以外はおそらく使用不可)
サーバーのウェブサイトURL
ServerDisabledNetworkProtocols UNET
RakNet
SteamNetworking
a16より追加
Unityにおけるネットワークシステムで使わない物がある場合指定すると無効化されるようです。必要性がいまいち感じないのでデフォルトでも問題ないでしょう。
原文: Networking protocols that should not be used. Separated by comma. Possible values: UNET, RakNet, SteamNetworking. Ex: "unet,steamnetworking"
GameWorld ・Navezgane
・MP Wasteland Horde
・MP Wasteland Skirmish
・MP Wasteland War
・Random Gen
ワールドの種類を設定します。
いくつか値がありますが、普通にサバイバルするのであればNavezgane/Random Genを選びましょう。
そのほかはクリエイティブ専用だそうです。(def: Navezgane)
GameName 文字列
(1バイト文字以外はおそらく使用不可)
ワールドの名前です。 GameWorldでRandom Genを指定している場合はこれがシード値になります。
GameDifficulty 0, 1, 2, 3, 4 ゲームの難易度です。 0-4まで指定できるようで、0が最も低く、4が最も高くなります。(def: 2)
GameMode ・GameModeSurvivalMP
・GameModeSurvivalSP
ゲームモードです。
2つありますが、GameModeSurvivalMPを入れておきましょう。(def GameModeSurvivalMP)
ZombiesRun 0, 1, 2 ゾンビが走るか走らないかの設定です。
0だと夜間だけ走り、1だと走りません。
2は昼夜問わず走ります。
BuildCreate true/false チートモードです。
いわゆるクリエイティブモード。
DayNightLength 数値(分単位) ゲーム内での一日の時間です。
リアルタイム指定で、60であればリアルタイム1時間でゲーム内日付が変わります。
DayLightLength 数値(時間) 太陽が出ている時間を設定します。
ゲーム内時間で時間刻みで設定することができます。
18であればゲーム内時間で18時間太陽が出ています。
FriendlyFire true/false プレイヤー同士での攻撃にダメージ判定を与えるか与えないかです。
trueにするとプレイヤーキルができます。
PersistentPlayerProfiles true/false falseにしておくとプレイヤープロフィールの変更が可能で、trueにしておくとそのサーバーに初めに参加したときのプロフィールが使用されます。
PlayerSafeZoneLevel a11より追加
おそらくプレイヤーがスポーンした時敵性生物を配置しない距離でしょうか?
レベルの定義が不明です。
(If a player is less or equal this level he will create a safe zone (no enemies) when spawned)
PlayerSafeZoneHours a11より追加
PlayerSafeZoneLevelが有効な時間です。
ゲーム内時間で設定した時間(Hour)だけ有効になります。
DropOnDeath 0, 1, 2, 3 死亡時の所持アイテムドロップの設定です。
0は所持品全てをその場に
1はツールベルトのみ
2はバックパックのみ
3は所持品の消去
DropOnQuit 0, 1, 2, 3 サーバー退出時の所持アイテムドロップの設定です。
0は何もドロップしない
1は全て
2はツールベルトのみ
3はバックパックのみ
BloodMoonEnemyCount 整数値
a16より追加
ホードの間に湧くゾンビの数です。プレイヤー毎に適用されるようで、この数字 x プレイヤーの数が出現数でしょうか。
The number of zombies spawned during blood moons per player.
EnemySenseMemory 数値(秒) a16より削除
ゾンビが警戒モードに入ってから見失うまでの時間・・・かな?
EnemySenseMemory 数値(秒) 敵が出現する割合。
0 = 0%
1 = 50%
2 = 75%
3 = 100%
4 = 125%
5 = 150%
EnemyDifficulty 0, 1 敵の凶暴さ・・・?イマイチ分かりません。
BlockDurabilityModifier 数値(%) ブロックの硬さの割合。
100%を基準とした割合です。
ゾンビに対する耐久も含まれている模様。
LootAbundance 数値(%) 探索時に回収できる物資の量の割合。
LootRespawnDays 数値(日) 探索物から得られるアイテムの復活する間隔。
LandClaimSize 数値(ブロック) LandClaimの有効範囲。
LandClaimDeadZone 数値(ブロック) LandClaim同士配置できない距離
LandClaimExpiryTime 数値(日) オフラインでも保護される時間。
LandClaimDecayMode 0, 1, 2 LandClaimの効果の減衰を示すようですが、イマイチわかりませんでした。
LandClaimOnline
DurabilityModifier
数値(倍数) LandClaimの範囲内(LandClaimSize)におけるブロックの硬さ。
AirDropFrequency 数値(時間) 航空支援投下の間隔、ゲーム内時間で設定します。
MaxSpawnedZombies 数値(数) ゾンビの最大湧き数
増やしすぎるとメモリ消費が大きくなるため注意が必要。
MaxSpawnedAnimals 数値(数) a11.3より追加
動物の最大湧き数
BedrollDeadZoneSize 数値 a16より追加
ベッドロールの付近安全地帯サイズの設定です。詳しい単位はわかりません。
原文: Size of bedroll deadzone, no zombies will spawn inside this area, and any cleared sleeper volumes that touch a bedroll deadzone will not spawn after they've been cleared.

サーバーシステム関係
プロパティ名 説明
ControlPanelEnabled true/false ウェブコントロールパネルを有効にします。
後ほど出てくるTelnetを使う方法もありますが、コンソールがこの二つしかないためTrueにしておいてもいいでしょう。
ただし、管理コンソールであるため、ポート開放は注意です。
ControlPanelPort 数値
(範囲の詳細はポート番号の種類を参照)
コントロールパネルが待機するポート番号。(def: 8080)
ControlPanelPassword 文字列
(1バイト文字以外はおそらく使用不可)
コントロールパネルにアクセスする際に問われるパスワードです。
TelnetEnabled true/false Telnetを有効にします。
ウェブコントロールパネル同様数少ない管理用コンソールアクセス方法であるため有効にしておきましょう。
ただし、ウェブコントロールパネル同様ポート開放は要注意。

また、7dtdのTelnetは暗号化が行われていません。
平文でパスワードがやり取りされている点も要注意。
TelnetPort 数値
(範囲の詳細はポート番号の種類を参照)
Telnetが待機するポート番号(def: 8081)
TelnetPassword 文字列
(1バイト文字以外はおそらく使用不可)
Telnetにアクセスする際に問われるパスワードです。
AdminFileName 文字列(相対/絶対パス?) 管理者やホワイトリストなどのデータを格納するxmlファイルの指定
相対で指定した場合はAppData以下の7DaysToDieディレクトリがルートとなります。
EACEnabled true/false EAC(Easy Anti Cheat)を有効にするかしないか。
主に海賊版やチートMOD対策です。
HideCommandExecutionLog 数値 a16より追加
コマンドを実行した際にログ上にその旨を表示するかどうか。
0: すべて表示
1: TelnetあるいはControlPanelからのコマンド実行のみ非表示
2: [1]に加えてゲームクライアントからのコマンド実行も非表示
3: すべて非表示
原文: Hide logging of command execution. 0 = show everything, 1 = hide only from Telnet/ControlPanel, 2 = also hide from remote game clients, 3 = hide everything
MaxUncoveredMapChunksPerPlayer 数値 a16より追加
各プレイヤーがどれだけの範囲でチャンクを描写するかどうかを設定します。 プレイヤーあたりの最大マップファイルサイズは512バイトにこの値を掛けたものです。
標準値は131072で、ゲーム内で32km²を表します。 最小単位は4096/km²でしょうか。
原文: Override how many chunks can be uncovered on the ingame map by each player. Resulting max map file size per player is 512 Bytes times this value. Default 131072 means max 32 km² can be uncovered at any time
SaveGameFolder 文字列(絶対パス) サーバーデータの保存先を指定します。
オプションであるためコメントアウト化されているので使用する場合はコメントを外しましょう。

サーバー起動

設定が終了しましたら起動していきます。
serverconfig.xmlと同一のディレクトリにstartdedicated.batというファイルがあるため、そちらを実行。
パスワード入力画面が出ましたら完了です。

ただし、環境によってはこの画面に行き着かない場合があります。
その場合は次の項をご覧下さい。

パスワード入力に行きつかない

スペックの事情やTelnetの有無によってパスワード入力に行き着かない場合が多々あります。
私もその口です。
これはbatがサーバー起動させたあとに15秒間待機し、Telnet接続を試みるといった単純な処理が書かれているために起こります。
15秒間の間にサーバーが起動していなければTelnet接続は失敗します。
Telnetクライアントが未インストールであれば起動が完了していても失敗します。

この場合はとりあえずTelnetがインストールされているか確認しましょう。
確認方法は「Windowsキー + R⇒telnetでエンター」で

こちらのようなエラーが出た場合はTelnetがインストールされていません。
※当環境にはインストールされているため敢えて打ち間違えています。
その場合はTelnetをインストールしましょう。
Telnetクライアントのインストール方法についてはWindowsにおけるTelnetのセットアップをご覧下さい。
なお、XPには元からTelnetクライアントはインストールされています。

別でTelnetをインストールしている場合は各自設定をしてください。

スペックの問題や別のTelnetがある場合はTelnet接続エラーの後コマンドラインを閉じ、起動が完了してからTelnetクライアントにて接続を試みてください。
Telnetコマンドの例は以下のとおりです。

        telnet [host] [port]
        例:telnet localhost 8081

                
目安としてはおおよそ7DaysToDie.exeが500-600MBほどのメモリを使用していると起動が完了しています。
ただし、環境によっては異なる値を示すため何度かトライしてみましょう。


Server Fixesの導入


はじめに

こちらからはサーバー拡張作業になります。
必ず必要な手順ではないため省いても問題ありませんが、通常のサーバーでは物足りない部分や不具合が修正されているので筆者は導入をおすすめします。

ただし、こちらからは拡張であるためリネームなどの作業は各自必要だと思った場合行ってください。
その説明は一切しません。

サーバー環境に関する注意

こちらの拡張はゲームクライアント版のDedicatedサーバーでは一切動作しません。
SteamのツールにあるDedicatedサーバーをベースに行いましょう。

基礎の導入

こちらからserver_fixes.tar.gzをダウンロードします。
※tar.gzファイルはWindows標準のソフトウェアでは展開できないため、WinRARや7zipなどを用意しておきましょう。

ダウンロードしてきたファイルを展開し、出てきたModsフォルダをそのまま7 Days To Die Dedicated Serverに移動させます。 これでインストールが完了しました。
このままサーバーを起動して問題なく起動できたら完了です。

マップを開く

マップは解凍時にModsフォルダ内のAllocs_WebAndMapRenderingを導入した場合のみ利用できます。
まず、serverconfig.xmlのControlPanelPortのポート番号を控えておきましょう。
次に、ウェブブラウザにて「http://127.0.0.1:ポート番号」にアクセスします。
ポート番号には先程控えておいたポート番号に2を足したものになります。
8080なら、「http://127.0.0.1:8082」となります。

なお、初期設定ではSteamアカウントでログインしていないと利用できないため、必要な場合はマップの設定を御覧ください。

マップの設定

マップは7dtdサーバーと同じく、以下の設定ファイルにてパーミッション管理がされています。
C:\Users\*UserName*\AppData\Roaming\7DaysToDie\Saves\webpermissions.xml
なお、AppDataは隠しファイルですので表示設定を行うか「ファイル名を指定して実行」にて「%AppData%」と入力してください。

設定ファイルの中はXMLで記述されており、7dtd本体のサーバー設定と同じ言語が用いられています。
また、すべてコメントアウトされていますが、恐らくこれが初期設定であると考えられます。

パーミッションですが、1000まではゲーム内のAdminまたはWhitelistのパーミッションと同期しています。
何も設定していないかパーミッションレベルを1000で設定している場合1000として扱われ、こちらのマップでも1000として扱われます。
また、1000までの場合Steamアカウントでのログインが必要となります。
全く関係のない第三者の場合は2000として扱われ、2000としたものに関してはログインの必要はありません。

permissions
プロパティ名 説明
web.map マップ表示に関するプロパティです。
webapi.getlog サーバーコンソールのログの表示に関するプロパティです。
webapi.executeconsolecommand プロパティ名から推測するとコンソールコマンドを実行
webapi.getstats
webapi.getplayersonline
webapi.getplayerslocation
webapi.viewallplayers
webapi.getlandclaims
webapi.viewallclaims
webapi.getplayerinventory
webapi.gethostilelocation
webapi.getanimalslocation

コマンドの.(ドット)以前を見るとwebとwebapiがありますが、webはウェブブラウザ上で表示されるもので、webapiの場合はウェブブラウザ上のマップでも反映されますが、それ以前にウェブAPIとして機能しているため外部アプリケーションやプログラム制御でデータだけの取得が可能です。
なお、Web APIは成功時にJSONで戻ってきます。

Web API

ここからは情報がほぼないのでちょくちょく解析してるデータを書いていきます。
正確性が微妙なので正常に動作しない場合もあるかもしれませんのでご注意ください。

Web APIはwebpermissions.xmlのパーミッションに基づいて動作します。
今回は例として全部0で動作してることにします。

今回はすべて権限内で動作するのでトークンの発行が必要となります。
トークンはadmintokensタグの子要素のtokenタグで設定します。
なお、2000の場合はトークンの発行は必要ありません。

admintokens
プロパティ名 説明
name トークンの名前です。
トークン判別で利用するので判別可能な名称をつけてください。
token トークン本体です。
パスワードといった認識でいいと思います。
permission_level パーミッションレベルです。
0から1000で指定します。

今回は「<token name="adminuser1" token="supersecrettoken" permission_level="0" />」とします。

設定が終わりましたら試しにアクセスしてみましょう。
ウェブブラウザで「http://127.0.0.1:8082/api/getstats?adminuser=adminuser1&admintoken=supersecrettoken」でアクセスしてみてください。
getstats.jsonで以下の様なデータが取れたとおもいます。
                    {
                        "gametime":{
                            "days":1,
                            "hours":9,
                            "minutes":22
                        },
                        "players":0,
                        "hostiles":0,
                        "animals":0
                    }
                
こちらのデータの扱いは今回述べないとして、取得方法がパターン化されているのでURLを分解していきます。

公式ページでも書かれていますが、
http://[Address]:[Port]/api/[property]?adminuser=[name]&admintoken=[token]」といった形で取得します。
アドレスとポートは既知であるとして、[property]はwebapi.[ここ]の[ここ]の部分が当てはまります。
今回の例だとwebapi.getstatsをターゲットにしていたのでgetstatsが入りました。

次に、adminuser=[name]ですが、先ほど設定したtokenタグのname属性の値が入ります。
更に、それのセットとして、admintoken=[token]にはtoken属性の値が入ります。
これを指定することでログインなしに指定されたパーミッションでjsonの取得ができます。

これを応用すると、同じように他のjsonも取得することができます。
例えば、プレイヤーの位置を取得したい場合は
http://127.0.0.1:8082/api/getplayerslocation?adminuser=adminuser1&admintoken=supersecrettoken
で取得することができます。

ここまで書きましたが、結構わからない部分が多いので分かり次第追記していきます。