猫史档案馆


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

用户:全能代码师全能代码师查看:18 回复:29 评论:18 创建时间:2022-01-09T17:37:10


/*
提示:
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 (
        userKey VARCHAR(50) PRIMARY KEY UNIQUE NOT NULL,
        name VARCHAR(50) NOT NULL,
        jointime REAL NOT NULL,
        leavetime REAL,
        danger INT NOT NULL,
        time INT NOT NULL
    )`
}

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

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

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

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

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

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

    return rows[0];
}
// 清空所有数据
async function clearLoginRecord() {
    await db.sql`DROP TABLE player`;
    world.say(`清空所有登陆数据!`);
}

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

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

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

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

        updatePlayerJoin(entity.player.userKey, 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.userKey, entity.player.name, now, entity.danger, entity.time)
});


回复

上一页1 页 / 共 1下一页
我是昵称哦我是昵称哦

?来我图可以吗?

 

点赞0


评论


星辰Lolita星辰Lolita

好 

点赞0


评论


全能代码师全能代码师

改一下函数

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

点赞1


评论


神岛吉吉喵神岛吉吉喵

支持一下

点赞3


评论


阳光猫阳光猫

赞一个

点赞1


评论


摩羯哥哥摩羯哥哥

怎么用?怎么打开?

点赞0


评论


你猜s你猜s

好!!!

点赞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


评论


聋猪up聋猪up

维和者的福音好吧

点赞0


评论


该账号已停用该账号已停用

好!

点赞0


评论


全能代码师全能代码师

ddd

点赞0


评论


AlcalaAlcala

ddd

点赞0


评论


TBRO魔导师TBRO魔导师

admin1.includes(entity.player.name)

什么用

点赞0


评论


TBRO魔导师TBRO魔导师

有问题jointime会报错

点赞0


评论


全能代码师全能代码师

ddd

点赞0


评论


全能代码师全能代码师

随便用,这代码完全开源,但是最好署名

点赞0


评论


编码喵编码喵

更新玩家数据那里有必要一个一个语句更吗?直接一条语句就可以搞定了,只要在要更新的列表后面加个逗号就可以加入要更新的数据了

点赞0


评论


未名用户未名用户

哇!!

点赞0


评论


友善的小黄鸡_漂流龙友善的小黄鸡_漂流龙

dddd采纳感谢!Thanks♪(・ω・)ノ

点赞0


评论


全能代码师全能代码师

ddd

点赞0


评论


难起的名字难起的名字

ddd

点赞0


评论


用户_869149用户_869149

顶顶顶()

点赞0


评论


指令者指令者

666

点赞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


评论


AucunAucun

还可以

点赞0


评论


全能代码师全能代码师

d d d

点赞1


评论


屑胶原蛋屑胶原蛋

封号的效果立竿见影😂

点赞0


评论


骑士之刃骑士之刃

ddd

点赞0


评论


fjskdfjslkdfjskdfjslkd

怎么用a

 

点赞0


评论