Ver código fonte

Merge branch 'v0.1.6.1' into 'v0.1.7'

V0.1.6.1

See merge request Isleward/isleward!214
tags/v0.1.7^2
Big Bad Waffle 6 anos atrás
pai
commit
c2f5a89724
53 arquivos alterados com 821 adições e 93 exclusões
  1. +1
    -1
      src/client/css/main.less
  2. +6
    -0
      src/client/js/components/keyboardMover.js
  3. +15
    -9
      src/client/js/components/pather.js
  4. +2
    -2
      src/client/ui/factory.js
  5. +13
    -0
      src/client/ui/templates/inventory/inventory.js
  6. +13
    -1
      src/client/ui/templates/login/styles.less
  7. +1
    -0
      src/client/ui/templates/login/template.html
  8. +102
    -0
      src/client/ui/templates/mail/mail.js
  9. +113
    -0
      src/client/ui/templates/mail/styles.less
  10. +17
    -0
      src/client/ui/templates/mail/template.html
  11. +5
    -0
      src/client/ui/templates/options/options.js
  12. +1
    -0
      src/client/ui/templates/options/template.html
  13. +1
    -1
      src/server/components/components.js
  14. +3
    -4
      src/server/components/dialogue.js
  15. +49
    -19
      src/server/components/inventory.js
  16. +1
    -1
      src/server/components/reputation.js
  17. +2
    -0
      src/server/components/stats.js
  18. +2
    -2
      src/server/components/trade.js
  19. +1
    -1
      src/server/config/classes.js
  20. +3
    -3
      src/server/config/loginRewards.js
  21. +2
    -0
      src/server/config/maps/cave/dialogues.js
  22. +10
    -6
      src/server/config/maps/tutorial/events/fishingTournament.js
  23. +1
    -1
      src/server/config/spells.js
  24. +1
    -1
      src/server/config/spellsConfig.js
  25. +1
    -1
      src/server/items/config/types.js
  26. +7
    -2
      src/server/items/enchanter.js
  27. +9
    -9
      src/server/items/generator.js
  28. +2
    -2
      src/server/items/generators/names.js
  29. +1
    -1
      src/server/items/generators/slots.js
  30. +2
    -2
      src/server/items/generators/spellbook.js
  31. +1
    -1
      src/server/items/generators/stats.js
  32. +2
    -2
      src/server/items/generators/types.js
  33. +1
    -1
      src/server/leaderboard/leaderboard.js
  34. +10
    -0
      src/server/misc/mail.js
  35. +2
    -2
      src/server/misc/mods.js
  36. +1
    -1
      src/server/mods/class-necromancer/index.js
  37. +1
    -1
      src/server/objects/objBase.js
  38. +2
    -2
      src/server/objects/objects.js
  39. +2
    -4
      src/server/security/connections.js
  40. +1
    -1
      src/server/security/router.js
  41. +18
    -3
      src/server/world/atlas.js
  42. +2
    -0
      src/server/world/instancer.js
  43. +4
    -2
      src/server/world/mobBuilder.js
  44. +23
    -4
      src/server/world/worker.js
  45. +8
    -0
      tests/index.js
  46. +18
    -0
      tests/package-lock.json
  47. +10
    -0
      tests/package.json
  48. +56
    -0
      tests/server/components/dialogue.js
  49. +48
    -0
      tests/server/components/inventory.js
  50. +121
    -0
      tests/server/components/reputation.js
  51. +39
    -0
      tests/server/mocks/generator.js
  52. +9
    -0
      tests/server/world/mobBuilder.js
  53. +55
    -0
      tests/tests.js

+ 1
- 1
src/client/css/main.less Ver arquivo

@@ -73,4 +73,4 @@ body {
-webkit-border-radius: 10px;
border-radius: 0px;
background: @lightGray;
}
}

+ 6
- 0
src/client/js/components/keyboardMover.js Ver arquivo

@@ -18,6 +18,9 @@ define([
},

update: function() {
if (this.obj.moveAnimation)
this.obj.pather.clearPath();

if (input.isKeyDown('esc')) {
client.request({
cpn: 'player',
@@ -72,6 +75,9 @@ define([
this.addQueue(newX, newY);
},
addQueue: function(x, y) {
if (this.obj.moveAnimation)
return;

this.obj.dirty = true;

this.obj.pather.add(x, y);


+ 15
- 9
src/client/js/components/pather.js Ver arquivo

@@ -7,6 +7,7 @@ define([
) {
var scale = 40;
var scaleMult = 5;
var round = Math.round.bind(Math);

return {
type: 'pather',
@@ -28,11 +29,11 @@ define([
events.on('onDeath', this.onDeath.bind(this));
events.on('onClearQueue', this.onDeath.bind(this));

this.pathPos.x = this.obj.x;
this.pathPos.y = this.obj.y;
this.pathPos.x = round(this.obj.x);
this.pathPos.y = round(this.obj.y);
},

onDeath: function() {
clearPath: function() {
this.path.forEach(function(p) {
renderer.destroyObject({
layerName: 'effects',
@@ -41,8 +42,13 @@ define([
});

this.path = [];
this.pathPos.x = this.obj.x;
this.pathPos.y = this.obj.y;
},

onDeath: function() {
this.clearPath();
this.pathPos.x = round(this.obj.x);
this.pathPos.y = round(this.obj.y);
},

add: function(x, y) {
@@ -66,8 +72,8 @@ define([
var y = this.obj.y;

if (this.path.length == 0) {
this.pathPos.x = x;
this.pathPos.y = y;
this.pathPos.x = round(x);
this.pathPos.y = round(y);
}

if ((x == this.lastX) && (y == this.lastY))
@@ -95,8 +101,8 @@ define([
setPath: function(path) {
this.path = this.path.concat(path);

this.pathPos.x = path[path.length - 1].x;
this.pathPos.y = path[path.length - 1].y;
this.pathPos.x = round(path[path.length - 1].x);
this.pathPos.y = round(path[path.length - 1].y);
}
};
});

+ 2
- 2
src/client/ui/factory.js Ver arquivo

@@ -33,7 +33,6 @@ define([
'help',
'dialogue',
'buffs',
'partyLoot',
'tooltips',
'tooltipInfo',
'tooltipItem',
@@ -48,7 +47,8 @@ define([
'overlay',
'death',
'leaderboard',
'reputation'
'reputation',
'mail'
].forEach(function(u) {
this.build(u);
}, this);


+ 13
- 0
src/client/ui/templates/inventory/inventory.js Ver arquivo

@@ -281,6 +281,10 @@ define([
text: 'augment',
callback: this.openAugmentUi.bind(this, item)
},
mail: {
text: 'mail',
callback: this.openMailUi.bind(this, item)
},
divider: '----------'
};

@@ -320,6 +324,9 @@ define([
config.push(menuItems.destroy);
}

if ((!item.noDrop) && (!item.quest) && (!item.noSalvage))
config.push(menuItems.mail);

if (config.length > 0)
events.emit('onContextMenu', config, e);

@@ -459,6 +466,12 @@ define([
});
},

openMailUi: function(item) {
events.emit('onSetMailItem', {
item: item
});
},

onKeyDown: function(key) {
if (key == 'i')
this.toggle();


+ 13
- 1
src/client/ui/templates/login/styles.less Ver arquivo

@@ -29,7 +29,6 @@

.right {
height: @boxHeight;
float: left;
background-color: #3a3b4a;

width: @rightWidth;
@@ -110,6 +109,19 @@
}
}

.news {
margin-top: 40px;
color: @white;
width: 400px;
text-align: center;

filter:
drop-shadow(0px -4px 0px @blackD)
drop-shadow(0px 4px 0px @blackD)
drop-shadow(4px 0px 0px @blackD)
drop-shadow(-4px 0px 0px @blackD);
}

.spacer-h {
height: 61px;
}


+ 1
- 0
src/client/ui/templates/login/template.html Ver arquivo

@@ -11,6 +11,7 @@
</div>
<div class="message"></div>
</div>
<div class="news">[ Fishing Tournament every day at 7PM GMT ]</div>
<div class="extra">
<div class="el button btnPatreon" location="http://patreon.com/bigbadwaffle">Pledge on Patreon</div>
<div class="el button btnPaypal" location="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=BR2CC82WUAVEA">Donate on Paypal</div>


+ 102
- 0
src/client/ui/templates/mail/mail.js Ver arquivo

@@ -0,0 +1,102 @@
define([
'js/system/events',
'js/system/client',
'html!ui/templates/mail/template',
'css!ui/templates/mail/styles'
], function(
events,
client,
template,
styles
) {
return {
tpl: template,

centered: true,

modal: true,

item: null,

postRender: function() {
this.onEvent('onSetMailItem', this.onSetItem.bind(this));

this.find('.btnSend').on('click', this.onSendClick.bind(this));
},

onSendClick: function() {
if (!this.item)
return;

var recipient = this.find('.txtRecipient').val();
if (recipient.length == 0)
return;

client.request({
cpn: 'player',
method: 'performAction',
data: {
cpn: 'inventory',
method: 'mailItem',
data: {
itemId: this.item.id,
recipient: recipient
}
},
callback: this.onSend.bind(this)
});
},
onSend: function(res) {
if (res.length > 0) {
events.emit('onGetAnnouncement', {
msg: res,
type: 'failure'
});

return;
}

this.hide();
},

onSetItem: function(msg) {
this.toggle();
this.item = msg.item;

var item = msg.item;

var imgX = -item.sprite[0] * 64;
var imgY = -item.sprite[1] * 64;

var spritesheet = item.spritesheet || '../../../images/items.png';
if (item.material)
spritesheet = '../../../images/materials.png';
else if (item.quest)
spritesheet = '../../../images/questItems.png';

var el = this.find('.item');

el
.data('item', item)
/*.on('mousemove', this.onHover.bind(this, el, item))
.on('mouseleave', this.hideTooltip.bind(this, el, item))*/
.find('.icon')
.css('background', 'url(' + spritesheet + ') ' + imgX + 'px ' + imgY + 'px');


if (item.quantity) {
var quantityText = item.quantity;
el.find('.quantity').html(item.quantity);
}
},

toggle: function() {
this.shown = !this.el.is(':visible');

if (this.shown) {
this.show();
} else
this.hide();
}
}
});

+ 113
- 0
src/client/ui/templates/mail/styles.less Ver arquivo

@@ -0,0 +1,113 @@
@import "../../../css/ui.less";

.uiMail {
display: none;

background-color: @blackB;
border: 5px solid #c0c3cf;
padding: 10px;

.top {
margin-bottom: 10px;

.heading {
color: @orange;
text-align: center;
}
}

.bottom {
.col {
float: left;
width: 80px;
height: 80px;

&:nth-child(2) {
width: 200px;
padding-top: 4px;

> * {
width: 100%;
height: 31px;
}

.btnSend {
height: 35px;
background-color: @blueB;
text-align: center;
padding-top: 12px;
color: @white;
}

input, input:-webkit-autofill {
box-shadow: 0 0 0px 1000px darken(@blackB, 15%) inset;
color: @white;
-webkit-text-fill-color: @white;
margin-bottom: 5px;
text-align: center;
}

/* We duplicate this for firefox which doesn't like the webkit selector */
input {
box-shadow: 0 0 0px 1000px darken(@blackB, 15%) inset;
color: @white;
-webkit-text-fill-color: @white;
margin-bottom: 5px;
text-align: center;
}
}

.item {
width: 100%;
height: 100%;
float: left;
position: relative;
cursor: pointer;
box-sizing: border-box;

.quantity {
left: 6px;
bottom: 3px;
position: absolute;
color: @white;
filter:
drop-shadow(0px -2px 0px @blackD)
drop-shadow(0px 2px 0px @blackD)
drop-shadow(2px 0px 0px @blackD)
drop-shadow(-2px 0px 0px @blackD);

-moz-filter:
drop-shadow(0px -2px 0px @blackD)
drop-shadow(0px 2px 0px @blackD)
drop-shadow(2px 0px 0px @blackD)
drop-shadow(-2px 0px 0px @blackD);

&.red {
color: @red;
}
}

.icon {
width: 64px;
height: 64px;
position: absolute;
left: 8px;
top: 8px;
filter:
brightness(100%)
drop-shadow(0px -4px 0px @blackD)
drop-shadow(0px 4px 0px @blackD)
drop-shadow(4px 0px 0px @blackD)
drop-shadow(-4px 0px 0px @blackD);

-moz-filter:
brightness(100%)
drop-shadow(0px -4px 0px @blackD)
drop-shadow(0px 4px 0px @blackD)
drop-shadow(4px 0px 0px @blackD)
drop-shadow(-4px 0px 0px @blackD);
}
}
}
}
}

+ 17
- 0
src/client/ui/templates/mail/template.html Ver arquivo

@@ -0,0 +1,17 @@
<div class="uiMail">
<div class="top">
<div class="heading">mail item</div>
</div>
<div class="bottom">
<div class="col">
<div class="item">
<div class="icon"></div>
<div class="quantity"></div>
</div>
</div>
<div class="col">
<input class="txtRecipient textbox" type="text" placeholder="recipient">
<div class="btnSend">send</div>
</div>
</div>
</div>

+ 5
- 0
src/client/ui/templates/options/options.js Ver arquivo

@@ -29,10 +29,15 @@ define([
this.el.find('.btnCharSelect').on('click', this.charSelect.bind(this));
this.el.find('.btnLogOut').on('click', this.logOut.bind(this));
this.el.find('.btnContinue').on('click', this.toggle.bind(this));
this.el.find('.btnPatreon').on('click', this.patreon.bind(this));

this.onEvent('onResize', this.onResize.bind(this));
},

patreon: function() {
window.open('http://patreon.com/bigbadwaffle', '_blank');
},

charSelect: function() {
client.request({
module: 'cons',


+ 1
- 0
src/client/ui/templates/options/template.html Ver arquivo

@@ -3,4 +3,5 @@
<div class="btn btnScreen">Windowed</div>
<div class="btn btnCharSelect">Character Select</div>
<div class="btn btnLogOut">Log Out</div>
<div class="btn btnPatreon">Pledge on Patreon</div>
</div>

+ 1
- 1
src/server/components/components.js Ver arquivo

@@ -1,5 +1,5 @@
define([
'misc/fileLister'
'../misc/fileLister'
], function(
fileLister
) {


+ 3
- 4
src/server/components/dialogue.js Ver arquivo

@@ -22,9 +22,8 @@ define([

talk: function(msg) {
var target = msg.target;
var targetName = (msg.targetName || '').toLowerCase();

if ((target == null) && (!targetName))
if ((target == null) && (!msg.targetName))
return false;

if ((target != null) && (target.id == null)) {
@@ -32,8 +31,8 @@ define([
if (!target)
return false;
}
else if (targetName != null) {
target = this.obj.instance.objects.objects.find(o => ((o.name) && (o.name.toLowerCase() == targetName)));
else if (msg.targetName != null) {
target = this.obj.instance.objects.objects.find(o => ((o.name) && (o.name.toLowerCase() == msg.targetName.toLowerCase())));
if (!target)
return false;
}


+ 49
- 19
src/server/components/inventory.js Ver arquivo

@@ -1,9 +1,9 @@
define([
'items/generator',
'items/salvager',
'items/enchanter',
'objects/objects',
'config/classes'
'../items/generator',
'../items/salvager',
'../items/enchanter',
'../objects/objects',
'../config/classes'
], function(
generator,
salvager,
@@ -296,6 +296,35 @@ define([
}, this);
},

mailItem: function(msg) {
var item = this.findItem(msg.itemId);
if (!item) {
this.resolveCallback(msg);
return;
}

delete item.pos;

var io = require('security/io');
io.get({
ent: msg.recipient,
field: 'character',
callback: this.onCheckCharExists.bind(this, msg, item)
});
},
onCheckCharExists: function(msg, item, res) {
if (!res) {
this.resolveCallback(msg, 'Recipient does not exist');
return;
}

this.obj.instance.mail.sendMail(msg.recipient, [ extend(true, {}, item) ]);

this.destroyItem(item.id);

this.resolveCallback(msg);
},

//Helpers

resolveCallback: function(msg, result) {
@@ -442,19 +471,20 @@ define([
var items = this.items;
var iLen = items.length;

var nonEqItems = items.filter(f => !f.eq).length;

if ((nonEqItems >= this.inventorySize) && (!hideMessage)) {
this.obj.instance.syncer.queue('onGetMessages', {
id: this.obj.id,
messages: [{
class: 'q0',
message: 'you bags are too full to loot any more items',
type: 'info'
}]
}, [this.obj.serverId]);

return false;
if (this.inventorySize != -1) {
var nonEqItems = items.filter(f => !f.eq).length;
if ((nonEqItems >= this.inventorySize) && (!hideMessage)) {
this.obj.instance.syncer.queue('onGetMessages', {
id: this.obj.id,
messages: [{
class: 'q0',
message: 'you bags are too full to loot any more items',
type: 'info'
}]
}, [this.obj.serverId]);

return false;
}
}

for (var i = 0; i < iLen; i++) {
@@ -486,7 +516,7 @@ define([
var msg = item.name;
if (quantity)
msg += ' x' + quantity;
else if ((item.stats) && (item.stats.weight))
else if ((item.stats) && (item.stats.weight))
msg += ` ${item.stats.weight}lb`;
messages.push({
class: 'q' + item.quality,


+ 1
- 1
src/server/components/reputation.js Ver arquivo

@@ -1,5 +1,5 @@
define([
'config/factionBase'
'../config/factionBase'
], function(
factionBase
) {


+ 2
- 0
src/server/components/stats.js Ver arquivo

@@ -548,6 +548,8 @@ define([
var rewards = loginRewards.generate(stats.loginStreak);
mail.sendMail(this.obj.name, rewards);
}
else
this.obj.instance.mail.getMail(this.obj.name);

stats.lastLogin = time;
}


+ 2
- 2
src/server/components/trade.js Ver arquivo

@@ -1,6 +1,6 @@
define([
'items/generator',
'items/generators/stats'
'../items/generator',
'../items/generators/stats'
], function(
generator,
statGenerator


+ 1
- 1
src/server/config/classes.js Ver arquivo

@@ -1,5 +1,5 @@
define([
'misc/events'
'../misc/events'
], function(
events
) {


+ 3
- 3
src/server/config/loginRewards.js Ver arquivo

@@ -24,13 +24,13 @@ define([
'2': [{
name: 'Rare Essence',
sprite: [0, 4]
}, {
name: 'Rare Essence',
sprite: [0, 4]
}],
'3': [{
name: 'Cerulean Pearl',
sprite: [11, 9]
}, {
name: 'Epic Essence',
sprite: [0, 5]
}],
'4': [{
name: 'Legendary Essence',


+ 2
- 0
src/server/config/maps/cave/dialogues.js Ver arquivo

@@ -227,6 +227,8 @@ module.exports = {
var inventory = obj.inventory;

var crystals = inventory.items.find(i => (i.name == 'Digested Crystal'));
if (!crystals)
return;
obj.reputation.getReputation('akarei', crystals.quantity * 15);

inventory.destroyItem(crystals.id);


+ 10
- 6
src/server/config/maps/tutorial/events/fishingTournament.js Ver arquivo

@@ -143,13 +143,17 @@ module.exports = {
var srcInventory = source.inventory;
var tgtInventory = target.inventory;

var fishies = srcInventory.items.filter(i => (i.name.indexOf('Ancient Carp') > -1));
fishies.forEach(function(f) {
f.owner = source.name;
srcInventory.items
.filter(i => (i.name.indexOf('Ancient Carp') > -1))
.sort((a, b) => (b.stats.weight - a.stats.weight))
.forEach(function(f, i) {
if (i == 0) {
f.owner = source.name;
tgtInventory.getItem(extend(true, {}, f));
}

srcInventory.destroyItem(f.id);
tgtInventory.getItem(f);
});
srcInventory.destroyItem(f.id);
});
},

getRank: function(event, playerName) {


+ 1
- 1
src/server/config/spells.js Ver arquivo

@@ -1,5 +1,5 @@
define([
'misc/events'
'../misc/events'
], function(
events
) {


+ 1
- 1
src/server/config/spellsConfig.js Ver arquivo

@@ -1,5 +1,5 @@
define([
'misc/events'
'../misc/events'
], function(
events
) {


+ 1
- 1
src/server/items/config/types.js Ver arquivo

@@ -1,5 +1,5 @@
define([
'misc/events'
'../../misc/events'
], function(
events
) {


+ 7
- 2
src/server/items/enchanter.js Ver arquivo

@@ -1,6 +1,6 @@
define([
'items/generators/stats',
'items/salvager'
'./generators/stats',
'./salvager'
], function(
generatorStats,
salvager
@@ -52,6 +52,11 @@ define([
item.stats[p] -= value;
if (item.stats[p] <= 0)
delete item.stats[p];

if (p == 'lvlRequire') {
item.level += value;
delete item.originalLevel;
}
}
}



+ 9
- 9
src/server/items/generator.js Ver arquivo

@@ -1,13 +1,13 @@
define([
'items/generators/level',
'items/generators/quality',
'items/generators/slots',
'items/generators/types',
'items/generators/stats',
'items/generators/names',
'items/generators/worth',
'items/generators/spellbook',
'items/salvager'
'./generators/level',
'./generators/quality',
'./generators/slots',
'./generators/types',
'./generators/stats',
'./generators/names',
'./generators/worth',
'./generators/spellbook',
'./salvager'
], function(
g1, g2, g3, g4, g5, g6, g7,
g8


+ 2
- 2
src/server/items/generators/names.js Ver arquivo

@@ -1,6 +1,6 @@
define([
'items/config/prefixes',
'items/config/suffixes'
'../config/prefixes',
'../config/suffixes'
], function(
prefixes,
suffixes


+ 1
- 1
src/server/items/generators/slots.js Ver arquivo

@@ -1,5 +1,5 @@
define([
'items/config/slots'
'../config/slots'
], function(
configSlots
) {


+ 2
- 2
src/server/items/generators/spellbook.js Ver arquivo

@@ -1,6 +1,6 @@
define([
'config/spells',
'config/spellsConfig'
'../../config/spells',
'../../config/spellsConfig'
], function(
spells,
spellsConfig


+ 1
- 1
src/server/items/generators/stats.js Ver arquivo

@@ -1,5 +1,5 @@
define([
'items/generators/statsFishingRod'
'./statsFishingRod'
], function(
statsFishingRod
) {


+ 2
- 2
src/server/items/generators/types.js Ver arquivo

@@ -1,6 +1,6 @@
define([
'items/config/types',
'items/config/armorMaterials'
'../config/types',
'../config/armorMaterials'
], function(
configTypes,
armorMaterials


+ 1
- 1
src/server/leaderboard/leaderboard.js Ver arquivo

@@ -1,5 +1,5 @@
define([
'security/io'
'../security/io'
], function(
io
) {


+ 10
- 0
src/server/misc/mail.js Ver arquivo

@@ -14,6 +14,16 @@ define([
getMail: function(playerName) {
var player = this.instance.objects.objects.find(o => (o.name == playerName));
if (!player) {
process.send({
method: 'callDifferentThread',
playerName: playerName,
data: {
module: 'mail',
method: 'getMail',
args: [ playerName ]
}
});

this.processQueue(playerName);
return;
}


+ 2
- 2
src/server/misc/mods.js Ver arquivo

@@ -1,6 +1,6 @@
define([
'misc/fileLister',
'misc/events'
'./fileLister',
'./events'
], function(
fileLister,
events


+ 1
- 1
src/server/mods/class-necromancer/index.js Ver arquivo

@@ -4,7 +4,7 @@ define([

) {
return {
name: 'Necormancer Class',
name: 'Necromancer Class',

extraScripts: [
'spells/spellHarvestLife',


+ 1
- 1
src/server/objects/objBase.js Ver arquivo

@@ -1,5 +1,5 @@
define([
'components/components'
'../components/components'
], function(
components
) {


+ 2
- 2
src/server/objects/objects.js Ver arquivo

@@ -1,6 +1,6 @@
define([
'objects/objBase',
'leaderboard/leaderboard'
'../objects/objBase',
'../leaderboard/leaderboard'
], function(
objBase,
leaderboard


+ 2
- 4
src/server/security/connections.js Ver arquivo

@@ -1,9 +1,7 @@
define([
'objects/objects',
'world/atlas'
'objects/objects'
], function(
objects,
atlas
objects
) {
return {
players: [],


+ 1
- 1
src/server/security/router.js Ver arquivo

@@ -22,7 +22,7 @@ define([
dialogue: ['talk'],
gatherer: ['gather'],
quests: ['complete'],
inventory: ['moveItem', 'enchantItem', 'getEnchantMaterials', 'learnAbility', 'unlearnAbility', 'dropItem', 'destroyItem', 'salvageItem', 'stashItem', ''],
inventory: ['moveItem', 'enchantItem', 'getEnchantMaterials', 'learnAbility', 'unlearnAbility', 'dropItem', 'destroyItem', 'salvageItem', 'stashItem', 'mailItem'],
equipment: ['equip', 'unequip'],
stash: ['withdraw'],
trade: ['buySell' ],


+ 18
- 3
src/server/world/atlas.js Ver arquivo

@@ -2,12 +2,14 @@ define([
'../misc/fileLister',
'child_process',
'objects/objects',
'config/maps/mapList'
'config/maps/mapList',
'security/connections'
], function(
fileLister,
childProcess,
objects,
mapList
mapList,
connections
) {
return {
nextId: 0,
@@ -103,7 +105,6 @@ define([
if (!callback)
return;


callback.callback(msg.result);
},

@@ -160,6 +161,20 @@ define([
object: function(thread, message) {
objects.updateObject(message);
},
callDifferentThread: function(thread, message) {
var obj = connections.players.find(p => (p.name == message.playerName));
if (!obj)
return;
var thread = this.getThreadFromName(obj.zoneName);
if (!thread)
return;

thread.worker.send({
module: message.data.module,
method: message.data.method,
args: message.data.args
});
},
rezone: function(thread, message) {
var obj = message.args.obj;
obj.destroyed = false;


+ 2
- 0
src/server/world/instancer.js Ver arquivo

@@ -56,6 +56,8 @@ define([
scheduler: scheduler
};

this.instances.push(fakeInstance);

spawners.init(fakeInstance);
scheduler.init();



+ 4
- 2
src/server/world/mobBuilder.js Ver arquivo

@@ -69,6 +69,7 @@ define([

mob.addComponent('equipment');
mob.addComponent('inventory', drops);
mob.inventory.inventorySize = -1;

if (this.zone) {
var chats = this.zone.chats;
@@ -130,6 +131,7 @@ define([
slot: slot,
forceStats: [preferStat]
});
delete item.spell;
mob.inventory.getItem(item);
mob.equipment.autoEquip(item.id);
}, this);
@@ -158,8 +160,8 @@ define([
var hpMult = 1 * mob.mob.hpMult;

if (level < 10) {
hpMult *= [0.005, 0.01, 0.1, 0.2, 0.5, 0.65, 0.75, 0.85, 0.95][level - 1];
dmgMult *= [0.2, 0.45, 0.7, 0.8, 0.9, 0.92, 0.94, 0.96, 0.98][level - 1]
hpMult *= [0.005, 0.01, 0.035, 0.08, 0.16, 0.28, 0.43, 0.62, 0.8][level - 1];
dmgMult *= [0.1, 0.2, 0.4, 0.7, 1, 1, 1, 1, 1][level - 1]
}

if (mob.isRare) {


+ 23
- 4
src/server/world/worker.js Ver arquivo

@@ -8,8 +8,6 @@ requirejs.config({
global.io = true;
var instancer = null;



requirejs([
'extend', 'misc/helpers', 'components/components', 'world/instancer', 'security/io', 'misc/mods'
], function(
@@ -18,6 +16,7 @@ requirejs([
var onDbReady = function() {
global.extend = extend;
global._ = helpers;
global.instancer = _instancer;
require('../misc/random');
instancer = _instancer;
@@ -39,7 +38,27 @@ requirejs([
});

process.on('message', (m) => {
if (m.method) {
if (m.module) {
var instances = instancer.instances;
var iLen = instances.length;
for (var i = 0; i < iLen; i++) {
var objects = instances[i].objects.objects;
var oLen = objects.length;
var found = false;
for (var j = 0; j < oLen; j++) {
var object = objects[j];

if (object.name == m.args[0]) {
var module = object.instance[m.module];
module[m.method].apply(module, m.args);

found = true;
break;
}
}
if (found)
break;
}
} else if (m.method)
instancer[m.method](m.args);
}
});

+ 8
- 0
tests/index.js Ver arquivo

@@ -0,0 +1,8 @@
var requirejs = require('requirejs');
var extend = require('extend');

global.extend = extend;

requirejs(['./tests', '../src/server/misc/helpers'], function(tests) {
tests.init();
});

+ 18
- 0
tests/package-lock.json Ver arquivo

@@ -0,0 +1,18 @@
{
"name": "isleward-tests",
"version": "0.0.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"extend": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
"integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
},
"requirejs": {
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz",
"integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw=="
}
}
}

+ 10
- 0
tests/package.json Ver arquivo

@@ -0,0 +1,10 @@
{
"name": "isleward-tests",
"version": "0.0.1",
"description": "isleward-tests",
"dependencies": {
"extend": "^3.0.0",
"requirejs": "^2.3.3"
},
"devDependencies": {}
}

+ 56
- 0
tests/server/components/dialogue.js Ver arquivo

@@ -0,0 +1,56 @@
define([
'server/mocks/generator'
], function(
mocks
) {
return {
//Do you get the correct reputation when talking to a faction vendor for the first time
startTalk_DiscoverFaction: function() {
var factionBase = require('../src/server/config/factionBase');
var anglers = require('../src/server/config/factions/anglers');
var factionBlueprint = extend(true, {}, factionBase, anglers);

var player = mocks.player({
dialogue: {

},
reputation: {
getBlueprint: function() {
return factionBlueprint;
}
}
});

var resultMsg = null;
player.instance.syncer.queue = function(event, msg) {
resultMsg = msg.messages[0].message;
};

var target = mocks.player({
dialogue: {

},
trade: {
faction: {
id: 'anglers'
}
}
});

player.dialogue.talk({
target: target
});

var rep = player.reputation.list[0];
if (rep.rep != factionBlueprint.initialRep)
return true;
else if (resultMsg.indexOf(' friendly ') == -1)
return true;
else {
var tierName = factionBlueprint.tiers.find(t => (t.rep == rep.rep)).name.toLowerCase();
if (resultMsg.indexOf(` ${tierName} `) == -1)
return true;
}
}
};
});

+ 48
- 0
tests/server/components/inventory.js Ver arquivo

@@ -0,0 +1,48 @@
define([
'server/mocks/generator'
], function(
mocks
) {
return {
//Does the item exist in the stash after stashing it
stashItem_Exists: function() {
var player = mocks.player({
inventory: {
items: [{
id: 0
}]
},
stash: {
active: true
}
});

player.inventory.stashItem(0);

var stashedItem = player.stash.items.find(i => (i.id == 0))
if (!stashedItem)
return true;
},

//Does the stashed item have the correct quantity
stashItem_Quantity: function() {
var player = mocks.player({
inventory: {
items: [{
id: 0,
quantity: 10
}]
},
stash: {
active: true
}
});

player.inventory.stashItem(0);

var stashedItem = player.stash.items.find(i => (i.id == 0))
if (stashedItem.quantity != 10)
return true;
}
};
});

+ 121
- 0
tests/server/components/reputation.js Ver arquivo

@@ -0,0 +1,121 @@
define([
'server/mocks/generator'
], function(
mocks
) {
return {
//Is our reputation the correct amount before and after adding
getReputation_GetReputation: function() {
var factionBase = require('../src/server/config/factionBase');
var fjolgard = require('../src/server/config/factions/fjolgard');
var factionBlueprint = extend(true, {}, factionBase, fjolgard);

var player = mocks.player({
reputation: {
factions: {
fjolgard: factionBlueprint
},
list: [{
id: 'fjolgard',
rep: 1000,
tier: 0
}]
},
equipment: {}
});

var repBefore = player.reputation.list[0].rep;

player.reputation.getReputation('fjolgard', 1);
if (repBefore + 1 != player.reputation.list[0].rep)
return true;
},

//Is our reputation the correct amount before and after adding
getReputation_LoseReputation: function() {
var factionBase = require('../src/server/config/factionBase');
var fjolgard = require('../src/server/config/factions/fjolgard');
var factionBlueprint = extend(true, {}, factionBase, fjolgard);

var player = mocks.player({
reputation: {
factions: {
fjolgard: factionBlueprint
},
list: [{
id: 'fjolgard',
rep: 1000,
tier: 0
}]
},
equipment: {}
});

var repBefore = player.reputation.list[0].rep;

player.reputation.getReputation('fjolgard', -1);
if (repBefore - 1 != player.reputation.list[0].rep)
return true;
},

//Do we gain tiers when getting the correct amount of reputation to do so
calculateTier_GainTier: function() {
var factionBase = require('../src/server/config/factionBase');
var fjolgard = require('../src/server/config/factions/fjolgard');
var factionBlueprint = extend(true, {}, factionBase, fjolgard);

var player = mocks.player({
reputation: {
factions: {
fjolgard: factionBlueprint
},
list: [{
id: 'fjolgard'
}]
},
equipment: {}
});

var f = player.reputation.list[0];
for (var i = 0; i < factionBlueprint.tiers.length; i++) {
var tier = factionBlueprint.tiers[i];
f.tier = i - 1;
f.rep = tier.rep - 1;

player.reputation.getReputation('fjolgard', 1);
if (f.tier != i)
return true;
}
},

//Do we lose tiers when losing the correct amount of reputation to do so
calculateTier_LoseTier: function() {
var factionBase = require('../src/server/config/factionBase');
var fjolgard = require('../src/server/config/factions/fjolgard');
var factionBlueprint = extend(true, {}, factionBase, fjolgard);

var player = mocks.player({
reputation: {
factions: {
fjolgard: factionBlueprint
},
list: [{
id: 'fjolgard'
}]
},
equipment: {}
});

var f = player.reputation.list[0];
for (var i = 1; i < factionBlueprint.tiers.length; i++) {
var tier = factionBlueprint.tiers[i];
f.tier = i;
f.rep = tier.rep;

player.reputation.getReputation('fjolgard', -1);
if (f.tier != i - 1)
return true;
}
}
};
});

+ 39
- 0
tests/server/mocks/generator.js Ver arquivo

@@ -0,0 +1,39 @@
define([
], function(
) {
return {
nextId: 0,

player: function(blueprint) {
var result = {
id: this.nextId++,
fireEvent: function() {},
syncer: {},
instance: {
syncer: {
queue: function() {}
}
}
};

blueprint.syncer = {};

for (var p in blueprint) {
var componentTemplate = require('../src/server/components/' + p);
var component = extend(true, {}, componentTemplate, blueprint[p]);

component.obj = result;

result[p] = component
}

return result;
},

mob: function(blueprint) {
}
};
});

+ 9
- 0
tests/server/world/mobBuilder.js Ver arquivo

@@ -0,0 +1,9 @@
define([
'server/mocks/generator'
], function(
mocks
) {
return {
};
});

+ 55
- 0
tests/tests.js Ver arquivo

@@ -0,0 +1,55 @@
define([
'server/components/inventory'
], function(
inventory
) {
var components = ['inventory', 'reputation', 'dialogue'];

return {
stats: {
succeeded: 0,
failed: 0
},

init: function() {
console.log('Testing Started');
console.log();

components.forEach(function(c) {
this.runTest(c, require('server/components/' + c));
}, this);

console.log();
console.log('Testing Completed');
console.log('Succeeded: ' + this.stats.succeeded);
console.log('Failed: ' + this.stats.failed);
},

runTest: function(testName, test) {
for (var t in test) {
try {
if (test[t]()) {
this.logError(testName, t);
this.stats.failed++;
}
else
this.stats.succeeded++;
}
catch (e) {
this.stats.failed++;
this.logError(testName, t, e);
}
}
},

logError: function(test, method, error) {
var splitMethod = method.split('_');
method = splitMethod[0];
var variant = splitMethod[1];

console.log('Failed: ' + test + '.' + method + ' (' + variant + ')');
if (error)
console.log(error);
}
};
});

Carregando…
Cancelar
Salvar