A library that contains all the utilities for creating a MapleStory server emulator
npm install @perion/perion@perion/perion  !Code coverageA library of Node.js modules that help bring MapleStory private server development to the npm ecosystem.
```
npm i --save @perion/perion
* Note this project is in early development, use with caution
* calc
A calculator library that implements standard MapleStory specific calculations such as damage, stat modifiers, experience, and levels.
`node
const calc = require('@perion/calc');
/* Example player stats object /
const playerStats = {base: {str: 4, ...}, hyper: {str: 1, ...}};
/* crypto.calc example /
const modifiedStats = calc.HyperStats(playerStats).applyAll().get();
/* Returns {str: 34, ...} /
`
* crypto
A cryptography library that exposes everything you need to encrypt/decrypt data for MapleStory.
`node
const crypto = require('@perion/crypto');
/* Example data /
const payload = Buffer.from([0x1]);
const sendIv = Buffer.from([0x0, 0x2, 0x3, 0x4]);
const recvIv = Buffer.from([0x4, 0x2, 0x1, 0x0]);
/* crypto.Shanda example /
const encrypted = crypto.Shanda.encrypt(payload);
const decrypted = crypto.Shanda.decrypt(payload);
/* Returns the input buffer with the payload encrypted/decrypted using Maple Custom Shanda /
/* crypto.AES example /
/**
* You must initialize the AES class with:
* - an IV (Initialization Vector)
* - a MapleStory version number
*
* The IV must have a length of 4
* As the server, you must send the IV for both send and recv to the client
*/
const sendAES = new crypto.AES(sendIv, 83);
const recvAES = new crypto.AES(recvIv, 83);
const encryptedOut = sendAES.transform(payload);
const decryptedIn = recvAES.transform(payload);
/* Returns the input buffer with the payload encrypted/decryped using Maple AES /
`
* net
A packet parser using method-chaining syntax for compact and efficient parsing/writing of packet structures.
`node
const net = require('@perion/net');
/* Example buffer /
const data = Buffer.from([1, 2]);
/* net.Packet.Parser example /
const packet = new net.Packet.Parser(data);
const fields = ['id', 'name', 'hp'];
const unpacked = packet.int().mapleascii().int().collect(fields);
/* Returns {id:
/* net.Packet.Writer example /
/* Initialize with length /
let packet = new net.Packet.Writer(5);
packet = packet.byte(0x0).int(9).buffer();
/* Returns the buffer with data /
`
* script
A generic scripting engine for NPCs, events, maps, etc.
* wz
A WZ library that can read and write to the WZ file format.
* Uses Google's recommended JS style guidelines, fully documented code including full JSDoc comments
* Modular packages, so use what you want
* Full test coverage, with a minimum coverage threshold of 90%
* Zero dependencies
* Networking protocol
* Damage calculations
* Event timers
* WZ and NX file format
* Generic MapleStory abstractions
* Multiple MapleStory versions
npm run lint
`
Test
`
npm run test
npm run lcov
`
Documentation
Click here for the code documentation!Contributing
For now, there are no contribution guidelines. I only ask that you follow the eslint` rules when contributing a pull request. Thanks!