提供: Minecraft Modding Wiki
移動先: 案内検索
(ページの作成:「{{前提MOD|reqmod="Minecraft Forge Universal 10.12.1.1074~"}} {{ チュートリアル難易度 | difficulty=1|clear=none}} ==Forge 10.12.1.1074以降でのクラ...」)
 
(netCheckHandlerメソッドの第2引数に関する情報修正・追記)
 
56行目: 56行目:
 
上記の例では、クライアント/サーバの両方でtrueを返しているので、マルチプレイにおいてサーバに導入されていても、クライアントは導入を必要としない。
 
上記の例では、クライアント/サーバの両方でtrueを返しているので、マルチプレイにおいてサーバに導入されていても、クライアントは導入を必要としない。
  
クライアントのみで動作するようにしたい場合は、以下のように変えれば良い。
+
また、netCheckHandlerメソッドの第2引数のSideでは、チェックしているのがクライアントかサーバかを判定できる。<br>
 +
少々わかりにくいが、Sideでサーバが返ってくれば、クライアントでチェックしている場合、クライアントが返ってきたなら、サーバでチェックしている場合である。
 +
 
 +
つまり、クライアントのみで動作するようにしたい場合は、以下のように変えれば良い。
 
<source lang="java">
 
<source lang="java">
 
@NetworkCheckHandler
 
@NetworkCheckHandler
 
public boolean netCheckHandler(Map<String, String> mods, Side side)
 
public boolean netCheckHandler(Map<String, String> mods, Side side)
 
{
 
{
return side.isClient();
+
return side.isServer();
 
}
 
}
 
</source>
 
</source>
サーバのみで動作するようにしたい場合は、isClient()の部分をisServer()に変えれば良い。
+
サーバのみで動作するようにしたい場合は、isServer()の部分をisClient()に変えれば良い。
 
+
わかりにくいようであれば、!isClient()のように返り値を反転させるとよいだろう。
また、modsにはクライアントが導入しているMODのデータが格納されているので、特定のMODが導入されている場合に弾くような処理もできる。
 
  
 +
また、modsにはクライアントまたはサーバが導入しているMODのデータが格納されているので、特定のMODが導入されている場合に弾くような処理もできる。<br>
 +
マップのキーにはMODのIDが、値にはMODのバージョンが入っている。
  
 
クライアント/サーバのみの導入で動作するMODを作る際には、クライアントならサーバの、サーバならクライアントにしか存在しないクラス/メソッドを使用しないように注意しなければならない。
 
クライアント/サーバのみの導入で動作するMODを作る際には、クライアントならサーバの、サーバならクライアントにしか存在しないクラス/メソッドを使用しないように注意しなければならない。

2014年10月30日 (木) 15:19時点における最新版

この記事は"Minecraft Forge Universal 10.12.1.1074~"を前提MODとしています。

Stone pickaxe.png
中級者向けのチュートリアルです。


Forge 10.12.1.1074以降でのクライアント/サーバMOD[編集]

Forge 10.12.1.1074以降では、クライアント/サーバのみで動作するMODを作るには、@Modクラス内に、@NetworkCheckHandlerをつけたメソッドで適切なboolean値を返す必要がある。
それ以前のバージョンでは、特に定義しなくてもForgeが自動で判別している。

このチュートリアルでは、マルチプレイにおいてサーバのみの導入でも動作する簡単なサンプルMODを例に、おおまかな使用方法を解説する。

ソースコード[編集]

SampleModクラス[編集]

package samplemod;

import java.util.Map;

import net.minecraft.util.ChatComponentText;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.ServerChatEvent;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.network.NetworkCheckHandler;
import cpw.mods.fml.relauncher.Side;

@Mod(modid = "samplemod", name = "SampleMod", dependencies = "required-after:Forge@[10.12.1.1074,)")
public class SampleMod
{
	@EventHandler
	public void init(FMLInitializationEvent event)
	{
		MinecraftForge.EVENT_BUS.register(this);
	}

	@SubscribeEvent
	public void onServerChat(ServerChatEvent event)
	{
		if (event.message.contains("fuck"))
		{
			event.player.addChatMessage(new ChatComponentText("NG WORD"));
		}
	}

	@NetworkCheckHandler
	public boolean netCheckHandler(Map<String, String> mods, Side side)
	{
		return true;
	}
}

解説[編集]

上記のサンプルMODは、"fuck"を含む発言をしたプレイヤーに対して、"NG WORD"と通知する。

netCheckHandlerメソッドで、クライアント/サーバのみで動作するかどうかを判別している。
上記の例では、クライアント/サーバの両方でtrueを返しているので、マルチプレイにおいてサーバに導入されていても、クライアントは導入を必要としない。

また、netCheckHandlerメソッドの第2引数のSideでは、チェックしているのがクライアントかサーバかを判定できる。
少々わかりにくいが、Sideでサーバが返ってくれば、クライアントでチェックしている場合、クライアントが返ってきたなら、サーバでチェックしている場合である。

つまり、クライアントのみで動作するようにしたい場合は、以下のように変えれば良い。

@NetworkCheckHandler
public boolean netCheckHandler(Map<String, String> mods, Side side)
{
	return side.isServer();
}

サーバのみで動作するようにしたい場合は、isServer()の部分をisClient()に変えれば良い。 わかりにくいようであれば、!isClient()のように返り値を反転させるとよいだろう。

また、modsにはクライアントまたはサーバが導入しているMODのデータが格納されているので、特定のMODが導入されている場合に弾くような処理もできる。
マップのキーにはMODのIDが、値にはMODのバージョンが入っている。

クライアント/サーバのみの導入で動作するMODを作る際には、クライアントならサーバの、サーバならクライアントにしか存在しないクラス/メソッドを使用しないように注意しなければならない。