@@ -11,6 +11,7 @@ | |||
<link rel="stylesheet" href="css/main.css"> | |||
<script>if (typeof module === 'object') {window.module = module; module = undefined;}</script> | |||
<script src="js/system/addons.js"></script> | |||
<script src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/6.1.2/browser/pixi.min.js"></script> | |||
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="js/app"></script> | |||
<script>if (window.module) module = window.module;</script> | |||
<link rel="icon" href="images/favicon.ico"> | |||
@@ -2,15 +2,14 @@ require.config({ | |||
baseUrl: '', | |||
waitSeconds: 120, | |||
paths: { | |||
socket: 'https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.slim', | |||
jquery: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.slim.min', | |||
socket: 'https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.1.3/socket.io.min', | |||
jquery: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.slim.min', | |||
text: 'https://cdnjs.cloudflare.com/ajax/libs/require-text/2.0.12/text.min', | |||
html: 'plugins/html', | |||
css: 'https://cdnjs.cloudflare.com/ajax/libs/require-css/0.1.10/css.min', | |||
main: 'js/main', | |||
helpers: 'js/misc/helpers', | |||
particles: 'plugins/pixi.particles.min', | |||
pixi: 'https://cdnjs.cloudflare.com/ajax/libs/pixi.js/5.1.3/pixi.min', | |||
howler: 'https://cdnjs.cloudflare.com/ajax/libs/howler/2.1.3/howler.core.min', | |||
longPress: 'plugins/long.press.min' | |||
}, | |||
@@ -29,14 +28,6 @@ require.config({ | |||
'jquery' | |||
] | |||
}, | |||
pixi: { | |||
exports: 'PIXI' | |||
}, | |||
particles: { | |||
deps: [ | |||
'pixi' | |||
] | |||
}, | |||
main: { | |||
deps: [ | |||
'helpers', | |||
@@ -20,13 +20,12 @@ define([ | |||
init: function () { | |||
const obj = this.obj; | |||
if (isMobile) | |||
obj.addComponent('keyboardMover'); | |||
obj.addComponent('mouseMover'); | |||
if (isMobile) | |||
obj.addComponent('touchMover'); | |||
else { | |||
obj.addComponent('keyboardMover'); | |||
obj.addComponent('mouseMover'); | |||
} | |||
obj.addComponent('serverActions'); | |||
obj.addComponent('pather'); | |||
@@ -72,7 +71,7 @@ define([ | |||
renderer.setPosition({ | |||
x: (x - (renderer.width / (scale * 2))) * scale, | |||
y: (y - (renderer.height / (scale * 2))) * scale | |||
}, instant); | |||
}, instant); | |||
}, | |||
onRespawn: function ({ x, y }) { | |||
@@ -22,6 +22,14 @@ define([ | |||
'shift', 'ctrl' | |||
], | |||
numericalKeyCodeMappings: { | |||
Digit1: 49, | |||
Digit2: 50, | |||
Digit3: 51, | |||
Digit4: 52, | |||
Digit5: 53 | |||
}, | |||
mappings: { | |||
8: 'backspace', | |||
9: 'tab', | |||
@@ -73,7 +81,7 @@ define([ | |||
onLoadShake: function (shake) { | |||
let shaker = new shake({ | |||
threshold: 5, | |||
timeout: 1000 | |||
timeout: 1000 | |||
}); | |||
shaker.start(); | |||
@@ -81,7 +89,7 @@ define([ | |||
}, | |||
resetKeys: function () { | |||
for (let k in this.keys) | |||
for (let k in this.keys) | |||
events.emit('onKeyUp', k); | |||
this.keys = {}; | |||
@@ -103,7 +111,7 @@ define([ | |||
return true; | |||
let down = this.keys[key]; | |||
this.keys[key] = 2; | |||
return (down === 1); | |||
} return false; | |||
@@ -138,7 +146,8 @@ define([ | |||
if (!this.enabled) | |||
return; | |||
let key = this.getMapping(e.which); | |||
let code = this.numericalKeyCodeMappings[e.code] || e.which; | |||
let key = this.getMapping(code); | |||
let isModifier = this.modifiers.indexOf(key) > -1; | |||
let isBody = e.target === document.body; | |||
@@ -176,7 +185,7 @@ define([ | |||
let key = this.getMapping(e.which); | |||
let isModifier = this.modifiers.indexOf(key) > -1; | |||
let isBody = e.target === document.body; | |||
if (!isModifier && !isBody) | |||
return; | |||
@@ -271,7 +280,7 @@ define([ | |||
let el = $(e.target); | |||
if ((!el.hasClass('ui-container')) || (el.hasClass('blocking'))) | |||
return; | |||
events.emit('onTouchCancel'); | |||
} | |||
}, | |||
@@ -117,6 +117,7 @@ define([ | |||
this.self || | |||
( | |||
renderer.sprites[x] && | |||
renderer.sprites[x][y] && | |||
renderer.sprites[x][y].length > 0 && | |||
!renderer.isHidden(x, y) | |||
) | |||
@@ -243,13 +243,18 @@ define([ | |||
if ((!obj.sprite) && (template.sheetName)) | |||
obj.sprite = renderer.buildObject(obj); | |||
if ((!obj.nameSprite) && (template.name)) { | |||
if (template.name) { | |||
if (obj.nameSprite) | |||
renderer.destroyObject({ sprite: obj.nameSprite }); | |||
obj.nameSprite = renderer.buildText({ | |||
layerName: 'effects', | |||
text: template.name, | |||
x: (obj.x * scale) + (scale / 2), | |||
y: (obj.y * scale) + scale | |||
}); | |||
obj.nameSprite.visible = config.showNames; | |||
} | |||
if ((template.x !== 0) || (template.y !== 0)) { | |||
@@ -21,7 +21,6 @@ define([ | |||
globals, | |||
renderLoginBackground | |||
) { | |||
let pixi = PIXI; | |||
let mRandom = Math.random.bind(Math); | |||
return { | |||
@@ -98,11 +97,11 @@ define([ | |||
$(this.renderer.view).appendTo('.canvas-container'); | |||
this.stage = new pixi.Container(); | |||
this.stage = new PIXI.Container(); | |||
let layers = this.layers; | |||
Object.keys(layers).forEach(l => { | |||
layers[l] = new pixi.Container(); | |||
layers[l] = new PIXI.Container(); | |||
layers[l].layer = (l === 'tileSprites') ? 'tiles' : l; | |||
this.stage.addChild(layers[l]); | |||
@@ -112,8 +111,8 @@ define([ | |||
const sprites = resources.sprites; | |||
textureList.forEach(t => { | |||
this.textures[t] = new pixi.BaseTexture(sprites[t]); | |||
this.textures[t].scaleMode = pixi.SCALE_MODES.NEAREST; | |||
this.textures[t] = new PIXI.BaseTexture(sprites[t]); | |||
this.textures[t].scaleMode = PIXI.SCALE_MODES.NEAREST; | |||
}); | |||
particles.init({ | |||
@@ -128,12 +127,12 @@ define([ | |||
buildSpritesTexture: function () { | |||
const { clientConfig: { atlasTextureDimensions, atlasTextures } } = globals; | |||
let container = new pixi.Container(); | |||
let container = new PIXI.Container(); | |||
let totalHeight = 0; | |||
atlasTextures.forEach(t => { | |||
let texture = this.textures[t]; | |||
let tile = new pixi.Sprite(new pixi.Texture(texture)); | |||
let tile = new PIXI.Sprite(new PIXI.Texture(texture)); | |||
tile.width = texture.width; | |||
tile.height = texture.height; | |||
tile.x = 0; | |||
@@ -149,11 +148,11 @@ define([ | |||
totalHeight += tile.height; | |||
}); | |||
let renderTexture = pixi.RenderTexture.create(this.textures.tiles.width, totalHeight); | |||
let renderTexture = PIXI.RenderTexture.create(this.textures.tiles.width, totalHeight); | |||
this.renderer.render(container, renderTexture); | |||
this.textures.sprites = renderTexture; | |||
this.textures.scaleMult = pixi.SCALE_MODES.NEAREST; | |||
this.textures.scaleMult = PIXI.SCALE_MODES.NEAREST; | |||
}, | |||
toggleScreen: function () { | |||
@@ -213,7 +212,7 @@ define([ | |||
if (!cached) { | |||
let y = ~~(cell / 8); | |||
let x = cell - (y * 8); | |||
cached = new pixi.Texture(this.textures[baseTex], new pixi.Rectangle(x * size, y * size, size, size)); | |||
cached = new PIXI.Texture(this.textures[baseTex], new PIXI.Rectangle(x * size, y * size, size, size)); | |||
textureCache[textureName] = cached; | |||
} | |||
@@ -222,14 +221,14 @@ define([ | |||
clean: function () { | |||
this.stage.removeChild(this.layers.hiders); | |||
this.layers.hiders = new pixi.Container(); | |||
this.layers.hiders = new PIXI.Container(); | |||
this.layers.hiders.layer = 'hiders'; | |||
this.stage.addChild(this.layers.hiders); | |||
let container = this.layers.tileSprites; | |||
this.stage.removeChild(container); | |||
this.layers.tileSprites = container = new pixi.Container(); | |||
this.layers.tileSprites = container = new PIXI.Container(); | |||
container.layer = 'tiles'; | |||
this.stage.addChild(container); | |||
@@ -250,7 +249,7 @@ define([ | |||
let alpha = tileOpacity.map(c); | |||
let canFlip = tileOpacity.canFlip(c); | |||
let tile = new pixi.Sprite(this.getTexture('sprites', c)); | |||
let tile = new PIXI.Sprite(this.getTexture('sprites', c)); | |||
tile.alpha = alpha; | |||
tile.position.x = i * scale; | |||
@@ -672,14 +671,14 @@ define([ | |||
}, | |||
buildContainer: function (obj) { | |||
let container = new pixi.Container(); | |||
let container = new PIXI.Container(); | |||
this.layers[obj.layerName || obj.sheetName].addChild(container); | |||
return container; | |||
}, | |||
buildRectangle: function (obj) { | |||
let graphics = new pixi.Graphics(); | |||
let graphics = new PIXI.Graphics(); | |||
let alpha = obj.alpha; | |||
if (obj.has('alpha')) | |||
@@ -716,7 +715,7 @@ define([ | |||
buildObject: function (obj) { | |||
const { sheetName, parent: container, layerName, visible = true } = obj; | |||
const sprite = new pixi.Sprite(); | |||
const sprite = new PIXI.Sprite(); | |||
obj.sprite = sprite; | |||
@@ -751,7 +750,7 @@ define([ | |||
}, | |||
buildText: function (obj) { | |||
let textSprite = new pixi.Text(obj.text, { | |||
let textSprite = new PIXI.Text(obj.text, { | |||
fontFamily: 'bitty', | |||
fontSize: (obj.fontSize || 14), | |||
fill: obj.color || 0xF2F5F5, | |||
@@ -1,15 +1,13 @@ | |||
define([ | |||
'pixi', | |||
'js/rendering/shaders/outline/vert', | |||
'js/rendering/shaders/outline/frag' | |||
], function ( | |||
pixi, | |||
vert, | |||
frag | |||
) { | |||
let OutlineFilter = function (viewWidth, viewHeight, thickness, color) { | |||
thickness = thickness || 1; | |||
pixi.Filter.call(this, | |||
PIXI.Filter.call(this, | |||
vert, | |||
frag.replace(/%THICKNESS%/gi, (1.0 / thickness).toFixed(7)) | |||
); | |||
@@ -23,16 +21,16 @@ define([ | |||
this.color = color; | |||
}; | |||
OutlineFilter.prototype = Object.create(pixi.Filter.prototype); | |||
OutlineFilter.prototype = Object.create(PIXI.Filter.prototype); | |||
OutlineFilter.prototype.constructor = OutlineFilter; | |||
Object.defineProperties(OutlineFilter.prototype, { | |||
color: { | |||
get: function () { | |||
return pixi.utils.rgb2hex(this.uniforms.outlineColor); | |||
return PIXI.utils.rgb2hex(this.uniforms.outlineColor); | |||
}, | |||
set: function (value) { | |||
pixi.utils.hex2rgb(value, this.uniforms.outlineColor); | |||
PIXI.utils.hex2rgb(value, this.uniforms.outlineColor); | |||
} | |||
}, | |||
@@ -1,12 +1,12 @@ | |||
{ | |||
"name": "isleward_client", | |||
"version": "0.9.1", | |||
"version": "0.10.1", | |||
"description": "isleward", | |||
"dependencies": {}, | |||
"devDependencies": { | |||
"babel-eslint": "^10.1.0", | |||
"eslint": "^7.12.0", | |||
"eslint-plugin-prettier": "^3.1.4", | |||
"eslint-plugin-requirejs": "^4.0.0" | |||
"eslint": "^7.32.0", | |||
"eslint-plugin-prettier": "^3.4.0", | |||
"eslint-plugin-requirejs": "^4.0.1" | |||
} | |||
} |
@@ -688,7 +688,7 @@ if (!Array.prototype.random) { | |||
let i; | |||
for (i = art.length; i >= 0; --i) { | |||
if (typeof art[i] === 'string') | |||
art[i] = PIXI.Texture.fromImage(art[i]); | |||
art[i] = PIXI.Texture.from(art[i]); | |||
} | |||
//particles from different base textures will be slower in WebGL than if they | |||
//were from one spritesheet | |||
@@ -125,17 +125,12 @@ define([ | |||
} | |||
let size = 64; | |||
let margin = '0px'; | |||
if (item.type === 'skin') { | |||
if (item.type === 'skin') | |||
size = 8; | |||
margin = '16px'; | |||
} | |||
if (item.spriteSize) | |||
size = item.spriteSize; | |||
if (item.spriteMargin) | |||
margin = item.margin; | |||
if (spriteSizes[spritesheet]) | |||
size = spriteSizes[spritesheet]; | |||
@@ -11,11 +11,11 @@ | |||
</div> | |||
<div class="message"></div> | |||
</div> | |||
<div class="news" location="https://gitlab.com/Isleward/play.isleward.com/-/wikis/v0.9.1-Release-Notes">[ Latest Release Notes ]</div> | |||
<div class="news" location="https://gitlab.com/Isleward/play.isleward.com/-/wikis/v0.10.1-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.9.1-Release-Notes">v0.9.1</div> | |||
<div class="version" location="https://gitlab.com/Isleward/play.isleward.com/-/wikis/v0.10.1-Release-Notes">v0.10.1</div> | |||
</div> |
@@ -47,8 +47,6 @@ const getCreateLock = async () => { | |||
module.exports = { | |||
type: 'auth', | |||
accountLevel: 1, | |||
username: null, | |||
charname: null, | |||
characters: {}, | |||
@@ -178,7 +176,7 @@ module.exports = { | |||
await this.getCustomChannels(character); | |||
await this.getStash(); | |||
this.verifySkin(character); | |||
await this.verifySkin(character); | |||
data.callback(character); | |||
}, | |||
@@ -212,8 +210,8 @@ module.exports = { | |||
}); | |||
}, | |||
verifySkin: function (character) { | |||
const doesOwn = this.doesOwnSkin(character.skinId); | |||
verifySkin: async function (character) { | |||
const doesOwn = await this.doesOwnSkin(character.skinId); | |||
if (doesOwn) | |||
return; | |||
@@ -225,7 +223,7 @@ module.exports = { | |||
character.sheetName = skins.getSpritesheet(defaultTo); | |||
}, | |||
doesOwnSkin: function (skinId) { | |||
doesOwnSkin: async function (skinId) { | |||
const allSkins = skins.getList(); | |||
const filteredSkins = allSkins.filter(({ default: isDefaultSkin }) => isDefaultSkin); | |||
@@ -235,7 +233,7 @@ module.exports = { | |||
filteredSkins | |||
}; | |||
eventEmitter.emit('onBeforeGetAccountSkins', msgSkinList); | |||
await eventEmitter.emit('onBeforeGetAccountSkins', msgSkinList); | |||
const result = filteredSkins.some(f => f.id === skinId); | |||
@@ -252,7 +250,7 @@ module.exports = { | |||
filteredSkins | |||
}; | |||
eventEmitter.emit('onBeforeGetAccountSkins', msgSkinList); | |||
await eventEmitter.emit('onBeforeGetAccountSkins', msgSkinList); | |||
callback(filteredSkins); | |||
}, | |||
@@ -445,7 +443,7 @@ module.exports = { | |||
let simple = this.obj.getSimple(true); | |||
this.verifySkin(simple); | |||
await this.verifySkin(simple); | |||
let prophecies = (data.prophecies || []).filter(p => p); | |||
@@ -724,7 +724,7 @@ module.exports = { | |||
if (!lootStats) | |||
this.stats.lootStats[mob.name] = time; | |||
else | |||
return ((lootStats.day !== time.day), (lootStats.month !== time.month)); | |||
return ((lootStats.day !== time.day) || (lootStats.month !== time.month)); | |||
}, | |||
events: { | |||
@@ -152,7 +152,7 @@ module.exports = { | |||
this.buyback(msg); | |||
}, | |||
buy: function (msg) { | |||
buy: async function (msg) { | |||
let target = this.target; | |||
if (!target) | |||
return; | |||
@@ -191,7 +191,7 @@ module.exports = { | |||
} | |||
if (item.type === 'skin') { | |||
let haveSkin = this.obj.auth.doesOwnSkin(item.skinId); | |||
let haveSkin = await this.obj.auth.doesOwnSkin(item.skinId); | |||
if (haveSkin) { | |||
sendMessage(this.obj, 'color-redA', 'You have already unlocked that skin.'); | |||
@@ -42,7 +42,8 @@ const config = { | |||
spriteSizes: { | |||
'images/tiles.png': 8, | |||
'images/walls.png': 8, | |||
'images/objects.png': 8 | |||
'images/objects.png': 8, | |||
'images/mobs.png': 8 | |||
}, | |||
blockingTileIndices: [ | |||
6, 7, 54, 55, 62, 63, 154, 189, 190, 192, 193, 194, 195, 196, 197 | |||
@@ -177,7 +177,16 @@ module.exports = { | |||
drops: { | |||
chance: 100, | |||
rolls: 5, | |||
magicFind: [2000, 200] | |||
noRandom: true, | |||
alsoRandom: true, | |||
magicFind: [2000, 200], | |||
blueprints: [{ | |||
chance: 100, | |||
name: 'Digested Crystal', | |||
quality: 0, | |||
quest: true, | |||
sprite: [1, 1] | |||
}] | |||
} | |||
}, | |||
rare: { | |||
@@ -1,5 +1,5 @@ | |||
module.exports = { | |||
version: '0.9.1', | |||
version: '0.10.1', | |||
port: 4000, | |||
startupMessage: 'Server: ready', | |||
defaultZone: 'fjolarok', | |||
@@ -1,6 +1,6 @@ | |||
{ | |||
"name": "isleward_server", | |||
"version": "0.9.1", | |||
"version": "0.10.1", | |||
"description": "isleward", | |||
"dependencies": { | |||
"axios": "^0.21.1", | |||
@@ -8,16 +8,16 @@ | |||
"compression": "^1.7.4", | |||
"express": "^4.17.1", | |||
"express-minify": "^1.0.0", | |||
"image-size": "^0.9.2", | |||
"image-size": "^1.0.0", | |||
"rethinkdbdash": "^2.3.31", | |||
"socket.io": "^2.4.1", | |||
"socket.io": "^4.1.3", | |||
"universal-analytics": "^0.4.23" | |||
}, | |||
"devDependencies": { | |||
"babel-eslint": "^10.1.0", | |||
"eslint": "^7.12.0", | |||
"eslint-plugin-prettier": "^3.1.4", | |||
"eslint": "^7.32.0", | |||
"eslint-plugin-prettier": "^3.4.0", | |||
"eslint-plugin-requirejs": "^4.0.1", | |||
"sqlite3": "^5.0.0" | |||
"sqlite3": "^4.2.0" | |||
} | |||
} |
@@ -309,7 +309,7 @@ module.exports = { | |||
msgBuild.cell = data[index]; | |||
events.emit('onBeforeBuildLayerTile', msgBuild); | |||
const tile = builders.tile(msgBuild); | |||
builders.tile(msgBuild); | |||
events.emit('onAfterBuildLayerTile', msgBuild); | |||
} | |||
} | |||
@@ -85,7 +85,20 @@ module.exports = { | |||
}, | |||
update: function () { | |||
this.list.forEach(l => { | |||
const spawners = this.list; | |||
let count = spawners.length; | |||
for (let i = 0; i < count; i++) { | |||
const l = spawners[i]; | |||
if (l.destroyed) { | |||
spawners.splice(i, 1); | |||
i--; | |||
count--; | |||
continue; | |||
} | |||
if (l.lifetime && l.mob) { | |||
if (!l.age) | |||
l.age = 1; | |||
@@ -143,7 +156,7 @@ module.exports = { | |||
const mob = this.spawn(l); | |||
if (!mob) | |||
return; | |||
continue; | |||
const name = (l.blueprint.objZoneName || l.blueprint.name).toLowerCase(); | |||
@@ -159,7 +172,7 @@ module.exports = { | |||
l.mob = mob; | |||
} | |||
}); | |||
} | |||
}, | |||
setupMob: function (mob, blueprint) { | |||
@@ -201,5 +214,12 @@ module.exports = { | |||
if (cpn.simplify) | |||
builtCpn.simplify = cpn.simplify.bind(builtCpn); | |||
} | |||
}, | |||
destroySpawnerForObject: function (obj) { | |||
const spawner = this.list.find(l => l.mob === obj); | |||
if (spawner) | |||
spawner.destroyed = true; | |||
} | |||
}; |