細 |
(registerMessageの引数が間違っていたので修正) |
||
(4人の利用者による、間の6版が非表示) | |||
1行目: | 1行目: | ||
{{前提チュートリアル|page=1.7のパケットについて}} | {{前提チュートリアル|page=1.7のパケットについて}} | ||
− | {{前提MOD|reqmod="Minecraft Forge Universal 10.12. | + | {{前提MOD|reqmod="Minecraft Forge Universal 10.12.1.1090~"}} |
+ | {{過去リンク|version=Minecraft Forge Universal 10.12.1.1089|url=http://minecraftjp.info/modding/index.php?title=1.7%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E8%BF%BD%E5%8A%A0&oldid=2141}} | ||
36行目: | 37行目: | ||
} | } | ||
</source> | </source> | ||
+ | PacketHandler.class | ||
+ | <source lang = "java"> | ||
+ | |||
+ | package yourpackage; | ||
+ | |||
+ | import cpw.mods.fml.common.network.NetworkRegistry; | ||
+ | import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; | ||
+ | import cpw.mods.fml.relauncher.Side; | ||
+ | |||
+ | |||
+ | public class PacketHandler { | ||
+ | |||
+ | //このMOD用のSimpleNetworkWrapperを生成。チャンネルの文字列は固有であれば何でも良い。MODIDの利用を推奨。 | ||
+ | public static final SimpleNetworkWrapper INSTANCE = NetworkRegistry.INSTANCE.newSimpleChannel("KeySampleMod"); | ||
+ | |||
+ | |||
+ | public static void init() { | ||
+ | INSTANCE.registerMessage(MessageKeyPressedHandler.class, MessageKeyPressed.class, 0, Side.SERVER); | ||
+ | } | ||
+ | }</source> | ||
SampleKeyCore.java(importは省略) | SampleKeyCore.java(importは省略) | ||
<source lang = "java"> | <source lang = "java"> | ||
44行目: | 65行目: | ||
@SidedProxy(clientSide = "yourpackage.Client.ClientProxy", serverSide = "yourpackage.CommonProxy") | @SidedProxy(clientSide = "yourpackage.Client.ClientProxy", serverSide = "yourpackage.CommonProxy") | ||
public static CommonProxy proxy; | public static CommonProxy proxy; | ||
− | + | ||
− | public | + | @EventHandler |
+ | public void preInit(FMLPreInitializationEvent event) { | ||
+ | PacketHandler.init(); | ||
+ | } | ||
+ | |||
@EventHandler | @EventHandler | ||
public void load(FMLInitializationEvent event) { | public void load(FMLInitializationEvent event) { | ||
− | |||
− | |||
FMLCommonHandler.instance().bus().register(this);//KeyHandlingEvent用 | FMLCommonHandler.instance().bus().register(this);//KeyHandlingEvent用 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | |||
− | |||
//キーが“押された時”に呼ばれる。“押しっぱなし”の判定は別途用意する必要あり。 | //キーが“押された時”に呼ばれる。“押しっぱなし”の判定は別途用意する必要あり。 | ||
@SubscribeEvent | @SubscribeEvent | ||
public void KeyHandlingEvent(KeyInputEvent event) { | public void KeyHandlingEvent(KeyInputEvent event) { | ||
− | + | if (ClientProxy.sampleKey.isPressed()) { | |
− | + | PacketHandler.INSTANCE.sendToServer(new MessageKeyPressed(1));//1をサーバーに送る。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
} | } | ||
} | } | ||
</source> | </source> | ||
− | + | MessageKeyPressed.java | |
<source lang = "java"> | <source lang = "java"> | ||
package yourpackage; | package yourpackage; | ||
+ | import cpw.mods.fml.common.network.simpleimpl.IMessage; | ||
+ | import io.netty.buffer.ByteBuf; | ||
+ | |||
+ | public class MessageKeyPressed implements IMessage { | ||
+ | |||
+ | public byte key; | ||
− | + | public MessageKeyPressed(){} | |
− | |||
− | |||
− | + | public MessageKeyPressed(byte keyPressed) { | |
− | public | + | this.key = keyPressed; |
− | { | + | } |
− | |||
− | |||
− | + | @Override | |
− | + | public void fromBytes(ByteBuf buf) { | |
− | + | this.key = buf.readByte(); | |
+ | } | ||
− | + | @Override | |
− | + | public void toBytes(ByteBuf buf) { | |
− | + | buf.writeByte(this.key); | |
− | + | } | |
+ | } | ||
+ | </source> | ||
+ | MessageKeyPressedHandler.java | ||
+ | <source lang = "java"> | ||
+ | package yourpackage; | ||
+ | import cpw.mods.fml.common.network.simpleimpl.IMessage; | ||
+ | import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; | ||
+ | import cpw.mods.fml.common.network.simpleimpl.MessageContext; | ||
+ | import net.minecraft.entity.player.EntityPlayer; | ||
− | + | public class MessageKeyPressedHandler implements IMessageHandler<MessageKeyPressed, IMessage> { | |
− | |||
− | |||
− | |||
− | |||
− | + | @Override | |
− | + | public IMessage onMessage(MessageKeyPressed message, MessageContext ctx) { | |
− | + | EntityPlayer entityPlayer = ctx.getServerHandler().playerEntity; | |
− | + | //受け取ったMessageクラスのkey変数の数字をチャットに出力 | |
− | |||
− | + | entityPlayer.addChatComponentMessage(new ChatComponentText(String.format("Received byte %d", message.key))); | |
− | + | return null; | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</source> | </source> | ||
+ | |||
==解説== | ==解説== | ||
===ClientProxy=== | ===ClientProxy=== | ||
<source lang = "java"> | <source lang = "java"> | ||
− | package yourpackage.client; | + | package yourpackage.client;tProxy=== |
import yourpackage.CommonProxy; | import yourpackage.CommonProxy; | ||
import net.minecraft.client.settings.KeyBinding; | import net.minecraft.client.settings.KeyBinding; | ||
148行目: | 153行目: | ||
===KeyInputEvent=== | ===KeyInputEvent=== | ||
<source lang = "java"> | <source lang = "java"> | ||
− | // | + | //キーが押されたかどうかを保存する変数tEvent=== |
public static boolean pressSampleKey = false; | public static boolean pressSampleKey = false; | ||
//キーが“押された時”に呼ばれる。“押しっぱなし”の判定は別途用意する必要あり。 | //キーが“押された時”に呼ばれる。“押しっぱなし”の判定は別途用意する必要あり。 | ||
− | @SubscribeEvent | + | @SubscribeEvent |
public void KeyHandlingEvent(KeyInputEvent event) { | public void KeyHandlingEvent(KeyInputEvent event) { | ||
− | + | if (ClientProxy.sampleKey.isPressed()) { | |
− | + | PacketHandler.INSTANCE.sendToServer(new MessageKeyPressed(1));//1をサーバーに送る。 | |
} | } | ||
} | } | ||
160行目: | 165行目: | ||
1.7より追加されたイベント。いづれかのキーが押された時に、呼ばれる。<br> | 1.7より追加されたイベント。いづれかのキーが押された時に、呼ばれる。<br> | ||
どのキーが押されたかはeventに保存されていないので、用意しているKeyBinding変数のメソッドを利用する必要が有る。<br> | どのキーが押されたかはeventに保存されていないので、用意しているKeyBinding変数のメソッドを利用する必要が有る。<br> | ||
− | |||
− | |||
− | |||
− | |||
このイベントはクライアント側のみであるので、サーバーにキー判定を伝えるにはパケットを送る必要が有る。 | このイベントはクライアント側のみであるので、サーバーにキー判定を伝えるにはパケットを送る必要が有る。 | ||
− | === | + | ===MessageKeyPressed=== |
<source lang = "java"> | <source lang = "java"> | ||
package yourpackage; | package yourpackage; | ||
− | + | import cpw.mods.fml.common.network.simpleimpl.IMessage; | |
import io.netty.buffer.ByteBuf; | import io.netty.buffer.ByteBuf; | ||
− | |||
− | |||
− | + | public class MessageKeyPressed implements IMessage { | |
− | public class | ||
− | { | ||
− | |||
− | |||
− | + | private byte key; | |
− | |||
− | |||
− | + | public MessageKeyPressed(){} | |
− | |||
− | |||
− | |||
− | + | public MessageKeyPressed(byte keyPressed) { | |
− | + | this.key = keyPressed; | |
− | + | } | |
− | |||
− | |||
− | + | @Override | |
− | + | public void fromBytes(ByteBuf buf) { | |
− | + | this.key = buf.readByte(); | |
− | + | } | |
− | |||
− | + | @Override | |
− | + | public void toBytes(ByteBuf buf) { | |
− | + | buf.writeByte(this.key); | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
</source> | </source> | ||
− | + | キー判定を送るMessageクラス。 | |
− | + | ここでは、byte変数keyの内容をサーバーに送っている。 | |
− | + | ||
− | === | + | ===MessageKeyPressedHandler=== |
<source lang = "java"> | <source lang = "java"> | ||
− | + | package yourpackage; | |
− | public | + | import cpw.mods.fml.common.network.simpleimpl.IMessage; |
− | + | import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; | |
− | + | import cpw.mods.fml.common.network.simpleimpl.MessageContext; | |
− | + | import net.minecraft.entity.player.EntityPlayer; | |
− | + | ||
− | + | public class MessageKeyPressed implements IMessageHandler<MessageKeyPressed, IMessage> { | |
− | + | ||
− | + | @Override | |
− | + | public IMessage onMessage(MessageKeyPressed message, MessageContext ctx) { | |
− | + | EntityPlayer entityPlayer = ctx.getServerHandler().playerEntity; | |
+ | //受け取ったMessageクラスのkey変数の数字をチャットに出力 | ||
+ | |||
+ | entityPlayer.addChatComponentMessage(new ChatComponentText(String.format("Received byte %d", message.key))); | ||
+ | return null; | ||
} | } | ||
} | } | ||
</source> | </source> | ||
− | + | Messageクラスを受け取って、処理をするクラス。 | |
− | + | ここでは、サーバーのチャットに変数に格納されたbyteを出力している。 | |
− | + | ||
− | |||
− | |||
押しっぱなしかどうかを見たいのであれば、tick処理ループ内で、KeyBinding変数のgetIsKeyPressed()メソッドを監視し続ければよい。 | 押しっぱなしかどうかを見たいのであれば、tick処理ループ内で、KeyBinding変数のgetIsKeyPressed()メソッドを監視し続ければよい。 |
2021年5月10日 (月) 16:18時点における最新版
この記事は1.7のパケットについてを読んだ事を前提としています。 |
この記事は"Minecraft Forge Universal 10.12.1.1090~"を前提MODとしています。 |
この記事の古いバージョン(Minecraft Forge Universal 10.12.1.1089以前)はここより見ることができます。 |
目次
1.6におけるキーの処理[編集]
1.6までは、KeyHandlerクラスを継承して、KeyUpとKeyDownをtick単位で見ることが出来ました。 1.7では、tick処理自体がイベントになったので、キーの処理もイベントになりました。
1.7でのキーイベント追加[編集]
キーイベントの追加方法
ソースコード[編集]
CommonProxy.java
package yourpackage; //ClientProxyのみ必要だが、拡張性も考えCommonProxyも用意。GUI等追加するなら、IGuiHandlerを実装のこと。 public class CommonProxy { public void registerClientInfo(){} }
ClientProxy.java
package yourpackage.client; import yourpackage.CommonProxy; import net.minecraft.client.settings.KeyBinding; import cpw.mods.fml.client.registry.ClientRegistry; public class ClientProxy extends CommonProxy { //キーのUnlocalizedName、バインドするキーの対応整数値(Keyboardクラス参照のこと)、カテゴリー名 public static final KeyBinding sampleKey = new KeyBinding("Key.sample", Keyboard.KEY_R, "CategoryName"); @Override public void registerClientInfo() { ClientRegistry.registerKeyBinding(sampleKey); } }
PacketHandler.class
package yourpackage; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; import cpw.mods.fml.relauncher.Side; public class PacketHandler { //このMOD用のSimpleNetworkWrapperを生成。チャンネルの文字列は固有であれば何でも良い。MODIDの利用を推奨。 public static final SimpleNetworkWrapper INSTANCE = NetworkRegistry.INSTANCE.newSimpleChannel("KeySampleMod"); public static void init() { INSTANCE.registerMessage(MessageKeyPressedHandler.class, MessageKeyPressed.class, 0, Side.SERVER); } }
SampleKeyCore.java(importは省略)
package yourpackage; @Mod(modid="KeySampleMod", name="KeySampleMod", version="1.0") public class SampleKeyCore { @SidedProxy(clientSide = "yourpackage.Client.ClientProxy", serverSide = "yourpackage.CommonProxy") public static CommonProxy proxy; @EventHandler public void preInit(FMLPreInitializationEvent event) { PacketHandler.init(); } @EventHandler public void load(FMLInitializationEvent event) { FMLCommonHandler.instance().bus().register(this);//KeyHandlingEvent用 } //キーが“押された時”に呼ばれる。“押しっぱなし”の判定は別途用意する必要あり。 @SubscribeEvent public void KeyHandlingEvent(KeyInputEvent event) { if (ClientProxy.sampleKey.isPressed()) { PacketHandler.INSTANCE.sendToServer(new MessageKeyPressed(1));//1をサーバーに送る。 } } }
MessageKeyPressed.java
package yourpackage; import cpw.mods.fml.common.network.simpleimpl.IMessage; import io.netty.buffer.ByteBuf; public class MessageKeyPressed implements IMessage { public byte key; public MessageKeyPressed(){} public MessageKeyPressed(byte keyPressed) { this.key = keyPressed; } @Override public void fromBytes(ByteBuf buf) { this.key = buf.readByte(); } @Override public void toBytes(ByteBuf buf) { buf.writeByte(this.key); } }
MessageKeyPressedHandler.java
package yourpackage; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import net.minecraft.entity.player.EntityPlayer; public class MessageKeyPressedHandler implements IMessageHandler<MessageKeyPressed, IMessage> { @Override public IMessage onMessage(MessageKeyPressed message, MessageContext ctx) { EntityPlayer entityPlayer = ctx.getServerHandler().playerEntity; //受け取ったMessageクラスのkey変数の数字をチャットに出力 entityPlayer.addChatComponentMessage(new ChatComponentText(String.format("Received byte %d", message.key))); return null; }
解説[編集]
ClientProxy[編集]
package yourpackage.client;tProxy=== import yourpackage.CommonProxy; import net.minecraft.client.settings.KeyBinding; import cpw.mods.fml.client.registry.ClientRegistry; public class ClientProxy extends CommonProxy { //キーのUnlocalizedName、バインドするキーの対応整数値(Keyboardクラス参照のこと)、カテゴリー名 public static final KeyBinding sampleKey = new KeyBinding("Key.sample", Keyboard.KEY_R, "CategoryName"); @Override public void registerClientInfo() { ClientRegistry.registerKeyBinding(sampleKey); } }
KeyBindingは1.6からインスタンス生成時の引数に“カテゴリー名”が追加されている。
キーのローカライズはlangファイル利用。
KeyBindingクラスとClientRegistryクラスはクライアント側のみなので、Proxyで分ける必要がある。
KeyInputEvent[編集]
//キーが押されたかどうかを保存する変数tEvent=== public static boolean pressSampleKey = false; //キーが“押された時”に呼ばれる。“押しっぱなし”の判定は別途用意する必要あり。 @SubscribeEvent public void KeyHandlingEvent(KeyInputEvent event) { if (ClientProxy.sampleKey.isPressed()) { PacketHandler.INSTANCE.sendToServer(new MessageKeyPressed(1));//1をサーバーに送る。 } }
1.7より追加されたイベント。いづれかのキーが押された時に、呼ばれる。
どのキーが押されたかはeventに保存されていないので、用意しているKeyBinding変数のメソッドを利用する必要が有る。
このイベントはクライアント側のみであるので、サーバーにキー判定を伝えるにはパケットを送る必要が有る。
MessageKeyPressed[編集]
package yourpackage; import cpw.mods.fml.common.network.simpleimpl.IMessage; import io.netty.buffer.ByteBuf; public class MessageKeyPressed implements IMessage { private byte key; public MessageKeyPressed(){} public MessageKeyPressed(byte keyPressed) { this.key = keyPressed; } @Override public void fromBytes(ByteBuf buf) { this.key = buf.readByte(); } @Override public void toBytes(ByteBuf buf) { buf.writeByte(this.key); } }
キー判定を送るMessageクラス。 ここでは、byte変数keyの内容をサーバーに送っている。
MessageKeyPressedHandler[編集]
package yourpackage; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import net.minecraft.entity.player.EntityPlayer; public class MessageKeyPressed implements IMessageHandler<MessageKeyPressed, IMessage> { @Override public IMessage onMessage(MessageKeyPressed message, MessageContext ctx) { EntityPlayer entityPlayer = ctx.getServerHandler().playerEntity; //受け取ったMessageクラスのkey変数の数字をチャットに出力 entityPlayer.addChatComponentMessage(new ChatComponentText(String.format("Received byte %d", message.key))); return null; } }
Messageクラスを受け取って、処理をするクラス。 ここでは、サーバーのチャットに変数に格納されたbyteを出力している。
押しっぱなしかどうかを見たいのであれば、tick処理ループ内で、KeyBinding変数のgetIsKeyPressed()メソッドを監視し続ければよい。