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 ]
Pledge on Patreon
Donate on Paypal
Access the Wiki
-
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;