現在、このウィキのスタイル・表記議論ページ)および翻訳のガイドライン制定について議論を行っています。皆様のご参加をお待ちしております。(4月2日更新)

利用者:Kyaco11/村の仕組み

提供: Minecraft Wiki
移動先: 案内検索
このページは編集途中です。
一部書きかけの項目があります。

概要[編集 | ソースを編集]

マインクラフトには「村」と呼ばれる仕組みがあり、村人の増殖や、アイアンゴーレムトラップの作成、村人式の全自動農場などゲームプレイでもメジャーな要素に関係している。村の仕組みは、村人のAI・村管理機構・ゾンビ襲撃という3つの要素で成り立っている。このページでは、それぞれの要素の働きを述べ、それらの関わりを例を交えて解説する。村人のAIについては、村との関わりが深いものに絞って解説する。

村人のAI[編集 | ソースを編集]

村人のAIは、定期的に実行されるAIと、いくつかの中から選んで実行されるAIの2つがある。 定期的に実行される方が、村管理機構とのやり取りや、自身が所属する村の更新などを行う。 選択的に実行される方は、収穫・繁殖・敵対MOBからの逃走・徘徊など各種AIの候補から、優先順位に基づいて選択・実行される。

定期的に実行されるAI[編集 | ソースを編集]

  1. 村管理機構に自身のいる場所を教える。
  2. 自身がどの村に所属しているのかを更新する。
    • 自身のいるブロックの座標から村の中心までの距離が、村の半径に32mを足した長さより小さい村の中で、その距離が一番小さい村を自身が所属する村とする。そのような村が見つからない場合はどの村にも属さないことになる。
  3. 取引の内容を更新する。
  4. 次にこのAIを実行する時間を3.5秒~6秒後の範囲でランダムに決定する。

選択的に実行されるAI[編集 | ソースを編集]

ここで実行されるAIの選択肢は17種類(農民か子供なら18種類、子供農民なら19種類)ある。 村人は自身の状態、各AIの優先順位、mutex bitによる排他制御、(設定されていれば)各AIを実行する確率などに基づいて実行するAIを選択する。 ここでは村との関りのあるAIについて解説する。

優先度 AI mutex bit
0 泳ぐ  4
1 ゾンビから逃げる 1
エヴォーカーから逃げる 1
ヴィンディケーターから逃げる 1
ヴェックスから逃げる 1
取引をする 5
取引相手を見る 2
2 ドアの内側へ移動 1
3 近くのドアを開ける 0
4 ドアを開ける 0
5 村の中心に近づく 1
6 繁殖 3
(農民のみ)収穫 5
7 ゴーレムについていく 3
8 (子供村人のみ)遊ぶ 1
9 近くのプレイヤーを見る 3
食べ物を渡す 3
水を避けて徘徊 1
10 近くのMOBを見る 2
ドアの内側へ移動[編集 | ソースを編集]

未稿

村の中心に近づく[編集 | ソースを編集]

未稿

繁殖[編集 | ソースを編集]

未稿

村管理機構[編集 | ソースを編集]

村管理機構はディメンジョンごとに用意されており、ディメンジョンの更新の際に呼び出されることで機能している。ディメンジョンの更新はサーバーが起動しているときは常に(プレイヤーがそのディメンジョンにいなくても)1tickごとに行われるので、村情報の更新も常に行われることになる。村管理機構の機能としては、ディメンジョン内に存在する村全ての情報を更新、ドアのなくなった村の削除、村人の定期的に実行されるAIから渡された村人位置の管理、村人位置周辺のドアの情報更新、などがある。

それぞれの機能の説明の前に、いくつか断片的に先に説明しておく。

  • 村の中心について
    • 村の中心は、その村に紐づけられているドアの平均座標の小数点以下を切り捨てた場所になる。
    • (例) ドアの平均座標が(1.1, 64.9, -3.2)であれば、村の中心は(1, 64, -3)となる。
  • 村の半径について
    • 村の半径は、『「村の中心から一番遠いドアまでの距離」を超える最小の整数』と『32』のうち大きい方である。
    • 通常のゲームプレイで、村の半径が32を超えることは滅多にない。複数の村を集めるゴーレムトラップを作る場合には半径の大きい村ができることが多い。
    • (例) 村の中心から一番遠いドアまでの距離が46.0の場合、村の半径は47となる。
  • 村のリストについて
    • 村のリストは、村が作成された時間順に並べられる。新規に作成された村はリストの末尾に追加される。
    • 村の情報の更新や、ドアを追加するときの村の探索はこのリストの順番(=村が作成された順)で行われる。
    • リストの順番がゲームの結果に関わることは珍しいが、複数の村の中心から村人やドアまでの距離が同じ場合には村の並び順によって違う結果をもたらすことがある。
  • 村人位置のリストについて
    • 村人位置のリストは、先入れ先出しのデータ構造を取っており、最大で64個の村人位置を記憶する。村人の定期的に実行されるAIから渡された村人の位置を、リスト内に重複がないか確認してからリストの末尾に追加する。村人の位置の管理では 1tick に 1個ずつ先頭から取り出して処理をする。
    • ディメンジョン内の全ての村人の位置を記憶しているわけではない。村人のAIが働いてから、村人の位置の管理で処理をされるまでの間に一時的に保管している。
    • 1か所にたくさんの村人がいる場合、その場所がリストに追加される頻度が高くなる。ただし、重複を防ぐようになっているので、その場所がリスト内に2回現れることはない。
    • 村人がたくさんの場所(確率的には95ヶ所以上)にいると、村人の位置がリストに追加されるペースが、先頭から取り出されていくペースを超えてしまう。リストは最大で64個に制限されているため、村人がいるのに村の仕組みが働かないということが起こりうる。
  • ドアの有効期限について
    • 村に紐づけられているドアには最長1分の有効期限が設定されている。この有効期限が切れるとドアは村のドアではなくなる。有効期限は付近の村人の定期的に実行されるAIが働くと1分に再設定される。

村の情報を更新[編集 | ソースを編集]

各村について、以下の処理を行う。

  1. 有効期限の切れたドアを村から外す。
  2. 村人の人数を数える。(20 tick に一度行われる)
    • 村の中心を中心とする (村の半径の2倍)×8×(村の半径の2倍) の直方体の範囲に、ヒットボックスが少しでも重なる村人を数える。
  3. アイアンゴーレムの数を数える。(30 tick に一度行われる)
    • 村の中心を中心とする (村の半径の2倍)×8×(村の半径の2倍) の直方体の範囲に、ヒットボックスが少しでも重なるアイアンゴーレムを数える。
  4. アイアンゴーレムをスポーンさせる。
    • 5分50秒 につき 1 度の頻度でアイアンゴーレムのスポーンが試みられる。それぞれの試みでは、村の中心周辺でゴーレムをスポーンさせる場所を抽選し、ゴーレムがスポーンする床とスペースの条件を確認し、条件を満たせばゴーレムをスポーンさせる。抽選は最大で10回まで行われる。
    1. 1/7000 の抽選を行う。これが5分50秒の由来である。
    2. 村の中心を中心とする 16×6×16 の直方体の範囲からランダムに 1 つ座標を選び、次の2つの条件を確認する。
      • その座標の真下にあるブロックの上面が平坦であること。(=ブロックの性質一覧において、isFullyOpaque()がTrueであること。)
      • その座標の上で 2×4×2 の直方体範囲にあるブロックすべてがゴーレムのスポーンを妨害しないこと。(=ブロックの性質一覧において、isNormalCube()がTrueであること。)
      • ゴーレムがスポーンできる床であり、なおかつゴーレムのスポーンを妨害しないブロックがある。上付きの半ブロック、レッドストーンブロックなど。
    3. 2. をスポーンが成功するまで最大 10 回まで繰り返す。
      • 沸き層として1層だけ用意した場合のスポーン成功確率は84%。2 層用意した場合は 98%。

村の削除[編集 | ソースを編集]

  • 紐づけられたドアが無くなった村をリストから削除する。

村人位置の管理・ドアの探索[編集 | ソースを編集]

  1. 村人位置のリストから先頭の1個を取り除く。
  2. 取り除いた村人位置の周辺でドアを探す。
    • 村人位置を中心とする 32×8×32 の範囲でドアを探す。
      • (-16, -4, -16) の位置から (-16, -4, +16) まで順に探す。
  3. 見つかったドアが日光の条件を満たせば要更新ドアのリストに入れる。

見つかったドアの情報更新[編集 | ソースを編集]

要更新ドアのリストの順に、以下の処理を行う。

  1. そのドアの近くに村があれば、その村に紐づける
  2. 村が無ければ、そのドアを中心とする村を作る


ゾンビ襲撃[編集 | ソースを編集]

ゾンビ襲撃