mirror of
https://github.com/danbulant/flying-squid
synced 2026-06-17 05:21:22 +00:00
put experience pure functions in a lib and adapt the doc
This commit is contained in:
parent
865327b482
commit
ad7253d36d
4 changed files with 109 additions and 86 deletions
71
doc/API.md
71
doc/API.md
|
|
@ -5,6 +5,16 @@
|
|||
- [API](#api)
|
||||
- [Classes](#classes)
|
||||
- [Entity](#entity)
|
||||
- [flying-squid.Command](#flying-squidcommand)
|
||||
- [flying-squid.Behavior](#flying-squidbehavior)
|
||||
- [Libs](#libs)
|
||||
- [flying-squid.generations](#flying-squidgenerations)
|
||||
- [flying-squid.version](#flying-squidversion)
|
||||
- [flying-squid.experience](#flying-squidexperience)
|
||||
- [getXpLevel(xp)](#getxplevelxp)
|
||||
- [getXpRequired(level, toLevel=level+1)](#getxprequiredlevel-tolevellevel1)
|
||||
- [getBaseXpFromLevel(level)](#getbasexpfromlevellevel)
|
||||
- [distanceToXpLevel(xp, toLevel=startLevel+1, startLevel=xp level)](#distancetoxplevelxp-tolevelstartlevel1-startlevelxp-level)
|
||||
- [MCServer](#mcserver)
|
||||
- [Flying-squid.createMCServer(options)](#flying-squidcreatemcserveroptions)
|
||||
- [Properties](#properties)
|
||||
|
|
@ -45,10 +55,6 @@
|
|||
- [server.playNoteBlock(world, position, pitch)](#serverplaynoteblockworld-position-pitch)
|
||||
- [server.getNote(note)](#servergetnotenote)
|
||||
- [server.emitParticle(particle, world, position, opt)](#serveremitparticleparticle-world-position-opt)
|
||||
- [serv.getXpLevel(xp)](#servgetxplevelxp)
|
||||
- [serv.getXpRequired(level, toLevel=level+1)](#servgetxprequiredlevel-tolevellevel1)
|
||||
- [serv.getBaseXpFromLevel(level)](#servgetbasexpfromlevellevel)
|
||||
- [serv.distanceToXpLevel(xp, toLevel=startLevel+1, startLevel=xp level)](#servdistancetoxplevelxp-tolevelstartlevel1-startlevelxp-level)
|
||||
- [Low level methods](#low-level-methods)
|
||||
- [server._writeAll(packetName, packetFields)](#server_writeallpacketname-packetfields)
|
||||
- [server._writeArray(packetName, packetFields, playerArray)](#server_writearraypacketname-packetfields-playerarray)
|
||||
|
|
@ -157,6 +163,42 @@
|
|||
### Entity
|
||||
See [prismarine-entity](https://github.com/PrismarineJS/prismarine-entity)
|
||||
|
||||
### flying-squid.Command
|
||||
|
||||
### flying-squid.Behavior
|
||||
|
||||
### Libs
|
||||
|
||||
Collections of pure functions
|
||||
|
||||
### flying-squid.generations
|
||||
|
||||
### flying-squid.version
|
||||
|
||||
### flying-squid.experience
|
||||
|
||||
#### getXpLevel(xp)
|
||||
|
||||
Get level given XP amount
|
||||
|
||||
#### getXpRequired(level, toLevel=level+1)
|
||||
|
||||
Get's the amount of xp required to get from level to toLevel (or level to level+1)
|
||||
|
||||
#### getBaseXpFromLevel(level)
|
||||
|
||||
Gets the minimum amount of xp required to be at that level (or "base xp" for that level)
|
||||
|
||||
#### distanceToXpLevel(xp, toLevel=startLevel+1, startLevel=xp level)
|
||||
|
||||
Gets a number between 0 and 1 (used in player.displayXp as the green bar at the bottom) that is the progress of xp between startLevel and toLevel.
|
||||
|
||||
By default, startLevel will be the xp's lowest possible level: getXpLevel(xp)
|
||||
|
||||
By default, toLevel is startLevel + 1.
|
||||
|
||||
This means when startLevel and toLevel are at their defaults, this function returns the progress to the next level of XP (from 0.0 to 1.0)
|
||||
|
||||
## MCServer
|
||||
|
||||
### Flying-squid.createMCServer(options)
|
||||
|
|
@ -365,27 +407,6 @@ Opt:
|
|||
- size: vec3 of the size. (0,0,0) will be at an exact position, (10,10,10) will be very spread out (particles less dense)
|
||||
- count: Number of particles. 100,000,000+ will crash the client. Try not to go over 100,000 (sincerely, minecraft clients)
|
||||
|
||||
#### serv.getXpLevel(xp)
|
||||
|
||||
Get level given XP amount
|
||||
|
||||
#### serv.getXpRequired(level, toLevel=level+1)
|
||||
|
||||
Get's the amount of xp required to get from level to toLevel (or level to level+1)
|
||||
|
||||
#### serv.getBaseXpFromLevel(level)
|
||||
|
||||
Gets the minimum amount of xp required to be at that level (or "base xp" for that level)
|
||||
|
||||
#### serv.distanceToXpLevel(xp, toLevel=startLevel+1, startLevel=xp level)
|
||||
|
||||
Gets a number between 0 and 1 (used in player.displayXp as the green bar at the bottom) that is the progress of xp between startLevel and toLevel.
|
||||
|
||||
By default, startLevel will be the xp's lowest possible level: serv.getXpLevel(xp)
|
||||
|
||||
By default, toLevel is startLevel + 1.
|
||||
|
||||
This means when startLevel and toLevel are at their defaults, this function returns the progress to the next level of XP (from 0.0 to 1.0)
|
||||
|
||||
### Low level methods
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ module.exports = {
|
|||
Behavior:require("./lib/behavior"),
|
||||
Command:require("./lib/command"),
|
||||
version:require("./lib/version"),
|
||||
generations:require("./lib/generations")
|
||||
generations:require("./lib/generations"),
|
||||
experience:require("./lib/experience")
|
||||
};
|
||||
|
||||
function createMCServer(options) {
|
||||
|
|
|
|||
48
src/lib/experience.js
Normal file
48
src/lib/experience.js
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
module.exports={distanceToXpLevel,getXpLevel,getXpRequired,getBaseXpFromLevel};
|
||||
|
||||
function distanceToXpLevel(xp, toLevel) {
|
||||
var level = getXpLevel(xp);
|
||||
if (!toLevel) toLevel = level+1;
|
||||
var levelBaseXp = getBaseXpFromLevel(level);
|
||||
var requiredXp = getXpRequired(level, toLevel);
|
||||
return (xp - levelBaseXp) / requiredXp;
|
||||
}
|
||||
|
||||
function getXpLevel(xp) {
|
||||
// I have to use quadratic equation to reverse the equation from getBaseXpFromLevel(). Ugh.
|
||||
var a;
|
||||
var b;
|
||||
var c;
|
||||
if (xp < 352) { // 352 == Experience at level 16
|
||||
a = 1;
|
||||
b = 6;
|
||||
c = 0;
|
||||
} else if (xp < 1507) { // 1507 == Experience at level 31
|
||||
a = 2.5;
|
||||
b = -40.5;
|
||||
c = 360;
|
||||
} else { // Level 32+
|
||||
a = 4.5;
|
||||
b = -162.5;
|
||||
c = 2220;
|
||||
}
|
||||
c -= xp;
|
||||
return Math.floor((-b + Math.sqrt(b*b - 4*a*c)) / (2 * a)); // Math class was useful I guess mmph
|
||||
}
|
||||
|
||||
function getXpRequired(level, toLevel) {
|
||||
if (!toLevel) toLevel = level + 1;
|
||||
return getBaseXpFromLevel(toLevel) - getBaseXpFromLevel(level);
|
||||
}
|
||||
|
||||
function getBaseXpFromLevel(level){
|
||||
// The equations in this function are stupid and directly from the MC Wiki
|
||||
// http://minecraft.gamepedia.com/Experience#Leveling_up
|
||||
if (level <= 16) {
|
||||
return level*level + 6*level;
|
||||
} else if (level <= 31) {
|
||||
return 2.5*level*level - 40.5*level + 360;
|
||||
} else { // 32+
|
||||
return 4.5*level*level - 162.5*level + 2220;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,6 @@
|
|||
module.exports.player = function(player, serv) {
|
||||
var {distanceToXpLevel,getXpLevel,getBaseXpFromLevel}=require("flying-squid").experience;
|
||||
|
||||
module.exports.player = function(player) {
|
||||
player.xp = 0;
|
||||
player.displayXp = 0;
|
||||
player.xpLevel = 0;
|
||||
|
|
@ -9,24 +11,24 @@ module.exports.player = function(player, serv) {
|
|||
level: player.level,
|
||||
totalExperience: player.xp
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
player.setXpLevel = (level) => {
|
||||
player.xpLevel = level;
|
||||
player.sendXp();
|
||||
}
|
||||
};
|
||||
|
||||
player.setDisplayXp = (num) => {
|
||||
player.displayXp = Math.max(0, Math.min(1, player.displayXp));
|
||||
player.sendXp();
|
||||
}
|
||||
};
|
||||
|
||||
player.setXp = (xp, { setLevel=true, setDisplay=true, send=true }={}) => {
|
||||
player.xp = xp;
|
||||
if (setLevel) player.level = serv.getXpLevel(xp);
|
||||
if (setDisplay) player.displayXp = serv.distanceToXpLevel(xp);
|
||||
if (setLevel) player.level = getXpLevel(xp);
|
||||
if (setDisplay) player.displayXp = distanceToXpLevel(xp);
|
||||
if (send) player.sendXp();
|
||||
}
|
||||
};
|
||||
|
||||
player.commands.add({
|
||||
base: 'xp',
|
||||
|
|
@ -46,61 +48,12 @@ module.exports.player = function(player, serv) {
|
|||
user.setXp(user.xp + amt);
|
||||
player.chat('Gave ' + user.username + ' ' + amt + ' xp');
|
||||
} else {
|
||||
var currLevel = serv.getXpLevel(player.xp);
|
||||
var baseCurrLevel = serv.getBaseXpFromLevel(currLevel);
|
||||
var currLevel = getXpLevel(player.xp);
|
||||
var baseCurrLevel = getBaseXpFromLevel(currLevel);
|
||||
var extraXp = player.xp - baseCurrLevel;
|
||||
user.setXp(serv.getBaseXpFromLevel(currLevel + amt) + extraXp);
|
||||
user.setXp(getBaseXpFromLevel(currLevel + amt) + extraXp);
|
||||
player.chat('Gave ' + user.username + ' ' + amt + ' levels');
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
module.exports.server = function(serv) {
|
||||
serv.distanceToXpLevel = (xp, toLevel) => {
|
||||
var level = serv.getXpLevel(xp);
|
||||
if (!toLevel) toLevel = level+1;
|
||||
var levelBaseXp = serv.getBaseXpFromLevel(level);
|
||||
var requiredXp = serv.getXpRequired(level, toLevel);
|
||||
return (xp - levelBaseXp) / requiredXp;
|
||||
}
|
||||
|
||||
serv.getXpLevel = (xp) => {
|
||||
// I have to use quadratic equation to reverse the equation from serv.getBaseXpFromLevel(). Ugh.
|
||||
var a;
|
||||
var b;
|
||||
var c;
|
||||
if (xp < 352) { // 352 == Experience at level 16
|
||||
a = 1;
|
||||
b = 6;
|
||||
c = 0;
|
||||
} else if (xp < 1507) { // 1507 == Experience at level 31
|
||||
a = 2.5;
|
||||
b = -40.5;
|
||||
c = 360;
|
||||
} else { // Level 32+
|
||||
a = 4.5;
|
||||
b = -162.5;
|
||||
c = 2220;
|
||||
}
|
||||
c -= xp;
|
||||
return Math.floor((-b + Math.sqrt(b*b - 4*a*c)) / (2 * a)); // Math class was useful I guess mmph
|
||||
}
|
||||
|
||||
serv.getXpRequired = (level, toLevel) => {
|
||||
if (!toLevel) toLevel = level + 1;
|
||||
return serv.getBaseXpFromLevel(toLevel) - serv.getBaseXpFromLevel(level);
|
||||
}
|
||||
|
||||
serv.getBaseXpFromLevel = (level) => {
|
||||
// The equations in this function are stupid and directly from the MC Wiki
|
||||
// http://minecraft.gamepedia.com/Experience#Leveling_up
|
||||
if (level <= 16) {
|
||||
return level*level + 6*level;
|
||||
} else if (level <= 31) {
|
||||
return 2.5*level*level - 40.5*level + 360;
|
||||
} else { // 32+
|
||||
return 4.5*level*level - 162.5*level + 2220;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
Loading…
Reference in a new issue