Explorar el Código

Merge branch 'master' into 'release'

Master

See merge request Isleward/isleward!595
tags/v0.11.0
Big Bad Waffle hace 2 años
padre
commit
241740c757
Se han modificado 100 ficheros con 3403 adiciones y 550 borrados
  1. +2
    -1
      .gitignore
  2. +14
    -8
      CONTRIBUTING.md
  3. +1
    -3
      README.md
  4. +0
    -0
     
  5. +0
    -1
      src/client/css/error.css
  6. +0
    -1
      src/client/css/loader.css
  7. +0
    -1
      src/client/css/main.css
  8. +36
    -0
      src/client/js/input.js
  9. +16
    -0
      src/client/js/misc/physics.js
  10. +29
    -39
      src/client/js/rendering/renderer.js
  11. +1
    -1
      src/client/js/sound/sound.js
  12. +1
    -1
      src/client/package.json
  13. +0
    -1
      src/client/ui/templates/announcements/styles.css
  14. +0
    -1
      src/client/ui/templates/characters/styles.css
  15. +0
    -1
      src/client/ui/templates/context/styles.css
  16. +0
    -1
      src/client/ui/templates/createCharacter/styles.css
  17. +0
    -1
      src/client/ui/templates/death/styles.css
  18. +0
    -1
      src/client/ui/templates/dialogue/styles.css
  19. +0
    -1
      src/client/ui/templates/effects/styles.css
  20. +0
    -1
      src/client/ui/templates/equipment/styles.css
  21. +4
    -4
      src/client/ui/templates/equipment/styles.less
  22. +0
    -1
      src/client/ui/templates/events/styles.css
  23. +0
    -1
      src/client/ui/templates/help/styles.css
  24. +0
    -1
      src/client/ui/templates/hud/styles.css
  25. +0
    -1
      src/client/ui/templates/inventory/styles.css
  26. +0
    -1
      src/client/ui/templates/leaderboard/styles.css
  27. +0
    -1
      src/client/ui/templates/login/styles.css
  28. +2
    -2
      src/client/ui/templates/login/template.html
  29. +0
    -1
      src/client/ui/templates/mainMenu/styles.css
  30. +0
    -1
      src/client/ui/templates/menu/styles.css
  31. +2
    -0
      src/client/ui/templates/messages/messages.js
  32. +0
    -1
      src/client/ui/templates/messages/styles.css
  33. +0
    -1
      src/client/ui/templates/messages/styles.less
  34. +17
    -15
      src/client/ui/templates/messages/template.html
  35. +1
    -1
      src/client/ui/templates/messages/tplTab.html
  36. +0
    -1
      src/client/ui/templates/middleHud/styles.css
  37. +0
    -1
      src/client/ui/templates/online/styles.css
  38. +0
    -1
      src/client/ui/templates/options/styles.css
  39. +0
    -1
      src/client/ui/templates/overlay/styles.css
  40. +10
    -7
      src/client/ui/templates/party/party.js
  41. +0
    -1
      src/client/ui/templates/party/styles.css
  42. +0
    -1
      src/client/ui/templates/passives/styles.css
  43. +0
    -1
      src/client/ui/templates/progressBar/styles.css
  44. +0
    -1
      src/client/ui/templates/quests/styles.css
  45. +0
    -1
      src/client/ui/templates/reputation/styles.css
  46. +0
    -1
      src/client/ui/templates/spells/styles.css
  47. +0
    -1
      src/client/ui/templates/spells/styles.less
  48. +1
    -1
      src/client/ui/templates/spells/templateSpell.html
  49. +0
    -1
      src/client/ui/templates/stash/styles.css
  50. +0
    -1
      src/client/ui/templates/talk/styles.css
  51. +0
    -1
      src/client/ui/templates/target/styles.css
  52. +0
    -1
      src/client/ui/templates/terms/styles.css
  53. +0
    -1
      src/client/ui/templates/tooltipInfo/styles.css
  54. +1
    -0
      src/client/ui/templates/tooltipInfo/styles.less
  55. +0
    -1
      src/client/ui/templates/tooltipItem/styles.css
  56. +0
    -1
      src/client/ui/templates/tooltips/styles.css
  57. +0
    -1
      src/client/ui/templates/trade/styles.css
  58. +0
    -1
      src/client/ui/templates/wardrobe/styles.css
  59. +0
    -1
      src/client/ui/templates/workbench/styles.css
  60. +38
    -40
      src/server/clientComponents/inventory.js
  61. +9
    -4
      src/server/clientComponents/serverActions.js
  62. +5
    -1
      src/server/components/auth.js
  63. +2
    -2
      src/server/components/equipment.js
  64. +11
    -6
      src/server/components/gatherer.js
  65. +4
    -2
      src/server/components/inventory.js
  66. +3
    -3
      src/server/components/inventory/getItem.js
  67. +0
    -1
      src/server/components/mob.js
  68. +6
    -6
      src/server/components/player.js
  69. +2
    -0
      src/server/components/stats.js
  70. +1
    -1
      src/server/components/trade.js
  71. +1
    -0
      src/server/config/clientConfig.js
  72. +5
    -31
      src/server/config/maps/fjolarok/dialogues.js
  73. +90
    -144
      src/server/config/maps/fjolarok/map.json
  74. +1
    -1
      src/server/config/maps/fjolarok/quests.js
  75. +2
    -22
      src/server/config/maps/fjolarok/zone.js
  76. +8
    -3
      src/server/config/quests/questBuilder.js
  77. +4
    -2
      src/server/config/quests/templates/questGatherResource.js
  78. +1
    -1
      src/server/config/quests/templates/questKillX.js
  79. +1
    -1
      src/server/config/quests/templates/questLootGen.js
  80. +1
    -1
      src/server/config/quests/templates/questTemplate.js
  81. +6
    -9
      src/server/config/serverConfig.js
  82. +2
    -2
      src/server/mods/class-necromancer/index.js
  83. +0
    -2
      src/server/objects/objBase.js
  84. +2854
    -23
      src/server/package-lock.json
  85. +4
    -2
      src/server/package.json
  86. +10
    -6
      src/server/security/connections.js
  87. +1
    -1
      src/server/security/connections/route.js
  88. +7
    -3
      src/server/security/router.js
  89. +8
    -0
      src/server/security/routerConfig.js
  90. +12
    -3
      src/server/server/index.js
  91. +3
    -3
      src/server/server/onConnection.js
  92. +101
    -52
      src/server/world/atlas.js
  93. +1
    -1
      src/server/world/customMap.js
  94. +13
    -6
      src/server/world/instancer.js
  95. +18
    -18
      src/server/world/map.js
  96. +3
    -3
      src/server/world/mobBuilder.js
  97. +2
    -1
      src/server/world/randomMap/spawnObjects.js
  98. +19
    -12
      src/server/world/resourceSpawner.js
  99. +1
    -1
      src/server/world/rezoneManager.js
  100. +5
    -5
      src/server/world/spawners.js

+ 2
- 1
.gitignore Ver fichero

@@ -1,5 +1,6 @@
node_modules
package-lock.json
*.css

storage.db
*.sublime-project
@@ -9,4 +10,4 @@ src/server/mods/iwd-*
firebaseConfig.js
.directory
.idea
.vscode
.vscode

+ 14
- 8
CONTRIBUTING.md Ver fichero

@@ -16,29 +16,35 @@ If anything in this contributing guide is not clear, don't hesitate to contact W

### Issue Labels

Labels can only be assigned by people with Reporter and higher permissions in the project (see [Members](https://gitlab.com/Isleward/isleward/project_members)). People with rights to assign labels should do so regularly to keep the issues organized.
Labels can only be assigned by people with Reporter and higher permissions in the project (see [Members](https://gitlab.com/Isleward/isleward/project_members)).
People with rights to assign labels should do so regularly to keep the issues organized.
The project is using the following, rather self-explanatory, labels:

* ~Balance
* ~Bug
* ~Content
* ~DevOps
* ~Draft
* ~Enhancement
* ~Feature
* ~Good first issue
* ~Mobile
* ~Mod
* ~Modding
* ~Polish
* ~Refactor
* ~DevOps
* ~Suggestion

### Issue Weights

* In addition to labels, issues tagged with the ~Bug label are also assigned Weights.
* Bugs are weighed by severity, with 1 being trivial and 5 being severe.
* Weights can assigned by people with Reporter or higher privileges, but this should only be done by @rstan122 unless instructed otherwise.
* Weights can assigned by people with Reporter or higher privileges.

### Confidential Issues

* Confidential issues are issues that are visible only to people with Reporter or higher access rights.
* Therefore they are very useful for reporting issues that are very sensitive and that not every user should know about.
* Therefore they are very useful for reporting issues that are very sensitive and that not every user should know about.
* To create a confidential issue, simply check the `This issue is confidential and should only be visible to team members with at least Reporter access.` checkbox when creating a new issue.

### Becoming a Reporter
@@ -62,7 +68,7 @@ The project is using the following branching structure

**release tags** are pointing at the latest commit in `release` at the point of releasing a new version.

**feature branches** are branches in which the actual development happens. The name of a feature branch should always contain the number of the issue that's being addressed (e.g. the `990` in `990-contribuing-rewrite`), be all lowercase with hyphens between words.
**feature branches** are branches in which the actual development happens. The name of a feature branch should always contain the number of the issue that's being addressed (e.g. the `990` in `990-contribuing-rewrite`), and be all lowercase with hyphens between words.

### Using SSH keys

@@ -86,14 +92,14 @@ Once you are done working on your contribution, you need to submit a merge reque

The merge request should have `master` as its target branch unless arranged otherwise.

You don't need to remove the source branch upon accepting the merge request if the merge request is being made from a fork.
You don't need to remove the source branch upon accepting the merge request if the merge request is being made from a fork.
Squishing commits is usually not recommended as it breaks the ability to rebase nicely in certain cases.

Once your merge request is submitted, GitLab CI will run a few tests on it. Should those tests fail, please address the failures.
Once your merge request is submitted, GitLab CI will run a few tests on it. Should those tests fail, please address the failures.
A Merge Request with passing tests is ready to be merged.

### Running Isleward

* [Windows](https://gitlab.com/Isleward/isleward/wikis/installation-and-usage-(windows))
* [Linux](https://gitlab.com/Isleward/isleward/wikis/installation-and-usage-(linux))
* [MacOS](https://gitlab.com/Isleward/isleward/wikis/installation-and-usage-(macos))
* [MacOS](https://gitlab.com/Isleward/isleward/wikis/installation-and-usage-(macos))

+ 1
- 3
README.md Ver fichero

@@ -4,14 +4,12 @@

Built with NodeJS, JS, HTML and CSS.

[Play Now](http://play.isleward.com/) | [Discord](https://discord.gg/gnsn7ZP) | [Subreddit](https://www.reddit.com/r/isleward) | [Blog](http://blog.isleward.com/) | [Wiki](http://wiki.isleward.com/Main_Page) | [Twitter](https://twitter.com/playisleward) | [Facebook](https://www.facebook.com/isleward/) | [Patreon](http://patreon.com/bigbadwaffle)
[Play Now](http://play.isleward.com/) | [Discord](https://discord.gg/gnsn7ZP) | [Subreddit](https://www.reddit.com/r/isleward) | [Wiki](http://wiki.isleward.com/Main_Page) | [Twitter](https://twitter.com/playisleward) | [Facebook](https://www.facebook.com/isleward/) | [Patreon](http://patreon.com/bigbadwaffle)

[How to contribute](CONTRIBUTING.md)

### Installation and Usage

**IMPORTANT**: The sqlite3 package has been removed for the time being due to multiple `npm audit` issues arrising. While installing this module will not cause you any security issues (due to the nature of the vulnerabilities and how Isleward actually uses the module), we have removed it to make the build process simpler for us. As a result of this, after performing an `npm install` in the `server` folder, please also run `npm i sqlite3`.

* [Windows](https://gitlab.com/Isleward/isleward/wikis/installation-and-usage-(windows))
* [Linux](https://gitlab.com/Isleward/isleward/wikis/installation-and-usage-(linux))
* [MacOS](https://gitlab.com/Isleward/isleward/wikis/installation-and-usage-(macos))


+ 0
- 0
Ver fichero


+ 0
- 1
src/client/css/error.css Ver fichero

@@ -1 +0,0 @@
@font-face{font-family:bitty;src:url(../fonts/bitty.ttf)}*{box-sizing:border-box;font-family:bitty;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body{margin:0;width:100vw;height:100vh;background-image:url(../images/static_bg.png);background-repeat:repeat;background-position:center center;overflow:hidden;display:flex;flex-direction:column;justify-content:center;align-items:center}.logo{width:562px;height:200px;margin-bottom:20px}.discord,.error{color:#d43346;font-size:24px;padding:10px;filter:drop-shadow(0 -6px 0 #312136) drop-shadow(0 6px 0 #312136) drop-shadow(6px 0 0 #312136) drop-shadow(-6px 0 0 #312136)}.discord{justify-self:end}.discord a:active,.discord a:hover,.discord a:link,.discord a:visited{color:#faac45;text-decoration:none}

+ 0
- 1
src/client/css/loader.css
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 0
- 1
src/client/css/main.css Ver fichero

@@ -1 +0,0 @@
body,html{position:fixed;overflow:hidden;overscroll-behavior:none}body{margin:0;width:100vw;height:100vh;background-color:#2d2136}.ui-container{width:100%;height:100%;position:absolute;left:0;top:0;z-index:20;overflow:hidden;display:flex;justify-content:center;align-items:center}.ui-container>.right{position:absolute;right:10px;top:94px}.ui-container.mobile .uiTooltipInfo{display:none!important}.ui-container.hideMonetization .monetization{display:none}.mobile.ui-container>.right{top:10px;right:158px;z-index:2;display:flex;flex-direction:row-reverse}*{box-sizing:border-box;font-family:bitty;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.canvas-container{position:relative;float:left}.canvas-container.visible{opacity:1;transition:1s}.canvas-container canvas{left:0;top:0;width:100vw}.disabled{opacity:.4!important;pointer-events:none!important}.hidden{display:none!important}[class^=ui] input,[class^=ui] textarea{-webkit-user-select:text;-khtml-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}[class^=ui] .el{height:35px;text-align:center;padding:0;background-color:transparent}[class^=ui] .textbox{border:none;outline:0;font-size:16px}[class^=ui] div.textbox{padding-top:6px}[class^=ui] .btn{cursor:pointer;display:flex;justify-content:center;align-items:center}[class^=ui] .btn:hover{background-color:#473456}[class^=ui] .spacer-h{width:100%}[class^=ui].modal .btnClose{position:absolute;background-color:#505360;color:#ff6942;cursor:pointer;height:31px;width:31px;text-align:center;right:0;top:0;padding-top:0;display:flex;justify-content:center;align-items:center}[class^=ui].modal .btnClose:hover{background-color:#676b7c}::-webkit-scrollbar{width:16px}::-webkit-scrollbar-track{background-color:#3c3f4c;-webkit-border-radius:0;border-radius:0}::-webkit-scrollbar-thumb{-webkit-border-radius:10px;border-radius:0;background:#929398}:root{scrollbar-color:#929398 #3c3f4c!important;scrollbar-width:thin!important;--color-element-default:#fcfcfc;--color-element-arcane:#fc66f7;--color-element-frost:#48edff;--color-element-fire:#ff4252;--color-element-holy:#ffeb38;--color-element-poison:#51fc9a}.q0{color:#fcfcfc}.q1{color:#4ac441}.q2{color:#3fa7dd}.q3{color:#a24eff}.q4{color:#ff6942}.color-red{color:#d43346!important}.color-redA{color:#ff4252!important}.color-blueA{color:#48edff!important}.color-blueB{color:#3fa7dd!important}.color-greenB{color:#4ac441!important}.color-yellowB{color:#faac45!important}.color-green{color:#80f643!important}.color-brownC{color:#b15a30!important}.color-brownD{color:#763b3b!important}.color-grayA{color:#fcfcfc!important}.color-grayB{color:#c0c3cf!important}.color-grayC{color:#929398!important}.color-grayD{color:#69696e!important}.color-pinkA{color:#fc66f7!important}.color-pinkB{color:#de43ae!important}.color-purpleA{color:#a24eff!important}.color-tealB{color:#51fc9a!important}[class^=ui] .renderItem{width:72px;height:72px;float:left;position:relative;cursor:pointer;box-sizing:border-box;margin:4px;background-color:#312136}[class^=ui] .renderItem.hover{background-color:rgba(72,237,255,.1)}[class^=ui] .renderItem.dragging{position:absolute;opacity:.5;pointer-events:none;background-color:transparent}[class^=ui] .renderItem.dragging .icon{filter:brightness(100%) drop-shadow(0 -4px 0 #312136) drop-shadow(0 4px 0 #312136) drop-shadow(4px 0 0 #312136) drop-shadow(-4px 0 0 #312136);-moz-filter:brightness(100%) drop-shadow(0 -4px 0 #312136) drop-shadow(0 4px 0 #312136) drop-shadow(4px 0 0 #312136) drop-shadow(-4px 0 0 #312136)}[class^=ui] .renderItem .quantity{left:6px;bottom:3px;position:absolute;color:#fcfcfc;filter:drop-shadow(0 -2px 0 #312136) drop-shadow(0 2px 0 #312136) drop-shadow(2px 0 0 #312136) drop-shadow(-2px 0 0 #312136);-moz-filter:drop-shadow(0 -2px 0 #312136) drop-shadow(0 2px 0 #312136) drop-shadow(2px 0 0 #312136) drop-shadow(-2px 0 0 #312136)}[class^=ui] .renderItem .icon{width:64px;height:64px;position:absolute;left:4px;top:4px;image-rendering:optimizeSpeed;image-rendering:pixelated;image-rendering:crisp-edges;transform-origin:0 0}[class^=ui] .renderItem.eq .quantity{color:#ffeb38}[class^=ui] .renderItem.new .quantity{color:#80f643}[class^=ui] .renderItem:hover .icon{filter:brightness(160%);-moz-filter:brightness(160%)}[class^=ui] .renderItem.spriteSize8 .icon{transform:scale(4);-webkit-transform:scale(4);margin:16px}[class^=ui] .renderItem.spriteSize24 .icon{transform:scale(4);-webkit-transform:scale(4);margin:-44px -16px}.hasBorderShadow{box-shadow:0 -2px 0 #2d2136,0 2px 0 #2d2136,2px 0 0 #2d2136,-2px 0 0 #2d2136}

+ 36
- 0
src/client/js/input.js Ver fichero

@@ -60,6 +60,9 @@ define([

enabled: true,

blacklistedKeys: [],
whitelistedKeys: [],

init: function () {
$(window).on('keydown', this.events.keyboard.keyDown.bind(this));
$(window).on('keyup', this.events.keyboard.keyUp.bind(this));
@@ -78,6 +81,22 @@ define([
require(['plugins/shake.js'], this.onLoadShake.bind(this));
},

blacklistKeys: function (list) {
this.blacklistedKeys.push(...list);
},

unBlacklistKeys: function (list) {
this.blacklistedKeys.spliceWhere(d => list.includes(d));
},

whitelistKeys: function (list) {
this.whitelistedKeys.push(...list);
},

unWhitelistKeys: function (list) {
this.whitelistedKeys.spliceWhere(d => list.includes(d));
},

onLoadShake: function (shake) {
let shaker = new shake({
threshold: 5,
@@ -140,8 +159,22 @@ define([
return result;
},

isKeyAllowed: function (key) {
const result = (
key.length > 1 ||
this.whitelistedKeys.includes(key) ||
(
!this.blacklistedKeys.includes(key) &&
!this.blacklistedKeys.includes('*')
)
);

return result;
},

events: {
keyboard: {
/* eslint-disable-next-line max-lines-per-function */
keyDown: function (e) {
if (!this.enabled)
return;
@@ -156,6 +189,9 @@ define([
if ((e.keyCode === 9) || (e.keyCode === 8) || (e.keyCode === 122))
e.preventDefault();

if (!this.isKeyAllowed(key))
return;

if (this.keys.has(key))
this.keys[key] = 2;
else {


+ 16
- 0
src/client/js/misc/physics.js Ver fichero

@@ -76,6 +76,22 @@ define([
return inside;
},

//Helper function to check if a point is inside an area
// This function is optimized to check if the point is outside the rect first
// and if it is not, we do the more expensive isInPolygon check
isInArea: function (x, y, { x: ax, y: ay, width, height, area }) {
//Outside rect
if (
x < ax ||
x >= ax + width ||
y < ay ||
y >= ay + height
)
return false;

return this.isInPolygon(x, y, area);
},

distanceToPolygon: function (p, verts) {
return distanceToPolygon.calculate(p, verts);
}


+ 29
- 39
src/client/js/rendering/renderer.js Ver fichero

@@ -313,8 +313,13 @@ define([
return 0;
});

if (this.zoneId !== null)
events.emit('onRezone', this.zoneId);
if (this.zoneId !== null) {
events.emit('onRezone', {
oldZoneId: this.zoneId,
newZoneId: msg.zoneId
});
}

this.zoneId = msg.zoneId;

msg.clientObjects.forEach(c => {
@@ -384,60 +389,45 @@ define([
let foundVisibleLayer = null;
let foundHiddenLayer = null;

const fnTileInArea = physics.isInArea.bind(physics, x, y);
const fnPlayerInArea = physics.isInArea.bind(physics, px, py);

hiddenRooms.forEach(h => {
const { discovered, layer, interior } = h;
const { x: hx, y: hy, width, height, area } = h;

//Is the tile outside the hider
if (
x < hx ||
x >= hx + width ||
y < hy ||
y >= hy + height
) {
//If the hider is an interior, the tile should be hidden if the player is inside the hider
if (interior) {
if (physics.isInPolygon(px, py, area))
foundHiddenLayer = layer;
}

return;
}
const playerInHider = fnPlayerInArea(h);
const tileInHider = fnTileInArea(h);

//Is the tile inside the hider
if (!physics.isInPolygon(x, y, area))
return;
if (playerInHider) {
if (interior && !tileInHider) {
foundHiddenLayer = layer;

if (discovered) {
foundVisibleLayer = layer;
return;
}
} else if (tileInHider && !discovered) {
foundHiddenLayer = layer;

return;
}

//Is the player outside the hider
if (
px < hx ||
px >= hx + width ||
py < hy ||
py >= hy + height
) {
foundHiddenLayer = layer;
} else if (tileInHider && discovered) {
foundVisibleLayer = layer;

return;
}

//Is the player inside the hider
if (!physics.isInPolygon(px, py, area)) {
foundHiddenLayer = layer;

if (!tileInHider)
return;
}

foundVisibleLayer = layer;
});

//We compare hider layers to cater for hiders inside hiders
return (foundHiddenLayer > foundVisibleLayer) || (foundHiddenLayer === 0 && foundVisibleLayer === null);
return (
foundHiddenLayer > foundVisibleLayer ||
(
foundHiddenLayer === 0 &&
foundVisibleLayer === null
)
);
},

updateSprites: function () {


+ 1
- 1
src/client/js/sound/sound.js Ver fichero

@@ -52,7 +52,7 @@ define([
},

//Fired when a character rezones
// 'scope' is the new zone name
// 'newScope' is the new zone name
unload: function (newScope) {
const { sounds } = this;



+ 1
- 1
src/client/package.json Ver fichero

@@ -1,6 +1,6 @@
{
"name": "isleward_client",
"version": "0.10.6",
"version": "0.11.0",
"description": "isleward",
"dependencies": {
},


+ 0
- 1
src/client/ui/templates/announcements/styles.css Ver fichero

@@ -1 +0,0 @@
.uiAnnouncements{pointer-events:none;position:absolute;left:0;top:0;width:100%;top:calc(50% + 92px)}.uiAnnouncements .list{position:relative;width:100%}.uiAnnouncements .list .message{position:absolute;height:36px;left:50%;transform:translateX(-50%);text-align:center;color:#fcfcfc;font-size:18px;background-color:rgba(49,33,54,.15);padding:8px;text-shadow:2px 2px 0 #312136,-2px -2px 0 #312136,2px -2px 0 #312136,-2px 2px 0 #312136,2px 2px 0 #312136;animation:.5s ease-in-out infinite bounce}.uiAnnouncements .list .message.success{color:#80f643}.uiAnnouncements .list .message.failure{color:#d43346}@keyframes bounce{0%{top:0}50%{top:4px}100%{top:0}}

+ 0
- 1
src/client/ui/templates/characters/styles.css Ver fichero

@@ -1 +0,0 @@
.uiCharacters{display:flex;flex-direction:column;align-items:center;position:absolute}.uiCharacters .logo{width:562px;height:200px;margin-bottom:60px}.uiCharacters .bottom{display:flex;height:300px}.uiCharacters .bottom .left,.uiCharacters .bottom .right{background-color:#3a3b4a;filter:drop-shadow(0 -2px 0 #2d2136) drop-shadow(0 2px 0 #2d2136) drop-shadow(2px 0 0 #2d2136) drop-shadow(-2px 0 0 #2d2136)}.uiCharacters .bottom .left{width:400px;overflow-y:auto}.uiCharacters .bottom .left .character{height:50px;width:100%;color:#fcfcfc;cursor:pointer;display:flex;justify-content:center;align-items:center}.uiCharacters .bottom .left .character:hover{background-color:#505360}.uiCharacters .bottom .left .character.selected{background-color:#69696e}.uiCharacters .bottom .right{width:400px;padding:10px;margin-left:30px;display:flex;flex-direction:column}.uiCharacters .bottom .right .portrait{height:205px;background-color:#2d2136;display:flex;justify-content:center;align-items:center}.uiCharacters .bottom .right .portrait .sprite{width:8px;height:8px;transform-origin:50% 50%;transform:scale(16);image-rendering:pixelated;image-rendering:optimizeSpeed;image-rendering:crisp-edges;display:none}.uiCharacters .bottom .right .info{height:30px;margin-bottom:10px;background-color:#2d2136;color:#fcfcfc;display:flex;justify-content:space-between;padding:0 10px}.uiCharacters .bottom .right .info .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.uiCharacters .bottom .right .info .class{text-align:right;color:#bcbcbc}.uiCharacters .bottom .right .buttons{display:flex}.uiCharacters .bottom .right .buttons .btn{background-color:#3a71ba;width:calc((100% - (10px * 2))/ 3);float:left;margin-right:10px;color:#fcfcfc}.uiCharacters .bottom .right .buttons .btn:last-child{margin-right:0}.uiCharacters .bottom .right .buttons .btn:hover{background-color:#42548d}.uiCharacters .bottom .right .buttons .btn.deleting{background-color:#d43346;color:#fcfcfc}.uiCharacters .message{height:30px;width:100%;margin-top:30px;float:left;text-align:center;color:#fcfcfc;filter:drop-shadow(0 -2px 0 #312136) drop-shadow(0 2px 0 #312136) drop-shadow(2px 0 0 #312136) drop-shadow(-2px 0 0 #312136)}.mobile .uiCharacters{height:300px}.mobile .uiCharacters .logo{display:none}

+ 0
- 1
src/client/ui/templates/context/styles.css Ver fichero

@@ -1 +0,0 @@
.uiContext{display:none;position:absolute;z-index:999999;border:5px solid #42548d;background-color:rgba(49,33,54,.95);padding:5px;color:#fcfcfc;text-align:center;line-height:15px}.uiContext .list{width:100%;height:100%}.uiContext .list .option{width:100%;padding:5px;color:#fcfcfc;cursor:pointer;display:flex;justify-content:center}.uiContext .list .option:hover:not(.no-hover){background-color:#3a71ba}.uiContext .list .option.divider{line-height:2px;padding:0;margin:5px 0;color:transparent;background-color:#69696e}.uiContext .list .option.no-hover:not(.divider){color:#929398}.uiContext .list .option .hotkey{color:#48edff}.uiContext .list .option .hotkey:not(:empty){margin-left:10px}

+ 0
- 1
src/client/ui/templates/createCharacter/styles.css Ver fichero

@@ -1 +0,0 @@
.uiCreateCharacter{width:1040px;height:584px}.uiCreateCharacter .logo{width:562px;height:200px;margin-left:240.5px;margin-bottom:54px}.uiCreateCharacter .box-left{float:left;height:276px;width:613px;background-color:#3a3b4a}.uiCreateCharacter .box-left .left,.uiCreateCharacter .box-left .right{float:left;height:100%}.uiCreateCharacter .box-left .left{width:calc(100% - (27px * 2) - 160px);padding:27px 0 27px 27px}.uiCreateCharacter .box-left .left .txtClass,.uiCreateCharacter .box-left .left .txtCostume{cursor:pointer;-webkit-user-select:none}.uiCreateCharacter .box-left .left .txtClass:active,.uiCreateCharacter .box-left .left .txtCostume:active{background-color:#373041}.uiCreateCharacter .box-left .left .label{color:#c0c3cf;text-align:center;margin-bottom:8.3px}.uiCreateCharacter .box-left .left .skinBox{display:flex;flex-direction:row;height:35px}.uiCreateCharacter .box-left .left .skinBox .btn{width:35px;margin:0;flex-shrink:0;height:100%;display:flex;justify-content:center;align-items:center;padding:0;background-color:#69696e}.uiCreateCharacter .box-left .left .skinBox .btn:first-child{margin-right:10px}.uiCreateCharacter .box-left .left .skinBox .btn:last-child{margin-left:10px}.uiCreateCharacter .box-left .left .skinBox .btn:hover{background-color:#929398}.uiCreateCharacter .box-left .left .skinBox .txtCostume{height:100%;display:flex;justify-content:center;align-items:center;padding:0}.uiCreateCharacter .box-left .right{width:calc(160px + (27px * 2));padding:27px 27px 27px 27px}.uiCreateCharacter .box-left .portrait{width:100%;height:160px;background-color:#2d2136;padding:16px 0 0 16px;margin-bottom:27px}.uiCreateCharacter .box-left .portrait .sprite{width:8px;height:8px;transform:scale(16);transform-origin:0 0;image-rendering:optimizeSpeed;image-rendering:pixelated;image-rendering:crisp-edges}.uiCreateCharacter .box-left .textbox{width:100%;background-color:#2d2136;border:2px solid #929398;color:#fcfcfc;margin-bottom:22px}.uiCreateCharacter .box-left .btn{background-color:#3a71ba;width:calc((100% - 27px)/ 2);float:left;margin-right:27px;color:#fcfcfc}.uiCreateCharacter .box-left .btn:last-child{margin-right:0}.uiCreateCharacter .box-left .btn:hover{background-color:#3fa7dd}.uiCreateCharacter .box-left .message{height:27px;width:100%;margin-top:27px;float:left;text-align:center;color:#ff4252}.uiCreateCharacter .box-right{padding:27px 27px 27px 27px;float:left;height:276px;width:400px;margin-left:13px;background-color:#3a3b4a}.uiCreateCharacter .box-right .top{width:100%;color:#fcfcfc}.uiCreateCharacter .box-right .top>*{width:100%;text-align:center}.uiCreateCharacter .box-right .top .heading{margin-bottom:27px;color:#48edff}.uiCreateCharacter .box-right .top .list .prophecy{padding-top:0;width:50%;float:left;height:24px;margin-bottom:24px;color:#ff4252;cursor:pointer}.uiCreateCharacter .box-right .top .list .prophecy:after{content:' ✗'}.uiCreateCharacter .box-right .top .list .prophecy.active{color:#80f643}.uiCreateCharacter .box-right .top .list .prophecy.active:after{content:' ✔'}.uiCreateCharacter .box-right .top .list .prophecy.disabled{color:#fcfcfc}.uiCreateCharacter .box-right .top .list .prophecy:hover{color:#fcfcfc}.mobile .uiCreateCharacter{height:276px;width:calc(1040px - 80px);display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center}.mobile .uiCreateCharacter .logo{display:none}.mobile .uiCreateCharacter .box-left{width:45%}.mobile .uiCreateCharacter .box-left .skinBox{height:35px}.mobile .uiCreateCharacter .box-right{width:45%}

+ 0
- 1
src/client/ui/templates/death/styles.css Ver fichero

@@ -1 +0,0 @@
.uiDeath{display:none;width:400px;background-color:#3c3f4c;border:4px solid #929398;text-align:center;padding:16px 16px 0 16px}.uiDeath .msg{color:#fcfcfc}.uiDeath .msg .inner{display:inline-block;color:#ff6942}.uiDeath .penalty{color:#faac45;margin-top:15px}.uiDeath .btn{color:#fcfcfc;width:100%;height:32px;background-color:#3fa7dd;margin:16px 0;padding-top:8px;cursor:pointer}.uiDeath .btn:hover{background-color:#80c5e9;color:#2d2136}.uiDeath.permadeath .buttons .btn-respawn{display:none}.uiDeath.permadeath .buttons .btn-logout{display:block}.uiDeath .buttons .btn-logout{display:none}

+ 0
- 1
src/client/ui/templates/dialogue/styles.css Ver fichero

@@ -1 +0,0 @@
.uiDialogue{position:absolute;bottom:16px;width:calc(320px + (8px * 2));padding:8px;background-color:rgba(55,48,65,.9);display:none;box-shadow:0 -2px 0 #2d2136,0 2px 0 #2d2136,2px 0 0 #2d2136,-2px 0 0 #2d2136}.uiDialogue .portraitBox{float:left;margin-right:12px;display:none}.uiDialogue .portraitBox .portrait{width:64px;height:64px}.uiDialogue .textBox{width:calc(100%);float:left;height:100%;color:#fcfcfc;text-align:center;filter:drop-shadow(0 -2px 0 #312136) drop-shadow(0 2px 0 #312136) drop-shadow(2px 0 0 #312136) drop-shadow(-2px 0 0 #312136)}

+ 0
- 1
src/client/ui/templates/effects/styles.css Ver fichero

@@ -1 +0,0 @@
.uiEffects{position:absolute;left:16px;top:104px}.uiEffects .icon{width:40px;height:40px;padding:4px;background-color:rgba(49,33,54,.75);margin-right:16px;float:left}.uiEffects .icon .inner{width:32px;height:32px;background:url(../../../images/statusIcons.png) 0 0}.mobile .uiEffects{left:316px;top:10px}

+ 0
- 1
src/client/ui/templates/equipment/styles.css
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 4
- 4
src/client/ui/templates/equipment/styles.less Ver fichero

@@ -337,10 +337,10 @@
}

.mobile .uiEquipment {
width: 100%;
height: 100%;
margin-left: 5px;
margin-top: 5px;
width: calc(100% - 10px);
height: calc(100% - 10px);
margin-left: -5px;
margin-top: -5px;

.content {
flex-direction: column;


+ 0
- 1
src/client/ui/templates/events/styles.css Ver fichero

@@ -1 +0,0 @@
.uiEvents{margin-top:10px;width:326px;box-shadow:0 -2px 0 #2d2136,0 2px 0 #2d2136,2px 0 0 #2d2136,-2px 0 0 #2d2136}.uiEvents .heading{color:#ffeb38;padding:8px;background-color:rgba(58,59,74,.9)}.uiEvents .list .event{cursor:pointer;padding:8px;background-color:rgba(58,59,74,.9)}.uiEvents .list .event:hover{background-color:rgba(92,93,117,.9)}.uiEvents .list .event .name{color:#fcfcfc;margin-bottom:3px}.uiEvents .list .event .description{color:#a3a3a3}.uiEvents .list .event.active .name{color:#3fa7dd}.uiEvents .list .event.ready .name{color:#80f643}.uiEvents .list .event.ready .description{display:none}.uiEvents .btnCollapse{display:none}.mobile .uiEvents{background-color:rgba(55,48,65,.9);margin-top:0}.mobile .uiEvents:not(.active){width:64px;height:64px}.mobile .uiEvents:not(.active):after{content:'';position:absolute;left:0;top:0;background:url(../../../images/uiIcons.png);background-position:-128px -128px;width:64px;height:64px}.mobile .uiEvents:not(.active)>*{display:none}.mobile .uiEvents.active{z-index:3;position:absolute;right:0;top:0}.mobile .uiEvents.active .btn{display:block;position:absolute;right:calc(100% + 10px);top:0;background-color:rgba(55,48,65,.9);width:64px;height:64px;padding-top:0}.mobile .uiEvents.active .btn .icon{width:100%;height:100%;background:url(../../../images/uiIcons.png) -448px 0}

+ 0
- 1
src/client/ui/templates/help/styles.css Ver fichero

@@ -1 +0,0 @@
.uiHelp{display:none;z-index:2;border:5px solid #3c3f4c;text-align:center;flex-direction:column}.uiHelp>.heading{color:#48edff;width:100%;height:36px;background-color:#3c3f4c;position:relative}.uiHelp>.heading .heading-text{padding-top:8px;margin:auto}.uiHelp .content{overflow-y:auto;background-color:#312136;width:100%;flex:1;display:flex;flex-direction:column;padding:5px}.uiHelp .content .row{padding:5px;display:flex;justify-content:center;background-color:#373041}.uiHelp .content .row+.row{margin-top:5px}.uiHelp .content .row.mobile{display:none}.uiHelp .content .row .topic{color:#3fa7dd;text-align:right;width:30%}.uiHelp .content .row .desc{color:#c0c3cf;text-align:left;width:70%;max-width:400px;padding-left:20px}.uiHelp .content .row .toslink{color:#fcfcfc;cursor:pointer}.uiHelp .content .row .toslink:hover{color:#48edff}.mobile .uiHelp{height:80vh}.mobile .uiHelp .row{display:none}.mobile .uiHelp .row.mobile{display:flex}

+ 0
- 1
src/client/ui/templates/hud/styles.css Ver fichero

@@ -1 +0,0 @@
.uiHud{position:absolute;left:10px;top:10px}.uiHud .hudBox{position:absolute;left:0;top:0;width:calc(280px + (8px * 2));padding:8px;background-color:rgba(58,59,74,.9);box-shadow:0 -2px 0 #2d2136,0 2px 0 #2d2136,2px 0 0 #2d2136,-2px 0 0 #2d2136}.uiHud .hudBox .portraitBox{float:left;margin-right:12px}.uiHud .hudBox .portraitBox .portrait{visibility:hidden;width:64px;height:64px}.uiHud .hudBox .boxes{width:calc(100% - 76px);float:left;height:100%}.uiHud .hudBox .boxes .statBox{width:100%;height:18px;margin-bottom:5px;position:relative}.uiHud .hudBox .boxes .statBox:last-child{margin-bottom:0}.uiHud .hudBox .boxes .statBox [class^=stat]{position:absolute;left:0;top:0;height:100%}.uiHud .hudBox .boxes .statBox .statManaReserve{position:absolute;right:0;top:0;left:auto;height:100%;background-color:#c0c3cf}.uiHud .hudBox .boxes .statBox .text{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;color:#fcfcfc;padding:2px 0;line-height:16px;text-shadow:2px 0 #2d2136,-2px 0 #2d2136,0 -2px #2d2136,0 2px #2d2136,-2px -2px #2d2136,-2px 2px #2d2136,2px -2px #2d2136,2px 2px #2d2136}.uiHud .hudBox .boxes .statBox:nth-child(1){background-color:#802343}.uiHud .hudBox .boxes .statBox:nth-child(2){background-color:#42548d}.uiHud .hudBox .boxes .statBox:nth-child(3){background-color:#386646}.uiHud .hudBox .boxes .statBox .statHp{background-color:#d43346}.uiHud .hudBox .boxes .statBox .statMana{background-color:#3fa7dd}.uiHud .hudBox .boxes .statBox .statXp{background-color:#4ac441}.uiHud .quickBar{position:absolute;left:calc(290px + (8px * 2));top:0;box-shadow:0 -2px 0 #2d2136,0 2px 0 #2d2136,2px 0 0 #2d2136,-2px 0 0 #2d2136}.uiHud .quickBar .quickItem{display:none;width:80px;height:80px;background-color:rgba(58,59,74,.9);margin-bottom:8px;cursor:pointer;padding:8px;position:relative}.uiHud .quickBar .quickItem .icon{height:100%;filter:brightness(100%) drop-shadow(0 -4px 0 #373041) drop-shadow(0 4px 0 #373041) drop-shadow(4px 0 0 #373041) drop-shadow(-4px 0 0 #373041)}.uiHud .quickBar .quickItem .info{left:6px;bottom:3px;position:absolute;color:#fcfcfc;filter:drop-shadow(0 -2px 0 #312136) drop-shadow(0 2px 0 #312136) drop-shadow(2px 0 0 #312136) drop-shadow(-2px 0 0 #312136);-moz-filter:drop-shadow(0 -2px 0 #312136) drop-shadow(0 2px 0 #312136) drop-shadow(2px 0 0 #312136) drop-shadow(-2px 0 0 #312136)}.uiHud .quickBar .quickItem:hover .icon{filter:brightness(160%);-moz-filter:brightness(160%)}.uiHud .quickBar .quickItem:hover.empty{background-color:rgba(72,237,255,.1)}

+ 0
- 1
src/client/ui/templates/inventory/styles.css
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 0
- 1
src/client/ui/templates/leaderboard/styles.css Ver fichero

@@ -1 +0,0 @@
.uiLeaderboard{display:none;width:600px;height:410px;border:5px solid rgba(60,63,76,.9);text-align:center}.uiLeaderboard>.heading{color:#48edff;width:100%;height:36px;background-color:rgba(60,63,76,.9)}.uiLeaderboard>.heading .heading-text{padding-top:8px;margin:auto}.uiLeaderboard .result{background-color:rgba(55,48,65,.9);float:left;width:400px;height:calc(100% - 36px);padding:5px}.uiLeaderboard .result .headings{width:100%;height:36px}.uiLeaderboard .result .headings .col{text-align:left;padding:5px 10px;width:50%;float:left;color:#fcfcfc}.uiLeaderboard .result .list{height:calc(100% - 26px - 36px)}.uiLeaderboard .result .list .row{width:100%;height:26px}.uiLeaderboard .result .list .row.self .col{color:#80f643}.uiLeaderboard .result .list .row.online .col{color:#4ac441}.uiLeaderboard .result .list .row .col{padding:5px 10px;float:left;text-align:left;width:50%;color:#c0c3cf;height:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.uiLeaderboard .result .buttons{width:calc(100% - 26px);height:26px}.uiLeaderboard .result .buttons .btn{width:calc((100% - (13px * 3))/ 4);margin-right:13px;float:left;height:100%;color:#fcfcfc;cursor:pointer;background-color:#7a3ad3}.uiLeaderboard .result .buttons .btn:hover{background-color:#a24eff}.uiLeaderboard .result .buttons .btn:last-child{margin-right:0}.uiLeaderboard .prophecies{float:left;width:calc(100% - 400px);height:calc(100% - 36px);position:relative;background-color:rgba(55,48,65,.9);padding:5px}.uiLeaderboard .prophecies .heading{width:100%;height:36px;color:#3fa7dd}.uiLeaderboard .prophecies .heading .heading-text{margin:auto}.uiLeaderboard .prophecies .btn,.uiLeaderboard .prophecies .prophecy{cursor:pointer}.uiLeaderboard .prophecies .prophecy{width:100%;padding:5px 10px;background-color:#69696e;color:#fcfcfc;margin-bottom:12px}.uiLeaderboard .prophecies .prophecy.selected{color:#80f643}.uiLeaderboard .prophecies .prophecy:hover{background-color:#929398}.uiLeaderboard .prophecies .prophecy.prophecy-mine,.uiLeaderboard .prophecies .prophecy.prophecy-none{background-color:#929398}.uiLeaderboard .prophecies .prophecy.prophecy-mine:hover,.uiLeaderboard .prophecies .prophecy.prophecy-none:hover{background-color:#c0c3cf}.uiLeaderboard .prophecies .btn-refresh{width:calc(100% - 10px);background-color:#3a71ba;padding:5px 10px;position:absolute;bottom:5px;color:#fcfcfc}.uiLeaderboard .prophecies .btn-refresh:hover{background-color:#3fa7dd}.mobile .uiLeaderboard{z-index:2}

+ 0
- 1
src/client/ui/templates/login/styles.css Ver fichero

@@ -1 +0,0 @@
.uiLogin{display:none;width:562px;height:475px;margin-top:-80px;display:flex;flex-direction:column;align-items:center}.uiLogin>*{flex-shrink:0}.uiLogin .logo{width:562px;height:200px;margin-bottom:48px;filter:drop-shadow(0 -4px 0 #312136) drop-shadow(0 4px 0 #312136) drop-shadow(4px 0 0 #312136) drop-shadow(-4px 0 0 #312136)}.uiLogin .right{height:169px;background-color:#3a3b4a;width:400px;padding:16px}.uiLogin .right .label,.uiLogin .right input{float:left}.uiLogin .right .label{width:30%;padding-top:10px;color:#80f643}.uiLogin .right input{width:70%}.uiLogin .right .textbox,.uiLogin .right input,.uiLogin .right input:-webkit-autofill{-webkit-appearance:none;box-shadow:0 0 0 20px #2d2136 inset;color:#fcfcfc;-webkit-text-fill-color:#fcfcfc;margin-bottom:16px}.uiLogin .right .textbox,.uiLogin .right input{background-color:#2d2136;color:#fcfcfc;-webkit-text-fill-color:#fcfcfc;margin-bottom:16px;filter:none}.uiLogin .right .message{height:16px;width:200%;margin-left:-50%;margin-top:36px;float:left;text-align:center;color:#ff6942;filter:brightness(100%) drop-shadow(0 -4px 0 #312136) drop-shadow(0 4px 0 #312136) drop-shadow(4px 0 0 #312136) drop-shadow(-4px 0 0 #312136);-moz-filter:brightness(100%) drop-shadow(0 -4px 0 #312136) drop-shadow(0 4px 0 #312136) drop-shadow(4px 0 0 #312136) drop-shadow(-4px 0 0 #312136)}.uiLogin .right .top-buttons{width:100%;height:35px}.uiLogin .right .top-buttons .btn{background-color:#3a71ba;width:calc((100% - 16px)/ 2);float:left;margin-right:16px;color:#fcfcfc}.uiLogin .right .top-buttons .btn:last-child{margin-right:0}.uiLogin .right .top-buttons .btn:hover{background-color:#42548d}.uiLogin .news{margin-top:40px;color:#fcfcfc;text-align:center;cursor:pointer;filter:drop-shadow(0 -4px 0 #312136) drop-shadow(0 4px 0 #312136) drop-shadow(4px 0 0 #312136) drop-shadow(-4px 0 0 #312136)}.uiLogin .spacer-h{height:61px}.uiLoginExtra .extra{position:absolute;left:50%;bottom:10px;transform:translateX(-50%);display:flex}.uiLoginExtra .extra .btn{width:180px;padding-left:10px;padding-right:10px;background-color:#b15a30;color:#fcfcfc;filter:drop-shadow(0 -2px 0 #2d2136) drop-shadow(0 2px 0 #2d2136) drop-shadow(2px 0 0 #2d2136) drop-shadow(-2px 0 0 #2d2136)}.uiLoginExtra .extra .btn+.btn{margin-left:20px}.uiLoginExtra .extra .btn:hover{background-color:#763b3b}.uiLoginExtra .version{position:absolute;right:10px;bottom:10px;color:#ffeb38;cursor:pointer;filter:brightness(100%) drop-shadow(0 -4px 0 #312136) drop-shadow(0 4px 0 #312136) drop-shadow(4px 0 0 #312136) drop-shadow(-4px 0 0 #312136);-moz-filter:brightness(100%) drop-shadow(0 -4px 0 #312136) drop-shadow(0 4px 0 #312136) drop-shadow(4px 0 0 #312136) drop-shadow(-4px 0 0 #312136)}.mobile .uiLogin{margin-top:0}.mobile .uiLogin .logo{margin-bottom:30px}.mobile .uiLogin .news{margin-top:20px}

+ 2
- 2
src/client/ui/templates/login/template.html Ver fichero

@@ -11,11 +11,11 @@
</div>
<div class="message"></div>
</div>
<div class="news" location="https://gitlab.com/Isleward/play.isleward.com/-/wikis/v0.10.6-Release-Notes">[ Latest Release Notes ]</div>
<div class="news" location="https://gitlab.com/Isleward/play.isleward.com/-/wikis/v0.11.0-Release-Notes">[ Latest Release Notes ]</div>
<div class="extra">
<div class="el btn btnPatreon monetization" location="https://patreon.com/bigbadwaffle">Pledge on Patreon</div>
<div class="el btn btnPaypal monetization" location="https://www.paypal.com/donate?hosted_button_id=NEQAV3NG9PWXA">Donate on Paypal</div>
<div class="el btn btnWiki" location="http://wiki.isleward.com/Main_Page">Access the Wiki</div>
</div>
<div class="version" location="https://gitlab.com/Isleward/play.isleward.com/-/wikis/v0.10.5-Release-Notes">v0.10.6</div>
<div class="version" location="https://gitlab.com/Isleward/play.isleward.com/-/wikis/v0.11.0-Release-Notes">v0.11.0</div>
</div>

+ 0
- 1
src/client/ui/templates/mainMenu/styles.css Ver fichero

@@ -1 +0,0 @@
.uiMainMenu{display:none;background-color:#373041;border:5px solid #3c3f4c;text-align:center}.uiMainMenu>.heading{color:#48edff;width:100%;height:36px;background-color:#3c3f4c;position:relative}.uiMainMenu>.heading .heading-text{padding-top:8px;margin:auto}.uiMainMenu .options{display:flex;flex-direction:column;padding:10px}.uiMainMenu .options .btn{color:#fcfcfc;width:100%;height:35px;background-color:#3a71ba;cursor:pointer;padding:0 20px}.uiMainMenu .options .btn+.btn{margin-top:10px}.uiMainMenu .options .btn.btnNames{display:none}.uiMainMenu .options .btn:hover{background-color:#42548d}.uiMainMenu .options .btn.btn-red{background-color:#a82841}.uiMainMenu .options .btn.btn-red:hover{background-color:#802343}.uiMainMenu .options .btn.btn-orange{background-color:#b34b3a}.uiMainMenu .options .btn.btn-orange:hover{background-color:#953f36}.uiMainMenu .options .btnIssue{background-color:#a82841}.uiMainMenu .options .btnIssue:hover{background-color:#802343}.mobile .uiMainMenu .btnScreen{display:none}.mobile .uiMainMenu .btnNames{display:block}

+ 0
- 1
src/client/ui/templates/menu/styles.css Ver fichero

@@ -1 +0,0 @@
.uiMenu{position:absolute;right:10px;bottom:10px;width:336px;height:144px;padding:8px;background-color:rgba(55,48,65,.9)}.uiMenu [class^=btn]{width:64px;height:64px;margin:0 8px;float:left;cursor:pointer;position:relative}.uiMenu [class^=btn]:hover{background-color:rgba(252,252,252,.1)}.uiMenu [class^=btn] .icon{pointer-events:none;position:absolute;left:0;top:0;width:100%;height:100%}.uiMenu [class^=btn].btnCollapse{display:none}.uiMenu [class^=btn].btnInventory .icon{background:url(../../../images/uiIcons.png) 0 0}.uiMenu [class^=btn].btnEquipment .icon{background:url(../../../images/uiIcons.png) -192px 0}.uiMenu [class^=btn].btnSmithing .icon{background:url(../../../images/uiIcons.png) -128px -64px}.uiMenu [class^=btn].btnPassives{position:relative}.uiMenu [class^=btn].btnPassives .points{width:100%;text-align:center;left:0;bottom:23px;position:absolute;color:#fcfcfc;filter:drop-shadow(0 -2px 0 #312136) drop-shadow(0 2px 0 #312136) drop-shadow(2px 0 0 #312136) drop-shadow(-2px 0 0 #312136)}.uiMenu [class^=btn].btnPassives .icon{background:url(../../../images/uiIcons.png) -320px -64px}.uiMenu [class^=btn].btnOnline .icon{background:url(../../../images/uiIcons.png) -64px 0}.uiMenu [class^=btn].btnHelp .icon{background:url(../../../images/uiIcons.png) -128px 0}.uiMenu [class^=btn].btnLeaderboard .icon{background:url(../../../images/uiIcons.png) -256px 0}.uiMenu [class^=btn].btnReputation .icon{background:url(../../../images/uiIcons.png) -320px 0}.uiMenu [class^=btn].btnMainMenu .icon{background:url(../../../images/uiIcons.png) 0 -64px}.mobile .uiMenu{bottom:auto;top:10px;right:10px;width:64px;height:64px}.mobile .uiMenu:after{content:'';position:absolute;left:0;top:0;background:url(../../../images/uiIcons.png);background-position:0 -64px;width:64px;height:64px}.mobile .uiMenu>*{display:none}.mobile .uiMenu.active{display:flex;flex-direction:column;height:calc(100% - 20px);width:200px;z-index:2;flex-wrap:wrap-reverse;align-items:center;justify-content:center}.mobile .uiMenu.active:after{display:none}.mobile .uiMenu.active>*{display:block;margin:0}.mobile .uiMenu.active .btnCollapse{display:block;position:absolute;right:calc(100% + 10px);top:50%;transform:translateY(-50%);background-color:rgba(55,48,65,.9);width:64px;height:64px}.mobile .uiMenu.active .btnCollapse .icon{width:100%;height:100%;background:url(../../../images/uiIcons.png) -448px 0}

+ 2
- 0
src/client/ui/templates/messages/messages.js Ver fichero

@@ -296,11 +296,13 @@ define([
input.resetKeys();

this.el.removeClass('typing');
this.el.find('.main').removeClass('hasBorderShadow');

let textbox = this.find('input');

if (show) {
this.el.addClass('typing');
this.el.find('.main').addClass('hasBorderShadow');

if (!config.rememberChatChannel) {
this.currentChannel = 'global';


+ 0
- 1
src/client/ui/templates/messages/styles.css
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 0
- 1
src/client/ui/templates/messages/styles.less Ver fichero

@@ -222,7 +222,6 @@
}

&.typing {
box-shadow: 0 -2px 0 @black, 0 2px 0 @black, 2px 0 0 @black, -2px 0 0 @black;
pointer-events: all;

.filters {


+ 17
- 15
src/client/ui/templates/messages/template.html Ver fichero

@@ -1,20 +1,22 @@
<div class="uiMessages active">
<div class="filters">
<div class="btn filter active" filter="info">info</div>
<div class="btn filter active" filter="rep">reputation</div>
<div class="btn filter active" filter="chat">players</div>
<div class="btn filter active" filter="loot">loot</div>
<div class="btn filter active hasBorderShadow" filter="info">info</div>
<div class="btn filter active hasBorderShadow" filter="rep">reputation</div>
<div class="btn filter active hasBorderShadow" filter="chat">players</div>
<div class="btn filter active hasBorderShadow" filter="loot">loot</div>
</div>
<div class="list rep chat info loot"></div>
<div class="bottom">
<div class="channelPicker"></div>
<input type="text" class="el textbox message">
<div class="input el textbox message"></div>
</div>
<div class="bottom time"></div>
<div class="bottom channelOptions">
<div class="option">global</div>
<div class="option">party</div>
<div class="option">direct</div>
<div class="main">
<div class="list rep chat info loot"></div>
<div class="bottom">
<div class="channelPicker"></div>
<input type="text" class="el textbox message">
<div class="input el textbox message"></div>
</div>
<div class="bottom time"></div>
<div class="bottom channelOptions">
<div class="option">global</div>
<div class="option">party</div>
<div class="option">direct</div>
</div>
</div>
</div>

+ 1
- 1
src/client/ui/templates/messages/tplTab.html Ver fichero

@@ -1 +1 @@
<div class="filter active" filter="filterName"></div>
<div class="filter active hasBorderShadow" filter="filterName"></div>

+ 0
- 1
src/client/ui/templates/middleHud/styles.css Ver fichero

@@ -1 +0,0 @@
.uiMiddleHud{position:absolute;left:calc(50% - 12px);top:calc(50% + 31px)}.uiMiddleHud .btnGather{display:none;background-color:rgba(58,59,74,.9);padding:8px 10px 8px 10px;width:120px;margin-top:8px;margin-left:calc(12px - 60px);text-align:center;position:absolute;left:calc(50vw - 88px);top:calc(50vh - 113px);width:64px;height:64px}.uiMiddleHud .btnGather .icon{position:absolute;left:0;top:0;width:100%;height:100%;background:url(../../../images/uiIcons.png) -448px -64px}.uiMiddleHud .casting{display:none;width:32px;height:5px;position:relative;background-color:#763b3b}.uiMiddleHud .casting .bar{width:0%;height:100%;background-color:#faac45}.uiMiddleHud .casting .text{position:absolute;left:0;top:0;padding-top:2px;width:100%;text-align:center;color:#2d2136}

+ 0
- 1
src/client/ui/templates/online/styles.css Ver fichero

@@ -1 +0,0 @@
.uiOnline{display:none;background-color:#3c3f4c;border:5px solid #3c3f4c;text-align:center;width:450px;height:396px}.uiOnline>.heading{color:#48edff;width:100%;height:36px;background-color:#3c3f4c}.uiOnline>.heading .heading-text{padding-top:8px;margin:auto}.uiOnline .bottom{height:calc(100% - 36px);background-color:#373041;padding:8px}.uiOnline .bottom .list{width:100%;height:100%;overflow-y:auto;background-color:#373041;display:flex;flex-direction:column}.uiOnline .bottom .list .heading{height:24px;color:#fcfcfc}.uiOnline .bottom .list .heading>div{float:left;padding:4px;height:24px}.uiOnline .bottom .list .heading>div:nth-child(1){width:10%}.uiOnline .bottom .list .heading>div:nth-child(2){width:55%}.uiOnline .bottom .list .heading>div:nth-child(3){width:35%}.uiOnline .bottom .list .onlineUser{color:#929398;height:24px;cursor:pointer}.uiOnline .bottom .list .onlineUser>div{float:left;padding:4px;height:24px}.uiOnline .bottom .list .onlineUser>div:nth-child(1){width:10%}.uiOnline .bottom .list .onlineUser>div:nth-child(2){width:55%}.uiOnline .bottom .list .onlineUser>div:nth-child(3){width:35%}.uiOnline .bottom .list .onlineUser:hover{background-color:#3c3f4c}.mobile .uiOnline{z-index:2}

+ 0
- 1
src/client/ui/templates/options/styles.css Ver fichero

@@ -1 +0,0 @@
.uiOptions{display:none;width:400px;background-color:#373041;border:5px solid #3c3f4c;flex-direction:column}.uiOptions>.heading{color:#48edff;width:100%;height:36px;background-color:#3c3f4c;position:relative;text-align:center}.uiOptions>.heading .heading-text{padding-top:8px;margin:auto}.uiOptions .bottom{padding:10px;height:100%;overflow-y:auto}.uiOptions .bottom .list{display:flex;flex-direction:column}.uiOptions .bottom .list .heading{color:#929398;border-bottom:2px solid #69696e;margin:0 10px 5px 10px;padding-bottom:5px}.uiOptions .bottom .list .heading:not(:first-child){margin:10px 10px 5px 10px}.uiOptions .bottom .list .item{height:30px;display:flex;justify-content:space-between;align-items:center}.uiOptions .bottom .list .item .name{color:#3fa7dd;flex:1;height:100%;display:flex;align-items:center;padding:0 10px;margin-right:10px;cursor:pointer}.uiOptions .bottom .list .item .name:hover{color:#48edff;background-color:#505360}.uiOptions .bottom .list .item .value{color:#fcfcfc;display:flex;align-items:center;justify-content:flex-end;padding-right:10px}.uiOptions .bottom .list .item.volume{flex-wrap:wrap;height:60px}.uiOptions .bottom .list .item.volume .name{pointer-events:none}.uiOptions .bottom .list .item.volume .name,.uiOptions .bottom .list .item.volume .value{width:50%;height:30px}.uiOptions .bottom .list .item.volume .slider{padding:0 10px;width:100%;height:30px;display:flex;position:relative}.uiOptions .bottom .list .item.volume .slider .btn{width:30px;margin-top:5px;height:calc(100% - 10px);display:flex;justify-content:center;align-items:center;color:#fcfcfc;background-color:#505360;padding-top:unset}.uiOptions .bottom .list .item.volume .slider .btn:first-child{margin-right:10px}.uiOptions .bottom .list .item.volume .slider .btn:last-child{margin-left:10px}.uiOptions .bottom .list .item.volume .slider .btn:hover{background-color:#69696e}.uiOptions .bottom .list .item.volume .slider .bar{width:100%;background-color:#42548d;border-top:10px solid #373041;border-bottom:10px solid #373041;height:100%;position:relative}.uiOptions .bottom .list .item.volume .slider .bar .tick{position:absolute;width:5px;height:20px;top:-5px;left:100%;background-color:#48edff}.mobile .uiOptions{max-height:100%}.mobile .uiOptions .item.screen{display:none}

+ 0
- 1
src/client/ui/templates/overlay/styles.css Ver fichero

@@ -1 +0,0 @@
.uiOverlay{display:none;position:absolute;left:0;top:0;background-color:rgba(60,63,76,.55);width:100%;height:100%;z-index:99999}

+ 10
- 7
src/client/ui/templates/party/party.js Ver fichero

@@ -39,7 +39,9 @@ define([
},

onGetConnectedPlayer: function (msg) {
let party = this.party;
const { party } = this;
const { player: { serverId: playerId, zoneId: playerZone } } = window;

if (!party)
return;

@@ -47,25 +49,26 @@ define([
msg = [msg];

msg.forEach(m => {
const { id: mId, zoneId: mZone } = m;

if (party.indexOf(m.id) === -1)
return;

let zone = m.zone;
if (m.id === window.player.serverId) {
if (mId === playerId) {
party.forEach(p => {
let player = globals.onlineList.find(o => o.id === p);
const mObj = globals.onlineList.find(o => o.id === p);

let el = this.find('.member[memberId="' + p + '"]');
el.removeClass('differentZone');

if (player.zone !== zone)
if (mObj.mZone !== mZone)
el.addClass('differentZone');
});
} else {
let el = this.find('.member[memberId="' + m.id + '"]');
el.removeClass('differentZone');

if (m.zone !== window.player.zone)
if (m.mZone !== playerZone)
el.addClass('differentZone');

el.find('.txtLevel').html('level: ' + m.level);
@@ -130,7 +133,7 @@ define([
.attr('memberId', p)
.on('contextmenu', this.showContext.bind(this, playerName, p));

if (player.zone !== window.player.zone)
if (player.zoneId !== window.player.zoneId)
el.addClass('differentZone');

//Find stats


+ 0
- 1
src/client/ui/templates/party/styles.css Ver fichero

@@ -1 +0,0 @@
.uiParty .party{position:absolute;left:16px;top:154px}.uiParty .party .list{overflow-y:auto;max-height:calc(100vh - 591px);padding-right:22px}.uiParty .party .list .member{width:160px;background-color:#3a3b4a;color:#fcfcfc;cursor:pointer}.uiParty .party .list .member+.member{margin-top:5px}.uiParty .party .list .member.differentZone{opacity:.4}.uiParty .party .list .member.differentZone .statBox [class^=stat]{width:0%!important}.uiParty .party .list .member:last-child{margin-bottom:0}.uiParty .party .list .member .statBox{width:100%;height:20px;background-color:#3c3f4c;position:relative;display:flex;justify-content:center;align-items:center}.uiParty .party .list .member .statBox+.statBox{border-top:2px solid #2d2136}.uiParty .party .list .member .statBox [class^=stat]{position:absolute;left:0;top:0;height:100%}.uiParty .party .list .member .statBox .text{color:#fcfcfc;z-index:1;padding:0 2px;overflow:hidden;text-overflow:ellipsis;text-shadow:2px 0 #2d2136,-2px 0 #2d2136,0 -2px #2d2136,0 2px #2d2136,-2px -2px #2d2136,-2px 2px #2d2136,2px -2px #2d2136,2px 2px #2d2136}.uiParty .party .list .member .statBox:nth-child(1){background-color:#802343}.uiParty .party .list .member .statBox:nth-child(2){background-color:#42548d}.uiParty .party .list .member .statBox .statHp{background-color:#d43346}.uiParty .party .list .member .statBox .statMana{background-color:#3fa7dd}.uiParty .invite{position:absolute;right:436px;bottom:10px;background-color:rgba(55,48,65,.9);padding:10px;color:#fcfcfc;display:flex;flex-direction:column}.uiParty .invite>.text{margin-bottom:15px;text-align:center;display:flex;flex-direction:column}.uiParty .invite>.text .name{margin-top:10px}.uiParty .invite .buttons{display:flex}.uiParty .invite .buttons .btn{width:100%;background-color:#505360;text-align:center;padding:10px;cursor:pointer;display:flex;justify-content:center;align-items:center}.uiParty .invite .buttons .btn .text{pointer-events:none;color:#fcfcfc;text-shadow:2px 0 #2d2136,-2px 0 #2d2136,0 -2px #2d2136,0 2px #2d2136,-2px -2px #2d2136,-2px 2px #2d2136,2px -2px #2d2136,2px 2px #2d2136}.uiParty .invite .buttons .btn+.btn{margin-left:10px}.uiParty .invite .buttons .btn.btnDecline{background-color:#d43346}.uiParty .invite .buttons .btn.btnDecline:hover{background-color:#a82841}.uiParty .invite .buttons .btn.btnAccept{background-color:#3f8d6d}.uiParty .invite .buttons .btn.btnAccept:hover{background-color:#386646}.uiParty.full .party .list .member{padding:5px;background-color:rgba(55,48,65,.9)}.uiParty.minimal .party .list .statBox:nth-child(2){display:none}.mobile .uiParty .list{max-height:calc(100% - 154px - 10px)}

+ 0
- 1
src/client/ui/templates/passives/styles.css Ver fichero

@@ -1 +0,0 @@
.uiPassives{display:none;z-index:3;border:5px solid #3c3f4c;text-align:center;height:100%;width:100%;position:absolute;left:0px;top:0px}.uiPassives>.heading{color:#f2f5f5;width:100%;height:36px;background-color:#3c3f4c}.uiPassives>.heading .heading-text{padding-top:8px;margin:auto}.uiPassives .bottom{height:calc(100% - 36px - 36px);background-color:#373041}.uiPassives .bottom .btn.btnReset{position:absolute;height:35px;padding-left:10px;padding-right:10px;bottom:46px;right:10px;background-color:#a82841;color:#f2f5f5;cursor:pointer}.uiPassives .bottom .btn.btnReset:hover{background-color:#d43346}.uiPassives .bottom .canvas{width:calc(100vw - 10px)}.uiPassives .status{width:100%;height:36px;background-color:#3c3f4c}.uiPassives .status .points{padding-top:8px;margin:auto;color:#48edff}

+ 0
- 1
src/client/ui/templates/progressBar/styles.css Ver fichero

@@ -1 +0,0 @@
.uiProgressBar{pointer-events:none;position:absolute;left:0;top:0;width:192px;left:calc(50% - 96px);top:calc(50% + 142px)}.uiProgressBar .barContainer{width:100%;height:28px;background-color:#42548d;border:2px solid #312136}.uiProgressBar .barContainer .bar{background-color:#3fa7dd;height:100%}.uiProgressBar .barContainer .text{padding-top:7px;color:#fcfcfc;position:absolute;left:0;top:0;text-align:center;width:100%;height:100%;z-index:1;text-shadow:2px 0 #2d2136,-2px 0 #2d2136,0 -2px #2d2136,0 2px #2d2136,-2px -2px #2d2136,-2px 2px #2d2136,2px -2px #2d2136,2px 2px #2d2136}

+ 0
- 1
src/client/ui/templates/quests/styles.css Ver fichero

@@ -1 +0,0 @@
.uiQuests{width:326px;box-shadow:0 -2px 0 #2d2136,0 2px 0 #2d2136,2px 0 0 #2d2136,-2px 0 0 #2d2136}.uiQuests .heading{color:#ffeb38;padding:8px;background-color:rgba(58,59,74,.9)}.uiQuests .list .quest{cursor:pointer;padding:8px;background-color:rgba(58,59,74,.9)}.uiQuests .list .quest:hover{background-color:rgba(92,93,117,.9)}.uiQuests .list .quest .zone{color:#69696e;margin-bottom:4px;text-align:right}.uiQuests .list .quest .name{color:#fcfcfc;margin-bottom:3px}.uiQuests .list .quest .description{color:#a3a3a3}.uiQuests .list .quest.disabled .description{display:none}.uiQuests .list .quest .reward{display:none;color:#44cb95}.uiQuests .list .quest:hover>.description{display:none}.uiQuests .list .quest:hover>.reward{display:block}.uiQuests .list .quest .ready-text{display:none}.uiQuests .list .quest.active .name{color:#3fa7dd}.uiQuests .list .quest.ready .name{color:#80f643}.uiQuests .list .quest.ready .description{display:none}.uiQuests .list .quest.ready .reward{display:none}.uiQuests .list .quest.ready .ready-text{display:block;color:#fcfcfc}.uiQuests .btn{display:none}.uiQuests.minimal .quest.disabled{display:none}.mobile .uiQuests{background-color:rgba(55,48,65,.9)}.mobile .uiQuests:not(.active){width:64px;height:64px;margin-left:10px;position:relative}.mobile .uiQuests:not(.active):after{content:'';position:absolute;left:0;top:0;background:url(../../../images/uiIcons.png);background-position:-64px -128px;width:64px;height:64px}.mobile .uiQuests:not(.active)>*{display:none}.mobile .uiQuests.active{z-index:3;position:absolute;right:0;top:0}.mobile .uiQuests.active .btn{display:block;position:absolute;right:calc(100% + 10px);top:0;background-color:rgba(55,48,65,.9);width:64px;height:64px;padding-top:0}.mobile .uiQuests.active .btn .icon{width:100%;height:100%;background:url(../../../images/uiIcons.png) -448px 0}

+ 0
- 1
src/client/ui/templates/reputation/styles.css Ver fichero

@@ -1 +0,0 @@
.uiReputation{display:none;width:600px;height:385px;border:5px solid rgba(60,63,76,.9);text-align:center}.uiReputation>.heading{color:#48edff;width:100%;height:36px;background-color:rgba(60,63,76,.9)}.uiReputation>.heading .heading-text{padding-top:8px;margin:auto}.uiReputation .info,.uiReputation .list{background-color:rgba(55,48,65,.9);float:left;height:calc(100% - 36px)}.uiReputation .list{width:40%;padding:15px 15px 15px 15px}.uiReputation .list .faction{width:100%;padding:5px 10px;background-color:#69696e;color:#fcfcfc;margin-bottom:15px;cursor:pointer}.uiReputation .list .faction.selected{color:#80f643}.uiReputation .list .faction:hover{background-color:#929398}.uiReputation .info{width:60%;padding:15px 15px 15px 0}.uiReputation .info .heading{width:100%;height:36px;color:#3fa7dd}.uiReputation .info .heading .heading-bottom{margin:auto}.uiReputation .info .description{color:#c0c3cf;height:calc(100% - 36px - 25px);text-align:justify}.uiReputation .info .bar-outer{width:100%;margin:auto;height:25px;position:relative}.uiReputation .info .bar-outer .back{width:100%;height:100%;background-color:#533399}.uiReputation .info .bar-outer .front{width:50%;height:100%;position:absolute;left:0;top:0;background-color:#7a3ad3}.uiReputation .info .bar-outer .tier{width:100%;height:100%;color:#fcfcfc;text-align:center;position:absolute;left:0;top:5px;filter:drop-shadow(0 -2px 0 #312136) drop-shadow(0 2px 0 #312136) drop-shadow(2px 0 0 #312136) drop-shadow(-2px 0 0 #312136);-moz-filter:drop-shadow(0 -2px 0 #312136) drop-shadow(0 2px 0 #312136) drop-shadow(2px 0 0 #312136) drop-shadow(-2px 0 0 #312136)}.uiReputation .list:empty{display:none}.uiReputation .list:empty+.info{width:100%}.mobile .uiReputation{z-index:2}

+ 0
- 1
src/client/ui/templates/spells/styles.css Ver fichero

@@ -1 +0,0 @@
.uiSpells{position:absolute;right:10px;top:10px;height:72px;box-shadow:0 -2px 0 #2d2136,0 2px 0 #2d2136,2px 0 0 #2d2136,-2px 0 0 #2d2136}.uiSpells .spell{width:64px;height:64px;float:left;margin-left:10px;background-color:#2d2136;cursor:pointer;position:relative;box-sizing:content-box;border:5px solid rgba(58,59,74,.9);transition-property:filter;transition-duration:.1s}.uiSpells .spell:first-child{margin-left:0}.uiSpells .spell:hover{filter:brightness(160%);-moz-filter:brightness(160%)}.uiSpells .spell.active .hotkey{color:#80f643}.uiSpells .spell .icon{position:absolute;left:0;top:0;width:100%;height:100%}.uiSpells .spell .cooldown{position:absolute;left:0;top:0;width:0;height:100%;background-color:rgba(212,51,70,.75)}.uiSpells .spell .hotkey{position:absolute;left:-2px;bottom:-6px;color:#fcfcfc;font-size:18px;z-index:2;text-shadow:2px 2px 0 #2d2136,-2px -2px 0 #2d2136,2px -2px 0 #2d2136,-2px 2px 0 #2d2136,2px 2px 0 #2d2136}.uiSpells .spell .hotkey.no-mana{color:#d43346}.mobile .uiSpells{top:auto;bottom:10px;padding:0;height:auto;background-color:transparent;display:flex;flex-direction:column-reverse}.mobile .uiSpells .spell{position:relative;margin:10px 0 0 0;background-color:rgba(58,59,74,.9);border:none}.mobile .uiSpells .spell .hotkey{display:none}.mobile .uiSpells .spell.active:before{content:'';width:5px;height:100%;left:-5px;top:0;background-color:#4ac441;position:absolute}

+ 0
- 1
src/client/ui/templates/spells/styles.less Ver fichero

@@ -7,7 +7,6 @@
right: 10px;
top: 10px;
height: (@btnSize + @pad);
box-shadow: 0 -2px 0 @black, 0 2px 0 @black, 2px 0 0 @black, -2px 0 0 @black;

.spell {
width: @btnSize;


+ 1
- 1
src/client/ui/templates/spells/templateSpell.html Ver fichero

@@ -1,4 +1,4 @@
<div class="spell">
<div class="spell hasBorderShadow">
<div class="icon"></div>
<div class="hotkey">$HOTKEY$</div>
<div class="cooldown"></div>

+ 0
- 1
src/client/ui/templates/stash/styles.css Ver fichero

@@ -1 +0,0 @@
.uiStash.scrolls{width:834px}.uiStash.scrolls .grid{overflow-y:auto;width:825px}.uiStash .footer{color:#3fa7dd;background-color:#373041;padding-bottom:7px}

+ 0
- 1
src/client/ui/templates/talk/styles.css Ver fichero

@@ -1 +0,0 @@
.uiTalk{border:5px solid rgba(60,63,76,.9);width:400px;display:none;text-align:center;position:absolute;top:10px}.uiTalk .source{padding:5px 5px;background-color:rgba(60,63,76,.9)}.uiTalk .source .name{color:#48edff;margin-bottom:5px}.uiTalk .source .msg{color:#fcfcfc;line-height:22px}.uiTalk .options{padding:5px;background-color:rgba(55,48,65,.9)}.uiTalk .options .option{color:#3fa7dd;padding:5px 5px;cursor:pointer;line-height:22px}.uiTalk .options .option:hover{color:#fcfcfc}

+ 0
- 1
src/client/ui/templates/target/styles.css Ver fichero

@@ -1 +0,0 @@
.uiTarget{position:absolute;left:406px;top:10px;width:calc(200px + (8px * 2));padding:8px;background-color:rgba(58,59,74,.9);display:none}.uiTarget .boxes{width:100%;float:left;height:100%}.uiTarget .boxes .infoBox{color:#fcfcfc;width:100%;height:18px;margin-bottom:5px;position:relative}.uiTarget .boxes .infoBox>*{float:left}.uiTarget .boxes .infoBox .infoName{width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.uiTarget .boxes .infoBox .infoLevel{width:30%;text-align:right}.uiTarget .boxes .infoBox .infoLevel.high-level{text-shadow:2px 0 #d43346,-2px 0 #d43346,0 -2px #d43346,0 2px #d43346,-2px -2px #d43346,-2px 2px #d43346,2px -2px #d43346,2px 2px #d43346}.uiTarget .boxes .statBox{width:100%;height:18px;margin-bottom:5px;position:relative}.uiTarget .boxes .statBox:nth-child(3){margin-bottom:0}.uiTarget .boxes .statBox:last-child{display:none;position:absolute;margin-left:-8px;margin-top:13px;background-color:#69696e}.uiTarget .boxes .statBox [class^=stat]{position:absolute;left:0;top:0;height:100%}.uiTarget .boxes .statBox .text{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;color:#fcfcfc;padding:2px 0;text-shadow:2px 0 #2d2136,-2px 0 #2d2136,0 -2px #2d2136,0 2px #2d2136,-2px -2px #2d2136,-2px 2px #2d2136,2px -2px #2d2136,2px 2px #2d2136}.uiTarget .boxes .statBox:nth-child(2){background-color:#802343}.uiTarget .boxes .statBox:nth-child(3){background-color:#42548d}.uiTarget .boxes .statBox:nth-child(4){background-color:#763b3b}.uiTarget .boxes .statBox .statHp{background-color:#d43346}.uiTarget .boxes .statBox .statMana{background-color:#3fa7dd}.uiTarget .boxes .statBox .statCasting{background-color:#faac45}.mobile .uiTarget{left:10px;top:100px}

+ 0
- 1
src/client/ui/templates/terms/styles.css Ver fichero

@@ -1 +0,0 @@
.uiTerms{display:none;width:562px;height:700px;margin-top:-80px;display:flex;flex-direction:column;align-items:center}.uiTerms>*{flex-shrink:0}.uiTerms .logo{width:562px;height:200px;margin-bottom:24px;filter:drop-shadow(0 -4px 0 #312136) drop-shadow(0 4px 0 #312136) drop-shadow(4px 0 0 #312136) drop-shadow(-4px 0 0 #312136)}.uiTerms .heading{color:#ff6942;filter:drop-shadow(0 -4px 0 #312136) drop-shadow(0 4px 0 #312136) drop-shadow(4px 0 0 #312136) drop-shadow(-4px 0 0 #312136);margin-bottom:24px}.uiTerms .content{flex:1;width:100%;overflow-y:auto;background-color:#373041;border:5px solid #3c3f4c;padding:10px;color:#c0c3cf;text-align:justify}.uiTerms .content .title{color:#fcfcfc}.uiTerms .buttons{width:100%;background-color:#373041;display:flex;justify-content:space-between;border-style:solid;border-color:#3c3f4c;border-width:0 5px 5px 5px;padding:5px}.uiTerms .buttons .btn{background-color:#3a71ba;color:#fcfcfc;height:35px;padding-left:10px;padding-right:10px}.uiTerms .buttons .btn:hover{background-color:#3fa7dd}.uiTerms a{color:#3fa7dd}.uiTerms a:hover{color:#48edff}.mobile .uiTerms{height:80%;margin-top:0}.mobile .uiTerms .logo{display:none}

+ 0
- 1
src/client/ui/templates/tooltipInfo/styles.css Ver fichero

@@ -1 +0,0 @@
.uiTooltipInfo{position:absolute;right:11px;bottom:164px;background-color:rgba(55,48,65,.9);padding:8px 32px;line-height:20px;color:#fcfcfc;text-align:center}

+ 1
- 0
src/client/ui/templates/tooltipInfo/styles.less Ver fichero

@@ -1,6 +1,7 @@
@import "../../../css/colors.less";

.uiTooltipInfo {
display: none;
position: absolute;
right: 11px;
bottom: 164px;


+ 0
- 1
src/client/ui/templates/tooltipItem/styles.css Ver fichero

@@ -1 +0,0 @@
.uiTooltipItem>*{z-index:999999}.uiTooltipItem .tooltip{display:none;flex-direction:column;position:absolute;margin-left:-4px;margin-top:-4px;background-color:rgba(60,63,76,.95);pointer-events:none;padding:10px;color:#fcfcfc;align-items:center;line-height:18px;max-width:300px;text-align:center}.uiTooltipItem .tooltip>:not(:empty){display:flex;flex-direction:column;align-items:center}.uiTooltipItem .tooltip>:not(:empty)+*{margin-top:2px}.uiTooltipItem .tooltip>:empty{display:none}.uiTooltipItem .tooltip .line{height:2px;width:100%;background-color:#69696e}.uiTooltipItem .tooltip .space{height:6px}.uiTooltipItem .tooltip .smallSpace{height:2px}.uiTooltipItem .tooltip .type{color:#929398}.uiTooltipItem .tooltip .power{color:#80f643}.uiTooltipItem .tooltip>.implicitStats{width:100%;color:#c0c3cf}.uiTooltipItem .tooltip>.implicitStats>*+*{margin-top:2px}.uiTooltipItem .tooltip>.implicitStats .gainStat{color:#80f643}.uiTooltipItem .tooltip>.implicitStats .loseStat{color:#d43346}.uiTooltipItem .tooltip>.stats{width:100%;color:#c0c3cf}.uiTooltipItem .tooltip>.stats>*+*{margin-top:2px}.uiTooltipItem .tooltip>.stats .gainStat{color:#80f643}.uiTooltipItem .tooltip>.stats .loseStat{color:#d43346}.uiTooltipItem .tooltip>.stats .enchanted{color:#44cb95!important}.uiTooltipItem .tooltip .effects{color:#fcfcfc}.uiTooltipItem .tooltip .faction{color:#929398}.uiTooltipItem .tooltip .high-level{color:#d43346}.uiTooltipItem .tooltip .material{color:#929398}.uiTooltipItem .tooltip .quest{color:#929398}.uiTooltipItem .tooltip .info{color:#69696e}.uiTooltipItem .tooltip .damage .gainDamage{color:#80f643}.uiTooltipItem .tooltip .damage .loseDamage{color:#d43346}.uiTooltipItem .tooltip .description{color:#ca752f;text-align:center}.uiTooltipItem .tooltip .worth.no-afford{color:#d43346}.uiTooltipItem>.btn{position:absolute;background-color:#3fa7dd;color:#fcfcfc;padding:10px;text-align:center}.mobile .uiTooltipItem{z-index:9999999999}.mobile .uiTooltipItem>*{z-index:9999999999}

+ 0
- 1
src/client/ui/templates/tooltips/styles.css Ver fichero

@@ -1 +0,0 @@
.uiTooltips{z-index:4}.uiTooltips .tooltip{display:none;z-index:4;background-color:rgba(58,59,74,.85);position:absolute;padding:8px;color:#fcfcfc;text-align:justify}.uiTooltips .tooltip.bright{background-color:#c0c3cf;color:#2d2136}.uiTooltips .tooltip .hidden{display:none}

+ 0
- 1
src/client/ui/templates/trade/styles.css Ver fichero

@@ -1 +0,0 @@
.uiTrade{width:auto}.uiTrade .no-afford{position:absolute;left:5px;top:5px;width:calc(100% - 10px);height:calc(100% - 10px);background-color:rgba(212,51,70,.15)}.uiTrade .grid .item .icon.skin{width:16px;height:16px;transform:scale(4);transform-origin:0 0;image-rendering:optimizeSpeed;image-rendering:pixelated;image-rendering:crisp-edges}

+ 0
- 1
src/client/ui/templates/wardrobe/styles.css Ver fichero

@@ -1 +0,0 @@
.uiWardrobe{display:none;width:600px;height:350px;border:5px solid #3c3f4c;text-align:center;background-color:#373041}.uiWardrobe>.heading{color:#48edff;width:100%;height:36px;background-color:#3c3f4c;position:relative}.uiWardrobe>.heading .heading-text{padding-top:8px;margin:auto}.uiWardrobe .bottom{height:calc(100% - 36px)}.uiWardrobe .bottom .left,.uiWardrobe .bottom .right{float:left;height:100%}.uiWardrobe .bottom .left{width:calc(100% * .4)}.uiWardrobe .bottom .left .heading{width:100%;height:30px;color:#ffeb38;padding-top:7px}.uiWardrobe .bottom .left .list{width:100%;height:calc(100% - 30px);overflow:auto}.uiWardrobe .bottom .left .list .skinName{width:100%;cursor:pointer;color:#fff;padding:5px}.uiWardrobe .bottom .left .list .skinName:hover{background-color:#3c3f4c}.uiWardrobe .bottom .left .list .skinName.active{color:#48edff}.uiWardrobe .bottom .left .list .skinName.current:after{content:' (x)'}.uiWardrobe .bottom .right{width:calc(100% * .6);position:relative;background-color:#2d2136}.uiWardrobe .bottom .right .heading{width:100%;height:30px;color:#ffeb38;padding-top:7px}.uiWardrobe .bottom .right .preview{padding-left:calc((100% - (8 * 16px))/ 2);position:relative;height:calc(100% - 80px)}.uiWardrobe .bottom .right .preview .sprite{width:8px;height:8px;position:absolute;left:calc((100% - (8 * 16px))/ 2);top:calc((100% - (8 * 16px))/ 2);transform:scale(16);transform-origin:0 0;image-rendering:optimizeSpeed;image-rendering:pixelated;image-rendering:crisp-edges}.uiWardrobe .bottom .right .buttons{width:100%;padding:0 10px;height:50px}.uiWardrobe .bottom .right .buttons .btn{float:left;width:calc((100% - 50px)/ 2);height:40px;padding-top:12px;color:#fff;cursor:pointer}.uiWardrobe .bottom .right .buttons .btn:first-child{margin-right:50px}.uiWardrobe .bottom .right .buttons .btnCancel{background-color:#d43346}.uiWardrobe .bottom .right .buttons .btnCancel:hover{background-color:#ff4252}.uiWardrobe .bottom .right .buttons .btnApply{background-color:#4ac441}.uiWardrobe .bottom .right .buttons .btnApply:hover{background-color:#80f643}

+ 0
- 1
src/client/ui/templates/workbench/styles.css Ver fichero

@@ -1 +0,0 @@
.uiWorkbench{display:none;width:827px;height:447px;border:5px solid #3c3f4c;color:#fcfcfc;position:relative;z-index:2}.uiWorkbench>.heading,.uiWorkbench>.itemPicker>.heading{color:#ff6942;width:100%;height:36px;background-color:#3c3f4c;text-align:center}.uiWorkbench>.heading .heading-text,.uiWorkbench>.itemPicker>.heading .heading-text{padding-top:8px;margin:auto}.uiWorkbench>.bottom{background-color:#373041;height:calc(100% - 36px);width:100%}.uiWorkbench>.bottom .heading{color:#3fa7dd;margin-bottom:10px;text-align:center}.uiWorkbench>.bottom .left,.uiWorkbench>.bottom .right{float:left;height:100%;padding:10px}.uiWorkbench>.bottom .left{width:300px}.uiWorkbench>.bottom .left .list{height:calc(100% - 25px);overflow-y:auto;display:flex;flex-direction:column}.uiWorkbench>.bottom .left .list .item{width:100%;padding:5px 10px;cursor:pointer;color:#c0c3cf}.uiWorkbench>.bottom .left .list .item.selected{background-color:#3c3f4c;color:#fcfcfc}.uiWorkbench>.bottom .left .list .item:hover{background-color:#3c3f4c}.uiWorkbench>.bottom .right{width:calc(100% - 300px);display:flex;flex-direction:column;justify-content:space-between}.uiWorkbench>.bottom .right>*{width:100%}.uiWorkbench>.bottom .right .info{height:calc(100% - 100px - 35px);flex:1}.uiWorkbench>.bottom .right .info .title{color:#3fa7dd;padding-bottom:10px;text-align:center}.uiWorkbench>.bottom .right .info .description{color:#c0c3cf;text-align:justify}.uiWorkbench>.bottom .right .materialList{visibility:hidden;margin-bottom:20px}.uiWorkbench>.bottom .right .materialList .material.need{color:#d43346}.uiWorkbench>.bottom .right .needItems{display:none;margin-bottom:20px;flex-direction:column}.uiWorkbench>.bottom .right .needItems .title{color:#3fa7dd;padding-bottom:10px;text-align:center}.uiWorkbench>.bottom .right .needItems .list{display:flex;justify-content:space-around}.uiWorkbench>.bottom .right .buttons{height:40px}.uiWorkbench>.bottom .right .buttons>.btn{height:35px;width:100px;color:#fcfcfc;text-align:center;padding-top:10px;background-color:#3c3f4c;cursor:pointer;float:left}.uiWorkbench>.bottom .right .buttons>.btn:last-child{float:right}.uiWorkbench>.bottom .right .buttons>.btn:hover{background-color:#505360}.uiWorkbench>.itemPicker{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#373041;flex-direction:column}.uiWorkbench>.itemPicker .list{display:flex;flex-wrap:wrap;overflow-y:auto}.mobile .uiWorkbench{z-index:2}

+ 38
- 40
src/server/clientComponents/inventory.js Ver fichero

@@ -11,52 +11,50 @@ define([
init: function (blueprint) {
events.emit('onGetItems', this.items);
},
extend: function (blueprint) {
let rerender = false;

if (blueprint.destroyItems) {
rerender = true;
events.emit('onDestroyItems', blueprint.destroyItems, this.items);
extend: function ({ destroyItems, getItems }) {
const { items } = this;

let rerenderNeeded = false;

if (destroyItems) {
rerenderNeeded = true;
events.emit('onDestroyItems', destroyItems, this.items);
}

if (blueprint.getItems) {
let items = this.items;
let newItems = blueprint.getItems || [];
let nLen = newItems.length;

for (let i = 0; i < nLen; i++) {
let nItem = newItems[i];
let nId = nItem.id;

let findItem = items.find(f => f.id === nId);
if (findItem) {
if (!rerender) {
rerender = (
(findItem.pos !== nItem.pos) ||
(findItem.eq !== nItem.eq) ||
(findItem.active !== nItem.active) ||
(findItem.quickSlot !== nItem.quickSlot) ||
(findItem.quantity !== nItem.quantity)
);
}

for (let p in findItem)
delete findItem[p];

$.extend(true, findItem, nItem);

newItems.splice(i, 1);
i--;
nLen--;
} else {
rerender = true;
nItem.isNew = true;
if (getItems) {
getItems.forEach(g => {
const findItem = items.find(i => i.id === g.id);

if (!findItem) {
rerenderNeeded = true;

const clonedItem = $.extend({}, g);
clonedItem.isNew = true;

items.push(clonedItem);

return;
}

if (!rerenderNeeded) {
rerenderNeeded = (
findItem.pos !== g.pos ||
findItem.eq !== g.eq ||
findItem.active !== g.active ||
findItem.quickSlot !== g.quickSlot ||
findItem.quantity !== g.quantity
);
}
}

this.items.push.apply(this.items, blueprint.getItems || []);
Object.getOwnPropertyNames(findItem).forEach(p => {
delete findItem[p];
});

$.extend(findItem, g);
});

events.emit('onGetItems', this.items, rerender);
events.emit('onGetItems', this.items, rerenderNeeded, getItems);
}
},



+ 9
- 4
src/server/clientComponents/serverActions.js Ver fichero

@@ -1,9 +1,11 @@
define([
'js/system/events',
'js/system/client'
'js/system/client',
'js/input'
], function (
events,
client
client,
input
) {
return {
type: 'serverActions',
@@ -19,7 +21,10 @@ define([
},

onKeyUp: function (key) {
this.actions.forEach(function (a) {
if (!input.isKeyAllowed(key))
return;
this.actions.forEach(a => {
if (a.key !== key)
return;

@@ -28,7 +33,7 @@ define([
method: 'performAction',
data: a.action
});
}, this);
});
},

extend: function (blueprint) {


+ 5
- 1
src/server/components/auth.js Ver fichero

@@ -57,7 +57,7 @@ module.exports = {
customChannels: [],

play: async function (data) {
if (!this.username)
if (!this.username || this.charname)
return;

let character = this.characters[data.data.name];
@@ -268,6 +268,10 @@ module.exports = {
if (credentials.username === '' || credentials.password === '') {
msg.callback(messages.login.allFields);

return;
} else if (credentials.username.length > 32) {
msg.callback(messages.login.maxUsernameLength);

return;
}



+ 2
- 2
src/server/components/equipment.js Ver fichero

@@ -126,7 +126,7 @@ module.exports = {

if ((!obj.mob) || (item.ability)) {
if (item.spell)
inventory.learnAbility({ itemId, slot: item.runeSlot });
inventory.learnAbility({ itemId, slot: item.runeSlot, bypassEqCheck: true });
else
obj.syncer.setArray(true, 'inventory', 'getItems', inventory.simplifyItem(item));
}
@@ -145,7 +145,7 @@ module.exports = {
if (typeof(item) !== 'object' || !item.has('id'))
item = inventory.findItem(itemId);

if (!item)
if (!item || !item.eq)
return;
else if (!ignoreSpaceCheck && !inventory.hasSpace()) {
const message = 'You do not have room in your inventory to unequip that item';


+ 11
- 6
src/server/components/gatherer.js Ver fichero

@@ -80,10 +80,10 @@ module.exports = {
}

if (this.gatheringTtl > 0) {
if ((this.gatheringTtl === this.gatheringTtlMax) && (gathering.width)) {
['x', 'y', 'width', 'height'].forEach(function (p) {
if (this.gatheringTtl === this.gatheringTtlMax && gathering.width > 1) {
['x', 'y', 'width', 'height'].forEach(p => {
this.obj.syncer.set(false, 'gatherer', p, gathering[p]);
}, this);
});
}

this.gatheringTtl--;
@@ -116,7 +116,7 @@ module.exports = {
this.obj.syncer.set(false, 'gatherer', 'progress', 100);

if (isFish) {
let catchChance = 40 + this.obj.stats.values.catchChance;
const catchChance = gatherResult.blueprint.gatherChance + this.obj.stats.values.catchChance;
if (~~(Math.random() * 100) >= catchChance) {
this.sendAnnouncement('The fish got away');
this.gathering = null;
@@ -124,7 +124,7 @@ module.exports = {
return;
}

gatherResult.items.forEach(function (g) {
gatherResult.items.forEach(g => {
if (g.slot)
return;
@@ -150,7 +150,12 @@ module.exports = {
};

g.worth = ~~(weight * 10);
}, this);
});
} else {
gatherResult.items.forEach(g => {
if (g.worth === undefined)
g.worth = 1;
});
}

if (isFish) {


+ 4
- 2
src/server/components/inventory.js Ver fichero

@@ -145,10 +145,12 @@ module.exports = {
}
},

learnAbility: function ({ itemId, slot }) {
//forceEq is set by the equipment component to force the ability to be learnt since the item is already EQd
// otherwise the first if check would fail
learnAbility: function ({ itemId, slot, bypassEqCheck = false }) {
let item = this.findItem(itemId);
let statValues = this.obj.stats.values;
if (!item)
if (!item || (item.eq && !bypassEqCheck))
return;
else if (!item.spell) {
item.eq = false;


+ 3
- 3
src/server/components/inventory/getItem.js Ver fichero

@@ -123,12 +123,12 @@ module.exports = (cpnInv, item, hideMessage, noStack, hideAlert, createBagIfFull
cpnInv.items.push(item);

if (item.eq) {
delete item.eq;

if (item.ability)
cpnInv.learnAbility({ itemId: item.id, slot: item.runeSlot });
else {
delete item.eq;
else
obj.equipment.equip({ itemId: item.id });
}
} else if (item.has('quickSlot')) {
obj.equipment.setQuickSlot({
itemId: item.id,


+ 0
- 1
src/server/components/mob.js Ver fichero

@@ -126,7 +126,6 @@ module.exports = {
let distanceFromHome = Math.max(abs(this.originX - obj.x), abs(this.originY - obj.y));
if (!distanceFromHome) {
this.goHome = false;

if (!obj.spellbook) {
/* eslint-disable-next-line no-console */
console.log('MOB HAS NO SPELLBOOK BUT WANTS TO RESET ROTATION');


+ 6
- 6
src/server/components/player.js Ver fichero

@@ -1,5 +1,4 @@
let classes = require('../config/spirits');
let serverConfig = require('../config/serverConfig');
const eventEmitter = require('../misc/events');

module.exports = {
@@ -31,12 +30,13 @@ module.exports = {
skinId: character.skinId,
name: character.name,
class: character.class,
zoneName: character.zoneName || serverConfig.defaultZone,
x: character.x,
y: character.y,
hidden: character.dead || null,
account: character.account,
instanceId: character.instanceId || null
zoneName: character.zoneName || clientConfig.config.defaultZone,
zoneId: character.zoneId || null,
zoneMapSeed: character.zoneMapSeed
});

character.components = character.components || [];
@@ -125,7 +125,7 @@ module.exports = {

let self = {
id: obj.id,
zone: obj.zone,
zoneId: obj.zoneId,
name: obj.name,
level: obj.level,
class: obj.class
@@ -215,7 +215,7 @@ module.exports = {
};
obj.instance.eventEmitter.emit('onBeforePlayerRespawn', obj, spawnPos);

if (!spawnPos.zone) {
if (!spawnPos.zoneName) {
obj.x = spawnPos.x;
obj.y = spawnPos.y;

@@ -251,7 +251,7 @@ module.exports = {
id: obj.serverId,
args: {
obj: simpleObj,
newZone: spawnPos.zone
newZone: spawnPos.zoneName
}
});
}


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

@@ -436,7 +436,9 @@ module.exports = {
obj.effects.die();
if (this.obj.spellbook)
this.obj.spellbook.die();

obj.destroyed = true;
obj.destructionEvent = 'death';

let deathAnimation = _.getDeepProperty(animations, ['mobs', obj.sheetName, obj.cell, 'death']);
if (deathAnimation) {


+ 1
- 1
src/server/components/trade.js Ver fichero

@@ -275,7 +275,7 @@ module.exports = {
if (oldQuantity)
item.quantity = oldQuantity;

let worth = ~~(item.worth * targetTrade.markup.buy);
let worth = ~~((item.quantity ?? 1) * item.worth * targetTrade.markup.buy);

this.gold += worth;



+ 1
- 0
src/server/config/clientConfig.js Ver fichero

@@ -8,6 +8,7 @@ const config = {
logoPath: null,
loginBgGeneratorPath: null,
resourceList: [],
defaultZone: 'fjolarok',
textureList: [
'tiles',
'walls',


+ 5
- 31
src/server/config/maps/fjolarok/dialogues.js Ver fichero

@@ -2,27 +2,23 @@ module.exports = {
hermit: {
1: {
msg: [{
msg: 'What? Oh...what are you doing here?',
options: [1.1, 1.2, 1.3, 1.4, 1.5]
msg: 'Nice to see you again. How can I help?',
options: [1.1, 1.2, 1.3, 1.4]
}],
options: {
1.1: {
msg: 'Me? What are YOU doing in the middle of the wilderness?',
msg: 'What are you doing in the middle of the wilderness?',
goto: 2
},
1.2: {
msg: 'My ship got wrecked, just south of here. I\'m stranded on this island.',
goto: 3
},
1.3: {
msg: 'Have you scavenged anything worth selling lately?',
goto: 'tradeBuy'
},
1.4: {
1.3: {
msg: 'I have some items you might be interested in.',
goto: 'tradeSell'
},
1.5: {
1.4: {
msg: 'I changed my mind, I want to buy something back.',
goto: 'tradeBuyback'
}
@@ -63,28 +59,6 @@ module.exports = {
}
}
},
3: {
msg: 'You mean you don\'t know where you are? Where are you from?',
options: {
3.1: {
msg: 'I don\'t know. The developer hasn\'t written me a backstory yet.',
goto: '3-1'
},
3.2: {
msg: 'I\'d like to ask something else',
goto: 2
}
}
},
'3-1': {
msg: 'Typical...',
options: {
'3-1.1': {
msg: 'I\'d like to ask something else',
goto: 1
}
}
},
tradeBuy: {
cpn: 'trade',
method: 'startBuy',


+ 90
- 144
src/server/config/maps/fjolarok/map.json
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 1
- 1
src/server/config/maps/fjolarok/quests.js Ver fichero

@@ -19,6 +19,6 @@ module.exports = {
name: 'Green Fingers',
type: 'gatherResource',
subType: 'herb',
quantity: [5, 10]
quantity: [2, 5]
}]
};

+ 2
- 22
src/server/config/maps/fjolarok/zone.js Ver fichero

@@ -56,27 +56,7 @@ module.exports = {
},
'crazed seagull': {
level: 1,

rare: {
count: 0
},

regular: {
drops: {
rolls: 1,
noRandom: true,
blueprints: [{
chance: 100,
maxLevel: 2,
name: 'Family Heirloom',
quality: 1,
slot: 'neck',
type: 'Choker',
noSalvage: true,
stats: ['vit', 'regenMana']
}]
}
}
attackable: false
},
seagull: {
level: 2,
@@ -87,7 +67,7 @@ module.exports = {
}
},
rare: {
count: 0
name: 'Crazed Seagull'
},
questItem: {
name: 'Gull Feather',


+ 8
- 3
src/server/config/quests/questBuilder.js Ver fichero

@@ -10,7 +10,7 @@ module.exports = {
},

obtain: function (obj, template) {
let zoneName = template ? template.zoneName : obj.zoneName;
let zoneName = template?.zoneName ?? obj.zoneName;
let zone = mapList.mapList.find(m => m.name === zoneName);

//Zone doesn't exist any more. Probably been renamed
@@ -33,13 +33,18 @@ module.exports = {
zoneTemplate = globalQuests;

let config = extend({}, zoneTemplate);
this.instance.eventEmitter.emit('onBeforeGetQuests', config);
this.instance.eventEmitter.emit('onBeforeGetQuests', {
obj,
config,
zoneName,
template
});
if (config.infini.length === 0)
return;

//Only check min level of quests when physically in the zone they belong to
if (obj.zoneName === zoneName) {
const minPlayerLevel = ~~(obj.instance.map.zone.level[0] * 0.75);
const minPlayerLevel = ~~(obj.instance.zoneConfig.level[0] * 0.75);

if (obj.stats.values.level < minPlayerLevel)
return;


+ 4
- 2
src/server/config/quests/templates/questGatherResource.js Ver fichero

@@ -8,9 +8,11 @@ module.exports = {

build: function () {
if (!this.need) {
this.need = 2 + ~~(Math.random() * 3);
const { quantity, subType } = this;

this.gatherType = ['herb', 'fish'][~~(Math.random() * 2)];
this.need = quantity[0] + ~~(Math.random() * (quantity[1] - quantity[0]));

this.gatherType = subType ?? ['herb', 'fish'][~~(Math.random() * 2)];

if (this.gatherType === 'fish') {
this.name = 'Lure of the Sea';


+ 1
- 1
src/server/config/quests/templates/questKillX.js Ver fichero

@@ -10,7 +10,7 @@ module.exports = {
//If we're not in the correct zone, don't do this check, it'll just crash the server
// since the mob won't be available (most likely) in the zoneFile
if (this.obj.zoneName === this.zoneName) {
let mobTypes = this.obj.instance.spawners.zone.mobs;
let mobTypes = this.obj.instance.zoneConfig.mobs;
if (this.mobName) {
let mobType = mobTypes[this.mobName.toLowerCase()];
//Maybe the zoneFile changed in the meantime. If so, regenerate


+ 1
- 1
src/server/config/quests/templates/questLootGen.js Ver fichero

@@ -18,7 +18,7 @@ module.exports = {
//If we're not in the correct zone, don't do this check, it'll just crash the server
// since the mob won't be available (most likely) in the zoneFile
if (this.obj.zoneName === this.zoneName) {
let mobTypes = this.obj.instance.spawners.zone.mobs;
let mobTypes = this.obj.instance.zoneConfig.mobs;

if (this.mobType && this.item) {
//Check if the zoneFile changed


+ 1
- 1
src/server/config/quests/templates/questTemplate.js Ver fichero

@@ -6,7 +6,7 @@ module.exports = {
return false;

if (!this.xp) {
let level = this.obj.instance.spawners.zone.level;
let level = this.obj.instance.zoneConfig.level;
level = level[0];
let xp = ~~(level * 22 * this.getXpMultiplier());
this.xp = xp;


+ 6
- 9
src/server/config/serverConfig.js Ver fichero

@@ -1,22 +1,19 @@
/* eslint-disable no-process-env */

module.exports = {
version: '0.10.6',
version: '0.11.0',
port: 4000,
startupMessage: 'Server: ready',
defaultZone: 'fjolarok',

//Options:
nodeEnv: process.env.NODE_ENV,

//Options:
// sqlite
// rethink
//eslint-disable-next-line no-process-env
db: process.env.IWD_DB || 'sqlite',
//eslint-disable-next-line no-process-env
dbHost: process.env.IWD_DB_HOST || 'localhost',
//eslint-disable-next-line no-process-env
dbPort: process.env.IWD_DB_PORT || 28015,
//eslint-disable-next-line no-process-env
dbName: process.env.IWD_DB_NAME || 'live',
//eslint-disable-next-line no-process-env
dbUser: process.env.IWD_DB_USER || 'admin',
//eslint-disable-next-line no-process-env
dbPass: process.env.IWD_DB_PASS || ''
};

+ 2
- 2
src/server/mods/class-necromancer/index.js Ver fichero

@@ -17,8 +17,8 @@ module.exports = {
this.events.on('onAfterGetZone', this.onAfterGetZone.bind(this));
},

onAfterGetZone: function (zone, config) {
if (zone !== 'fjolgard')
onAfterGetZone: function (zoneName, config) {
if (zoneName !== 'fjolgard')
return;

let newRunes = [{


+ 0
- 2
src/server/objects/objBase.js Ver fichero

@@ -88,8 +88,6 @@ module.exports = {

getSimple: function (self, isSave, isTransfer) {
let s = this.simplify(null, self, isSave, isTransfer);
if (this.instance)
s.zoneId = this.instance.zoneId;

if (self && !isSave && this.syncer) {
this.syncer.oSelf.components


+ 2854
- 23
src/server/package-lock.json
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 4
- 2
src/server/package.json Ver fichero

@@ -1,6 +1,6 @@
{
"name": "isleward_server",
"version": "0.10.6",
"version": "0.11.0",
"description": "isleward",
"dependencies": {
"axios": "^0.22.0",
@@ -9,6 +9,7 @@
"express": "^4.17.1",
"express-minify": "^1.0.0",
"image-size": "^1.0.0",
"less-middleware": "^3.1.0",
"rethinkdbdash": "^2.3.31",
"socket.io": "^4.2.0",
"universal-analytics": "^0.5.1"
@@ -17,6 +18,7 @@
"babel-eslint": "^10.1.0",
"eslint": "^7.32.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-requirejs": "^4.0.1"
"eslint-plugin-requirejs": "^4.0.1",
"sqlite3": "^5.0.3"
}
}

+ 10
- 6
src/server/security/connections.js Ver fichero

@@ -12,6 +12,9 @@ module.exports = {
playing: 0,

onHandshake: function (socket) {
if (this.players.some(f => f.socket.id === socket.id))
return;

const p = objects.build();
p.socket = socket;
p.addComponent('auth');
@@ -101,12 +104,13 @@ module.exports = {
});

//If we don't do this, the atlas will try to remove it from the thread
player.zoneName = null;
player.name = null;
delete player.zoneName;
delete player.name;

//A hack to allow us to actually call methods again (like retrieve the player list)
player.dead = false;
player.permadead = false;
delete player.auth.charname;

this.modifyPlayerCount(-1);
},
@@ -125,8 +129,8 @@ module.exports = {
continue;

if (p.auth.username === exclude.auth.username) {
if (p.name && p.zoneName)
await atlas.forceSavePlayer(p.name, p.zoneName);
if (p.name && p.zoneId)
await atlas.forceSavePlayer(p.name, p.zoneId);

p.socket.emit('dc', {});
}
@@ -147,7 +151,7 @@ module.exports = {
continue;

result.push({
zone: p.zone,
zoneName: p.zoneName,
name: p.name,
level: p.level,
class: p.class,
@@ -160,7 +164,7 @@ module.exports = {

forceSaveAll: function () {
this.players
.filter(p => p.zone)
.filter(p => p.zoneName !== undefined)
.forEach(p => {
atlas.performAction(p, {
cpn: 'auth',


+ 1
- 1
src/server/security/connections/route.js Ver fichero

@@ -27,7 +27,7 @@ const route = function (socket, msg) {
if (msg.callback)
msg.data.callbackId = atlas.registerCallback(msg.callback);

atlas.send(source.zone, msg);
atlas.send(source.zoneId, msg);

return;
}


+ 7
- 3
src/server/security/router.js Ver fichero

@@ -45,7 +45,7 @@ module.exports = {

keysCorrect: function (obj, keys) {
const foundIncorrect = keys.some(({ key, dataType, optional, spec }) => {
if (!obj.hasOwnProperty(key)) {
if (!Object.hasOwnProperty.call(obj, key)) {
if (optional)
return false;

@@ -127,7 +127,7 @@ module.exports = {
return keysCorrect;
},

isMsgValid: function (msg) {
isMsgValid: function (msg, source) {
let signature;

if (msg.module) {
@@ -152,8 +152,12 @@ module.exports = {

const result = this.signatureCorrect(msg, signature);

if (!result || msg.cpn !== 'player' || msg.method !== 'performAction')
if (!result || msg.cpn !== 'player' || msg.method !== 'performAction') {
if (result && signature.allowWhenIngame === false && source.name !== undefined)
return false;

return result;
}

const signatureThreadMsg = signatures.threadCpnMethods[msg.data.cpn]?.[msg.data.method];



+ 8
- 0
src/server/security/routerConfig.js Ver fichero

@@ -49,6 +49,7 @@ const routerConfig = {
auth: {
login: {
callback: true,
allowWhenIngame: false,
data: [
{
key: 'username',
@@ -62,6 +63,7 @@ const routerConfig = {
},
register: {
callback: true,
allowWhenIngame: false,
data: [
{
key: 'username',
@@ -75,6 +77,7 @@ const routerConfig = {
},
deleteCharacter: {
callback: true,
allowWhenIngame: false,
data: [
{
key: 'name',
@@ -88,6 +91,7 @@ const routerConfig = {
},
createCharacter: {
callback: true,
allowWhenIngame: false,
data: [
{
key: 'name',
@@ -109,10 +113,12 @@ const routerConfig = {
},
getCharacterList: {
callback: true,
allowWhenIngame: false,
data: []
},
getCharacter: {
callback: true,
allowWhenIngame: false,
data: [
{
key: 'name',
@@ -122,6 +128,7 @@ const routerConfig = {
},
play: {
callback: true,
allowWhenIngame: false,
data: [
{
key: 'name',
@@ -277,6 +284,7 @@ const routerConfig = {
dataType: 'integerOrString'
},
{
optional: true,
key: 'state',
dataType: 'numberOrString'
}


+ 12
- 3
src/server/server/index.js Ver fichero

@@ -6,14 +6,18 @@ const socketIo = require('socket.io');
const express = require('express');
const compression = require('compression');
const minify = require('express-minify');
const lessMiddleware = require('less-middleware');

const rest = require('../security/rest');

const {
port = 4000,
startupMessage = 'Server: Ready'
startupMessage = 'Server: Ready',
nodeEnv
} = require('../config/serverConfig');

const compileLessOnce = nodeEnv === 'production';

const onConnection = require('./onConnection');
const { appRoot, appFile } = require('./requestHandlers');

@@ -33,8 +37,8 @@ const init = async () => {

app.use((req, res, next) => {
if (
!rest.willHandle(req.url) &&
req.url.indexOf('/server') !== 0 &&
!rest.willHandle(req.url) &&
req.url.indexOf('/server') !== 0 &&
req.url.indexOf('/mods') !== 0
)
req.url = '/client/' + req.url;
@@ -42,6 +46,11 @@ const init = async () => {
next();
});

app.use(lessMiddleware('../', {
once: compileLessOnce,
force: !compileLessOnce
}));

rest.init(app);

app.get('/', appRoot);


+ 3
- 3
src/server/server/onConnection.js Ver fichero

@@ -16,7 +16,9 @@ const onRequest = (socket, msg, callback) => {
if (!msg.data)
msg.data = {};

if (!router.isMsgValid(msg))
const source = cons.players.find(p => p.socket.id === socket.id);

if (!router.isMsgValid(msg, source))
return;

if (msg.cpn)
@@ -24,8 +26,6 @@ const onRequest = (socket, msg, callback) => {
else if (msg.threadModule)
cons.route(socket, msg);
else {
const source = cons.players.find(p => p.socket.id === socket.id);

msg.socket = socket;

if (source)


+ 101
- 52
src/server/world/atlas.js Ver fichero

@@ -2,7 +2,6 @@ let childProcess = require('child_process');
let objects = require('../objects/objects');
let mapList = require('../config/maps/mapList');
let connections = require('../security/connections');
let serverConfig = require('../config/serverConfig');
let events = require('../misc/events');

const listenersOnZoneIdle = [];
@@ -17,79 +16,120 @@ module.exports = {
this.getMapFiles();
},

addObject: function (obj, keepPos, transfer) {
addObject: async function (obj, keepPos, transfer) {
const serverObj = objects.objects.find(o => o.id === obj.id);
if (!serverObj)
return;

events.emit('onBeforePlayerEnterWorld', obj);

let thread = this.getThreadFromName(obj.zoneName);
let thread;

let map = mapList.mapList.find(m => m.name === obj.zoneName);

if (!map)
map = mapList.mapList.find(m => m.name === clientConfig.config.defaultZone);

let instanceId = obj.instanceId;
if ((!thread) || (obj.zoneName !== thread.name))
instanceId = -1;
thread = this.threads.find(t => t.id === obj.zoneId && t.name === obj.zoneName);

if (!thread) {
thread = this.getThreadFromName(serverConfig.defaultZone);
obj.zoneName = thread.name;
if (map.instanced) {
delete obj.x;
delete obj.y;
thread = this.spawnMap(map);

await new Promise(res => setTimeout(res, 2000));
} else
thread = this.getThreadFromName(map.name);
}

obj.zone = thread.id;
this.send(obj.zone, {
obj.zoneName = thread.name;
obj.zoneId = thread.id;

serverObj.zoneId = thread.id;
serverObj.zoneName = thread.name;

const simpleObj = obj.getSimple ? obj.getSimple(true, true) : obj;

this.send(obj.zoneId, {
method: 'addObject',
args: {
keepPos: keepPos,
obj: obj.getSimple ? obj.getSimple(true, true) : obj,
instanceId: instanceId,
obj: simpleObj,
transfer: transfer
}
});
},

removeObjectFromInstancedZone: async function (thread, obj, callback) {
await new Promise(res => {
const cb = this.registerCallback(res);

thread.worker.send({
method: 'forceSavePlayer',
args: {
playerName: obj.name,
callbackId: cb
}
});
});

thread.worker.kill();
this.threads.spliceWhere(t => t === thread);

if (callback)
callback();
},

removeObject: function (obj, skipLocal, callback) {
if (!skipLocal)
objects.removeObject(obj);

let thread = this.getThreadFromName(obj.zoneName);
if (!thread)
let thread = this.findObjectThread(obj);
if (!thread)
return;

if (thread.instanced) {
this.removeObjectFromInstancedZone(thread, obj, callback);

return;
}

let callbackId = null;
if (callback)
callbackId = this.registerCallback(callback);

obj.zone = thread.id;
this.send(obj.zone, {
this.send(obj.zoneId, {
method: 'removeObject',
args: {
obj: obj.getSimple(true),
instanceId: obj.instanceId,
callbackId: callbackId
}
});
},
updateObject: function (obj, msgObj) {
this.send(obj.zone, {
this.send(obj.zoneId, {
method: 'updateObject',
args: {
id: obj.id,
instanceId: obj.instanceId,
obj: msgObj
}
});
},
queueAction: function (obj, action) {
this.send(obj.zone, {
this.send(obj.zoneId, {
method: 'queueAction',
args: {
id: obj.id,
instanceId: obj.instanceId,
action: action
}
});
},
performAction: function (obj, action) {
this.send(obj.zone, {
this.send(obj.zoneId, {
method: 'performAction',
args: {
id: obj.id,
instanceId: obj.instanceId,
action: action
}
});
@@ -111,29 +151,34 @@ module.exports = {
callback.callback(msg.msg.result);
},

send: function (zone, msg) {
let thread = this.getThreadFromId(zone);
send: function (threadId, msg) {
const thread = this.threads.find(t => t.id === threadId);
if (thread)
thread.worker.send(msg);
},

getThreadFromId: function (id) {
return this.threads.find(t => t.id === id);
findObjectThread: function ({ zoneId }) {
return this.threads.find(t => t.id === zoneId);
},
getThreadFromName: function (name) {
return this.threads.find(t => t.name === name);
},

getMapFiles: function () {
mapList.mapList.filter(m => !m.disabled).forEach(m => this.spawnMap(m));
mapList.mapList
.filter(m => !m.disabled && !m.instanced)
.forEach(m => this.spawnMap(m));
},
spawnMap: function (map) {
const worker = childProcess.fork('./world/worker', [map.name]);
spawnMap: function ({ name, path, instanced }) {
const worker = childProcess.fork('./world/worker', [name]);

const id = instanced ? _.getGuid() : name;

const thread = {
id: this.nextId++,
name: map.name,
path: map.path,
id,
name,
instanced,
path,
worker
};

@@ -143,6 +188,8 @@ module.exports = {
});

this.threads.push(thread);

return thread;
},
onMessage: function (thread, message) {
if (message.module) {
@@ -172,9 +219,9 @@ module.exports = {
thread.worker.send({
method: 'init',
args: {
name: thread.name,
path: thread.path,
zoneId: thread.id
zoneName: thread.name,
zoneId: thread.id,
path: thread.path
}
});
},
@@ -214,31 +261,33 @@ module.exports = {
});
},

rezone: function (thread, message) {
rezone: async function (thread, message) {
const { args: { obj, newZone, keepPos = true } } = message;

//When messages are sent from map threads, they have an id (id of the object in the map thread)
// as well as a serverId (id of the object in the main thread)
const serverId = obj.serverId;
obj.id = serverId;
obj.destroyed = false;
obj.zoneName = newZone;
obj.id = obj.serverId;

let serverObj = objects.objects.find(o => o.id === obj.id);
serverObj.zoneName = obj.zoneName;

let newThread = this.getThreadFromName(obj.zoneName);
const serverObj = objects.objects.find(o => o.id === obj.id);
const mapExists = mapList.mapList.some(m => m.name === newZone);

if (!newThread) {
newThread = this.getThreadFromName(serverConfig.defaultZone);
obj.zoneName = newThread.name;
serverObj.zoneName = newThread.name;
if (mapExists) {
serverObj.zoneName = newZone;
obj.zoneName = newZone;
} else {
obj.zoneName = clientConfig.config.defaultZone;
serverObj.zoneName = clientConfig.config.defaultZone;
}

serverObj.zone = newThread.id;
obj.zone = newThread.id;
delete serverObj.zoneId;
delete obj.zoneId;

serverObj.player.broadcastSelf();

const isRezone = true;
this.addObject(obj, keepPos, isRezone);
await this.addObject(obj, keepPos, isRezone);
},

onZoneIdle: function (thread) {
@@ -270,8 +319,8 @@ module.exports = {
});
},

forceSavePlayer: async function (playerName, zoneName) {
const thread = this.getThreadFromName(zoneName);
forceSavePlayer: async function (playerName, zoneId) {
const thread = this.threads.find(t => t.id === zoneId);

if (!thread)
return;


+ 1
- 1
src/server/world/customMap.js Ver fichero

@@ -7,7 +7,7 @@ module.exports = {
load: function (instance, objToAdd, callback) {
this.instance = instance;

this.ent = instance.zone.name + '-' + objToAdd.components.find(c => c.type === 'auth').username;
this.ent = instance.mapName + '-' + objToAdd.components.find(c => c.type === 'auth').username;

io.get({
ent: this.ent,


+ 13
- 6
src/server/world/instancer.js Ver fichero

@@ -27,7 +27,10 @@ module.exports = {
lastTime: 0,

init: function (args) {
this.zoneId = args.zoneId;
const { zoneId, zoneName } = args;

this.zoneName = zoneName;
this.zoneId = zoneId;

spellCallbacks.init();
herbs.init();
@@ -37,15 +40,16 @@ module.exports = {
objects,
syncer,
physics,
zoneId: this.zoneId,
zoneId,
zoneName,
spawners,
questBuilder,
events,
zone: map.zone,
map,
scheduler,
eventEmitter,
resourceSpawner
resourceSpawner,
zoneConfig: map.zoneConfig
};

this.instances.push(fakeInstance);
@@ -208,12 +212,15 @@ module.exports = {
if (msg.keepPos && (!physics.isValid(obj.x, obj.y) || !map.canPathFromPos(obj)))
msg.keepPos = false;

if (!msg.keepPos || !obj.has('x') || (map.mapFile.properties.isRandom && obj.instanceId !== map.seed)) {
if (!msg.keepPos || !obj.has('x') || (map.mapFile.properties.isRandom && obj.zoneMapSeed !== map.seed)) {
obj.x = spawnPos.x;
obj.y = spawnPos.y;
}

obj.instanceId = map.seed || null;
if (map.seed)
obj.zoneMapSeed = map.seed;
else
delete obj.zoneMapSeed;

obj.spawn = map.spawn;



+ 18
- 18
src/server/world/map.js Ver fichero

@@ -68,18 +68,18 @@ module.exports = {
hiddenWalls: null,
hiddenTiles: null,

zone: null,
zoneConfig: null,

init: function (args) {
this.name = args.name;
this.path = args.path;
init: function ({ zoneName, path }) {
this.name = zoneName;
this.path = path;
try {
this.zone = require('../' + this.path + '/' + this.name + '/zone');
this.zoneConfig = require('../' + this.path + '/' + this.name + '/zone');
} catch (e) {
this.zone = globalZone;
this.zoneConfig = globalZone;
}
events.emit('onAfterGetZone', this.name, this.zone);
events.emit('onAfterGetZone', this.name, this.zoneConfig);

let chats = null;
try {
@@ -87,10 +87,10 @@ module.exports = {
} catch (e) {}

if (chats) {
if (this.zone.chats)
extend(this.zone.chats, chats);
if (this.zoneConfig.chats)
extend(this.zoneConfig.chats, chats);
else
this.zone.chats = chats;
this.zoneConfig.chats = chats;
}

let dialogues = null;
@@ -99,11 +99,11 @@ module.exports = {
} catch (e) {}
events.emit('onBeforeGetDialogue', this.name, dialogues);
if (dialogues)
this.zone.dialogues = dialogues;
this.zoneConfig.dialogues = dialogues;

this.zone = extend({}, globalZone, this.zone);
this.zoneConfig = extend({}, globalZone, this.zoneConfig);

let resources = this.zone.resources || {};
let resources = this.zoneConfig.resources || {};
for (let r in resources)
resourceSpawner.register(r, resources[r]);

@@ -456,11 +456,11 @@ module.exports = {
if (objZoneName !== name)
blueprint.objZoneName = objZoneName;

if (this.zone) {
if ((this.zone.objects) && (this.zone.objects[objZoneName.toLowerCase()]))
extend(blueprint, this.zone.objects[objZoneName.toLowerCase()]);
else if ((this.zone.objects) && (this.zone.mobs[objZoneName.toLowerCase()]))
extend(blueprint, this.zone.mobs[objZoneName.toLowerCase()]);
if (this.zoneConfig) {
if ((this.zoneConfig.objects) && (this.zoneConfig.objects[objZoneName.toLowerCase()]))
extend(blueprint, this.zoneConfig.objects[objZoneName.toLowerCase()]);
else if ((this.zoneConfig.objects) && (this.zoneConfig.mobs[objZoneName.toLowerCase()]))
extend(blueprint, this.zoneConfig.mobs[objZoneName.toLowerCase()]);
}

if (blueprint.blocking)


+ 3
- 3
src/server/world/mobBuilder.js Ver fichero

@@ -76,15 +76,15 @@ module.exports = {
mob.inventory.inventorySize = -1;
mob.inventory.dailyDrops = blueprint.dailyDrops;

if (this.zone) {
let chats = this.zone.chats;
if (this.zoneConfig) {
let chats = this.zoneConfig.chats;
if (chats && chats[mob.name.toLowerCase()]) {
mob.addComponent('chatter', {
chats: chats[mob.name.toLowerCase()]
});
}

let dialogues = this.zone.dialogues;
let dialogues = this.zoneConfig.dialogues;
if (dialogues && dialogues[mob.name.toLowerCase()]) {
mob.addComponent('dialogue', {
config: dialogues[mob.name.toLowerCase()]


+ 2
- 1
src/server/world/randomMap/spawnObjects.js Ver fichero

@@ -1,6 +1,7 @@
const spawners = require('../spawners');

const spawnObjects = (scope, instance, room) => {
let template = room.template;
let spawners = instance.spawners;
let spawnCd = instance.map.mapFile.properties.spawnCd;

template.objects.forEach(o => {


+ 19
- 12
src/server/world/resourceSpawner.js Ver fichero

@@ -1,11 +1,16 @@
let herbs = require('../config/herbs');

const defaultGatherChance = {
herb: 100,
fish: 40
};

module.exports = {
nodes: [],

objects: null,
syncer: null,
zone: null,
zoneConfig: null,
physics: null,
map: null,

@@ -17,12 +22,12 @@ module.exports = {
syncer: instance.syncer,
physics: instance.physics,
map: instance.map,
zone: instance.zone
zoneConfig: instance.zoneConfig
});
},

register: function (name, blueprint) {
let exists = this.nodes.find(n => (n.blueprint.name === name));
const exists = this.nodes.find(n => (n.blueprint.name === name));
if (exists) {
if (!exists.blueprint.positions) {
exists.blueprint.positions = [{
@@ -47,21 +52,23 @@ module.exports = {
name: name
});

let max = blueprint.max;
const max = blueprint.max;
delete blueprint.max;

let chance = blueprint.chance;
const chance = blueprint.chance;
delete blueprint.chance;

let cdMax = blueprint.cdMax;
const cdMax = blueprint.cdMax;
delete blueprint.cdMax;

blueprint.gatherChance = blueprint.gatherChance ?? defaultGatherChance[blueprint.type];

this.nodes.push({
cd: 0,
max: max,
chance: chance,
cdMax: cdMax,
blueprint: blueprint,
max,
chance,
cdMax,
blueprint,
spawns: []
});
},
@@ -76,7 +83,7 @@ module.exports = {

let position = null;

if (blueprint.type === 'herb') {
if (blueprint.type === 'herb' && !blueprint.positions) {
x = ~~(Math.random() * w);
y = ~~(Math.random() * h);

@@ -124,7 +131,7 @@ module.exports = {
if (blueprint.quantity)
quantity = blueprint.quantity[0] + ~~(Math.random() * (blueprint.quantity[1] - blueprint.quantity[0]));

let zoneLevel = this.zone.level;
let zoneLevel = this.zoneConfig.level;
zoneLevel = ~~(zoneLevel[0] + ((zoneLevel[1] - zoneLevel[0]) / 2));

let objBlueprint = extend({}, blueprint, position);


+ 1
- 1
src/server/world/rezoneManager.js Ver fichero

@@ -35,7 +35,7 @@ const doRezone = stagedRezone => {

const clientAck = msg => {
const staged = stagedRezones.find(s => s.simplifiedObj.serverId === msg.sourceId);
if (!staged)
if (!staged)
return;

stagedRezones.spliceWhere(s => s === staged);


+ 5
- 5
src/server/world/spawners.js Ver fichero

@@ -9,9 +9,9 @@ module.exports = {
init: function (msg) {
this.objects = msg.objects;
this.syncer = msg.syncer;
this.zone = msg.zone;
this.zoneConfig = msg.zoneConfig;
this.mobBuilder = extend({
zone: this.zone
zoneConfig: this.zoneConfig
}, mobBuilder);
},

@@ -40,7 +40,7 @@ module.exports = {
else
this.mobTypes[name]++;

spawner.zonePrint = extend({}, this.zone.mobs.default, this.zone.mobs[name] || {});
spawner.zonePrint = extend({}, this.zoneConfig.mobs.default, this.zoneConfig.mobs[name] || {});
},

spawn: function (spawner) {
@@ -162,7 +162,7 @@ module.exports = {
if (l.blueprint.layerName === 'mobs')
this.setupMob(mob, l.zonePrint);
else {
const blueprint = extend({}, this.zone.objects.default, this.zone.objects[name] || {});
const blueprint = extend({}, this.zoneConfig.objects.default, this.zoneConfig.objects[name] || {});
this.setupObj(mob, blueprint);
}

@@ -194,7 +194,7 @@ module.exports = {

this.setupObj(mob, blueprint);

this.mobBuilder.build(mob, blueprint, type, this.zone.name);
this.mobBuilder.build(mob, blueprint, type, this.zoneConfig.name);
},

setupObj: function (obj, blueprint) {


Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio

Cargando…
Cancelar
Guardar