Quellcode durchsuchen

Merge branch 'master' into 'release'

Master

See merge request Isleward/isleward!595
tags/v0.11.0
Big Bad Waffle vor 2 Jahren
Ursprung
Commit
241740c757
100 geänderte Dateien mit 3403 neuen und 550 gelöschten Zeilen
  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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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
Datei anzeigen


+ 0
- 1
src/client/css/error.css Datei anzeigen

@@ -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
Datei-Diff unterdrückt, da er zu groß ist
Datei anzeigen


+ 0
- 1
src/client/css/main.css Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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
Datei-Diff unterdrückt, da er zu groß ist
Datei anzeigen


+ 4
- 4
src/client/ui/templates/equipment/styles.less Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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
Datei-Diff unterdrückt, da er zu groß ist
Datei anzeigen


+ 0
- 1
src/client/ui/templates/leaderboard/styles.css Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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
Datei-Diff unterdrückt, da er zu groß ist
Datei anzeigen


+ 0
- 1
src/client/ui/templates/messages/styles.less Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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
Datei-Diff unterdrückt, da er zu groß ist
Datei anzeigen


+ 1
- 1
src/server/config/maps/fjolarok/quests.js Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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
Datei-Diff unterdrückt, da er zu groß ist
Datei anzeigen


+ 4
- 2
src/server/package.json Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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 Datei anzeigen

@@ -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) {


Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.

Laden…
Abbrechen
Speichern