[ minecraft - forge 1.16 ]クライアントからの爆発を確認します.


以下の手順でExplosion Modを作りました.
  • はクライアント側でPlayerInteractEvent.LeftClickEmptyを受け取ります.
  • サーバ側にExplosionMessageを送ります.
  • サーバー側で爆発を起こします.
  • コードはKotlinで書かれます.
    まず、ExplosionMessageクラスを作成します.
    class ExplosionMessage(
        val x: Double,
        val y: Double,
        val z: Double
    ) {
    
        companion object {
            fun encode(message: ExplosionMessage, buf: PacketBuffer) {
                buf.writeDouble(message.x)
                buf.writeDouble(message.y)
                buf.writeDouble(message.z)
            }
    
            fun from(buf: PacketBuffer): ExplosionMessage {
                return ExplosionMessage(
                    buf.readDouble(),
                    buf.readDouble(),
                    buf.readDouble()
                )
            }
        }
    }
    
    準備完了.
    class ExampleMod {
    
        private val channel: SimpleChannel = NetworkRegistry.newSimpleChannel(
            ResourceLocation(MOD_ID, "main"),
            { PROTOCOL_VERSION },
            PROTOCOL_VERSION::equals,
            PROTOCOL_VERSION::equals
        )
    
        init {
            channel.registerMessage(
                0,
                ExplosionMessage::class.java,
                ExplosionMessage::encode,
                ExplosionMessage::from,
                this::handle
            )
    
            MinecraftForge.EVENT_BUS.register(this)
        }
    
        ...
    
    SimpleChannel .
    このイベントはクライアント側でのみ発生します.
        @SubscribeEvent
        fun on(event: PlayerInteractEvent.LeftClickEmpty) {
            val loc = Minecraft.getInstance().hitResult?.location
            if (loc == null) {
                return
            }
    
            logger.info("ExplosionMessage send: ${loc?.x} ${loc?.y} ${loc?.z} ")
            channel.sendToServer(ExplosionMessage(loc.x, loc.y, loc.z))
        }
    
    ハンドルPlayerInteractEvent.LeftClickEmpty .
        fun handle(message: ExplosionMessage, context: Supplier<NetworkEvent.Context>) {
            logger.info("ExplosionMessage received: ${message.x} ${message.y}  ${message.z} ")
    
            ServerLifecycleHooks.getCurrentServer().overworld().explode(
                null,
                message.x,
                message.y,
                message.z,
                4.0F,
                Explosion.Mode.BREAK
            )
        }
    
    今我々は我々が欲しい任意の場所を爆発することができます!