diff --git a/src/client/package.json b/src/client/package.json
index f33e7a33..69602d68 100644
--- a/src/client/package.json
+++ b/src/client/package.json
@@ -1,6 +1,6 @@
{
"name": "isleward_client",
- "version": "0.13.0",
+ "version": "0.14.0",
"description": "isleward",
"devDependencies": {
diff --git a/src/client/ui/templates/characters/characters.js b/src/client/ui/templates/characters/characters.js
index cb236b13..c1fe5ce3 100644
--- a/src/client/ui/templates/characters/characters.js
+++ b/src/client/ui/templates/characters/characters.js
@@ -222,7 +222,7 @@ define([
this.find('.message').html(msg);
},
- onDeleteClick: function () {
+ onDeleteClick: async function () {
if (!this.selected)
return;
@@ -242,22 +242,34 @@ define([
this.el.addClass('disabled');
- client.request({
- cpn: 'auth',
- method: 'deleteCharacter',
- data: {
- name: this.selected
- },
- callback: this.onGetCharacters.bind(this)
+ const result = await new Promise(res => {
+ client.request({
+ cpn: 'auth',
+ method: 'deleteCharacter',
+ data: {
+ name: this.selected
+ },
+ callback: res
+ });
});
+
+ if (!result.success) {
+ this.setMessage(result.msg);
+ this.el.removeClass('disabled');
+
+ return;
+ }
+
+ this.onGetCharacters(result.characterList);
},
onDeleteReset: function () {
- this.setMessage('');
this.deleteCount = 0;
this.find('.btnDelete')
.removeClass('deleting')
.html('delete');
+
+ setTimeout(this.setMessage.bind(this, ''), 5000);
}
};
});
diff --git a/src/client/ui/templates/context/context.js b/src/client/ui/templates/context/context.js
index 530c6dda..083647a4 100644
--- a/src/client/ui/templates/context/context.js
+++ b/src/client/ui/templates/context/context.js
@@ -68,6 +68,8 @@ define([
pos.top = e.detail.clientY;
}
+ pos['max-height'] = window.innerHeight - pos.top - 10;
+
this.el
.css(pos)
.show();
diff --git a/src/client/ui/templates/context/styles.less b/src/client/ui/templates/context/styles.less
index 2bb0f4ad..dd040b6d 100644
--- a/src/client/ui/templates/context/styles.less
+++ b/src/client/ui/templates/context/styles.less
@@ -11,6 +11,7 @@
color: @white;
text-align: center;
line-height: 15px;
+ overflow-y: auto;
.list {
width: 100%;
diff --git a/src/client/ui/templates/inventory/inventory.js b/src/client/ui/templates/inventory/inventory.js
index 912459a1..c1811887 100644
--- a/src/client/ui/templates/inventory/inventory.js
+++ b/src/client/ui/templates/inventory/inventory.js
@@ -358,8 +358,16 @@ define([
if (isMobile)
this.hideTooltip(null, this.hoverItem);
+ const eBeforeShowItemContextMenu = {
+ sourceUi: 'inventory',
+ item: this.hoverItem,
+ ctxConfig
+ };
+
+ events.emit('beforeShowItemContextMenu', eBeforeShowItemContextMenu);
+
if (ctxConfig.length > 0)
- events.emit('onContextMenu', ctxConfig, e);
+ events.emit('onContextMenu', eBeforeShowItemContextMenu.ctxConfig, e);
e.preventDefault();
return false;
diff --git a/src/client/ui/templates/login/template.html b/src/client/ui/templates/login/template.html
index 8635ed1e..35b2d960 100644
--- a/src/client/ui/templates/login/template.html
+++ b/src/client/ui/templates/login/template.html
@@ -11,11 +11,11 @@
- [ Latest Release Notes ]
+ [ Latest Release Notes ]
- v0.13.0
+ v0.14.0
diff --git a/src/client/ui/templates/stash/stash.js b/src/client/ui/templates/stash/stash.js
index 3265b01e..7b60bb62 100644
--- a/src/client/ui/templates/stash/stash.js
+++ b/src/client/ui/templates/stash/stash.js
@@ -112,18 +112,6 @@ define([
events.emit('onShowItemTooltip', item, ttPos, true);
},
- onClick: function (el, item) {
- client.request({
- cpn: 'player',
- method: 'performAction',
- data: {
- cpn: 'equipment',
- method: 'equip',
- data: item.id
- }
- });
- },
-
onGetStashItems: function (items) {
this.items = items;
diff --git a/src/package.json b/src/package.json
index 16b7c980..3cf80368 100644
--- a/src/package.json
+++ b/src/package.json
@@ -1,6 +1,6 @@
{
"name": "isleward",
- "version": "0.13.0",
+ "version": "0.14.0",
"description": "isleward",
"dependencies": {
diff --git a/src/server/components/auth.js b/src/server/components/auth.js
index a48f462e..62fb29cb 100644
--- a/src/server/components/auth.js
+++ b/src/server/components/auth.js
@@ -547,6 +547,24 @@ module.exports = {
return;
}
+ const msgBeforeDeleteCharacter = {
+ obj: this,
+ name: data.name,
+ success: true,
+ msg: null
+ };
+
+ await eventEmitter.emit('beforeDeleteCharacter', msgBeforeDeleteCharacter);
+
+ if (!msgBeforeDeleteCharacter.success) {
+ msg.callback({
+ success: false,
+ msg: msgBeforeDeleteCharacter.msg
+ });
+
+ return;
+ }
+
await io.deleteAsync({
key: data.name,
table: 'character'
@@ -576,7 +594,10 @@ module.exports = {
level: leaderboard.getLevel(c.name ? c.name : c)
}));
- msg.callback(result);
+ msg.callback({
+ success: true,
+ characterList: result
+ });
},
permadie: function () {
diff --git a/src/server/components/dialogue.js b/src/server/components/dialogue.js
index 5deb2cf1..b1d16b7e 100644
--- a/src/server/components/dialogue.js
+++ b/src/server/components/dialogue.js
@@ -15,7 +15,7 @@ module.exports = {
this.trigger.destroyed = true;
},
- talk: function (msg) {
+ talk: async function (msg) {
if (!msg)
return false;
@@ -41,7 +41,7 @@ module.exports = {
if ((target.trade) && (target.trade.faction))
this.obj.reputation.discoverFaction(target.trade.faction.id);
- let state = target.dialogue.getState(this.obj, msg.state);
+ let state = await target.dialogue.getState(this.obj, msg.state);
if (!state) {
this.obj.syncer.set(true, 'dialogue', 'state', null);
return false;
@@ -54,7 +54,8 @@ module.exports = {
this.obj.syncer.set(true, 'dialogue', 'state', null);
},
- getState: function (sourceObj, state = 1) {
+ /* eslint-disable-next-line max-lines-per-function */
+ getState: async function (sourceObj, state = 1) {
let result = null;
if ((state + '').indexOf('.') > -1) {
let config = this.states[(state + '').split('.')[0]];
@@ -93,8 +94,9 @@ module.exports = {
if (stateConfig.goto) {
if (result)
- return this.getState(sourceObj, stateConfig.goto.success);
- return this.getState(sourceObj, stateConfig.goto.failure);
+ return await this.getState(sourceObj, stateConfig.goto.success);
+
+ return await this.getState(sourceObj, stateConfig.goto.failure);
}
if (result) {
useMsg = extend([], useMsg);
@@ -102,7 +104,7 @@ module.exports = {
} else
return null;
} else if (stateConfig.method) {
- let methodResult = stateConfig.method.call(this.obj, sourceObj);
+ let methodResult = await stateConfig.method.call(this.obj, sourceObj);
if (methodResult) {
useMsg = extend([], useMsg);
useMsg[0].msg = methodResult;
diff --git a/src/server/config/clientConfig.js b/src/server/config/clientConfig.js
index 21a9f586..dac9d71c 100644
--- a/src/server/config/clientConfig.js
+++ b/src/server/config/clientConfig.js
@@ -283,6 +283,26 @@ module.exports = {
return result;
},
+ getTileIndexInAtlasSync: function (spriteSheet, tileIndexInSource) {
+ const { atlasTextures, atlasTextureDimensions } = config;
+
+ const indexOfSheet = atlasTextures.indexOf(spriteSheet);
+
+ let tileCountBeforeSheet = 0;
+
+ for (let i = 0; i < indexOfSheet; i++) {
+ const sheet = atlasTextures[i];
+ const { width, height } = atlasTextureDimensions[sheet];
+
+ tileCountBeforeSheet += ((width / 8) * (height / 8));
+ }
+
+ //Tile index 0 is 'no tile' in map files so we need to increment by 1
+ const result = tileCountBeforeSheet + tileIndexInSource + 1;
+
+ return result;
+ },
+
//Used to send to clients
getClientConfig: function (msg) {
msg.callback(config);
diff --git a/src/server/config/serverConfig.js b/src/server/config/serverConfig.js
index ae549066..8c890be5 100644
--- a/src/server/config/serverConfig.js
+++ b/src/server/config/serverConfig.js
@@ -1,7 +1,7 @@
/* eslint-disable no-process-env */
module.exports = {
- version: '0.13.0',
+ version: '0.14.0',
port: 4000,
startupMessage: 'Server: ready',
diff --git a/src/server/db/ioRethink.js b/src/server/db/ioRethink.js
index e01fdc51..b10dee92 100644
--- a/src/server/db/ioRethink.js
+++ b/src/server/db/ioRethink.js
@@ -150,7 +150,7 @@ module.exports = {
})
.run();
} catch (e) {
- this.logError({
+ await this.logError({
sourceModule: 'ioRethink',
sourceMethod: 'setAsync',
error: e,
@@ -173,7 +173,7 @@ module.exports = {
.insert(value, { conflict })
.run();
} catch (e) {
- this.logError({
+ await this.logError({
sourceModule: 'ioRethink',
sourceMethod: 'setFlat',
error: e,
@@ -195,6 +195,16 @@ module.exports = {
.run();
},
+ deleteFilterAsync: async function ({
+ table,
+ filter
+ }) {
+ await r.table(table)
+ .filter(filter)
+ .delete()
+ .run();
+ },
+
subscribe: function (table) {
return r.table(table)
.changes()
@@ -223,7 +233,7 @@ module.exports = {
})
.run();
} catch (e) {
- this.logError({
+ await this.logError({
sourceModule: 'ioRethink',
sourceMethod: 'append',
error: e,
@@ -269,5 +279,7 @@ module.exports = {
});
} else
process.exit();
+
+ throw new Error('Forcing crash');
}
};
diff --git a/src/server/package.json b/src/server/package.json
index 1949ddbc..ee01a6e2 100644
--- a/src/server/package.json
+++ b/src/server/package.json
@@ -1,6 +1,6 @@
{
"name": "isleward_server",
- "version": "0.13.0",
+ "version": "0.14.0",
"description": "isleward",
"dependencies": {
"axios": "^0.22.0",
diff --git a/src/server/world/resourceSpawner.js b/src/server/world/resourceSpawner.js
index 28ae1e4c..9ea5890d 100644
--- a/src/server/world/resourceSpawner.js
+++ b/src/server/world/resourceSpawner.js
@@ -1,4 +1,5 @@
let herbs = require('../config/herbs');
+const eventEmitter = require('../misc/events');
const defaultGatherChance = {
herb: 100,
@@ -122,8 +123,20 @@ module.exports = {
},
spawn: function (node) {
- let blueprint = node.blueprint;
- let position = this.getRandomSpawnPosition(node, blueprint);
+ const blueprint = node.blueprint;
+
+ const eBeforeSpawnResource = {
+ node,
+ position: undefined,
+ allowRandomPosition: true
+ };
+ eventEmitter.emit('beforeSpawnResource', eBeforeSpawnResource);
+
+ if (eBeforeSpawnResource.allowRandomPosition && !eBeforeSpawnResource.position)
+ eBeforeSpawnResource.position = this.getRandomSpawnPosition(node, blueprint);
+
+ const { position } = eBeforeSpawnResource;
+
if (!position)
return false;