Procházet zdrojové kódy

Merge branch 'master' into 'release'

Master

See merge request Isleward/isleward!595
tags/v0.11.0
Big Bad Waffle před 2 roky
rodič
revize
241740c757
100 změnil soubory, kde provedl 3403 přidání a 550 odebrání
  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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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
Zobrazit soubor


+ 0
- 1
src/client/css/error.css Zobrazit soubor

@@ -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
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
src/client/css/main.css Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 4
- 4
src/client/ui/templates/equipment/styles.less Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
src/client/ui/templates/leaderboard/styles.css Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
src/client/ui/templates/messages/styles.less Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 1
src/server/config/maps/fjolarok/quests.js Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 4
- 2
src/server/package.json Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -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 Zobrazit soubor

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


Některé soubory nejsou zobrazny, neboť je v této revizi změněno mnoho souborů

Načítá se…
Zrušit
Uložit