大まかな流れ
- マイクラ起動スタート
↓
- modsフォルダにあるjarファイルと、jarファイルの中にあるmod.infoの中身を確認。Modを読み込む順序などを決める。
他のModのクラスを継承したクラスを作ったときなどは読み込み順序が大切になる。
coreModなど、特殊なクラスは先に処理される。
↓
coreModなど、特殊なクラスは先に処理される。
↓
- マイクラ起動処理の段階ごとにEventが発生
・Mod側の対応するEventを引数に持つ関数(@ アノテーションをつけてイベント受け取りのための関数であることを指定する)が、順番に呼び出されていく。
サーバー&クライアント
・ブロック、アイテム、エンティティ、GUI、コマンドなどを登録
・ブロック、アイテム、エンティティ、GUI、コマンドなどを登録
クライアント
・ブロックやエンティティの描画などを登録
・ブロックやエンティティの描画などを登録
↓
ワールドを選択 読み込みが開始される。
チャンクという16*16blockごとに別ファイルに分割され保存されている。
NBTという形でワールドデータが保存されているので、そのデータをもとに、使用するチャンクのデータを実際にマイクラ上で使える形に復元していく。
↓
NBTという形でワールドデータが保存されているので、そのデータをもとに、使用するチャンクのデータを実際にマイクラ上で使える形に復元していく。
↓
- サーバー側で、1/20秒(1サーバーTick)ごとに処理が行われる
- クライアント側で、1/20秒(1クライアントTick)ごとに処理が行われる
TickEvent.start
Block onUpdate()
TickEvent.end
Block onUpdate()
TickEvent.end
- クライアント側で描画処理(1描画チック)が行われる
ブロックの設置・破壊・アイテムの使用などの処理ごとに使用したアイテムの対応するクラスが呼ばれたり、ForgeのEventが呼び出されたりする。
詳細な流れ
Server
MinecraftServer.run()
FMLCommonHandler.instance().onServerStart(this)
FMLConstructionEvent を実行
Modのリストを作成
設定された読み込み順序に従って並べ替え
順序は@Modアノテーション内にて指定 -https://mcmodding.jp/modding/index.php/MOD%E3%81%8C%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BE%E3%82%8C%E3%82%8B%E9%A0%86%E7%95%AA%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B
設定された読み込み順序に従って並べ替え
順序は@Modアノテーション内にて指定 -https://mcmodding.jp/modding/index.php/MOD%E3%81%8C%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BE%E3%82%8C%E3%82%8B%E9%A0%86%E7%95%AA%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B
Mod内のイベント受信メソッドをリストアップ
FMLEentを継承したイベントクラス @Mod.EventHandler おもにマイクラ本体のスタート・終了処理に関わるイベント
eventhandler.Eventを継承したイベントクラス @SubscribeEvent おもにワールドの読み込み・保存・ゲームプレイに関わるイベント
FMLEentを継承したイベントクラス @Mod.EventHandler おもにマイクラ本体のスタート・終了処理に関わるイベント
eventhandler.Eventを継承したイベントクラス @SubscribeEvent おもにワールドの読み込み・保存・ゲームプレイに関わるイベント
FMLPreInitializationEvent を実行
ブロックやアイテムの登録など
ブロックやアイテムの登録など
FMLInitializationEvent を実行
通信等に関わるサーバープロパティーを読み込んで反映
FMLPostInitializationEvent を実行
FMLLoadCompleteEvent を実行
ワールドに関わるサーバープロパティーを読み込んで反映
Worldデータを読み込み
WorldEvent.Load を実行
スポーンエリアのチャンクを読み込み
WorldEvent.Load を実行
スポーンエリアのチャンクを読み込み
FMLServerStartingEvent を実行
コマンドの登録尾など
コマンドの登録尾など
FMLServerStartedEvent を実行
while (this.serverRunning){
すべてのプレイヤーが寝ているようなら朝に。
int l = 最後の呼び出しから現在の時刻までの時間;
while (l > 50L){
l -= 50L; this.tick();
}
次の50ミリ秒の区切りが来るまで待機。
}
次の50ミリ秒の区切りが来るまで待機。
}
FMLServerStoppingEvent を実行
プレイヤーのデータを保存
ワールドのデータを保存
WorldEvent.Unload を実行
ワールドのデータを保存
WorldEvent.Unload を実行
FMLServerStoppedEven を実行