From d46a882509426ef0e570f9a448e0613b9585f0e9 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 15 Jul 2023 07:33:49 +0200 Subject: [PATCH] work --- src/client/css/error.less | 2 +- src/client/css/loader.less | 2 +- src/client/fonts/bitty.otf | Bin 0 -> 5608 bytes src/client/fonts/bitty.ttf | Bin 19492 -> 0 bytes src/client/images/bosses.png | Bin 1033 -> 1167 bytes src/client/images/bosses.pyxel | Bin 3832 -> 3999 bytes src/client/js/objects/objects.js | 9 +- .../{ => helpers}/renderLoginBackground.js | 13 +- .../js/rendering/helpers/updateSprites.js | 204 +++++++++++ src/client/js/rendering/renderer.js | 324 +++++++----------- src/client/js/rendering/tileOpacity.js | 17 + src/client/ui/templates/death/death.js | 6 +- src/client/ui/templates/death/styles.less | 35 +- src/client/ui/templates/death/template.html | 4 +- src/server/clientComponents/player.js | 9 +- src/server/components/social.js | 2 +- src/server/world/map.js | 28 +- src/server/world/threadManager.js | 9 +- 18 files changed, 412 insertions(+), 252 deletions(-) create mode 100644 src/client/fonts/bitty.otf delete mode 100644 src/client/fonts/bitty.ttf rename src/client/js/rendering/{ => helpers}/renderLoginBackground.js (96%) create mode 100644 src/client/js/rendering/helpers/updateSprites.js diff --git a/src/client/css/error.less b/src/client/css/error.less index b03cd37f..d8fb5523 100644 --- a/src/client/css/error.less +++ b/src/client/css/error.less @@ -2,7 +2,7 @@ @font-face { font-family: bitty; - src: url('../fonts/bitty.ttf'); + src: url('../fonts/bitty.otf'); } * { diff --git a/src/client/css/loader.less b/src/client/css/loader.less index 5f882db0..7f8591a6 100644 --- a/src/client/css/loader.less +++ b/src/client/css/loader.less @@ -2,7 +2,7 @@ @font-face { font-family: bitty; - src: url('../fonts/bitty.ttf'); + src: url('../fonts/bitty.otf'); } .loader-container { diff --git a/src/client/fonts/bitty.otf b/src/client/fonts/bitty.otf new file mode 100644 index 0000000000000000000000000000000000000000..77222e672f054ac9c31a49156df2d3df00d5f677 GIT binary patch literal 5608 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 literal 0 HcmV?d00001 diff --git a/src/client/fonts/bitty.ttf b/src/client/fonts/bitty.ttf deleted file mode 100644 index fe4328b6accff5ea1c2554ef0148814ff3203ca4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19492 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 QPadb3kM=Pp6ZrV_7oC0KUH||9 delta 2485 zcmZuz3pCW-7XM>}6hehWA1QB@cO&G@6qPiYgfNNZ{eJx=&(PdV9?7dnQDZQeDX*j` z8Pb$#FeI;18a0|3=5@J!_kQcPI%}Q1_BvEpZdiw@NY0l@V2?JD3Ha!2Wx-N#kb+J=LxXHsP4_mLb7c6poMxxizOdS@=&jHaCn zfB#KJvaKH*)UfiX?XlCh0TaWdqV`Uw7g{_gwFG-;l7YlluEEU!!4bbt2&8atwdiKX~R7LJS;r9P3IC< z+D#|*O3Tvp+qVQ!*W*cuFZtrnIs$Fq5u zYkr@JOxGznOqT@{TXwo$B`~)(>u%LNK<_LqO1JVHU|W^BHCc_be+-;7tkajd-Qlb? zKEY0P4!BI;;I$_Y0uz0W9ugZCuB3>$%cYgL> z2@x~2k9)*SmlgGdn+@n8Wi8H*v-4*&30a}?QvqrITj~cR4y%;fndF3KEoEV|SXcjN z`m?aPtUsBWEtAV{W4ckvdTk+fE8ZdWGXIx;%x5)i6b6W&S?qa@qGwih?yrdQAEotN zSOA@AK;+-qF;%%dY}+|{YB=0e;ZnLqWIwyJaJ@}eL#JDSg9Cs z=t#{$G%XfdF{}G#vZmZQvV2A7{&!UswyQaV4$33h~GHh875w%JeH9IZiLg>5c9 z$-W9(U4-;tI4F9b27=^Pu^Q+uU6v4!Xjk0BR(L;`$gJk0-|(3m%lpPyf;IdcVa~^o zrR}&y`2A7Sy7})1*cd2J0Egj>E)%)se7V;uXsfT6L>p~C$hr%wmR^bO9v zL7I!}ZqGPlKYa^(6Q@1F20`Ak`@yccrMt5tb z*djNN>sq8pmM78RvX+F4Ap|k&WlUWyoA$jqB#uL7O8)WqwtO)^GNX~L()v#%UeFbfc;1T)gADCl|0*z!2 zjoH-Ee>cL@YygaLac({sO_xE5UJicn_B?evRxHC~O0 z*>}}q9o1M4mMC-*iN}vau(TZ%=Gr{^1&8DJ6P}Uv_JrABL z)#StYis1)+<`Y28a>7|Eukr(7BzlajBqOKK!H29q8Eps;i7tCx2A&Yvt6u+}$GvxX zFg&v?QNMG5pc>8KFSFw#$~Id`tlDtnqHPWNEs?I9P!>g3f~h&s2lxWx&VJ~Q%Hl?D zRc7~;R2~+m~fj8%Io1;tW9calqaVzj!SwPY6U^TK@7 zpvG-6N#OrSELvX_16iN7=o!)P|8Z~>F{r>VPfom6;IH+|x!7KZEdl_rX>E(G^>buE z5K><^G}vEYlK>sf5K{w5jy8u+#*X@W%L!L`%jOC$q}nF)`K0j=nh##_`A}i5gEji zllShiEZpTwP_q19T^!wjFyMd`MJlK;B{l8i$ty(ZViViKl&7*3 z>CsaY5%g^dxnDeWNGO { + if (renderer.titleScreen) + return; + + const player = window.player; + if (!player) + return; + + const { w, h, width, height, stage, map, sprites } = renderer; + + const x = ~~((-stage.x / scale) + (width / (scale * 2))); + const y = ~~((-stage.y / scale) + (height / (scale * 2))); + + renderer.lastUpdatePos.x = stage.x; + renderer.lastUpdatePos.y = stage.y; + + const container = renderer.layers.tileSprites; + + const sw = renderer.showTilesW; + const sh = renderer.showTilesH; + + let lowX = Math.max(0, x - sw + 1); + let lowY = Math.max(0, y - sh + 2); + let highX = Math.min(w, x + sw - 2); + let highY = Math.min(h, y + sh - 2); + + let addedSprite = false; + + const checkHidden = renderer.isHidden.bind(renderer); + const buildTile = renderer.buildTile.bind(renderer); + + const newVisible = []; + const newHidden = []; + + for (let i = lowX; i < highX; i++) { + let mapRow = map[i]; + let spriteRow = sprites[i]; + + for (let j = lowY; j < highY; j++) { + const cell = mapRow[j]; + if (!cell) + continue; + + const cLen = cell.length; + if (!cLen) + return; + + const rendered = spriteRow[j]; + const isHidden = checkHidden(i, j); + + if (isHidden) { + const nonFakeRendered = rendered.filter(r => !r.isFake); + + const rLen = nonFakeRendered.length; + for (let k = 0; k < rLen; k++) { + const sprite = nonFakeRendered[k]; + + sprite.visible = false; + spritePool.store(sprite); + rendered.spliceWhere(s => s === sprite); + } + + if (cell.visible) { + cell.visible = false; + newHidden.push({ + x: i, + y: j + }); + } + + const hasFake = cell.some(c => c[0] === '-'); + if (hasFake) { + const isFakeRendered = rendered.some(r => r.isFake); + if (isFakeRendered) + continue; + } else + continue; + } else { + const fakeRendered = rendered.filter(r => r.isFake); + + const rLen = fakeRendered.length; + for (let k = 0; k < rLen; k++) { + const sprite = fakeRendered[k]; + + sprite.visible = false; + spritePool.store(sprite); + rendered.spliceWhere(s => s === sprite); + } + + if (!cell.visible) { + cell.visible = true; + newVisible.push({ + x: i, + y: j + }); + } + + const hasNonFake = cell.some(c => c[0] !== '-'); + if (hasNonFake) { + const isNonFakeRendered = rendered.some(r => !r.isFake); + if (isNonFakeRendered) + continue; + } else + continue; + } + + for (let k = 0; k < cLen; k++) { + let c = cell[k]; + if (c === '0' || c === '') + continue; + + const isFake = +c < 0; + if (isFake && !isHidden) + continue; + else if (!isFake && isHidden) + continue; + + if (isFake) + c = -c; + + c--; + + let flipped = ''; + if (tileOpacity.canFlip(c)) { + if (mRandom() < 0.5) + flipped = 'flip'; + } + + let tile = spritePool.getSprite(flipped + c); + if (!tile) { + tile = buildTile(c, i, j); + container.addChild(tile); + tile.type = c; + tile.sheetNum = tileOpacity.getSheetNum(c); + addedSprite = true; + } else { + tile.position.x = i * scale; + tile.position.y = j * scale; + if (flipped !== '') + tile.position.x += scale; + tile.visible = true; + } + + if (isFake) + tile.isFake = isFake; + + tile.z = k; + + rendered.push(tile); + } + } + } + + lowX = Math.max(0, lowX - 10); + lowY = Math.max(0, lowY - 10); + highX = Math.min(w - 1, highX + 10); + highY = Math.min(h - 1, highY + 10); + + for (let i = lowX; i < highX; i++) { + const mapRow = map[i]; + let spriteRow = sprites[i]; + let outside = ((i >= x - sw) && (i < x + sw)); + for (let j = lowY; j < highY; j++) { + if ((outside) && (j >= y - sh) && (j < y + sh)) + continue; + + const cell = mapRow[j]; + + if (cell.visible) { + cell.visible = false; + newHidden.push({ x: i, y: j }); + } + + let list = spriteRow[j]; + let lLen = list.length; + for (let k = 0; k < lLen; k++) { + let sprite = list[k]; + sprite.visible = false; + spritePool.store(sprite); + } + spriteRow[j] = []; + } + } + + events.emit('onTilesVisible', newVisible, true); + events.emit('onTilesVisible', newHidden, false); + + if (addedSprite) + container.children.sort((a, b) => a.z - b.z); + }; + + return updateSprites; +}); diff --git a/src/client/js/rendering/renderer.js b/src/client/js/rendering/renderer.js index 57ebea23..3e8b6714 100644 --- a/src/client/js/rendering/renderer.js +++ b/src/client/js/rendering/renderer.js @@ -7,8 +7,9 @@ define([ 'js/rendering/particles', 'js/rendering/shaders/outline', 'js/rendering/spritePool', + 'js/rendering/helpers/updateSprites', 'js/system/globals', - 'js/rendering/renderLoginBackground', + 'js/rendering/helpers/renderLoginBackground', 'js/rendering/helpers/resetRenderer' ], function ( resources, @@ -19,6 +20,7 @@ define([ particles, shaderOutline, spritePool, + updateSprites, globals, renderLoginBackground, resetRenderer @@ -77,6 +79,8 @@ define([ hiddenRooms: null, + staticCamera: false, + init: function () { PIXI.settings.GC_MODE = PIXI.GC_MODES.AUTO; PIXI.settings.SCALE_MODE = PIXI.SCALE_MODES.NEAREST; @@ -200,9 +204,12 @@ define([ this.renderer.resize(this.width, this.height); if (window.player) { this.setPosition({ - x: (window.player.x - (this.width / (scale * 2))) * scale, - y: (window.player.y - (this.height / (scale * 2))) * scale - }, true); + pos: { + x: window.player.x, + y: window.player.y + }, + instant: true + }); } if (this.titleScreen) { @@ -278,10 +285,15 @@ define([ }, onGetMap: function (msg) { + const { zoneId, collisionMap, map, hiddenRooms, clientObjects, rendererConfig } = msg; + const { staticCamera = false, cameraPosition } = rendererConfig; + + this.staticCamera = staticCamera; + this.map = map; + this.titleScreen = false; - physics.init(msg.collisionMap); + physics.init(collisionMap); - let map = this.map = msg.map; let w = this.w = map.length; let h = this.h = map[0].length; @@ -301,7 +313,7 @@ define([ this.stage.filters = [new PIXI.filters.AlphaFilter()]; this.stage.filterArea = new PIXI.Rectangle(0, 0, Math.max(w * scale, this.width), Math.max(h * scale, this.height)); - this.hiddenRooms = msg.hiddenRooms; + this.hiddenRooms = hiddenRooms; this.sprites = _.get2dArray(w, h, 'array'); @@ -316,17 +328,24 @@ define([ if (this.zoneId !== null) { events.emit('onRezone', { oldZoneId: this.zoneId, - newZoneId: msg.zoneId + newZoneId: zoneId }); } - this.zoneId = msg.zoneId; + this.zoneId = zoneId; - msg.clientObjects.forEach(c => { + clientObjects.forEach(c => { c.zoneId = this.zoneId; events.emit('onGetObject', c); }); + if (cameraPosition) { + this.setPosition({ + x: (cameraPosition.x - (this.width / (scale * 2))) * scale, + y: (cameraPosition.y - (this.height / (scale * 2))) * scale + }, true, true); + } + //Normally, the mounts mod queues this event when unmounting. // If we rezone, our effects are destroyed, so the event is queued, // but flushForTarget clears the event right after and the event is never received. @@ -334,9 +353,17 @@ define([ events.emit('onMoveSpeedChange', 0); }, - setPosition: function (pos, instant) { - pos.x += 16; - pos.y += 16; + /* + pos: { x, y } + The x and y positions the camera should be centered on (not yet multiplied by scale) + instant: boolean + should the camera pan to the location or not + */ + setPosition: function ({ pos = { x: 0, y: 0 }, instant }) { + let { x, y } = pos; + + x = (x - (this.width / (scale * 2))) * scale; + y = (y - (this.height / (scale * 2))) * scale; let player = window.player; if (player) { @@ -362,13 +389,29 @@ define([ } } + const staticCamera = window.staticCamera || this.staticCamera; + if (staticCamera && !instant) { + this.updateSprites(); + + return; + } + if (instant) { this.moveTo = null; - this.pos = pos; - this.stage.x = -~~this.pos.x; - this.stage.y = -~~this.pos.y; - } else - this.moveTo = pos; + + this.pos = { + x, + y + }; + + this.stage.x = -~~x; + this.stage.y = -~~y; + } else { + this.moveTo = { + x, + y + }; + } this.updateSprites(); }, @@ -437,194 +480,7 @@ define([ }, updateSprites: function () { - if (this.titleScreen) - return; - - const player = window.player; - if (!player) - return; - - const { w, h, width, height, stage, map, sprites } = this; - - const x = ~~((-stage.x / scale) + (width / (scale * 2))); - const y = ~~((-stage.y / scale) + (height / (scale * 2))); - - this.lastUpdatePos.x = stage.x; - this.lastUpdatePos.y = stage.y; - - const container = this.layers.tileSprites; - - const sw = this.showTilesW; - const sh = this.showTilesH; - - let lowX = Math.max(0, x - sw + 1); - let lowY = Math.max(0, y - sh + 2); - let highX = Math.min(w, x + sw - 2); - let highY = Math.min(h, y + sh - 2); - - let addedSprite = false; - - const checkHidden = this.isHidden.bind(this); - const buildTile = this.buildTile.bind(this); - - const newVisible = []; - const newHidden = []; - - for (let i = lowX; i < highX; i++) { - let mapRow = map[i]; - let spriteRow = sprites[i]; - - for (let j = lowY; j < highY; j++) { - const cell = mapRow[j]; - if (!cell) - continue; - - const cLen = cell.length; - if (!cLen) - return; - - const rendered = spriteRow[j]; - const isHidden = checkHidden(i, j); - - if (isHidden) { - const nonFakeRendered = rendered.filter(r => !r.isFake); - - const rLen = nonFakeRendered.length; - for (let k = 0; k < rLen; k++) { - const sprite = nonFakeRendered[k]; - - sprite.visible = false; - spritePool.store(sprite); - rendered.spliceWhere(s => s === sprite); - } - - if (cell.visible) { - cell.visible = false; - newHidden.push({ - x: i, - y: j - }); - } - - const hasFake = cell.some(c => c[0] === '-'); - if (hasFake) { - const isFakeRendered = rendered.some(r => r.isFake); - if (isFakeRendered) - continue; - } else - continue; - } else { - const fakeRendered = rendered.filter(r => r.isFake); - - const rLen = fakeRendered.length; - for (let k = 0; k < rLen; k++) { - const sprite = fakeRendered[k]; - - sprite.visible = false; - spritePool.store(sprite); - rendered.spliceWhere(s => s === sprite); - } - - if (!cell.visible) { - cell.visible = true; - newVisible.push({ - x: i, - y: j - }); - } - - const hasNonFake = cell.some(c => c[0] !== '-'); - if (hasNonFake) { - const isNonFakeRendered = rendered.some(r => !r.isFake); - if (isNonFakeRendered) - continue; - } else - continue; - } - - for (let k = 0; k < cLen; k++) { - let c = cell[k]; - if (c === '0' || c === '') - continue; - - const isFake = +c < 0; - if (isFake && !isHidden) - continue; - else if (!isFake && isHidden) - continue; - - if (isFake) - c = -c; - - c--; - - let flipped = ''; - if (tileOpacity.canFlip(c)) { - if (mRandom() < 0.5) - flipped = 'flip'; - } - - let tile = spritePool.getSprite(flipped + c); - if (!tile) { - tile = buildTile(c, i, j); - container.addChild(tile); - tile.type = c; - tile.sheetNum = tileOpacity.getSheetNum(c); - addedSprite = true; - } else { - tile.position.x = i * scale; - tile.position.y = j * scale; - if (flipped !== '') - tile.position.x += scale; - tile.visible = true; - } - - if (isFake) - tile.isFake = isFake; - - tile.z = k; - - rendered.push(tile); - } - } - } - - lowX = Math.max(0, lowX - 10); - lowY = Math.max(0, lowY - 10); - highX = Math.min(w - 1, highX + 10); - highY = Math.min(h - 1, highY + 10); - - for (let i = lowX; i < highX; i++) { - const mapRow = map[i]; - let spriteRow = sprites[i]; - let outside = ((i >= x - sw) && (i < x + sw)); - for (let j = lowY; j < highY; j++) { - if ((outside) && (j >= y - sh) && (j < y + sh)) - continue; - - const cell = mapRow[j]; - - if (cell.visible) { - cell.visible = false; - newHidden.push({ x: i, y: j }); - } - - let list = spriteRow[j]; - let lLen = list.length; - for (let k = 0; k < lLen; k++) { - let sprite = list[k]; - sprite.visible = false; - spritePool.store(sprite); - } - spriteRow[j] = []; - } - } - - events.emit('onTilesVisible', newVisible, true); - events.emit('onTilesVisible', newHidden, false); - - if (addedSprite) - container.children.sort((a, b) => a.z - b.z); + updateSprites(this); }, update: function () { @@ -662,8 +518,10 @@ define([ this.moveTo = null; } + const staticCamera = this.staticCamera || window.staticCamera; + let stage = this.stage; - if (window.staticCamera !== true) { + if (staticCamera !== true) { stage.x = -~~this.pos.x; stage.y = -~~this.pos.y; } @@ -899,6 +757,58 @@ define([ }); }, + updateMapRows: function (rows) { + const { map, sprites, layers: { tileSprites: container } } = this; + + rows.forEach(({ rowNumber: x, cols }) => { + const row = sprites[x]; + + cols.forEach(({ colNumber: y, cells }) => { + const cellSprites = row[y]; + + cellSprites.forEach(c => { + c.visible = false; + spritePool.store(c); + }); + + cellSprites.length = 0; + + map[x][y] = cells; + + cells.forEach((m, k) => { + m--; + + let flipped = ''; + if (tileOpacity.canFlip(m)) { + if (mRandom() < 0.5) + flipped = 'flip'; + } + + let tile = spritePool.getSprite(flipped + m); + if (!tile) { + tile = this.buildTile(m, x, y); + container.addChild(tile); + tile.type = m; + tile.sheetNum = tileOpacity.getSheetNum(m); + } else { + tile.position.x = x * scale; + tile.position.y = y * scale; + if (flipped !== '') + tile.position.x += scale; + tile.visible = true; + } + + tile.z = k; + + cellSprites.push(tile); + cellSprites.visible = true; + }); + }); + }); + + container.children.sort((a, b) => a.z - b.z); + }, + render: function () { if (!this.stage) return; diff --git a/src/client/js/rendering/tileOpacity.js b/src/client/js/rendering/tileOpacity.js index d7491518..672a84ce 100644 --- a/src/client/js/rendering/tileOpacity.js +++ b/src/client/js/rendering/tileOpacity.js @@ -46,6 +46,23 @@ define([ }; }, + getCellInAtlas: function (cell, sheetName) { + const { clientConfig: { atlasTextureDimensions, atlasTextures } } = globals; + + const indexInAtlas = atlasTextures.indexOf(sheetName); + + let offset = 0; + + for (let i = 0; i < indexInAtlas; i++) { + const dimensions = atlasTextureDimensions[atlasTextures[i]]; + const spriteCount = dimensions.w * dimensions.h; + + offset += spriteCount; + } + + return cell + offset; + }, + map: function (tile) { const { clientConfig: { tileOpacities } } = globals; diff --git a/src/client/ui/templates/death/death.js b/src/client/ui/templates/death/death.js index 797d130b..13a6de7e 100644 --- a/src/client/ui/templates/death/death.js +++ b/src/client/ui/templates/death/death.js @@ -57,9 +57,9 @@ define([ onDeath: function (eventObj) { if (!eventObj.source) - this.find('.msg').html('you are dead'); + this.find('.msg').html('You are dead.'); else - this.find('.msg').html('you were killed by [
' + eventObj.source + '
]'); + this.find('.msg').html('You were killed by [
' + eventObj.source + '
].'); this.find('.penalty') .html('you lost ' + eventObj.xpLoss + ' experience') .show(); @@ -72,7 +72,7 @@ define([ }, onPermadeath: function (eventObj) { - this.find('.msg').html('you were killed by [
' + eventObj.source + '
]'); + this.find('.msg').html('You were killed by [
' + eventObj.source + '
].'); this.el.addClass('permadeath'); this.doShow(); } diff --git a/src/client/ui/templates/death/styles.less b/src/client/ui/templates/death/styles.less index 2b9c204e..5d827149 100644 --- a/src/client/ui/templates/death/styles.less +++ b/src/client/ui/templates/death/styles.less @@ -23,22 +23,6 @@ margin-top: 15px; } - .btn { - color: @white; - width: 100%; - height: 32px; - background-color: @blueB; - margin: 16px 0px; - padding-top: 8px; - cursor: pointer; - - &:hover { - background-color: lighten(@blueB, 15%); - color: @black; - } - - } - &.permadeath { .buttons { .btn-respawn { @@ -54,6 +38,25 @@ } .buttons { + margin: 16px 0px; + + .btn { + color: @white; + width: 100%; + height: 32px; + background-color: @blueB; + disply: flex; + justify-content: center; + align-items: center; + cursor: pointer; + + &:hover { + background-color: lighten(@blueB, 15%); + color: @black; + } + + } + .btn-logout { display: none; } diff --git a/src/client/ui/templates/death/template.html b/src/client/ui/templates/death/template.html index ebc05934..0c647098 100644 --- a/src/client/ui/templates/death/template.html +++ b/src/client/ui/templates/death/template.html @@ -2,7 +2,7 @@
-
respawn
-
log out
+
Respawn
+
Log Out
diff --git a/src/server/clientComponents/player.js b/src/server/clientComponents/player.js index 36d576f2..b5614e3b 100644 --- a/src/server/clientComponents/player.js +++ b/src/server/clientComponents/player.js @@ -69,9 +69,12 @@ define([ positionCamera: function (x, y, instant) { renderer.setPosition({ - x: (x - (renderer.width / (scale * 2))) * scale, - y: (y - (renderer.height / (scale * 2))) * scale - }, instant); + pos: { + x, + y + }, + instant + }); }, teleportToPosition: function ({ x, y }) { diff --git a/src/server/components/social.js b/src/server/components/social.js index fff2221b..e621c1a8 100644 --- a/src/server/components/social.js +++ b/src/server/components/social.js @@ -296,7 +296,7 @@ module.exports = { }, //Sends multiple notifications to yourself - // messages = [{ msg, className, type }] + // messages = [{ message, className, type }] notifySelfArray: function (messages) { const { obj: { id, serverId, instance: { syncer } } } = this; diff --git a/src/server/world/map.js b/src/server/world/map.js index 9f46c608..604cca5b 100644 --- a/src/server/world/map.js +++ b/src/server/world/map.js @@ -48,7 +48,15 @@ module.exports = { collisionMap: null, - clientMap: null, + clientMap: { + zoneId: null, + map: null, + collisionMap: null, + clientObjects: null, + padding: null, + hiddenRooms: null, + staticCamera: false + }, oldLayers: { tiles: null, walls: null, @@ -125,14 +133,18 @@ module.exports = { create: function () { this.getMapFile(); - this.clientMap = { + const { layers, collisionMap, objBlueprints, hiddenRooms, zoneConfig } = this; + const { rendererConfig = {} } = zoneConfig; + + Object.assign(this.clientMap, { zoneId: -1, - map: this.layers, - collisionMap: this.collisionMap, - clientObjects: this.objBlueprints, - padding: padding, - hiddenRooms: this.hiddenRooms - }; + map: layers, + collisionMap, + clientObjects: objBlueprints, + padding, + hiddenRooms, + rendererConfig + }); }, getMapFile: function () { diff --git a/src/server/world/threadManager.js b/src/server/world/threadManager.js index be8964c3..57e51179 100644 --- a/src/server/world/threadManager.js +++ b/src/server/world/threadManager.js @@ -153,6 +153,9 @@ const messageHandlers = { const onMessage = (thread, message) => { if (message.module) { try { + if (message.includeThreadInArgs) + message.threadId = thread.id; + global[message.module][message.method](message); } catch (e) { /* eslint-disable-next-line no-console */ @@ -184,13 +187,14 @@ const spawnThread = async ({ map: { name, path, instanced, destroyWhenEmptyForMs worker: null, isReady: false, promise, + preConfig: {}, cbOnInitialized, players: [], playersCurrent: [], birthEpoch: +new Date(), destroyWhenEmptyForMs, emptySinceEpoch: null, - sendArgsToWorker: ['name', 'id'], + sendArgsToWorker: ['name', 'id', 'preConfig'], workerArgs: null }; @@ -204,7 +208,7 @@ const spawnThread = async ({ map: { name, path, instanced, destroyWhenEmptyForMs thread.sendArgsToWorker.map(a => [a, thread[a]]) ); - _.log(`Spawning: ${JSON.stringify(thread.workerArgs, null, '\t')}`); + _.log(`Spawning: ${JSON.stringify({ id: thread.id, name: thread.name }, null, '\t')}`); thread.worker = childProcess.fork('./world/worker', [JSON.stringify(thread.workerArgs)]); thread.worker.on('message', onMessage.bind(null, thread)); @@ -257,6 +261,7 @@ const killThread = thread => { }; const sendMessageToThread = ({ threadId, msg }) => { + console.log('ok'); const thread = threads.find(t => t.id === threadId); if (thread) thread.worker.send(msg);