(ページの作成:「{{前提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. | + | return side.isServer(); |
} | } | ||
</source> | </source> | ||
− | + | サーバのみで動作するようにしたい場合は、isServer()の部分をisClient()に変えれば良い。 | |
− | + | わかりにくいようであれば、!isClient()のように返り値を反転させるとよいだろう。 | |
− | |||
+ | また、modsにはクライアントまたはサーバが導入しているMODのデータが格納されているので、特定のMODが導入されている場合に弾くような処理もできる。<br> | ||
+ | マップのキーにはMODのIDが、値にはMODのバージョンが入っている。 | ||
クライアント/サーバのみの導入で動作するMODを作る際には、クライアントならサーバの、サーバならクライアントにしか存在しないクラス/メソッドを使用しないように注意しなければならない。 | クライアント/サーバのみの導入で動作するMODを作る際には、クライアントならサーバの、サーバならクライアントにしか存在しないクラス/メソッドを使用しないように注意しなければならない。 |
2014年10月30日 (木) 15:19時点における最新版
この記事は"Minecraft Forge Universal 10.12.1.1074~"を前提MODとしています。 |
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を作る際には、クライアントならサーバの、サーバならクライアントにしか存在しないクラス/メソッドを使用しないように注意しなければならない。