mirror of
https://github.com/danbulant/flying-squid
synced 2026-07-06 11:40:46 +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)
|
- [API](#api)
|
||||||
- [Classes](#classes)
|
- [Classes](#classes)
|
||||||
- [Entity](#entity)
|
- [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)
|
- [MCServer](#mcserver)
|
||||||
- [Flying-squid.createMCServer(options)](#flying-squidcreatemcserveroptions)
|
- [Flying-squid.createMCServer(options)](#flying-squidcreatemcserveroptions)
|
||||||
- [Properties](#properties)
|
- [Properties](#properties)
|
||||||
|
|
@ -45,10 +55,6 @@
|
||||||
- [server.playNoteBlock(world, position, pitch)](#serverplaynoteblockworld-position-pitch)
|
- [server.playNoteBlock(world, position, pitch)](#serverplaynoteblockworld-position-pitch)
|
||||||
- [server.getNote(note)](#servergetnotenote)
|
- [server.getNote(note)](#servergetnotenote)
|
||||||
- [server.emitParticle(particle, world, position, opt)](#serveremitparticleparticle-world-position-opt)
|
- [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)
|
- [Low level methods](#low-level-methods)
|
||||||
- [server._writeAll(packetName, packetFields)](#server_writeallpacketname-packetfields)
|
- [server._writeAll(packetName, packetFields)](#server_writeallpacketname-packetfields)
|
||||||
- [server._writeArray(packetName, packetFields, playerArray)](#server_writearraypacketname-packetfields-playerarray)
|
- [server._writeArray(packetName, packetFields, playerArray)](#server_writearraypacketname-packetfields-playerarray)
|
||||||
|
|
@ -157,6 +163,42 @@
|
||||||
### Entity
|
### Entity
|
||||||
See [prismarine-entity](https://github.com/PrismarineJS/prismarine-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
|
## MCServer
|
||||||
|
|
||||||
### Flying-squid.createMCServer(options)
|
### 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)
|
- 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)
|
- 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
|
### Low level methods
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,8 @@ module.exports = {
|
||||||
Behavior:require("./lib/behavior"),
|
Behavior:require("./lib/behavior"),
|
||||||
Command:require("./lib/command"),
|
Command:require("./lib/command"),
|
||||||
version:require("./lib/version"),
|
version:require("./lib/version"),
|
||||||
generations:require("./lib/generations")
|
generations:require("./lib/generations"),
|
||||||
|
experience:require("./lib/experience")
|
||||||
};
|
};
|
||||||
|
|
||||||
function createMCServer(options) {
|
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.xp = 0;
|
||||||
player.displayXp = 0;
|
player.displayXp = 0;
|
||||||
player.xpLevel = 0;
|
player.xpLevel = 0;
|
||||||
|
|
@ -9,24 +11,24 @@ module.exports.player = function(player, serv) {
|
||||||
level: player.level,
|
level: player.level,
|
||||||
totalExperience: player.xp
|
totalExperience: player.xp
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
player.setXpLevel = (level) => {
|
player.setXpLevel = (level) => {
|
||||||
player.xpLevel = level;
|
player.xpLevel = level;
|
||||||
player.sendXp();
|
player.sendXp();
|
||||||
}
|
};
|
||||||
|
|
||||||
player.setDisplayXp = (num) => {
|
player.setDisplayXp = (num) => {
|
||||||
player.displayXp = Math.max(0, Math.min(1, player.displayXp));
|
player.displayXp = Math.max(0, Math.min(1, player.displayXp));
|
||||||
player.sendXp();
|
player.sendXp();
|
||||||
}
|
};
|
||||||
|
|
||||||
player.setXp = (xp, { setLevel=true, setDisplay=true, send=true }={}) => {
|
player.setXp = (xp, { setLevel=true, setDisplay=true, send=true }={}) => {
|
||||||
player.xp = xp;
|
player.xp = xp;
|
||||||
if (setLevel) player.level = serv.getXpLevel(xp);
|
if (setLevel) player.level = getXpLevel(xp);
|
||||||
if (setDisplay) player.displayXp = serv.distanceToXpLevel(xp);
|
if (setDisplay) player.displayXp = distanceToXpLevel(xp);
|
||||||
if (send) player.sendXp();
|
if (send) player.sendXp();
|
||||||
}
|
};
|
||||||
|
|
||||||
player.commands.add({
|
player.commands.add({
|
||||||
base: 'xp',
|
base: 'xp',
|
||||||
|
|
@ -46,61 +48,12 @@ module.exports.player = function(player, serv) {
|
||||||
user.setXp(user.xp + amt);
|
user.setXp(user.xp + amt);
|
||||||
player.chat('Gave ' + user.username + ' ' + amt + ' xp');
|
player.chat('Gave ' + user.username + ' ' + amt + ' xp');
|
||||||
} else {
|
} else {
|
||||||
var currLevel = serv.getXpLevel(player.xp);
|
var currLevel = getXpLevel(player.xp);
|
||||||
var baseCurrLevel = serv.getBaseXpFromLevel(currLevel);
|
var baseCurrLevel = getBaseXpFromLevel(currLevel);
|
||||||
var extraXp = player.xp - baseCurrLevel;
|
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');
|
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