提供: Minecraft Modding Wiki
この記事は"Minecraft Forge Universal 10.12.0.xxx~"を前提MODとしています。 |
1.6におけるキーの処理
1.6までは、KeyHandlerクラスを継承して、KeyUpとKeyDownをtick単位で見ることが出来ました。 1.7では、tick処理自体がイベントになったので、キーの処理もイベントになりました。
1.7でのキーイベント追加
キーイベントの追加方法 (前提記事:1.7のパケットについて)
ソースコード
CommonProxy.java
package yourpackage; 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 KeyBinding sampleKey = new KeyBinding("Key.sample", Keyboard.KEY_R, "CategoryName"); @Override public void registerClientInfo() { ClientRegistry.registerKeyBinding(sampleKey); } }
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; //パケットハンドラー。解説は前提記事を参照のこと。 public static final PacketPipeline packetPipeline = new PacketPipeline(); @EventHandler public void load(FMLInitializationEvent event) { packetPipeline.initialise(); packetPipeline.registerPacket(KeyHandlingPacket.class);//パケットの登録 FMLCommonHandler.instance().bus().register(this);//KeyHandlingEvent用 MinecraftForge.EVENT_BUS.register(this);//LivingUpdate用 } @EventHandler public void postInit(FMLPostInitializationEvent event) { packetPipeline.postInitialise(); } //キーが押されたかどうかを保存する変数 public static boolean pressSampleKey = false; @SubscribeEvent public void KeyHandlingEvent(KeyInputEvent event) { while (ClientProxy.sampleKey.isPressed()) { pressSampleKey = true;//クライアント側のみの変更。 } } @SubscribeEvent public void LivingUpdate(LivingUpdateEvent event) { if (event.entityLiving != null && event.entityLiving instanceof EntityPlayer) { if (event.entityLiving.worldObj.isRemote) { //ここで、クライアントでの変数の変更をサーバーに伝える。 packetPipeline.sendToServer(new KeyHandlingPacket(pressSampleKey )); } if (pressSampleKey) { //クライアントとサーバーの両方で呼ばれる。 pressSampleKey = false; } } } }
KeyHandlingPacket.java
package yourpackage; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import net.minecraft.entity.player.EntityPlayer; //クライアント側でキー入力によって変化したboolean変数をサーバー側に伝達するパケット。AbstractPacketを継承 public class KeyHandlingPacket extends AbstractPacket { //保持しておくboolean型変数 boolean pressSampleKey; //引数を持つコンストラクタを追加する場合は、空のコンストラクタを用意してくれとのこと。 public KeyHandlingPacket() { } //パケット生成を簡略化するために、boolean型変数を引数に取るコンストラクタを追加。 public KeyHandlingPacket(boolean ver1) { pressSampleKey = ver1; } @Override public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) { //ByteBufに変数を代入。基本的にsetメソッドではなく、writeメソッドを使う。 buffer.writeBoolean(pressSampleKey); } @Override public void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer) { //ByteBufから変数を取得。こちらもgetメソッドではなく、readメソッドを使う。 pressSampleKey = buffer.readBoolean(); } @Override public void handleClientSide(EntityPlayer player) { //今回はクライアントの情報をサーバーに送るので、こちらはなにもしない。 } @Override public void handleServerSide(EntityPlayer player) { SampleKeyCore.pressSampleKey = pressSampleKey; } }
解説
後日掲載。