跳转到内容
logo
我的世界XyeBBS论坛3群 进群吹水聊天!众多整合包作者、插件作者、玩家在内哦!不定时发福利,公布重要通知!

简单易用的FancyMenu Api脚本

icon教程-KubeJS教程浏览 730回复 0
发布于 2025-07-11 16:19:38

该脚本将FancyMenu自身的部分Command以KJS脚本形式重新实现,旨在方便开发者在KJS脚本中控制玩家的gui展示和fm变量控制。

使用示例:

BlockEvents.rightClicked(event=>{
    if (event.hand == "MAIN_HAND") {
        //玩家右击方块会进入esc界面
        FancyMenuApi.openGui(event.player,'pause_screen')
        //log中打印玩家所有的fm变量
        console.log(FancyMenuApi.setPlayer(event.player).getAllVars())
    }
})

脚本主体:

const FancyMenuApi = {
    /**
     * @version v1.0.0
     * @author WhiseNT
     */
    classes:{
        OpenGuiCommandPacket: Java.loadClass('de.keksuccino.fancymenu.networking.packets.commands.opengui.OpenGuiCommandPacket'),
        CloseGuiCommandPacket: Java.loadClass('de.keksuccino.fancymenu.networking.packets.commands.closegui.CloseGuiCommandPacket'),
        PacketHandler: Java.loadClass('de.keksuccino.fancymenu.networking.PacketHandler'),
        Collection: Java.loadClass('java.util.Collection'),
        VariableCommandPacket: Java.loadClass('de.keksuccino.fancymenu.networking.packets.commands.variable.command.VariableCommandPacket'),
        VariableCommand: Java.loadClass('de.keksuccino.fancymenu.commands.VariableCommand'),
    },
    /**
     * 从服务端打开玩家的GUI
     * @param {Internal.Collection_<Internal.ServerPlayer_> | Internal.ServerPlayer_} targets 
     * @param {String} guiName 
     */
    openGui(targets,guiName) {
        try {
            let packet = new this.classes.OpenGuiCommandPacket()
            packet.screen_identifier = guiName
            if (targets instanceof this.classes.Collection) {
                for (let player of targets) {
                    this.classes.PacketHandler.sendToClient(player, packet)
                }
            } else {
                this.classes.PacketHandler.sendToClient(targets, packet)
            }
        } catch (error) {
            console.log(error)
        }
        
        
    },
    /**
     * 从服务端关闭玩家的GUI
     * @param {Internal.Collection_<Internal.ServerPlayer_> | Internal.ServerPlayer_} targets 
     * @param {String} guiName 
     */
    closeGui(targets,guiName) {
        try {
            let packet = new this.classes.CloseGuiCommandPacket()
            if (targets instanceof this.classes.Collection) {
                for (let player of targets) {
                    this.classes.PacketHandler.sendToClient(player, packet)
                }
            } else {
                this.classes.PacketHandler.sendToClient(targets, packet)
            }
        } catch (error) {
        console.log(error)
        }
    },
    /**
     * 获取玩家的fm变量
     * @param {Internal.ServerPlayer_} player 
     * @param {String} varName 
     */
    getVar(player,varName) {
        try {
            if (varName != null) {
                let packet = new this.classes.VariableCommandPacket();
                packet.set = false;
                packet.variable_name = varName;
                this.classes.PacketHandler.sendToClient(player, packet);
            }
        } catch (ex) {
            ex.printStackTrace();
        }
    },
    /**
     * 设置玩家的fm变量
     * @param {Internal.ServerPlayer_} player 
     * @param {String} varName
     */
    setVar(player,varName,value) {
        try {
            if ((varName != null)  && (value != null)) {
                let packet = new this.classes.VariableCommandPacket();
                packet.set = true;
                packet.variable_name = varName
                packet.set_to_value = value
                packet.feedback = false
                this.classes.PacketHandler.sendToClient(player, packet);
            }
        } catch (ex) {
            ex.printStackTrace();
        }
    },
    /**
     * 获取玩家的所有fm变量
     * @param {Internal.ServerPlayer_} player 
     * @returns {Internal.ArrayList_}
     */
    getAllVars(player) {
        return this.classes.VariableCommand.CACHED_VARIABLE_SUGGESTIONS.get(player.uuid.toString())
    },
    /**
     * 以特定玩家为对象
     * @param {Internal.ServerPlayer_} player 
     */
    setPlayer(player) {
        this.player = player
        return {
            getVar(varName) {
                FancyMenuApi.getVar(player,varName)
            },
            setVar(varName,value) {
                FancyMenuApi.setVar(player,varName,value)
            },
            getAllVars() {
                return FancyMenuApi.getAllVars(player)
            },
            openGui(guiName) {
                FancyMenuApi.openGui(player,guiName)
            },
            closeGui(guiName) {
                FancyMenuApi.closeGui(player,guiName)
            }
        }
    }
}


帖子打赏
参与人数打赏物品(0)

正在加载内容…
回复帖子善语结善缘,恶语伤人心。要记得文明发言哦!
登录后参与讨论登录账号后即可发表您的回复和看法