//LiteLoaderScript Dev Helper
/// <reference path="F:\molingbao\llse_development\Library/JS/Api.js" /> 


//Arnol梧桐的第一个插件，虽然代码很简单，但我还是很开心。
//入坑半年多，没事儿就崩服，头大，希望研究插件可以提升下我排查问题的能力。
//注释很详细，逻辑很简单。大家就当作插件入门教程吧，希望能够帮助大伙快速上手llse插件开发。


//进服务器自动给钟，并告诉玩家你获得了一个钟。
//如果背包满了或者已经有钟了，就不给了。


//【插件注册】向加载器提供一些插件相关的信息
let PLUGIN_NAME = "GiveClock";      //插件名称
let PLUGIN_DESCRIPTION = "LLSE 进服自动给个钟 [输入 ll plugins GiveClock 查看具体信息]";     //插件描述
let VERSION = [1,0,7];      //插件版本号
let Publishing_website = "https://www.minebbs.com/resources/giveclock.3686/";   //插件发布地址
let AUTHOR = "Arnol梧桐";       //插件作者

logger.setTitle(`${PLUGIN_NAME}`);       //插件日志消息标头
logger.setConsole(true, 4);         //设置日志是否输出到控制台,默认等级为4；可以输出 严重错误、错误、警告、提示信息

//检查 LiteLoader 加载器版本,如果检测发现当前安装的 LLSE 版本低于传入的数值，将返回 false。
//你可以选择根据结果判断并报错，提醒用户升级自己的 LiteLoader (LLSE) 版本
if(!ll.requireVersion(2, 1, 3)){            
    throw new Error("\n"+`【⚠警告】${PLUGIN_NAME} 加载失败!`+"\n"+"【⚠警告】LiteLoader加载器 版本过低，请升级至 LL2.1.3 或更高版本!");
}
else{
    logger.info(`${PLUGIN_NAME} Loaded, Version:${VERSION.join(".")}, Publishing website:${Publishing_website},Author: ${AUTHOR}`);  //显示插件版本号，作者等信息
    logger.info(`${PLUGIN_NAME} 加载成功, 版本号:${VERSION.join(".")}, 发布网站:${Publishing_website},插件作者: ${AUTHOR}`);  //显示插件版本号，作者等信息

    ll.registerPlugin(PLUGIN_NAME, PLUGIN_DESCRIPTION, VERSION, {
        "Publishing website":Publishing_website,
        "发布地址":Publishing_website,
        "Author":AUTHOR,
        "作者":AUTHOR
    });

    //【配置一些自定义函数】

    //初始化变量，设定一个无法被丢弃的钟（nbt标签）
    let nbtclock = NBT.parseSNBT(String.raw`{"Count":1b,"Damage":0s,"Name":"minecraft:clock","WasPickedUp":0b,"tag":{"minecraft:item_lock":2b,"minecraft:keep_on_death":1b}}`);

    //创建自定义函数 findpack(pl,Items_to_be_found)   
    //这个函数是用来查玩家背包有没有某样物品
    //比如想要查玩家背包里有没有钟，就是findpack(pl,"minecraft:clock")
    //形参Items_to_be_found接收的值就是"minecraft:clock"
    //返回布尔值have_this_items = true （玩家背包里有这个物品）或者 false （玩家背包里没有这个物品）
    function findpack(pl,Items_to_be_found) {
        let have_this_items = null;
        for(let i=0;i<pl.getInventory().size;i++){
            if (pl.getInventory().getItem(i).type == Items_to_be_found){
                have_this_items = "true";      //如果背包里有这个物品，赋值为true
                break;
            }
            else{
                have_this_items = "false";     //如果背包里没有这个物品，赋值为false
            }
        }
        return have_this_items ;               //返回布尔值have_this_items = true （玩家背包里有这个物品）或者 false （玩家背包里没有这个物品）
    }

    //创建自定义函数 function does_the_pack_have_space(pl,items_waiting_to_be_placed)   
    //这个函数是用来查玩家背包，是否足够的剩余空间放入即将放入的物品
    //比如想要给玩家背包里放入一个nbt钟，查玩家背包是否有剩余空间，就是does_the_pack_have_space(pl,mc.newItem(nbtclock))
    //形参items_waiting_to_be_placed接收的值就是mc.newItem(nbtclock)
    //返回布尔值 true （有空间，可以放入这个物品）或者 false （背包满了，没有空间放入这个物品）
    function does_the_pack_have_space(pl,items_waiting_to_be_placed) {
        return pl.getInventory().hasRoomFor(items_waiting_to_be_placed);
    }

    //【进服自动给钟】配置玩家进服监听，检测背包是否有空位，进服务器自动给钟并提示。
    mc.listen("onJoin",function(pl){     //玩家进服监听    
        //先检查背包是否有空位，没有空位会提示背包满了。如果背包有空位会给玩家一个钟。
        if(findpack(pl,"minecraft:clock") == "false"){
            if(!does_the_pack_have_space(pl,mc.newItem(nbtclock))){
                pl.tell("§6你的§b背包§d满了，§a自动给钟§c失败，§6请清理§b背包§6后,输入“§e/clock”§6获取§a钟。",0);  //检测背包是否有空位，如果没有空位，提示玩家整理下背包。
            }
            else{
                pl.tell("§6你§a获得了§c一个§e钟。",4)   //告诉玩家“你获得了一个钟。”
                pl.giveItem(mc.newItem(nbtclock))
                log("入服自动给钟 " + pl.name + " clock*1")
            }
        }
    });

    //【真指令注册】玩家输入"/clock"或者输入"/给钟"获取一个钟，并告诉玩家你获得了一个钟。
    //注册一条顶层命令
    mc.listen("onServerStarted", () => {
        let cmd = mc.newCommand("clock", "§a给玩家§b一个§e钟", PermType.Any,0x80);  
        cmd.setAlias("给钟");       //为命令设置别名，执行"/给钟"的时候相当于触发同一条命令    
        cmd.overload([]);       //指令重载
        //设置指令回调
        cmd.setCallback((cmd, origin,output,res) => {
            if(origin.type == OriginType.Player){
                //先检查是否有钟，如果没有钟，再检查背包是否有空位
                //没有空位会提示背包满了。如果背包有空位会给玩家一个钟。
                //如果背包有钟，告诉玩家“你背包里已经有钟了，你再仔细找找吧。”
                if(findpack(origin.player,"minecraft:clock") == "false"){
                    if(!does_the_pack_have_space(origin.player,mc.newItem(nbtclock))){
                        output.success("§6你的§b背包§d满了，§a给钟§c失败，§6请清理§b背包§6后,输入“§e/clock”§6获取§a钟。");  //检测背包是否有空位，如果没有空位，提示玩家整理下背包。
                    }
                    else{
                        origin.player.tell("§6你§a获得了§c一个§e钟。",4)   //告诉玩家“你获得了一个钟。”
                        origin.player.giveItem(mc.newItem(nbtclock))
                        log("指令给钟 " + origin.player.name + " clock*1")
                    }
                }
                else{
                    origin.player.tell("§6你§e背包里§c已经§a有钟了，§b你再§e仔细§b找找吧。",4)   //告诉玩家“你背包里已经有钟了，你再仔细找找吧。”
                }
            }
            else if(origin.type == OriginType.Server){
                output.error("§l§c此指令仅允许游戏内玩家执行，无法在控制台执行！");
            };
        });
        cmd.setup();    //在对命令的所有配置完成之后，使用此函数将命令注册到 BDS 的命令系统当中
    });
};