Discord.js 等级系统
Discord.js Level System
我的 'problem' 更多的是我想添加的功能,我使用了这个指南:
https://anidiots.guide/coding-guides/sqlite-based-points-system
我稍微更改了代码以主要为您提供随机数量的 XP,我正在寻找编辑需要多少 XP 才能升级。
现在它是一个静态数量,升级需要 5000。我试图让它每次升级时额外增加5000升级所需的数量。
目前,它是这样工作的:
Level 1 to 2 = 5000 total XP needed
Level 2 to 3 = 10000 total xp needed
目前,每级之间升级所需的金额始终为5000。
这就是我希望它的工作方式:
Level 1 to 2 = 5000 total XP needed
Level 2 to 3 = 15000 total XP needed
2 级需要 5000,3 级需要 10000,依此类推(每次升级需要的数量增加 5000)
我花了 2 个小时的大部分时间尝试不同的事情,主要是查看完全超出我理解范围的代码。
我相信做这样的事情会奏效,但我不知道它是否正确
if (score.level == '1') {
nextLevel = 5000
}
if (score.level == '2' {
nextLevel = 10000
}
我非常怀疑这是正确的,否则我的消息事件会很长,因为我计划有 100 个级别
完整代码:
let score;
if (message.guild) {
score = bot.getScore.get(message.author.id, message.guild.id);
if (!score) {
score = {
id: `${message.guild.id}-${message.author.id}`,
user: message.author.id,
guild: message.guild.id,
points: 0,
level: 1,
};
}
const xpAdd = Math.floor(Math.random() * 10) + 50;
const curxp = score.points;
const curlvl = score.level;
const nxtLvl = score.level * 5000;
score.points = curxp + xpAdd;
if (nxtLvl <= score.points) {
score.level = curlvl + 1;
const lvlup = new MessageEmbed()
.setAuthor(
`Congrats ${message.author.username}`,
message.author.displayAvatarURL()
)
.setTitle('You have leveled up!')
.setThumbnail('https://i.imgur.com/lXeBiMs.png')
.setColor(color)
.addField('New Level', curlvl + 1);
message.channel.send(lvlup).then(msg => {
msg.delete({
timeout: 10000,
});
});
}
bot.setScore.run(score);
}
代码按原样工作正常,符合预期,但原样不是很好,因为从 30-31 级开始没有奖励,因为它与从 1 级获得相同数量的 XP -2
这里有一个小公式可以解决问题(如果我理解正确的话):
const nxtLvl = 5000 * (Math.pow(2, score.level) - 1);
升级需要满足以下 xp 要求:
1->2: 5000
2->3: 15000
3->4: 35000
4->5: 75000
5->6: 155000
尝试这样的事情:
const levels = [0, 5000, 15000, 30000, 50000, 75000];
....
nextLevel = levels[score.level];
编辑
@Dan 你是这个意思:
nextLevel = 5000 * Math.round( score.level * (score.level + 1) / 2 );
这是我正在使用的代码
但问题是我无法添加或删除 XP
我也是用 Scratch 做的,所以我很生气理解这个
let Discord;
let Database;
if (typeof window !== "undefined") {
Discord = DiscordJS;
Database = EasyDatabase;
} else {
Discord = require("discord.js");
Database = require("easy-json-database");
}
const delay = (ms) => new Promise((resolve) => setTimeout(() => resolve(), ms));
const s4d = {
Discord,
client: null,
tokenInvalid: false,
reply: null,
joiningMember: null,
database: new Database("./db.json"),
checkMessageExists() {
if (!s4d.client) throw new Error('You cannot perform message operations without a Discord.js client')
if (!s4d.client.readyTimestamp) throw new Error('You cannot perform message operations while the bot is not connected to the Discord API')
}
};
s4d.client = new s4d.Discord.Client({
fetchAllMembers: true
});
s4d.client.on('raw', async (packet) => {
if (['MESSAGE_REACTION_ADD', 'MESSAGE_REACTION_REMOVE'].includes(packet.t)) {
const guild = s4d.client.guilds.cache.get(packet.d.guild_id);
if (!guild) return;
const member = guild.members.cache.get(packet.d.user_id) || guild.members.fetch(d.user_id).catch(() => {});
if (!member) return;
const channel = s4d.client.channels.cache.get(packet.d.channel_id);
if (!channel) return;
const message = channel.messages.cache.get(packet.d.message_id) || await channel.messages.fetch(packet.d.message_id).catch(() => {});
if (!message) return;
s4d.client.emit(packet.t, guild, channel, message, member, packet.d.emoji.name);
}
});
var member_xp, member_level;
s4d.client.login('My Dumb Token').catch((e) => {
s4d.tokenInvalid = true;
s4d.tokenError = e;
});
s4d.client.on('message', async (s4dmessage) => {
if (!((s4dmessage.member).user.bot)) {
member_xp = s4d.database.get(String(('xp-' + String(s4dmessage.author.id))));
member_level = s4d.database.get(String(('level-' + String(s4dmessage.author.id))));
if (!member_xp) {
member_xp = 0;
} else if (!member_level) {
member_level = 0;
}
s4d.database.set(String(('xp-' + String(s4dmessage.author.id))), (member_xp + 1));
member_xp = member_xp + 1;
if (member_xp > 100) {
s4d.database.set(String(('level-' + String(s4dmessage.author.id))), (member_level + 1));
member_level = member_level + 1;
s4dmessage.channel.send(String((['Congratulations, ', s4dmessage.member, 'you jumped to level ', member_level, '!!'].join(''))));
}
if ((s4dmessage.content) == '-level') {
s4dmessage.channel.send(String(([s4dmessage.member, ', you are currently level: ', member_level].join(''))));
} else if ((s4dmessage.content) == '-xp') {
s4dmessage.channel.send(String(([s4dmessage.member, ', you need ', 100 - member_xp, ' to jump to level ', member_level + 1].join(''))));
}
}
});
s4d;
我的 'problem' 更多的是我想添加的功能,我使用了这个指南: https://anidiots.guide/coding-guides/sqlite-based-points-system 我稍微更改了代码以主要为您提供随机数量的 XP,我正在寻找编辑需要多少 XP 才能升级。
现在它是一个静态数量,升级需要 5000。我试图让它每次升级时额外增加5000升级所需的数量。
目前,它是这样工作的:
Level 1 to 2 = 5000 total XP needed
Level 2 to 3 = 10000 total xp needed
目前,每级之间升级所需的金额始终为5000。
这就是我希望它的工作方式:
Level 1 to 2 = 5000 total XP needed
Level 2 to 3 = 15000 total XP needed
2 级需要 5000,3 级需要 10000,依此类推(每次升级需要的数量增加 5000)
我花了 2 个小时的大部分时间尝试不同的事情,主要是查看完全超出我理解范围的代码。 我相信做这样的事情会奏效,但我不知道它是否正确
if (score.level == '1') {
nextLevel = 5000
}
if (score.level == '2' {
nextLevel = 10000
}
我非常怀疑这是正确的,否则我的消息事件会很长,因为我计划有 100 个级别
完整代码:
let score;
if (message.guild) {
score = bot.getScore.get(message.author.id, message.guild.id);
if (!score) {
score = {
id: `${message.guild.id}-${message.author.id}`,
user: message.author.id,
guild: message.guild.id,
points: 0,
level: 1,
};
}
const xpAdd = Math.floor(Math.random() * 10) + 50;
const curxp = score.points;
const curlvl = score.level;
const nxtLvl = score.level * 5000;
score.points = curxp + xpAdd;
if (nxtLvl <= score.points) {
score.level = curlvl + 1;
const lvlup = new MessageEmbed()
.setAuthor(
`Congrats ${message.author.username}`,
message.author.displayAvatarURL()
)
.setTitle('You have leveled up!')
.setThumbnail('https://i.imgur.com/lXeBiMs.png')
.setColor(color)
.addField('New Level', curlvl + 1);
message.channel.send(lvlup).then(msg => {
msg.delete({
timeout: 10000,
});
});
}
bot.setScore.run(score);
}
代码按原样工作正常,符合预期,但原样不是很好,因为从 30-31 级开始没有奖励,因为它与从 1 级获得相同数量的 XP -2
这里有一个小公式可以解决问题(如果我理解正确的话):
const nxtLvl = 5000 * (Math.pow(2, score.level) - 1);
升级需要满足以下 xp 要求:
1->2: 5000
2->3: 15000
3->4: 35000
4->5: 75000
5->6: 155000
尝试这样的事情:
const levels = [0, 5000, 15000, 30000, 50000, 75000];
....
nextLevel = levels[score.level];
编辑
@Dan 你是这个意思:
nextLevel = 5000 * Math.round( score.level * (score.level + 1) / 2 );
这是我正在使用的代码 但问题是我无法添加或删除 XP 我也是用 Scratch 做的,所以我很生气理解这个
let Discord;
let Database;
if (typeof window !== "undefined") {
Discord = DiscordJS;
Database = EasyDatabase;
} else {
Discord = require("discord.js");
Database = require("easy-json-database");
}
const delay = (ms) => new Promise((resolve) => setTimeout(() => resolve(), ms));
const s4d = {
Discord,
client: null,
tokenInvalid: false,
reply: null,
joiningMember: null,
database: new Database("./db.json"),
checkMessageExists() {
if (!s4d.client) throw new Error('You cannot perform message operations without a Discord.js client')
if (!s4d.client.readyTimestamp) throw new Error('You cannot perform message operations while the bot is not connected to the Discord API')
}
};
s4d.client = new s4d.Discord.Client({
fetchAllMembers: true
});
s4d.client.on('raw', async (packet) => {
if (['MESSAGE_REACTION_ADD', 'MESSAGE_REACTION_REMOVE'].includes(packet.t)) {
const guild = s4d.client.guilds.cache.get(packet.d.guild_id);
if (!guild) return;
const member = guild.members.cache.get(packet.d.user_id) || guild.members.fetch(d.user_id).catch(() => {});
if (!member) return;
const channel = s4d.client.channels.cache.get(packet.d.channel_id);
if (!channel) return;
const message = channel.messages.cache.get(packet.d.message_id) || await channel.messages.fetch(packet.d.message_id).catch(() => {});
if (!message) return;
s4d.client.emit(packet.t, guild, channel, message, member, packet.d.emoji.name);
}
});
var member_xp, member_level;
s4d.client.login('My Dumb Token').catch((e) => {
s4d.tokenInvalid = true;
s4d.tokenError = e;
});
s4d.client.on('message', async (s4dmessage) => {
if (!((s4dmessage.member).user.bot)) {
member_xp = s4d.database.get(String(('xp-' + String(s4dmessage.author.id))));
member_level = s4d.database.get(String(('level-' + String(s4dmessage.author.id))));
if (!member_xp) {
member_xp = 0;
} else if (!member_level) {
member_level = 0;
}
s4d.database.set(String(('xp-' + String(s4dmessage.author.id))), (member_xp + 1));
member_xp = member_xp + 1;
if (member_xp > 100) {
s4d.database.set(String(('level-' + String(s4dmessage.author.id))), (member_level + 1));
member_level = member_level + 1;
s4dmessage.channel.send(String((['Congratulations, ', s4dmessage.member, 'you jumped to level ', member_level, '!!'].join(''))));
}
if ((s4dmessage.content) == '-level') {
s4dmessage.channel.send(String(([s4dmessage.member, ', you are currently level: ', member_level].join(''))));
} else if ((s4dmessage.content) == '-xp') {
s4dmessage.channel.send(String(([s4dmessage.member, ', you need ', 100 - member_xp, ' to jump to level ', member_level + 1].join(''))));
}
}
});
s4d;