提供: Minecraft Modding Wiki
この編集を取り消せます。
下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
− | + | {{前提MOD|reqmod="Minecraft Forge Universal 10.12.0.xxx~"}} | |
− | {{前提MOD|reqmod="Minecraft Forge Universal 10.12. | ||
− | |||
− | |||
==1.6におけるキーの処理== | ==1.6におけるキーの処理== | ||
10行目: | 7行目: | ||
==1.7でのキーイベント追加== | ==1.7でのキーイベント追加== | ||
キーイベントの追加方法 | キーイベントの追加方法 | ||
+ | (前提記事:[[1.7のパケットについて]]) | ||
===ソースコード=== | ===ソースコード=== | ||
CommonProxy.java | CommonProxy.java | ||
<source lang = "java"> | <source lang = "java"> | ||
package yourpackage; | package yourpackage; | ||
− | |||
public class CommonProxy { | public class CommonProxy { | ||
29行目: | 26行目: | ||
public class ClientProxy extends CommonProxy { | public class ClientProxy extends CommonProxy { | ||
//キーのUnlocalizedName、バインドするキーの対応整数値(Keyboardクラス参照のこと)、カテゴリー名 | //キーのUnlocalizedName、バインドするキーの対応整数値(Keyboardクラス参照のこと)、カテゴリー名 | ||
− | public static | + | public static KeyBinding sampleKey = new KeyBinding("Key.sample", Keyboard.KEY_R, "CategoryName"); |
@Override | @Override | ||
public void registerClientInfo() { | public void registerClientInfo() { | ||
37行目: | 34行目: | ||
} | } | ||
</source> | </source> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
SampleKeyCore.java(importは省略) | SampleKeyCore.java(importは省略) | ||
<source lang = "java"> | <source lang = "java"> | ||
65行目: | 42行目: | ||
@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 static final PacketPipeline packetPipeline = new PacketPipeline(); | ||
@EventHandler | @EventHandler | ||
− | public void | + | public void load(FMLInitializationEvent event) { |
− | + | packetPipeline.initialise(); | |
+ | packetPipeline.registerPacket(KeyHandlingPacket.class);//パケットの登録 | ||
+ | FMLCommonHandler.instance().bus().register(this);//KeyHandlingEvent用 | ||
+ | MinecraftForge.EVENT_BUS.register(this);//LivingUpdate用 | ||
} | } | ||
− | |||
@EventHandler | @EventHandler | ||
− | public void | + | public void postInit(FMLPostInitializationEvent event) { |
− | + | packetPipeline.postInitialise(); | |
} | } | ||
− | // | + | //キーが押されたかどうかを保存する変数 |
+ | public static boolean pressSampleKey = false; | ||
@SubscribeEvent | @SubscribeEvent | ||
public void KeyHandlingEvent(KeyInputEvent event) { | 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; | |
− | + | } | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
} | } | ||
</source> | </source> | ||
− | + | KeyHandlingPacket.java | |
<source lang = "java"> | <source lang = "java"> | ||
package yourpackage; | package yourpackage; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
import io.netty.buffer.ByteBuf; | import io.netty.buffer.ByteBuf; | ||
+ | import io.netty.channel.ChannelHandlerContext; | ||
+ | import net.minecraft.entity.player.EntityPlayer; | ||
− | public class | + | //クライアント側でキー入力によって変化した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); | |
− | + | } | |
− | |||
− | |||
− | public | + | @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; | |
+ | } | ||
} | } | ||
</source> | </source> | ||
− | + | ==解説== | |
− | + | 後日掲載。 | |
− | |||
− |