Minecraft は クライアントサーバーモデル を採用しています。つまり、ユーザーはゲームクライアントをインストールし、サーバーに接続してゲームをプレイします。 Fabric を使用すると、 Mod は Minecraft クライアントまたは Minecraft サーバーのいずれかをターゲットにすることができますが、両方を同時にターゲットにすることもできます。
Minecraft におけるクライアント/サーバーの概念はあいまいであり、物理的側面または論理的側面のいずれかを指す場合があります。クライアント/サーバーという用語は、 Minecraft のさまざまなディストリビューション(Minecraft クライアントと専用の Minecraft サーバー)を区別するために使用され、物理サイドと呼ばれます。ただし、Minecraft クライアントは、シングルプレイヤーおよび LAN セッション用に独自の統合サーバーをホストします。つまり、Minecraft クライアントにはサーバーロジックも含まれます。したがって、クライアント/サーバーは、論理サイドと呼ばれるゲームロジックの部分を区別するためにも使用できます。
物理サイドにも論理サイドにも、 'クライアント' と 'サーバー' があります。ただし、論理クライアントは物理クライアントと同等ではなく、論理サーバーも物理サーバーと同等ではありません。代わりに、論理クライアントは物理クライアントによってホストされ、論理サーバーは物理サーバーまたは物理クライアントによってホストされます。
論理的な側面は、Minecraft の両方のディストリビューションのアーキテクチャの中心です。したがって、論理的な側面を理解することは、 Fabric を使用したすべての Mod 開発にとって不可欠です。
物理サイドまたは環境は、 Minecraft の 2 つのディストリビューション(jar)、クライアント(バニラランチャーが起動するもの)、およびサーバー(https://minecraft.net で無料でダウンロード可能)を指します。物理サイドとは、現在の環境で使用できるコードを指します。
クライアントおよびサーバー環境は、同じプログラムの縮小版であり、コードの必要な部分のみが含まれています。
Fabric では、 @Environment(EnvType.CLIENT)
のようなアノテーションをよく見かけます。これは、一部のコードが 1 つの環境にのみ存在することを示しています。 この例では、クライアントです。
Fabric fabric.mod.json とミックスイン構成では、クライアント/サーバーは環境を参照します。
各物理サイドは、エントリポイントで使用されるクラスと、エントリポイント net.minecraft.data.Main
を持つデータ生成クラスを出荷します。
論理サイドは、実際のゲームロジックを担当します。 論理クライアントは、レンダリングを行い、プレーヤーの入力をサーバーに送信し、リソースパックを処理し、ゲームの世界を部分的にシミュレートします。サーバーはコアゲームロジック、データパックを処理し、ゲームワールドの真の状態を維持します。
クライアントは、
net.minecraft.world.World net.minecraft.entity.Entity net.minecraft.block.entity.BlockEntityなどのオブジェクトのコピーを使用して、サーバーの世界の部分的なレプリカを維持します。 これらのレプリケートされたオブジェクトにより、クライアントとサーバーは共通のゲームロジックを実行できます。クライアントはこれらのオブジェクトとやり取りできますが、サーバーはそれらの同期を維持する責任があります。通常、論理クライアント上のオブジェクトと論理サーバー上のオブジェクトを区別するには、オブジェクトの世界にアクセスし、その
isClient
フィールドを確認します。これを使用して、サーバー上でエンティティの生成などの権限のあるアクションを実行したり、クライアント上でアクションをシミュレートしたりできます。この手法は、2 つの論理サイド間の非同期化を回避するために必要です。
どのサイドがあり、どのようにそれらを区別するかを理解した上で、各サイドを詳細に見てみましょう。
物理クライアントは、バニラランチャーによってダウンロードされた Minecraft の jar ファイルです。これには、論理クライアントと論理サーバー (統合サーバー) が含まれます。そのエントリポイントは net.minecraft.client.main.Main
です。
物理クライアントは、それぞれ別の論理サーバー内に複数の異なるワールドをロードできますが、一度に 1 つのワールドしかロードできません。
物理サーバーの論理サーバー(専用サーバー)と比較して、物理クライアントの論理サーバー(統合サーバー)は、物理クライアント上の論理クライアントによって制御できます(例: F3+T はデータ パックをリロードし、クライアントをシャットダウンします。統合サーバーもシャットダウンします)。また、ワールドにバンドルされているリソースパックを物理クライアント上の論理クライアントにロードすることもできます。
すべての論理クライアント コンテンツは物理クライアント専用であるため、レンダリング、サウンド、およびその他の論理クライアント コードに多くの環境注釈が表示されます。
たとえば、Liteloader、Optifine、および Minecraft PvP クライアント (Badlion、Hyperium) など、一部の Mod は物理クライアントのみを対象としています。
物理サーバーは Java 専用サーバーです。物理クライアントと比較して、論理サーバー(専用サーバー)しかありません。そのエントリポイントは net.minecraft.server.MinecraftServer
であり、物理サーバーは実行時に 1 つのワールドしか持つことができません。サーバーが別の世界に切り替える必要がある場合は、サーバーの再起動が必要です。
その論理サーバーは、物理サーバーの実行中に存在する論理サーバー インスタンスが 1 つだけであるため、物理クライアントの論理サーバーとは少し異なります。さらに、物理サーバーの論理サーバーは、 Rcon を介してリモートで制御でき、 server.properties という構成ファイルを持ち、サーバーリソースパックを送信できます。
これらの違いにもかかわらず、ほとんどの Mod は、論理クライアントのコンテンツを参照しない限り、物理クライアントと物理サーバーの両方の論理サーバーに問題なく適用できます。
ただし、単一の世界とリソース パックの送信の機能により、バニラの物理クライアントがサーバーに自動的に接続するときにセットアップされるため、クライアントに比べてバニラ Mod (データパックとリソースパックの組み合わせ)のインストールがはるかに簡単になります。
一部の Mod は、物理サーバーのみを対象としています。たとえば、 Bukkit とその派生物 (Spigot、Paper、Cauldron、Xxx-Bukkit ハイブリッド) は、常に物理サーバー上で実行されます。
論理クライアントは、プレーヤーへのインターフェイスです。レンダリング (LWJGL)、リソースパック、プレーヤーの入力処理、およびサウンドは、論理クライアントで発生します。 物理サーバーには存在しません。
論理サーバーは、ほとんどのゲームロジックが実行される場所です。データパック、ワールドの更新、ブロック エンティティとエンティティティック、Mob AI、ゲーム/ワールドの保存、およびワールドの生成は、論理サーバー上で行われます。
物理クライアント上の論理サーバーは “Integrated Server” 〔統合サーバー〕と呼ばれ、物理サーバー上の論理サーバーは “Dedicated Server” 〔専用サーバー〕と呼ばれます(これは物理サーバー自体の名前でもあります)。
論理サーバーは、物理サーバー上であっても独自のメインスレッドで実行され、いくつかのワーカースレッドがあります。論理サーバーの生存期間は、ホストされている物理サイドによって異なります。物理サーバーでは、プロセスが実行されている限り論理サーバーが存在します。物理クライアントでは、複数の論理サーバーを作成できますが、一度に存在できる論理サーバーは 1 つだけです。プレーヤーがローカルセーブをロードすると新しい論理サーバーが作成され、プレーヤーがローカルセーブを閉じると閉じられます。
ほとんどのユニバーサル Mod は、シングル プレイヤーとマルチ プレイヤーの両方のシナリオで動作できるように、論理サーバーをターゲットにしています。
論理クライアントと論理サーバー間でデータを交換する唯一の正しい方法は、パケットを交換することです。パケットは、(https://wiki.vgで説明されているように)物理サイドではなく、論理クライアントと論理サーバーの間で送信されます。 Mod は、パケットを追加して、2 つの論理サイド間でカスタム情報を転送できます。パケットは、独自の統合サーバーに接続された論理クライアントのメモリ内で交換されます。それ以外の場合は、ネットワークプロトコルを介して交換されます。
論理クライアントは、C2S(Client-To-Server)パケットを論理サーバーに送信します。 論理サーバーは、S2C(Server-To-Client)パケットを論理クライアントに送信します。 パケットは、ネットワークスレッドの書き込みメソッドによって送信され、ネットワークスレッドの読み取りメソッドの呼び出しによって受信されます。
ネットワーキングの処理方法の詳細については、この記事 を参照してください。
ほとんどの場合、物理サーバーのみを対象とする Mod は、物理クライアント内の論理サーバーでも機能します。
ただし、 Mod を使用する物理サーバーは通常、統合サーバーには当てはまらない仮定を持っています。
isClient
フィールドは常に false
〔偽〕です)。これらの仮定は、論理サーバーで実行される Mod を作成するために修正する必要があります。
物理サイドと論理サイドの可能な組み合わせ:
論理クライアント | 論理サーバー | |
---|---|---|
物理クライアント | シングルトンは常に存在する | ローカル保存時に存在する、プレイごとに新しいインスタンスが生成される |
物理サーバー | 存在しない | シングルトンは常に存在する |
最終的に、主な混乱は、論理サーバーが物理クライアント上に存在するという事実から生じます。