猫史档案馆


【岛3管理计划&&岛3代码共享计划】究极SQL管理玩家代码!!!错过后悔!!!

用户:全能代码师全能代码师查看:3 回复:12 评论:3 创建时间:2022-01-09T14:49:20


/*
提示:
1,在这里是下蹲+右键,不是下蹲+右键也可以
2,如果那个人畏罪潜逃,可以用dangerSet函数快捷操作sql进行处理
*/ 
var admin1 = ['全能代码师', '小红', '小绿']//1级只能禁言
var admin2 = ['全能代码师', '小红']//2级禁言/封号/重启
var admin3 = ['全能代码师']//3级禁言/封号/重启/指令
let author = ['全能代码师']//作者喵
console.clear()
createTable()
/// 创建表
async function createTable() {//danger-2封号,danger-1禁言,danger0普通玩家,danger1,2,3对应管喵123级
    await db.sql`CREATE TABLE IF NOT EXISTS player (
        name VARCHAR(50) NOT NULL,
        jointime REAL NOT NULL,
        leavetime REAL,
        danger INT NOT NULL,
        time INT NOT NULL
    )`
}

// 第一次进入游戏时,新建玩家数据
async function insertPlayer(name, join, leave = 0, danger = 0, time = 0) {
    try {
        await db.sql`INSERT INTO player VALUES (${name}, ${join}, ${leave},${danger},${time})`;
    } catch (e) {
        console.log(`insert sql error: ${e}`);
    }
}

// 更新玩家进入游戏时间
async function updatePlayerJoin(name, value) {
    try {
        await db.sql`UPDATE player SET jointime = ${value} WHERE name = ${name}`;
    } catch (e) {
        console.log(`[jointime] update sql error: ${e}`);
    }
}

// 更新玩家离开游戏时间
async function updatePlayerLeave(name, value, danger, time) {
    try {
        await db.sql`UPDATE player SET leavetime = ${value} WHERE name = ${name}`;
        await db.sql`UPDATE player SET danger = ${danger} WHERE name = ${name}`;
        await db.sql`UPDATE player SET time = ${time} WHERE name = ${name}`;
    } catch (e) {
        console.log(`update sql error: ${e}`);
    }
}

// 更新玩家离开游戏时间
async function dangerSet(name, danger, time) {//通过sql,哪怕那个人不在也可以轻而易举的进行操作
    try {
        await db.sql`UPDATE player SET danger = ${danger} WHERE name = ${name}`;
        await db.sql`UPDATE player SET time = ${time} WHERE name = ${name}`;
    } catch (e) {
        console.log(`update sql error: ${e}`);
    }
}

// 查询数据。如果数据不存在,返回空。
async function getPlayerData(name) {
    const rows = await db.sql`SELECT * FROM player WHERE name=${name}`;

    if (rows && !rows.length) {
        return null;
    }

    return rows[0];
}

// 清空所有数据
async function clearLoginRecord() {
    await db.sql`DELETE FROM player`
    world.say(`清空所有登陆数据!`);
}

//-------------------------------------------------------
// 玩家进入游戏

world.onPlayerJoin(async ({ entity }) => {

    const now = new Date().valueOf();    // 获取真实世界的时间戳 timestamp
    const playerData = await getPlayerData(entity.player.name);    // 获取上次登录记录

    // 如果数据不存在,说明时第一次进入游戏
    if (playerData === null) {
        insertPlayer(entity.player.name, now); // 插入玩家数据
        //world.say(`${entity.player.name} 第一次进入游戏。`);
    } else {

        updatePlayerJoin(entity.player.name, now); // 更新玩家进入游戏时间
        entity.danger = playerData.danger
        entity.time = playerData.time//封号时间
        const leaveMs = (now - playerData.leavetime) / 1000;
        const leaveHour = Math.floor(leaveMs / 3600)
        const leaveDay = Math.floor(leaveHour / 24)
        if (entity.time > 0) {
            entity.time -= leaveDay
        }
        if (entity.time > 0) {
            if (entity.danger == -1) {
                entity.player.muted = true
            }
            if (entity.danger == -2) {
                entity.player.muted = true
                entity.position.y = 10000
                await sleep(10000)//给他们解禁机会
                entity.player.kick();
            }
        } else {
            entity.danger = 0;
        }
        //entity.player.directMessage(`${entity.player.name} 距离上次登录经过了 ${leaveMs.toFixed(2)} 秒`);
    }

});

world.onPress(async ({ entity, button }) => {
    if (entity.player.walkState == Box喵layerWalkState.CROUCH && button == Box3ButtonType.ACTION1 && admin1.includes(entity.player.name)) {//下蹲+右键,自行更改
        var options = []
        if (admin1.includes(entity.player.name)) {
            options = ['禁言管理', '解禁']
            if (admin2.includes(entity.player.name)) {
                options = ['禁言管理', '封号管理', '重启游戏', '解禁']
                if (admin3.includes(entity.player.name)) {
                    options = ['禁言管理', '封号管理', '重启游戏', '控制台', '解禁']
                }
            }
        }
        if (author.includes(entity.player.name)) {
            options = ['禁言管理', '封号管理', '重启游戏', '控制台', '解禁']
        }
        var players = world.querySelectorAll('player')
        var names = []
        for (const i in players) {
            names.push(players[i].player.name)
        }
        var result = await entity.player.dialog({
            type: Box3DialogType.SELECT,
            title: "管喵",
            options: options,    // 将提供玩家选择的选项放入数组里。
        });
        // 如果玩家点击了屏幕其他区域,取消了对话框。
        if (!result || result === null) {
            return;
        }

        // 判断玩家选了什么选项。
        switch (result.value) {
            case '禁言管理':
                var result = await entity.player.dialog({
                    type: Box3DialogType.SELECT,
                    title: "管喵",
                    options: names,    // 将提供玩家选择的选项放入数组里。
                });
                // 如果玩家点击了屏幕其他区域,取消了对话框。
                if (!result || result === null) {
                    return;
                }
                var result1 = await entity.player.dialog({
                    type: Box3DialogType.SELECT,
                    title: "管喵,请选择天数",
                    options: ['1', '7', '14', '30', '60', '90', '180', '360'],    // 将提供玩家选择的选项放入数组里。
                });
                // 如果玩家点击了屏幕其他区域,取消了对话框。
                if (!result1 || result1 === null) {
                    return
                }
                var num = parseInt(result1.value)

                world.querySelectorAll('player').forEach((x) => {
                    if (x.player.name == result.value) {
                        x.danger = -1;
                        world.say(result.value + '被管喵' + entity.player.name + '禁言了' + num + '天!')
                        x.player.muted = true;
                        x.time = num
                    }
                })
                break;
            case '封号管理':
                var result = await entity.player.dialog({
                    type: Box3DialogType.SELECT,
                    title: "管喵",
                    options: names,    // 将提供玩家选择的选项放入数组里。
                });
                // 如果玩家点击了屏幕其他区域,取消了对话框。
                if (!result || result === null) {
                    return;
                }
                var result1 = await entity.player.dialog({
                    type: Box3DialogType.SELECT,
                    title: "管喵,请选择天数",
                    options: ['1', '7', '14', '30', '60', '90', '180', '360'],    // 将提供玩家选择的选项放入数组里。
                });
                // 如果玩家点击了屏幕其他区域,取消了对话框。
                if (!result1 || result1 === null) {
                    return
                }
                var num = parseInt(result1.value)
                world.querySelectorAll('player').forEach((x) => {
                    if (x.player.name == result.value && !author.includes(entity.player.name)) {
                        x.danger = -2;
                        world.say(result.value + '被管喵' + entity.player.name + '封号了' + num + '天!')
                        x.time = num
                        x.player.kick();
                    }
                })
                break;
            case '解禁':
                var result = await entity.player.dialog({
                    type: Box3DialogType.SELECT,
                    title: "管喵",
                    options: names,    // 将提供玩家选择的选项放入数组里。
                });
                // 如果玩家点击了屏幕其他区域,取消了对话框。
                if (!result || result === null) {
                    return;
                }

                world.querySelectorAll('player').forEach((x) => {
                    if (x.player.name == result.value) {
                        x.danger = 0;
                        world.say(result.value + '被管喵' + entity.player.name + '解禁了')
                        x.player.muted = false;
                        x.player.kick();
                        x.time = 0;
                    }
                })
                break;
            case '重启游戏':
                world.say(`管喵 @${entity.player.name} 进行了重启`)
                await sleep(1000)
                eval('for(;;){}')
                break;
            case '控制台':
                const result4 = await entity.player.dialog({
                    type: Box3DialogType.INPUT,
                    title: "控制台",
                    content: `这是管喵专用的控制台,可以在运行模式下输入代码并执行。`,
                    confirmText: '确定', // 确定按钮上面的文字。按下确定按钮后,提交回答。
                    placeholder: '在这里输入代码。(注意“;”)', // 输入框背景上的提示文字。
                });

                // 如果玩家点击了屏幕其他区域,取消了对话框。
                if (!result4 || result4 === null) {
                    entity.player.directMessage('已取消执行。');
                    return;
                }

                try {
                    await entity.player.dialog({
                        type: Box3DialogType.TEXT,   // 对话框的类型,TEXT是文本框。
                        title: '代码执行器',               // 对话框标题为NPC名字,表示正在说话的是NPC
                        content: '<~ ' + eval(result4)
                    });
                } catch (err) {
                    await entity.player.dialog({
                        type: Box3DialogType.TEXT,   // 对话框的类型,TEXT是文本框。
                        title: '代码执行器',               // 对话框标题为NPC名字,表示正在说话的是NPC
                        content: 'Error:' + err
                    });
                }
                break;
            default:
            // 注意,使用 switch 分支的时候,不要漏了后面的 break; 
        }
    }
})
// 玩家离开游戏
world.onPlayerLeave(async ({ entity }) => {
    const now = new Date().valueOf();
    updatePlayerLeave(entity.player.name, now, entity.danger, entity.time)
});


回复

上一页1 页 / 共 1下一页
全能代码师全能代码师

这玩意还有个好家伙的地方就是有封号时间

点赞0


评论


小鹿deer小鹿deer

拿走了,谢谢

点赞0


评论


星星上的雪花星星上的雪花

你这是用的是英国时间emotion_doge

点赞0


评论


DebugDynamoDebugDynamo

我最想要了!!!!! 顶!!!!!!!!!

点赞0


评论


全能代码师全能代码师

啊对了好像有个bug,改了名字就不行了,所以寒假加个userKey

点赞1


评论


你猜s你猜s

好!!!

点赞0


评论


GPUawaGPUawa

这鬼东西,我喵bit的电脑都快卡成PPT了emotion_doge

点赞0


评论


用户_869149用户_869149

ddd

点赞0


评论


未名用户未名用户

imgsrc="https://static.codemao.cn/emoji/codemao/%E7%BC%96%E7%A8%8B%E7%8C%AB_%E7%82%B9%E8%B5%9E.gif"alt="emotion_编程猫_点赞"

点赞0


评论


灵清帝王吃爆一切厕所灵清帝王吃爆一切厕所

不是啊,为啥用不了。。。右键加下蹲触发吗?

点赞0


评论


灵清帝王吃爆一切厕所灵清帝王吃爆一切厕所

为啥我封号用不了()()()()

点赞0


评论


fjskdfjslkdfjskdfjslkd

用不了aemotion_编程猫_搓头

点赞0


评论