/* 提示: 1,在这里是下蹲+右键,不是下蹲+右键也可以 2,如果那个人畏罪潜逃,可以用dangerSet函数快捷操作sql进行处理 */ /* (async function () { await db.sql`ALTER TABLE player ADD COLUMN bag TEXT DEFAULT ''`; })();*/ //给player表增加一列“title”,作为用户称号 console.clear() createTable() /// 创建表 async function createTable() { await db.sql`CREATE TABLE IF NOT EXISTS player ( userKey VARCHAR(50) PRIMARY KEY UNIQUE NOT NULL, name VARCHAR(50) NOT NULL, jointime REAL, leaveDay INT, danger INT NOT NULL, time INT NOT NULL, titles TEXT NOT NULL, star INT NOT NULL, coin INT NOT NULL, items TEXT NOT NULL, tasks TEXT NOT NULL, technology TEXT NOT NULL, presents TEXT NOT NULL, heroes TEXT NOT NULL, bag TEXT DEFAULT '' )` /* titles是称号,列表,其中title[0]为目前使用的称号 star是军衔星,和战地一样 items:道具列表 tasks:任务列表,任务为正在进行中的任务 */ } global.createTable = createTable // 第一次进入游戏时,新建玩家数据 /*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}`); } } global.savePlayer = savePlayer // 更新玩家离开游戏时间 async function savePlayer(entity = new Box3Entity, a = 0) { if (entity.player.userKey == '') return var now = new Date().valueOf()//日期 now = Math.floor(now / 1000 / 3600 / 24) try { if (entity.clicked == 1 || a == 1) { /* await db.sql`UPDATE player SET leavetime = ${now} WHERE userKey = ${entity.player.userKey}`; await db.sql`UPDATE player SET danger = ${entity.danger} WHERE userKey = ${entity.player.userKey}`; await db.sql`UPDATE player SET time = ${entity.time} WHERE userKey = ${entity.player.userKey}`; await db.sql`UPDATE player SET name = ${entity.player.name} WHERE userKey = ${entity.player.userKey}`;*/ await db.sql` INSERT INTO "player" (-- player虽然是小写, 建议统一用""包住 "userKey", "name", "jointime", "leaveDay", "danger", "time", "titles", "star", "coin", "items", "tasks", "technology", "presents", "heroes", "bag" ) VALUES ( ${entity.player.userKey}, ${entity.player.name}, ${entity.player.joinTime}, ${now}, ${entity.danger}, ${entity.time}, ${JSON.stringify(entity.titles)}, ${entity.star}, ${entity.coin}, ${JSON.stringify(entity.items)}, ${JSON.stringify(entity.tasks)}, ${JSON.stringify(entity.technology)}, ${JSON.stringify(entity.presents)}, ${JSON.stringify(entity.heroes)}, ${JSON.stringify(entity.bag)} ) ON CONFLICT("userKey") -- 如果已经存在同样的用户识别码 DO UPDATE SET "name"=excluded."name", "jointime"=excluded."jointime", "leaveDay"=excluded."leaveDay",-- 虽然是小写, 建议统一用""包住 "danger"=excluded."danger", "time"=excluded."time", "titles"=excluded."titles", "star"=excluded."star", "coin"=excluded."coin", "items"=excluded."items", "tasks"=excluded."tasks", "technology"=excluded."technology", "presents"=excluded."presents", "heroes"=excluded."heroes", "bag"=excluded."bag" ` } } catch (e) { console.log(`update sql error: ${e} `); if (Math.random() < 0.1) { world.say('保存错误' + e) } entity.player.directMessage(e) } } global.getPlayerData = getPlayerData // 查询数据。如果数据不存在,返回空。 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(`清空所有登陆数据!`); } global.clearLoginRecord = clearLoginRecord //------------------------------------------------------- // 玩家进入游戏 let cqwdLBM = [] world.onPlayerJoin(async ({ entity }) => { const now = new Date().valueOf(); // 获取真实世界的时间戳 timestamp const playerData = await getPlayerData(entity.player.userKey); // 获取上次登录记录 // 如果数据不存在,说明时第一次进入游戏 if (playerData == undefined) { entity.joinTime = now entity.danger = 0; entity.time = 0; entity.titles = ['萌新指挥官'] entity.star = 0; entity.coin = 0; entity.items = []; entity.tasks = [[0, 0, 0], [], []];//比赛:「胜利/平局/失败」,已经完成了的任务,正在做任务[任务名,进度[0,0,0,0,0...]] entity.technology = { '陆': [], '海': [], '空': [], '综合': [], '碎片': [0, 0, 0, 0], };//碎片4项,综合,陆海空 entity.presents = { '签到活动': 0, '邀请新人活动': [], '礼包码': [], '兑币剩余次数': 10000, }; entity.heroes = []; entity.bag = { '部队': {}, '随机迁城': 3, '定点迁城': 1, '和平护盾': 5, '领土迁城': 5, }; world.say(`欢迎 ${entity.player.name} 第一次进入这个游戏。`); await getHelp(entity) await savePlayer(entity, a = 1) textDialog(entity, '新人引导', '你可以先去做你指挥官生涯中的第一个任务:第一个步兵(打开方式:右键点击功能/设置,点击任务即可)') textDialog(entity, '新人引导', '你如果还有什么问题的话,可以在下面的框里看看有没有什么问题') newPlayer(entity) var theUserKey = entity.player.url.searchParams.get('invite') if (!entity.player.boxId.includes('code')) { if (getPlayerData(theUserKey) != null) { try { var presents = await getPlayerData(theUserKey) presents = JSON.parse(presents.presents); if (presents.length < 10) { if (!presents['邀请新人活动'].includes(entity.player.name)) { presents['邀请新人活动'].push(entity.player.name) await db.sql`UPDATE player SET presents = ${JSON.stringify(presents)} WHERE userKey = ${theUserKey}`; world.querySelectorAll('player').forEach((e) => { if (e.player.userKey == theUserKey) { e.coin += 1000 e.presents['邀请新人活动'].push(entity.player.name) if (e.presents['邀请新人活动'].length >= 10) { e.coin += 2000; } } }) var otherCoin = 0; if (presents['邀请新人活动'].length >= 10) { otherCoin += 2000 } await db.sql`UPDATE player SET coin = ${await getPlayerData(theUserKey).coin + 1000 + otherCoin} WHERE userKey = ${theUserKey}`; entity.player.directMessage('检测到你是通过邀请链接过来的,获得了邀请礼包200军团币!') entity.coin += 200; savePlayer(entity) } } else { entity.player.directMessage('很抱歉!你进入邀请链接的人的链接人数已经达到10人了!这个分享链接无效~') } } catch (e) { } } } else { } } else { entity.joinTime = now updatePlayerJoin(entity.player.userKey, now); // 更新玩家进入游戏时间 entity.danger = playerData.danger entity.time = playerData.time//封号时间 entity.titles = JSON.parse(playerData.titles); entity.star = playerData.star; entity.coin = playerData.coin entity.tasks = JSON.parse(playerData.tasks); entity.presents = JSON.parse(playerData.presents) if (!entity.presents['兑币剩余次数']) { entity.presents['兑币剩余次数'] = 10000 } if (playerData.bag) { entity.bag = JSON.parse(playerData.bag) if (!entity.bag['领土迁城']) { entity.bag = { '部队': {}, '随机迁城': 3, '定点迁城': 1, '和平护盾': 5, '领土迁城': 5, } } } else { entity.bag = { '部队': {}, '随机迁城': 3, '定点迁城': 1, '和平护盾': 5, '领土迁城': 5, }; } if (!entity.tasks[0]) { entity.tasks.push([0, 0, 0], [], []) } if (!entity.tasks[2]) { entity.tasks.push([0]) } entity.items = JSON.parse(playerData.items); entity.technology = JSON.parse(playerData.technology) if (entity.technology.length <= 0) { entity.technology = { '陆': [], '海': [], '空': [], '综合': [], '碎片': [0, 0, 0, 0], } } entity.heroes = JSON.parse(playerData.heroes) const leaveDay = Math.floor(now / 1000 / 3600 / 24 - playerData.leaveDay) if (leaveDay > 0) { entity.player.directMessage('自动签到,详情见《签到活动》,签到天数+1,获得了100军团币') entity.presents['签到活动']++ entity.presents['兑币剩余次数'] = 10000 entity.coin += 100; if (entity.presents['签到活动'] == 3) { entity.items.push('【皮肤】突击步兵') entity.coin += 100 entity.player.directMessage('第三天登录任务完成!!!额外获得了100军团币和突击步兵!!!') } if (entity.presents['签到活动'] == 7) { entity.items.push('【皮肤】炮兵') entity.coin += 200 entity.player.directMessage('第七天登录任务完成!!!额外获得了200军团币和炮兵!!!') } if (entity.presents['签到活动'] == 14) { entity.items.push('【皮肤】虎式重型坦克') entity.coin += 400 entity.player.directMessage('第十四天登录任务完成!!!额外获得了400军团币和虎式重型坦克!!!') } if (entity.presents['签到活动'] == 21) { entity.items.push('【皮肤】T-34中型坦克') entity.coin += 800 entity.player.directMessage('第二十一天登录任务完成!!!额外获得了800军团币和T-34中型坦克!!!') } if (entity.presents['签到活动'] == 30) { entity.items.push('【皮肤】B-17轰炸机') entity.coin += 1000 entity.player.directMessage('第三十天登录任务完成!!!额外获得了1000军团币和B-17轰炸机!!!') } } if (leaveDay > 14) { entity.player.directMessage('老玩家回归福利!!!1500军团币') entity.coin += 1500 } savePlayer(entity) 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(); return; } } else { entity.danger = 0; } //entity.player.directMessage(`${ entity.player.name } 距离上次登录经过了 ${ leaveMs.toFixed(2) } 秒`); } var kdzz = entity.player.url.searchParams.get('kdzz') if (kdzz == entity.player.userKey) { if (!cqwdLBM.includes(entity.player.userKey)) { entity.coin += 1000 entity.player.directMessage('每日空岛邀请成功!军团币+1000') cqwdLBM.push(entity.player.userKey) } else { entity.player.directMessage('你已经领取过了!') } } else { } if (!entity.tasks[1].includes('第一个步兵')) { textDialog(entity, '新人引导', '检测到你没有完成第一个步兵的任务,请完成任务(造兵方法:右键点击回基地,左键下面的基地边缘造兵)(造兵完毕后左键点击兵,点击移动或者攻击,点击玻璃就行)(完成任务方法:右键点击功能/设置,点击任务)') } }); async function newPlayer(entity = new Box3Entity) { var result = await entity.player.dialog({ type: Box3DialogType.SELECT, title: '新人引导', content: 'hi~你是新人吧,有什么问题吗', options: ['怎么造兵?', '怎么玩???', '谢谢,没有问题'] }) if (!result || result == null) { return; } if (result.value == '怎么造兵?') { textDialog(entity, '新人引导', '右键(移动端B键)点击回基地,视角往下看,左键(移动端A键)下面的基地的边缘造兵即可') } if (result.value == '怎么玩???') { textDialog(entity, '新人引导', '说/help看看???') } } // 玩家离开游戏 world.onPlayerLeave(async ({ entity }) => { savePlayer(entity) }); global.dangerSet = dangerSet 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} `); } }