From ad7253d36deaab56002786841c1c11c019faa3e4 Mon Sep 17 00:00:00 2001 From: Romain Beaumont Date: Thu, 10 Dec 2015 01:47:57 +0100 Subject: [PATCH] put experience pure functions in a lib and adapt the doc --- doc/API.md | 71 ++++++++++++++++++++++------------ src/index.js | 3 +- src/lib/experience.js | 48 +++++++++++++++++++++++ src/lib/plugins/experience.js | 73 +++++++---------------------------- 4 files changed, 109 insertions(+), 86 deletions(-) create mode 100644 src/lib/experience.js diff --git a/doc/API.md b/doc/API.md index 7ad598e..ea64af8 100644 --- a/doc/API.md +++ b/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 diff --git a/src/index.js b/src/index.js index be1cf38..5a676d6 100644 --- a/src/index.js +++ b/src/index.js @@ -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) { diff --git a/src/lib/experience.js b/src/lib/experience.js new file mode 100644 index 0000000..b06e492 --- /dev/null +++ b/src/lib/experience.js @@ -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; + } +} \ No newline at end of file diff --git a/src/lib/plugins/experience.js b/src/lib/plugins/experience.js index a1d60f3..eb7063f 100644 --- a/src/lib/plugins/experience.js +++ b/src/lib/plugins/experience.js @@ -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; - } - } -} \ No newline at end of file +}; \ No newline at end of file