提供: Minecraft Modding Wiki
2014年5月15日 (木) 00:54時点におけるA.K. (トーク | 投稿記録)による版 (新規作成・解説はまた後で。)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

この記事は"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 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;
	}
}

解説

後日掲載。