用户:
全能代码师查看: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)
});改一下函数
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
评论
大力支持这种代码好吧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
评论
墨染云天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
评论